From 5f95ec6c60ef17d65b0ef2b059feb1b9c482aaa4 Mon Sep 17 00:00:00 2001 From: Weijian Wen Date: Fri, 9 Feb 2024 10:29:59 +0800 Subject: [PATCH] AMBARI-26000: Make Ambari supports Python3 environment (#3751) * AMBARI-26000 support python3 on trunk * remove yum since it's not supported in py3 * 1.fix shell decode error 2.fix sudo encoding error 3.remove redunant get_encoded_string * remove duplicate import * fix bugs * update ambari metrics to python3 * fix review comment Co-authored-by: jialiang <2510095164@qq.com> Co-authored-by: jialiang Signed-off-by: Mohammad Arshad --- ambari-agent/conf/unix/agent-multiplier.py | 74 +- ambari-agent/conf/unix/install-helper.sh | 4 +- .../conf/unix/upgrade_agent_configs.py | 18 +- ambari-agent/conf/windows/service_wrapper.py | 16 +- ambari-agent/pom.xml | 2 +- .../src/main/package/dependencies.properties | 2 +- .../main/python/ambari_agent/ActionQueue.py | 26 +- .../ambari_agent/ActualConfigHandler.py | 4 +- .../ambari_agent/AlertSchedulerHandler.py | 26 +- .../ambari_agent/AlertStatusReporter.py | 5 +- .../main/python/ambari_agent/AmbariAgent.py | 13 +- .../main/python/ambari_agent/AmbariConfig.py | 76 +- .../ClusterAlertDefinitionsCache.py | 6 +- .../main/python/ambari_agent/ClusterCache.py | 6 +- .../ambari_agent/ClusterConfigurationCache.py | 2 +- .../ClusterHostLevelParamsCache.py | 2 +- .../ambari_agent/ClusterMetadataCache.py | 4 +- .../ambari_agent/ClusterTopologyCache.py | 10 +- .../ambari_agent/CommandHooksOrchestrator.py | 4 +- .../python/ambari_agent/CommandStatusDict.py | 6 +- .../ambari_agent/CommandStatusReporter.py | 2 +- .../ambari_agent/ComponentStatusExecutor.py | 12 +- .../ambari_agent/ConfigurationBuilder.py | 4 +- .../src/main/python/ambari_agent/Constants.py | 2 +- .../ambari_agent/CustomServiceOrchestrator.py | 25 +- .../main/python/ambari_agent/DataCleaner.py | 4 +- .../main/python/ambari_agent/ExitHelper.py | 9 +- .../src/main/python/ambari_agent/Facter.py | 42 +- .../src/main/python/ambari_agent/FileCache.py | 21 +- .../src/main/python/ambari_agent/Hardware.py | 14 +- .../python/ambari_agent/HeartbeatHandlers.py | 2 +- .../python/ambari_agent/HeartbeatThread.py | 2 +- .../HostCheckReportFileHandler.py | 24 +- .../main/python/ambari_agent/HostCleanup.py | 43 +- .../src/main/python/ambari_agent/HostInfo.py | 19 +- .../python/ambari_agent/InitializerModule.py | 2 +- .../main/python/ambari_agent/LiveStatus.py | 4 +- .../src/main/python/ambari_agent/NetUtil.py | 10 +- .../python/ambari_agent/PingPortListener.py | 13 +- .../python/ambari_agent/PythonExecutor.py | 28 +- .../python/ambari_agent/RecoveryManager.py | 4 +- .../src/main/python/ambari_agent/Register.py | 2 +- .../python/ambari_agent/RemoteDebugUtils.py | 22 +- .../python/ambari_agent/StaleAlertsMonitor.py | 4 +- .../src/main/python/ambari_agent/Utils.py | 10 +- .../src/main/python/ambari_agent/__init__.py | 3 +- .../python/ambari_agent/alerts/ams_alert.py | 18 +- .../python/ambari_agent/alerts/base_alert.py | 20 +- .../python/ambari_agent/alerts/collector.py | 10 +- .../ambari_agent/alerts/metric_alert.py | 16 +- .../python/ambari_agent/alerts/port_alert.py | 2 +- .../ambari_agent/alerts/recovery_alert.py | 2 +- .../ambari_agent/alerts/script_alert.py | 4 +- .../python/ambari_agent/alerts/web_alert.py | 16 +- .../apscheduler/jobstores/mongodb_store.py | 2 +- .../apscheduler/jobstores/redis_store.py | 6 +- .../ambari_agent/apscheduler/scheduler.py | 2 +- .../ambari_agent/apscheduler/threadpool.py | 2 +- .../python/ambari_agent/apscheduler/util.py | 4 +- .../src/main/python/ambari_agent/debug.py | 8 +- .../src/main/python/ambari_agent/hostname.py | 22 +- .../listeners/AgentActionsListener.py | 2 +- .../AlertDefinitionsEventListener.py | 2 +- .../listeners/CommandsEventListener.py | 2 +- .../listeners/ConfigurationEventListener.py | 4 +- .../listeners/EncryptionKeyListener.py | 2 +- .../listeners/HostLevelParamsEventListener.py | 4 +- .../listeners/MetadataEventListener.py | 2 +- .../listeners/ServerResponsesListener.py | 2 +- .../listeners/TopologyEventListener.py | 2 +- .../python/ambari_agent/listeners/__init__.py | 4 +- .../src/main/python/ambari_agent/main.py | 102 +- .../src/main/python/ambari_agent/security.py | 34 +- .../ambari_agent/BaseStompServerTestCase.py | 4 +- .../python/ambari_agent/TestActionQueue.py | 164 +- .../ambari_agent/TestActualConfigHandler.py | 56 +- .../python/ambari_agent/TestAgentActions.py | 2 +- .../ambari_agent/TestAgentStompResponses.py | 22 +- .../python/ambari_agent/TestAlertCollector.py | 22 +- .../ambari_agent/TestAlertSchedulerHandler.py | 22 +- .../test/python/ambari_agent/TestAlerts.py | 296 +-- .../python/ambari_agent/TestAmbariAgent.py | 18 +- .../python/ambari_agent/TestAmbariConfig.py | 2 +- .../test/python/ambari_agent/TestAmsAlert.py | 48 +- .../test/python/ambari_agent/TestBaseAlert.py | 20 +- .../python/ambari_agent/TestCertGeneration.py | 2 +- .../TestClusterConfigurationCache.py | 4 +- .../TestCommandHooksOrchestrator.py | 8 +- .../ambari_agent/TestCommandStatusDict.py | 78 +- .../ambari_agent/TestConfigurationBuilder.py | 2 +- .../TestCustomServiceOrchestrator.py | 44 +- .../python/ambari_agent/TestDataCleaner.py | 2 +- .../test/python/ambari_agent/TestFileCache.py | 88 +- .../src/test/python/ambari_agent/TestGrep.py | 34 +- .../test/python/ambari_agent/TestHardware.py | 107 +- .../TestHostCheckReportFileHandler.py | 40 +- .../python/ambari_agent/TestHostCleanup.py | 52 +- .../test/python/ambari_agent/TestHostInfo.py | 80 +- .../test/python/ambari_agent/TestHostname.py | 30 +- .../python/ambari_agent/TestKerberosCommon.py | 10 +- .../python/ambari_agent/TestLiveStatus.py | 6 +- .../src/test/python/ambari_agent/TestMain.py | 28 +- .../python/ambari_agent/TestMetricAlert.py | 52 +- .../test/python/ambari_agent/TestNetUtil.py | 4 +- .../ambari_agent/TestPingPortListener.py | 8 +- .../test/python/ambari_agent/TestPortAlert.py | 116 +- .../python/ambari_agent/TestPythonExecutor.py | 46 +- .../ambari_agent/TestRecoveryManager.py | 32 +- .../python/ambari_agent/TestRegistration.py | 24 +- .../python/ambari_agent/TestScriptAlert.py | 10 +- .../test/python/ambari_agent/TestSecurity.py | 44 +- .../src/test/python/ambari_agent/TestShell.py | 28 +- .../ambari_agent/dummy_files/test_script.py | 2 +- .../ambari_agent/examples/ControllerTester.py | 9 +- .../examples/debug_testcase_example.py | 6 +- .../src/test/python/ambari_agent/winpwd.py | 2 +- .../resource_management/TestContentSources.py | 35 +- .../TestDataStructureUtils.py | 24 +- .../resource_management/TestDatanodeHelper.py | 54 +- .../TestDirectoryResource.py | 20 +- .../resource_management/TestEncryption.py | 2 +- .../TestExecuteResource.py | 30 +- .../TestFcntlBasedProcessLock.py | 2 +- .../resource_management/TestFileResource.py | 30 +- .../resource_management/TestGetPathFromUrl.py | 10 +- .../resource_management/TestGroupResource.py | 16 +- .../TestNamenodeHaUtils.py | 2 +- .../TestPackageResource.py | 18 +- .../TestPropertiesFileResource.py | 12 +- .../TestRepositoryResource.py | 30 +- .../python/resource_management/TestScript.py | 14 +- .../TestSecurityCommons.py | 38 +- .../resource_management/TestSubstituteVars.py | 6 +- .../TestTemplateConfigResource.py | 6 +- .../resource_management/TestUserResource.py | 32 +- .../python/resource_management/TestUtils.py | 2 +- .../TestXmlConfigResource.py | 16 +- ambari-agent/src/test/python/unitTests.py | 2 +- .../main/python/ambari_commons/__init__.py | 2 +- .../ambari_commons/aggregate_functions.py | 2 +- .../ambari_commons/ambari_metrics_helper.py | 12 +- .../main/python/ambari_commons/constants.py | 2 +- .../ambari_commons/credential_store_helper.py | 4 +- .../main/python/ambari_commons/exceptions.py | 2 +- .../main/python/ambari_commons/firewall.py | 7 +- .../ambari_commons/get_ambari_version.py | 8 +- .../main/python/ambari_commons/inet_utils.py | 32 +- .../ambari_commons/kerberos/__init__.py | 2 +- .../kerberos/kerberos_common.py | 6 +- .../python/ambari_commons/kerberos/utils.py | 4 +- .../python/ambari_commons/libs/__init__.py | 2 +- .../ambari_commons/libs/ppc64le/__init__.py | 2 +- .../ambari_commons/libs/x86_64/__init__.py | 2 +- .../python/ambari_commons/logging_utils.py | 2 +- .../src/main/python/ambari_commons/network.py | 18 +- .../main/python/ambari_commons/os_check.py | 16 +- .../main/python/ambari_commons/os_linux.py | 15 +- .../main/python/ambari_commons/os_utils.py | 14 +- .../main/python/ambari_commons/os_windows.py | 33 +- .../ambari_commons/parallel_processing.py | 8 +- .../repo_manager/yum_manager.py | 33 +- .../ambari_commons/repo_manager/yum_parser.py | 4 +- .../repo_manager/zypper_manager.py | 4 +- .../src/main/python/ambari_commons/shell.py | 29 +- .../main/python/ambari_commons/str_utils.py | 4 +- .../python/ambari_commons/subprocess32.py | 1730 ----------------- .../ambari_commons/unicode_tolerant_fs.py | 12 +- .../python/ambari_commons/urllib_handlers.py | 16 +- .../main/python/ambari_commons/yaml_utils.py | 2 +- .../ambari_jinja2/_markupsafe/__init__.py | 70 +- .../ambari_jinja2/_markupsafe/_bundle.py | 2 +- .../ambari_jinja2/_markupsafe/_native.py | 6 +- .../ambari_jinja2/_markupsafe/tests.py | 12 +- .../ambari_jinja2/_stringdefs.py | 70 +- .../ambari_jinja2/ambari_jinja2/bccache.py | 6 +- .../ambari_jinja2/ambari_jinja2/compiler.py | 26 +- .../ambari_jinja2/ambari_jinja2/constants.py | 2 +- .../ambari_jinja2/ambari_jinja2/debug.py | 12 +- .../ambari_jinja2/ambari_jinja2/defaults.py | 2 +- .../ambari_jinja2/environment.py | 48 +- .../ambari_jinja2/ambari_jinja2/exceptions.py | 15 +- .../python/ambari_jinja2/ambari_jinja2/ext.py | 11 +- .../ambari_jinja2/ambari_jinja2/filters.py | 55 +- .../ambari_jinja2/ambari_jinja2/lexer.py | 121 +- .../ambari_jinja2/ambari_jinja2/loaders.py | 8 +- .../ambari_jinja2/ambari_jinja2/meta.py | 6 +- .../ambari_jinja2/ambari_jinja2/nodes.py | 13 +- .../ambari_jinja2/ambari_jinja2/runtime.py | 35 +- .../ambari_jinja2/ambari_jinja2/sandbox.py | 6 +- .../ambari_jinja2/ambari_jinja2/tests.py | 8 +- .../ambari_jinja2/testsuite/__init__.py | 2 +- .../ambari_jinja2/testsuite/api.py | 34 +- .../ambari_jinja2/testsuite/ext.py | 42 +- .../ambari_jinja2/testsuite/filters.py | 4 +- .../ambari_jinja2/testsuite/imports.py | 2 +- .../ambari_jinja2/testsuite/inheritance.py | 2 +- .../ambari_jinja2/testsuite/lexnparse.py | 22 +- .../ambari_jinja2/testsuite/loader.py | 2 +- .../ambari_jinja2/testsuite/regression.py | 20 +- .../ambari_jinja2/testsuite/security.py | 4 +- .../ambari_jinja2/testsuite/utils.py | 8 +- .../ambari_jinja2/ambari_jinja2/utils.py | 46 +- .../main/python/ambari_jinja2/docs/intro.rst | 2 +- .../python/ambari_jinja2/docs/jinjaext.py | 12 +- .../ambari_jinja2/examples/basic/cycle.py | 4 +- .../ambari_jinja2/examples/basic/debugger.py | 2 +- .../examples/basic/inheritance.py | 2 +- .../ambari_jinja2/examples/basic/test.py | 8 +- .../basic/test_filter_and_linestatements.py | 2 +- .../examples/basic/test_loop_filter.py | 2 +- .../ambari_jinja2/examples/basic/translate.py | 4 +- .../python/ambari_jinja2/examples/bench.py | 2 +- .../python/ambari_jinja2/examples/profile.py | 2 +- .../ambari_jinja2/examples/rwbench/rwbench.py | 4 +- .../ext/django2jinja/django2jinja.py | 10 +- .../python/ambari_jinja2/ext/djangojinja2.py | 2 +- .../main/python/ambari_jinja2/jinja2-debug.py | 6 +- .../src/main/python/ambari_pbkdf2/pbkdf2.py | 10 +- .../src/main/python/ambari_pyaes/aes.py | 42 +- .../main/python/ambari_simplejson/__init__.py | 2 +- .../main/python/ambari_simplejson/decoder.py | 18 +- .../main/python/ambari_simplejson/encoder.py | 26 +- .../python/ambari_simplejson/ordered_dict.py | 2 +- .../src/main/python/ambari_stomp/__main__.py | 2 +- .../python/ambari_stomp/adapter/websocket.py | 4 +- .../src/main/python/ambari_stomp/backward2.py | 4 +- .../python/ambari_stomp/backwardsock25.py | 4 +- .../src/main/python/ambari_stomp/colors.py | 2 +- .../src/main/python/ambari_stomp/transport.py | 8 +- .../src/main/python/ambari_ws4py/compat.py | 2 +- .../GenerateStackDefinition.py | 20 +- .../python/resource_management/__init__.py | 2 +- .../resource_management/core/__init__.py | 2 +- .../python/resource_management/core/base.py | 14 +- .../resource_management/core/encryption.py | 6 +- .../resource_management/core/environment.py | 25 +- .../resource_management/core/exceptions.py | 2 +- .../resource_management/core/global_lock.py | 2 +- .../python/resource_management/core/logger.py | 16 +- .../core/providers/__init__.py | 8 +- .../core/providers/accounts.py | 12 +- .../core/providers/mount.py | 8 +- .../core/providers/service.py | 2 +- .../core/providers/system.py | 14 +- .../core/providers/windows/service.py | 14 +- .../core/providers/windows/system.py | 14 +- .../core/resources/__init__.py | 2 +- .../core/resources/accounts.py | 2 +- .../core/resources/jcepolicyinfo.py | 4 +- .../core/resources/klist.py | 2 +- .../core/resources/packaging.py | 2 +- .../core/resources/service.py | 2 +- .../core/resources/system.py | 12 +- .../core/resources/zkmigrator.py | 2 +- .../python/resource_management/core/shell.py | 43 +- .../resource_management/core/signal_utils.py | 8 +- .../python/resource_management/core/source.py | 25 +- .../python/resource_management/core/sudo.py | 26 +- .../python/resource_management/core/system.py | 6 +- .../python/resource_management/core/utils.py | 10 +- .../resource_management/libraries/__init__.py | 2 +- .../libraries/execution_command/__init__.py | 2 +- .../execution_command/cluster_settings.py | 2 +- .../execution_command/execution_command.py | 4 +- .../execution_command/module_configs.py | 2 +- .../execution_command/stack_settings.py | 2 +- .../libraries/functions/__init__.py | 2 +- .../functions/check_process_status.py | 4 +- .../libraries/functions/component_version.py | 4 +- .../libraries/functions/conf_select.py | 18 +- .../libraries/functions/constants.py | 2 +- .../libraries/functions/copy_tarball.py | 32 +- .../libraries/functions/curl_krb_request.py | 10 +- .../functions/data_structure_utils.py | 2 +- .../libraries/functions/decorator.py | 8 +- .../libraries/functions/default.py | 4 +- .../libraries/functions/download_from_hdfs.py | 4 +- .../dynamic_variable_interpretation.py | 10 +- .../libraries/functions/expect.py | 12 +- .../functions/fcntl_based_process_lock.py | 2 +- .../libraries/functions/file_system.py | 2 +- .../libraries/functions/find_executable.py | 10 +- .../libraries/functions/find_path.py | 2 +- .../libraries/functions/flume_agent_helper.py | 2 +- .../libraries/functions/format.py | 4 +- .../libraries/functions/format_jvm_option.py | 6 +- .../generate_logfeeder_input_config.py | 6 +- .../libraries/functions/get_architecture.py | 2 +- .../libraries/functions/get_bare_principal.py | 2 +- .../libraries/functions/get_config.py | 2 +- .../libraries/functions/get_kdestroy_path.py | 4 +- .../libraries/functions/get_kinit_path.py | 4 +- .../libraries/functions/get_klist_path.py | 4 +- .../functions/get_not_managed_resources.py | 4 +- .../libraries/functions/get_path_from_url.py | 2 +- .../libraries/functions/get_port_from_url.py | 4 +- .../libraries/functions/get_stack_version.py | 4 +- .../functions/get_unique_id_and_date.py | 2 +- .../functions/get_user_call_output.py | 4 +- .../libraries/functions/hdfs_utils.py | 2 +- .../libraries/functions/hive_check.py | 2 +- .../functions/install_windows_msi.py | 4 +- .../libraries/functions/is_empty.py | 2 +- .../libraries/functions/jmx.py | 4 +- .../functions/log_process_information.py | 2 +- .../libraries/functions/lzo_utils.py | 2 +- .../libraries/functions/module_version.py | 16 +- .../functions/mounted_dirs_helper.py | 10 +- .../libraries/functions/mpack_version.py | 16 +- .../libraries/functions/namenode_ha_utils.py | 2 +- .../libraries/functions/oozie_prepare_war.py | 6 +- .../libraries/functions/package_conditions.py | 2 +- .../libraries/functions/ranger_functions.py | 72 +- .../functions/ranger_functions_v2.py | 72 +- .../libraries/functions/reload_windows_env.py | 2 +- .../functions/repo_version_history.py | 4 +- .../libraries/functions/repository_util.py | 2 +- .../libraries/functions/security_commons.py | 16 +- .../libraries/functions/setup_atlas_hook.py | 4 +- .../functions/setup_ranger_plugin.py | 6 +- .../functions/setup_ranger_plugin_xml.py | 30 +- .../libraries/functions/show_logs.py | 2 +- .../simulate_perf_cluster_alert_behaviour.py | 4 +- .../libraries/functions/solr_cloud_util.py | 16 +- .../libraries/functions/stack_features.py | 2 +- .../libraries/functions/stack_select.py | 5 +- .../libraries/functions/stack_tools.py | 2 +- .../libraries/functions/substitute_vars.py | 2 +- .../libraries/functions/tar_archive.py | 2 +- .../libraries/functions/upgrade_summary.py | 4 +- .../libraries/functions/validate.py | 2 +- .../libraries/functions/version.py | 5 +- .../functions/version_select_util.py | 6 +- .../libraries/functions/zip_archive.py | 2 +- .../libraries/providers/__init__.py | 2 +- .../libraries/providers/execute_hadoop.py | 2 +- .../libraries/providers/execute_hdfs.py | 2 +- .../libraries/providers/hdfs_resource.py | 10 +- .../providers/modify_properties_file.py | 16 +- .../libraries/providers/monitor_webserver.py | 2 +- .../libraries/providers/msi.py | 6 +- .../libraries/providers/properties_file.py | 2 +- .../libraries/providers/repository.py | 7 +- .../libraries/providers/template_config.py | 2 +- .../libraries/providers/xml_config.py | 2 +- .../libraries/resources/__init__.py | 2 +- .../libraries/resources/execute_hadoop.py | 2 +- .../libraries/resources/execute_hdfs.py | 2 +- .../resources/modify_properties_file.py | 2 +- .../libraries/resources/monitor_webserver.py | 2 +- .../libraries/resources/properties_file.py | 2 +- .../libraries/resources/repository.py | 2 +- .../libraries/resources/template_config.py | 2 +- .../libraries/resources/xml_config.py | 2 +- .../libraries/script/__init__.py | 2 +- .../libraries/script/config_dictionary.py | 4 +- .../libraries/script/dummy.py | 24 +- .../libraries/script/hook.py | 4 +- .../libraries/script/script.py | 43 +- .../urlinfo_processor/urlinfo_processor.py | 22 +- .../src/main/repo/install_ambari_tarball.py | 16 +- .../src/main/unix/ambari-python-wrap | 20 +- .../src/test/python/coilmq/auth/__init__.py | 3 +- .../src/test/python/coilmq/auth/simple.py | 2 +- .../src/test/python/coilmq/config/__init__.py | 2 +- .../src/test/python/coilmq/engine.py | 2 +- .../test/python/coilmq/protocol/__init__.py | 6 +- .../src/test/python/coilmq/scheduler.py | 3 +- .../src/test/python/coilmq/server/__init__.py | 3 +- .../python/coilmq/server/socket_server.py | 6 +- .../src/test/python/coilmq/store/__init__.py | 5 +- .../src/test/python/coilmq/store/dbm.py | 2 +- .../src/test/python/coilmq/store/rds.py | 2 +- .../test/python/coilmq/util/concurrency.py | 4 +- .../src/test/python/coilmq/util/frames.py | 8 +- .../src/test/python/coilmq/util/six.py | 2 +- .../src/test/python/mock/docs/conf.py | 8 +- ambari-common/src/test/python/mock/mock.py | 40 +- ambari-common/src/test/python/mock/setup.py | 2 +- .../src/test/python/mock/tests/_testwith.py | 2 +- .../src/test/python/mock/tests/support.py | 2 +- .../test/python/mock/tests/support_with.py | 2 +- .../python/mock/tests/testmagicmethods.py | 18 +- .../src/test/python/mock/tests/testmock.py | 14 +- .../src/test/python/mock/tests/testpatch.py | 4 +- .../services/HIVE/package/scripts/__init__.py | 2 +- .../services/HIVE/package/scripts/hcat.py | 2 +- .../HIVE/package/scripts/hcat_client.py | 2 +- .../package/scripts/hcat_service_check.py | 4 +- .../services/HIVE/package/scripts/hive.py | 12 +- .../HIVE/package/scripts/hive_client.py | 2 +- .../HIVE/package/scripts/hive_metastore.py | 2 +- .../HIVE/package/scripts/hive_server.py | 2 +- .../HIVE/package/scripts/hive_service.py | 2 +- .../HIVE/package/scripts/mysql_server.py | 4 +- .../HIVE/package/scripts/mysql_service.py | 2 +- .../services/HIVE/package/scripts/params.py | 2 +- .../HIVE/package/scripts/service_check.py | 4 +- .../HIVE/package/scripts/status_params.py | 2 +- ambari-server/conf/unix/ambari-env.sh | 2 +- ambari-server/conf/unix/create-python-wrap.sh | 4 +- ambari-server/conf/unix/install-helper.sh | 4 +- ambari-server/conf/windows/install-helper.cmd | 2 +- ambari-server/pom.xml | 2 +- .../src/main/package/dependencies.properties | 6 +- .../ambari-server-state/Configurator.py | 4 +- .../src/main/python/ambari-server.py | 73 +- .../python/ambari_server/BackupRestore.py | 13 +- .../src/main/python/ambari_server/__init__.py | 2 +- .../main/python/ambari_server/ambariPath.py | 2 +- .../python/ambari_server/checkDatabase.py | 6 +- .../main/python/ambari_server/dbCleanup.py | 18 +- .../python/ambari_server/dbConfiguration.py | 12 +- .../ambari_server/dbConfiguration_linux.py | 92 +- .../ambari_server/dbConfiguration_windows.py | 6 +- .../main/python/ambari_server/enableStack.py | 2 +- .../main/python/ambari_server/hostUpdate.py | 8 +- .../python/ambari_server/kerberos_setup.py | 8 +- .../main/python/ambari_server/properties.py | 26 +- .../ambari_server/resourceFilesKeeper.py | 18 +- .../python/ambari_server/serverClassPath.py | 2 +- .../ambari_server/serverConfiguration.py | 66 +- .../main/python/ambari_server/serverSetup.py | 184 +- .../python/ambari_server/serverUpgrade.py | 26 +- .../main/python/ambari_server/serverUtils.py | 28 +- .../main/python/ambari_server/setupActions.py | 2 +- .../main/python/ambari_server/setupHttps.py | 52 +- .../main/python/ambari_server/setupMpacks.py | 46 +- .../python/ambari_server/setupSecurity.py | 124 +- .../src/main/python/ambari_server/setupSso.py | 8 +- .../python/ambari_server/setupTrustedProxy.py | 10 +- .../main/python/ambari_server/userInput.py | 94 +- .../src/main/python/ambari_server/utils.py | 22 +- .../src/main/python/ambari_server_main.py | 38 +- .../src/main/python/ambari_windows_service.py | 2 +- .../main/python/azuredb_create_generator.py | 4 +- ambari-server/src/main/python/bootstrap.py | 20 +- .../src/main/python/os_check_type.py | 6 +- ambari-server/src/main/python/setupAgent.py | 18 +- .../3.0.0/package/scripts/collection.py | 16 +- .../3.0.0/package/scripts/migrate.py | 2 +- .../3.0.0/package/scripts/setup_infra_solr.py | 14 +- .../3.0.0/package/scripts/status_params.py | 2 +- .../3.0.0/service_advisor.py | 2 +- .../alerts/alert_ambari_metrics_monitor.py | 2 +- .../3.0.0/package/scripts/__init__.py | 2 +- .../3.0.0/package/scripts/ams.py | 51 +- .../3.0.0/package/scripts/functions.py | 2 +- .../3.0.0/package/scripts/hbase.py | 20 +- .../3.0.0/package/scripts/hbase_master.py | 2 +- .../package/scripts/hbase_regionserver.py | 4 +- .../3.0.0/package/scripts/hbase_service.py | 2 +- .../package/scripts/metrics_collector.py | 2 +- .../3.0.0/package/scripts/metrics_grafana.py | 2 +- .../package/scripts/metrics_grafana_util.py | 34 +- .../3.0.0/package/scripts/metrics_monitor.py | 2 +- .../3.0.0/package/scripts/params.py | 10 +- .../3.0.0/package/scripts/params_linux.py | 2 +- .../3.0.0/package/scripts/params_windows.py | 2 +- .../3.0.0/package/scripts/service_check.py | 18 +- .../3.0.0/package/scripts/service_mapping.py | 2 +- .../3.0.0/package/scripts/split_points.py | 22 +- .../3.0.0/package/scripts/status_params.py | 2 +- .../AMBARI_METRICS/3.0.0/service_advisor.py | 6 +- .../custom_actions/scripts/check_host.py | 28 +- .../custom_actions/scripts/clear_repocache.py | 2 +- .../scripts/install_packages.py | 8 +- .../custom_actions/scripts/remove_bits.py | 2 +- .../scripts/remove_previous_stacks.py | 4 +- .../scripts/ru_execute_tasks.py | 4 +- .../scripts/stack_select_set_all.py | 2 +- .../custom_actions/scripts/update_repo.py | 4 +- .../scripts/validate_configs.py | 4 +- .../host_scripts/alert_disk_space.py | 12 +- .../resources/host_scripts/alert_ulimit.py | 2 +- .../host_scripts/alert_version_select.py | 4 +- .../main/resources/scripts/Ambaripreupload.py | 70 +- .../main/resources/scripts/add_service_api.py | 18 +- .../scripts/check_ambari_permissions.py | 73 +- .../resources/scripts/cluster_blueprint.py | 28 +- .../src/main/resources/scripts/configs.py | 20 +- .../resources/scripts/export_ams_metrics.py | 10 +- .../main/resources/scripts/stack_advisor.py | 18 +- .../scripts/takeover_config_merge.py | 44 +- .../after-INSTALL/scripts/params.py | 1 - .../scripts/shared_initialization.py | 4 +- .../stack-hooks/before-ANY/scripts/params.py | 4 +- .../scripts/shared_initialization.py | 20 +- .../before-START/files/topology_script.py | 18 +- .../before-START/scripts/custom_extensions.py | 8 +- .../before-START/scripts/params.py | 2 +- .../before-START/scripts/rack_awareness.py | 6 +- .../scripts/shared_initialization.py | 16 +- .../package/scripts/flink_history_server.py | 2 +- .../FLINK/package/scripts/flink_service.py | 4 +- .../services/FLINK/package/scripts/params.py | 2 +- .../FLINK/package/scripts/service_check.py | 2 +- .../FLINK/package/scripts/setup_flink.py | 18 +- .../FLINK/package/scripts/status_params.py | 2 +- .../HBASE/package/scripts/__init__.py | 2 +- .../HBASE/package/scripts/functions.py | 6 +- .../services/HBASE/package/scripts/hbase.py | 26 +- .../HBASE/package/scripts/hbase_client.py | 6 +- .../package/scripts/hbase_decommission.py | 6 +- .../HBASE/package/scripts/hbase_master.py | 2 +- .../package/scripts/hbase_regionserver.py | 5 +- .../HBASE/package/scripts/hbase_service.py | 2 +- .../HBASE/package/scripts/hbase_upgrade.py | 4 +- .../services/HBASE/package/scripts/params.py | 2 +- .../HBASE/package/scripts/params_linux.py | 2 +- .../HBASE/package/scripts/params_windows.py | 2 +- .../HBASE/package/scripts/service_check.py | 10 +- .../package/scripts/setup_ranger_hbase.py | 10 +- .../HBASE/package/scripts/status_params.py | 2 +- .../services/HBASE/package/scripts/upgrade.py | 2 +- .../3.2.0/services/HBASE/service_advisor.py | 4 +- .../package/alerts/alert_checkpoint_time.py | 6 +- .../alert_datanode_unmounted_data_dir.py | 6 +- .../alerts/alert_ha_namenode_health.py | 6 +- .../package/alerts/alert_metrics_deviation.py | 13 +- .../package/alerts/alert_upgrade_finalized.py | 6 +- .../services/HDFS/package/files/checkWebUI.py | 18 +- .../scripts/balancer-emulator/hdfs-command.py | 2 +- .../services/HDFS/package/scripts/hdfs.py | 8 +- .../HDFS/package/scripts/hdfs_datanode.py | 4 +- .../HDFS/package/scripts/hdfs_namenode.py | 6 +- .../HDFS/package/scripts/hdfs_nfsgateway.py | 2 +- .../HDFS/package/scripts/hdfs_rebalance.py | 4 +- .../HDFS/package/scripts/hdfs_snamenode.py | 2 +- .../package/scripts/journalnode_upgrade.py | 2 +- .../services/HDFS/package/scripts/namenode.py | 4 +- .../HDFS/package/scripts/namenode_ha_state.py | 2 +- .../HDFS/package/scripts/namenode_upgrade.py | 8 +- .../HDFS/package/scripts/params_linux.py | 6 +- .../HDFS/package/scripts/service_check.py | 4 +- .../HDFS/package/scripts/setup_ranger_hdfs.py | 6 +- .../services/HDFS/package/scripts/utils.py | 16 +- .../HDFS/package/scripts/zkfc_slave.py | 2 +- .../3.2.0/services/HDFS/service_advisor.py | 22 +- .../alert_hive_interactive_thrift_port.py | 2 +- .../package/alerts/alert_hive_metastore.py | 4 +- .../HIVE/package/alerts/alert_hive_sys_db.py | 2 +- .../package/alerts/alert_hive_thrift_port.py | 8 +- .../package/alerts/alert_llap_app_status.py | 2 +- .../services/HIVE/package/scripts/__init__.py | 2 +- .../services/HIVE/package/scripts/hcat.py | 4 +- .../HIVE/package/scripts/hcat_client.py | 2 +- .../package/scripts/hcat_service_check.py | 4 +- .../services/HIVE/package/scripts/hive.py | 66 +- .../HIVE/package/scripts/hive_client.py | 2 +- .../HIVE/package/scripts/hive_metastore.py | 4 +- .../HIVE/package/scripts/hive_server.py | 2 +- .../package/scripts/hive_server_upgrade.py | 2 +- .../HIVE/package/scripts/hive_service.py | 2 +- .../HIVE/package/scripts/mysql_server.py | 2 +- .../HIVE/package/scripts/mysql_service.py | 4 +- .../HIVE/package/scripts/mysql_users.py | 6 +- .../HIVE/package/scripts/mysql_utils.py | 2 +- .../services/HIVE/package/scripts/params.py | 15 +- .../HIVE/package/scripts/post_upgrade.py | 2 +- .../HIVE/package/scripts/service_check.py | 2 +- .../HIVE/package/scripts/setup_ranger_hive.py | 8 +- .../HIVE/package/scripts/status_params.py | 2 +- .../services/HIVE/package/scripts/webhcat.py | 8 +- .../package/scripts/webhcat_service_check.py | 6 +- .../3.2.0/services/HIVE/service_advisor.py | 14 +- .../services/KAFKA/package/scripts/kafka.py | 22 +- .../KAFKA/package/scripts/kafka_broker.py | 6 +- .../services/KAFKA/package/scripts/params.py | 2 +- .../KAFKA/package/scripts/service_check.py | 4 +- .../KAFKA/package/scripts/status_params.py | 2 +- .../services/KAFKA/package/scripts/upgrade.py | 2 +- .../services/KAFKA/package/scripts/utils.py | 2 +- .../3.2.0/services/KAFKA/service_advisor.py | 2 +- .../package/scripts/kerberos_client.py | 2 +- .../KERBEROS/package/scripts/service_check.py | 6 +- .../SOLR/package/scripts/setup_solr.py | 14 +- .../SOLR/package/scripts/status_params.py | 2 +- .../3.2.0/services/SOLR/service_advisor.py | 2 +- .../package/scripts/job_history_server.py | 2 +- .../services/SPARK/package/scripts/params.py | 4 +- .../SPARK/package/scripts/setup_spark.py | 26 +- .../SPARK/package/scripts/spark_client.py | 2 +- .../SPARK/package/scripts/spark_service.py | 8 +- .../package/scripts/spark_thrift_server.py | 2 +- .../SPARK/package/scripts/status_params.py | 2 +- .../3.2.0/services/SPARK/service_advisor.py | 2 +- .../services/TEZ/package/scripts/params.py | 2 +- .../TEZ/package/scripts/params_linux.py | 2 +- .../TEZ/package/scripts/params_windows.py | 2 +- .../TEZ/package/scripts/service_check.py | 2 +- .../3.2.0/services/TEZ/package/scripts/tez.py | 6 +- .../TEZ/package/scripts/tez_client.py | 4 +- .../3.2.0/services/TEZ/service_advisor.py | 2 +- .../alerts/alert_nodemanager_health.py | 8 +- .../alerts/alert_nodemanagers_summary.py | 8 +- .../validateYarnComponentStatusWindows.py | 30 +- .../YARN/package/scripts/install_jars.py | 12 +- .../package/scripts/nodemanager_upgrade.py | 2 +- .../services/YARN/package/scripts/params.py | 2 +- .../YARN/package/scripts/params_linux.py | 12 +- .../services/YARN/package/scripts/service.py | 2 +- .../YARN/package/scripts/service_check.py | 2 +- .../YARN/package/scripts/setup_ranger_yarn.py | 6 +- .../YARN/package/scripts/status_params.py | 2 +- .../services/YARN/package/scripts/yarn.py | 53 +- .../3.2.0/services/YARN/service_advisor.py | 52 +- .../scripts/interpreter_json_template.py | 4 +- .../ZEPPELIN/package/scripts/params.py | 2 +- .../package/scripts/zeppelin_server.py | 20 +- .../services/ZEPPELIN/service_advisor.py | 4 +- .../package/scripts/service_check.py | 4 +- .../package/scripts/status_params.py | 2 +- .../ZOOKEEPER/package/scripts/zookeeper.py | 12 +- .../package/scripts/zookeeper_client.py | 2 +- .../services/ZOOKEEPER/service_advisor.py | 2 +- .../main/resources/stacks/stack_advisor.py | 54 +- .../test/python/TestAmbariConfiguration.py | 74 +- .../src/test/python/TestAmbariServer.py | 541 +++--- .../src/test/python/TestBootstrap.py | 79 +- .../src/test/python/TestClusterBlueprint.py | 2 +- ambari-server/src/test/python/TestConfigs.py | 39 +- .../src/test/python/TestExecutionCommand.py | 24 +- ambari-server/src/test/python/TestMpacks.py | 29 +- ambari-server/src/test/python/TestOSCheck.py | 59 +- .../test/python/TestResourceFilesKeeper.py | 47 +- .../python/TestSensitiveDataEncryption.py | 65 +- .../src/test/python/TestServerClassPath.py | 13 +- .../src/test/python/TestServerUpgrade.py | 28 +- .../src/test/python/TestServerUtils.py | 19 +- .../src/test/python/TestServiceAdvisor.py | 8 +- .../src/test/python/TestSetupAgent.py | 8 +- ambari-server/src/test/python/TestSetupSso.py | 48 +- .../src/test/python/TestSetupTrustedProxy.py | 27 +- .../src/test/python/TestStackAdvisor.py | 32 +- ambari-server/src/test/python/TestUtils.py | 64 +- .../src/test/python/TestValidateConfigs.py | 14 +- ambari-server/src/test/python/TestVersion.py | 7 +- .../src/test/python/TestVersionSelectUtil.py | 20 +- .../src/test/python/TestYAMLUtils.py | 32 +- .../python/custom_actions/TestCheckHost.py | 54 +- .../custom_actions/TestClearRepoCache.py | 2 +- .../custom_actions/TestInstallPackages.py | 136 +- .../python/custom_actions/TestRemoveBits.py | 4 +- .../custom_actions/TestRemoveStackVersion.py | 12 +- .../custom_actions/TestRepoVersionHistory.py | 16 +- .../python/custom_actions/TestUpdateRepo.py | 42 +- .../test_stack_select_set_all.py | 6 +- .../python/host_scripts/TestAlertDiskSpace.py | 24 +- .../python/host_scripts/TestAlertUlimit.py | 8 +- .../hooks/after_install.py | 2 +- .../hooks/before_install.py | 2 +- .../hooks/after_install.py | 2 +- .../hooks/after_upgrade.py | 2 +- .../hooks/before_install.py | 2 +- .../hooks/before_upgrade.py | 2 +- .../src/test/python/stacks/__init__.py | 2 +- .../after-INSTALL/test_after_install.py | 16 +- .../stack-hooks/before-ANY/test_before_any.py | 54 +- .../before-INSTALL/test_before_install.py | 8 +- .../test_before_set_keytab.py | 4 +- .../before-START/test_before_start.py | 52 +- .../test/python/stacks/test_stack_adviser.py | 10 +- .../test/python/stacks/utils/RMFTestCase.py | 51 +- .../src/test/python/stacks/utils/__init__.py | 2 +- ambari-server/src/test/python/unitTests.py | 4 +- .../package/scripts/__init__.py | 2 +- .../0.11.0.2.0.5.0/package/scripts/hcat.py | 6 +- .../package/scripts/hcat_client.py | 6 +- .../package/scripts/hcat_service_check.py | 6 +- .../0.11.0.2.0.5.0/package/scripts/hive.py | 20 +- .../package/scripts/hive_client.py | 6 +- .../package/scripts/hive_metastore.py | 14 +- .../package/scripts/hive_server.py | 14 +- .../package/scripts/hive_service.py | 4 +- .../package/scripts/mysql_server.py | 12 +- .../package/scripts/mysql_service.py | 2 +- .../0.11.0.2.0.5.0/package/scripts/params.py | 4 +- .../package/scripts/service_check.py | 8 +- .../package/scripts/status_params.py | 2 +- .../HIVE/package/scripts/status_params.py | 2 +- .../HIVE/package/scripts/__init__.py | 2 +- .../dummy_stack/HIVE/package/scripts/hcat.py | 6 +- .../HIVE/package/scripts/hcat_client.py | 6 +- .../package/scripts/hcat_service_check.py | 6 +- .../dummy_stack/HIVE/package/scripts/hive.py | 20 +- .../HIVE/package/scripts/hive_client.py | 6 +- .../HIVE/package/scripts/hive_metastore.py | 14 +- .../HIVE/package/scripts/hive_server.py | 14 +- .../HIVE/package/scripts/hive_service.py | 4 +- .../HIVE/package/scripts/mysql_server.py | 12 +- .../HIVE/package/scripts/mysql_service.py | 2 +- .../HIVE/package/scripts/params.py | 4 +- .../HIVE/package/scripts/service_check.py | 8 +- .../HIVE/package/scripts/status_params.py | 2 +- .../services/HIVE/package/scripts/__init__.py | 2 +- .../services/HIVE/package/scripts/hcat.py | 2 +- .../HIVE/package/scripts/hcat_client.py | 2 +- .../package/scripts/hcat_service_check.py | 4 +- .../services/HIVE/package/scripts/hive.py | 12 +- .../HIVE/package/scripts/hive_client.py | 2 +- .../HIVE/package/scripts/hive_metastore.py | 2 +- .../HIVE/package/scripts/hive_server.py | 2 +- .../HIVE/package/scripts/hive_service.py | 2 +- .../HIVE/package/scripts/mysql_server.py | 4 +- .../HIVE/package/scripts/mysql_service.py | 2 +- .../services/HIVE/package/scripts/params.py | 2 +- .../HIVE/package/scripts/service_check.py | 4 +- .../HIVE/package/scripts/status_params.py | 2 +- .../resources/stacks/old_stack_advisor.py | 2 +- .../app/assets/data/services/ambari.json | 4 +- contrib/utils/perf/deploy-gce-perf-cluster.py | 2 +- .../src/main/python/preinstall_checker.py | 2 +- .../config-utils/diff_stack_properties.py | 24 +- dev-support/docker/docker/bin/ambaribuild.py | 20 +- setup.py | 2 +- 716 files changed, 5059 insertions(+), 6840 deletions(-) delete mode 100644 ambari-common/src/main/python/ambari_commons/subprocess32.py diff --git a/ambari-agent/conf/unix/agent-multiplier.py b/ambari-agent/conf/unix/agent-multiplier.py index 0c21c01b5e9..b6d49bacfbf 100644 --- a/ambari-agent/conf/unix/agent-multiplier.py +++ b/ambari-agent/conf/unix/agent-multiplier.py @@ -17,7 +17,7 @@ import sys import os import re -from ambari_commons import subprocess32 +import subprocess import shutil from optparse import OptionParser @@ -76,18 +76,18 @@ def __init__(self, args): self.parse_configs() if len(args) != 2: - print "Sample Usage: python agent_multiplier.py [action]\n" \ - "actions: start|stop|restart|status" + print("Sample Usage: python agent_multiplier.py [action]\n" \ + "actions: start|stop|restart|status") self.command = args[1] # Validate configs self.validate() - print "*** Params ***" - print "Start: %d" % self.start - print "Num: %d" % self.num - print "Prefix: %s" % self.prefix - print "Command: %s" % self.command + print("*** Params ***") + print("Start: %d" % self.start) + print("Num: %d" % self.num) + print("Prefix: %s" % self.prefix) + print("Command: %s" % self.command) # All hostnames that will be managed by Ambari Agents on this host self.hosts = [] @@ -104,7 +104,7 @@ def parse_configs(self): Parse the configuration file to set the config params. """ if not os.path.exists(self.CONFIG_FILE): - print "Did not find Agent Multiplier config file: %s" % str(self.CONFIG_FILE) + print("Did not find Agent Multiplier config file: %s" % str(self.CONFIG_FILE)) sys.exit(-1) params = {} @@ -147,8 +147,8 @@ def validate(self): errors.append("Command must be one of %s" % ", ".join(valid_commands)) if len(errors) > 0: - print "Error:" - print "\n".join(errors) + print("Error:") + print("\n".join(errors)) sys.exit(-1) def bootstrap(self): @@ -166,28 +166,28 @@ def bootstrap(self): host_cache_dir = host_home_dir + self.cache_dir if self.verbose: - print "Analyzing host %s with port %d" % (host_name, host.ping_port) + print("Analyzing host %s with port %d" % (host_name, host.ping_port)) for dir in [host_home_dir, host_log_dir, host_config_dir, host_pid_dir, host_prefix, host_cache_dir]: if not os.path.isdir(dir): - print "Creating dir %s" % (dir) + print("Creating dir %s" % (dir)) os.makedirs(dir) # Copy config file host_config_file = os.path.join(host_config_dir, "ambari-agent.ini") if not os.path.isfile(host_config_file): - print "Copying config file %s" % str(host_config_file) + print("Copying config file %s" % str(host_config_file)) shutil.copyfile(self.source_config_file, host_config_file) # Copy version file version_file = os.path.join(host_prefix, "version") if not os.path.isfile(version_file): - print "Copying version file %s" % str(version_file) + print("Copying version file %s" % str(version_file)) shutil.copyfile(self.source_version_file, version_file) # Copy cache dir content if not os.path.isdir(os.path.join(host_cache_dir, "stacks")): - print "Copying cache directory content %s" % str(host_cache_dir) + print("Copying cache directory content %s" % str(host_cache_dir)) self.copytree(self.cache_dir, host_cache_dir) # Create hostname.sh script to use custom FQDN for each agent. @@ -226,7 +226,7 @@ def create_host_name_script(self, host_name, host_name_script): "echo HOSTNAME" with open(str(host_name_script), "w+") as f: f.writelines(template.replace("HOSTNAME", host_name)) - subprocess32.call("chmod +x %s" % host_name_script, shell=True) + subprocess.call("chmod +x %s" % host_name_script, shell=True) def change_config(self, config_file, config_dict): """ @@ -237,7 +237,7 @@ def change_config(self, config_file, config_dict): # TODO, allow appending configs to [AGENT] section. if not os.path.exists(config_file): - print "ERROR. Did not file config file: %s" % config_file + print("ERROR. Did not file config file: %s" % config_file) return lines = [] @@ -249,7 +249,7 @@ def change_config(self, config_file, config_dict): configs_found = set() configs_changed = set() for line in lines: - for config, value in config_dict.iteritems(): + for config, value in config_dict.items(): p = re.compile(config + "\s?=") if p.match(line): configs_found.add(config) @@ -264,11 +264,11 @@ def change_config(self, config_file, config_dict): # TODO, if can append configs, then this is not needed. if len(configs_found) < len(config_dict.keys()): missing_configs = set(config_dict.keys()) - configs_found - print "ERROR: Did not find all required configs. Missing: %s" % ", ".join(missing_configs) + print("ERROR: Did not find all required configs. Missing: %s" % ", ".join(missing_configs)) sys.exit(-1) if len(configs_changed) > 0: - print "Making changes to file %s" % config_file + print("Making changes to file %s" % config_file) with open(config_file, "w") as f: f.writelines(new_lines) @@ -279,7 +279,7 @@ def modify_etc_hosts_file(self): """ etc_hosts = "/etc/hosts" if not os.path.isfile(etc_hosts): - print "ERROR. Did not find file %s" % etc_hosts + print("ERROR. Did not find file %s" % etc_hosts) return lines = [] @@ -299,7 +299,7 @@ def modify_etc_hosts_file(self): new_lines.append(line) if line_changed: - print "Making changes to %s" % etc_hosts + print("Making changes to %s" % etc_hosts) with open(etc_hosts, "w") as f: f.writelines(new_lines) @@ -317,42 +317,42 @@ def run(self): self.cmd_status() def cmd_start(self): - print "Starting %d host(s)" % len(self.hosts) + print("Starting %d host(s)" % len(self.hosts)) for host in self.hosts: cmd = "ambari-agent start --home %s" % (host.home_dir) os.environ['AMBARI_AGENT_CONF_DIR'] = os.path.join(host.home_dir, "etc/ambari-agent/conf") - subprocess32.call(cmd, shell=True, env=os.environ) + subprocess.call(cmd, shell=True, env=os.environ) def cmd_stop(self): - print "Stopping %d host(s)" % len(self.hosts) + print("Stopping %d host(s)" % len(self.hosts)) for host in self.hosts: cmd = "ambari-agent stop --home %s" % (host.home_dir) os.environ['AMBARI_AGENT_CONF_DIR'] = os.path.join(host.home_dir, "etc/ambari-agent/conf") - subprocess32.call(cmd, shell=True, env=os.environ) + subprocess.call(cmd, shell=True, env=os.environ) def cmd_restart(self): - print "Restarting %d host(s)" % len(self.hosts) + print("Restarting %d host(s)" % len(self.hosts)) for host in self.hosts: cmd = "ambari-agent restart --home %s" % (host.home_dir) os.environ['AMBARI_AGENT_CONF_DIR'] = os.path.join(host.home_dir, "etc/ambari-agent/conf") - subprocess32.call(cmd, shell=True, env=os.environ) + subprocess.call(cmd, shell=True, env=os.environ) def cmd_status(self): - print "Summary of Agent Status:" - print "Total agents: %d\n" % len(self.hosts) + print("Summary of Agent Status:") + print("Total agents: %d\n" % len(self.hosts)) (running_hosts, unknown_hosts, stopped_hosts) = self.aggregate_status() - print "Running agents: %d" % len(running_hosts) + print("Running agents: %d" % len(running_hosts)) if self.verbose and len(running_hosts): - print "(%s)\n" % (", ".join(running_hosts)) + print("(%s)\n" % (", ".join(running_hosts))) - print "Unknown agents: %d" % len(unknown_hosts) + print("Unknown agents: %d" % len(unknown_hosts)) if self.verbose and len(unknown_hosts): - print "(%s)\n" % (", ".join(unknown_hosts)) + print("(%s)\n" % (", ".join(unknown_hosts))) - print "Stopped agents: %d" % len(stopped_hosts) + print("Stopped agents: %d" % len(stopped_hosts)) if self.verbose and len(stopped_hosts): - print "(%s)\n" % (", ".join(stopped_hosts)) + print("(%s)\n" % (", ".join(stopped_hosts))) def aggregate_status(self): """ diff --git a/ambari-agent/conf/unix/install-helper.sh b/ambari-agent/conf/unix/install-helper.sh index d333331da8c..cc73ad059d1 100644 --- a/ambari-agent/conf/unix/install-helper.sh +++ b/ambari-agent/conf/unix/install-helper.sh @@ -119,10 +119,10 @@ install_autostart(){ } locate_python(){ - local python_binaries="/usr/bin/python;/usr/bin/python2;/usr/bin/python2.7" + local python_binaries="/usr/bin/python;/usr/bin/python3;/usr/bin/python3.9" echo ${python_binaries}| tr ';' '\n' | while read python_binary; do - ${python_binary} -c "import sys ; ver = sys.version_info ; sys.exit(not (ver >= (2,7) and ver<(3,0)))" 1>>${LOG_FILE} 2>/dev/null + ${python_binary} -c "import sys ; ver = sys.version_info ; sys.exit(not (ver >= (3,0)))" 1>>${LOG_FILE} 2>/dev/null if [ $? -eq 0 ]; then echo "${python_binary}" diff --git a/ambari-agent/conf/unix/upgrade_agent_configs.py b/ambari-agent/conf/unix/upgrade_agent_configs.py index 108b510e903..ae5d7b0a0fd 100644 --- a/ambari-agent/conf/unix/upgrade_agent_configs.py +++ b/ambari-agent/conf/unix/upgrade_agent_configs.py @@ -18,7 +18,7 @@ ''' import os -import ConfigParser +import configparser PROPERTIES_TO_REWRITE = [ ('heartbeat', 'dirs'), @@ -33,13 +33,13 @@ if os.path.isfile(CONFIG_FILE_BACKUP): if os.path.isfile(CONFIG_FILE): - print "Upgrading configs in {0}".format(CONFIG_FILE) - print "Values will be updated from {0} except the following list: {1}, {2}".format(CONFIG_FILE_BACKUP, PROPERTIES_TO_REWRITE, SECTIONS_TO_REMOVE) + print("Upgrading configs in {0}".format(CONFIG_FILE)) + print("Values will be updated from {0} except the following list: {1}, {2}".format(CONFIG_FILE_BACKUP, PROPERTIES_TO_REWRITE, SECTIONS_TO_REMOVE)) - agent_config_backup = ConfigParser.ConfigParser() + agent_config_backup = configparser.ConfigParser() agent_config_backup.read(CONFIG_FILE_BACKUP) - agent_config = ConfigParser.ConfigParser() + agent_config = configparser.ConfigParser() agent_config.read(CONFIG_FILE) for section in agent_config_backup.sections(): @@ -47,13 +47,13 @@ if section not in SECTIONS_TO_REMOVE and (section, property_name) not in PROPERTIES_TO_REWRITE: try: agent_config.set(section, property_name, property_val) - except ConfigParser.NoSectionError: + except configparser.NoSectionError: agent_config.add_section(section) agent_config.set(section, property_name, property_val) - with (open(CONFIG_FILE, "wb")) as new_agent_config: + with (open(CONFIG_FILE, "w")) as new_agent_config: agent_config.write(new_agent_config) else: - print "Values are not updated, configs {0} is not found".format(CONFIG_FILE) + print("Values are not updated, configs {0} is not found".format(CONFIG_FILE)) else: - print "Values are not updated, backup {0} is not found".format(CONFIG_FILE_BACKUP) \ No newline at end of file + print("Values are not updated, backup {0} is not found".format(CONFIG_FILE_BACKUP)) \ No newline at end of file diff --git a/ambari-agent/conf/windows/service_wrapper.py b/ambari-agent/conf/windows/service_wrapper.py index ac9e22da864..bf6fa7b33ed 100644 --- a/ambari-agent/conf/windows/service_wrapper.py +++ b/ambari-agent/conf/windows/service_wrapper.py @@ -15,7 +15,7 @@ See the License for the specific language governing permissions and limitations under the License. ''' -import ConfigParser +import configparser import os import optparse import sys @@ -51,13 +51,13 @@ def parse_options(): name, value = line[4:].split("=") os.environ[name] = value.rstrip() # checking env variables, and fallback to working dir if no env var was founded - if not os.environ.has_key("AMBARI_AGENT_CONF_DIR"): + if "AMBARI_AGENT_CONF_DIR" not in os.environ: os.environ["AMBARI_AGENT_CONF_DIR"] = os.getcwd() - if not os.environ.has_key("AMBARI_AGENT_LOG_DIR"): + if "AMBARI_AGENT_LOG_DIR" not in os.environ: os.environ["AMBARI_AGENT_LOG_DIR"] = os.path.join("\\", "var", "log", "ambari-agent") if not os.path.exists(os.environ["AMBARI_AGENT_LOG_DIR"]): os.makedirs(os.environ["AMBARI_AGENT_LOG_DIR"]) - if not os.environ.has_key("PYTHON_EXE"): + if "PYTHON_EXE" not in os.environ: os.environ["PYTHON_EXE"] = find_in_path("python.exe") @@ -162,7 +162,7 @@ def svcstatus(options): options.exit_message = None statusStr = AmbariAgentService.QueryStatus() - print "Ambari Agent is " + statusStr + print("Ambari Agent is " + statusStr) def svcdebug(options): @@ -201,7 +201,7 @@ def agent_main(): options.warnings = [] if len(args) == 0: - print parser.print_help() + print(parser.print_help()) parser.error("No action entered") action = args[0] @@ -212,7 +212,7 @@ def agent_main(): matches += int(len(args) == args_number_required) if matches == 0: - print parser.print_help() + print(parser.print_help()) possible_args = ' or '.join(str(x) for x in possible_args_numbers) parser.error("Invalid number of arguments. Entered: " + str(len(args)) + ", required: " + possible_args) @@ -247,7 +247,7 @@ def agent_main(): print_warning_msg(e.reason) if options.exit_message is not None: - print options.exit_message + print(options.exit_message) if __name__ == '__main__': diff --git a/ambari-agent/pom.xml b/ambari-agent/pom.xml index b6df2e86657..1ecbab8c42d 100644 --- a/ambari-agent/pom.xml +++ b/ambari-agent/pom.xml @@ -715,7 +715,7 @@ \ ; HDPWIN - python + python3 cmd cmd .cmd diff --git a/ambari-agent/src/main/package/dependencies.properties b/ambari-agent/src/main/package/dependencies.properties index ec64264df4f..60852e0b3b7 100644 --- a/ambari-agent/src/main/package/dependencies.properties +++ b/ambari-agent/src/main/package/dependencies.properties @@ -28,5 +28,5 @@ # Such a format is respected by install_ambari_tarball.py by default, # however should be encouraged manually in pom.xml. -rpm.dependency.list=openssl,\nRequires: rpm-python,\nRequires: zlib,\nRequires: python >= 2.6 +rpm.dependency.list=openssl,\nRequires: python3-rpm,\nRequires: zlib deb.dependency.list=openssl, python (>= 2.6) \ No newline at end of file diff --git a/ambari-agent/src/main/python/ambari_agent/ActionQueue.py b/ambari-agent/src/main/python/ambari_agent/ActionQueue.py index 60d84eda886..f070a21673c 100644 --- a/ambari-agent/src/main/python/ambari_agent/ActionQueue.py +++ b/ambari-agent/src/main/python/ambari_agent/ActionQueue.py @@ -16,7 +16,7 @@ limitations under the License. """ -import Queue +import queue import logging import threading @@ -27,7 +27,7 @@ import signal import re -from AgentException import AgentException +from .AgentException import AgentException from ambari_agent.BackgroundCommandExecutionHandle import BackgroundCommandExecutionHandle from ambari_agent.models.commands import AgentCommand, CommandStatus from ambari_commons.str_utils import split_on_chunks @@ -60,8 +60,8 @@ class ActionQueue(threading.Thread): def __init__(self, initializer_module): super(ActionQueue, self).__init__() - self.commandQueue = Queue.Queue() - self.backgroundCommandQueue = Queue.Queue() + self.commandQueue = queue.Queue() + self.backgroundCommandQueue = queue.Queue() self.commandStatuses = initializer_module.commandStatuses self.config = initializer_module.config self.recovery_manager = initializer_module.recovery_manager @@ -105,11 +105,11 @@ def cancel(self, commands): reason = command['reason'] # Remove from the command queue by task_id - queue = self.commandQueue - self.commandQueue = Queue.Queue() + tmp_queue = self.commandQueue + self.commandQueue = queue.Queue() - while not queue.empty(): - queued_command = queue.get(False) + while not tmp_queue.empty(): + queued_command = tmp_queue.get(False) if queued_command['taskId'] != task_id: self.commandQueue.put(queued_command) else: @@ -159,7 +159,7 @@ def run(self): break pass pass - except Queue.Empty: + except queue.Empty: pass except Exception: logger.exception("ActionQueue thread failed with exception. Re-running it") @@ -175,7 +175,7 @@ def process_background_queue_safe_empty(self): command = self.backgroundCommandQueue.get(False) if "__handle" in command and command["__handle"].status is None: self.process_command(command) - except Queue.Empty: + except queue.Empty: pass def create_command_handle(self, command): @@ -344,8 +344,8 @@ def execute_command(self, command): role_result = self.commandStatuses.generate_report_template(command) role_result.update({ - 'stdout': unicode(command_result['stdout'], errors='replace'), - 'stderr': unicode(command_result['stderr'], errors='replace'), + 'stdout': command_result['stdout'], + 'stderr': command_result['stderr'], 'exitCode': command_result['exitcode'], 'status': status, }) @@ -375,7 +375,7 @@ def execute_command(self, command): # let ambari know name of custom command - if 'commandParams' in command and command['commandParams'].has_key('custom_command'): + if 'commandParams' in command and 'custom_command' in command['commandParams']: role_result['customCommand'] = command['commandParams']['custom_command'] if 'structuredOut' in command_result: diff --git a/ambari-agent/src/main/python/ambari_agent/ActualConfigHandler.py b/ambari-agent/src/main/python/ambari_agent/ActualConfigHandler.py index 3a378cd4d1a..6b0de7564cb 100644 --- a/ambari-agent/src/main/python/ambari_agent/ActualConfigHandler.py +++ b/ambari-agent/src/main/python/ambari_agent/ActualConfigHandler.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -74,7 +74,7 @@ def read_file(self, filename): res = json.load(conf_file) if (0 == len(res)): res = None - except Exception, e: + except Exception as e: logger.error("Error parsing " + filename + ": " + repr(e)) res = None pass diff --git a/ambari-agent/src/main/python/ambari_agent/AlertSchedulerHandler.py b/ambari-agent/src/main/python/ambari_agent/AlertSchedulerHandler.py index f8b09fa2ba0..cf5bc3509f2 100644 --- a/ambari-agent/src/main/python/ambari_agent/AlertSchedulerHandler.py +++ b/ambari-agent/src/main/python/ambari_agent/AlertSchedulerHandler.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one @@ -27,14 +27,14 @@ import sys import time -from apscheduler.scheduler import Scheduler -from alerts.collector import AlertCollector -from alerts.metric_alert import MetricAlert -from alerts.ams_alert import AmsAlert -from alerts.port_alert import PortAlert -from alerts.script_alert import ScriptAlert -from alerts.web_alert import WebAlert -from alerts.recovery_alert import RecoveryAlert +from ambari_agent.apscheduler.scheduler import Scheduler +from ambari_agent.alerts.collector import AlertCollector +from ambari_agent.alerts.metric_alert import MetricAlert +from ambari_agent.alerts.ams_alert import AmsAlert +from ambari_agent.alerts.port_alert import PortAlert +from ambari_agent.alerts.script_alert import ScriptAlert +from ambari_agent.alerts.web_alert import WebAlert +from ambari_agent.alerts.recovery_alert import RecoveryAlert from ambari_agent.ExitHelper import ExitHelper from ambari_agent.FileCache import FileCache from ambari_agent.Utils import Utils @@ -113,7 +113,7 @@ def update_definitions(self, event_type): """ # prune out things we don't want to store alert_definitions = [] - for cluster_id, command in self.alert_definitions_cache.iteritems(): + for cluster_id, command in self.alert_definitions_cache.items(): command_copy = Utils.get_mutable_copy(command) alert_definitions.append(command_copy) @@ -247,7 +247,7 @@ def __load_definitions(self): :return: """ definitions = [] - for cluster_id, command_json in self.alert_definitions_cache.iteritems(): + for cluster_id, command_json in self.alert_definitions_cache.items(): clusterName = '' if not 'clusterName' in command_json else command_json['clusterName'] hostName = '' if not 'hostName' in command_json else command_json['hostName'] publicHostName = '' if not 'publicHostName' in command_json else command_json['publicHostName'] @@ -305,7 +305,7 @@ def __json_to_callable(self, clusterName, hostName, publicHostName, json_definit if alert is not None: alert.set_cluster(clusterName, json_definition['clusterId'], hostName, publicHostName) - except Exception, exception: + except Exception as exception: logger.exception("[AlertScheduler] Unable to load an invalid alert definition. It will be skipped.") return alert @@ -401,7 +401,7 @@ def main(): except KeyboardInterrupt: pass - print str(ash.collector().alerts()) + print(str(ash.collector().alerts())) ash.stop() diff --git a/ambari-agent/src/main/python/ambari_agent/AlertStatusReporter.py b/ambari-agent/src/main/python/ambari_agent/AlertStatusReporter.py index c512ff21283..6224d1e3c6f 100644 --- a/ambari-agent/src/main/python/ambari_agent/AlertStatusReporter.py +++ b/ambari-agent/src/main/python/ambari_agent/AlertStatusReporter.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -96,8 +96,7 @@ def get_changed_alerts(self, alerts): alert_name = alert['name'] alert_state = alert['state'] - alert_definitions = filter(lambda definition: definition['name'] == alert_name, - self.alert_definitions_cache[cluster_id]['alertDefinitions']) + alert_definitions = [definition for definition in self.alert_definitions_cache[cluster_id]['alertDefinitions'] if definition['name'] == alert_name] if alert_definitions: alert_definition = alert_definitions[0] definition_tolerance_enabled = alert_definition['repeat_tolerance_enabled'] diff --git a/ambari-agent/src/main/python/ambari_agent/AmbariAgent.py b/ambari-agent/src/main/python/ambari_agent/AmbariAgent.py index 7b764df985e..9d807cc3687 100644 --- a/ambari-agent/src/main/python/ambari_agent/AmbariAgent.py +++ b/ambari-agent/src/main/python/ambari_agent/AmbariAgent.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one @@ -20,7 +20,7 @@ import os import sys -from ambari_commons import subprocess32 +import subprocess AGENT_AUTO_RESTART_EXIT_CODE = 77 @@ -66,9 +66,6 @@ def check_native_libs_support(): if not c_extension.is_loaded(): not_loaded_extensions.append("simplejson") - if subprocess32._posixsubprocess is None: - not_loaded_extensions.append("subprocess32") - if not_loaded_extensions: logger.warning("Some native extensions not available for module(s): {}, it may affect execution performance".format(",".join(not_loaded_extensions))) @@ -89,9 +86,9 @@ def main(): while status == AGENT_AUTO_RESTART_EXIT_CODE: check_native_libs_support() - main_process = subprocess32.Popen(merged_args) - main_process.communicate() - status = main_process.returncode + mainProcess = subprocess.Popen(merged_args) + mainProcess.communicate() + status = mainProcess.returncode if os.path.isfile(AGENT_PID_FILE) and status == AGENT_AUTO_RESTART_EXIT_CODE: os.remove(AGENT_PID_FILE) diff --git a/ambari-agent/src/main/python/ambari_agent/AmbariConfig.py b/ambari-agent/src/main/python/ambari_agent/AmbariConfig.py index fedd0636f16..4945d08a744 100644 --- a/ambari-agent/src/main/python/ambari_agent/AmbariConfig.py +++ b/ambari-agent/src/main/python/ambari_agent/AmbariConfig.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -19,9 +19,9 @@ ''' import logging -import ConfigParser -import StringIO -import hostname +import configparser +import io +from ambari_agent import hostname import ambari_simplejson as json import os import ssl @@ -105,13 +105,19 @@ class AmbariConfig: def __init__(self): global content - self.config = ConfigParser.RawConfigParser() - self.config.readfp(StringIO.StringIO(content)) + self.config = configparser.RawConfigParser() + self.config.readfp(io.StringIO(content)) + self._cluster_cache_dir = os.path.join(self.cache_dir, FileCache.CLUSTER_CACHE_DIRECTORY) + self._alerts_cachedir = os.path.join(self.cache_dir, FileCache.ALERTS_CACHE_DIRECTORY) + self._stacks_dir = os.path.join(self.cache_dir, FileCache.STACKS_CACHE_DIRECTORY) + self._common_services_dir = os.path.join(self.cache_dir, FileCache.COMMON_SERVICES_DIRECTORY) + self._extensions_dir = os.path.join(self.cache_dir, FileCache.EXTENSIONS_CACHE_DIRECTORY) + self._host_scripts_dir = os.path.join(self.cache_dir, FileCache.HOST_SCRIPTS_CACHE_DIRECTORY) def get(self, section, value, default=None): try: return str(self.config.get(section, value)).strip() - except ConfigParser.Error as err: + except configparser.Error as err: if default is not None: return default raise err @@ -143,7 +149,7 @@ def get_resolved_config(cls, home_dir=""): else: raise Exception("No config found at {0}, use default".format(configPath)) - except Exception, err: + except Exception as err: logger.warn(err) setattr(cls, "_conf_cache", config) return config @@ -200,27 +206,51 @@ def cache_dir(self): @property def cluster_cache_dir(self): - return os.path.join(self.cache_dir, FileCache.CLUSTER_CACHE_DIRECTORY) + return self._cluster_cache_dir + + @cluster_cache_dir.setter + def cluster_cache_dir(self, new_dir): + self._cluster_cache_dir = new_dir @property def alerts_cachedir(self): - return os.path.join(self.cache_dir, FileCache.ALERTS_CACHE_DIRECTORY) + return self._alerts_cachedir + + @alerts_cachedir.setter + def alerts_cachedir(self, new_dir): + self._alerts_cachedir = new_dir @property def stacks_dir(self): - return os.path.join(self.cache_dir, FileCache.STACKS_CACHE_DIRECTORY) + return self._stacks_dir + + @stacks_dir.setter + def stacks_dir(self, new_dir): + self._stacks_dir = new_dir @property def common_services_dir(self): - return os.path.join(self.cache_dir, FileCache.COMMON_SERVICES_DIRECTORY) + return self._common_services_dir + + @common_services_dir.setter + def common_services_dir(self, new_dir): + self._common_services_dir = new_dir @property def extensions_dir(self): - return os.path.join(self.cache_dir, FileCache.EXTENSIONS_CACHE_DIRECTORY) + return self._extensions_dir + + @extensions_dir.setter + def extensions_dir(self, new_dir): + self._extensions_dir = new_dir @property def host_scripts_dir(self): - return os.path.join(self.cache_dir, FileCache.HOST_SCRIPTS_CACHE_DIRECTORY) + return self._host_scripts_dir + + @host_scripts_dir.setter + def host_scripts_dir(self, new_dir): + self._host_scripts_dir = new_dir @property def command_file_retention_policy(self): @@ -307,7 +337,7 @@ def remove_option(self, section, option): return self.config.remove_option(section, option) def load(self, data): - self.config = ConfigParser.RawConfigParser(data) + self.config = configparser.RawConfigParser(data) def read(self, filename): self.config.read(filename) @@ -424,19 +454,19 @@ def isSameHostList(hostlist1, hostlist2): def updateConfigServerHostname(configFile, new_hosts): # update agent config file - agent_config = ConfigParser.ConfigParser() + agent_config = configparser.ConfigParser() agent_config.read(configFile) server_hosts = agent_config.get('server', 'hostname') if new_hosts is not None: - new_host_names = hostname.arrayFromCsvString(new_hosts) - if not isSameHostList(server_hosts, new_host_names): - print "Updating server hostname from " + server_hosts + " to " + new_hosts - agent_config.set('server', 'hostname', new_hosts) - with (open(configFile, "wb")) as new_agent_config: - agent_config.write(new_agent_config) + new_host_names = hostname.arrayFromCsvString(new_hosts) + if not isSameHostList(server_hosts, new_host_names): + print("Updating server hostname from " + server_hosts + " to " + new_hosts) + agent_config.set('server', 'hostname', new_hosts) + with (open(configFile, "w")) as new_agent_config: + agent_config.write(new_agent_config) def main(): - print AmbariConfig().config + print(AmbariConfig().config) if __name__ == "__main__": main() diff --git a/ambari-agent/src/main/python/ambari_agent/ClusterAlertDefinitionsCache.py b/ambari-agent/src/main/python/ambari_agent/ClusterAlertDefinitionsCache.py index 96e332f5848..287effbac97 100644 --- a/ambari-agent/src/main/python/ambari_agent/ClusterAlertDefinitionsCache.py +++ b/ambari-agent/src/main/python/ambari_agent/ClusterAlertDefinitionsCache.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one @@ -43,7 +43,7 @@ def __init__(self, cluster_cache_dir): def get_alert_definition_index_by_id(self, alert_dict, cluster_id, alert_id): definitions = alert_dict[cluster_id]['alertDefinitions'] - for i in xrange(len(definitions)): + for i in range(len(definitions)): if definitions[i]['definitionId'] == alert_id: return i @@ -67,7 +67,7 @@ def cache_update(self, cache_update, cache_hash): mutable_dict[cluster_id]['alertDefinitions'][index_of_alert] = alert_definition # for other non-definitions properties - for property, value in cache_update[cluster_id].iteritems(): + for property, value in cache_update[cluster_id].items(): if property == 'alertDefinitions': continue diff --git a/ambari-agent/src/main/python/ambari_agent/ClusterCache.py b/ambari-agent/src/main/python/ambari_agent/ClusterCache.py index ea3498dedd7..23f108fea1a 100644 --- a/ambari-agent/src/main/python/ambari_agent/ClusterCache.py +++ b/ambari-agent/src/main/python/ambari_agent/ClusterCache.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one @@ -80,7 +80,7 @@ def get_cluster_indepedent_data(self): return self[ClusterCache.COMMON_DATA_CLUSTER] def get_cluster_ids(self): - cluster_ids = self.keys()[:] + cluster_ids = list(self.keys())[:] if ClusterCache.COMMON_DATA_CLUSTER in cluster_ids: cluster_ids.remove(ClusterCache.COMMON_DATA_CLUSTER) return cluster_ids @@ -91,7 +91,7 @@ def rewrite_cache(self, cache, cache_hash): if not existing_cluster_id in cache: cache_ids_to_delete.append(existing_cluster_id) - for cluster_id, cluster_cache in cache.iteritems(): + for cluster_id, cluster_cache in cache.items(): self.rewrite_cluster_cache(cluster_id, cluster_cache) with self._cache_lock: diff --git a/ambari-agent/src/main/python/ambari_agent/ClusterConfigurationCache.py b/ambari-agent/src/main/python/ambari_agent/ClusterConfigurationCache.py index 677fff2b8e5..ace5e6a3b30 100644 --- a/ambari-agent/src/main/python/ambari_agent/ClusterConfigurationCache.py +++ b/ambari-agent/src/main/python/ambari_agent/ClusterConfigurationCache.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one diff --git a/ambari-agent/src/main/python/ambari_agent/ClusterHostLevelParamsCache.py b/ambari-agent/src/main/python/ambari_agent/ClusterHostLevelParamsCache.py index 3e490c5bbc2..ec537f27aeb 100644 --- a/ambari-agent/src/main/python/ambari_agent/ClusterHostLevelParamsCache.py +++ b/ambari-agent/src/main/python/ambari_agent/ClusterHostLevelParamsCache.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one diff --git a/ambari-agent/src/main/python/ambari_agent/ClusterMetadataCache.py b/ambari-agent/src/main/python/ambari_agent/ClusterMetadataCache.py index 6c9fc8effda..57e454db3b2 100644 --- a/ambari-agent/src/main/python/ambari_agent/ClusterMetadataCache.py +++ b/ambari-agent/src/main/python/ambari_agent/ClusterMetadataCache.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one @@ -52,7 +52,7 @@ def cache_delete(self, cache_update, cache_hash): mutable_dict = self._get_mutable_copy() clusters_ids_to_delete = [] - for cluster_id, cluster_updates_dict in cache_update.iteritems(): + for cluster_id, cluster_updates_dict in cache_update.items(): if cluster_updates_dict != {}: raise Exception("Deleting cluster subvalues is not supported") diff --git a/ambari-agent/src/main/python/ambari_agent/ClusterTopologyCache.py b/ambari-agent/src/main/python/ambari_agent/ClusterTopologyCache.py index 90987ca000b..75158a25de5 100644 --- a/ambari-agent/src/main/python/ambari_agent/ClusterTopologyCache.py +++ b/ambari-agent/src/main/python/ambari_agent/ClusterTopologyCache.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one @@ -62,7 +62,7 @@ def on_cache_update(self): hosts_to_id = defaultdict(lambda:{}) components_by_key = defaultdict(lambda:{}) - for cluster_id, cluster_topology in self.iteritems(): + for cluster_id, cluster_topology in self.items(): self.current_host_ids_to_cluster[cluster_id] = None if 'hosts' in cluster_topology: for host_dict in cluster_topology.hosts: @@ -76,7 +76,7 @@ def on_cache_update(self): key = "{0}/{1}".format(component_dict.serviceName, component_dict.componentName) components_by_key[cluster_id][key] = component_dict - for cluster_id, cluster_topology in self.iteritems(): + for cluster_id, cluster_topology in self.items(): self.cluster_local_components[cluster_id] = [] self.component_version_map[cluster_id] = defaultdict(lambda:defaultdict(lambda: {})) @@ -203,7 +203,7 @@ def cache_update(self, cache_update, cache_hash): """ mutable_dict = self._get_mutable_copy() - for cluster_id, cluster_updates_dict in cache_update.iteritems(): + for cluster_id, cluster_updates_dict in cache_update.items(): # adding a new cluster via UPDATE if not cluster_id in mutable_dict: mutable_dict[cluster_id] = cluster_updates_dict @@ -253,7 +253,7 @@ def cache_delete(self, cache_update, cache_hash): mutable_dict = self._get_mutable_copy() clusters_ids_to_delete = [] - for cluster_id, cluster_updates_dict in cache_update.iteritems(): + for cluster_id, cluster_updates_dict in cache_update.items(): if not cluster_id in mutable_dict: logger.error("Cannot do topology delete for cluster cluster_id={0}, because do not have information about the cluster".format(cluster_id)) continue diff --git a/ambari-agent/src/main/python/ambari_agent/CommandHooksOrchestrator.py b/ambari-agent/src/main/python/ambari_agent/CommandHooksOrchestrator.py index 9113d2b4526..41a21ea3482 100644 --- a/ambari-agent/src/main/python/ambari_agent/CommandHooksOrchestrator.py +++ b/ambari-agent/src/main/python/ambari_agent/CommandHooksOrchestrator.py @@ -19,8 +19,8 @@ import os import logging -from models.commands import AgentCommand -from models.hooks import HookPrefix +from ambari_agent.models.commands import AgentCommand +from ambari_agent.models.hooks import HookPrefix __all__ = ["ResolvedHooks", "HooksOrchestrator"] diff --git a/ambari-agent/src/main/python/ambari_agent/CommandStatusDict.py b/ambari-agent/src/main/python/ambari_agent/CommandStatusDict.py index 89d0a3daf7e..4c35bd8e6e0 100644 --- a/ambari-agent/src/main/python/ambari_agent/CommandStatusDict.py +++ b/ambari-agent/src/main/python/ambari_agent/CommandStatusDict.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -26,7 +26,7 @@ import ambari_simplejson as json from collections import defaultdict -from Grep import Grep +from ambari_agent.Grep import Grep from ambari_agent import Constants from ambari_agent.models.commands import CommandStatus, AgentCommand @@ -182,7 +182,7 @@ def generate_in_progress_report(self, command, report): files_to_read = [report['tmpout'], report['tmperr'], report['structuredOut']] files_content = ['...', '...', '{}'] - for i in xrange(len(files_to_read)): + for i in range(len(files_to_read)): filename = files_to_read[i] if os.path.exists(filename): with open(filename, 'r') as fp: diff --git a/ambari-agent/src/main/python/ambari_agent/CommandStatusReporter.py b/ambari-agent/src/main/python/ambari_agent/CommandStatusReporter.py index 129cf146928..f5b573fb5b8 100644 --- a/ambari-agent/src/main/python/ambari_agent/CommandStatusReporter.py +++ b/ambari-agent/src/main/python/ambari_agent/CommandStatusReporter.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one diff --git a/ambari-agent/src/main/python/ambari_agent/ComponentStatusExecutor.py b/ambari-agent/src/main/python/ambari_agent/ComponentStatusExecutor.py index 7bf00dfa899..b45aa6b3f79 100644 --- a/ambari-agent/src/main/python/ambari_agent/ComponentStatusExecutor.py +++ b/ambari-agent/src/main/python/ambari_agent/ComponentStatusExecutor.py @@ -135,7 +135,7 @@ def discard_stale_reports(self, cluster_reports): reports_to_discard = self.reports_to_discard[:] new_cluster_reports = defaultdict(lambda:[]) - for cluster_id, cluster_reports in cluster_reports.iteritems(): + for cluster_id, cluster_reports in cluster_reports.items(): for cluster_report in cluster_reports: for discarded_report in reports_to_discard: if Utils.are_dicts_equal(cluster_report, discarded_report, keys_to_skip=['status']): @@ -199,10 +199,10 @@ def force_send_component_statuses(self): cluster_reports = defaultdict(lambda:[]) with self.reported_component_status_lock: - for cluster_id, component_to_command_dict in self.reported_component_status.iteritems(): - for service_and_component_name, commands_status in component_to_command_dict.iteritems(): + for cluster_id, component_to_command_dict in self.reported_component_status.items(): + for service_and_component_name, commands_status in component_to_command_dict.items(): service_name, component_name = service_and_component_name.split("/") - for command_name, status in commands_status.iteritems(): + for command_name, status in commands_status.items(): report = { 'serviceName': service_name, 'componentName': component_name, @@ -224,7 +224,7 @@ def send_updates_to_server(self, cluster_reports): def save_reported_component_status(self, cluster_reports): with self.reported_component_status_lock: - for cluster_id, reports in cluster_reports.iteritems(): + for cluster_id, reports in cluster_reports.items(): for report in reports: component_name = report['componentName'] service_name = report['serviceName'] @@ -238,6 +238,6 @@ def clean_not_existing_clusters_info(self): This needs to be done to remove information about clusters which where deleted (e.g. ambari-server reset) """ with self.reported_component_status_lock: - for cluster_id in self.reported_component_status.keys(): + for cluster_id in list(self.reported_component_status.keys()): if cluster_id not in self.topology_cache.get_cluster_ids(): del self.reported_component_status[cluster_id] diff --git a/ambari-agent/src/main/python/ambari_agent/ConfigurationBuilder.py b/ambari-agent/src/main/python/ambari_agent/ConfigurationBuilder.py index 24cb2eab15b..af34ab7c6a8 100644 --- a/ambari-agent/src/main/python/ambari_agent/ConfigurationBuilder.py +++ b/ambari-agent/src/main/python/ambari_agent/ConfigurationBuilder.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -18,7 +18,7 @@ limitations under the License. ''' -import hostname +from ambari_agent import hostname class ConfigurationBuilder: diff --git a/ambari-agent/src/main/python/ambari_agent/Constants.py b/ambari-agent/src/main/python/ambari_agent/Constants.py index ef522e74200..987e764b8ae 100644 --- a/ambari-agent/src/main/python/ambari_agent/Constants.py +++ b/ambari-agent/src/main/python/ambari_agent/Constants.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one diff --git a/ambari-agent/src/main/python/ambari_agent/CustomServiceOrchestrator.py b/ambari-agent/src/main/python/ambari_agent/CustomServiceOrchestrator.py index 4443db37320..b76949fcc89 100644 --- a/ambari-agent/src/main/python/ambari_agent/CustomServiceOrchestrator.py +++ b/ambari-agent/src/main/python/ambari_agent/CustomServiceOrchestrator.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -20,15 +20,13 @@ import os - - import sys import uuid import logging import threading import ambari_simplejson as json from collections import defaultdict -from ConfigParser import NoOptionError +from configparser import NoOptionError from ambari_commons import shell from ambari_commons.constants import AGENT_TMP_DIR @@ -40,8 +38,9 @@ from ambari_agent.models.commands import AgentCommand from ambari_agent.Utils import Utils -from AgentException import AgentException -from PythonExecutor import PythonExecutor +from ambari_agent.AgentException import AgentException +from ambari_agent.PythonExecutor import PythonExecutor +import subprocess logger = logging.getLogger() @@ -287,7 +286,7 @@ def generateJceks(self, commandJson): else: commandJson['credentialStoreEnabled'] = "true" - for config_type, credentials in configtype_credentials.items(): + for config_type, credentials in list(configtype_credentials.items()): config = commandJson['configurations'][config_type] if 'role' in commandJson and commandJson['role']: roleName = commandJson['role'] @@ -306,8 +305,8 @@ def generateJceks(self, commandJson): cmd = (java_bin, '-cp', cs_lib_path, self.credential_shell_cmd, 'create', alias, '-value', protected_pwd, '-provider', provider_path) logger.info(cmd) - rmf_shell.checked_call(cmd) - os.chmod(file_path, 0644) # group and others should have read access so that the service user can read + cmd_result = subprocess.call(cmd) + os.chmod(file_path, 0o644) # group and others should have read access so that the service user can read # Add JCEKS provider path instead config[self.CREDENTIAL_PROVIDER_PROPERTY_NAME] = provider_path config[self.CREDENTIAL_STORE_CLASS_PATH_NAME] = cs_lib_path @@ -491,7 +490,7 @@ def command_canceled_reason(self, task_id): if task_id in self.commands_in_progress: logger.debug('Pop with taskId %s', task_id) pid = self.commands_in_progress.pop(task_id) - if not isinstance(pid, (int, long)): + if not isinstance(pid, int): reason = pid if reason: return "\nCommand aborted. Reason: '{0}'".format(reason) @@ -614,7 +613,7 @@ def decompress_cluster_host_info(self, cluster_host_info): racks = self.convert_mapped_range_to_list(racks) ipv4_addresses = self.convert_mapped_range_to_list(ipv4_addresses) - ping_ports = map(str, ping_ports) + ping_ports = list(map(str, ping_ports)) decompressed_map[self.PING_PORTS_KEY] = ping_ports decompressed_map[self.HOSTS_LIST_KEY] = hosts_list @@ -644,7 +643,7 @@ def convert_range_to_list(self, range_to_convert): if not range_bounds[0] or not range_bounds[1]: raise AgentException("Broken data in given range, expected - ""m-n"" or ""m"", got: " + str(r)) - result_list.extend(range(int(range_bounds[0]), int(range_bounds[1]) + 1)) + result_list.extend(list(range(int(range_bounds[0]), int(range_bounds[1]) + 1))) elif len(range_bounds) == 1: result_list.append((int(range_bounds[0]))) else: @@ -685,7 +684,7 @@ def convert_mapped_range_to_list(self, range_to_convert): index = int(range_indexes[0]) result_dict[index] = value if not value.isdigit() else int(value) - return dict(sorted(result_dict.items())).values() + return list(dict(sorted(result_dict.items())).values()) def conditionally_remove_command_file(self, command_json_path, command_result): """ diff --git a/ambari-agent/src/main/python/ambari_agent/DataCleaner.py b/ambari-agent/src/main/python/ambari_agent/DataCleaner.py index 9c3b2e1e9af..266eefb5fd2 100644 --- a/ambari-agent/src/main/python/ambari_agent/DataCleaner.py +++ b/ambari-agent/src/main/python/ambari_agent/DataCleaner.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -18,7 +18,7 @@ limitations under the License. ''' -import AmbariConfig +from ambari_agent import AmbariConfig import threading import os import time diff --git a/ambari-agent/src/main/python/ambari_agent/ExitHelper.py b/ambari-agent/src/main/python/ambari_agent/ExitHelper.py index e61ccc4f9c9..bf3b7991439 100644 --- a/ambari-agent/src/main/python/ambari_agent/ExitHelper.py +++ b/ambari-agent/src/main/python/ambari_agent/ExitHelper.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -35,7 +35,7 @@ def __call__(cls, *args, **kwargs): return cls._instances[cls] -class ExitHelper(object): +class ExitHelper(object, metaclass=_singleton): """ Class to cleanup resources before exiting. Replacement for atexit module. sys.exit(code) works only from threads and os._exit(code) will ignore atexit and cleanup will be ignored. @@ -43,7 +43,6 @@ class ExitHelper(object): WARNING: always import as `ambari_agent.ExitHelper import ExitHelper`, otherwise it will be imported twice and nothing will work as expected. """ - __metaclass__ = _singleton def __init__(self): self.exit_functions = [] @@ -74,10 +73,10 @@ def exit(self): if __name__ == '__main__': def func1(): - print "1" + print("1") def func2(): - print "2" + print("2") ExitHelper().register(func1) ExitHelper().register(func2) diff --git a/ambari-agent/src/main/python/ambari_agent/Facter.py b/ambari-agent/src/main/python/ambari_agent/Facter.py index 366160d9c3d..c83cb79461d 100644 --- a/ambari-agent/src/main/python/ambari_agent/Facter.py +++ b/ambari-agent/src/main/python/ambari_agent/Facter.py @@ -22,18 +22,18 @@ import os import getpass import platform -import hostname +from ambari_agent import hostname import re import shlex import socket import multiprocessing -from ambari_commons import subprocess32 +import subprocess from ambari_commons.shell import shellRunner import time import uuid import json import glob -from AmbariConfig import AmbariConfig +from ambari_agent.AmbariConfig import AmbariConfig from ambari_commons import OSCheck, OSConst from ambari_commons.os_family_impl import OsFamilyImpl @@ -42,11 +42,12 @@ def run_os_command(cmd): shell = (type(cmd) == str) - process = subprocess32.Popen(cmd, + process = subprocess.Popen(cmd, shell=shell, - stdout=subprocess32.PIPE, - stdin=subprocess32.PIPE, - stderr=subprocess32.PIPE + stdout=subprocess.PIPE, + stdin=subprocess.PIPE, + stderr=subprocess.PIPE, + universal_newlines=True ) (stdoutdata, stderrdata) = process.communicate() return process.returncode, stdoutdata, stderrdata @@ -72,7 +73,7 @@ def resolve_ambari_config(self): else: raise Exception("No config found, use default") - except Exception, err: + except Exception as err: log.warn(err) return config @@ -146,7 +147,7 @@ def getKernelMajVersion(self): def getMacAddress(self): mac = uuid.getnode() if uuid.getnode() == mac: - mac = ':'.join('%02X' % ((mac >> 8 * i) & 0xff) for i in reversed(xrange(6))) + mac = ':'.join('%02X' % ((mac >> 8 * i) & 0xff) for i in reversed(list(range(6)))) else: mac = 'UNKNOWN' return mac @@ -158,11 +159,11 @@ def getOsFamily(self): # Return uptime hours def getUptimeHours(self): - return self.getUptimeSeconds() / (60 * 60) + return self.getUptimeSeconds() // (60 * 60) # Return uptime days def getUptimeDays(self): - return self.getUptimeSeconds() / (60 * 60 * 24) + return self.getUptimeSeconds() // (60 * 60 * 24) def getSystemResourceIfExists(self, systemResources, key, default): if key in systemResources: @@ -259,12 +260,12 @@ def facterInfo(self): #Convert kB to GB @staticmethod def convertSizeKbToGb(size): - return "%0.2f GB" % round(float(size) / (1024.0 * 1024.0), 2) + return "%0.2f GB" % round(float(size) // (1024.0 * 1024.0), 2) #Convert MB to GB @staticmethod def convertSizeMbToGb(size): - return "%0.2f GB" % round(float(size) / (1024.0), 2) + return "%0.2f GB" % round(float(size) // (1024.0), 2) @OsFamilyImpl(os_family=OSConst.WINSRV_FAMILY) class FacterWindows(Facter): @@ -456,7 +457,10 @@ def return_first_words_from_list(self, list): result = "" for i in list: if i.strip(): - result = result + i.split()[0].strip() + "," + value = i.split()[0] + if isinstance(value, bytes): + value = value.decode('utf-8') + result = result + value.strip() + "," result = FacterLinux.FIRST_WORDS_REGEXP.sub("", result) return result @@ -469,7 +473,7 @@ def return_ifnames_from_ip_link(self, ip_link_output): return ",".join(list) def data_return_first(self, patern, data): - full_list = patern.findall(data) + full_list = patern.findall(str(data)) result = "" if full_list: result = full_list[0] @@ -484,10 +488,10 @@ def getNetmask(self): for ifname in self.getInterfaces().split(","): if ifname.strip(): - ip_address_by_ifname = self.get_ip_address_by_ifname(ifname) + ip_address_by_ifname = self.get_ip_address_by_ifname(ifname.replace("\'","").encode()) if ip_address_by_ifname is not None: if primary_ip == ip_address_by_ifname.strip(): - return socket.inet_ntoa(fcntl.ioctl(socket.socket(socket.AF_INET, socket.SOCK_DGRAM), 35099, struct.pack('256s', ifname))[20:24]) + return socket.inet_ntoa(fcntl.ioctl(socket.socket(socket.AF_INET, socket.SOCK_DGRAM), 35099, struct.pack('256s', ifname.encode('utf-8')))[20:24]) return None @@ -503,7 +507,7 @@ def get_ip_address_by_ifname(self, ifname): 0x8915, # SIOCGIFADDR struct.pack('256s', ifname[:15]) )[20:24]) - except Exception, err: + except Exception as err: log.warn("Can't get the IP address for {0}".format(ifname)) return ip_address_by_ifname @@ -590,7 +594,7 @@ def facterInfo(self): def main(argv=None): config = None - print Facter(config).facterInfo() + print(Facter(config).facterInfo()) if __name__ == '__main__': diff --git a/ambari-agent/src/main/python/ambari_agent/FileCache.py b/ambari-agent/src/main/python/ambari_agent/FileCache.py index 9e1c7af2274..7c4ca8a0a6a 100644 --- a/ambari-agent/src/main/python/ambari_agent/FileCache.py +++ b/ambari-agent/src/main/python/ambari_agent/FileCache.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -17,14 +17,13 @@ See the License for the specific language governing permissions and limitations under the License. ''' -import StringIO +import io import logging import os import shutil import zipfile -import urllib2 -import urllib +import urllib.request, urllib.error, urllib.parse import time import threading @@ -134,7 +133,7 @@ def get_host_scripts_base_dir(self, command): self.get_server_url_prefix(command)) def auto_cache_update_enabled(self): - from AmbariConfig import AmbariConfig + from ambari_agent.AmbariConfig import AmbariConfig if self.config and \ self.config.has_option(AmbariConfig.AMBARI_PROPERTIES_CATEGORY, FileCache.ENABLE_AUTO_AGENT_CACHE_UPDATE_KEY) and \ self.config.get(AmbariConfig.AMBARI_PROPERTIES_CATEGORY, FileCache.ENABLE_AUTO_AGENT_CACHE_UPDATE_KEY).lower() == "false": @@ -219,7 +218,7 @@ def build_download_url(self, server_url_prefix, directory, filename): filename - file inside directory we are trying to fetch """ return "{0}/{1}/{2}".format(server_url_prefix, - urllib.pathname2url(directory), filename) + urllib.request.pathname2url(directory), filename) def fetch_url(self, url): """ @@ -228,9 +227,9 @@ def fetch_url(self, url): """ logger.debug("Trying to download {0}".format(url)) try: - memory_buffer = StringIO.StringIO() - proxy_handler = urllib2.ProxyHandler({}) - opener = urllib2.build_opener(proxy_handler) + memory_buffer = io.BytesIO() + proxy_handler = urllib.request.ProxyHandler({}) + opener = urllib.request.build_opener(proxy_handler) u = opener.open(url, timeout=self.SOCKET_TIMEOUT) logger.debug("Connected with {0} with code {1}".format(u.geturl(), u.getcode())) @@ -251,7 +250,7 @@ def read_hash_sum(self, directory): """ hash_file = os.path.join(directory, self.HASH_SUM_FILE) try: - with open(hash_file) as fh: + with open(hash_file,'rb') as fh: return fh.readline().strip() except: return None @@ -263,7 +262,7 @@ def write_hash_sum(self, directory, new_hash): """ hash_file = os.path.join(directory, self.HASH_SUM_FILE) try: - with open(hash_file, "w") as fh: + with open(hash_file, "wb") as fh: fh.write(new_hash) os.chmod(hash_file, 0o644) except Exception as err: diff --git a/ambari-agent/src/main/python/ambari_agent/Hardware.py b/ambari-agent/src/main/python/ambari_agent/Hardware.py index b5adb6c9916..036596897d0 100644 --- a/ambari-agent/src/main/python/ambari_agent/Hardware.py +++ b/ambari-agent/src/main/python/ambari_agent/Hardware.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one @@ -20,15 +20,15 @@ import os.path import logging -from ambari_commons import subprocess32 +import subprocess from resource_management.core import shell from resource_management.core.shell import call from resource_management.core.exceptions import ExecuteTimeoutException, Fail from ambari_commons.shell import shellRunner -from Facter import Facter +from ambari_agent.Facter import Facter from ambari_commons.os_check import OSConst from ambari_commons.os_family_impl import OsFamilyFuncImpl, OsFamilyImpl -from AmbariConfig import AmbariConfig +from ambari_agent.AmbariConfig import AmbariConfig from resource_management.core.sudo import path_isfile logger = logging.getLogger() @@ -89,7 +89,7 @@ def _parse_df(self, lines): if len(line_split) != 7: continue - yield dict(zip(titles, line_split)) + yield dict(list(zip(titles, line_split))) def _get_mount_check_timeout(self): """Return timeout for df call command""" @@ -156,7 +156,7 @@ def osdisks(self): command.append("-l") try: - code, out, err = shell.call(command, stdout=subprocess32.PIPE, stderr=subprocess32.PIPE, timeout=int(timeout), quiet=True) + code, out, err = shell.call(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, timeout=int(timeout), quiet=True) dfdata = out except Exception as ex: logger.warn("Checking disk usage failed: " + str(ex)) @@ -246,7 +246,7 @@ def main(): from resource_management.core.logger import Logger Logger.initialize_logger() - print Hardware().get() + print(Hardware().get()) if __name__ == '__main__': diff --git a/ambari-agent/src/main/python/ambari_agent/HeartbeatHandlers.py b/ambari-agent/src/main/python/ambari_agent/HeartbeatHandlers.py index fefe32aca78..c1ef1bafc2f 100644 --- a/ambari-agent/src/main/python/ambari_agent/HeartbeatHandlers.py +++ b/ambari-agent/src/main/python/ambari_agent/HeartbeatHandlers.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one diff --git a/ambari-agent/src/main/python/ambari_agent/HeartbeatThread.py b/ambari-agent/src/main/python/ambari_agent/HeartbeatThread.py index 4fbefdb06ac..60b8ab5f04b 100644 --- a/ambari-agent/src/main/python/ambari_agent/HeartbeatThread.py +++ b/ambari-agent/src/main/python/ambari_agent/HeartbeatThread.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one diff --git a/ambari-agent/src/main/python/ambari_agent/HostCheckReportFileHandler.py b/ambari-agent/src/main/python/ambari_agent/HostCheckReportFileHandler.py index bf2e00fe060..fef2d0521d4 100644 --- a/ambari-agent/src/main/python/ambari_agent/HostCheckReportFileHandler.py +++ b/ambari-agent/src/main/python/ambari_agent/HostCheckReportFileHandler.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one @@ -23,8 +23,8 @@ import logging import re import traceback -from AmbariConfig import AmbariConfig -import ConfigParser +from ambari_agent.AmbariConfig import AmbariConfig +import configparser HADOOP_ROOT_DIR = "/usr/hdp" HADOOP_PERM_REMOVE_LIST = ["current"] @@ -43,8 +43,8 @@ def __init__(self, config=None): config = self.resolve_ambari_config() hostCheckFileDir = config.get('agent', 'prefix') - self.hostCheckFilePath = os.path.join(hostCheckFileDir, self.HOST_CHECK_FILE) - self.hostCheckCustomActionsFilePath = os.path.join(hostCheckFileDir, self.HOST_CHECK_CUSTOM_ACTIONS_FILE) + self.hostCheckFilePath = os.path.join(str(hostCheckFileDir), self.HOST_CHECK_FILE) + self.hostCheckCustomActionsFilePath = os.path.join(str(hostCheckFileDir), self.HOST_CHECK_CUSTOM_ACTIONS_FILE) def resolve_ambari_config(self): try: @@ -54,7 +54,7 @@ def resolve_ambari_config(self): else: raise Exception("No config found, use default") - except Exception, err: + except Exception as err: logger.warn(err) return config @@ -64,7 +64,7 @@ def writeHostChecksCustomActionsFile(self, structuredOutput): try: logger.info("Host check custom action report at " + self.hostCheckCustomActionsFilePath) - config = ConfigParser.RawConfigParser() + config = configparser.RawConfigParser() config.add_section('metadata') config.set('metadata', 'created', str(datetime.datetime.now())) @@ -81,9 +81,9 @@ def writeHostChecksCustomActionsFile(self, structuredOutput): self.removeFile(self.hostCheckCustomActionsFilePath) self.touchFile(self.hostCheckCustomActionsFilePath) - with open(self.hostCheckCustomActionsFilePath, 'wb') as configfile: + with open(self.hostCheckCustomActionsFilePath, 'wt') as configfile: config.write(configfile) - except Exception, err: + except Exception as err: logger.error("Can't write host check file at %s :%s " % (self.hostCheckCustomActionsFilePath, err.message)) traceback.print_exc() @@ -123,7 +123,7 @@ def writeHostCheckFile(self, hostInfo): try: logger.debug("Host check report at " + self.hostCheckFilePath) - config = ConfigParser.RawConfigParser() + config = configparser.RawConfigParser() config.add_section('metadata') config.set('metadata', 'created', str(datetime.datetime.now())) @@ -165,9 +165,9 @@ def writeHostCheckFile(self, hostInfo): self.removeFile(self.hostCheckFilePath) self.touchFile(self.hostCheckFilePath) - with open(self.hostCheckFilePath, 'wb') as configfile: + with open(self.hostCheckFilePath, 'wt') as configfile: config.write(configfile) - except Exception, err: + except Exception as err: logger.error("Can't write host check file at %s :%s " % (self.hostCheckFilePath, err.message)) traceback.print_exc() diff --git a/ambari-agent/src/main/python/ambari_agent/HostCleanup.py b/ambari-agent/src/main/python/ambari_agent/HostCleanup.py index 8e9273c4a8e..1103fcc7ce2 100644 --- a/ambari-agent/src/main/python/ambari_agent/HostCleanup.py +++ b/ambari-agent/src/main/python/ambari_agent/HostCleanup.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -25,12 +25,12 @@ import os import string -from ambari_commons import subprocess32 +import subprocess import logging import shutil import platform import fnmatch -import ConfigParser +import configparser import optparse import shlex import datetime @@ -38,7 +38,7 @@ import glob import pwd import re -from AmbariConfig import AmbariConfig +from ambari_agent.AmbariConfig import AmbariConfig from ambari_commons.constants import AGENT_TMP_DIR from ambari_commons import OSCheck, OSConst from ambari_commons.constants import AMBARI_SUDO_BINARY @@ -115,7 +115,7 @@ def resolve_ambari_config(self): else: raise Exception("No config found, use default") - except Exception, err: + except Exception as err: logger.warn(err) return config @@ -126,7 +126,7 @@ def get_additional_dirs(self): dirList.add(os.path.dirname(patern)) for folder in dirList: - for dirs in os.walk(folder): + for dirs in repr(os.walk(folder)): for dir in dirs: for patern in DIRNAME_PATTERNS: if patern in dir: @@ -192,14 +192,14 @@ def read_host_check_file(self, config_file_path): try: with open(config_file_path, 'r'): pass - except Exception, e: + except Exception as e: logger.error("Host check result not found at: " + str(config_file_path)) return None try: - config = ConfigParser.RawConfigParser() + config = configparser.RawConfigParser() config.read(config_file_path) - except Exception, e: + except Exception as e: logger.error("Cannot read host check result: " + str(e)) return None @@ -267,8 +267,8 @@ def get_alternatives_desc(self, alt_name): command = ALT_DISP_CMD.format(alt_name) out = None try: - p1 = subprocess32.Popen(shlex.split(command), stdout=subprocess32.PIPE) - p2 = subprocess32.Popen(["grep", "priority"], stdin=p1.stdout, stdout=subprocess32.PIPE) + p1 = subprocess.Popen(shlex.split(command), stdout=subprocess.PIPE) + p2 = subprocess.Popen(["grep", "priority"], stdin=p1.stdout, stdout=subprocess.PIPE, universal_newlines=True) p1.stdout.close() out = p2.communicate()[0] logger.debug('alternatives --display ' + alt_name + '\n, out = ' + out) @@ -571,10 +571,11 @@ def run_os_command(self, cmd, runWithSudo=True): logger.info('Executing command: ' + str(cmd)) if type(cmd) == str: cmd = shlex.split(cmd) - process = subprocess32.Popen(cmd, - stdout=subprocess32.PIPE, - stdin=subprocess32.PIPE, - stderr=subprocess32.PIPE + process = subprocess.Popen(cmd, + stdout=subprocess.PIPE, + stdin=subprocess.PIPE, + stderr=subprocess.PIPE, + universal_newlines=True ) (stdoutdata, stderrdata) = process.communicate() return process.returncode, stdoutdata, stderrdata @@ -599,7 +600,7 @@ def backup_file(filePath): format = '%Y%m%d%H%M%S' try: shutil.copyfile(filePath, filePath + "." + timestamp.strftime(format)) - except (Exception), e: + except (Exception) as e: logger.warn('Could not backup file "%s": %s' % (str(filePath, e))) return 0 @@ -611,7 +612,7 @@ def get_YN_input(prompt, default): def get_choice_string_input(prompt, default, firstChoice, secondChoice): - choice = raw_input(prompt).lower() + choice = input(prompt).lower() if choice in firstChoice: return True elif choice in secondChoice: @@ -619,7 +620,7 @@ def get_choice_string_input(prompt, default, firstChoice, secondChoice): elif choice is "": # Just enter pressed return default else: - print "input not recognized, please try again: " + print("input not recognized, please try again: ") return get_choice_string_input(prompt, default, firstChoice, secondChoice) pass @@ -680,7 +681,7 @@ def main(): delete_users = get_YN_input('You have elected to remove all users as well. If it is not intended then use ' 'option --skip \"users\". Do you want to continue [y/n] (y)', True) if not delete_users: - print 'Exiting. Use option --skip="users" to skip deleting users' + print('Exiting. Use option --skip="users" to skip deleting users') sys.exit(1) hostcheckfile, hostcheckfileca = options.inputfiles.split(",") @@ -688,7 +689,7 @@ def main(): # Manage non UI install if not os.path.exists(hostcheckfileca): if options.silent: - print 'Host Check results not found. There is no {0}. Running host checks.'.format(hostcheckfileca) + print('Host Check results not found. There is no {0}. Running host checks.'.format(hostcheckfileca)) h.run_check_hosts() else: run_check_hosts_input = get_YN_input('Host Check results not found. There is no {0}. Do you want to run host checks [y/n] (y)'.format(hostcheckfileca), True) @@ -709,7 +710,7 @@ def main(): if os.path.exists(config.get('agent', 'cache_dir')): h.do_clear_cache(config.get('agent', 'cache_dir')) - logger.info('Clean-up completed. The output is at %s' % (str(options.outputfile))) + logging.info('Clean-up completed. The output is at %s' % (str(options.outputfile))) if __name__ == '__main__': diff --git a/ambari-agent/src/main/python/ambari_agent/HostInfo.py b/ambari-agent/src/main/python/ambari_agent/HostInfo.py index 27329d095dd..6be2805c426 100644 --- a/ambari-agent/src/main/python/ambari_agent/HostInfo.py +++ b/ambari-agent/src/main/python/ambari_agent/HostInfo.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -25,7 +25,7 @@ import re import shlex import socket -from ambari_commons import subprocess32 +import subprocess import time from ambari_commons import OSCheck, OSConst @@ -34,9 +34,9 @@ from resource_management.core import shell from ambari_agent.HostCheckReportFileHandler import HostCheckReportFileHandler -from AmbariConfig import AmbariConfig +from ambari_agent.AmbariConfig import AmbariConfig from resource_management.core.resources.jcepolicyinfo import JcePolicyInfo -import Hardware +from ambari_agent import Hardware logger = logging.getLogger() @@ -108,7 +108,7 @@ def checkLiveServices(self, services, result): svcCheckResult['desc'] = err else: svcCheckResult['status'] = "Healthy" - except Exception, e: + except Exception as e: svcCheckResult['status'] = "Unhealthy" svcCheckResult['desc'] = repr(e) result.append(svcCheckResult) @@ -247,7 +247,7 @@ def javaProcs(self, list): pids = [pid for pid in os.listdir('/proc') if pid.isdigit()] for pid in pids: try: - fp = open(os.path.join('/proc', pid, 'cmdline'), 'rb') + fp = open(os.path.join('/proc', pid, 'cmdline'), 'r') except IOError: continue # avoid race condition if this process already died, since the moment we got pids list. @@ -377,7 +377,8 @@ def getServiceStatus(self, service_name): service_check_live = list(self.SERVICE_STATUS_CMD_LIST) service_check_live[1] = service_name try: - code, out, err = shell.call(service_check_live, stdout = subprocess32.PIPE, stderr = subprocess32.PIPE, timeout = 5, quiet = True) + code, out, err = shell.call(service_check_live, stdout = subprocess.PIPE, stderr = subprocess.PIPE, + timeout = 5, quiet = True, universal_newlines=True) return out, err, code except Exception as ex: logger.warn("Checking service {0} status failed".format(service_name)) @@ -398,7 +399,7 @@ class HostInfoWindows(HostInfo): def checkUsers(self, user_mask, results): get_users_cmd = ["powershell", '-noProfile', '-NonInteractive', '-nologo', "-Command", self.GET_USERS_CMD.format(user_mask)] try: - osStat = subprocess32.Popen(get_users_cmd, stdout=subprocess32.PIPE, stderr=subprocess32.PIPE) + osStat = subprocess.Popen(get_users_cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True) out, err = osStat.communicate() except: raise Exception("Failed to get users.") @@ -483,7 +484,7 @@ def main(argv=None): h = HostInfo() struct = {} h.register(struct) - print struct + print(struct) if __name__ == '__main__': diff --git a/ambari-agent/src/main/python/ambari_agent/InitializerModule.py b/ambari-agent/src/main/python/ambari_agent/InitializerModule.py index c5d9beeef09..18b0d8faa9c 100644 --- a/ambari-agent/src/main/python/ambari_agent/InitializerModule.py +++ b/ambari-agent/src/main/python/ambari_agent/InitializerModule.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one diff --git a/ambari-agent/src/main/python/ambari_agent/LiveStatus.py b/ambari-agent/src/main/python/ambari_agent/LiveStatus.py index 2809faac596..0f28b666d12 100644 --- a/ambari-agent/src/main/python/ambari_agent/LiveStatus.py +++ b/ambari-agent/src/main/python/ambari_agent/LiveStatus.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one @@ -19,7 +19,7 @@ """ import logging -from ActualConfigHandler import ActualConfigHandler +from ambari_agent.ActualConfigHandler import ActualConfigHandler class LiveStatus: diff --git a/ambari-agent/src/main/python/ambari_agent/NetUtil.py b/ambari-agent/src/main/python/ambari_agent/NetUtil.py index 9282535e125..2338a6cf842 100644 --- a/ambari-agent/src/main/python/ambari_agent/NetUtil.py +++ b/ambari-agent/src/main/python/ambari_agent/NetUtil.py @@ -14,9 +14,9 @@ # limitations under the License. -from urlparse import urlparse +from urllib.parse import urlparse import logging -import httplib +import http.client import ssl from ssl import SSLError from ambari_agent.AmbariConfig import AmbariConfig @@ -68,9 +68,9 @@ def checkURL(self, url): # hasattr being true means that current python version has default cert verification enabled. if hasattr(ssl, '_create_unverified_context') and not ssl_verify_cert: - ca_connection = httplib.HTTPSConnection(parsedurl[1], context=ssl._create_unverified_context()) + ca_connection = http.client.HTTPSConnection(parsedurl[1], context=ssl._create_unverified_context()) else: - ca_connection = httplib.HTTPSConnection(parsedurl[1]) + ca_connection = http.client.HTTPSConnection(parsedurl[1]) ca_connection.request("GET", parsedurl[2]) response = ca_connection.getresponse() @@ -88,7 +88,7 @@ def checkURL(self, url): logger.error(ERROR_SSL_WRONG_VERSION) return False, responseBody - except Exception, e: + except Exception as e: logger.warning("Failed to connect to " + str(url) + " due to " + str(e) + " ") return False, responseBody diff --git a/ambari-agent/src/main/python/ambari_agent/PingPortListener.py b/ambari-agent/src/main/python/ambari_agent/PingPortListener.py index e701c52163d..0ca87d179c8 100644 --- a/ambari-agent/src/main/python/ambari_agent/PingPortListener.py +++ b/ambari-agent/src/main/python/ambari_agent/PingPortListener.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -22,7 +22,7 @@ import logging import threading import socket -from ambari_commons import subprocess32 +import subprocess logger = logging.getLogger(__name__) FUSER_CMD = "timeout 10 fuser {0}/tcp 2>/dev/null | awk '{1}'" @@ -54,10 +54,11 @@ def __init__(self, config): def run_os_command_in_shell(self, command): - process = subprocess32.Popen(command, stdout=subprocess32.PIPE, - stdin=subprocess32.PIPE, - stderr=subprocess32.PIPE, - shell=True) + process = subprocess.Popen(command, stdout=subprocess.PIPE, + stdin=subprocess.PIPE, + stderr=subprocess.PIPE, + shell=True, + universal_newlines=True) return process.communicate() def __del__(self): diff --git a/ambari-agent/src/main/python/ambari_agent/PythonExecutor.py b/ambari-agent/src/main/python/ambari_agent/PythonExecutor.py index 73088ce457f..b58aaa24199 100644 --- a/ambari-agent/src/main/python/ambari_agent/PythonExecutor.py +++ b/ambari-agent/src/main/python/ambari_agent/PythonExecutor.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one @@ -26,11 +26,11 @@ import ambari_simplejson as json -from ambari_commons import subprocess32 +import subprocess from ambari_commons import shell -from Grep import Grep -from BackgroundCommandExecutionHandle import BackgroundCommandExecutionHandle +from ambari_agent.Grep import Grep +from ambari_agent.BackgroundCommandExecutionHandle import BackgroundCommandExecutionHandle from resource_management.libraries.functions.log_process_information import log_process_information @@ -51,7 +51,7 @@ def __init__(self, tmp_dir, config): self.config = config self.log_max_symbols_size = self.config.log_max_symbols_size - def open_subprocess32_files(self, tmp_out_file, tmp_err_file, override_output_files, backup_log_files=True): + def open_subprocess_files(self, tmp_out_file, tmp_err_file, override_output_files, backup_log_files=True): mode = "w" if override_output_files else "a" if override_output_files and backup_log_files: @@ -76,8 +76,8 @@ def run_file(self, script, script_params, tmp_out_file, tmp_err_file, override_output_files=True, backup_log_files=True, handle=None, log_info_on_failure=True): """ - Executes the specified python file in a separate subprocess32. - Method returns only when the subprocess32 is finished. + Executes the specified python file in a separate subprocess. + Method returns only when the subprocess is finished. Params arg is a list of script parameters Timeout meaning: how many seconds should pass before script execution is forcibly terminated @@ -91,10 +91,10 @@ def run_file(self, script, script_params, tmp_out_file, tmp_err_file, def background_executor(): logger = logging.getLogger() - process_out, process_err = self.open_subprocess32_files(tmp_out_file, tmp_err_file, True) + process_out, process_err = self.open_subprocess_files(tmp_out_file, tmp_err_file, True) logger.debug("Starting process command %s", python_command) - p = self.launch_python_subprocess32(python_command, process_out, process_err) + p = self.launch_python_subprocess(python_command, process_out, process_err) logger.debug("Process has been started. Pid = %s", p.pid) @@ -111,9 +111,9 @@ def background_executor(): logger.debug("Exiting from thread for holder pid %s", handle.pid) if handle is None: - tmpout, tmperr = self.open_subprocess32_files(tmp_out_file, tmp_err_file, override_output_files, backup_log_files) + tmpout, tmperr = self.open_subprocess_files(tmp_out_file, tmp_err_file, override_output_files, backup_log_files) - process = self.launch_python_subprocess32(python_command, tmpout, tmperr) + process = self.launch_python_subprocess(python_command, tmpout, tmperr) # map task_id to pid callback(task_id, process.pid) self.logger.debug("Launching watchdog thread") @@ -171,13 +171,13 @@ def read_result_from_files(self, out_path, err_path, structured_out_path): structured_out = {} return out, error, structured_out - def launch_python_subprocess32(self, command, tmpout, tmperr): + def launch_python_subprocess(self, command, tmpout, tmperr): """ - Creates subprocess32 with given parameters. This functionality was moved to separate method + Creates subprocess with given parameters. This functionality was moved to separate method to make possible unit testing """ command_env = dict(os.environ) - return subprocess32.Popen(command, stdout=tmpout, stderr=tmperr, close_fds=True, env=command_env, + return subprocess.Popen(command, stdout=tmpout, stderr=tmperr, close_fds=True, env=command_env, preexec_fn=lambda: os.setpgid(0, 0)) def is_successful(self, return_code): diff --git a/ambari-agent/src/main/python/ambari_agent/RecoveryManager.py b/ambari-agent/src/main/python/ambari_agent/RecoveryManager.py index 48423538213..e07d1b617d1 100644 --- a/ambari-agent/src/main/python/ambari_agent/RecoveryManager.py +++ b/ambari-agent/src/main/python/ambari_agent/RecoveryManager.py @@ -105,11 +105,11 @@ def __init__(self, initializer_module, recovery_enabled=False, auto_start_only=F # FIXME: Recovery manager does not support multiple clusters as of now. if len(self.initializer_module.configurations_cache): - self.cluster_id = self.initializer_module.configurations_cache.keys()[0] + self.cluster_id = list(self.initializer_module.configurations_cache.keys())[0] self.on_config_update() if len(self.initializer_module.host_level_params_cache): - self.cluster_id = self.initializer_module.host_level_params_cache.keys()[0] + self.cluster_id = list(self.initializer_module.host_level_params_cache.keys())[0] self.update_recovery_config(self.host_level_params_cache[self.cluster_id]) def on_execution_command_start(self): diff --git a/ambari-agent/src/main/python/ambari_agent/Register.py b/ambari-agent/src/main/python/ambari_agent/Register.py index cf63b5d6d13..74c56e51674 100644 --- a/ambari-agent/src/main/python/ambari_agent/Register.py +++ b/ambari-agent/src/main/python/ambari_agent/Register.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one diff --git a/ambari-agent/src/main/python/ambari_agent/RemoteDebugUtils.py b/ambari-agent/src/main/python/ambari_agent/RemoteDebugUtils.py index ae997acf621..1e81d465dcf 100644 --- a/ambari-agent/src/main/python/ambari_agent/RemoteDebugUtils.py +++ b/ambari-agent/src/main/python/ambari_agent/RemoteDebugUtils.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -21,14 +21,14 @@ try: import readline # For readline input support except: pass -import sys, signal, os, traceback, codeop, cStringIO, cPickle, tempfile +import sys, signal, os, traceback, codeop, io, pickle, tempfile def bind_debug_signal_handlers(): signal.signal(signal.SIGUSR1, print_threads_stack_traces) # prints process threads current stack trace to the err stream. (can be found in ambari-agent.out) signal.signal(signal.SIGUSR2, remote_debug) # provide a read-only python shell, which represent the process state at time of signal arrival. def print_threads_stack_traces(sig, frame): - print >> sys.stderr, "\n*** STACKTRACE - START ***\n" + print("\n*** STACKTRACE - START ***\n", file=sys.stderr) code = [] for threadId, stack in sys._current_frames().items(): code.append("\n# ThreadID: %s" % threadId) @@ -39,15 +39,15 @@ def print_threads_stack_traces(sig, frame): code.append(" %s" % (line.strip())) for line in code: - print >> sys.stderr, line - print >> sys.stderr, "\n*** STACKTRACE - END ***\n" + print(line, file=sys.stderr) + print("\n*** STACKTRACE - END ***\n", file=sys.stderr) def pipename(pid): """Return name of pipe to use""" return os.path.join(tempfile.gettempdir(), 'debug-%d' % pid) class NamedPipe(object): - def __init__(self, name, end=0, mode=0666): + def __init__(self, name, end=0, mode=0o666): """Open a pair of pipes, name.in and name.out for communication with another process. One process should pass 1 for end, and the other 0. Data is marshalled with pickle.""" @@ -72,7 +72,7 @@ def is_open(self): def put(self,msg): if self.is_open(): - data = cPickle.dumps(msg,1) + data = pickle.dumps(msg,1) self.out.write("%d\n" % len(data)) self.out.write(data) self.out.flush() @@ -87,7 +87,7 @@ def get(self): l = int(txt) data=self.inp.read(l) if len(data) < l: self.inp.close() - return cPickle.loads(data) # Convert back to python object. + return pickle.loads(data) # Convert back to python object. def close(self): self.inp.close() @@ -129,16 +129,16 @@ def _raiseEx(ex): try: code = codeop.compile_command(txt) if code: - sys.stdout = cStringIO.StringIO() + sys.stdout = io.StringIO() sys.stderr = sys.stdout - exec code in globs,locs + exec(code, globs,locs) txt = '' pipe.put(sys.stdout.getvalue() + '>>> ') else: pipe.put('... ') except: txt='' # May be syntax err. - sys.stdout = cStringIO.StringIO() + sys.stdout = io.StringIO() sys.stderr = sys.stdout traceback.print_exc() pipe.put(sys.stdout.getvalue() + '>>> ') diff --git a/ambari-agent/src/main/python/ambari_agent/StaleAlertsMonitor.py b/ambari-agent/src/main/python/ambari_agent/StaleAlertsMonitor.py index b2053d3a6a7..2d4dde2baa6 100644 --- a/ambari-agent/src/main/python/ambari_agent/StaleAlertsMonitor.py +++ b/ambari-agent/src/main/python/ambari_agent/StaleAlertsMonitor.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with @@ -50,7 +50,7 @@ def get_stale_alerts(self): if not self.alert_definitions_cache: return [] - for cluster_id, command in self.alert_definitions_cache.iteritems(): + for cluster_id, command in self.alert_definitions_cache.items(): # the cluster has not yet initialized staleAlertsAlert if not 'staleIntervalMultiplier' in command: continue diff --git a/ambari-agent/src/main/python/ambari_agent/Utils.py b/ambari-agent/src/main/python/ambari_agent/Utils.py index 4bf6ddf51f0..61286e9c5e9 100644 --- a/ambari-agent/src/main/python/ambari_agent/Utils.py +++ b/ambari-agent/src/main/python/ambari_agent/Utils.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one @@ -91,7 +91,7 @@ def are_dicts_equal_one_way(d1, d2, keys_to_skip=[]): if k in keys_to_skip: #print "skipping " + str(k) continue - if not d2.has_key(k): + if k not in d2: #print "don't have key="+str(k) return False else: @@ -110,7 +110,7 @@ def update_nested(d, u): """ Update the dictionary 'd' and its sub-dictionaries with values of dictionary 'u' and its sub-dictionaries. """ - for k, v in u.iteritems(): + for k, v in u.items(): if isinstance(d, collections.Mapping): if isinstance(v, collections.Mapping): r = Utils.update_nested(d.get(k, {}), v) @@ -137,7 +137,7 @@ def get_mutable_copy(param): if isinstance(param, dict): mutable_dict = {} - for k, v in param.iteritems(): + for k, v in param.items(): mutable_dict[k] = Utils.get_mutable_copy(v) return mutable_dict @@ -172,7 +172,7 @@ def __init__(self, dictionary): Recursively turn dict to ImmutableDictionary """ if not isinstance(dictionary, ImmutableDictionary): - for k, v in dictionary.iteritems(): + for k, v in dictionary.items(): dictionary[k] = Utils.make_immutable(v) super(ImmutableDictionary, self).__init__(dictionary) diff --git a/ambari-agent/src/main/python/ambari_agent/__init__.py b/ambari-agent/src/main/python/ambari_agent/__init__.py index 15082eaeac2..0008ed22e63 100644 --- a/ambari-agent/src/main/python/ambari_agent/__init__.py +++ b/ambari-agent/src/main/python/ambari_agent/__init__.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -20,7 +20,6 @@ """ -from __future__ import generators __version__ = "0.1.0" __author__ = [ diff --git a/ambari-agent/src/main/python/ambari_agent/alerts/ams_alert.py b/ambari-agent/src/main/python/ambari_agent/alerts/ams_alert.py index 74511ed00fc..e670bbc5180 100644 --- a/ambari-agent/src/main/python/ambari_agent/alerts/ams_alert.py +++ b/ambari-agent/src/main/python/ambari_agent/alerts/ams_alert.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one @@ -17,12 +17,12 @@ See the License for the specific language governing permissions and limitations under the License. """ -import httplib +import http.client import imp import time -import urllib from alerts.metric_alert import MetricAlert, REALCODE_REGEXP +import urllib.request, urllib.parse, urllib.error import ambari_simplejson as json import logging import re @@ -118,18 +118,18 @@ def _load_metric(self, ssl, host, port, ams_metric): "precision": "seconds", "grouped": "true", } - encoded_get_metrics_parameters = urllib.urlencode(get_metrics_parameters) + encoded_get_metrics_parameters = urllib.parse.urlencode(get_metrics_parameters) url = AMS_METRICS_GET_URL % encoded_get_metrics_parameters try: # TODO Implement HTTPS support - conn = httplib.HTTPConnection(host, port, + conn = http.client.HTTPConnection(host, port, timeout=self.connection_timeout) conn.request("GET", url) response = conn.getresponse() data = response.read() - except Exception, exception: + except Exception as exception: if logger.isEnabledFor(logging.DEBUG): logger.exception("[Alert][{0}] Unable to retrieve metrics from AMS: {1}".format(self.get_name(), str(exception))) status = response.status if 'response' in vars() else None @@ -149,7 +149,7 @@ def _load_metric(self, ssl, host, port, ams_metric): json_is_valid = True try: data_json = json.loads(data) - except Exception, exception: + except Exception as exception: json_is_valid = False if logger.isEnabledFor(logging.DEBUG): logger.exception("[Alert][{0}] Convert response to json failed or json doesn't contain needed data: {1}". @@ -216,13 +216,13 @@ def __init__(self, metric_info): self.custom_value_module = imp.new_module(str(uuid.uuid4())) code = self.DYNAMIC_CODE_VALUE_TEMPLATE.format(realcode) - exec code in self.custom_value_module.__dict__ + exec(code, self.custom_value_module.__dict__) if 'compute' in metric_info: realcode = metric_info['compute'] self.custom_compute_module = imp.new_module(str(uuid.uuid4())) code = self.DYNAMIC_CODE_COMPUTE_TEMPLATE.format(realcode) - exec code in self.custom_compute_module.__dict__ + exec(code, self.custom_compute_module.__dict__) def calculate_value(self, args): diff --git a/ambari-agent/src/main/python/ambari_agent/alerts/base_alert.py b/ambari-agent/src/main/python/ambari_agent/alerts/base_alert.py index 5ed2d1f8667..75c0ed5a395 100644 --- a/ambari-agent/src/main/python/ambari_agent/alerts/base_alert.py +++ b/ambari-agent/src/main/python/ambari_agent/alerts/base_alert.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one @@ -53,7 +53,7 @@ def __init__(self, alert_meta, alert_source_meta, config): def interval(self): """ gets the defined interval this check should run """ - if not self.alert_meta.has_key('interval'): + if 'interval' not in self.alert_meta: return 1 else: interval = self.alert_meta['interval'] @@ -109,7 +109,7 @@ def _get_alert_meta_value_safely(self, meta_key): """ safe way to get a value when outputting result json. will not throw an exception """ - if self.alert_meta.has_key(meta_key): + if meta_key in self.alert_meta: return self.alert_meta[meta_key] else: return None @@ -156,7 +156,7 @@ def collect(self): data = {} data['name'] = self._get_alert_meta_value_safely('name') data['clusterId'] = self.cluster_id - data['timestamp'] = long(time.time() * 1000) + data['timestamp'] = int(time.time() * 1000) data['definitionId'] = self.get_definition_id() try: @@ -166,18 +166,18 @@ def collect(self): # flatten the array and then try formatting it try: data['text'] = res_base_text.format(*res[1]) - except ValueError, value_error: + except ValueError as value_error: logger.warn("[Alert][{0}] - {1}".format(self.get_name(), str(value_error))) # if there is a ValueError, it's probably because the text doesn't match the type of # positional arguemtns (ie {0:d} with a float) res_base_text = res_base_text.replace("d}", "s}") - data_as_strings = map(str, res[1]) + data_as_strings = list(map(str, res[1])) data['text'] = res_base_text.format(*data_as_strings) if logger.isEnabledFor(logging.DEBUG): logger.debug("[Alert][{0}] text = {1}".format(self.get_name(), data['text'])) - except Exception, exception: + except Exception as exception: logger.exception("[Alert][{0}] - The alert's data is not properly formatted".format(self.get_name())) # if there's a problem with getting the data returned from collect() then mark this @@ -256,7 +256,7 @@ def get_configuration_value(self, configurations, key): try: curr_dict = configurations - subdicts = filter(None, key.split('/')) + subdicts = [_f for _f in key.split('/') if _f] for layer_key in subdicts: curr_dict = curr_dict[layer_key] @@ -447,7 +447,7 @@ def _get_uri_from_ha_structure(self, alert_uri_lookup_keys, configurations): return None # convert dfs.ha.namenodes.{{ha-nameservice}} into dfs.ha.namenodes.c1ha - ha_nameservices = filter(None, ha_nameservice.split(',')) + ha_nameservices = [_f for _f in ha_nameservice.split(',') if _f] for nameservice in ha_nameservices: ha_alias_key_nameservice = ha_alias_key.replace(self.HA_NAMESERVICE_PARAM, nameservice) @@ -488,7 +488,7 @@ def _get_uri_from_ha_structure(self, alert_uri_lookup_keys, configurations): return None # for each alias, grab it and check to see if this host matches - for nameservice, aliases in ha_nameservice_aliases.iteritems(): + for nameservice, aliases in ha_nameservice_aliases.items(): for alias in aliases.split(','): # convert dfs.namenode.http-address.{{ha-nameservice}}.{{alias}} into diff --git a/ambari-agent/src/main/python/ambari_agent/alerts/collector.py b/ambari-agent/src/main/python/ambari_agent/alerts/collector.py index daac7ee7c83..68fd2dce4ee 100644 --- a/ambari-agent/src/main/python/ambari_agent/alerts/collector.py +++ b/ambari-agent/src/main/python/ambari_agent/alerts/collector.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one @@ -63,8 +63,8 @@ def remove_by_uuid(self, alert_uuid): """ self.__lock.acquire() try: - for cluster,alert_map in self.__buckets.iteritems(): - for alert_name in alert_map.keys(): + for cluster,alert_map in self.__buckets.items(): + for alert_name in list(alert_map.keys()): alert = alert_map[alert_name] if not 'uuid' in alert: @@ -85,8 +85,8 @@ def alerts(self): self.__lock.acquire() try: alerts = [] - for clustermap in self.__buckets.values()[:]: - alerts.extend(clustermap.values()) + for clustermap in list(self.__buckets.values())[:]: + alerts.extend(list(clustermap.values())) self.__buckets.clear() return alerts diff --git a/ambari-agent/src/main/python/ambari_agent/alerts/metric_alert.py b/ambari-agent/src/main/python/ambari_agent/alerts/metric_alert.py index cd9350ab792..d122d067ac0 100644 --- a/ambari-agent/src/main/python/ambari_agent/alerts/metric_alert.py +++ b/ambari-agent/src/main/python/ambari_agent/alerts/metric_alert.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one @@ -22,7 +22,7 @@ import ambari_simplejson as json import logging import re -import urllib2 +import urllib.request, urllib.error, urllib.parse import uuid from tempfile import gettempdir @@ -66,7 +66,7 @@ def __init__(self, alert_meta, alert_source_meta, config): self.curl_connection_timeout = int(connection_timeout) # will force a kinit even if klist says there are valid tickets (4 hour default) - self.kinit_timeout = long(config.get('agent', 'alert_kinit_timeout', BaseAlert._DEFAULT_KINIT_TIMEOUT)) + self.kinit_timeout = int(config.get('agent', 'alert_kinit_timeout', BaseAlert._DEFAULT_KINIT_TIMEOUT)) def _collect(self): @@ -194,7 +194,7 @@ def _load_jmx(self, ssl, host, port, jmx_metric): if "0.0.0.0" in str(host): host = self.host_name - for jmx_property_key, jmx_property_value in jmx_metric.property_map.iteritems(): + for jmx_property_key, jmx_property_value in jmx_metric.property_map.items(): url = "{0}://{1}:{2}/jmx?qry={3}".format( "https" if ssl else "http", host, str(port), jmx_property_key) @@ -217,10 +217,10 @@ def _load_jmx(self, ssl, host, port, jmx_metric): content = response else: - url_opener = urllib2.build_opener(RefreshHeaderProcessor()) + url_opener = urllib.request.build_opener(RefreshHeaderProcessor()) response = url_opener.open(url, timeout=self.connection_timeout) content = response.read() - except Exception, exception: + except Exception as exception: if logger.isEnabledFor(logging.DEBUG): logger.exception("[Alert][{0}] Unable to make a web request: {1}".format(self.get_name(), str(exception))) finally: @@ -236,7 +236,7 @@ def _load_jmx(self, ssl, host, port, jmx_metric): try: json_response = json.loads(content) json_data = json_response['beans'][0] - except Exception, exception: + except Exception as exception: json_is_valid = False if logger.isEnabledFor(logging.DEBUG): logger.exception("[Alert][{0}] Convert response to json failed or json doesn't contain needed data: {1}". @@ -293,7 +293,7 @@ def __init__(self, jmx_info): self.custom_module = imp.new_module(str(uuid.uuid4())) code = self.DYNAMIC_CODE_TEMPLATE.format(realcode) - exec code in self.custom_module.__dict__ + exec(code, self.custom_module.__dict__) for p in self.property_list: parts = p.split('/') diff --git a/ambari-agent/src/main/python/ambari_agent/alerts/port_alert.py b/ambari-agent/src/main/python/ambari_agent/alerts/port_alert.py index 80d310bb7c1..acf37467d39 100644 --- a/ambari-agent/src/main/python/ambari_agent/alerts/port_alert.py +++ b/ambari-agent/src/main/python/ambari_agent/alerts/port_alert.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one diff --git a/ambari-agent/src/main/python/ambari_agent/alerts/recovery_alert.py b/ambari-agent/src/main/python/ambari_agent/alerts/recovery_alert.py index de221ae7dd8..21d45a0a4f3 100644 --- a/ambari-agent/src/main/python/ambari_agent/alerts/recovery_alert.py +++ b/ambari-agent/src/main/python/ambari_agent/alerts/recovery_alert.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one diff --git a/ambari-agent/src/main/python/ambari_agent/alerts/script_alert.py b/ambari-agent/src/main/python/ambari_agent/alerts/script_alert.py index fbebd7e07bf..2e1c507b83a 100644 --- a/ambari-agent/src/main/python/ambari_agent/alerts/script_alert.py +++ b/ambari-agent/src/main/python/ambari_agent/alerts/script_alert.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one @@ -55,7 +55,7 @@ def __init__(self, alert_meta, alert_source_meta, config): self.parameters = {} # will force a kinit even if klist says there are valid tickets (4 hour default) - self.kinit_timeout = long(config.get('agent', 'alert_kinit_timeout', BaseAlert._DEFAULT_KINIT_TIMEOUT)) + self.kinit_timeout = int(config.get('agent', 'alert_kinit_timeout', BaseAlert._DEFAULT_KINIT_TIMEOUT)) if 'path' in alert_source_meta: self.path = alert_source_meta['path'] diff --git a/ambari-agent/src/main/python/ambari_agent/alerts/web_alert.py b/ambari-agent/src/main/python/ambari_agent/alerts/web_alert.py index 8fc2744b981..9e1aed9808a 100644 --- a/ambari-agent/src/main/python/ambari_agent/alerts/web_alert.py +++ b/ambari-agent/src/main/python/ambari_agent/alerts/web_alert.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one @@ -20,9 +20,9 @@ import logging import time -import urllib2 +import urllib.request, urllib.error, urllib.parse -from urllib2 import HTTPError +from urllib.error import HTTPError from tempfile import gettempdir from alerts.base_alert import BaseAlert @@ -68,7 +68,7 @@ def __init__(self, alert_meta, alert_source_meta, config): self.curl_connection_timeout = int(connection_timeout) # will force a kinit even if klist says there are valid tickets (4 hour default) - self.kinit_timeout = long(config.get('agent', 'alert_kinit_timeout', BaseAlert._DEFAULT_KINIT_TIMEOUT)) + self.kinit_timeout = int(config.get('agent', 'alert_kinit_timeout', BaseAlert._DEFAULT_KINIT_TIMEOUT)) def _collect(self): @@ -197,7 +197,7 @@ def _make_web_request(self, url): return WebResponse(status_code=response_code, time_millis=time_millis, error_msg=error_msg) - except Exception, exception: + except Exception as exception: if logger.isEnabledFor(logging.DEBUG): logger.exception("[Alert][{0}] Unable to make a web request.".format(self.get_name())) @@ -216,12 +216,12 @@ def _make_web_request_urllib(self, url): start_time = time.time() try: - response = urllib2.urlopen(url, timeout=self.connection_timeout) + response = urllib.request.urlopen(url, timeout=self.connection_timeout) response_code = response.getcode() time_millis = time.time() - start_time return response_code, time_millis, error_message - except HTTPError, httpError: + except HTTPError as httpError: time_millis = time.time() - start_time error_message = str(httpError) @@ -230,7 +230,7 @@ def _make_web_request_urllib(self, url): if response is not None: try: response.close() - except Exception, exception: + except Exception as exception: if logger.isEnabledFor(logging.DEBUG): logger.exception("[Alert][{0}] Unable to close socket connection".format(self.get_name())) diff --git a/ambari-agent/src/main/python/ambari_agent/apscheduler/jobstores/mongodb_store.py b/ambari-agent/src/main/python/ambari_agent/apscheduler/jobstores/mongodb_store.py index 3f522c25c42..4aedffa275c 100644 --- a/ambari-agent/src/main/python/ambari_agent/apscheduler/jobstores/mongodb_store.py +++ b/ambari-agent/src/main/python/ambari_agent/apscheduler/jobstores/mongodb_store.py @@ -7,7 +7,7 @@ from apscheduler.job import Job try: - import cPickle as pickle + import pickle as pickle except ImportError: # pragma: nocover import pickle diff --git a/ambari-agent/src/main/python/ambari_agent/apscheduler/jobstores/redis_store.py b/ambari-agent/src/main/python/ambari_agent/apscheduler/jobstores/redis_store.py index 5eabf4b1e57..7a3ee0372e5 100644 --- a/ambari-agent/src/main/python/ambari_agent/apscheduler/jobstores/redis_store.py +++ b/ambari-agent/src/main/python/ambari_agent/apscheduler/jobstores/redis_store.py @@ -9,7 +9,7 @@ from apscheduler.job import Job try: - import cPickle as pickle + import pickle as pickle except ImportError: # pragma: nocover import pickle @@ -19,7 +19,7 @@ raise ImportError('RedisJobStore requires redis installed') try: - long = long + long = int except NameError: long = int @@ -67,7 +67,7 @@ def load_jobs(self): try: job = Job.__new__(Job) job_state = pickle.loads(job_dict['job_state'.encode()]) - job_state['runs'] = long(job_dict['runs'.encode()]) + job_state['runs'] = int(job_dict['runs'.encode()]) dateval = job_dict['next_run_time'.encode()].decode() job_state['next_run_time'] = datetime.strptime( dateval, '%Y-%m-%dT%H:%M:%S') diff --git a/ambari-agent/src/main/python/ambari_agent/apscheduler/scheduler.py b/ambari-agent/src/main/python/ambari_agent/apscheduler/scheduler.py index f787a2dc777..23ba7350b28 100644 --- a/ambari-agent/src/main/python/ambari_agent/apscheduler/scheduler.py +++ b/ambari-agent/src/main/python/ambari_agent/apscheduler/scheduler.py @@ -145,7 +145,7 @@ def shutdown(self, wait=True, shutdown_threadpool=True, @property def running(self): - thread_alive = self._thread and self._thread.isAlive() + thread_alive = self._thread and self._thread.is_alive() standalone = getattr(self, 'standalone', False) return not self._stopped and (standalone or thread_alive) diff --git a/ambari-agent/src/main/python/ambari_agent/apscheduler/threadpool.py b/ambari-agent/src/main/python/ambari_agent/apscheduler/threadpool.py index cb5f7ed37f8..51eb2864bc1 100644 --- a/ambari-agent/src/main/python/ambari_agent/apscheduler/threadpool.py +++ b/ambari-agent/src/main/python/ambari_agent/apscheduler/threadpool.py @@ -12,7 +12,7 @@ try: from queue import Queue, Empty except ImportError: - from Queue import Queue, Empty + from queue import Queue, Empty logger = logging.getLogger(__name__) _threadpools = set() diff --git a/ambari-agent/src/main/python/ambari_agent/apscheduler/util.py b/ambari-agent/src/main/python/ambari_agent/apscheduler/util.py index dcede4c3576..9ce531c6551 100644 --- a/ambari-agent/src/main/python/ambari_agent/apscheduler/util.py +++ b/ambari-agent/src/main/python/ambari_agent/apscheduler/util.py @@ -63,7 +63,7 @@ def convert_to_datetime(input): return input elif isinstance(input, date): return datetime.fromordinal(input.toordinal()) - elif isinstance(input, basestring): + elif isinstance(input, str): m = _DATE_REGEX.match(input) if not m: raise ValueError('Invalid date string') @@ -177,7 +177,7 @@ def ref_to_obj(ref): """ Returns the object pointed to by ``ref``. """ - if not isinstance(ref, basestring): + if not isinstance(ref, str): raise TypeError('References must be strings') if not ':' in ref: raise ValueError('Invalid reference') diff --git a/ambari-agent/src/main/python/ambari_agent/debug.py b/ambari-agent/src/main/python/ambari_agent/debug.py index f8212defe98..a8ec5e6e95b 100644 --- a/ambari-agent/src/main/python/ambari_agent/debug.py +++ b/ambari-agent/src/main/python/ambari_agent/debug.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -24,8 +24,8 @@ import os import signal -from RemoteDebugUtils import NamedPipe -from RemoteDebugUtils import pipename +from ambari_agent.RemoteDebugUtils import NamedPipe +from ambari_agent.RemoteDebugUtils import pipename def debug_process(pid): """Interrupt a running process and debug it.""" @@ -33,7 +33,7 @@ def debug_process(pid): pipe = NamedPipe(pipename(pid), 1) try: while pipe.is_open(): - txt=raw_input(pipe.get()) + '\n' + txt=input(pipe.get()) + '\n' pipe.put(txt) except EOFError: pass # Exit. diff --git a/ambari-agent/src/main/python/ambari_agent/hostname.py b/ambari-agent/src/main/python/ambari_agent/hostname.py index 82d868b9d0b..b45342a8b84 100644 --- a/ambari-agent/src/main/python/ambari_agent/hostname.py +++ b/ambari-agent/src/main/python/ambari_agent/hostname.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -19,8 +19,8 @@ ''' import socket -from ambari_commons import subprocess32 -import urllib2 +import subprocess +import urllib.request, urllib.error, urllib.parse import logging import traceback import sys @@ -49,7 +49,7 @@ def hostname(config): try: scriptname = config.get('agent', 'hostname_script') try: - osStat = subprocess32.Popen([scriptname], stdout=subprocess32.PIPE, stderr=subprocess32.PIPE) + osStat = subprocess.Popen([scriptname], stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True) out, err = osStat.communicate() if (0 == osStat.returncode and 0 != len(out.strip())): cached_hostname = out.strip() @@ -80,7 +80,7 @@ def public_hostname(config): try: if config.has_option('agent', 'public_hostname_script'): scriptname = config.get('agent', 'public_hostname_script') - output = subprocess32.Popen(scriptname, stdout=subprocess32.PIPE, stderr=subprocess32.PIPE, shell=True) + output = subprocess.Popen(scriptname, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True, universal_newlines=True) out, err = output.communicate() if (0 == output.returncode and 0 != len(out.strip())): cached_public_hostname = out.strip().lower() @@ -96,7 +96,7 @@ def public_hostname(config): logger.info("Defaulting to fqdn.") try: - handle = urllib2.urlopen('http://169.254.169.254/latest/meta-data/public-hostname', '', 2) + handle = urllib.request.urlopen('http://169.254.169.254/latest/meta-data/public-hostname', '', 2) str = handle.read() handle.close() cached_public_hostname = str.lower() @@ -117,12 +117,12 @@ def server_hostnames(config): if config.has_option('server', 'hostname_script'): scriptname = config.get('server', 'hostname_script') try: - osStat = subprocess32.Popen([scriptname], stdout=subprocess32.PIPE, stderr=subprocess32.PIPE) + osStat = subprocess.Popen([scriptname], stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True) out, err = osStat.communicate() if (0 == osStat.returncode and 0 != len(out.strip())): cached_server_hostnames = arrayFromCsvString(out) logger.info("Read server hostname '" + cached_server_hostnames + "' using server:hostname_script") - except Exception, err: + except Exception as err: logger.info("Unable to execute hostname_script for server hostname. " + str(err)) if not cached_server_hostnames: @@ -131,9 +131,9 @@ def server_hostnames(config): def main(argv=None): - print hostname() - print public_hostname() - print server_hostname() + print(hostname()) + print(public_hostname()) + print(server_hostnames()) if __name__ == '__main__': main() diff --git a/ambari-agent/src/main/python/ambari_agent/listeners/AgentActionsListener.py b/ambari-agent/src/main/python/ambari_agent/listeners/AgentActionsListener.py index 2d3cb51e3fe..2e72f2912a0 100644 --- a/ambari-agent/src/main/python/ambari_agent/listeners/AgentActionsListener.py +++ b/ambari-agent/src/main/python/ambari_agent/listeners/AgentActionsListener.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one diff --git a/ambari-agent/src/main/python/ambari_agent/listeners/AlertDefinitionsEventListener.py b/ambari-agent/src/main/python/ambari_agent/listeners/AlertDefinitionsEventListener.py index 0aa65ef828b..8c51182a31a 100644 --- a/ambari-agent/src/main/python/ambari_agent/listeners/AlertDefinitionsEventListener.py +++ b/ambari-agent/src/main/python/ambari_agent/listeners/AlertDefinitionsEventListener.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one diff --git a/ambari-agent/src/main/python/ambari_agent/listeners/CommandsEventListener.py b/ambari-agent/src/main/python/ambari_agent/listeners/CommandsEventListener.py index 51ba7df2cb3..92745ae1786 100644 --- a/ambari-agent/src/main/python/ambari_agent/listeners/CommandsEventListener.py +++ b/ambari-agent/src/main/python/ambari_agent/listeners/CommandsEventListener.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one diff --git a/ambari-agent/src/main/python/ambari_agent/listeners/ConfigurationEventListener.py b/ambari-agent/src/main/python/ambari_agent/listeners/ConfigurationEventListener.py index e5309bb6dc0..dcd39b23013 100644 --- a/ambari-agent/src/main/python/ambari_agent/listeners/ConfigurationEventListener.py +++ b/ambari-agent/src/main/python/ambari_agent/listeners/ConfigurationEventListener.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -52,7 +52,7 @@ def on_event(self, headers, message): if message['clusters']: # FIXME: Recovery manager does not support multiple cluster as of now. - self.recovery_manager.cluster_id = message['clusters'].keys()[0] + self.recovery_manager.cluster_id = list(message['clusters'].keys())[0] self.recovery_manager.on_config_update() def get_handled_path(self): diff --git a/ambari-agent/src/main/python/ambari_agent/listeners/EncryptionKeyListener.py b/ambari-agent/src/main/python/ambari_agent/listeners/EncryptionKeyListener.py index 109506e5cb9..0e77b8643e2 100644 --- a/ambari-agent/src/main/python/ambari_agent/listeners/EncryptionKeyListener.py +++ b/ambari-agent/src/main/python/ambari_agent/listeners/EncryptionKeyListener.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one diff --git a/ambari-agent/src/main/python/ambari_agent/listeners/HostLevelParamsEventListener.py b/ambari-agent/src/main/python/ambari_agent/listeners/HostLevelParamsEventListener.py index 18c1252f4a6..25173082fe5 100644 --- a/ambari-agent/src/main/python/ambari_agent/listeners/HostLevelParamsEventListener.py +++ b/ambari-agent/src/main/python/ambari_agent/listeners/HostLevelParamsEventListener.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -50,7 +50,7 @@ def on_event(self, headers, message): if message['clusters']: # FIXME: Recovery manager does not support multiple cluster as of now. - cluster_id = message['clusters'].keys()[0] + cluster_id = list(message['clusters'].keys())[0] if 'recoveryConfig' in message['clusters'][cluster_id]: logging.info("Updating recoveryConfig from hostLevelParams") diff --git a/ambari-agent/src/main/python/ambari_agent/listeners/MetadataEventListener.py b/ambari-agent/src/main/python/ambari_agent/listeners/MetadataEventListener.py index 873ca4a358b..f3a3503d774 100644 --- a/ambari-agent/src/main/python/ambari_agent/listeners/MetadataEventListener.py +++ b/ambari-agent/src/main/python/ambari_agent/listeners/MetadataEventListener.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one diff --git a/ambari-agent/src/main/python/ambari_agent/listeners/ServerResponsesListener.py b/ambari-agent/src/main/python/ambari_agent/listeners/ServerResponsesListener.py index a4af5719cc6..571009aab9d 100644 --- a/ambari-agent/src/main/python/ambari_agent/listeners/ServerResponsesListener.py +++ b/ambari-agent/src/main/python/ambari_agent/listeners/ServerResponsesListener.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one diff --git a/ambari-agent/src/main/python/ambari_agent/listeners/TopologyEventListener.py b/ambari-agent/src/main/python/ambari_agent/listeners/TopologyEventListener.py index b695d8a34e4..15e622c475c 100644 --- a/ambari-agent/src/main/python/ambari_agent/listeners/TopologyEventListener.py +++ b/ambari-agent/src/main/python/ambari_agent/listeners/TopologyEventListener.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one diff --git a/ambari-agent/src/main/python/ambari_agent/listeners/__init__.py b/ambari-agent/src/main/python/ambari_agent/listeners/__init__.py index 69b59da10f7..2eccd75fdf7 100644 --- a/ambari-agent/src/main/python/ambari_agent/listeners/__init__.py +++ b/ambari-agent/src/main/python/ambari_agent/listeners/__init__.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -25,7 +25,7 @@ from ambari_stomp.adapter.websocket import ConnectionIsAlreadyClosed from ambari_agent import Constants from ambari_agent.Utils import Utils -from Queue import Queue +from queue import Queue import threading logger = logging.getLogger(__name__) diff --git a/ambari-agent/src/main/python/ambari_agent/main.py b/ambari-agent/src/main/python/ambari_agent/main.py index 32317d8ee00..1107e2693fa 100644 --- a/ambari-agent/src/main/python/ambari_agent/main.py +++ b/ambari-agent/src/main/python/ambari_agent/main.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -18,67 +18,6 @@ limitations under the License. ''' -def fix_encoding_reimport_bug(): - """ - Fix https://bugs.python.org/issue14847 - """ - b'x'.decode('utf-8') - b'x'.decode('ascii') - -def fix_subprocess_racecondition(): - """ - subprocess in Python has race condition with enabling/disabling gc. Which may lead to turning off python garbage collector. - This leads to a memory leak. - This function monkey patches subprocess to fix the issue. - - !!! PLEASE NOTE THIS SHOULD BE CALLED BEFORE ANY OTHER INITIALIZATION was done to avoid already created links to subprocess or subprocess.gc or gc - """ - # monkey patching subprocess - import subprocess - subprocess.gc.isenabled = lambda: True - - # re-importing gc to have correct isenabled for non-subprocess contexts - import sys - del sys.modules['gc'] - import gc - - -""" -# this might cause some unexcepted problems -def fix_subprocess_popen(): - ''' - Workaround for race condition in starting subprocesses concurrently from - multiple threads via the subprocess and multiprocessing modules. - See http://bugs.python.org/issue19809 for details and repro script. - ''' - import os - import sys - - if os.name == 'posix' and sys.version_info[0] < 3: - from multiprocessing import forking - from ambari_commons import subprocess - import threading - - sp_original_init = subprocess.Popen.__init__ - mp_original_init = forking.Popen.__init__ - lock = threading.RLock() # guards subprocess creation - - def sp_locked_init(self, *a, **kw): - with lock: - sp_original_init(self, *a, **kw) - - def mp_locked_init(self, *a, **kw): - with lock: - mp_original_init(self, *a, **kw) - - subprocess.Popen.__init__ = sp_locked_init - forking.Popen.__init__ = mp_locked_init -""" - -#fix_subprocess_popen() -fix_subprocess_racecondition() -fix_encoding_reimport_bug() - import logging.handlers import logging.config from optparse import OptionParser @@ -87,21 +26,21 @@ def mp_locked_init(self, *a, **kw): import time import locale import platform -import ConfigParser -import signal +import configparser import resource +import signal from logging.handlers import SysLogHandler -import AmbariConfig -from NetUtil import NetUtil -from PingPortListener import PingPortListener -import hostname -from DataCleaner import DataCleaner +from ambari_agent import AmbariConfig +from ambari_agent.NetUtil import NetUtil +from ambari_agent.PingPortListener import PingPortListener +from ambari_agent import hostname +from ambari_agent.DataCleaner import DataCleaner from ambari_agent.ExitHelper import ExitHelper import socket from ambari_commons import OSConst, OSCheck from ambari_commons.shell import shellRunner #from ambari_commons.network import reconfigure_urllib2_opener -from HeartbeatHandlers import bind_signal_handlers +from ambari_agent.HeartbeatHandlers import bind_signal_handlers from ambari_commons.constants import AMBARI_SUDO_BINARY from resource_management.core.logger import Logger #from resource_management.core.resources.system import File @@ -154,7 +93,7 @@ def setup_logging(logger, filename, logging_level): logging.basicConfig(format=formatstr, level=logging_level, filename=filename) logger.setLevel(logging_level) - logger.info("loglevel=logging.{0}".format(logging._levelNames[logging_level])) + logger.info("loglevel=logging.{0}".format(logging._levelToName[logging_level])) GRACEFUL_STOP_TRIES = 300 GRACEFUL_STOP_TRIES_SLEEP = 0.1 @@ -195,7 +134,7 @@ def update_log_level(config): logging.basicConfig(format=formatstr, level=logging.INFO, filename=AmbariConfig.AmbariConfig.getLogFile()) logger.setLevel(logging.INFO) logger.debug("Newloglevel=logging.INFO") - except Exception, err: + except Exception as err: logger.info("Default loglevel=DEBUG") @@ -214,7 +153,7 @@ def resolve_ambari_config(): else: raise Exception("No config found at {0}, use default".format(configPath)) - except Exception, err: + except Exception as err: logger.warn(err) def check_sudo(): @@ -250,7 +189,7 @@ def update_open_files_ulimit(config): try: resource.setrlimit(resource.RLIMIT_NOFILE, (soft_limit, open_files_ulimit)) logger.info('open files ulimit = {0}'.format(open_files_ulimit)) - except ValueError, err: + except ValueError as err: logger.error('Unable to set open files ulimit to {0}: {1}'.format(open_files_ulimit, str(err))) logger.info('open files ulimit = {0}'.format(hard_limit)) @@ -272,7 +211,7 @@ def perform_prestart_checks(expected_hostname): sys.exit(1) # Check if there is another instance running if os.path.isfile(agent_pidfile) and not OSCheck.get_os_family() == OSConst.WINSRV_FAMILY: - print("%s already exists, exiting" % agent_pidfile) + print(("%s already exists, exiting" % agent_pidfile)) sys.exit(1) # check if ambari prefix exists elif config.has_option('agent', 'prefix') and not os.path.isdir(os.path.abspath(config.get('agent', 'prefix'))): @@ -292,7 +231,8 @@ def perform_prestart_checks(expected_hostname): def daemonize(): pid = str(os.getpid()) - file(agent_pidfile, 'w').write(pid) + with open(agent_pidfile,'w') as f: + f.write(pid) def stop_agent(): # stop existing Ambari agent @@ -312,7 +252,7 @@ def stop_agent(): time.sleep(GRACEFUL_STOP_TRIES_SLEEP) logger.info("Agent not going to die gracefully, going to execute kill -9") raise Exception("Agent is running") - except Exception, err: + except Exception as err: #raise if pid == -1: print ("Agent process is not running") @@ -328,26 +268,26 @@ def reset_agent(options): global home_dir try: # update agent config file - agent_config = ConfigParser.ConfigParser() + agent_config = configparser.ConfigParser() # TODO AMBARI-18733, calculate configFile based on home_dir agent_config.read(configFile) server_host = agent_config.get('server', 'hostname') new_host = options[2] if new_host is not None and server_host != new_host: - print "Updating server host from " + server_host + " to " + new_host + print("Updating server host from " + server_host + " to " + new_host) agent_config.set('server', 'hostname', new_host) with (open(configFile, "wb")) as new_agent_config: agent_config.write(new_agent_config) # clear agent certs agent_keysdir = agent_config.get('security', 'keysdir') - print "Removing Agent certificates..." + print("Removing Agent certificates...") for root, dirs, files in os.walk(agent_keysdir, topdown=False): for name in files: os.remove(os.path.join(root, name)) for name in dirs: os.rmdir(os.path.join(root, name)) - except Exception, err: + except Exception as err: print("A problem occurred while trying to reset the agent: " + str(err)) sys.exit(1) diff --git a/ambari-agent/src/main/python/ambari_agent/security.py b/ambari-agent/src/main/python/ambari_agent/security.py index 377ab794e0a..24434e7f96e 100644 --- a/ambari-agent/src/main/python/ambari_agent/security.py +++ b/ambari-agent/src/main/python/ambari_agent/security.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with @@ -15,20 +15,20 @@ # See the License for the specific language governing permissions and # limitations under the License. -from StringIO import StringIO +from io import StringIO import gzip -import httplib -import urllib2 +import http.client +import urllib.request, urllib.error, urllib.parse import socket import copy import ssl import os import logging -from ambari_commons import subprocess32 +import subprocess import ambari_simplejson as json import pprint import traceback -import hostname +from ambari_agent import hostname import platform import ambari_stomp import threading @@ -242,8 +242,8 @@ def checkCertExists(self): def loadSrvrCrt(self): get_ca_url = self.server_url + '/cert/ca/' logger.info("Downloading server cert from " + get_ca_url) - proxy_handler = urllib2.ProxyHandler({}) - opener = urllib2.build_opener(proxy_handler) + proxy_handler = urllib.request.ProxyHandler({}) + opener = urllib.request.build_opener(proxy_handler) stream = opener.open(get_ca_url) response = stream.read() stream.close() @@ -262,12 +262,12 @@ def reqSignCrt(self): register_data = {'csr': agent_crt_req_content, 'passphrase': passphrase} data = json.dumps(register_data) - proxy_handler = urllib2.ProxyHandler({}) - opener = urllib2.build_opener(proxy_handler) - urllib2.install_opener(opener) - req = urllib2.Request(sign_crt_req_url, data, + proxy_handler = urllib.request.ProxyHandler({}) + opener = urllib.request.build_opener(proxy_handler) + urllib.request.install_opener(opener) + req = urllib.request.Request(sign_crt_req_url, data, {'Content-Type': 'application/json'}) - f = urllib2.urlopen(req) + f = urllib.request.urlopen(req) response = f.read() f.close() try: @@ -300,14 +300,14 @@ def genAgentCrtReq(self, keyname): logger.info(generate_script) if platform.system() == 'Windows': - p = subprocess32.Popen(generate_script, stdout=subprocess32.PIPE) + p = subprocess.Popen(generate_script, stdout=subprocess.PIPE) p.communicate() else: - p = subprocess32.Popen([generate_script], shell=True, - stdout=subprocess32.PIPE) + p = subprocess.Popen([generate_script], shell=True, + stdout=subprocess.PIPE) p.communicate() # this is required to be 600 for security concerns. - os.chmod(keyname, 0600) + os.chmod(keyname, 0o600) def initSecurity(self): self.checkCertExists() diff --git a/ambari-agent/src/test/python/ambari_agent/BaseStompServerTestCase.py b/ambari-agent/src/test/python/ambari_agent/BaseStompServerTestCase.py index 7df2388b7dd..44656956936 100644 --- a/ambari-agent/src/test/python/ambari_agent/BaseStompServerTestCase.py +++ b/ambari-agent/src/test/python/ambari_agent/BaseStompServerTestCase.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -32,7 +32,7 @@ try: from queue import Queue, Empty except ImportError: - from Queue import Queue, Empty + from queue import Queue, Empty from coilmq.util.frames import Frame, FrameBuffer from coilmq.queue import QueueManager diff --git a/ambari-agent/src/test/python/ambari_agent/TestActionQueue.py b/ambari-agent/src/test/python/ambari_agent/TestActionQueue.py index 16aff700170..a9010286b53 100644 --- a/ambari-agent/src/test/python/ambari_agent/TestActionQueue.py +++ b/ambari-agent/src/test/python/ambari_agent/TestActionQueue.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -17,7 +17,7 @@ See the License for the specific language governing permissions and limitations under the License. ''' -from Queue import Queue +from queue import Queue from unittest import TestCase from ambari_agent.LiveStatus import LiveStatus @@ -59,12 +59,12 @@ def tearDown(self): datanode_install_command = { 'commandType': 'EXECUTION_COMMAND', - 'role': u'DATANODE', - 'roleCommand': u'INSTALL', + 'role': 'DATANODE', + 'roleCommand': 'INSTALL', 'commandId': '1-1', 'taskId': 3, - 'clusterName': u'cc', - 'serviceName': u'HDFS', + 'clusterName': 'cc', + 'serviceName': 'HDFS', 'hostLevelParams': {}, 'configurations':{'global' : {}}, 'configurationTags':{'global' : { 'tag': 'v1' }}, @@ -76,12 +76,12 @@ def tearDown(self): datanode_install_no_retry_command = { 'commandType': 'EXECUTION_COMMAND', - 'role': u'DATANODE', - 'roleCommand': u'INSTALL', + 'role': 'DATANODE', + 'roleCommand': 'INSTALL', 'commandId': '1-1', 'taskId': 3, - 'clusterName': u'cc', - 'serviceName': u'HDFS', + 'clusterName': 'cc', + 'serviceName': 'HDFS', 'hostLevelParams': {}, 'configurations':{'global' : {}}, 'configurationTags':{'global' : { 'tag': 'v1' }}, @@ -93,12 +93,12 @@ def tearDown(self): datanode_auto_start_command = { 'commandType': 'AUTO_EXECUTION_COMMAND', - 'role': u'DATANODE', - 'roleCommand': u'START', + 'role': 'DATANODE', + 'roleCommand': 'START', 'commandId': '1-1', 'taskId': 3, - 'clusterName': u'cc', - 'serviceName': u'HDFS', + 'clusterName': 'cc', + 'serviceName': 'HDFS', 'hostLevelParams': {}, 'configurations':{'global' : {}}, 'configurationTags':{'global' : { 'tag': 'v1' }}, @@ -127,36 +127,36 @@ def tearDown(self): namenode_install_command = { 'commandType': 'EXECUTION_COMMAND', - 'role': u'NAMENODE', - 'roleCommand': u'INSTALL', + 'role': 'NAMENODE', + 'roleCommand': 'INSTALL', 'commandId': '1-1', 'taskId': 4, - 'clusterName': u'cc', - 'serviceName': u'HDFS', + 'clusterName': 'cc', + 'serviceName': 'HDFS', 'hostLevelParams': {}, 'clusterId': CLUSTER_ID, } snamenode_install_command = { 'commandType': 'EXECUTION_COMMAND', - 'role': u'SECONDARY_NAMENODE', - 'roleCommand': u'INSTALL', + 'role': 'SECONDARY_NAMENODE', + 'roleCommand': 'INSTALL', 'commandId': '1-1', 'taskId': 5, - 'clusterName': u'cc', - 'serviceName': u'HDFS', + 'clusterName': 'cc', + 'serviceName': 'HDFS', 'hostLevelParams': {}, 'clusterId': CLUSTER_ID, } hbase_install_command = { 'commandType': 'EXECUTION_COMMAND', - 'role': u'HBASE', - 'roleCommand': u'INSTALL', + 'role': 'HBASE', + 'roleCommand': 'INSTALL', 'commandId': '1-1', 'taskId': 7, - 'clusterName': u'cc', - 'serviceName': u'HDFS', + 'clusterName': 'cc', + 'serviceName': 'HDFS', 'hostLevelParams': {}, 'commandParams': { 'command_retry_enabled': 'true' @@ -176,12 +176,12 @@ def tearDown(self): datanode_restart_command = { 'commandType': 'EXECUTION_COMMAND', - 'role': u'DATANODE', - 'roleCommand': u'CUSTOM_COMMAND', + 'role': 'DATANODE', + 'roleCommand': 'CUSTOM_COMMAND', 'commandId': '1-1', 'taskId': 9, - 'clusterName': u'cc', - 'serviceName': u'HDFS', + 'clusterName': 'cc', + 'serviceName': 'HDFS', 'configurations':{'global' : {}}, 'configurationTags':{'global' : { 'tag': 'v123' }}, 'hostLevelParams':{'custom_command': 'RESTART', 'clientsToUpdateConfigs': []}, @@ -190,12 +190,12 @@ def tearDown(self): datanode_restart_command_no_logging = { 'commandType': 'EXECUTION_COMMAND', - 'role': u'DATANODE', - 'roleCommand': u'CUSTOM_COMMAND', + 'role': 'DATANODE', + 'roleCommand': 'CUSTOM_COMMAND', 'commandId': '1-1', 'taskId': 9, - 'clusterName': u'cc', - 'serviceName': u'HDFS', + 'clusterName': 'cc', + 'serviceName': 'HDFS', 'configurations': {'global': {}}, 'configurationTags': {'global': {'tag': 'v123'}}, 'commandParams': { @@ -207,12 +207,12 @@ def tearDown(self): datanode_restart_command_no_clients_update = { 'commandType': 'EXECUTION_COMMAND', - 'role': u'DATANODE', - 'roleCommand': u'CUSTOM_COMMAND', + 'role': 'DATANODE', + 'roleCommand': 'CUSTOM_COMMAND', 'commandId': '1-1', 'taskId': 9, - 'clusterName': u'cc', - 'serviceName': u'HDFS', + 'clusterName': 'cc', + 'serviceName': 'HDFS', 'configurations':{'global' : {}}, 'configurationTags':{'global' : { 'tag': 'v123' }}, 'hostLevelParams':{'custom_command': 'RESTART'}, @@ -222,12 +222,12 @@ def tearDown(self): datanode_start_custom_command = { 'clusterId': CLUSTER_ID, 'commandType': 'EXECUTION_COMMAND', - 'role': u'DATANODE', - 'roleCommand': u'CUSTOM_COMMAND', + 'role': 'DATANODE', + 'roleCommand': 'CUSTOM_COMMAND', 'commandId': '1-1', 'taskId': 9, - 'clusterName': u'cc', - 'serviceName': u'HDFS', + 'clusterName': 'cc', + 'serviceName': 'HDFS', 'configurations':{'global' : {}}, 'configurationTags':{'global' : { 'tag': 'v123' }}, 'hostLevelParams':{'custom_command': 'START'}, @@ -236,12 +236,12 @@ def tearDown(self): yarn_refresh_queues_custom_command = { 'commandType': 'EXECUTION_COMMAND', - 'role': u'RESOURCEMANAGER', - 'roleCommand': u'CUSTOM_COMMAND', + 'role': 'RESOURCEMANAGER', + 'roleCommand': 'CUSTOM_COMMAND', 'commandId': '1-1', 'taskId': 9, - 'clusterName': u'cc', - 'serviceName': u'YARN', + 'clusterName': 'cc', + 'serviceName': 'YARN', 'commandParams' : {'forceRefreshConfigTags' : 'capacity-scheduler'}, 'configurations':{'global' : {}}, 'configurationTags':{'global' : { 'tag': 'v123' }, 'capacity-scheduler' : {'tag': 'v123'}}, @@ -438,9 +438,9 @@ def test_log_execution_commands(self, command_status_dict_mock, 'stdout': 'out\n\nCommand completed successfully!\n', 'clusterId': CLUSTER_ID, 'structuredOut': '""', - 'roleCommand': u'CUSTOM_COMMAND', - 'serviceName': u'HDFS', - 'role': u'DATANODE', + 'roleCommand': 'CUSTOM_COMMAND', + 'serviceName': 'HDFS', + 'role': 'DATANODE', 'actionId': '1-1', 'taskId': 9, 'exitCode': 0} @@ -484,9 +484,9 @@ def test_do_not_log_execution_commands(self, command_status_dict_mock, 'stdout': 'out\n\nCommand completed successfully!\n', 'clusterId': CLUSTER_ID, 'structuredOut': '""', - 'roleCommand': u'CUSTOM_COMMAND', - 'serviceName': u'HDFS', - 'role': u'DATANODE', + 'roleCommand': 'CUSTOM_COMMAND', + 'serviceName': 'HDFS', + 'role': 'DATANODE', 'actionId': '1-1', 'taskId': 9, 'exitCode': 0} @@ -511,7 +511,7 @@ def test_auto_execute_command(self): initializer_module.recovery_manager = RecoveryManager(MagicMock()) initializer_module.recovery_manager.update_config(5, 5, 1, 11, True, False, False) - with patch("__builtin__.open") as open_mock: + with patch("builtins.open") as open_mock: # Make file read calls visible def open_side_effect(file, mode): if mode == 'r': @@ -585,7 +585,7 @@ def test_execute_command(self): initializer_module.init() initializer_module.config = config - with patch("__builtin__.open") as open_mock: + with patch("builtins.open") as open_mock: # Make file read calls visible def open_side_effect(file, mode): if mode == 'r': @@ -632,9 +632,9 @@ def patched_aq_execute_command(command): 'stdout': 'Read from {0}'.format(os.path.join(tempdir, "output-3.txt")), 'structuredOut' : 'Read from {0}'.format(os.path.join(tempdir, "structured-out-3.json")), 'clusterId': CLUSTER_ID, - 'roleCommand': u'INSTALL', - 'serviceName': u'HDFS', - 'role': u'DATANODE', + 'roleCommand': 'INSTALL', + 'serviceName': 'HDFS', + 'role': 'DATANODE', 'actionId': '1-1', 'taskId': 3, 'exitCode': 777} @@ -652,9 +652,9 @@ def patched_aq_execute_command(command): 'stdout': 'out\n\nCommand completed successfully!\n', 'clusterId': CLUSTER_ID, 'structuredOut': '""', - 'roleCommand': u'INSTALL', - 'serviceName': u'HDFS', - 'role': u'DATANODE', + 'roleCommand': 'INSTALL', + 'serviceName': 'HDFS', + 'role': 'DATANODE', 'actionId': '1-1', 'taskId': 3, 'exitCode': 0} @@ -689,9 +689,9 @@ def patched_aq_execute_command(command): 'stdout': 'out\n\nCommand completed successfully!\n\n\nCommand failed after 1 tries\n', 'clusterId': CLUSTER_ID, 'structuredOut': '""', - 'roleCommand': u'INSTALL', - 'serviceName': u'HDFS', - 'role': u'DATANODE', + 'roleCommand': 'INSTALL', + 'serviceName': 'HDFS', + 'role': 'DATANODE', 'actionId': '1-1', 'taskId': 3, 'exitCode': 13} @@ -768,9 +768,9 @@ def test_store_configuration_tags(self, command_status_dict_mock, 'stderr': 'stderr', 'stdout': 'out\n\nCommand completed successfully!\n', 'structuredOut': '""', - 'roleCommand': u'CUSTOM_COMMAND', - 'serviceName': u'HDFS', - 'role': u'DATANODE', + 'roleCommand': 'CUSTOM_COMMAND', + 'serviceName': 'HDFS', + 'role': 'DATANODE', 'actionId': '1-1', 'taskId': 9, 'clusterId': CLUSTER_ID, @@ -811,9 +811,9 @@ def test_store_configuration_tags_no_clients(self, command_status_dict_mock, 'stdout': 'out\n\nCommand completed successfully!\n', 'clusterId': CLUSTER_ID, 'structuredOut': '""', - 'roleCommand': u'CUSTOM_COMMAND', - 'serviceName': u'HDFS', - 'role': u'DATANODE', + 'roleCommand': 'CUSTOM_COMMAND', + 'serviceName': 'HDFS', + 'role': 'DATANODE', 'actionId': '1-1', 'taskId': 9, 'exitCode': 0} @@ -853,9 +853,9 @@ def test_refresh_queues_custom_command(self, command_status_dict_mock, 'stdout': 'out\n\nCommand completed successfully!\n', 'clusterId': CLUSTER_ID, 'structuredOut': '""', - 'roleCommand': u'CUSTOM_COMMAND', - 'serviceName': u'YARN', - 'role': u'RESOURCEMANAGER', + 'roleCommand': 'CUSTOM_COMMAND', + 'serviceName': 'YARN', + 'role': 'RESOURCEMANAGER', 'actionId': '1-1', 'taskId': 9, 'exitCode': 0} @@ -891,9 +891,9 @@ def test_store_configuration_tags_on_custom_start_command(self, command_status_d 'stderr': 'stderr', 'stdout': 'out\n\nCommand completed successfully!\n', 'structuredOut': '""', - 'roleCommand': u'CUSTOM_COMMAND', - 'serviceName': u'HDFS', - 'role': u'DATANODE', + 'roleCommand': 'CUSTOM_COMMAND', + 'serviceName': 'HDFS', + 'role': 'DATANODE', 'actionId': '1-1', 'taskId': 9, 'exitCode': 0, @@ -918,12 +918,12 @@ def test_store_config_tags_on_install_client_command(self, command_status_dict_m tez_client_install_command = { 'commandType': 'EXECUTION_COMMAND', - 'role': u'TEZ_CLIENT', - 'roleCommand': u'INSTALL', + 'role': 'TEZ_CLIENT', + 'roleCommand': 'INSTALL', 'commandId': '1-1', 'taskId': 9, - 'clusterName': u'cc', - 'serviceName': u'TEZ', + 'clusterName': 'cc', + 'serviceName': 'TEZ', 'configurations': {'global' : {}}, 'configurationTags': {'global' : { 'tag': 'v123' }}, 'hostLevelParams': {}, @@ -1193,12 +1193,12 @@ def windows_py(command, tmpout, tmperr): with tmperr: tmperr.write('process_err') return proc - def open_subprocess32_files_win(fout, ferr, f): + def open_subprocess_files_win(fout, ferr, f): return MagicMock(), MagicMock() def read_result_from_files(out_path, err_path, structured_out_path): return 'process_out', 'process_err', '{"a": "b."}' - pythonExecutor.launch_python_subprocess32 = windows_py - pythonExecutor.open_subprocess32_files = open_subprocess32_files_win + pythonExecutor.launch_python_subprocess = windows_py + pythonExecutor.open_subprocess_files = open_subprocess_files_win pythonExecutor.read_result_from_files = read_result_from_files def wraped(func, before=None, after=None): diff --git a/ambari-agent/src/test/python/ambari_agent/TestActualConfigHandler.py b/ambari-agent/src/test/python/ambari_agent/TestActualConfigHandler.py index 096516b31b3..c500488b2e0 100644 --- a/ambari-agent/src/test/python/ambari_agent/TestActualConfigHandler.py +++ b/ambari-agent/src/test/python/ambari_agent/TestActualConfigHandler.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -22,11 +22,10 @@ import os import logging from mock.mock import patch, MagicMock, call -from ambari_agent.LiveStatus import LiveStatus from ambari_commons import OSCheck from only_for_platform import os_distro_value -with patch("platform.linux_distribution", return_value = ('Suse','11','Final')): +with patch("distro.linux_distribution", return_value = ('Suse','11','Final')): from ambari_agent.AmbariConfig import AmbariConfig from ambari_agent.ActualConfigHandler import ActualConfigHandler @@ -34,6 +33,7 @@ class TestActualConfigHandler(TestCase): def setUp(self): + from LiveStatus import LiveStatus LiveStatus.SERVICES = [ "HDFS", "MAPREDUCE", "GANGLIA", "HBASE", "ZOOKEEPER", "OOZIE", @@ -144,7 +144,7 @@ def test_read_write(self): handler = ActualConfigHandler(config, tags) handler.write_actual(tags) output = handler.read_actual() - self.assertEquals(tags, output) + self.assertEqual(tags, output) os.remove(os.path.join(tmpdir, ActualConfigHandler.CONFIG_NAME)) @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) @@ -159,7 +159,7 @@ def test_read_empty(self): conf_file.close() output = handler.read_actual() - self.assertEquals(None, output) + self.assertEqual(None, output) os.remove(os.path.join(tmpdir, ActualConfigHandler.CONFIG_NAME)) @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) @@ -176,16 +176,16 @@ def test_read_write_component(self): output1 = handler.read_actual_component('FOO') output2 = handler.read_actual_component('GOO') - self.assertEquals(tags1, output1) - self.assertEquals(None, output2) + self.assertEqual(tags1, output1) + self.assertEqual(None, output2) tags2 = { "global": "version1", "core-site": "version2" } handler.write_actual(tags2) output3 = handler.read_actual() output4 = handler.read_actual_component('FOO') - self.assertEquals(tags2, output3) - self.assertEquals(tags1, output4) + self.assertEqual(tags2, output3) + self.assertEqual(tags1, output4) os.remove(os.path.join(tmpdir, "FOO_" + ActualConfigHandler.CONFIG_NAME)) os.remove(os.path.join(tmpdir, ActualConfigHandler.CONFIG_NAME)) @@ -201,14 +201,14 @@ def test_write_actual_component_and_client_components(self): handler = ActualConfigHandler(config, {}) handler.write_actual_component('HDFS_CLIENT', tags1) handler.write_actual_component('HBASE_CLIENT', tags1) - self.assertEquals(tags1, handler.read_actual_component('HDFS_CLIENT')) - self.assertEquals(tags1, handler.read_actual_component('HBASE_CLIENT')) + self.assertEqual(tags1, handler.read_actual_component('HDFS_CLIENT')) + self.assertEqual(tags1, handler.read_actual_component('HBASE_CLIENT')) handler.write_actual_component('DATANODE', tags2) - self.assertEquals(tags2, handler.read_actual_component('DATANODE')) - self.assertEquals(tags1, handler.read_actual_component('HDFS_CLIENT')) + self.assertEqual(tags2, handler.read_actual_component('DATANODE')) + self.assertEqual(tags1, handler.read_actual_component('HDFS_CLIENT')) handler.write_client_components('HDFS', tags2, clientsToUpdateConfigs1) - self.assertEquals(tags2, handler.read_actual_component('HDFS_CLIENT')) - self.assertEquals(tags1, handler.read_actual_component('HBASE_CLIENT')) + self.assertEqual(tags2, handler.read_actual_component('HDFS_CLIENT')) + self.assertEqual(tags1, handler.read_actual_component('HBASE_CLIENT')) os.remove(os.path.join(tmpdir, "DATANODE_" + ActualConfigHandler.CONFIG_NAME)) os.remove(os.path.join(tmpdir, "HBASE_CLIENT_" + ActualConfigHandler.CONFIG_NAME)) @@ -227,11 +227,11 @@ def test_write_client_components(self, write_file_mock): clientsToUpdateConfigs1 = ["HDFS_CLIENT","HBASE_CLIENT"] configTags = {'HDFS_CLIENT': tags0, 'HBASE_CLIENT': tags1} handler = ActualConfigHandler(config, configTags) - self.assertEquals(tags0, handler.read_actual_component('HDFS_CLIENT')) - self.assertEquals(tags1, handler.read_actual_component('HBASE_CLIENT')) + self.assertEqual(tags0, handler.read_actual_component('HDFS_CLIENT')) + self.assertEqual(tags1, handler.read_actual_component('HBASE_CLIENT')) handler.write_client_components('HDFS', tags2, clientsToUpdateConfigs1) - self.assertEquals(tags2, handler.read_actual_component('HDFS_CLIENT')) - self.assertEquals(tags1, handler.read_actual_component('HBASE_CLIENT')) + self.assertEqual(tags2, handler.read_actual_component('HDFS_CLIENT')) + self.assertEqual(tags1, handler.read_actual_component('HBASE_CLIENT')) self.assertTrue(write_file_mock.called) self.assertEqual(1, write_file_mock.call_count) @@ -248,11 +248,11 @@ def test_write_empty_client_components(self, write_file_mock): clientsToUpdateConfigs1 = [] configTags = {'HDFS_CLIENT': tags0, 'HBASE_CLIENT': tags1} handler = ActualConfigHandler(config, configTags) - self.assertEquals(tags0, handler.read_actual_component('HDFS_CLIENT')) - self.assertEquals(tags1, handler.read_actual_component('HBASE_CLIENT')) + self.assertEqual(tags0, handler.read_actual_component('HDFS_CLIENT')) + self.assertEqual(tags1, handler.read_actual_component('HBASE_CLIENT')) handler.write_client_components('HDFS', tags2, clientsToUpdateConfigs1) - self.assertEquals(tags0, handler.read_actual_component('HDFS_CLIENT')) - self.assertEquals(tags1, handler.read_actual_component('HBASE_CLIENT')) + self.assertEqual(tags0, handler.read_actual_component('HDFS_CLIENT')) + self.assertEqual(tags1, handler.read_actual_component('HBASE_CLIENT')) self.assertFalse(write_file_mock.called) @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) @@ -270,10 +270,10 @@ def test_read_actual_component_inmemory(self, read_file_mock, write_file_mock): handler.write_actual_component('NAMENODE', tags1) self.assertTrue(write_file_mock.called) - self.assertEquals(tags1, handler.read_actual_component('NAMENODE')) + self.assertEqual(tags1, handler.read_actual_component('NAMENODE')) self.assertFalse(read_file_mock.called) - self.assertEquals(tags1, handler.read_actual_component('DATANODE')) + self.assertEqual(tags1, handler.read_actual_component('DATANODE')) self.assertTrue(read_file_mock.called) - self.assertEquals(1, read_file_mock.call_count) - self.assertEquals(tags1, handler.read_actual_component('DATANODE')) - self.assertEquals(1, read_file_mock.call_count) + self.assertEqual(1, read_file_mock.call_count) + self.assertEqual(tags1, handler.read_actual_component('DATANODE')) + self.assertEqual(1, read_file_mock.call_count) diff --git a/ambari-agent/src/test/python/ambari_agent/TestAgentActions.py b/ambari-agent/src/test/python/ambari_agent/TestAgentActions.py index 04ce6e80dc7..350ee682a7d 100644 --- a/ambari-agent/src/test/python/ambari_agent/TestAgentActions.py +++ b/ambari-agent/src/test/python/ambari_agent/TestAgentActions.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one diff --git a/ambari-agent/src/test/python/ambari_agent/TestAgentStompResponses.py b/ambari-agent/src/test/python/ambari_agent/TestAgentStompResponses.py index 8a2d18a21d4..09603b1b0f1 100644 --- a/ambari-agent/src/test/python/ambari_agent/TestAgentStompResponses.py +++ b/ambari-agent/src/test/python/ambari_agent/TestAgentStompResponses.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -149,16 +149,16 @@ def test_mock_server_can_start(self, runCommand_mock): action_queue.join() self.assertTrue('mounts' in host_status_report) - self.assertEquals(self.initializer_module.topology_cache['0']['hosts'][0]['hostName'], 'c6401.ambari.apache.org') - self.assertEquals(self.initializer_module.metadata_cache['0']['status_commands_to_run'], ('STATUS',)) - self.assertEquals(self.initializer_module.configurations_cache['0']['configurations']['zoo.cfg']['clientPort'], '2181') - self.assertEquals(dn_install_in_progress_frame['clusters']['0'][0]['roleCommand'], 'INSTALL') - self.assertEquals(dn_install_in_progress_frame['clusters']['0'][0]['role'], 'DATANODE') - self.assertEquals(dn_install_in_progress_frame['clusters']['0'][0]['status'], 'IN_PROGRESS') - self.assertEquals(dn_install_failed_frame['clusters']['0'][0]['status'], 'FAILED') - self.assertEquals(dn_recovery_in_progress_frame['clusters']['0'][0]['roleCommand'], 'INSTALL') - self.assertEquals(dn_recovery_in_progress_frame['clusters']['0'][0]['role'], 'DATANODE') - self.assertEquals(dn_recovery_in_progress_frame['clusters']['0'][0]['status'], 'IN_PROGRESS') + self.assertEqual(self.initializer_module.topology_cache['0']['hosts'][0]['hostName'], 'c6401.ambari.apache.org') + self.assertEqual(self.initializer_module.metadata_cache['0']['status_commands_to_run'], ('STATUS',)) + self.assertEqual(self.initializer_module.configurations_cache['0']['configurations']['zoo.cfg']['clientPort'], '2181') + self.assertEqual(dn_install_in_progress_frame['clusters']['0'][0]['roleCommand'], 'INSTALL') + self.assertEqual(dn_install_in_progress_frame['clusters']['0'][0]['role'], 'DATANODE') + self.assertEqual(dn_install_in_progress_frame['clusters']['0'][0]['status'], 'IN_PROGRESS') + self.assertEqual(dn_install_failed_frame['clusters']['0'][0]['status'], 'FAILED') + self.assertEqual(dn_recovery_in_progress_frame['clusters']['0'][0]['roleCommand'], 'INSTALL') + self.assertEqual(dn_recovery_in_progress_frame['clusters']['0'][0]['role'], 'DATANODE') + self.assertEqual(dn_recovery_in_progress_frame['clusters']['0'][0]['status'], 'IN_PROGRESS') #============================================================================================ #============================================================================================ diff --git a/ambari-agent/src/test/python/ambari_agent/TestAlertCollector.py b/ambari-agent/src/test/python/ambari_agent/TestAlertCollector.py index 5ee1171aa08..c95c6f0dab2 100644 --- a/ambari-agent/src/test/python/ambari_agent/TestAlertCollector.py +++ b/ambari-agent/src/test/python/ambari_agent/TestAlertCollector.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -37,7 +37,7 @@ def test_put_noCluster(self): } collector.put(cluster, alert) - self.assertEquals(collector._AlertCollector__buckets, {'TestCluster': {'AlertName': alert}, 'TestCluster2': {}}) + self.assertEqual(collector._AlertCollector__buckets, {'TestCluster': {'AlertName': alert}, 'TestCluster2': {}}) def test_put_clusterExists(self): cluster = 'TestCluster' @@ -51,7 +51,7 @@ def test_put_clusterExists(self): } collector.put(cluster, alert) - self.assertEquals(collector._AlertCollector__buckets, {'TestCluster': {'AlertName': alert}}) + self.assertEqual(collector._AlertCollector__buckets, {'TestCluster': {'AlertName': alert}}) def test_put_alertExists(self): cluster = 'TestCluster' @@ -69,7 +69,7 @@ def test_put_alertExists(self): } collector.put(cluster, alert) - self.assertEquals(collector._AlertCollector__buckets, {'TestCluster': {'AlertName': alert}}) + self.assertEqual(collector._AlertCollector__buckets, {'TestCluster': {'AlertName': alert}}) def test_remove(self): alert1 = { @@ -89,7 +89,7 @@ def test_remove(self): } controller.remove('TestCluster', 'AlertName1') - self.assertEquals(controller._AlertCollector__buckets, {'TestCluster': {'AlertName2': alert2}}) + self.assertEqual(controller._AlertCollector__buckets, {'TestCluster': {'AlertName2': alert2}}) def test_remove_noCluster(self): alert1 = { @@ -109,7 +109,7 @@ def test_remove_noCluster(self): } controller.remove('TestCluster', 'AlertName1') - self.assertEquals(controller._AlertCollector__buckets, {'TestCluster2': {'AlertName1': alert1, 'AlertName2': alert2}}) + self.assertEqual(controller._AlertCollector__buckets, {'TestCluster2': {'AlertName1': alert1, 'AlertName2': alert2}}) def test_remove_noAlert(self): alert2 = { @@ -124,7 +124,7 @@ def test_remove_noAlert(self): } controller.remove('TestCluster', 'AlertName1') - self.assertEquals(controller._AlertCollector__buckets, {'TestCluster2': {'AlertName2': alert2}}) + self.assertEqual(controller._AlertCollector__buckets, {'TestCluster2': {'AlertName2': alert2}}) def test_remove_by_uuid(self): alert1 = { @@ -144,7 +144,7 @@ def test_remove_by_uuid(self): } controller.remove_by_uuid('11') - self.assertEquals(controller._AlertCollector__buckets, {'TestCluster2': {'AlertName2': alert2}}) + self.assertEqual(controller._AlertCollector__buckets, {'TestCluster2': {'AlertName2': alert2}}) def test_remove_by_uuid_absent(self): alert1 = { @@ -164,7 +164,7 @@ def test_remove_by_uuid_absent(self): } controller.remove_by_uuid('13') - self.assertEquals(controller._AlertCollector__buckets, {'TestCluster': {'AlertName1': alert1, 'AlertName2': alert2}}) + self.assertEqual(controller._AlertCollector__buckets, {'TestCluster': {'AlertName1': alert1, 'AlertName2': alert2}}) def test_alerts(self): alert1 = { @@ -196,8 +196,8 @@ def test_alerts(self): } list = controller.alerts() - self.assertEquals(controller._AlertCollector__buckets, {}) - self.assertEquals(list.sort(), [alert1, alert2, alert3, alert4].sort()) + self.assertEqual(controller._AlertCollector__buckets, {}) + self.assertEqual(list.sort(key=lambda k: (k.get('name', 0))), [alert1, alert2, alert3, alert4].sort(key=lambda k: (k.get('name', 0)))) diff --git a/ambari-agent/src/test/python/ambari_agent/TestAlertSchedulerHandler.py b/ambari-agent/src/test/python/ambari_agent/TestAlertSchedulerHandler.py index 7647070c106..570b7f76629 100644 --- a/ambari-agent/src/test/python/ambari_agent/TestAlertSchedulerHandler.py +++ b/ambari-agent/src/test/python/ambari_agent/TestAlertSchedulerHandler.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -29,7 +29,7 @@ from ambari_agent.InitializerModule import InitializerModule -from AmbariConfig import AmbariConfig +from ambari_agent.AmbariConfig import AmbariConfig from mock.mock import Mock, MagicMock, patch from unittest import TestCase @@ -83,8 +83,8 @@ def test_json_to_callable_metric(self): self.assertTrue(callable_result is not None) self.assertTrue(isinstance(callable_result, MetricAlert)) - self.assertEquals(callable_result.alert_meta, json_definition) - self.assertEquals(callable_result.alert_source_meta, json_definition['source']) + self.assertEqual(callable_result.alert_meta, json_definition) + self.assertEqual(callable_result.alert_source_meta, json_definition['source']) def test_json_to_callable_ams(self): initializer_module = InitializerModule() @@ -102,8 +102,8 @@ def test_json_to_callable_ams(self): self.assertTrue(callable_result is not None) self.assertTrue(isinstance(callable_result, AmsAlert)) - self.assertEquals(callable_result.alert_meta, json_definition) - self.assertEquals(callable_result.alert_source_meta, json_definition['source']) + self.assertEqual(callable_result.alert_meta, json_definition) + self.assertEqual(callable_result.alert_source_meta, json_definition['source']) def test_json_to_callable_port(self): json_definition = { @@ -121,8 +121,8 @@ def test_json_to_callable_port(self): self.assertTrue(callable_result is not None) self.assertTrue(isinstance(callable_result, PortAlert)) - self.assertEquals(callable_result.alert_meta, json_definition) - self.assertEquals(callable_result.alert_source_meta, json_definition['source']) + self.assertEqual(callable_result.alert_meta, json_definition) + self.assertEqual(callable_result.alert_source_meta, json_definition['source']) def test_json_to_callable_web(self): @@ -140,8 +140,8 @@ def test_json_to_callable_web(self): self.assertTrue(callable_result is not None) self.assertTrue(isinstance(callable_result, WebAlert)) - self.assertEquals(callable_result.alert_meta, json_definition) - self.assertEquals(callable_result.alert_source_meta, json_definition['source']) + self.assertEqual(callable_result.alert_meta, json_definition) + self.assertEqual(callable_result.alert_source_meta, json_definition['source']) def test_json_to_callable_none(self): json_definition = { @@ -305,7 +305,7 @@ def test_load_definitions_noFile(self): definitions = scheduler._AlertSchedulerHandler__load_definitions() - self.assertEquals(definitions, []) + self.assertEqual(definitions, []) def __test_start(self): execution_commands = [ diff --git a/ambari-agent/src/test/python/ambari_agent/TestAlerts.py b/ambari-agent/src/test/python/ambari_agent/TestAlerts.py index 538aac3d31b..1536ceba1e8 100644 --- a/ambari-agent/src/test/python/ambari_agent/TestAlerts.py +++ b/ambari-agent/src/test/python/ambari_agent/TestAlerts.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -21,7 +21,7 @@ import os import socket import sys -import urllib2 +import urllib.request, urllib.error, urllib.parse import tempfile import random from alerts.ams_alert import AmsAlert @@ -43,7 +43,7 @@ from mock.mock import MagicMock, patch from unittest import TestCase -from AmbariConfig import AmbariConfig +from ambari_agent.AmbariConfig import AmbariConfig from ambari_agent.InitializerModule import InitializerModule from ambari_agent.ConfigurationBuilder import ConfigurationBuilder @@ -78,7 +78,7 @@ def test_start(self, aps_add_interval_job_mock, aps_start_mock): initializer_module.config.common_services_dir = test_common_services_path initializer_module.config.extensions_dir = test_extensions_path initializer_module.config.host_scripts_dir = test_host_scripts_path - + initializer_module.init() ash = AlertSchedulerHandler(initializer_module) @@ -117,13 +117,13 @@ def test_recovery_alert(self, rm_get_actions_mock, is_stale_mock): alert = RecoveryAlert(definition_json, definition_json['source'], self.config, rm) alert.set_helpers(collector, cluster_configuration, MagicMock()) alert.set_cluster("c1", "0", "c6401.ambari.apache.org") - self.assertEquals(1, alert.interval()) + self.assertEqual(1, alert.interval()) # OK - "count": 0 alert.collect() alerts = collector.alerts() - self.assertEquals(0, len(collector.alerts())) - self.assertEquals('OK', alerts[0]['state']) + self.assertEqual(0, len(collector.alerts())) + self.assertEqual('OK', alerts[0]['state']) # WARN - "count": 1 rm_get_actions_mock.return_value = { @@ -139,8 +139,8 @@ def test_recovery_alert(self, rm_get_actions_mock, is_stale_mock): } alert.collect() alerts = collector.alerts() - self.assertEquals(0, len(collector.alerts())) - self.assertEquals('WARNING', alerts[0]['state']) + self.assertEqual(0, len(collector.alerts())) + self.assertEqual('WARNING', alerts[0]['state']) # CRIT - "count": 5 rm_get_actions_mock.return_value = { @@ -156,16 +156,16 @@ def test_recovery_alert(self, rm_get_actions_mock, is_stale_mock): } alert.collect() alerts = collector.alerts() - self.assertEquals(0, len(collector.alerts())) - self.assertEquals('CRITICAL', alerts[0]['state']) + self.assertEqual(0, len(collector.alerts())) + self.assertEqual('CRITICAL', alerts[0]['state']) # OK again, after recovery manager window expired is_stale_mock.return_value = True alert.collect() alerts = collector.alerts() - self.assertEquals(0, len(collector.alerts())) - self.assertEquals('OK', alerts[0]['state']) + self.assertEqual(0, len(collector.alerts())) + self.assertEqual('OK', alerts[0]['state']) # CRIT, after recovery manager window expired, # but max_lifetime_count reached, warnedThresholdReached == True @@ -185,8 +185,8 @@ def test_recovery_alert(self, rm_get_actions_mock, is_stale_mock): alert.collect() alerts = collector.alerts() - self.assertEquals(0, len(collector.alerts())) - self.assertEquals('CRITICAL', alerts[0]['state']) + self.assertEqual(0, len(collector.alerts())) + self.assertEqual('CRITICAL', alerts[0]['state']) @patch.object(ConfigurationBuilder, "get_configuration") @@ -212,14 +212,14 @@ def test_port_alert_complex_uri(self, socket_connect_mock, get_configuration_moc # use a URI that has commas to verify that we properly parse it alert.set_helpers(collector, cluster_configuration, initializer_module.configuration_builder) alert.set_cluster("c1", "0", "c6401.ambari.apache.org") - self.assertEquals(6, alert.interval()) + self.assertEqual(6, alert.interval()) alert.collect() alerts = collector.alerts() - self.assertEquals(0, len(collector.alerts())) + self.assertEqual(0, len(collector.alerts())) - self.assertEquals('OK', alerts[0]['state']) + self.assertEqual('OK', alerts[0]['state']) self.assertTrue('(Unit Tests)' in alerts[0]['text']) self.assertTrue('response time on port 2181' in alerts[0]['text']) @@ -255,7 +255,7 @@ def test_port_alert_no_sub(self): alert.set_helpers(AlertCollector(), cluster_configuration, MagicMock()) alert.set_cluster("c1", "0", "c6401.ambari.apache.org") - self.assertEquals('http://c6401.ambari.apache.org', alert.uri) + self.assertEqual('http://c6401.ambari.apache.org', alert.uri) alert.collect() @@ -285,19 +285,19 @@ def test_script_alert(self, get_configuration_mock): alert.set_helpers(collector, cluster_configuration, initializer_module.configuration_builder) alert.set_cluster("c1", "0", "c6401.ambari.apache.org") - self.assertEquals(definition_json['source']['path'], alert.path) - self.assertEquals(definition_json['source']['stacks_directory'], alert.stacks_dir) - self.assertEquals(definition_json['source']['extensions_directory'], alert.extensions_dir) - self.assertEquals(definition_json['source']['common_services_directory'], alert.common_services_dir) - self.assertEquals(definition_json['source']['host_scripts_directory'], alert.host_scripts_dir) + self.assertEqual(definition_json['source']['path'], alert.path) + self.assertEqual(definition_json['source']['stacks_directory'], alert.stacks_dir) + self.assertEqual(definition_json['source']['extensions_directory'], alert.extensions_dir) + self.assertEqual(definition_json['source']['common_services_directory'], alert.common_services_dir) + self.assertEqual(definition_json['source']['host_scripts_directory'], alert.host_scripts_dir) alert.collect() alerts = collector.alerts() - self.assertEquals(0, len(collector.alerts())) + self.assertEqual(0, len(collector.alerts())) - self.assertEquals('WARNING', alerts[0]['state']) - self.assertEquals('bar is rendered-bar, baz is rendered-baz', alerts[0]['text']) + self.assertEqual('WARNING', alerts[0]['state']) + self.assertEqual('bar is rendered-bar, baz is rendered-baz', alerts[0]['text']) @patch.object(ConfigurationBuilder, "get_configuration") @@ -325,19 +325,19 @@ def test_script_alert_with_parameters(self, get_configuration_mock): alert.set_helpers(collector, cluster_configuration, initializer_module.configuration_builder) alert.set_cluster("c1", "0", "c6401.ambari.apache.org") - self.assertEquals(definition_json['source']['path'], alert.path) - self.assertEquals(definition_json['source']['stacks_directory'], alert.stacks_dir) - self.assertEquals(definition_json['source']['common_services_directory'], alert.common_services_dir) - self.assertEquals(definition_json['source']['extensions_directory'], alert.extensions_dir) - self.assertEquals(definition_json['source']['host_scripts_directory'], alert.host_scripts_dir) + self.assertEqual(definition_json['source']['path'], alert.path) + self.assertEqual(definition_json['source']['stacks_directory'], alert.stacks_dir) + self.assertEqual(definition_json['source']['common_services_directory'], alert.common_services_dir) + self.assertEqual(definition_json['source']['extensions_directory'], alert.extensions_dir) + self.assertEqual(definition_json['source']['host_scripts_directory'], alert.host_scripts_dir) alert.collect() alerts = collector.alerts() - self.assertEquals(0, len(collector.alerts())) + self.assertEqual(0, len(collector.alerts())) - self.assertEquals('OK', alerts[0]['state']) - self.assertEquals('Script parameter detected: foo bar baz', alerts[0]['text']) + self.assertEqual('OK', alerts[0]['state']) + self.assertEqual('Script parameter detected: foo bar baz', alerts[0]['text']) @patch.object(ConfigurationBuilder, "get_configuration") @@ -364,27 +364,27 @@ def test_metric_alert(self, ma_load_jmx_mock, get_configuration_mock): alert.collect() alerts = collector.alerts() - self.assertEquals(0, len(collector.alerts())) - self.assertEquals('OK', alerts[0]['state']) - self.assertEquals('(Unit Tests) OK: 1 25 125', alerts[0]['text']) + self.assertEqual(0, len(collector.alerts())) + self.assertEqual('OK', alerts[0]['state']) + self.assertEqual('(Unit Tests) OK: 1 25 125', alerts[0]['text']) # trip a warning ma_load_jmx_mock.return_value = ([1, 75], None) alert.collect() alerts = collector.alerts() - self.assertEquals(0, len(collector.alerts())) - self.assertEquals('WARNING', alerts[0]['state']) - self.assertEquals('(Unit Tests) Warning: 1 75 175', alerts[0]['text']) + self.assertEqual(0, len(collector.alerts())) + self.assertEqual('WARNING', alerts[0]['state']) + self.assertEqual('(Unit Tests) Warning: 1 75 175', alerts[0]['text']) # trip a critical now ma_load_jmx_mock.return_value = ([1, 150], None) alert.collect() alerts = collector.alerts() - self.assertEquals(0, len(collector.alerts())) - self.assertEquals('CRITICAL', alerts[0]['state']) - self.assertEquals('(Unit Tests) Critical: 1 150 250', alerts[0]['text']) + self.assertEqual(0, len(collector.alerts())) + self.assertEqual('CRITICAL', alerts[0]['state']) + self.assertEqual('(Unit Tests) Critical: 1 150 250', alerts[0]['text']) del definition_json['source']['jmx']['value'] collector = AlertCollector() @@ -398,9 +398,9 @@ def test_metric_alert(self, ma_load_jmx_mock, get_configuration_mock): alert.collect() alerts = collector.alerts() - self.assertEquals(0, len(collector.alerts())) - self.assertEquals('OK', alerts[0]['state']) - self.assertEquals('(Unit Tests) OK: 1 25 None', alerts[0]['text']) + self.assertEqual(0, len(collector.alerts())) + self.assertEqual('OK', alerts[0]['state']) + self.assertEqual('(Unit Tests) OK: 1 25 None', alerts[0]['text']) @patch.object(ConfigurationBuilder, "get_configuration") @@ -428,27 +428,27 @@ def test_ams_alert(self, ma_load_metric_mock, get_configuration_mock): alert.collect() alerts = collector.alerts() - self.assertEquals(0, len(collector.alerts())) - self.assertEquals('OK', alerts[0]['state']) - self.assertEquals('(Unit Tests) OK: the mean used heap size is 150 MB.', alerts[0]['text']) + self.assertEqual(0, len(collector.alerts())) + self.assertEqual('OK', alerts[0]['state']) + self.assertEqual('(Unit Tests) OK: the mean used heap size is 150.0 MB.', alerts[0]['text']) # trip a warning ma_load_metric_mock.return_value = ([{1:800,2:800,3:900,4:900}], None) alert.collect() alerts = collector.alerts() - self.assertEquals(0, len(collector.alerts())) - self.assertEquals('WARNING', alerts[0]['state']) - self.assertEquals('(Unit Tests) Warning: the mean used heap size is 850 MB.', alerts[0]['text']) + self.assertEqual(0, len(collector.alerts())) + self.assertEqual('WARNING', alerts[0]['state']) + self.assertEqual('(Unit Tests) Warning: the mean used heap size is 850.0 MB.', alerts[0]['text']) # trip a critical now ma_load_metric_mock.return_value = ([{1:1000,2:1000,3:2000,4:2000}], None) alert.collect() alerts = collector.alerts() - self.assertEquals(0, len(collector.alerts())) - self.assertEquals('CRITICAL', alerts[0]['state']) - self.assertEquals('(Unit Tests) Critical: the mean used heap size is 1500 MB.', alerts[0]['text']) + self.assertEqual(0, len(collector.alerts())) + self.assertEqual('CRITICAL', alerts[0]['state']) + self.assertEqual('(Unit Tests) Critical: the mean used heap size is 1500.0 MB.', alerts[0]['text']) @patch.object(ConfigurationBuilder, "get_configuration") @patch.object(MetricAlert, "_load_jmx") @@ -466,7 +466,7 @@ def test_alert_uri_structure(self, ma_load_jmx_mock, get_configuration_mock): alert.set_cluster("c1", "0", "c6401.ambari.apache.org") alert.collect() - self.assertEquals('UNKNOWN', collector.alerts()[0]['state']) + self.assertEqual('UNKNOWN', collector.alerts()[0]['state']) # set properties that make no sense wihtout the main URI properties configuration = {'hdfs-site' : @@ -482,7 +482,7 @@ def test_alert_uri_structure(self, ma_load_jmx_mock, get_configuration_mock): alert.set_cluster("c1", "0", "c6401.ambari.apache.org") alert.collect() - self.assertEquals('UNKNOWN', collector.alerts()[0]['state']) + self.assertEqual('UNKNOWN', collector.alerts()[0]['state']) # set an actual property key (http) configuration = {'hdfs-site' : @@ -501,7 +501,7 @@ def test_alert_uri_structure(self, ma_load_jmx_mock, get_configuration_mock): alert.set_cluster("c1", "0", "c6401.ambari.apache.org") alert.collect() - self.assertEquals('OK', collector.alerts()[0]['state']) + self.assertEqual('OK', collector.alerts()[0]['state']) # set an actual property key (https) configuration = {'hdfs-site' : @@ -517,7 +517,7 @@ def test_alert_uri_structure(self, ma_load_jmx_mock, get_configuration_mock): alert.set_cluster("c1", "0", "c6401.ambari.apache.org") alert.collect() - self.assertEquals('OK', collector.alerts()[0]['state']) + self.assertEqual('OK', collector.alerts()[0]['state']) # set both (http and https) configuration = {'hdfs-site' : @@ -534,7 +534,7 @@ def test_alert_uri_structure(self, ma_load_jmx_mock, get_configuration_mock): alert.set_cluster("c1", "0", "c6401.ambari.apache.org") alert.collect() - self.assertEquals('OK', collector.alerts()[0]['state']) + self.assertEqual('OK', collector.alerts()[0]['state']) def create_initializer_module(self): initializer_module = InitializerModule() @@ -574,10 +574,10 @@ def test_web_alert(self, wa_make_web_request_mock, get_configuration_mock): alert.collect() alerts = collector.alerts() - self.assertEquals(0, len(collector.alerts())) + self.assertEqual(0, len(collector.alerts())) - self.assertEquals('(Unit Tests) ok: 200', alerts[0]['text']) - self.assertEquals('OK', alerts[0]['state']) + self.assertEqual('(Unit Tests) ok: 200', alerts[0]['text']) + self.assertEqual('OK', alerts[0]['state']) # run the alert and check HTTP 500 wa_make_web_request_mock.return_value = WebResponse(500,1.234,"Internal Server Error") @@ -588,10 +588,10 @@ def test_web_alert(self, wa_make_web_request_mock, get_configuration_mock): alert.collect() alerts = collector.alerts() - self.assertEquals(0, len(collector.alerts())) + self.assertEqual(0, len(collector.alerts())) - self.assertEquals('WARNING', alerts[0]['state']) - self.assertEquals('(Unit Tests) warning: 500 (Internal Server Error)', alerts[0]['text']) + self.assertEqual('WARNING', alerts[0]['state']) + self.assertEqual('(Unit Tests) warning: 500 (Internal Server Error)', alerts[0]['text']) # run the alert and check critical wa_make_web_request_mock.return_value = WebResponse(0,0,'error message') @@ -603,11 +603,11 @@ def test_web_alert(self, wa_make_web_request_mock, get_configuration_mock): alert.collect() alerts = collector.alerts() - self.assertEquals(0, len(collector.alerts())) + self.assertEqual(0, len(collector.alerts())) # http assertion indicating that we properly determined non-SSL - self.assertEquals('CRITICAL', alerts[0]['state']) - self.assertEquals('(Unit Tests) critical: http://c6401.ambari.apache.org:80. error message', alerts[0]['text']) + self.assertEqual('CRITICAL', alerts[0]['state']) + self.assertEqual('(Unit Tests) critical: http://c6401.ambari.apache.org:80. error message', alerts[0]['text']) configuration = {'hdfs-site' : { 'dfs.http.policy' : 'HTTPS_ONLY', @@ -626,11 +626,11 @@ def test_web_alert(self, wa_make_web_request_mock, get_configuration_mock): alert.collect() alerts = collector.alerts() - self.assertEquals(0, len(collector.alerts())) + self.assertEqual(0, len(collector.alerts())) # SSL assertion - self.assertEquals('CRITICAL', alerts[0]['state']) - self.assertEquals('(Unit Tests) critical: https://c6401.ambari.apache.org:443/test/path. error message', alerts[0]['text']) + self.assertEqual('CRITICAL', alerts[0]['state']) + self.assertEqual('(Unit Tests) critical: https://c6401.ambari.apache.org:443/test/path. error message', alerts[0]['text']) # test custom codes code = random.choice((600, 700, 800)) @@ -642,10 +642,10 @@ def test_web_alert(self, wa_make_web_request_mock, get_configuration_mock): alert.collect() alerts = collector.alerts() - self.assertEquals(0, len(collector.alerts())) + self.assertEqual(0, len(collector.alerts())) - self.assertEquals('OK', alerts[0]['state']) - self.assertEquals('(Unit Tests) ok: {code}'.format(code=code), alerts[0]['text']) + self.assertEqual('OK', alerts[0]['state']) + self.assertEqual('(Unit Tests) ok: {code}'.format(code=code), alerts[0]['text']) def test_reschedule(self): test_file_path = os.path.join('ambari_agent', 'dummy_files') @@ -663,7 +663,7 @@ def test_reschedule(self): initializer_module.config.common_services_dir = test_common_services_path initializer_module.config.extensions_dir = test_extensions_path initializer_module.config.host_scripts_dir = test_host_scripts_path - + initializer_module.init() ash = AlertSchedulerHandler(initializer_module) @@ -674,9 +674,9 @@ def test_reschedule(self): ash.start() - self.assertEquals(1, ash.get_job_count()) + self.assertEqual(1, ash.get_job_count()) ash.reschedule() - self.assertEquals(1, ash.get_job_count()) + self.assertEqual(1, ash.get_job_count()) @patch.object(ConfigurationBuilder, "get_configuration") def test_alert_collector_purge(self, get_configuration_mock): @@ -696,18 +696,18 @@ def test_alert_collector_purge(self, get_configuration_mock): alert = PortAlert(definition_json, definition_json['source'], self.config) alert.set_helpers(collector, cluster_configuration, initializer_module.configuration_builder) alert.set_cluster("c1", "0", "c6401.ambari.apache.org") - self.assertEquals(6, alert.interval()) + self.assertEqual(6, alert.interval()) res = alert.collect() alerts = collector.alerts() - self.assertEquals(0, len(collector.alerts())) + self.assertEqual(0, len(collector.alerts())) self.assertTrue(alerts[0] is not None) - self.assertEquals('CRITICAL', alerts[0]['state']) + self.assertEqual('CRITICAL', alerts[0]['state']) collector.remove_by_uuid('c1f73191-4481-4435-8dae-fd380e4c0be1') - self.assertEquals(0,len(collector.alerts())) + self.assertEqual(0,len(collector.alerts())) def test_disabled_definitions(self): @@ -720,13 +720,13 @@ def test_disabled_definitions(self): cluster_configuration = self.__get_cluster_configuration() initializer_module = InitializerModule() - + initializer_module.config.cluster_cache_dir = test_file_path initializer_module.config.stacks_dir = test_stack_path initializer_module.config.common_services_dir = test_common_services_path initializer_module.config.extensions_dir = test_extensions_path initializer_module.config.host_scripts_dir = test_host_scripts_path - + initializer_module.init() ash = AlertSchedulerHandler(initializer_module) @@ -743,28 +743,28 @@ def test_disabled_definitions(self): in_minutes=True): """ - self.assertEquals(1, ash.get_job_count()) + self.assertEqual(1, ash.get_job_count()) definition_json = self._get_port_alert_definition() alert = PortAlert(definition_json, definition_json['source'], self.config) ash.schedule_definition(alert) - self.assertEquals(2, ash.get_job_count()) + self.assertEqual(2, ash.get_job_count()) definition_json['enabled'] = False alert = PortAlert(definition_json, definition_json['source'], self.config) ash.schedule_definition(alert) # verify disabled alert not scheduled - self.assertEquals(2, ash.get_job_count()) + self.assertEqual(2, ash.get_job_count()) definition_json['enabled'] = True pa = PortAlert(definition_json, definition_json['source'], self.config) ash.schedule_definition(pa) # verify enabled alert was scheduled - self.assertEquals(3, ash.get_job_count()) + self.assertEqual(3, ash.get_job_count()) def test_immediate_alert(self): test_file_path = os.path.join('ambari_agent', 'dummy_files') @@ -776,13 +776,13 @@ def test_immediate_alert(self): cluster_configuration = self.__get_cluster_configuration() initializer_module = InitializerModule() - + initializer_module.config.cluster_cache_dir = test_file_path initializer_module.config.stacks_dir = test_stack_path initializer_module.config.common_services_dir = test_common_services_path initializer_module.config.extensions_dir = test_extensions_path initializer_module.config.host_scripts_dir = test_host_scripts_path - + initializer_module.init() ash = AlertSchedulerHandler(initializer_module) @@ -793,8 +793,8 @@ def test_immediate_alert(self): ash.start() - self.assertEquals(1, ash.get_job_count()) - self.assertEquals(0, len(ash._collector.alerts())) + self.assertEqual(1, ash.get_job_count()) + self.assertEqual(0, len(ash._collector.alerts())) execution_commands = [ { "clusterName": "c1", @@ -804,7 +804,7 @@ def test_immediate_alert(self): # execute the alert immediately and verify that the collector has the result ash.execute_alert(execution_commands) - self.assertEquals(1, len(ash._collector.alerts())) + self.assertEqual(1, len(ash._collector.alerts())) def test_skipped_alert(self): @@ -832,49 +832,49 @@ def test_skipped_alert(self): alert.collect() - self.assertEquals(definition_json['source']['path'], alert.path) - self.assertEquals(definition_json['source']['stacks_directory'], alert.stacks_dir) - self.assertEquals(definition_json['source']['extensions_directory'], alert.extensions_dir) - self.assertEquals(definition_json['source']['common_services_directory'], alert.common_services_dir) - self.assertEquals(definition_json['source']['host_scripts_directory'], alert.host_scripts_dir) + self.assertEqual(definition_json['source']['path'], alert.path) + self.assertEqual(definition_json['source']['stacks_directory'], alert.stacks_dir) + self.assertEqual(definition_json['source']['extensions_directory'], alert.extensions_dir) + self.assertEqual(definition_json['source']['common_services_directory'], alert.common_services_dir) + self.assertEqual(definition_json['source']['host_scripts_directory'], alert.host_scripts_dir) # ensure that the skipped alert was still placed into the collector; it's up to # the server to decide how to handle skipped alerts - self.assertEquals(1,len(collector.alerts())) + self.assertEqual(1,len(collector.alerts())) def test_default_reporting_text(self): definition_json = self._get_script_alert_definition() alert = ScriptAlert(definition_json, definition_json['source'], self.config) - self.assertEquals(alert._get_reporting_text(alert.RESULT_OK), '{0}') - self.assertEquals(alert._get_reporting_text(alert.RESULT_WARNING), '{0}') - self.assertEquals(alert._get_reporting_text(alert.RESULT_CRITICAL), '{0}') + self.assertEqual(alert._get_reporting_text(alert.RESULT_OK), '{0}') + self.assertEqual(alert._get_reporting_text(alert.RESULT_WARNING), '{0}') + self.assertEqual(alert._get_reporting_text(alert.RESULT_CRITICAL), '{0}') definition_json['source']['type'] = 'PORT' alert = PortAlert(definition_json, definition_json['source'], self.config) - self.assertEquals(alert._get_reporting_text(alert.RESULT_OK), 'TCP OK - {0:.4f} response on port {1}') - self.assertEquals(alert._get_reporting_text(alert.RESULT_WARNING), 'TCP OK - {0:.4f} response on port {1}') - self.assertEquals(alert._get_reporting_text(alert.RESULT_CRITICAL), 'Connection failed: {0} to {1}:{2}') + self.assertEqual(alert._get_reporting_text(alert.RESULT_OK), 'TCP OK - {0:.4f} response on port {1}') + self.assertEqual(alert._get_reporting_text(alert.RESULT_WARNING), 'TCP OK - {0:.4f} response on port {1}') + self.assertEqual(alert._get_reporting_text(alert.RESULT_CRITICAL), 'Connection failed: {0} to {1}:{2}') definition_json['source']['type'] = 'WEB' alert = WebAlert(definition_json, definition_json['source'], self.config) - self.assertEquals(alert._get_reporting_text(alert.RESULT_OK), 'HTTP {0} response in {2:.4f} seconds') - self.assertEquals(alert._get_reporting_text(alert.RESULT_WARNING), 'HTTP {0} response in {2:.4f} seconds') - self.assertEquals(alert._get_reporting_text(alert.RESULT_CRITICAL), 'Connection failed to {1}') + self.assertEqual(alert._get_reporting_text(alert.RESULT_OK), 'HTTP {0} response in {2:.4f} seconds') + self.assertEqual(alert._get_reporting_text(alert.RESULT_WARNING), 'HTTP {0} response in {2:.4f} seconds') + self.assertEqual(alert._get_reporting_text(alert.RESULT_CRITICAL), 'Connection failed to {1}') definition_json['source']['type'] = 'METRIC' alert = MetricAlert(definition_json, definition_json['source'], self.config) - self.assertEquals(alert._get_reporting_text(alert.RESULT_OK), '{0}') - self.assertEquals(alert._get_reporting_text(alert.RESULT_WARNING), '{0}') - self.assertEquals(alert._get_reporting_text(alert.RESULT_CRITICAL), '{0}') + self.assertEqual(alert._get_reporting_text(alert.RESULT_OK), '{0}') + self.assertEqual(alert._get_reporting_text(alert.RESULT_WARNING), '{0}') + self.assertEqual(alert._get_reporting_text(alert.RESULT_CRITICAL), '{0}') rm = RecoveryManager(MagicMock()) definition_json['source']['type'] = 'RECOVERY' alert = RecoveryAlert(definition_json, definition_json['source'], self.config, rm) - self.assertEquals(alert._get_reporting_text(alert.RESULT_OK), 'No recovery operations executed for {2}{0}.') - self.assertEquals(alert._get_reporting_text(alert.RESULT_WARNING), '{1} recovery operations executed for {2}{0}.') - self.assertEquals(alert._get_reporting_text(alert.RESULT_CRITICAL), '{1} recovery operations executed for {2}{0}.') + self.assertEqual(alert._get_reporting_text(alert.RESULT_OK), 'No recovery operations executed for {2}{0}.') + self.assertEqual(alert._get_reporting_text(alert.RESULT_WARNING), '{1} recovery operations executed for {2}{0}.') + self.assertEqual(alert._get_reporting_text(alert.RESULT_CRITICAL), '{1} recovery operations executed for {2}{0}.') @patch.object(ConfigurationBuilder, "get_configuration") @@ -906,10 +906,10 @@ def test_configuration_updates(self, get_configuration_mock): alert.collect() alerts = collector.alerts() - self.assertEquals(0, len(collector.alerts())) + self.assertEqual(0, len(collector.alerts())) - self.assertEquals('WARNING', alerts[0]['state']) - self.assertEquals('bar is rendered-bar, baz is rendered-baz', alerts[0]['text']) + self.assertEqual('WARNING', alerts[0]['state']) + self.assertEqual('bar is rendered-bar, baz is rendered-baz', alerts[0]['text']) # now update only the configs and run the same alert again and check # for different output @@ -924,10 +924,10 @@ def test_configuration_updates(self, get_configuration_mock): alert.collect() alerts = collector.alerts() - self.assertEquals(0, len(collector.alerts())) + self.assertEqual(0, len(collector.alerts())) - self.assertEquals('WARNING', alerts[0]['state']) - self.assertEquals('bar is rendered-bar2, baz is rendered-baz2', alerts[0]['text']) + self.assertEqual('WARNING', alerts[0]['state']) + self.assertEqual('bar is rendered-bar2, baz is rendered-baz2', alerts[0]['text']) @patch.object(ConfigurationBuilder, "get_configuration") @@ -1093,7 +1093,7 @@ def test_uri_structure_parsing_without_namespace(self, get_configuration_mock): @patch.object(ConfigurationBuilder, "get_configuration") - @patch('httplib.HTTPConnection') + @patch('http.client.HTTPConnection') @patch.object(RefreshHeaderProcessor, 'http_response') def test_metric_alert_uses_refresh_processor(self, http_response_mock, http_connection_mock, get_configuration_mock): """ @@ -1106,7 +1106,7 @@ def test_metric_alert_uses_refresh_processor(self, http_response_mock, http_conn http_conn.getresponse.return_value = MagicMock(status=200) http_response_mock.return_value = MagicMock(code=200) - url_opener = urllib2.build_opener(RefreshHeaderProcessor()) + url_opener = urllib.request.build_opener(RefreshHeaderProcessor()) response = url_opener.open("http://foo.bar.baz/jmx") self.assertFalse(response is None) @@ -1145,7 +1145,7 @@ def test_metric_alert_uses_refresh_processor(self, http_response_mock, http_conn def test_urllib2_refresh_header_processor(self): - from urllib2 import Request + from urllib.request import Request # setup the original request original_url = "http://foo.bar.baz/jmx?qry=someQuery" @@ -1225,13 +1225,13 @@ def test_uri_timeout(self): # the web alert will have a timeout value definition_json = self._get_web_alert_definition() alert = WebAlert(definition_json, definition_json['source'], self.config) - self.assertEquals(5.678, alert.connection_timeout) - self.assertEquals(5, alert.curl_connection_timeout) + self.assertEqual(5.678, alert.connection_timeout) + self.assertEqual(5, alert.curl_connection_timeout) # the metric definition will not and should default to 5.0 definition_json = self._get_metric_alert_definition() alert = MetricAlert(definition_json, definition_json['source'], self.config) - self.assertEquals(5.0, alert.connection_timeout) + self.assertEqual(5.0, alert.connection_timeout) @patch.object(ConfigurationBuilder, "get_configuration") def test_get_configuration_values(self, get_configuration_mock): @@ -1265,21 +1265,21 @@ def test_get_configuration_values(self, get_configuration_mock): alert.set_helpers(collector, cluster_configuration, initializer_module.configuration_builder) alert.set_cluster("c1", "0", "c6401.ambari.apache.org") - self.assertEquals("constant", alert._get_configuration_value(configuration_full, "constant")) - self.assertEquals("value1", alert._get_configuration_value(configuration_full, "{{foo-site/foo-key1}}")) - self.assertEquals("value2", alert._get_configuration_value(configuration_full, "{{foo-site/foo-key2}}")) - self.assertEquals("asterisk", alert._get_configuration_value(configuration_full, "{{foo-site/special-character-*}}")) - self.assertEquals("dollar sign", alert._get_configuration_value(configuration_full, "{{foo-site/special-character-$}}")) - self.assertEquals("hash", alert._get_configuration_value(configuration_full, "{{foo-site/special-character-#}}")) - self.assertEquals("bang", alert._get_configuration_value(configuration_full, "{{foo-site/special-character-!}}")) - self.assertEquals("ampersand", alert._get_configuration_value(configuration_full, "{{foo-site/special-character-&}}")) + self.assertEqual("constant", alert._get_configuration_value(configuration_full, "constant")) + self.assertEqual("value1", alert._get_configuration_value(configuration_full, "{{foo-site/foo-key1}}")) + self.assertEqual("value2", alert._get_configuration_value(configuration_full, "{{foo-site/foo-key2}}")) + self.assertEqual("asterisk", alert._get_configuration_value(configuration_full, "{{foo-site/special-character-*}}")) + self.assertEqual("dollar sign", alert._get_configuration_value(configuration_full, "{{foo-site/special-character-$}}")) + self.assertEqual("hash", alert._get_configuration_value(configuration_full, "{{foo-site/special-character-#}}")) + self.assertEqual("bang", alert._get_configuration_value(configuration_full, "{{foo-site/special-character-!}}")) + self.assertEqual("ampersand", alert._get_configuration_value(configuration_full, "{{foo-site/special-character-&}}")) # try a mix of parameter and constant - self.assertEquals("http://value1/servlet", alert._get_configuration_value(configuration_full, "http://{{foo-site/foo-key1}}/servlet")) - self.assertEquals("http://value1/servlet/value2", alert._get_configuration_value(configuration_full, "http://{{foo-site/foo-key1}}/servlet/{{foo-site/foo-key2}}")) + self.assertEqual("http://value1/servlet", alert._get_configuration_value(configuration_full, "http://{{foo-site/foo-key1}}/servlet")) + self.assertEqual("http://value1/servlet/value2", alert._get_configuration_value(configuration_full, "http://{{foo-site/foo-key1}}/servlet/{{foo-site/foo-key2}}")) # try to request a dictionary object instead of a property - self.assertEquals(configuration["foo-site"], alert._get_configuration_value(configuration_full, "{{foo-site}}")) + self.assertEqual(configuration["foo-site"], alert._get_configuration_value(configuration_full, "{{foo-site}}")) @patch.object(ConfigurationBuilder, "get_configuration") @patch.object(MetricAlert, "_load_jmx") @@ -1304,9 +1304,9 @@ def test_metric_alert_floating_division(self, ma_load_jmx_mock, get_configuratio alert.collect() alerts = collector.alerts() - self.assertEquals(0, len(collector.alerts())) - self.assertEquals('OK', alerts[0]['state']) - self.assertEquals('(Unit Tests) OK: 10 5 2.0', alerts[0]['text']) + self.assertEqual(0, len(collector.alerts())) + self.assertEqual('OK', alerts[0]['state']) + self.assertEqual('(Unit Tests) OK: 10 5 2.0', alerts[0]['text']) @@ -1339,16 +1339,16 @@ def test_alert_definition_value_error_conversion(self, socket_connect_mock, get_ # use a URI that has commas to verify that we properly parse it alert.set_helpers(collector, cluster_configuration, initializer_module.configuration_builder) alert.set_cluster("c1", "0", "c6401.ambari.apache.org") - self.assertEquals(6, alert.interval()) + self.assertEqual(6, alert.interval()) # the collect should catch the invalid text in the definition # ValueError: Unknown format code 'd' for object of type 'float' alert.collect() alerts = collector.alerts() - self.assertEquals(0, len(collector.alerts())) + self.assertEqual(0, len(collector.alerts())) - self.assertEquals('OK', alerts[0]['state']) + self.assertEqual('OK', alerts[0]['state']) self.assertTrue('(Unit Tests) TCP OK' in alerts[0]['text']) @@ -1381,16 +1381,16 @@ def test_alert_definition_too_many_positional_arguments(self, socket_connect_moc # use a URI that has commas to verify that we properly parse it alert.set_helpers(collector, cluster_configuration, initializer_module.configuration_builder) alert.set_cluster("c1", "0", "c6401.ambari.apache.org") - self.assertEquals(6, alert.interval()) + self.assertEqual(6, alert.interval()) # the collect should catch the invalid text in the definition # ValueError: Unknown format code 'd' for object of type 'float' alert.collect() alerts = collector.alerts() - self.assertEquals(0, len(collector.alerts())) + self.assertEqual(0, len(collector.alerts())) - self.assertEquals('UNKNOWN', alerts[0]['state']) + self.assertEqual('UNKNOWN', alerts[0]['state']) self.assertTrue('There is a problem with the alert definition' in alerts[0]['text']) def __get_cluster_configuration(self): @@ -1399,7 +1399,7 @@ def __get_cluster_configuration(self): operations have been mocked out :return: """ - with patch("__builtin__.open") as open_mock: + with patch("builtins.open") as open_mock: open_mock.side_effect = self.open_side_effect cluster_configuration = ClusterConfigurationCache("/tmp/test_cache") return cluster_configuration diff --git a/ambari-agent/src/test/python/ambari_agent/TestAmbariAgent.py b/ambari-agent/src/test/python/ambari_agent/TestAmbariAgent.py index 341fc2ed90c..bee33c53485 100644 --- a/ambari-agent/src/test/python/ambari_agent/TestAmbariAgent.py +++ b/ambari-agent/src/test/python/ambari_agent/TestAmbariAgent.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -19,35 +19,35 @@ ''' import unittest -from ambari_commons import subprocess32 +import subprocess import os import sys import AmbariConfig from mock.mock import MagicMock, patch, ANY -with patch("platform.linux_distribution", return_value = ('Suse','11','Final')): +with patch("distro.linux_distribution", return_value = ('Suse','11','Final')): from ambari_agent import AmbariAgent class TestAmbariAgent(unittest.TestCase): - @patch.object(subprocess32, "Popen") + @patch.object(subprocess, "Popen") @patch("os.path.isfile") @patch("os.remove") def test_main(self, os_remove_mock, - os_path_isfile_mock, subprocess32_popen_mock): + os_path_isfile_mock, subprocess_popen_mock): facter1 = MagicMock() facter2 = MagicMock() - subprocess32_popen_mock.side_effect = [facter1, facter2] + subprocess_popen_mock.side_effect = [facter1, facter2] facter1.returncode = 77 facter2.returncode = 55 os_path_isfile_mock.return_value = True - if not (os.environ.has_key("PYTHON")): + if not ("PYTHON" in os.environ): os.environ['PYTHON'] = "test/python/path" sys.argv[0] = "test data" AmbariAgent.main() - self.assertTrue(subprocess32_popen_mock.called) - self.assertTrue(subprocess32_popen_mock.call_count == 2) + self.assertTrue(subprocess_popen_mock.called) + self.assertTrue(subprocess_popen_mock.call_count == 2) self.assertTrue(facter1.communicate.called) self.assertTrue(facter2.communicate.called) self.assertTrue(os_path_isfile_mock.called) diff --git a/ambari-agent/src/test/python/ambari_agent/TestAmbariConfig.py b/ambari-agent/src/test/python/ambari_agent/TestAmbariConfig.py index b958c3c9483..c2c3aabf81f 100644 --- a/ambari-agent/src/test/python/ambari_agent/TestAmbariConfig.py +++ b/ambari-agent/src/test/python/ambari_agent/TestAmbariConfig.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one diff --git a/ambari-agent/src/test/python/ambari_agent/TestAmsAlert.py b/ambari-agent/src/test/python/ambari_agent/TestAmsAlert.py index c525c9158f9..ff3ce34af05 100644 --- a/ambari-agent/src/test/python/ambari_agent/TestAmsAlert.py +++ b/ambari-agent/src/test/python/ambari_agent/TestAmsAlert.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -21,14 +21,14 @@ from unittest import TestCase from alerts.ams_alert import AmsAlert from mock.mock import Mock, MagicMock, patch -from AmbariConfig import AmbariConfig +from ambari_agent.AmbariConfig import AmbariConfig class TestAmsAlert(TestCase): def setUp(self): self.config = AmbariConfig() - @patch("httplib.HTTPConnection") + @patch("http.client.HTTPConnection") def test_collect_ok(self, conn_mock): alert_meta = { 'name': 'alert1', @@ -73,15 +73,15 @@ def test_collect_ok(self, conn_mock): expected_text = 'OK: 2' def collector_side_effect(clus, data): - self.assertEquals(data['name'], alert_meta['name']) - self.assertEquals(data['label'], alert_meta['label']) - self.assertEquals(data['text'], expected_text) - self.assertEquals(data['service'], alert_meta['serviceName']) - self.assertEquals(data['component'], alert_meta['componentName']) - self.assertEquals(data['uuid'], alert_meta['uuid']) - self.assertEquals(data['enabled'], alert_meta['enabled']) - self.assertEquals(data['cluster'], cluster) - self.assertEquals(clus, cluster) + self.assertEqual(data['name'], alert_meta['name']) + self.assertEqual(data['label'], alert_meta['label']) + self.assertEqual(data['text'], expected_text) + self.assertEqual(data['service'], alert_meta['serviceName']) + self.assertEqual(data['component'], alert_meta['componentName']) + self.assertEqual(data['uuid'], alert_meta['uuid']) + self.assertEqual(data['enabled'], alert_meta['enabled']) + self.assertEqual(data['cluster'], cluster) + self.assertEqual(clus, cluster) ca_connection = MagicMock() response = MagicMock() @@ -99,7 +99,7 @@ def collector_side_effect(clus, data): alert.collect() - @patch("httplib.HTTPConnection") + @patch("http.client.HTTPConnection") def test_collect_warn(self, conn_mock): alert_meta = { 'definitionId': 1, @@ -143,13 +143,13 @@ def test_collect_warn(self, conn_mock): cluster = 'c1' host = 'host1' cluster_id = '0' - expected_text = 'Warn: 4' + expected_text = 'Warn: 4.0' def collector_side_effect(clus, data): - self.assertEquals(data['name'], alert_meta['name']) - self.assertEquals(data['text'], expected_text) - self.assertEquals(data['clusterId'], cluster_id) - self.assertEquals(clus, cluster) + self.assertEqual(data['name'], alert_meta['name']) + self.assertEqual(data['text'], expected_text) + self.assertEqual(data['clusterId'], cluster_id) + self.assertEqual(clus, cluster) ca_connection = MagicMock() response = MagicMock() @@ -167,7 +167,7 @@ def collector_side_effect(clus, data): alert.collect() - @patch("httplib.HTTPConnection") + @patch("http.client.HTTPConnection") def test_collect_ok(self, conn_mock): alert_meta = { 'definitionId': 1, @@ -211,13 +211,13 @@ def test_collect_ok(self, conn_mock): cluster = 'c1' host = 'host1' cluster_id = '0' - expected_text = 'Crit: 10' + expected_text = 'Crit: 10.0' def collector_side_effect(clus, data): - self.assertEquals(data['name'], alert_meta['name']) - self.assertEquals(data['text'], expected_text) - self.assertEquals(data['clusterId'], cluster_id) - self.assertEquals(clus, cluster) + self.assertEqual(data['name'], alert_meta['name']) + self.assertEqual(data['text'], expected_text) + self.assertEqual(data['clusterId'], cluster_id) + self.assertEqual(clus, cluster) ca_connection = MagicMock() response = MagicMock() diff --git a/ambari-agent/src/test/python/ambari_agent/TestBaseAlert.py b/ambari-agent/src/test/python/ambari_agent/TestBaseAlert.py index a013c64c8af..ab965ecdf42 100644 --- a/ambari-agent/src/test/python/ambari_agent/TestBaseAlert.py +++ b/ambari-agent/src/test/python/ambari_agent/TestBaseAlert.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -20,7 +20,7 @@ from unittest import TestCase from alerts.base_alert import BaseAlert -from AmbariConfig import AmbariConfig +from ambari_agent.AmbariConfig import AmbariConfig class TestBaseAlert(TestCase): @@ -33,7 +33,7 @@ def test_interval_noData(self): alert = BaseAlert(alert_meta, alert_source_meta, self.config) interval = alert.interval() - self.assertEquals(interval, 1) + self.assertEqual(interval, 1) def test_interval_zero(self): alert_meta = {'interval': 0} @@ -41,7 +41,7 @@ def test_interval_zero(self): alert = BaseAlert(alert_meta, alert_source_meta, self.config) interval = alert.interval() - self.assertEquals(interval, 1) + self.assertEqual(interval, 1) def test_interval(self): alert_meta = {'interval': 5} @@ -49,7 +49,7 @@ def test_interval(self): alert = BaseAlert(alert_meta, alert_source_meta, self.config) interval = alert.interval() - self.assertEquals(interval, 5) + self.assertEqual(interval, 5) def test_isEnabled(self): alert_meta = {'enabled': 'true'} @@ -57,7 +57,7 @@ def test_isEnabled(self): alert = BaseAlert(alert_meta, alert_source_meta, self.config) enabled = alert.is_enabled() - self.assertEquals(enabled, 'true') + self.assertEqual(enabled, 'true') def test_getName(self): alert_meta = {'name': 'ambari'} @@ -65,7 +65,7 @@ def test_getName(self): alert = BaseAlert(alert_meta, alert_source_meta, self.config) name = alert.get_name() - self.assertEquals(name, 'ambari') + self.assertEqual(name, 'ambari') def test_getUuid(self): alert_meta = {'uuid': '123'} @@ -73,7 +73,7 @@ def test_getUuid(self): alert = BaseAlert(alert_meta, alert_source_meta, self.config) uuid = alert.get_uuid() - self.assertEquals(uuid, '123') + self.assertEqual(uuid, '123') def test_setCluster(self): alert_meta = {} @@ -84,5 +84,5 @@ def test_setCluster(self): alert = BaseAlert(alert_meta, alert_source_meta, self.config) alert.set_cluster(cluster, cluster_id, host) - self.assertEquals(alert.cluster_name, cluster) - self.assertEquals(alert.host_name, host) + self.assertEqual(alert.cluster_name, cluster) + self.assertEqual(alert.host_name, host) diff --git a/ambari-agent/src/test/python/ambari_agent/TestCertGeneration.py b/ambari-agent/src/test/python/ambari_agent/TestCertGeneration.py index cb3f8e99dd1..e816ba4e29b 100644 --- a/ambari-agent/src/test/python/ambari_agent/TestCertGeneration.py +++ b/ambari-agent/src/test/python/ambari_agent/TestCertGeneration.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one diff --git a/ambari-agent/src/test/python/ambari_agent/TestClusterConfigurationCache.py b/ambari-agent/src/test/python/ambari_agent/TestClusterConfigurationCache.py index 40d6e5ff4b5..822e3d27671 100644 --- a/ambari-agent/src/test/python/ambari_agent/TestClusterConfigurationCache.py +++ b/ambari-agent/src/test/python/ambari_agent/TestClusterConfigurationCache.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -72,7 +72,7 @@ def __get_cluster_configuration(self): operations have been mocked out :return: """ - with patch("__builtin__.open") as open_mock: + with patch("builtins.open") as open_mock: open_mock.side_effect = self.open_side_effect cluster_configuration = ClusterConfigurationCache(os.path.join(os.sep, "tmp", "bar", "baz")) return cluster_configuration diff --git a/ambari-agent/src/test/python/ambari_agent/TestCommandHooksOrchestrator.py b/ambari-agent/src/test/python/ambari_agent/TestCommandHooksOrchestrator.py index 29256fc35e9..f16dfbccedb 100644 --- a/ambari-agent/src/test/python/ambari_agent/TestCommandHooksOrchestrator.py +++ b/ambari-agent/src/test/python/ambari_agent/TestCommandHooksOrchestrator.py @@ -48,8 +48,8 @@ def test_check_orchestrator(self, is_file_mock): }, "START") self.assertTrue(ret) - self.assertEquals(len(ret.post_hooks), 3) - self.assertEquals(len(ret.pre_hooks), 3) + self.assertEqual(len(ret.post_hooks), 3) + self.assertEqual(len(ret.pre_hooks), 3) def test_hook_seq_builder(self): seq = list(HookSequenceBuilder().build(HookPrefix.pre, "cmd", "srv", "role")) @@ -68,8 +68,8 @@ def test_hook_seq_builder(self): "after-cmd" ] - self.assertEquals(seq, check_list) - self.assertEquals(seq_rev, check_list_1) + self.assertEqual(seq, check_list) + self.assertEqual(seq_rev, check_list_1) def test_hook_resolved(self): def pre(): diff --git a/ambari-agent/src/test/python/ambari_agent/TestCommandStatusDict.py b/ambari-agent/src/test/python/ambari_agent/TestCommandStatusDict.py index f2f2eda3bf0..a495ab18a17 100644 --- a/ambari-agent/src/test/python/ambari_agent/TestCommandStatusDict.py +++ b/ambari-agent/src/test/python/ambari_agent/TestCommandStatusDict.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -33,11 +33,11 @@ def test_put_command_status(self): execution_command = { 'commandType': 'EXECUTION_COMMAND', 'commandId': '1-1', - 'clusterName': u'cc', + 'clusterName': 'cc', 'exitCode': 777, - 'role': u'DATANODE', - 'roleCommand': u'INSTALL', - 'serviceName': u'HDFS', + 'role': 'DATANODE', + 'roleCommand': 'INSTALL', + 'serviceName': 'HDFS', 'taskId': 5 } status_command = { @@ -57,11 +57,11 @@ def test_put_and_generate(self): command_in_progress1 = { 'commandType': 'EXECUTION_COMMAND', 'commandId': '1-1', - 'clusterName': u'cc', + 'clusterName': 'cc', 'exitCode': 777, - 'role': u'DATANODE', - 'roleCommand': u'INSTALL', - 'serviceName': u'HDFS', + 'role': 'DATANODE', + 'roleCommand': 'INSTALL', + 'serviceName': 'HDFS', 'stderr': '', 'stdout': "notice: /Stage[1]/Hdp::Iptables/Service[iptables]/ensure: ensure changed 'running' to 'stopped'\nnotice: /Stage[1]/Hdp/File[/tmp/changeUid.sh]/ensure: defined content as '{md5}32b994a2e970f8acc3c91c198b484654'\nnotice: /Stage[1]/Hdp::Snappy::Package/Hdp::Package[snappy]/Hdp::Package::Process_pkg[snappy]/Package[snappy]/ensure: created\nnotice: /Stage[1]/Hdp::Snmp/Hdp::Package[snmp]/Hdp::Package::Process_pkg[snmp]/Package[net-snmp-utils]/ensure: created", 'taskId': 5 @@ -73,11 +73,11 @@ def test_put_and_generate(self): command_in_progress2 = { 'commandType': 'EXECUTION_COMMAND', 'commandId': '1-1', - 'role': u'DATANODE', - 'roleCommand': u'INSTALL', + 'role': 'DATANODE', + 'roleCommand': 'INSTALL', 'taskId': 6, - 'clusterName': u'cc', - 'serviceName': u'HDFS', + 'clusterName': 'cc', + 'serviceName': 'HDFS', } command_in_progress2_report = { 'status': 'IN_PROGRESS', @@ -85,12 +85,12 @@ def test_put_and_generate(self): } finished_command = { 'commandType': 'EXECUTION_COMMAND', - 'role': u'DATANODE', - 'roleCommand': u'INSTALL', + 'role': 'DATANODE', + 'roleCommand': 'INSTALL', 'commandId': '1-1', 'taskId': 4, - 'clusterName': u'cc', - 'serviceName': u'HDFS', + 'clusterName': 'cc', + 'serviceName': 'HDFS', } finished_command_report = { 'status': 'COMPLETE', @@ -98,12 +98,12 @@ def test_put_and_generate(self): } failed_command = { 'commandType': 'EXECUTION_COMMAND', - 'role': u'DATANODE', - 'roleCommand': u'INSTALL', + 'role': 'DATANODE', + 'roleCommand': 'INSTALL', 'commandId': '1-1', 'taskId': 3, - 'clusterName': u'cc', - 'serviceName': u'HDFS', + 'clusterName': 'cc', + 'serviceName': 'HDFS', } failed_command_report = { 'status': 'FAILED', @@ -128,26 +128,26 @@ def test_put_and_generate(self): 'reports': [{'status': 'FAILED', 'taskId': 3}, {'status': 'COMPLETE', 'taskId': 4}, {'status': 'IN_PROGRESS', 'stderr': '...', - 'stdout': '...', 'clusterName': u'cc', + 'stdout': '...', 'clusterName': 'cc', 'structuredOut' : '{}', - 'roleCommand': u'INSTALL', 'serviceName': u'HDFS', - 'role': u'DATANODE', 'actionId': '1-1', 'taskId': 5, + 'roleCommand': 'INSTALL', 'serviceName': 'HDFS', + 'role': 'DATANODE', 'actionId': '1-1', 'taskId': 5, 'exitCode': 777}, {'status': 'IN_PROGRESS', 'stderr': '...', 'stdout': '...', 'structuredOut' : '{}', - 'clusterName': u'cc', - 'roleCommand': u'INSTALL', - 'serviceName': u'HDFS', - 'role': u'DATANODE', + 'clusterName': 'cc', + 'roleCommand': 'INSTALL', + 'serviceName': 'HDFS', + 'role': 'DATANODE', 'actionId': '1-1', 'taskId': 6, 'exitCode': 777}] } - self.assertEquals(report, expected) + self.assertEqual(report, expected) - @patch("__builtin__.open") + @patch("builtins.open") def test_structured_output(self, open_mock): callback_mock = MagicMock() commandStatuses = CommandStatusDict(callback_action = callback_mock) @@ -158,11 +158,11 @@ def test_structured_output(self, open_mock): command_in_progress1 = { 'commandType': 'EXECUTION_COMMAND', 'commandId': '1-1', - 'clusterName': u'cc', + 'clusterName': 'cc', 'exitCode': 777, - 'role': u'DATANODE', - 'roleCommand': u'INSTALL', - 'serviceName': u'HDFS', + 'role': 'DATANODE', + 'roleCommand': 'INSTALL', + 'serviceName': 'HDFS', 'stderr': '', 'stdout': "notice: /Stage[1]/Hdp::Iptables/Service[iptables]/ensure: ensure changed 'running' to 'stopped'\nnotice: /Stage[1]/Hdp/File[/tmp/changeUid.sh]/ensure: defined content as '{md5}32b994a2e970f8acc3c91c198b484654'\nnotice: /Stage[1]/Hdp::Snappy::Package/Hdp::Package[snappy]/Hdp::Package::Process_pkg[snappy]/Package[snappy]/ensure: created\nnotice: /Stage[1]/Hdp::Snmp/Hdp::Package[snmp]/Hdp::Package::Process_pkg[snmp]/Package[net-snmp-utils]/ensure: created", 'taskId': 5 @@ -177,14 +177,14 @@ def test_structured_output(self, open_mock): expected = \ {'componentStatus': [], 'reports': [{'status': 'IN_PROGRESS', 'stderr': '...', - 'stdout': '...', 'clusterName': u'cc', + 'stdout': '...', 'clusterName': 'cc', 'structuredOut': '{"var1":"test1", "var2":"test2"}', - 'roleCommand': u'INSTALL', - 'serviceName': u'HDFS', - 'role': u'DATANODE', + 'roleCommand': 'INSTALL', + 'serviceName': 'HDFS', + 'role': 'DATANODE', 'actionId': '1-1', 'taskId': 5, 'exitCode': 777}] } - self.assertEquals(report, expected) + self.assertEqual(report, expected) def test_size_approved(self): # as json: '{"status": "IN_PROGRESS", "structuredOut": "structured_out.tmp", "taskId": 5}', length=77 diff --git a/ambari-agent/src/test/python/ambari_agent/TestConfigurationBuilder.py b/ambari-agent/src/test/python/ambari_agent/TestConfigurationBuilder.py index 71c1a12cbe8..e45fc939c7e 100644 --- a/ambari-agent/src/test/python/ambari_agent/TestConfigurationBuilder.py +++ b/ambari-agent/src/test/python/ambari_agent/TestConfigurationBuilder.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one diff --git a/ambari-agent/src/test/python/ambari_agent/TestCustomServiceOrchestrator.py b/ambari-agent/src/test/python/ambari_agent/TestCustomServiceOrchestrator.py index 110a94387f1..d53e86b972d 100644 --- a/ambari-agent/src/test/python/ambari_agent/TestCustomServiceOrchestrator.py +++ b/ambari-agent/src/test/python/ambari_agent/TestCustomServiceOrchestrator.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -17,7 +17,7 @@ See the License for the specific language governing permissions and limitations under the License. ''' -import ConfigParser +import configparser from multiprocessing.pool import ThreadPool import os @@ -34,7 +34,7 @@ from threading import Thread from mock.mock import MagicMock, patch -import StringIO +import io import sys from ambari_agent.ActionQueue import ActionQueue @@ -54,13 +54,13 @@ class TestCustomServiceOrchestrator:#(TestCase): def setUp(self): # disable stdout - out = StringIO.StringIO() + out = io.StringIO() sys.stdout = out # generate sample config tmpdir = tempfile.gettempdir() exec_tmp_dir = os.path.join(tmpdir, 'tmp') self.config = AmbariConfig() - self.config.config = ConfigParser.RawConfigParser() + self.config.config = configparser.RawConfigParser() self.config.add_section('agent') self.config.set('agent', 'prefix', tmpdir) self.config.set('agent', 'cache_dir', "/cachedir") @@ -79,21 +79,21 @@ def test_dump_command_to_json_with_retry(self, FileCache_mock, unlink_mock, hostname_mock.return_value = "test.hst" command = { 'commandType': 'EXECUTION_COMMAND', - 'role': u'DATANODE', - 'roleCommand': u'INSTALL', + 'role': 'DATANODE', + 'roleCommand': 'INSTALL', 'commandId': '1-1', 'taskId': 3, - 'clusterName': u'cc', - 'serviceName': u'HDFS', + 'clusterName': 'cc', + 'serviceName': 'HDFS', 'configurations':{'global' : {}}, 'configurationTags':{'global' : { 'tag': 'v1' }}, 'clusterHostInfo':{'namenode_host' : ['1'], 'slave_hosts' : ['0', '1'], - 'all_racks' : [u'/default-rack:0'], + 'all_racks' : ['/default-rack:0'], 'ambari_server_host' : 'a.b.c', 'ambari_server_port' : '123', 'ambari_server_use_ssl' : 'false', - 'all_ipv4_ips' : [u'192.168.12.101:0'], + 'all_ipv4_ips' : ['192.168.12.101:0'], 'all_hosts' : ['h1.hortonworks.com', 'h2.hortonworks.com'], 'all_ping_ports': ['8670:0,1']}, 'hostLevelParams':{} @@ -110,7 +110,7 @@ def test_dump_command_to_json_with_retry(self, FileCache_mock, unlink_mock, self.assertTrue(os.path.exists(json_file)) self.assertTrue(os.path.getsize(json_file) > 0) if get_platform() != PLATFORM_WINDOWS: - self.assertEqual(oct(os.stat(json_file).st_mode & 0777), '0600') + self.assertEqual(oct(os.stat(json_file).st_mode & 0o777), '0600') self.assertTrue(json_file.endswith("command-3.json")) os.unlink(json_file) # Test dumping STATUS_COMMAND @@ -118,11 +118,11 @@ def test_dump_command_to_json_with_retry(self, FileCache_mock, unlink_mock, self.assertTrue(os.path.exists(json_file)) self.assertTrue(os.path.getsize(json_file) > 0) if get_platform() != PLATFORM_WINDOWS: - self.assertEqual(oct(os.stat(json_file).st_mode & 0777), '0600') + self.assertEqual(oct(os.stat(json_file).st_mode & 0o777), '0600') self.assertTrue(json_file.endswith("command-3.json")) os.unlink(json_file) # Testing side effect of dump_command_to_json - self.assertNotEquals(command['clusterHostInfo'], {}) + self.assertNotEqual(command['clusterHostInfo'], {}) self.assertTrue(unlink_mock.called) @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) @@ -241,10 +241,10 @@ def return_traceback(*args, **kwargs): ret = orchestrator.runCommand(command, "out.txt", "err.txt", forced_command_name=CustomServiceOrchestrator.SCRIPT_TYPE_PYTHON) ## Check that override_output_files was true only during first call - print run_file_mock - self.assertEquals(run_file_mock.call_args_list[0][0][8], True) - self.assertEquals(run_file_mock.call_args_list[1][0][8], False) - self.assertEquals(run_file_mock.call_args_list[2][0][8], False) + print(run_file_mock) + self.assertEqual(run_file_mock.call_args_list[0][0][8], True) + self.assertEqual(run_file_mock.call_args_list[1][0][8], False) + self.assertEqual(run_file_mock.call_args_list[2][0][8], False) ## Check that forced_command_name was taken into account self.assertEqual(run_file_mock.call_args_list[0][0][1][0], CustomServiceOrchestrator.SCRIPT_TYPE_PYTHON) @@ -334,11 +334,11 @@ def side_effect(*args, **kwargs): ret = async_result.get() self.assertEqual(ret['exitcode'], 1) - self.assertEquals(ret['stdout'], 'killed\nCommand aborted. Reason: \'reason\'') - self.assertEquals(ret['stderr'], 'killed\nCommand aborted. Reason: \'reason\'') + self.assertEqual(ret['stdout'], 'killed\nCommand aborted. Reason: \'reason\'') + self.assertEqual(ret['stderr'], 'killed\nCommand aborted. Reason: \'reason\'') self.assertTrue(kill_process_with_children_mock.called) - self.assertFalse(command['taskId'] in orchestrator.commands_in_progress.keys()) + self.assertFalse(command['taskId'] in list(orchestrator.commands_in_progress.keys())) self.assertTrue(os.path.exists(out)) self.assertTrue(os.path.exists(err)) try: @@ -415,7 +415,7 @@ def command_complete_w(process_condenced_result, handle): complete_done.notifyAll() with lock: - self.assertTrue(complete_was_called.has_key('visited')) + self.assertTrue('visited' in complete_was_called) time.sleep(.1) diff --git a/ambari-agent/src/test/python/ambari_agent/TestDataCleaner.py b/ambari-agent/src/test/python/ambari_agent/TestDataCleaner.py index 02b69ac830f..19500634741 100644 --- a/ambari-agent/src/test/python/ambari_agent/TestDataCleaner.py +++ b/ambari-agent/src/test/python/ambari_agent/TestDataCleaner.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # -*- coding: utf-8 -*- ''' diff --git a/ambari-agent/src/test/python/ambari_agent/TestFileCache.py b/ambari-agent/src/test/python/ambari_agent/TestFileCache.py index 829f0659514..aeb97bf4238 100644 --- a/ambari-agent/src/test/python/ambari_agent/TestFileCache.py +++ b/ambari-agent/src/test/python/ambari_agent/TestFileCache.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -17,7 +17,7 @@ See the License for the specific language governing permissions and limitations under the License. ''' -import ConfigParser +import configparser import os import pprint @@ -31,7 +31,7 @@ from ambari_agent.FileCache import FileCache, CachingException from ambari_agent.AmbariConfig import AmbariConfig from mock.mock import MagicMock, patch -import StringIO +import io import sys import shutil @@ -40,11 +40,11 @@ class TestFileCache(TestCase): def setUp(self): # disable stdout - out = StringIO.StringIO() + out = io.StringIO() sys.stdout = out # generate sample config tmpdir = tempfile.gettempdir() - self.config = ConfigParser.RawConfigParser() + self.config = configparser.RawConfigParser() self.config.add_section('agent') self.config.add_section('agentConfig') self.config.set('agent', 'prefix', tmpdir) @@ -73,12 +73,12 @@ def test_get_service_base_dir(self, provide_directory_mock): } } res = fileCache.get_service_base_dir(command) - self.assertEquals( + self.assertEqual( pprint.pformat(provide_directory_mock.call_args_list[0][0]), "('/var/lib/ambari-agent/cache',\n " "{0},\n" " 'server_url_pref')".format(pprint.pformat(os.path.join('stacks', 'HDP', '2.1.1', 'services', 'ZOOKEEPER', 'package')))) - self.assertEquals(res, "dummy value") + self.assertEqual(res, "dummy value") @patch.object(FileCache, "provide_directory") @@ -108,12 +108,12 @@ def test_get_hook_base_dir(self, provide_directory_mock): provide_directory_mock.return_value = "dummy value" fileCache = FileCache(self.config) res = fileCache.get_hook_base_dir(command) - self.assertEquals( + self.assertEqual( pprint.pformat(provide_directory_mock.call_args_list[0][0]), "('/var/lib/ambari-agent/cache', " "{0}, " "'server_url_pref')".format(pprint.pformat('stack-hooks'))) - self.assertEquals(res, "dummy value") + self.assertEqual(res, "dummy value") @patch.object(FileCache, "provide_directory") @@ -125,10 +125,10 @@ def test_get_custom_actions_base_dir(self, provide_directory_mock): 'jdk_location': 'server_url_pref' } }) - self.assertEquals( + self.assertEqual( pprint.pformat(provide_directory_mock.call_args_list[0][0]), "('/var/lib/ambari-agent/cache', 'custom_actions', 'server_url_pref')") - self.assertEquals(res, "dummy value") + self.assertEqual(res, "dummy value") @patch.object(FileCache, "provide_directory") @@ -145,10 +145,10 @@ def test_get_custom_resources_subdir(self, provide_directory_mock): } res = fileCache.get_custom_resources_subdir(command) - self.assertEquals( + self.assertEqual( pprint.pformat(provide_directory_mock.call_args_list[0][0]), "('/var/lib/ambari-agent/cache', 'dashboards', 'server_url_pref')") - self.assertEquals(res, "dummy value") + self.assertEqual(res, "dummy value") @patch.object(FileCache, "build_download_url") @@ -161,7 +161,7 @@ def test_provide_directory_no_update(self, build_download_url_mock): path = os.path.join("cache_path", "subdirectory") res = fileCache.provide_directory("cache_path", "subdirectory", "server_url_prefix") - self.assertEquals(res, path) + self.assertEqual(res, path) self.assertFalse(build_download_url_mock.called) finally: self.config.set(AmbariConfig.AMBARI_PROPERTIES_CATEGORY, FileCache.ENABLE_AUTO_AGENT_CACHE_UPDATE_KEY, "true") @@ -193,10 +193,10 @@ def test_provide_directory(self, write_hash_sum_mock, unpack_archive_mock, "server_url_prefix") self.assertTrue(invalidate_directory_mock.called) self.assertTrue(write_hash_sum_mock.called) - self.assertEquals(fetch_url_mock.call_count, 2) - self.assertEquals(pprint.pformat(fileCache.uptodate_paths), + self.assertEqual(fetch_url_mock.call_count, 2) + self.assertEqual(pprint.pformat(fileCache.uptodate_paths), pprint.pformat([path])) - self.assertEquals(res, path) + self.assertEqual(res, path) fetch_url_mock.reset_mock() write_hash_sum_mock.reset_mock() @@ -212,11 +212,11 @@ def test_provide_directory(self, write_hash_sum_mock, unpack_archive_mock, "server_url_prefix") self.assertFalse(invalidate_directory_mock.called) self.assertFalse(write_hash_sum_mock.called) - self.assertEquals(fetch_url_mock.call_count, 1) + self.assertEqual(fetch_url_mock.call_count, 1) - self.assertEquals(pprint.pformat(fileCache.uptodate_paths), + self.assertEqual(pprint.pformat(fileCache.uptodate_paths), pprint.pformat([path])) - self.assertEquals(res, path) + self.assertEqual(res, path) fetch_url_mock.reset_mock() write_hash_sum_mock.reset_mock() @@ -228,10 +228,10 @@ def test_provide_directory(self, write_hash_sum_mock, unpack_archive_mock, "server_url_prefix") self.assertFalse(invalidate_directory_mock.called) self.assertFalse(write_hash_sum_mock.called) - self.assertEquals(fetch_url_mock.call_count, 0) - self.assertEquals(pprint.pformat(fileCache.uptodate_paths), + self.assertEqual(fetch_url_mock.call_count, 0) + self.assertEqual(pprint.pformat(fileCache.uptodate_paths), pprint.pformat([path])) - self.assertEquals(res, path) + self.assertEqual(res, path) # Check exception handling when tolerance is disabled self.config.set('agent', 'tolerate_download_failures', "false") @@ -243,7 +243,7 @@ def test_provide_directory(self, write_hash_sum_mock, unpack_archive_mock, self.fail('CachingException not thrown') except CachingException: pass # Expected - except Exception, e: + except Exception as e: self.fail('Unexpected exception thrown:' + str(e)) # Check that unexpected exceptions are still propagated when @@ -265,7 +265,7 @@ def test_provide_directory(self, write_hash_sum_mock, unpack_archive_mock, fileCache = FileCache(self.config) res = fileCache.provide_directory("cache_path", "subdirectory", "server_url_prefix") - self.assertEquals(res, path) + self.assertEqual(res, path) # Test empty archive fetch_url_mock.reset_mock() @@ -284,13 +284,13 @@ def test_provide_directory(self, write_hash_sum_mock, unpack_archive_mock, res = fileCache.provide_directory("cache_path", "subdirectory", "server_url_prefix") self.assertTrue(fetch_url_mock.return_value.strip() != read_hash_sum_mock.return_value.strip()) - self.assertEquals(build_download_url_mock.call_count, 2) - self.assertEquals(fetch_url_mock.call_count, 2) + self.assertEqual(build_download_url_mock.call_count, 2) + self.assertEqual(fetch_url_mock.call_count, 2) self.assertFalse(invalidate_directory_mock.called) self.assertFalse(unpack_archive_mock.called) self.assertFalse(write_hash_sum_mock.called) - self.assertEquals(pprint.pformat(fileCache.uptodate_paths), pprint.pformat([path])) - self.assertEquals(res, path) + self.assertEqual(pprint.pformat(fileCache.uptodate_paths), pprint.pformat([path])) + self.assertEqual(res, path) pass @@ -302,20 +302,20 @@ def test_build_download_url(self): 'http://localhost:8080/resources/stacks/HDP/2.1.1/hooks/archive.zip') - @patch("urllib2.OpenerDirector.open") + @patch("urllib.request.OpenerDirector.open") def test_fetch_url(self, urlopen_mock): fileCache = FileCache(self.config) remote_url = "http://dummy-url/" # Test normal download - test_str = 'abc' * 100000 # Very long string - test_string_io = StringIO.StringIO(test_str) + test_str = b'abc' * 100000 # Very long string + test_string_io = io.BytesIO(test_str) test_buffer = MagicMock() test_buffer.read.side_effect = test_string_io.read urlopen_mock.return_value = test_buffer memory_buffer = fileCache.fetch_url(remote_url) - self.assertEquals(memory_buffer.getvalue(), test_str) + self.assertEqual(memory_buffer.getvalue(), test_str) self.assertEqual(test_buffer.read.call_count, 20) # depends on buffer size # Test exception handling test_buffer.read.side_effect = self.exc_side_effect @@ -324,30 +324,30 @@ def test_fetch_url(self, urlopen_mock): self.fail('CachingException not thrown') except CachingException: pass # Expected - except Exception, e: + except Exception as e: self.fail('Unexpected exception thrown:' + str(e)) def test_read_write_hash_sum(self): tmpdir = tempfile.mkdtemp() - dummyhash = "DUMMY_HASH" + dummyhash = b"DUMMY_HASH" fileCache = FileCache(self.config) fileCache.write_hash_sum(tmpdir, dummyhash) newhash = fileCache.read_hash_sum(tmpdir) - self.assertEquals(newhash, dummyhash) + self.assertEqual(newhash, dummyhash) shutil.rmtree(tmpdir) # Test read of not existing file newhash = fileCache.read_hash_sum(tmpdir) - self.assertEquals(newhash, None) + self.assertEqual(newhash, None) # Test write to not existing file - with patch("__builtin__.open") as open_mock: + with patch("builtins.open") as open_mock: open_mock.side_effect = self.exc_side_effect try: fileCache.write_hash_sum(tmpdir, dummyhash) self.fail('CachingException not thrown') except CachingException: pass # Expected - except Exception, e: + except Exception as e: self.fail('Unexpected exception thrown:' + str(e)) @@ -413,7 +413,7 @@ def test_invalidate_directory(self, makedirs_mock, rmtree_mock, self.fail('CachingException not thrown') except CachingException: pass # Expected - except Exception, e: + except Exception as e: self.fail('Unexpected exception thrown:' + str(e)) @@ -434,9 +434,9 @@ def test_unpack_archive(self): fp = os.path.join(dirpath, f) total_size += os.path.getsize(fp) total_files += 1 - self.assertEquals(total_size, 51258L) - self.assertEquals(total_files, 28) - self.assertEquals(total_dirs, 8) + self.assertEqual(total_size, 51258) + self.assertEqual(total_files, 28) + self.assertEqual(total_dirs, 8) shutil.rmtree(tmpdir) # Test exception handling @@ -447,7 +447,7 @@ def test_unpack_archive(self): self.fail('CachingException not thrown') except CachingException: pass # Expected - except Exception, e: + except Exception as e: self.fail('Unexpected exception thrown:' + str(e)) diff --git a/ambari-agent/src/test/python/ambari_agent/TestGrep.py b/ambari-agent/src/test/python/ambari_agent/TestGrep.py index dbb723ab4d7..989ffb68bd7 100644 --- a/ambari-agent/src/test/python/ambari_agent/TestGrep.py +++ b/ambari-agent/src/test/python/ambari_agent/TestGrep.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -39,7 +39,7 @@ def setUp(self): def test_grep_many_lines(self): fragment = self.grep.grep(self.string_bad, "err", 1000, 1000) desired = self.string_bad.strip() - self.assertEquals(fragment, desired, "Grep grep function should return all lines if there are less lines than n") + self.assertEqual(fragment, desired, "Grep grep function should return all lines if there are less lines than n") def test_grep_few_lines(self): @@ -53,28 +53,28 @@ def test_grep_few_lines(self): debug: /Schedule[puppet]: Skipping device resources because running on a host debug: Finishing transaction 70171639726240 """.replace("\n", os.linesep).strip() - self.assertEquals(fragment, desired, "Grep grep function should return only last 3 lines of file") + self.assertEqual(fragment, desired, "Grep grep function should return only last 3 lines of file") def test_grep_no_result(self): fragment = self.grep.grep(self.string_good, "Err", 3, 3) desired = None - self.assertEquals(fragment, desired, 'Grep grep function should return None if result is not found') + self.assertEqual(fragment, desired, 'Grep grep function should return None if result is not found') def test_grep_empty_string(self): fragment = self.grep.grep("", "Err", 1000, 1000) desired = None - self.assertEquals(fragment, desired, 'Grep grep function should return None for empty string') + self.assertEqual(fragment, desired, 'Grep grep function should return None for empty string') def test_grep_all(self): fragment = self.grep.grep(self.string_bad, "Err", 35, 9) desired = self.string_bad.strip() - self.assertEquals(fragment, desired, 'Grep grep function contains bug in index arithmetics') + self.assertEqual(fragment, desired, 'Grep grep function contains bug in index arithmetics') def test_tail_many_lines(self): fragment = self.grep.tail(self.string_good, 1000) desired = self.string_good.strip() - self.assertEquals(fragment, desired, "Grep tail function should return all lines if there are less lines than n") + self.assertEqual(fragment, desired, "Grep tail function should return all lines if there are less lines than n") def test_tail_few_lines(self): fragment = self.grep.tail(self.string_good, 3) @@ -83,25 +83,25 @@ def test_tail_few_lines(self): debug: Received report to process from ambari-dmi debug: Processing report from ambari-dmi with processor Puppet::Reports::Store """.replace("\n", os.linesep).strip() - self.assertEquals(fragment, desired, "Grep tail function should return only last 3 lines of file") + self.assertEqual(fragment, desired, "Grep tail function should return only last 3 lines of file") def test_tail_no_lines(self): fragment = self.grep.tail("", 3) desired = '' - self.assertEquals(fragment, desired, 'Grep tail function should return "" for empty string') + self.assertEqual(fragment, desired, 'Grep tail function should return "" for empty string') def test_tail_all(self): fragment = self.grep.tail("", 47) desired = '' - self.assertEquals(fragment, desired, 'Grep tail function contains bug in index arithmetics') + self.assertEqual(fragment, desired, 'Grep tail function contains bug in index arithmetics') def test_tail_by_symbols_many_lines(self): desired_size = len(self.string_good.strip()) fragment = self.grep.tail_by_symbols(self.string_good, desired_size) desired = self.string_good.strip() - self.assertEquals(fragment, desired, "Grep tail function should return all symbols if there are less symbols than n") - self.assertEquals(len(fragment), desired_size, "Grep tail function should return all symbols if there are less symbols than n") + self.assertEqual(fragment, desired, "Grep tail function should return all symbols if there are less symbols than n") + self.assertEqual(len(fragment), desired_size, "Grep tail function should return all symbols if there are less symbols than n") def test_tail_by_symbols_few_lines(self): original = """ @@ -113,18 +113,18 @@ def test_tail_by_symbols_few_lines(self): desired_size = len(original) fragment = self.grep.tail_by_symbols(self.string_good, desired_size) - self.assertEquals(fragment, desired, "Grep tail function should return only last 3 lines of file") + self.assertEqual(fragment, desired, "Grep tail function should return only last 3 lines of file") fragment = self.grep.tail_by_symbols(self.string_good, desired_size - 1) - self.assertEquals(fragment, desired, "Grep tail function should return only last 2 lines of file") + self.assertEqual(fragment, desired, "Grep tail function should return only last 2 lines of file") fragment = self.grep.tail_by_symbols(self.string_good, desired_size + 1) - self.assertEquals(fragment, desired, "Grep tail function should return only last 3 lines of file") + self.assertEqual(fragment, desired, "Grep tail function should return only last 3 lines of file") def test_tail_by_symbols_no_lines(self): fragment = self.grep.tail_by_symbols("", 3) desired = '' - self.assertEquals(fragment, desired, 'Grep tail function should return "" for empty string') + self.assertEqual(fragment, desired, 'Grep tail function should return "" for empty string') def tearDown(self): pass @@ -136,6 +136,6 @@ def test_cleanByTemplate(self): err: /Stage[main]//Exec[command_good]/returns: change from notrun to 0 failed: wget e432423423xample.com/badurl444111 returned 4 instead of one of [0] at /root/puppet-learn/2-bad.pp:5 notice: Finished catalog run in 0.23 seconds """.replace("\n", os.linesep).strip() - self.assertEquals(fragment, desired, 'Grep cleanByTemplate function should return string without debug lines.') + self.assertEqual(fragment, desired, 'Grep cleanByTemplate function should return string without debug lines.') diff --git a/ambari-agent/src/test/python/ambari_agent/TestHardware.py b/ambari-agent/src/test/python/ambari_agent/TestHardware.py index f015ea3e81e..f4461b0b2dd 100644 --- a/ambari-agent/src/test/python/ambari_agent/TestHardware.py +++ b/ambari-agent/src/test/python/ambari_agent/TestHardware.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one @@ -23,9 +23,9 @@ from unittest import TestCase from mock.mock import patch, MagicMock, Mock import unittest -import platform +import distro import socket -from ambari_commons import subprocess32 +import subprocess from only_for_platform import not_for_platform, PLATFORM_WINDOWS from ambari_agent import hostname from ambari_agent.Hardware import Hardware @@ -35,7 +35,7 @@ @not_for_platform(PLATFORM_WINDOWS) -@patch.object(platform, "linux_distribution", new=MagicMock(return_value=('Suse', '11', 'Final'))) +@patch.object(distro, "linux_distribution", new=MagicMock(return_value=('Suse', '11', 'Final'))) @patch.object(socket, "getfqdn", new=MagicMock(return_value="ambari.apache.org")) @patch.object(socket, "gethostbyname", new=MagicMock(return_value="192.168.1.1")) @patch.object(FacterLinux, "setDataIfConfigShortOutput", new=MagicMock(return_value='''Iface MTU Met RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg @@ -113,12 +113,12 @@ def chk_writable_mount_side_effect(path): result = Hardware(cache_info=False).osdisks() - self.assertEquals(1, len(result)) + self.assertEqual(1, len(result)) expected_mounts_left = ["/"] mounts_left = [item["mountpoint"] for item in result] - self.assertEquals(expected_mounts_left, mounts_left) + self.assertEqual(expected_mounts_left, mounts_left) @patch.object(Hardware, "_chk_writable_mount") @patch("ambari_agent.Hardware.path_isfile") @@ -135,16 +135,16 @@ def test_osdisks_no_ignore_property(self, shell_call_mock, isfile_mock, chk_writ config = AmbariConfig() # check, that config do not define ignore_mount_points property - self.assertEquals("test", config.get('agent', 'ignore_mount_points', default="test")) + self.assertEqual("test", config.get('agent', 'ignore_mount_points', default="test")) result = Hardware(config=config, cache_info=False).osdisks() - self.assertEquals(1, len(result)) + self.assertEqual(1, len(result)) expected_mounts_left = ["/"] mounts_left = [item["mountpoint"] for item in result] - self.assertEquals(expected_mounts_left, mounts_left) + self.assertEqual(expected_mounts_left, mounts_left) @patch.object(OSCheck, "get_os_type") @patch.object(OSCheck, "get_os_version") @@ -154,34 +154,34 @@ def test_osdisks_remote(self, shell_call_mock, get_os_version_mock, get_os_type_ get_os_version_mock.return_value = "11" Hardware(cache_info=False).osdisks() timeout = 10 - shell_call_mock.assert_called_with(['timeout', str(timeout), "df", "-kPT", "-l"], stdout = subprocess32.PIPE, stderr = subprocess32.PIPE, timeout = timeout, quiet = True) + shell_call_mock.assert_called_with(['timeout', str(timeout), "df", "-kPT", "-l"], stdout = subprocess.PIPE, stderr = subprocess.PIPE, timeout = timeout, quiet = True) config = AmbariConfig() Hardware(config=config, cache_info=False).osdisks() - shell_call_mock.assert_called_with(['timeout', str(timeout), "df", "-kPT", "-l"], stdout = subprocess32.PIPE, stderr = subprocess32.PIPE, timeout = timeout, quiet = True) + shell_call_mock.assert_called_with(['timeout', str(timeout), "df", "-kPT", "-l"], stdout = subprocess.PIPE, stderr = subprocess.PIPE, timeout = timeout, quiet = True) config.add_section(AmbariConfig.AMBARI_PROPERTIES_CATEGORY) config.set(AmbariConfig.AMBARI_PROPERTIES_CATEGORY, Hardware.CHECK_REMOTE_MOUNTS_KEY, "true") Hardware(config=config, cache_info=False).osdisks() - shell_call_mock.assert_called_with(['timeout', str(timeout), "df", "-kPT"], stdout = subprocess32.PIPE, stderr = subprocess32.PIPE, timeout = timeout, quiet = True) + shell_call_mock.assert_called_with(['timeout', str(timeout), "df", "-kPT"], stdout = subprocess.PIPE, stderr = subprocess.PIPE, timeout = timeout, quiet = True) config.set(AmbariConfig.AMBARI_PROPERTIES_CATEGORY, Hardware.CHECK_REMOTE_MOUNTS_KEY, "false") Hardware(config=config, cache_info=False).osdisks() - shell_call_mock.assert_called_with(['timeout', str(timeout), "df", "-kPT", "-l"], stdout = subprocess32.PIPE, stderr = subprocess32.PIPE, timeout = timeout, quiet = True) + shell_call_mock.assert_called_with(['timeout', str(timeout), "df", "-kPT", "-l"], stdout = subprocess.PIPE, stderr = subprocess.PIPE, timeout = timeout, quiet = True) config.set(AmbariConfig.AMBARI_PROPERTIES_CATEGORY, Hardware.CHECK_REMOTE_MOUNTS_TIMEOUT_KEY, "0") Hardware(config=config, cache_info=False).osdisks() - shell_call_mock.assert_called_with(['timeout', str(timeout), "df", "-kPT", "-l"], stdout = subprocess32.PIPE, stderr = subprocess32.PIPE, timeout = timeout, quiet = True) + shell_call_mock.assert_called_with(['timeout', str(timeout), "df", "-kPT", "-l"], stdout = subprocess.PIPE, stderr = subprocess.PIPE, timeout = timeout, quiet = True) timeout = 1 config.set(AmbariConfig.AMBARI_PROPERTIES_CATEGORY, Hardware.CHECK_REMOTE_MOUNTS_TIMEOUT_KEY, str(timeout)) Hardware(config=config, cache_info=False).osdisks() - shell_call_mock.assert_called_with(['timeout', str(timeout), "df", "-kPT", "-l"], stdout = subprocess32.PIPE, stderr = subprocess32.PIPE, timeout = timeout, quiet = True) + shell_call_mock.assert_called_with(['timeout', str(timeout), "df", "-kPT", "-l"], stdout = subprocess.PIPE, stderr = subprocess.PIPE, timeout = timeout, quiet = True) timeout = 2 config.set(AmbariConfig.AMBARI_PROPERTIES_CATEGORY, Hardware.CHECK_REMOTE_MOUNTS_TIMEOUT_KEY, str(timeout)) Hardware(config=config, cache_info=False).osdisks() - shell_call_mock.assert_called_with(['timeout', str(timeout), "df", "-kPT", "-l"], stdout = subprocess32.PIPE, stderr = subprocess32.PIPE, timeout = timeout, quiet = True) + shell_call_mock.assert_called_with(['timeout', str(timeout), "df", "-kPT", "-l"], stdout = subprocess.PIPE, stderr = subprocess.PIPE, timeout = timeout, quiet = True) def test_parse_df_line(self): df_line_sample = "device type size used available percent mountpoint" @@ -189,7 +189,7 @@ def test_parse_df_line(self): samples = [ { "sample": df_line_sample, - "expected": dict(zip(df_line_sample.split(), df_line_sample.split())) + "expected": dict(list(zip(df_line_sample.split(), df_line_sample.split()))) }, { "sample": "device type size used available percent", @@ -207,11 +207,11 @@ def test_parse_df_line(self): for sample in samples: try: - result = Hardware(cache_info=False)._parse_df([sample["sample"]]).next() + result = next(Hardware(cache_info=False)._parse_df([sample["sample"]])) except StopIteration: result = None - self.assertEquals(result, sample["expected"], "Failed with sample: '{0}', expected: {1}, got: {2}".format( + self.assertEqual(result, sample["expected"], "Failed with sample: '{0}', expected: {1}, got: {2}".format( sample["sample"], sample["expected"], result @@ -230,9 +230,9 @@ def test_fqdnDomainHostname(self, get_os_version_mock, get_os_type_mock, facter_ config = None result = Facter(config).facterInfo() - self.assertEquals(result['hostname'], "ambari") - self.assertEquals(result['domain'], "apache.org") - self.assertEquals(result['fqdn'], (result['hostname'] + '.' + result['domain'])) + self.assertEqual(result['hostname'], "ambari") + self.assertEqual(result['domain'], "apache.org") + self.assertEqual(result['fqdn'], (result['hostname'] + '.' + result['domain'])) @patch.object(FacterLinux, "get_ip_address_by_ifname", new=MagicMock(return_value=None)) @patch.object(FacterLinux, "setDataUpTimeOutput") @@ -246,9 +246,9 @@ def test_uptimeSecondsHoursDays(self, get_os_version_mock, get_os_type_mock, fac config = None result = Facter(config).facterInfo() - self.assertEquals(result['uptime_seconds'], '262813') - self.assertEquals(result['uptime_hours'], '73') - self.assertEquals(result['uptime_days'], '3') + self.assertEqual(result['uptime_seconds'], '262813') + self.assertEqual(result['uptime_hours'], '73') + self.assertEqual(result['uptime_days'], '3') @patch.object(FacterLinux, "get_ip_address_by_ifname", new=MagicMock(return_value=None)) @patch.object(FacterLinux, "setMemInfoOutput") @@ -274,11 +274,11 @@ def test_facterMemInfoOutput(self, getSystemResourceOverridesMock, get_os_versio config = None result = Facter(config).facterInfo() - self.assertEquals(result['memorysize'], 1832392) - self.assertEquals(result['memorytotal'], 1832392) - self.assertEquals(result['memoryfree'], 868648) - self.assertEquals(result['swapsize'], '2.04 GB') - self.assertEquals(result['swapfree'], '1.52 GB') + self.assertEqual(result['memorysize'], 1832392) + self.assertEqual(result['memorytotal'], 1832392) + self.assertEqual(result['memoryfree'], 868648) + self.assertEqual(result['swapsize'], '2.00 GB') + self.assertEqual(result['swapfree'], '1.00 GB') @patch("fcntl.ioctl") @patch("socket.socket") @@ -303,9 +303,10 @@ def test_facterDataIfConfigOutput(self, get_os_version_mock, get_os_type_mock, self.assertTrue(inet_ntoa_mock.called) self.assertTrue(get_ip_address_by_ifname_mock.called) self.assertTrue(getIpAddress_mock.called) - self.assertEquals(result['ipaddress'], '10.0.2.15') - self.assertEquals(result['netmask'], '255.255.255.0') - self.assertEquals(result['interfaces'], 'eth0,eth1,eth2,lo') + self.assertEqual(result['ipaddress'], '10.0.2.15') + self.assertEqual(result['netmask'], '255.255.255.0') + #self.assertEqual(result['interfaces'], "'eth0','eth1','eth2','lo'") + self.assertEqual(result['interfaces'], "eth0,eth1,eth2,lo") @patch("fcntl.ioctl") @patch("socket.socket") @@ -328,7 +329,7 @@ def test_facterDataIfConfigOutputNone(self, get_os_version_mock, get_os_type_moc result = Facter(config).facterInfo() self.assertTrue(get_ip_address_by_ifname_mock.called) - self.assertEquals(result['netmask'], None) + self.assertEqual(result['netmask'], None) @patch.object(FacterLinux, "get_ip_address_by_ifname", new=MagicMock(return_value=None)) @patch.object(OSCheck, "get_os_type") @@ -341,29 +342,29 @@ def test_facterDataOperatingsystemVsFamily(self, get_os_version_mock, get_os_fam config = None result = Facter(config).facterInfo() - self.assertEquals(result['operatingsystem'], 'some_type_of_os') - self.assertEquals(result['osfamily'], 'redhat') + self.assertEqual(result['operatingsystem'], 'some_type_of_os') + self.assertEqual(result['osfamily'], 'redhat') get_os_family_mock.return_value = "ubuntu" result = Facter(config).facterInfo() - self.assertEquals(result['operatingsystem'], 'some_type_of_os') - self.assertEquals(result['osfamily'], 'ubuntu') + self.assertEqual(result['operatingsystem'], 'some_type_of_os') + self.assertEqual(result['osfamily'], 'ubuntu') get_os_family_mock.return_value = "suse" result = Facter(config).facterInfo() - self.assertEquals(result['operatingsystem'], 'some_type_of_os') - self.assertEquals(result['osfamily'], 'suse') + self.assertEqual(result['operatingsystem'], 'some_type_of_os') + self.assertEqual(result['osfamily'], 'suse') get_os_family_mock.return_value = "My_new_family" result = Facter(config).facterInfo() - self.assertEquals(result['operatingsystem'], 'some_type_of_os') - self.assertEquals(result['osfamily'], 'My_new_family') + self.assertEqual(result['operatingsystem'], 'some_type_of_os') + self.assertEqual(result['osfamily'], 'My_new_family') @patch("os.path.exists") @patch("os.path.isdir") @patch("json.loads") @patch("glob.glob") - @patch("__builtin__.open") + @patch("builtins.open") @patch.object(OSCheck, "get_os_type") @patch.object(OSCheck, "get_os_version") @patch.object(FacterLinux, "resolve_ambari_config") @@ -400,10 +401,10 @@ def test_system_resource_overrides(self, resolve_ambari_config, get_os_version_m self.assertTrue(config.has_option.called) self.assertTrue(config.get.called) self.assertTrue(glob_mock.called) - self.assertEquals(2, file_handle.read.call_count) - self.assertEquals(2, open_mock.call_count) - self.assertEquals(2, json_mock.call_count) - self.assertEquals('value', result['key']) + self.assertEqual(2, file_handle.read.call_count) + self.assertEqual(2, open_mock.call_count) + self.assertEqual(2, json_mock.call_count) + self.assertEqual('value', result['key']) @patch.object(Hardware, "_chk_writable_mount") @patch("ambari_agent.Hardware.path_isfile") @@ -460,15 +461,15 @@ def has_option(section, key): result = Hardware(config=conf, cache_info=False).osdisks() - self.assertEquals(1, len(result)) + self.assertEqual(1, len(result)) expected_mounts_left = ["/"] mounts_left = [item["mountpoint"] for item in result] - self.assertEquals(expected_mounts_left, mounts_left) + self.assertEqual(expected_mounts_left, mounts_left) @not_for_platform(PLATFORM_WINDOWS) -@patch.object(platform, "linux_distribution", new=MagicMock(return_value=('Suse', '11', 'Final'))) +@patch.object(distro, "linux_distribution", new=MagicMock(return_value=('Suse', '11', 'Final'))) @patch.object(socket, "getfqdn", new=MagicMock(return_value="ambari.apache.org")) @patch.object(socket, "gethostbyname", new=MagicMock(return_value="192.168.1.1")) @patch.object(FacterLinux, "setDataIfConfigShortOutput", new=MagicMock(return_value='')) @@ -504,9 +505,9 @@ def test_facterDataIpLinkOutput(self, get_os_version_mock, self.assertTrue(inet_ntoa_mock.called) self.assertTrue(get_ip_address_by_ifname_mock.called) self.assertTrue(getIpAddress_mock.called) - self.assertEquals(result['ipaddress'], '10.0.2.15') - self.assertEquals(result['netmask'], '255.255.255.0') - self.assertEquals(result['interfaces'], 'lo,enp0s3,enp0s8') + self.assertEqual(result['ipaddress'], '10.0.2.15') + self.assertEqual(result['netmask'], '255.255.255.0') + self.assertEqual(result['interfaces'], 'lo,enp0s3,enp0s8') if __name__ == "__main__": diff --git a/ambari-agent/src/test/python/ambari_agent/TestHostCheckReportFileHandler.py b/ambari-agent/src/test/python/ambari_agent/TestHostCheckReportFileHandler.py index fcfc29eabe4..fe468d3a339 100644 --- a/ambari-agent/src/test/python/ambari_agent/TestHostCheckReportFileHandler.py +++ b/ambari-agent/src/test/python/ambari_agent/TestHostCheckReportFileHandler.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -25,7 +25,7 @@ import tempfile from ambari_agent.HostCheckReportFileHandler import HostCheckReportFileHandler import logging -import ConfigParser +import configparser class TestHostCheckReportFileHandler(TestCase): @@ -34,7 +34,7 @@ class TestHostCheckReportFileHandler(TestCase): def test_write_host_check_report_really_empty(self): tmpfile = tempfile.mktemp() - config = ConfigParser.RawConfigParser() + config = configparser.RawConfigParser() config.add_section('agent') config.set('agent', 'prefix', os.path.dirname(tmpfile)) @@ -42,12 +42,12 @@ def test_write_host_check_report_really_empty(self): mydict = {} handler.writeHostCheckFile(mydict) - configValidator = ConfigParser.RawConfigParser() + configValidator = configparser.RawConfigParser() configPath = os.path.join(os.path.dirname(tmpfile), HostCheckReportFileHandler.HOST_CHECK_FILE) configValidator.read(configPath) if configValidator.has_section('users'): users = configValidator.get('users', 'usr_list') - self.assertEquals(users, '') + self.assertEqual(users, '') @patch("os.path.exists") @@ -57,7 +57,7 @@ def test_write_host_check_report_empty(self, list_mock, exists_mock): exists_mock.return_value = False list_mock.return_value = [] - config = ConfigParser.RawConfigParser() + config = configparser.RawConfigParser() config.add_section('agent') config.set('agent', 'prefix', os.path.dirname(tmpfile)) @@ -73,22 +73,22 @@ def test_write_host_check_report_empty(self, list_mock, exists_mock): handler.writeHostCheckFile(mydict) - configValidator = ConfigParser.RawConfigParser() + configValidator = configparser.RawConfigParser() configPath = os.path.join(os.path.dirname(tmpfile), HostCheckReportFileHandler.HOST_CHECK_FILE) configValidator.read(configPath) users = configValidator.get('users', 'usr_list') users = configValidator.get('users', 'usr_homedir_list') - self.assertEquals(users, '') + self.assertEqual(users, '') names = configValidator.get('alternatives', 'symlink_list') targets = configValidator.get('alternatives', 'target_list') - self.assertEquals(names, '') - self.assertEquals(targets, '') + self.assertEqual(names, '') + self.assertEqual(targets, '') paths = configValidator.get('directories', 'dir_list') - self.assertEquals(paths, '') + self.assertEqual(paths, '') procs = configValidator.get('processes', 'proc_list') - self.assertEquals(procs, '') + self.assertEqual(procs, '') time = configValidator.get('metadata', 'created') self.assertTrue(time != None) @@ -100,7 +100,7 @@ def test_write_host_check_report(self, list_mock, exists_mock): exists_mock.return_value = False list_mock.return_value = [] - config = ConfigParser.RawConfigParser() + config = configparser.RawConfigParser() config.add_section('agent') config.set('agent', 'prefix', os.path.dirname(tmpfile)) @@ -120,13 +120,13 @@ def test_write_host_check_report(self, list_mock, exists_mock): ] handler.writeHostCheckFile(mydict) - configValidator = ConfigParser.RawConfigParser() + configValidator = configparser.RawConfigParser() configPath = os.path.join(os.path.dirname(tmpfile), HostCheckReportFileHandler.HOST_CHECK_FILE) configValidator.read(configPath) users = configValidator.get('users', 'usr_list') homedirs = configValidator.get('users', 'usr_homedir_list') - self.assertEquals(users, 'user1') - self.assertEquals(homedirs, '/var/log') + self.assertEqual(users, 'user1') + self.assertEqual(homedirs, '/var/log') names = configValidator.get('alternatives', 'symlink_list') targets = configValidator.get('alternatives', 'target_list') @@ -147,7 +147,7 @@ def test_write_host_check_report(self, list_mock, exists_mock): mydict['existing_repos'] = ['HDP', 'HDP-epel'] handler.writeHostChecksCustomActionsFile(mydict) - configValidator = ConfigParser.RawConfigParser() + configValidator = configparser.RawConfigParser() configPath_ca = os.path.join(os.path.dirname(tmpfile), HostCheckReportFileHandler.HOST_CHECK_CUSTOM_ACTIONS_FILE) configValidator.read(configPath_ca) @@ -168,7 +168,7 @@ def test_write_host_stack_list(self, list_mock, exists_mock): tmpfile = tempfile.mktemp() - config = ConfigParser.RawConfigParser() + config = configparser.RawConfigParser() config.add_section('agent') config.set('agent', 'prefix', os.path.dirname(tmpfile)) @@ -180,7 +180,7 @@ def test_write_host_stack_list(self, list_mock, exists_mock): handler.writeHostCheckFile(mydict) - configValidator = ConfigParser.RawConfigParser() + configValidator = configparser.RawConfigParser() configPath = os.path.join(os.path.dirname(tmpfile), HostCheckReportFileHandler.HOST_CHECK_FILE) configValidator.read(configPath) @@ -193,7 +193,7 @@ def chkItemsEqual(self, commaDelimited, items): items.sort() items1Str = ','.join(items1) items2Str = ','.join(items) - self.assertEquals(items2Str, items1Str) + self.assertEqual(items2Str, items1Str) if __name__ == "__main__": unittest.main(verbosity=2) diff --git a/ambari-agent/src/test/python/ambari_agent/TestHostCleanup.py b/ambari-agent/src/test/python/ambari_agent/TestHostCleanup.py index 9e1c87a9536..2f5deab45e2 100644 --- a/ambari-agent/src/test/python/ambari_agent/TestHostCleanup.py +++ b/ambari-agent/src/test/python/ambari_agent/TestHostCleanup.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -22,7 +22,7 @@ import unittest from mock.mock import patch, Mock, MagicMock, call, create_autospec from ambari_agent import HostCleanup -import StringIO +import io import sys import tempfile import os.path @@ -79,7 +79,7 @@ def setUp(self): HostCleanup.logger = MagicMock() self.hostcleanup = HostCleanup.HostCleanup() # disable stdout - out = StringIO.StringIO() + out = io.StringIO() sys.stdout = out @@ -89,7 +89,7 @@ def tearDown(self): @patch("os.listdir", create=True, autospec=True) def test_read_host_check_file_with_content(self, os_listdir_mock): - out = StringIO.StringIO() + out = io.StringIO() sys.stdout = out tmpfile = tempfile.mktemp() f = open(tmpfile,'w') @@ -147,7 +147,7 @@ def test_options(self, parser_mock, file_handler_mock, logging_mock, read_host_c # test --out file_handler_mock.assert_called_with('/someoutputfile') # test --skip - self.assertEquals([''],HostCleanup.SKIP_LIST) + self.assertEqual([''],HostCleanup.SKIP_LIST) #test --verbose logging_mock.assert_called_with(level=logging.INFO) # test --in @@ -197,7 +197,7 @@ def test_options_silent(self, parser_mock, file_handler_mock, logging_mock, read # test --out file_handler_mock.assert_called_with('/someoutputfile') # test --skip - self.assertEquals([''],HostCleanup.SKIP_LIST) + self.assertEqual([''],HostCleanup.SKIP_LIST) #test --verbose logging_mock.assert_called_with(level=logging.INFO) # test --in @@ -219,7 +219,7 @@ def test_do_cleanup_all(self, do_erase_packages_method, do_delete_users_method, do_erase_files_silent_method, do_kill_processes_method, get_os_type_method, find_repo_files_for_repos_method, do_erase_alternatives_method, get_additional_dirs_method, clear_cache_mock): - out = StringIO.StringIO() + out = io.StringIO() sys.stdout = out get_additional_dirs_method.return_value = ['/tmp/hadoop-yarn','/tmp/hsperfdata_007'] propertyMap = {PACKAGE_SECTION:['abcd', 'pqrst'], USER_SECTION:['abcd', 'pqrst'], @@ -270,7 +270,7 @@ def test_do_cleanup_default(self, do_erase_packages_method, do_delete_users_meth global SKIP_LIST oldSkipList = HostCleanup.SKIP_LIST HostCleanup.SKIP_LIST = ["users"] - out = StringIO.StringIO() + out = io.StringIO() sys.stdout = out propertyMap = {PACKAGE_SECTION:['abcd', 'pqrst'], USER_SECTION:['abcd', 'pqrst'], REPO_SECTION:['abcd', 'pqrst'], DIR_SECTION:['abcd', 'pqrst'], @@ -311,7 +311,7 @@ def test_do_cleanup_with_skip(self, do_erase_packages_method, get_os_type_method, find_repo_files_for_repos_method, clear_cache_mock, listdir_mock, join_mock, stat_mock): - out = StringIO.StringIO() + out = io.StringIO() sys.stdout = out propertyMap = {PACKAGE_SECTION:['abcd', 'pqrst'], USER_SECTION:['abcd', 'pqrst'], REPO_SECTION:['abcd', 'pqrst'], DIR_SECTION:['abcd', 'pqrst'], @@ -359,7 +359,7 @@ def test_do_delete_users(self, run_os_command_mock): @patch("os.listdir", create=True, autospec=True) def test_read_host_check_file(self, os_listdir_mock): - out = StringIO.StringIO() + out = io.StringIO() sys.stdout = out tmpfile = tempfile.mktemp() f = open(tmpfile,'w') @@ -368,12 +368,12 @@ def test_read_host_check_file(self, os_listdir_mock): propertyMap = self.hostcleanup.read_host_check_file(tmpfile) - self.assertTrue(propertyMap.has_key(PACKAGE_SECTION)) - self.assertTrue(propertyMap.has_key(REPO_SECTION)) - self.assertTrue(propertyMap.has_key(USER_SECTION)) - self.assertTrue(propertyMap.has_key(DIR_SECTION)) - self.assertTrue(propertyMap.has_key(PROCESS_SECTION)) - self.assertEquals(propertyMap[PROCESS_SECTION][PROCESS_KEY][0], "323") + self.assertTrue(PACKAGE_SECTION in propertyMap) + self.assertTrue(REPO_SECTION in propertyMap) + self.assertTrue(USER_SECTION in propertyMap) + self.assertTrue(DIR_SECTION in propertyMap) + self.assertTrue(PROCESS_SECTION in propertyMap) + self.assertEqual(propertyMap[PROCESS_SECTION][PROCESS_KEY][0], "323") sys.stdout = sys.__stdout__ @@ -381,7 +381,7 @@ def test_read_host_check_file(self, os_listdir_mock): @patch.object(HostCleanup.HostCleanup, 'run_os_command') @patch.object(OSCheck, "get_os_type") def test_do_erase_packages(self, get_os_type_method, run_os_command_method): - out = StringIO.StringIO() + out = io.StringIO() sys.stdout = out get_os_type_method.return_value = 'redhat' @@ -393,7 +393,7 @@ def test_do_erase_packages(self, get_os_type_method, run_os_command_method): self.assertTrue(run_os_command_method.called) run_os_command_method.assert_called_with("yum erase -y {0}".format(' ' .join(['abcd', 'wxyz']))) - self.assertEquals(0, retval) + self.assertEqual(0, retval) get_os_type_method.reset() run_os_command_method.reset() @@ -407,7 +407,7 @@ def test_do_erase_packages(self, get_os_type_method, run_os_command_method): self.assertTrue(run_os_command_method.called) run_os_command_method.assert_called_with("zypper -n -q remove {0}" .format(' '.join(['abcd', 'wxyz']))) - self.assertEquals(0, retval) + self.assertEqual(0, retval) sys.stdout = sys.__stdout__ @@ -416,7 +416,7 @@ def test_do_erase_packages(self, get_os_type_method, run_os_command_method): @patch.object(OSCheck, "get_os_type") def test_find_repo_files_for_repos(self, get_os_type_method, get_files_in_dir_method): - out = StringIO.StringIO() + out = io.StringIO() sys.stdout = out tmpfile = tempfile.mktemp() @@ -435,21 +435,21 @@ def test_find_repo_files_for_repos(self, get_os_type_method, repoFiles = self.hostcleanup.find_repo_files_for_repos(['aass']) self.assertTrue(get_files_in_dir_method.called) self.assertTrue(get_os_type_method.called) - self.assertEquals(repoFiles, [ tmpfile ]) + self.assertEqual(repoFiles, [ tmpfile ]) repoFiles = self.hostcleanup.find_repo_files_for_repos(['sd des derft 3.1']) self.assertTrue(get_files_in_dir_method.called) self.assertTrue(get_os_type_method.called) - self.assertEquals(repoFiles, [ tmpfile ]) + self.assertEqual(repoFiles, [ tmpfile ]) repoFiles = self.hostcleanup.find_repo_files_for_repos(['sd des derft 3.1', 'aass']) - self.assertEquals(repoFiles, [ tmpfile ]) + self.assertEqual(repoFiles, [ tmpfile ]) repoFiles = self.hostcleanup.find_repo_files_for_repos(['saas']) - self.assertEquals(repoFiles, []) + self.assertEqual(repoFiles, []) repoFiles = self.hostcleanup.find_repo_files_for_repos(['']) - self.assertEquals(repoFiles, []) + self.assertEqual(repoFiles, []) sys.stdout = sys.__stdout__ @@ -459,7 +459,7 @@ def test_find_repo_files_for_repos(self, get_os_type_method, @patch.object(HostCleanup.HostCleanup, 'get_alternatives_desc') def test_do_erase_alternatives(self, get_alternatives_desc_mock, do_erase_dir_silent_mock, run_os_command_mock): - out = StringIO.StringIO() + out = io.StringIO() sys.stdout = out get_alternatives_desc_mock.return_value = 'somepath to alternative\n' diff --git a/ambari-agent/src/test/python/ambari_agent/TestHostInfo.py b/ambari-agent/src/test/python/ambari_agent/TestHostInfo.py index 823b82e9cc8..9f6489c54e2 100644 --- a/ambari-agent/src/test/python/ambari_agent/TestHostInfo.py +++ b/ambari-agent/src/test/python/ambari_agent/TestHostInfo.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -52,7 +52,7 @@ def test_checkFolders(self, path_mock): results = [] existingUsers = [{'name':'a1', 'homeDir':os.path.join('home', 'a1')}, {'name':'b1', 'homeDir':os.path.join('home', 'b1')}] hostInfo.checkFolders([os.path.join("etc", "conf"), os.path.join("var", "lib"), "home"], ["a1", "b1"], ["c","d"], existingUsers, results) - print results + print(results) self.assertEqual(6, len(results)) names = [i['name'] for i in results] for item in [os.path.join('etc','conf','a1'), os.path.join('var','lib','a1'), os.path.join('etc','conf','b1'), os.path.join('var','lib','b1')]: @@ -171,32 +171,32 @@ def test_dirType(self, os_path_isfile_mock, os_path_isdir_mock, os_path_islink_m os_path_exists_mock.return_value = False result = host.dirType("/home") - self.assertEquals(result, 'not_exist') + self.assertEqual(result, 'not_exist') os_path_exists_mock.return_value = True os_path_islink_mock.return_value = True result = host.dirType("/home") - self.assertEquals(result, 'sym_link') + self.assertEqual(result, 'sym_link') os_path_exists_mock.return_value = True os_path_islink_mock.return_value = False os_path_isdir_mock.return_value = True result = host.dirType("/home") - self.assertEquals(result, 'directory') + self.assertEqual(result, 'directory') os_path_exists_mock.return_value = True os_path_islink_mock.return_value = False os_path_isdir_mock.return_value = False os_path_isfile_mock.return_value = True result = host.dirType("/home") - self.assertEquals(result, 'file') + self.assertEqual(result, 'file') os_path_exists_mock.return_value = True os_path_islink_mock.return_value = False os_path_isdir_mock.return_value = False os_path_isfile_mock.return_value = False result = host.dirType("/home") - self.assertEquals(result, 'unknown') + self.assertEqual(result, 'unknown') @patch("os.path.exists") @patch("glob.glob") @@ -206,11 +206,11 @@ def test_hadoopVarRunCount(self, glob_glob_mock, os_path_exists_mock): os_path_exists_mock.return_value = True glob_glob_mock.return_value = ['pid1','pid2','pid3'] result = hostInfo.hadoopVarRunCount() - self.assertEquals(result, 3) + self.assertEqual(result, 3) os_path_exists_mock.return_value = False result = hostInfo.hadoopVarRunCount() - self.assertEquals(result, 0) + self.assertEqual(result, 0) @patch("os.path.exists") @patch("glob.glob") @@ -220,15 +220,15 @@ def test_hadoopVarLogCount(self, glob_glob_mock, os_path_exists_mock): os_path_exists_mock.return_value = True glob_glob_mock.return_value = ['log1','log2'] result = hostInfo.hadoopVarLogCount() - self.assertEquals(result, 2) + self.assertEqual(result, 2) os_path_exists_mock.return_value = False result = hostInfo.hadoopVarLogCount() - self.assertEquals(result, 0) + self.assertEqual(result, 0) @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = ('redhat','11','Final'))) @patch("os.listdir", create=True, autospec=True) - @patch("__builtin__.open", create=True, autospec=True) + @patch("builtins.open", create=True, autospec=True) @patch("pwd.getpwuid", create=True, autospec=True) def test_javaProcs(self, pwd_getpwuid_mock, buitin_open_mock, os_listdir_mock): hostInfo = HostInfoLinux() @@ -242,10 +242,10 @@ def test_javaProcs(self, pwd_getpwuid_mock, buitin_open_mock, os_listdir_mock): list = [] hostInfo.javaProcs(list) - self.assertEquals(list[0]['command'], '/java/;/hadoop/') - self.assertEquals(list[0]['pid'], 1) + self.assertEqual(list[0]['command'], '/java/;/hadoop/') + self.assertEqual(list[0]['pid'], 1) self.assertTrue(list[0]['hadoop']) - self.assertEquals(list[0]['user'], 'user') + self.assertEqual(list[0]['user'], 'user') @patch.object(OSCheck, "get_os_type") @patch("resource_management.core.shell.call") @@ -257,58 +257,58 @@ def test_checkLiveServices(self, shell_call, get_os_type_method): result = [] hostInfo.checkLiveServices([('service1',)], result) - self.assertEquals(result[0]['desc'], '') - self.assertEquals(result[0]['status'], 'Healthy') - self.assertEquals(result[0]['name'], 'service1') + self.assertEqual(result[0]['desc'], '') + self.assertEqual(result[0]['status'], 'Healthy') + self.assertEqual(result[0]['name'], 'service1') shell_call.return_value = (1, 'out', 'err') result = [] hostInfo.checkLiveServices([('service1',)], result) - self.assertEquals(result[0]['status'], 'Unhealthy') - self.assertEquals(result[0]['name'], 'service1') - self.assertEquals(result[0]['desc'], 'out') + self.assertEqual(result[0]['status'], 'Unhealthy') + self.assertEqual(result[0]['name'], 'service1') + self.assertEqual(result[0]['desc'], 'out') shell_call.return_value = (1, '', 'err') result = [] hostInfo.checkLiveServices([('service1',)], result) - self.assertEquals(result[0]['status'], 'Unhealthy') - self.assertEquals(result[0]['name'], 'service1') - self.assertEquals(result[0]['desc'], 'err') + self.assertEqual(result[0]['status'], 'Unhealthy') + self.assertEqual(result[0]['name'], 'service1') + self.assertEqual(result[0]['desc'], 'err') shell_call.return_value = (1, '', 'err') result = [] hostInfo.checkLiveServices([('service1',)], result) - self.assertEquals(result[0]['status'], 'Unhealthy') - self.assertEquals(result[0]['name'], 'service1') + self.assertEqual(result[0]['status'], 'Unhealthy') + self.assertEqual(result[0]['name'], 'service1') self.assertTrue(len(result[0]['desc']) > 0) shell_call.return_value = (0, '', 'err') result = [] hostInfo.checkLiveServices([('service1', 'service2',)], result) - self.assertEquals(result[0]['status'], 'Healthy') - self.assertEquals(result[0]['name'], 'service1 or service2') - self.assertEquals(result[0]['desc'], '') + self.assertEqual(result[0]['status'], 'Healthy') + self.assertEqual(result[0]['name'], 'service1 or service2') + self.assertEqual(result[0]['desc'], '') shell_call.return_value = (1, 'out', 'err') result = [] hostInfo.checkLiveServices([('service1', 'service2',)], result) - self.assertEquals(result[0]['status'], 'Unhealthy') - self.assertEquals(result[0]['name'], 'service1 or service2') - self.assertEquals(result[0]['desc'], 'out{0}out'.format(os.linesep)) + self.assertEqual(result[0]['status'], 'Unhealthy') + self.assertEqual(result[0]['name'], 'service1 or service2') + self.assertEqual(result[0]['desc'], 'out{0}out'.format(os.linesep)) msg = 'thrown by shell call' shell_call.side_effect = Exception(msg) result = [] hostInfo.checkLiveServices([('service1',)], result) - self.assertEquals(result[0]['status'], 'Unhealthy') - self.assertEquals(result[0]['name'], 'service1') - self.assertEquals(result[0]['desc'], msg) + self.assertEqual(result[0]['status'], 'Unhealthy') + self.assertEqual(result[0]['name'], 'service1') + self.assertEqual(result[0]['desc'], msg) @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = ('redhat','11','Final'))) @@ -321,7 +321,7 @@ def test_etcAlternativesConf(self, os_path_realpath_mock, os_path_islink_mock, o os_path_exists_mock.return_value = False result = hostInfo.etcAlternativesConf('',[]) - self.assertEquals(result, []) + self.assertEqual(result, []) os_path_exists_mock.return_value = True os_listdir_mock.return_value = ['config1'] @@ -330,8 +330,8 @@ def test_etcAlternativesConf(self, os_path_realpath_mock, os_path_islink_mock, o result = [] hostInfo.etcAlternativesConf('project', result) - self.assertEquals(result[0]['name'], 'config1') - self.assertEquals(result[0]['target'], 'real_path_to_conf') + self.assertEqual(result[0]['name'], 'config1') + self.assertEqual(result[0]['target'], 'real_path_to_conf') @patch.object(OSCheck, "get_os_family") @patch.object(OSCheck, "get_os_type") @@ -380,7 +380,7 @@ def test_FirewallStopped(self, run_os_command_mock, get_os_major_version_mock, g @patch.object(OSCheck, "get_os_family") @patch("os.path.isfile") - @patch('__builtin__.open') + @patch('builtins.open') def test_transparent_huge_page(self, open_mock, os_path_isfile_mock, get_os_family_mock): context_manager_mock = MagicMock() open_mock.return_value = context_manager_mock @@ -403,7 +403,7 @@ def test_transparent_huge_page(self, open_mock, os_path_isfile_mock, get_os_fami @patch.object(OSCheck, "get_os_family") @patch("os.path.isfile") - @patch('__builtin__.open') + @patch('builtins.open') def test_transparent_huge_page_debian(self, open_mock, os_path_isfile_mock, get_os_family_mock): context_manager_mock = MagicMock() open_mock.return_value = context_manager_mock diff --git a/ambari-agent/src/test/python/ambari_agent/TestHostname.py b/ambari-agent/src/test/python/ambari_agent/TestHostname.py index e1218f64f92..9570d67246d 100644 --- a/ambari-agent/src/test/python/ambari_agent/TestHostname.py +++ b/ambari-agent/src/test/python/ambari_agent/TestHostname.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -39,7 +39,7 @@ def test_hostname(self): hostname.cached_hostname = None hostname.cached_public_hostname = None config = AmbariConfig() - self.assertEquals(hostname.hostname(config), socket.getfqdn().lower(), + self.assertEqual(hostname.hostname(config), socket.getfqdn().lower(), "hostname should equal the socket-based hostname") pass @@ -49,7 +49,7 @@ def test_server_hostnames(self): default_server_hostname = config.get('server', 'hostname') config.set('server', 'hostname', 'ambari-host') server_hostnames = hostname.server_hostnames(config) - self.assertEquals(['ambari-host'], server_hostnames, + self.assertEqual(['ambari-host'], server_hostnames, "expected host name ['ambari-host']; got {0}".format(server_hostnames)) config.set('server', 'hostname', default_server_hostname) pass @@ -60,8 +60,8 @@ def test_server_hostnames_multiple(self): default_server_hostname = config.get('server', 'hostname') config.set('server', 'hostname', 'ambari-host, ambari-host2, ambari-host3') server_hostnames = hostname.server_hostnames(config) - self.assertEquals(len(server_hostnames), 3) - self.assertEquals(['ambari-host', 'ambari-host2', 'ambari-host3'], server_hostnames, + self.assertEqual(len(server_hostnames), 3) + self.assertEqual(['ambari-host', 'ambari-host2', 'ambari-host3'], server_hostnames, "expected host name ['ambari-host']; got {0}".format(server_hostnames)) config.set('server', 'hostname', default_server_hostname) pass @@ -74,7 +74,7 @@ def test_server_hostnames_override(self): os.close(fd[0]) os.chmod(tmpname, os.stat(tmpname).st_mode | stat.S_IXUSR) - tmpfile = file(tmpname, "w+") + tmpfile = open(tmpname, "w+") config = AmbariConfig() try: tmpfile.write("#!/bin/sh\n\necho 'test.example.com'") @@ -83,7 +83,7 @@ def test_server_hostnames_override(self): config.set('server', 'hostname_script', tmpname) server_hostnames = hostname.server_hostnames(config) - self.assertEquals(server_hostnames, ['test.example.com'], "expected hostname ['test.example.com']; got {0}".format(server_hostnames)) + self.assertEqual(server_hostnames, ['test.example.com'], "expected hostname ['test.example.com']; got {0}".format(server_hostnames)) finally: os.remove(tmpname) config.remove_option('server', 'hostname_script') @@ -98,7 +98,7 @@ def test_server_hostnames_multiple_override(self): os.close(fd[0]) os.chmod(tmpname, os.stat(tmpname).st_mode | stat.S_IXUSR) - tmpfile = file(tmpname, "w+") + tmpfile = open(tmpname, "w+") config = AmbariConfig() try: tmpfile.write("#!/bin/sh\n\necho 'host1.example.com, host2.example.com, host3.example.com'") @@ -108,7 +108,7 @@ def test_server_hostnames_multiple_override(self): expected_hostnames = ['host1.example.com', 'host2.example.com', 'host3.example.com'] server_hostnames = hostname.server_hostnames(config) - self.assertEquals(server_hostnames, expected_hostnames, "expected hostnames {0}; got {1}".format(expected_hostnames, server_hostnames)) + self.assertEqual(server_hostnames, expected_hostnames, "expected hostnames {0}; got {1}".format(expected_hostnames, server_hostnames)) finally: os.remove(tmpname) config.remove_option('server', 'hostname_script') @@ -123,7 +123,7 @@ def test_hostname_override(self): os.close(fd[0]) os.chmod(tmpname, os.stat(tmpname).st_mode | stat.S_IXUSR) - tmpfile = file(tmpname, "w+") + tmpfile = open(tmpname, "w+") config = AmbariConfig() try: tmpfile.write("#!/bin/sh\n\necho 'test.example.com'") @@ -131,7 +131,7 @@ def test_hostname_override(self): config.set('agent', 'hostname_script', tmpname) - self.assertEquals(hostname.hostname(config), 'test.example.com', "expected hostname 'test.example.com'") + self.assertEqual(hostname.hostname(config), 'test.example.com', "expected hostname 'test.example.com'") finally: os.remove(tmpname) config.remove_option('agent', 'hostname_script') @@ -146,7 +146,7 @@ def test_public_hostname_override(self): os.close(fd[0]) os.chmod(tmpname, os.stat(tmpname).st_mode | stat.S_IXUSR) - tmpfile = file(tmpname, "w+") + tmpfile = open(tmpname, "w+") config = AmbariConfig() try: @@ -155,7 +155,7 @@ def test_public_hostname_override(self): config.set('agent', 'public_hostname_script', tmpname) - self.assertEquals(hostname.public_hostname(config), 'test.example.com', + self.assertEqual(hostname.public_hostname(config), 'test.example.com', "expected hostname 'test.example.com'") finally: os.remove(tmpname) @@ -169,8 +169,8 @@ def test_caching(self, getfqdn_mock): hostname.cached_public_hostname = None config = AmbariConfig() getfqdn_mock.side_effect = ["test.example.com", "test2.example.com'"] - self.assertEquals(hostname.hostname(config), "test.example.com") - self.assertEquals(hostname.hostname(config), "test.example.com") + self.assertEqual(hostname.hostname(config), "test.example.com") + self.assertEqual(hostname.hostname(config), "test.example.com") self.assertEqual(getfqdn_mock.call_count, 1) pass diff --git a/ambari-agent/src/test/python/ambari_agent/TestKerberosCommon.py b/ambari-agent/src/test/python/ambari_agent/TestKerberosCommon.py index 95cd0341b1d..aa4858ed046 100644 --- a/ambari-agent/src/test/python/ambari_agent/TestKerberosCommon.py +++ b/ambari-agent/src/test/python/ambari_agent/TestKerberosCommon.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -30,11 +30,11 @@ def test_resolves_family(self): 'aes256-cts-hmac-sha384-192', 'aes128-cts-hmac-sha256-128', 'rc4-hmac']) - self.assertEquals(expected, resolve_encryption_family_list(['rc4', 'aes'])) + self.assertEqual(expected, resolve_encryption_family_list(['rc4', 'aes'])) def test_no_resolve_if_no_family_is_given(self): expected = set(['aes256-cts-hmac-sha1-96', 'rc4-hmac']) - self.assertEquals(expected, resolve_encryption_family_list(['rc4-hmac', 'aes256-cts-hmac-sha1-96'])) + self.assertEqual(expected, resolve_encryption_family_list(['rc4-hmac', 'aes256-cts-hmac-sha1-96'])) def test_eliminates_duplications(self): expected = set([ @@ -42,7 +42,7 @@ def test_eliminates_duplications(self): 'aes128-cts-hmac-sha1-96', 'aes256-cts-hmac-sha384-192', 'aes128-cts-hmac-sha256-128']) - self.assertEquals(expected, resolve_encryption_family_list(['aes', 'aes128-cts-hmac-sha1-96'])) + self.assertEqual(expected, resolve_encryption_family_list(['aes', 'aes128-cts-hmac-sha1-96'])) def test_translate_str(self): - self.assertEquals('rc4-hmac', resolve_encryption_families('rc4')) \ No newline at end of file + self.assertEqual('rc4-hmac', resolve_encryption_families('rc4')) \ No newline at end of file diff --git a/ambari-agent/src/test/python/ambari_agent/TestLiveStatus.py b/ambari-agent/src/test/python/ambari_agent/TestLiveStatus.py index abd7def8d23..6a709d6798d 100644 --- a/ambari-agent/src/test/python/ambari_agent/TestLiveStatus.py +++ b/ambari-agent/src/test/python/ambari_agent/TestLiveStatus.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -21,7 +21,7 @@ from unittest import TestCase from ambari_agent.LiveStatus import LiveStatus from ambari_agent.AmbariConfig import AmbariConfig -import os, sys, StringIO +import os, sys, io from ambari_agent import ActualConfigHandler from mock.mock import patch, MagicMock import pprint @@ -33,7 +33,7 @@ class TestLiveStatus(TestCase): def setUp(self): # disable stdout - out = StringIO.StringIO() + out = io.StringIO() sys.stdout = out def tearDown(self): diff --git a/ambari-agent/src/test/python/ambari_agent/TestMain.py b/ambari-agent/src/test/python/ambari_agent/TestMain.py index 9ac8e1ce266..a2422bf7da1 100644 --- a/ambari-agent/src/test/python/ambari_agent/TestMain.py +++ b/ambari-agent/src/test/python/ambari_agent/TestMain.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -17,7 +17,7 @@ See the License for the specific language governing permissions and limitations under the License. ''' -import StringIO +import io import sys import unittest import logging @@ -25,7 +25,7 @@ import os import socket import tempfile -import ConfigParser +import configparser import ambari_agent.hostname as hostname import resource @@ -49,7 +49,7 @@ class TestMain:#(unittest.TestCase): def setUp(self): # disable stdout - out = StringIO.StringIO() + out = io.StringIO() sys.stdout = out @@ -140,7 +140,7 @@ def test_update_open_files_ulimit(self): config.set_ulimit_open_files(open_files_ulimit) main.update_open_files_ulimit(config) (soft_limit, hard_limit) = resource.getrlimit(resource.RLIMIT_NOFILE) - self.assertEquals(hard_limit, open_files_ulimit) + self.assertEqual(hard_limit, open_files_ulimit) @not_for_platform(PLATFORM_WINDOWS) @patch("signal.signal") @@ -151,9 +151,9 @@ def test_bind_signal_handlers(self, signal_mock): signal_mock.assert_any_call(signal.SIGTERM, HeartbeatHandlers.signal_handler) - @patch("platform.linux_distribution") + @patch("distro.linux_distribution") @patch("os.path.exists") - @patch("ConfigParser.RawConfigParser.read") + @patch("configparser.RawConfigParser.read") def test_resolve_ambari_config(self, read_mock, exists_mock, platform_mock): platform_mock.return_value = "Linux" # Trying case if conf file exists @@ -243,7 +243,7 @@ def test_daemonize_and_stop(self, exists_mock, sleep_mock): main.stop_agent() raise Exception("main.stop_agent() should raise sys.exit(0).") except SystemExit as e: - self.assertEquals(0, e.code); + self.assertEqual(0, e.code); kill_mock.assert_has_calls([call(['ambari-sudo.sh', 'kill', '-15', pid]), call(['ambari-sudo.sh', 'kill', '-0', pid])]) @@ -260,7 +260,7 @@ def test_daemonize_and_stop(self, exists_mock, sleep_mock): main.stop_agent() raise Exception("main.stop_agent() should raise sys.exit(0).") except SystemExit as e: - self.assertEquals(0, e.code); + self.assertEqual(0, e.code); kill_mock.assert_has_calls([call(['ambari-sudo.sh', 'kill', '-15', pid]), call(['ambari-sudo.sh', 'kill', '-0', pid]), @@ -272,8 +272,8 @@ def test_daemonize_and_stop(self, exists_mock, sleep_mock): @patch("os.rmdir") @patch("os.path.join") - @patch('__builtin__.open') - @patch.object(ConfigParser, "ConfigParser") + @patch('builtins.open') + @patch.object(configparser, "configparser") @patch("sys.exit") @patch("os.walk") @patch("os.remove") @@ -292,8 +292,8 @@ def test_reset(self, os_remove_mock, os_walk_mock, sys_exit_mock, config_parser_ @patch("os.rmdir") @patch("os.path.join") - @patch('__builtin__.open') - @patch.object(ConfigParser, "ConfigParser") + @patch('builtins.open') + @patch.object(configparser, "configparser") @patch("sys.exit") @patch("os.walk") @patch("os.remove") @@ -398,6 +398,6 @@ def try_to_connect_impl(*args, **kwargs): try_to_connect_mock.reset_mock() try_to_connect_mock.side_effect = try_to_connect_impl active_server = main.main() - self.assertEquals(active_server, 'host3') + self.assertEqual(active_server, 'host3') hostname.cached_server_hostnames = default_server_hostnames pass \ No newline at end of file diff --git a/ambari-agent/src/test/python/ambari_agent/TestMetricAlert.py b/ambari-agent/src/test/python/ambari_agent/TestMetricAlert.py index 18e06e28ea9..60c4fa9a042 100644 --- a/ambari-agent/src/test/python/ambari_agent/TestMetricAlert.py +++ b/ambari-agent/src/test/python/ambari_agent/TestMetricAlert.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -21,14 +21,14 @@ from unittest import TestCase from alerts.metric_alert import MetricAlert from mock.mock import Mock, MagicMock, patch -from AmbariConfig import AmbariConfig +from ambari_agent.AmbariConfig import AmbariConfig class TestMetricAlert(TestCase): def setUp(self): self.config = AmbariConfig() - @patch("urllib2.urlopen") + @patch("urllib.request.urlopen") def test_collect(self, urllib): alert_meta = { 'name': 'alert1', @@ -68,15 +68,15 @@ def test_collect(self, urllib): expected_text = 'OK: 1' def collector_side_effect(clus, data): - self.assertEquals(data['name'], alert_meta['name']) - self.assertEquals(data['label'], alert_meta['label']) - self.assertEquals(data['text'], expected_text) - self.assertEquals(data['service'], alert_meta['serviceName']) - self.assertEquals(data['component'], alert_meta['componentName']) - self.assertEquals(data['uuid'], alert_meta['uuid']) - self.assertEquals(data['enabled'], alert_meta['enabled']) - self.assertEquals(data['cluster'], cluster) - self.assertEquals(clus, cluster) + self.assertEqual(data['name'], alert_meta['name']) + self.assertEqual(data['label'], alert_meta['label']) + self.assertEqual(data['text'], expected_text) + self.assertEqual(data['service'], alert_meta['serviceName']) + self.assertEqual(data['component'], alert_meta['componentName']) + self.assertEqual(data['uuid'], alert_meta['uuid']) + self.assertEqual(data['enabled'], alert_meta['enabled']) + self.assertEqual(data['cluster'], cluster) + self.assertEqual(clus, cluster) response = Mock() urllib.return_value = response @@ -90,7 +90,7 @@ def collector_side_effect(clus, data): alert.collect() - @patch("urllib2.urlopen") + @patch("urllib.request.urlopen") def test_collect(self, urllib): alert_meta = { 'name': 'alert1', @@ -130,15 +130,15 @@ def test_collect(self, urllib): expected_text = 'Warn: 4' def collector_side_effect(clus, data): - self.assertEquals(data['name'], alert_meta['name']) - self.assertEquals(data['label'], alert_meta['label']) - self.assertEquals(data['text'], expected_text) - self.assertEquals(data['service'], alert_meta['serviceName']) - self.assertEquals(data['component'], alert_meta['componentName']) - self.assertEquals(data['uuid'], alert_meta['uuid']) - self.assertEquals(data['enabled'], alert_meta['enabled']) - self.assertEquals(data['cluster'], cluster) - self.assertEquals(clus, cluster) + self.assertEqual(data['name'], alert_meta['name']) + self.assertEqual(data['label'], alert_meta['label']) + self.assertEqual(data['text'], expected_text) + self.assertEqual(data['service'], alert_meta['serviceName']) + self.assertEqual(data['component'], alert_meta['componentName']) + self.assertEqual(data['uuid'], alert_meta['uuid']) + self.assertEqual(data['enabled'], alert_meta['enabled']) + self.assertEqual(data['cluster'], cluster) + self.assertEqual(clus, cluster) response = Mock() urllib.return_value = response @@ -152,7 +152,7 @@ def collector_side_effect(clus, data): alert.collect() - @patch("urllib2.urlopen") + @patch("urllib.request.urlopen") def test_collect(self, urllib): alert_meta = { 'definitionId': 1, @@ -194,9 +194,9 @@ def test_collect(self, urllib): expected_text = 'Crit: 12' def collector_side_effect(clus, data): - self.assertEquals(data['name'], alert_meta['name']) - self.assertEquals(data['clusterId'], cluster_id) - self.assertEquals(clus, cluster) + self.assertEqual(data['name'], alert_meta['name']) + self.assertEqual(data['clusterId'], cluster_id) + self.assertEqual(clus, cluster) response = Mock() urllib.return_value = response diff --git a/ambari-agent/src/test/python/ambari_agent/TestNetUtil.py b/ambari-agent/src/test/python/ambari_agent/TestNetUtil.py index c9dbb13476b..b713f06a269 100644 --- a/ambari-agent/src/test/python/ambari_agent/TestNetUtil.py +++ b/ambari-agent/src/test/python/ambari_agent/TestNetUtil.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -55,7 +55,7 @@ def test_checkURL(self, httpsConMock, parseMock): @not_for_platform(PLATFORM_WINDOWS) @patch("time.sleep") - @patch.object(threading._Event, "wait") + @patch.object(threading.Event, "wait") def test_try_to_connect(self, event_mock, sleepMock): event_mock.return_value = False diff --git a/ambari-agent/src/test/python/ambari_agent/TestPingPortListener.py b/ambari-agent/src/test/python/ambari_agent/TestPingPortListener.py index 7abc5d5bc05..c6e7408982b 100644 --- a/ambari-agent/src/test/python/ambari_agent/TestPingPortListener.py +++ b/ambari-agent/src/test/python/ambari_agent/TestPingPortListener.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -21,7 +21,7 @@ import unittest from mock.mock import patch, MagicMock, call, Mock from ambari_agent import PingPortListener -from ambari_commons import subprocess32 +import subprocess import socket import sys @@ -32,7 +32,7 @@ def setUp(self): self.config.get.return_value = 55000 PingPortListener.logger = MagicMock() - @patch.object(subprocess32, "Popen") + @patch.object(subprocess, "Popen") @patch("socket.socket") def test_init_success(self,socketMock,popen_mock): procObj = MagicMock() @@ -53,7 +53,7 @@ def test_init_success(self,socketMock,popen_mock): - @patch.object(subprocess32, "Popen") + @patch.object(subprocess, "Popen") @patch.object(socket.socket,"bind") @patch.object(socket.socket,"listen") def test_init_warn(self,socketListenMock,socketBindMock,popen_mock): diff --git a/ambari-agent/src/test/python/ambari_agent/TestPortAlert.py b/ambari-agent/src/test/python/ambari_agent/TestPortAlert.py index 7839f200d18..0a47f3b8a5c 100644 --- a/ambari-agent/src/test/python/ambari_agent/TestPortAlert.py +++ b/ambari-agent/src/test/python/ambari_agent/TestPortAlert.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -21,7 +21,7 @@ from unittest import TestCase from alerts.port_alert import PortAlert from mock.mock import Mock, MagicMock, patch -from AmbariConfig import AmbariConfig +from ambari_agent.AmbariConfig import AmbariConfig class TestPortAlert(TestCase): @@ -55,11 +55,11 @@ def test_collect_defaultPort(self, time, socket): alert.configuration_builder = MagicMock() def collector_side_effect(clus, data): - self.assertEquals(data['name'], alert_meta['name']) - self.assertEquals(data['state'], expected_state) - self.assertEquals(data['text'], expected_text) - self.assertEquals(data['clusterId'], cluster_id) - self.assertEquals(clus, cluster) + self.assertEqual(data['name'], alert_meta['name']) + self.assertEqual(data['state'], expected_state) + self.assertEqual(data['text'], expected_text) + self.assertEqual(data['clusterId'], cluster_id) + self.assertEqual(clus, cluster) alert.collector = MagicMock() alert.collector.put = Mock(side_effect=collector_side_effect) @@ -93,11 +93,11 @@ def test_collect_warning(self, time, socket): alert.configuration_builder = MagicMock() def collector_side_effect(clus, data): - self.assertEquals(data['name'], alert_meta['name']) - self.assertEquals(data['state'], expected_state) - self.assertEquals(data['text'], expected_text) - self.assertEquals(data['clusterId'], cluster_id) - self.assertEquals(clus, cluster) + self.assertEqual(data['name'], alert_meta['name']) + self.assertEqual(data['state'], expected_state) + self.assertEqual(data['text'], expected_text) + self.assertEqual(data['clusterId'], cluster_id) + self.assertEqual(clus, cluster) alert.collector = MagicMock() alert.collector.put = Mock(side_effect=collector_side_effect) @@ -131,12 +131,12 @@ def test_collect_connectionTimeout(self, time, socket): alert.configuration_builder = MagicMock() def collector_side_effect(clus, data): - print data - self.assertEquals(data['name'], alert_meta['name']) - self.assertEquals(data['state'], expected_state) - self.assertEquals(data['text'], expected_text) - self.assertEquals(data['clusterId'], cluster_id) - self.assertEquals(clus, cluster) + print(data) + self.assertEqual(data['name'], alert_meta['name']) + self.assertEqual(data['state'], expected_state) + self.assertEqual(data['text'], expected_text) + self.assertEqual(data['clusterId'], cluster_id) + self.assertEqual(clus, cluster) alert.collector = MagicMock() alert.collector.put = Mock(side_effect=collector_side_effect) @@ -169,11 +169,11 @@ def test_collect_noUrl(self, time, socket): alert.configuration_builder = MagicMock() def collector_side_effect(clus, data): - self.assertEquals(data['name'], alert_meta['name']) - self.assertEquals(data['state'], expected_state) - self.assertEquals(data['text'], expected_text) - self.assertEquals(data['clusterId'], cluster_id) - self.assertEquals(clus, cluster) + self.assertEqual(data['name'], alert_meta['name']) + self.assertEqual(data['state'], expected_state) + self.assertEqual(data['text'], expected_text) + self.assertEqual(data['clusterId'], cluster_id) + self.assertEqual(clus, cluster) alert.collector = MagicMock() alert.collector.put = Mock(side_effect=collector_side_effect) @@ -208,11 +208,11 @@ def test_collect_exception(self, time, socket): alert.configuration_builder = MagicMock() def collector_side_effect(clus, data): - self.assertEquals(data['name'], alert_meta['name']) - self.assertEquals(data['state'], expected_state) - self.assertEquals(data['text'], expected_text) - self.assertEquals(data['clusterId'], cluster_id) - self.assertEquals(clus, cluster) + self.assertEqual(data['name'], alert_meta['name']) + self.assertEqual(data['state'], expected_state) + self.assertEqual(data['text'], expected_text) + self.assertEqual(data['clusterId'], cluster_id) + self.assertEqual(clus, cluster) alert.collector = MagicMock() alert.collector.put = Mock(side_effect=collector_side_effect) @@ -251,11 +251,11 @@ def test_collect_warningTimeoutChanged(self, time, socket): alert.configuration_builder = MagicMock() def collector_side_effect(clus, data): - self.assertEquals(data['name'], alert_meta['name']) - self.assertEquals(data['state'], expected_state) - self.assertEquals(data['text'], expected_text) - self.assertEquals(data['clusterId'], cluster_id) - self.assertEquals(clus, cluster) + self.assertEqual(data['name'], alert_meta['name']) + self.assertEqual(data['state'], expected_state) + self.assertEqual(data['text'], expected_text) + self.assertEqual(data['clusterId'], cluster_id) + self.assertEqual(clus, cluster) alert.collector = MagicMock() alert.collector.put = Mock(side_effect=collector_side_effect) @@ -295,11 +295,11 @@ def test_collect_criticalTimeoutChanged(self, time, socket): def collector_side_effect(clus, data): - self.assertEquals(data['name'], alert_meta['name']) - self.assertEquals(data['state'], expected_state) - self.assertEquals(data['text'], expected_text) - self.assertEquals(data['clusterId'], cluster_id) - self.assertEquals(clus, cluster) + self.assertEqual(data['name'], alert_meta['name']) + self.assertEqual(data['state'], expected_state) + self.assertEqual(data['text'], expected_text) + self.assertEqual(data['clusterId'], cluster_id) + self.assertEqual(clus, cluster) alert.collector = MagicMock() alert.collector.put = Mock(side_effect=collector_side_effect) @@ -338,11 +338,11 @@ def test_collect_criticalTimeoutTooBig(self, time, socket): alert.configuration_builder = MagicMock() def collector_side_effect(clus, data): - self.assertEquals(data['name'], alert_meta['name']) - self.assertEquals(data['state'], expected_state) - self.assertEquals(data['text'], expected_text) - self.assertEquals(data['clusterId'], cluster_id) - self.assertEquals(clus, cluster) + self.assertEqual(data['name'], alert_meta['name']) + self.assertEqual(data['state'], expected_state) + self.assertEqual(data['text'], expected_text) + self.assertEqual(data['clusterId'], cluster_id) + self.assertEqual(clus, cluster) alert.collector = MagicMock() alert.collector.put = Mock(side_effect=collector_side_effect) @@ -396,11 +396,11 @@ def test_collect_zookeeper(self, time, socket): s.recv.return_value = "imok" def collector_side_effect(clus, data): - self.assertEquals(data['name'], alert_meta['name']) - self.assertEquals(data['state'], expected_state) - self.assertEquals(data['text'], expected_text) - self.assertEquals(data['clusterId'], cluster_id) - self.assertEquals(clus, cluster) + self.assertEqual(data['name'], alert_meta['name']) + self.assertEqual(data['state'], expected_state) + self.assertEqual(data['text'], expected_text) + self.assertEqual(data['clusterId'], cluster_id) + self.assertEqual(clus, cluster) alert.collector = MagicMock() alert.collector.put = Mock(side_effect=collector_side_effect) @@ -454,11 +454,11 @@ def test_collect_zookeeper_warning(self, time, socket): s.recv.return_value = "imok" def collector_side_effect(clus, data): - self.assertEquals(data['name'], alert_meta['name']) - self.assertEquals(data['state'], expected_state) - self.assertEquals(data['text'], expected_text) - self.assertEquals(data['clusterId'], cluster_id) - self.assertEquals(clus, cluster) + self.assertEqual(data['name'], alert_meta['name']) + self.assertEqual(data['state'], expected_state) + self.assertEqual(data['text'], expected_text) + self.assertEqual(data['clusterId'], cluster_id) + self.assertEqual(clus, cluster) alert.collector = MagicMock() alert.collector.put = Mock(side_effect=collector_side_effect) @@ -513,11 +513,11 @@ def test_collect_zookeeper_connectionTimeout(self, time, socket): s.recv.return_value = "imok" def collector_side_effect(clus, data): - self.assertEquals(data['name'], alert_meta['name']) - self.assertEquals(data['state'], expected_state) - self.assertEquals(data['text'], expected_text) - self.assertEquals(data['clusterId'], cluster_id) - self.assertEquals(clus, cluster) + self.assertEqual(data['name'], alert_meta['name']) + self.assertEqual(data['state'], expected_state) + self.assertEqual(data['text'], expected_text) + self.assertEqual(data['clusterId'], cluster_id) + self.assertEqual(clus, cluster) alert.collector = MagicMock() alert.collector.put = Mock(side_effect=collector_side_effect) diff --git a/ambari-agent/src/test/python/ambari_agent/TestPythonExecutor.py b/ambari-agent/src/test/python/ambari_agent/TestPythonExecutor.py index 76aa4e89da1..72803da85fa 100644 --- a/ambari-agent/src/test/python/ambari_agent/TestPythonExecutor.py +++ b/ambari-agent/src/test/python/ambari_agent/TestPythonExecutor.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -33,7 +33,7 @@ from ambari_commons import OSCheck from only_for_platform import os_distro_value -@patch.object(PythonExecutor, "open_subprocess32_files", new=MagicMock(return_value =("", ""))) +@patch.object(PythonExecutor, "open_subprocess_files", new=MagicMock(return_value =("", ""))) class TestPythonExecutor(TestCase): @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) @@ -42,7 +42,7 @@ def test_watchdog_1(self, kill_process_with_children_mock): """ Tests whether watchdog works """ - subproc_mock = self.subprocess32_mockup() + subproc_mock = self.subprocess_mockup() executor = PythonExecutor("/tmp", AmbariConfig()) _, tmpoutfile = tempfile.mkstemp() _, tmperrfile = tempfile.mkstemp() @@ -50,11 +50,11 @@ def test_watchdog_1(self, kill_process_with_children_mock): PYTHON_TIMEOUT_SECONDS = 0.1 kill_process_with_children_mock.side_effect = lambda pid : subproc_mock.terminate() - def launch_python_subprocess32_method(command, tmpout, tmperr): + def launch_python_subprocess_method(command, tmpout, tmperr): subproc_mock.tmpout = tmpout subproc_mock.tmperr = tmperr return subproc_mock - executor.launch_python_subprocess32 = launch_python_subprocess32_method + executor.launch_python_subprocess = launch_python_subprocess_method runShellKillPgrp_method = MagicMock() runShellKillPgrp_method.side_effect = lambda python : python.terminate() executor.runShellKillPgrp = runShellKillPgrp_method @@ -66,7 +66,7 @@ def launch_python_subprocess32_method(command, tmpout, tmperr): thread.start() time.sleep(0.1) subproc_mock.finished_event.wait() - self.assertEquals(subproc_mock.was_terminated, True, "subprocess32 should be terminated due to timeout") + self.assertEqual(subproc_mock.was_terminated, True, "subprocess should be terminated due to timeout") self.assertTrue(callback_method.called) @@ -75,18 +75,18 @@ def test_watchdog_2(self): """ Tries to catch false positive watchdog invocations """ - subproc_mock = self.subprocess32_mockup() + subproc_mock = self.subprocess_mockup() executor = PythonExecutor("/tmp", AmbariConfig()) _, tmpoutfile = tempfile.mkstemp() _, tmperrfile = tempfile.mkstemp() _, tmpstrucout = tempfile.mkstemp() PYTHON_TIMEOUT_SECONDS = 5 - def launch_python_subprocess32_method(command, tmpout, tmperr): + def launch_python_subprocess_method(command, tmpout, tmperr): subproc_mock.tmpout = tmpout subproc_mock.tmperr = tmperr return subproc_mock - executor.launch_python_subprocess32 = launch_python_subprocess32_method + executor.launch_python_subprocess = launch_python_subprocess_method runShellKillPgrp_method = MagicMock() runShellKillPgrp_method.side_effect = lambda python : python.terminate() executor.runShellKillPgrp = runShellKillPgrp_method @@ -100,13 +100,13 @@ def launch_python_subprocess32_method(command, tmpout, tmperr): time.sleep(0.1) subproc_mock.should_finish_event.set() subproc_mock.finished_event.wait() - self.assertEquals(subproc_mock.was_terminated, False, "subprocess32 should not be terminated before timeout") - self.assertEquals(subproc_mock.returncode, 0, "subprocess32 should not be terminated before timeout") + self.assertEqual(subproc_mock.was_terminated, False, "subprocess should not be terminated before timeout") + self.assertEqual(subproc_mock.returncode, 0, "subprocess should not be terminated before timeout") self.assertTrue(callback_method.called) @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) def test_execution_results(self): - subproc_mock = self.subprocess32_mockup() + subproc_mock = self.subprocess_mockup() executor = PythonExecutor("/tmp", AmbariConfig()) _, tmpoutfile = tempfile.mkstemp() _, tmperrfile = tempfile.mkstemp() @@ -117,11 +117,11 @@ def test_execution_results(self): PYTHON_TIMEOUT_SECONDS = 5 - def launch_python_subprocess32_method(command, tmpout, tmperr): + def launch_python_subprocess_method(command, tmpout, tmperr): subproc_mock.tmpout = tmpout subproc_mock.tmperr = tmperr return subproc_mock - executor.launch_python_subprocess32 = launch_python_subprocess32_method + executor.launch_python_subprocess = launch_python_subprocess_method runShellKillPgrp_method = MagicMock() runShellKillPgrp_method.side_effect = lambda python : python.terminate() executor.runShellKillPgrp = runShellKillPgrp_method @@ -131,7 +131,7 @@ def launch_python_subprocess32_method(command, tmpout, tmperr): result = executor.run_file("file", ["arg1", "arg2"], tmpoutfile, tmperrfile, PYTHON_TIMEOUT_SECONDS, tmpstructuredoutfile, callback_method, "1-1") - self.assertEquals(result, {'exitcode': 0, 'stderr': '', 'stdout': '', + self.assertEqual(result, {'exitcode': 0, 'stderr': '', 'stdout': '', 'structuredOut': {}}) self.assertTrue(callback_method.called) @@ -154,8 +154,8 @@ def test_python_command(self): command = executor.python_command("script", ["script_param1"]) self.assertEqual(3, len(command)) self.assertTrue("python" in command[0].lower()) - self.assertEquals("script", command[1]) - self.assertEquals("script_param1", command[2]) + self.assertEqual("script", command[1]) + self.assertEqual("script_param1", command[2]) @patch.object(os.path, "isfile") @patch.object(os, "rename") @@ -166,8 +166,8 @@ def test_back_up_log_file_if_exists(self, rename_mock, isfile_mock): log_file = "/var/lib/ambari-agent/data/output-13.txt" executor = PythonExecutor("/tmp", AmbariConfig()) executor.back_up_log_file_if_exists(log_file) - self.assertEquals(isfile_mock.called, True) - self.assertEquals(rename_mock.called, False) + self.assertEqual(isfile_mock.called, True) + self.assertEqual(rename_mock.called, False) isfile_mock.reset_mock() @@ -176,13 +176,13 @@ def test_back_up_log_file_if_exists(self, rename_mock, isfile_mock): log_file = "/var/lib/ambari-agent/data/output-13.txt" executor = PythonExecutor("/tmp", AmbariConfig()) executor.back_up_log_file_if_exists(log_file) - self.assertEquals(isfile_mock.called, True) - self.assertEquals(rename_mock.call_args_list[0][0][0], "/var/lib/ambari-agent/data/output-13.txt") - self.assertEquals(rename_mock.call_args_list[0][0][1], "/var/lib/ambari-agent/data/output-13.txt.2") + self.assertEqual(isfile_mock.called, True) + self.assertEqual(rename_mock.call_args_list[0][0][0], "/var/lib/ambari-agent/data/output-13.txt") + self.assertEqual(rename_mock.call_args_list[0][0][1], "/var/lib/ambari-agent/data/output-13.txt.2") pass - class subprocess32_mockup(): + class subprocess_mockup(): """ It's not trivial to use PyMock instead of class here because we need state and complex logics diff --git a/ambari-agent/src/test/python/ambari_agent/TestRecoveryManager.py b/ambari-agent/src/test/python/ambari_agent/TestRecoveryManager.py index e5947cf7cc6..2b1ca1f1a18 100644 --- a/ambari-agent/src/test/python/ambari_agent/TestRecoveryManager.py +++ b/ambari-agent/src/test/python/ambari_agent/TestRecoveryManager.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -302,24 +302,24 @@ def test_recovery_report(self, time_mock): rm = RecoveryManager(MagicMock()) rec_st = rm.get_recovery_status() - self.assertEquals(rec_st, {"summary": "DISABLED"}) + self.assertEqual(rec_st, {"summary": "DISABLED"}) rm.update_config(2, 5, 1, 4, True, True, False) rec_st = rm.get_recovery_status() - self.assertEquals(rec_st, {"summary": "RECOVERABLE", "componentReports": []}) + self.assertEqual(rec_st, {"summary": "RECOVERABLE", "componentReports": []}) rm.execute("PUMA") rec_st = rm.get_recovery_status() - self.assertEquals(rec_st, {"summary": "RECOVERABLE", + self.assertEqual(rec_st, {"summary": "RECOVERABLE", "componentReports": [{"name": "PUMA", "numAttempts": 1, "limitReached": False}]}) rm.execute("PUMA") rm.execute("LION") rec_st = rm.get_recovery_status() - self.assertEquals(rec_st, {"summary": "RECOVERABLE", + self.assertEqual(rec_st, {"summary": "RECOVERABLE", "componentReports": [ - {"name": "LION", "numAttempts": 1, "limitReached": False}, - {"name": "PUMA", "numAttempts": 2, "limitReached": False} + {"name": "PUMA", "numAttempts": 2, "limitReached": False}, + {"name": "LION", "numAttempts": 1, "limitReached": False} ]}) rm.execute("PUMA") rm.execute("LION") @@ -327,18 +327,18 @@ def test_recovery_report(self, time_mock): rm.execute("PUMA") rm.execute("LION") rec_st = rm.get_recovery_status() - self.assertEquals(rec_st, {"summary": "PARTIALLY_RECOVERABLE", + self.assertEqual(rec_st, {"summary": "PARTIALLY_RECOVERABLE", "componentReports": [ - {"name": "LION", "numAttempts": 3, "limitReached": False}, - {"name": "PUMA", "numAttempts": 4, "limitReached": True} + {"name": "PUMA", "numAttempts": 4, "limitReached": True}, + {"name": "LION", "numAttempts": 3, "limitReached": False} ]}) rm.execute("LION") rec_st = rm.get_recovery_status() - self.assertEquals(rec_st, {"summary": "UNRECOVERABLE", + self.assertEqual(rec_st, {"summary": "UNRECOVERABLE", "componentReports": [ - {"name": "LION", "numAttempts": 4, "limitReached": True}, - {"name": "PUMA", "numAttempts": 4, "limitReached": True} + {"name": "PUMA", "numAttempts": 4, "limitReached": True}, + {"name": "LION", "numAttempts": 4, "limitReached": True} ]}) @patch.object(RecoveryManager, "_now_") @@ -434,14 +434,14 @@ def test_reset_if_window_passed_since_last_attempt(self, time_mock): rm.execute("COMPONENT") actions = rm.get_actions_copy()["COMPONENT"] - self.assertEquals(actions['lastReset'], 1000) + self.assertEqual(actions['lastReset'], 1000) rm.execute("COMPONENT") actions = rm.get_actions_copy()["COMPONENT"] - self.assertEquals(actions['lastReset'], 1000) + self.assertEqual(actions['lastReset'], 1000) #reset if window_in_sec seconds passed since last attempt rm.execute("COMPONENT") actions = rm.get_actions_copy()["COMPONENT"] - self.assertEquals(actions['lastReset'], 1372) + self.assertEqual(actions['lastReset'], 1372) @patch.object(RecoveryManager, "_now_") diff --git a/ambari-agent/src/test/python/ambari_agent/TestRegistration.py b/ambari-agent/src/test/python/ambari_agent/TestRegistration.py index 14e29f86096..0c7865924b6 100644 --- a/ambari-agent/src/test/python/ambari_agent/TestRegistration.py +++ b/ambari-agent/src/test/python/ambari_agent/TestRegistration.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -31,9 +31,9 @@ @not_for_platform(PLATFORM_WINDOWS) class TestRegistration(TestCase): - @patch("subprocess32.Popen") + @patch("subprocess.Popen") @patch.object(Hardware, "_chk_writable_mount", new = MagicMock(return_value=True)) - @patch("__builtin__.open", new=MagicMock()) + @patch("builtins.open", new=MagicMock()) @patch.object(FacterLinux, "facterInfo", new = MagicMock(return_value={})) @patch.object(FacterLinux, "__init__", new = MagicMock(return_value = None)) @patch("resource_management.core.shell.call") @@ -52,14 +52,14 @@ def test_registration_build(self, get_os_version_mock, get_os_family_mock, get_o from ambari_agent.Register import Register register = Register(config) data = register.build() - self.assertEquals(len(data['hardwareProfile']) > 0, True, "hardwareProfile should contain content") - self.assertEquals(data['hostname'] != "", True, "hostname should not be empty") - self.assertEquals(data['publicHostname'] != "", True, "publicHostname should not be empty") - self.assertEquals(data['id'], -1) - self.assertEquals(data['timestamp'] > 1353678475465L, True, "timestamp should not be empty") - self.assertEquals(len(data['agentEnv']) > 0, True, "agentEnv should not be empty") - self.assertEquals(not data['agentEnv']['umask']== "", True, "agents umask should not be empty") - self.assertEquals(data['prefix'], config.get('agent', 'prefix'), 'The prefix path does not match') - self.assertEquals(len(data), 10) + self.assertEqual(len(data['hardwareProfile']) > 0, True, "hardwareProfile should contain content") + self.assertEqual(data['hostname'] != "", True, "hostname should not be empty") + self.assertEqual(data['publicHostname'] != "", True, "publicHostname should not be empty") + self.assertEqual(data['id'], -1) + self.assertEqual(data['timestamp'] > 1353678475465, True, "timestamp should not be empty") + self.assertEqual(len(data['agentEnv']) > 0, True, "agentEnv should not be empty") + self.assertEqual(not data['agentEnv']['umask']== "", True, "agents umask should not be empty") + self.assertEqual(data['prefix'], config.get('agent', 'prefix'), 'The prefix path does not match') + self.assertEqual(len(data), 10) diff --git a/ambari-agent/src/test/python/ambari_agent/TestScriptAlert.py b/ambari-agent/src/test/python/ambari_agent/TestScriptAlert.py index 00ad5931f7b..87e7974970d 100644 --- a/ambari-agent/src/test/python/ambari_agent/TestScriptAlert.py +++ b/ambari-agent/src/test/python/ambari_agent/TestScriptAlert.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -23,7 +23,7 @@ from mock.mock import Mock, MagicMock, patch import os -from AmbariConfig import AmbariConfig +from ambari_agent.AmbariConfig import AmbariConfig DUMMY_PATH = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'dummy_files') @@ -54,9 +54,9 @@ def test_collect(self): expected_text = 'bar is 12, baz is asd' def collector_side_effect(clus, data): - self.assertEquals(data['name'], alert_meta['name']) - self.assertEquals(data['clusterId'], cluster_id) - self.assertEquals(clus, cluster) + self.assertEqual(data['name'], alert_meta['name']) + self.assertEqual(data['clusterId'], cluster_id) + self.assertEqual(clus, cluster) mock_collector = MagicMock() mock_collector.put = Mock(side_effect=collector_side_effect) diff --git a/ambari-agent/src/test/python/ambari_agent/TestSecurity.py b/ambari-agent/src/test/python/ambari_agent/TestSecurity.py index 42e53a3eba9..c9d808f6920 100644 --- a/ambari-agent/src/test/python/ambari_agent/TestSecurity.py +++ b/ambari-agent/src/test/python/ambari_agent/TestSecurity.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -17,15 +17,15 @@ See the License for the specific language governing permissions and limitations under the License. ''' -import StringIO +import io import sys -from ambari_commons import subprocess32 +import subprocess from mock.mock import MagicMock, patch, ANY import mock.mock import unittest import logging import signal -import ConfigParser +import configparser import ssl import os import tempfile @@ -33,7 +33,7 @@ from ambari_commons import OSCheck from only_for_platform import os_distro_value -with patch("platform.linux_distribution", return_value = ('Suse','11','Final')): +with patch("distro.linux_distribution", return_value = ('Suse','11','Final')): from ambari_agent import NetUtil from ambari_agent.security import CertificateManager from ambari_agent.AmbariConfig import AmbariConfig @@ -45,7 +45,7 @@ class TestSecurity(unittest.TestCase): @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) def setUp(self): # disable stdout - out = StringIO.StringIO() + out = io.StringIO() sys.stdout = out # Create config self.config = AmbariConfig() @@ -114,7 +114,7 @@ def side_eff(): httpsconn_mock.read.side_effect = side_eff responce = self.cachedHTTPSConnection.request(dummy_request) self.fail("Should raise IOError") - except Exception, err: + except Exception as err: # Expected pass @@ -128,7 +128,7 @@ def test_getAgentKeyName(self, hostname_mock): self.config.set('security', 'keysdir', '/dummy-keysdir') man = CertificateManager(self.config, "active_server") res = man.getAgentKeyName() - self.assertEquals(res, os.path.abspath("/dummy-keysdir/dummy.hostname.key")) + self.assertEqual(res, os.path.abspath("/dummy-keysdir/dummy.hostname.key")) @patch("ambari_agent.hostname.hostname") @@ -137,7 +137,7 @@ def test_getAgentCrtName(self, hostname_mock): self.config.set('security', 'keysdir', '/dummy-keysdir') man = CertificateManager(self.config, "active_server") res = man.getAgentCrtName() - self.assertEquals(res, os.path.abspath("/dummy-keysdir/dummy.hostname.crt")) + self.assertEqual(res, os.path.abspath("/dummy-keysdir/dummy.hostname.crt")) @patch("ambari_agent.hostname.hostname") @@ -146,14 +146,14 @@ def test_getAgentCrtReqName(self, hostname_mock): self.config.set('security', 'keysdir', '/dummy-keysdir') man = CertificateManager(self.config, "active_server") res = man.getAgentCrtReqName() - self.assertEquals(res, os.path.abspath("/dummy-keysdir/dummy.hostname.csr")) + self.assertEqual(res, os.path.abspath("/dummy-keysdir/dummy.hostname.csr")) def test_getSrvrCrtName(self): self.config.set('security', 'keysdir', '/dummy-keysdir') man = CertificateManager(self.config, "active_server") res = man.getSrvrCrtName() - self.assertEquals(res, os.path.abspath("/dummy-keysdir/ca.crt")) + self.assertEqual(res, os.path.abspath("/dummy-keysdir/ca.crt")) @patch("os.path.exists") @@ -203,7 +203,7 @@ def test_checkCertExists(self, reqSignCrt_mock, getAgentCrtName_mock, - @patch("urllib2.OpenerDirector.open") + @patch("urllib.request.OpenerDirector.open") @patch.object(security.CertificateManager, "getSrvrCrtName") def test_loadSrvrCrt(self, getSrvrCrtName_mock, urlopen_mock): read_mock = MagicMock(create=True) @@ -225,11 +225,11 @@ def test_loadSrvrCrt(self, getSrvrCrtName_mock, urlopen_mock): @patch("ambari_agent.hostname.hostname") - @patch('__builtin__.open', create=True, autospec=True) + @patch('builtins.open', create=True, autospec=True) @patch.dict('os.environ', {'DUMMY_PASSPHRASE': 'dummy-passphrase'}) @patch('ambari_simplejson.dumps') - @patch('urllib2.Request') - @patch("urllib2.OpenerDirector.open") + @patch('urllib.request.Request') + @patch("urllib.request.OpenerDirector.open") @patch('ambari_simplejson.loads') def test_reqSignCrt(self, loads_mock, urlopen_mock, request_mock, dumps_mock, open_mock, hostname_mock): self.config.set('security', 'keysdir', '/dummy-keysdir') @@ -276,7 +276,7 @@ def test_reqSignCrt(self, loads_mock, urlopen_mock, request_mock, dumps_mock, op try: man.reqSignCrt() self.fail("Expected exception here") - except Exception, err: + except Exception as err: # expected pass @@ -290,12 +290,12 @@ def test_reqSignCrt(self, loads_mock, urlopen_mock, request_mock, dumps_mock, op pass self.assertFalse(open_mock.return_value.write.called) - @patch.object(subprocess32, "Popen") - @patch("subprocess32.Popen.communicate") + @patch.object(subprocess, "Popen") + @patch("subprocess.Popen.communicate") @patch.object(os, "chmod") def test_genAgentCrtReq(self, chmod_mock, communicate_mock, popen_mock): man = CertificateManager(self.config, "active_server") - p = MagicMock(spec=subprocess32.Popen) + p = MagicMock(spec=subprocess.Popen) p.communicate = communicate_mock popen_mock.return_value = p man.genAgentCrtReq('/dummy-keysdir/hostname.key') @@ -304,8 +304,8 @@ def test_genAgentCrtReq(self, chmod_mock, communicate_mock, popen_mock): self.assertTrue(communicate_mock.called) @patch("ambari_agent.hostname.hostname") - @patch('__builtin__.open', create=True, autospec=True) - @patch("urllib2.OpenerDirector.open") + @patch('builtins.open', create=True, autospec=True) + @patch("urllib.request.OpenerDirector.open") @patch.dict('os.environ', {'DUMMY_PASSPHRASE': 'dummy-passphrase'}) def test_reqSignCrt_malformedJson(self, urlopen_mock, open_mock, hostname_mock): hostname_mock.return_value = "dummy-hostname" @@ -320,7 +320,7 @@ def test_reqSignCrt_malformedJson(self, urlopen_mock, open_mock, hostname_mock): man.reqSignCrt() except ssl.SSLError: self.fail("Unexpected exception!") - open_mock.return_value.write.assert_called_with(u'dummy') + open_mock.return_value.write.assert_called_with('dummy') # test malformed JSON response open_mock.return_value.write.reset_mock() diff --git a/ambari-agent/src/test/python/ambari_agent/TestShell.py b/ambari-agent/src/test/python/ambari_agent/TestShell.py index 0f72020c64f..3bd6e0bf7db 100644 --- a/ambari-agent/src/test/python/ambari_agent/TestShell.py +++ b/ambari-agent/src/test/python/ambari_agent/TestShell.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ @@ -23,7 +23,7 @@ from mock.mock import patch, MagicMock, call from ambari_commons import shell from ambari_commons import OSCheck -from StringIO import StringIO +from io import StringIO ROOT_PID = 10 ROOT_PID_CHILDREN = [10, 11, 12, 13] @@ -91,18 +91,18 @@ def _open_mock_yum(path, open_mode): class TestShell(unittest.TestCase): - @patch("__builtin__.open", new=MagicMock(side_effect=_open_mock)) + @patch("builtins.open", new=MagicMock(side_effect=_open_mock)) def test_get_all_children(self): pid_list = [item[0] for item in shell.get_all_children(ROOT_PID)] - self.assertEquals(len(ROOT_PID_CHILDREN), len(pid_list)) - self.assertEquals(ROOT_PID, pid_list[0]) + self.assertEqual(len(ROOT_PID_CHILDREN), len(pid_list)) + self.assertEqual(ROOT_PID, pid_list[0]) for i in ROOT_PID_CHILDREN: - self.assertEquals(True, i in pid_list) + self.assertEqual(True, i in pid_list) - @patch("__builtin__.open", new=MagicMock(side_effect=_open_mock)) + @patch("builtins.open", new=MagicMock(side_effect=_open_mock)) @patch.object(OSCheck, "get_os_family", new=MagicMock(return_value="redhat")) @patch.object(shell, "signal", new_callable=FakeSignals) @patch("os.listdir") @@ -117,8 +117,8 @@ def test_kill_process_with_children(self, os_kill_mock, os_list_dir_mock, fake_s # test pid kill by SIGTERM os_kill_pids = [item[0][0] for item in os_kill_mock.call_args_list] - self.assertEquals(len(os_kill_pids), len(pid_list)) - self.assertEquals(reverse_pid_list, os_kill_pids) + self.assertEqual(len(os_kill_pids), len(pid_list)) + self.assertEqual(reverse_pid_list, os_kill_pids) os_kill_mock.reset_mock() os_list_dir_mock.reset_mock() @@ -128,10 +128,10 @@ def test_kill_process_with_children(self, os_kill_mock, os_list_dir_mock, fake_s # test pid kill by SIGKILL os_kill_pids = [item[0][0] for item in os_kill_mock.call_args_list] - self.assertEquals(len(os_kill_pids), len(pid_list)*2) - self.assertEquals(reverse_pid_list + reverse_pid_list, os_kill_pids) + self.assertEqual(len(os_kill_pids), len(pid_list)*2) + self.assertEqual(reverse_pid_list + reverse_pid_list, os_kill_pids) - @patch("__builtin__.open", new=MagicMock(side_effect=_open_mock_yum)) + @patch("builtins.open", new=MagicMock(side_effect=_open_mock_yum)) @patch.object(OSCheck, "get_os_family", new=MagicMock(return_value="redhat")) @patch.object(shell, "signal", new_callable=FakeSignals) @patch("os.listdir") @@ -142,5 +142,5 @@ def test_kill_process_with_children_except_yum(self, os_kill_mock, os_list_dir_m # test clean pid by SIGTERM os_kill_pids = [item[0][0] for item in os_kill_mock.call_args_list] - self.assertEquals(len(os_kill_pids), 1) - self.assertEquals([10], os_kill_pids) + self.assertEqual(len(os_kill_pids), 1) + self.assertEqual([10], os_kill_pids) diff --git a/ambari-agent/src/test/python/ambari_agent/dummy_files/test_script.py b/ambari-agent/src/test/python/ambari_agent/dummy_files/test_script.py index de4f9b976d6..c2d54129ad0 100644 --- a/ambari-agent/src/test/python/ambari_agent/dummy_files/test_script.py +++ b/ambari-agent/src/test/python/ambari_agent/dummy_files/test_script.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one diff --git a/ambari-agent/src/test/python/ambari_agent/examples/ControllerTester.py b/ambari-agent/src/test/python/ambari_agent/examples/ControllerTester.py index 4a6e7819fb1..a0ba685f418 100644 --- a/ambari-agent/src/test/python/ambari_agent/examples/ControllerTester.py +++ b/ambari-agent/src/test/python/ambari_agent/examples/ControllerTester.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -21,16 +21,17 @@ from ambari_agent import Controller import pprint, json, os, time, sys import tempfile -from urllib2 import Request, urlopen, URLError +from urllib.request import Request, urlopen +from urllib.error import URLError from mock.mock import patch, MagicMock, call from ambari_agent.AmbariConfig import AmbariConfig -import Queue +import queue import logging from ambari_agent import PythonExecutor logger=logging.getLogger() -queue = Queue.Queue() +queue = queue.Queue() # Set to True to replace python calls with mockups disable_python = True diff --git a/ambari-agent/src/test/python/ambari_agent/examples/debug_testcase_example.py b/ambari-agent/src/test/python/ambari_agent/examples/debug_testcase_example.py index 6c238024b37..2f713d8fa6a 100644 --- a/ambari-agent/src/test/python/ambari_agent/examples/debug_testcase_example.py +++ b/ambari-agent/src/test/python/ambari_agent/examples/debug_testcase_example.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -25,11 +25,11 @@ from ambari_agent.ActionQueue import ActionQueue from ambari_agent import AmbariConfig from ambari_agent.NetUtil import NetUtil -import socket, ConfigParser, logging +import socket, configparser, logging import os, pprint, json, sys, unittest from threading import Thread import time -import Queue +import queue logger = logging.getLogger() diff --git a/ambari-agent/src/test/python/ambari_agent/winpwd.py b/ambari-agent/src/test/python/ambari_agent/winpwd.py index 22beff2bf8b..fd03dc67374 100644 --- a/ambari-agent/src/test/python/ambari_agent/winpwd.py +++ b/ambari-agent/src/test/python/ambari_agent/winpwd.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one diff --git a/ambari-agent/src/test/python/resource_management/TestContentSources.py b/ambari-agent/src/test/python/resource_management/TestContentSources.py index 37281bb7461..b3fcb493d28 100644 --- a/ambari-agent/src/test/python/resource_management/TestContentSources.py +++ b/ambari-agent/src/test/python/resource_management/TestContentSources.py @@ -21,11 +21,12 @@ from only_for_platform import get_platform, not_for_platform, os_distro_value, PLATFORM_WINDOWS import os +import importlib if get_platform() != PLATFORM_WINDOWS: with patch.object(os, "geteuid", return_value=0): from resource_management.core import sudo - reload(sudo) + importlib.reload(sudo) from ambari_commons.os_check import OSCheck @@ -37,7 +38,7 @@ from resource_management.core.source import InlineTemplate from ambari_jinja2 import UndefinedError, TemplateNotFound -import urllib2 +import urllib.request, urllib.error, urllib.parse @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) @@ -79,8 +80,8 @@ def test_static_file_relative_path(self, join_mock, is_file_mock): self.assertEqual(join_mock.call_count, 1) join_mock.assert_called_with('/base', 'files', 'relative/path/file') - @patch.object(urllib2, "build_opener") - @patch.object(urllib2, "Request") + @patch.object(urllib.request, "build_opener") + @patch.object(urllib.request, "Request") @patch.object(os.path, "exists") def test_download_source_get_content_nocache(self, exists_mock, request_mock, opener_mock): """ @@ -100,9 +101,9 @@ def test_download_source_get_content_nocache(self, exists_mock, request_mock, op request_mock.assert_called_with('http://download/source') self.assertEqual(web_file_mock.read.call_count, 1) - @patch("__builtin__.open") - @patch.object(urllib2, "Request") - @patch.object(urllib2, "build_opener") + @patch("builtins.open") + @patch.object(urllib.request, "Request") + @patch.object(urllib.request, "build_opener") @patch.object(os, "makedirs") @patch.object(os.path, "exists") @patch("resource_management.core.sudo.create_file") @@ -129,7 +130,7 @@ def test_download_source_get_content_cache_new(self, create_mock, exists_mock, m request_mock.assert_called_with('http://download/source') self.assertEqual(web_file_mock.read.call_count, 1) - @patch("__builtin__.open") + @patch("builtins.open") @patch.object(os.path, "exists") def test_download_source_get_content_cache_existent(self, exists_mock, open_mock): """ @@ -151,7 +152,7 @@ def test_download_source_get_content_cache_existent(self, exists_mock, open_mock self.assertEqual(open_mock.call_count, 1) self.assertEqual(file_mock.read.call_count, 1) - @patch("__builtin__.open") + @patch("builtins.open") @patch.object(os.path, "getmtime") @patch.object(os.path, "exists") def test_template_loader(self, exists_mock, getmtime_mock, open_mock): @@ -169,7 +170,7 @@ def test_template_loader(self, exists_mock, getmtime_mock, open_mock): template = Template("test.j2") self.assertEqual(open_mock.call_count, 1) - open_mock.assert_called_with('/base/templates/test.j2', 'rb') + open_mock.assert_called_with('/base/templates/test.j2', 'rt') self.assertEqual(getmtime_mock.call_count, 1) getmtime_mock.assert_called_with('/base/templates/test.j2') @@ -189,7 +190,7 @@ def test_template_loader_fail(self, exists_mock): - @patch("__builtin__.open") + @patch("builtins.open") @patch.object(os.path, "getmtime") @patch.object(os.path, "exists") def test_template_loader_absolute_path(self, exists_mock, getmtime_mock, open_mock): @@ -207,11 +208,11 @@ def test_template_loader_absolute_path(self, exists_mock, getmtime_mock, open_mo template = Template("/absolute/path/test.j2") self.assertEqual(open_mock.call_count, 1) - open_mock.assert_called_with('/absolute/path/test.j2', 'rb') + open_mock.assert_called_with('/absolute/path/test.j2', 'rt') self.assertEqual(getmtime_mock.call_count, 1) getmtime_mock.assert_called_with('/absolute/path/test.j2') - @patch("__builtin__.open") + @patch("builtins.open") @patch.object(os.path, "getmtime") @patch.object(os.path, "exists") def test_template_loader_arguments(self, exists_mock, getmtime_mock, open_mock): @@ -230,8 +231,8 @@ def test_template_loader_arguments(self, exists_mock, getmtime_mock, open_mock): content = template.get_content() self.assertEqual(open_mock.call_count, 1) - self.assertEqual(u'test template content', content) - open_mock.assert_called_with('/absolute/path/test.j2', 'rb') + self.assertEqual('test template content', content) + open_mock.assert_called_with('/absolute/path/test.j2', 'rt') self.assertEqual(getmtime_mock.call_count, 1) getmtime_mock.assert_called_with('/absolute/path/test.j2') @@ -243,7 +244,7 @@ def test_inline_template(self): template = InlineTemplate("{{test_arg1}} template content", [], test_arg1 = "test") content = template.get_content() - self.assertEqual(u'test template content', content) + self.assertEqual('test template content', content) def test_template_imports(self): """ @@ -259,4 +260,4 @@ def test_template_imports(self): with Environment("/base") as env: template = InlineTemplate("{{test_arg1}} template content {{os.path.join(path[0],path[1])}}", [os], test_arg1 = "test", path = ["/one","two"]) content = template.get_content() - self.assertEqual(u'test template content /one/two', content) + self.assertEqual('test template content /one/two', content) diff --git a/ambari-agent/src/test/python/resource_management/TestDataStructureUtils.py b/ambari-agent/src/test/python/resource_management/TestDataStructureUtils.py index a4bdc1c73c1..406d4135871 100644 --- a/ambari-agent/src/test/python/resource_management/TestDataStructureUtils.py +++ b/ambari-agent/src/test/python/resource_management/TestDataStructureUtils.py @@ -28,20 +28,20 @@ def test_get_nested(self): dict_ = {1: {2: {3: 'data'}}} empty_dict = {} - self.assertEquals('data', get_from_dict(dict_, (1, 2, 3))) - self.assertEquals('data', get_from_dict(dict_, [1, 2, 3])) + self.assertEqual('data', get_from_dict(dict_, (1, 2, 3))) + self.assertEqual('data', get_from_dict(dict_, [1, 2, 3])) - self.assertEquals({3: 'data'}, get_from_dict(dict_, (1, 2))) + self.assertEqual({3: 'data'}, get_from_dict(dict_, (1, 2))) - self.assertEquals({2: {3: 'data'}}, get_from_dict(dict_, 1)) + self.assertEqual({2: {3: 'data'}}, get_from_dict(dict_, 1)) - self.assertEquals(KeyNotFound, get_from_dict(dict_, (1, 2, 0))) - self.assertEquals(KeyNotFound, get_from_dict(dict_, [1, 2, 0])) - self.assertEquals(KeyNotFound, get_from_dict(dict_, (1, 0, 3))) - self.assertEquals(KeyNotFound, get_from_dict(dict_, (1, 2, 3, 4))) - self.assertEquals(KeyNotFound, get_from_dict(dict_, (0, 2))) + self.assertEqual(KeyNotFound, get_from_dict(dict_, (1, 2, 0))) + self.assertEqual(KeyNotFound, get_from_dict(dict_, [1, 2, 0])) + self.assertEqual(KeyNotFound, get_from_dict(dict_, (1, 0, 3))) + self.assertEqual(KeyNotFound, get_from_dict(dict_, (1, 2, 3, 4))) + self.assertEqual(KeyNotFound, get_from_dict(dict_, (0, 2))) - self.assertEquals('default', get_from_dict(dict_, (0, 2, 3), default_value='default')) - self.assertEquals('default', get_from_dict(empty_dict, (0, 2, 3), default_value='default')) + self.assertEqual('default', get_from_dict(dict_, (0, 2, 3), default_value='default')) + self.assertEqual('default', get_from_dict(empty_dict, (0, 2, 3), default_value='default')) - self.assertEquals(KeyNotFound, get_from_dict(empty_dict, [1])) \ No newline at end of file + self.assertEqual(KeyNotFound, get_from_dict(empty_dict, [1])) \ No newline at end of file diff --git a/ambari-agent/src/test/python/resource_management/TestDatanodeHelper.py b/ambari-agent/src/test/python/resource_management/TestDatanodeHelper.py index 071bd054433..9eb6e90c76b 100644 --- a/ambari-agent/src/test/python/resource_management/TestDatanodeHelper.py +++ b/ambari-agent/src/test/python/resource_management/TestDatanodeHelper.py @@ -50,7 +50,7 @@ def fake_create_dir(directory): """ Fake function used as function pointer. """ - print "Fake function to create directory {0}".format(directory) + print("Fake function to create directory {0}".format(directory)) @patch.object(Script, "get_config", new=MagicMock(return_value={'configurations':{'cluster-env': {'ignore_bad_mounts': False, 'manage_dirs_on_root': True, 'one_dir_per_partition': False}}})) @@ -87,15 +87,15 @@ def test_normalized(self, log_error, log_info, warning_info, dir_mock): mounted_dirs_helper.handle_mounted_dirs(fake_create_dir, params.dfs_data_dir, params.data_dir_mount_file, update_cache=False) for (name, args, kwargs) in log_info.mock_calls: - print args[0] + print(args[0]) for (name, args, kwargs) in log_error.mock_calls: - print args[0] + print(args[0]) log_info.assert_any_call("Forcefully ensuring existence and permissions of the directory: /grid/0/data") log_info.assert_any_call("Forcefully ensuring existence and permissions of the directory: /grid/1/data") log_info.assert_any_call("Forcefully ensuring existence and permissions of the directory: /GRID/2/Data/") - self.assertEquals(0, log_error.call_count) + self.assertEqual(0, log_error.call_count) @patch("resource_management.libraries.functions.mounted_dirs_helper.Directory") @patch.object(Logger, "info") @@ -121,14 +121,14 @@ def test_grid_becomes_unmounted(self, mock_os_exists, mock_os_isdir, mock_get_mo # Function under test mounted_dirs_helper.handle_mounted_dirs(fake_create_dir, self.params.dfs_data_dir, self.params.data_dir_mount_file, update_cache=False) for (name, args, kwargs) in log_info.mock_calls: - print args[0] + print(args[0]) error_logs = [] for (name, args, kwargs) in log_error.mock_calls: error_logs.append(args[0]) # this is a one-tuple error_msg = "".join(error_logs) - self.assertEquals(1, log_error.call_count) + self.assertEqual(1, log_error.call_count) self.assertTrue("Directory /grid/2/data became unmounted from /dev2 . Current mount point: / ." " Please ensure that mounts are healthy. If the mount change was intentional, you can update the contents of " "/var/lib/ambari-agent/data/datanode/dfs_data_dir_mount.hist." in error_msg) @@ -160,62 +160,62 @@ def test_grid_becomes_remounted(self, mock_os_exists, mock_os_isdir, mock_get_mo mounted_dirs_helper.handle_mounted_dirs(fake_create_dir, self.params.data_dir_mount_file, self.params.data_dir_mount_file, update_cache=False) for (name, args, kwargs) in log_info.mock_calls: - print args[0] + print(args[0]) for (name, args, kwargs) in log_error.mock_calls: - print args[0] + print(args[0]) - self.assertEquals(0, log_error.call_count) + self.assertEqual(0, log_error.call_count) def test_get_mounts_with_multiple_data_dirs(self): - self.assertEquals([], mounted_dirs_helper.get_mounts_with_multiple_data_dirs(["/", "/hodoop", "/tmp"], "/hadoop/data,/tmp")) - self.assertEquals([("/", ["/hadoop/data", "/tmp"])], mounted_dirs_helper.get_mounts_with_multiple_data_dirs(["/"], "/hadoop/data,/tmp")) + self.assertEqual([], mounted_dirs_helper.get_mounts_with_multiple_data_dirs(["/", "/hodoop", "/tmp"], "/hadoop/data,/tmp")) + self.assertEqual([("/", ["/hadoop/data", "/tmp"])], mounted_dirs_helper.get_mounts_with_multiple_data_dirs(["/"], "/hadoop/data,/tmp")) def test_may_manage_folder(self): # root, no history file, manage_dirs_on_root = True # folder should be managed dirs_unmounted=set() - self.assertEquals(True, mounted_dirs_helper._may_manage_folder(dir_='/grid/0/data', last_mount_point_for_dir=None, is_non_root_dir=False, dirs_unmounted=dirs_unmounted, error_messages = [], manage_dirs_on_root = True, curr_mount_point = '/')) - self.assertEquals(dirs_unmounted, set()) + self.assertEqual(True, mounted_dirs_helper._may_manage_folder(dir_='/grid/0/data', last_mount_point_for_dir=None, is_non_root_dir=False, dirs_unmounted=dirs_unmounted, error_messages = [], manage_dirs_on_root = True, curr_mount_point = '/')) + self.assertEqual(dirs_unmounted, set()) # root, no history file, manage_dirs_on_root = False # folder should not be managed dirs_unmounted=set() - self.assertEquals(False, mounted_dirs_helper._may_manage_folder(dir_='/grid/0/data', last_mount_point_for_dir=None, is_non_root_dir=False, dirs_unmounted=dirs_unmounted, error_messages = [], manage_dirs_on_root = False, curr_mount_point = '/')) - self.assertEquals(dirs_unmounted, set(['/grid/0/data'])) + self.assertEqual(False, mounted_dirs_helper._may_manage_folder(dir_='/grid/0/data', last_mount_point_for_dir=None, is_non_root_dir=False, dirs_unmounted=dirs_unmounted, error_messages = [], manage_dirs_on_root = False, curr_mount_point = '/')) + self.assertEqual(dirs_unmounted, set(['/grid/0/data'])) # non root, no history file, manage_dirs_on_root = False # folder should be managed dirs_unmounted=set() - self.assertEquals(True, mounted_dirs_helper._may_manage_folder(dir_='/grid/0/data', last_mount_point_for_dir=None, is_non_root_dir=True, dirs_unmounted=dirs_unmounted, error_messages = [], manage_dirs_on_root = False, curr_mount_point = '/')) - self.assertEquals(dirs_unmounted, set()) + self.assertEqual(True, mounted_dirs_helper._may_manage_folder(dir_='/grid/0/data', last_mount_point_for_dir=None, is_non_root_dir=True, dirs_unmounted=dirs_unmounted, error_messages = [], manage_dirs_on_root = False, curr_mount_point = '/')) + self.assertEqual(dirs_unmounted, set()) # unmounted to root, manage_dirs_on_root = True # folder should not be managed dirs_unmounted=set() - self.assertEquals(False, mounted_dirs_helper._may_manage_folder('/grid/0/data', '/grid/0', True, dirs_unmounted, [], False, '/')) - self.assertEquals(dirs_unmounted, set(['/grid/0/data'])) + self.assertEqual(False, mounted_dirs_helper._may_manage_folder('/grid/0/data', '/grid/0', True, dirs_unmounted, [], False, '/')) + self.assertEqual(dirs_unmounted, set(['/grid/0/data'])) # unmounted to root, manage_dirs_on_root = False # folder should not be managed dirs_unmounted=set() - self.assertEquals(False, mounted_dirs_helper._may_manage_folder(dir_='/grid/0/data', last_mount_point_for_dir='/grid/0/data', is_non_root_dir=False, dirs_unmounted=dirs_unmounted, error_messages = [], manage_dirs_on_root = False, curr_mount_point = '/')) - self.assertEquals(dirs_unmounted, set(['/grid/0/data'])) + self.assertEqual(False, mounted_dirs_helper._may_manage_folder(dir_='/grid/0/data', last_mount_point_for_dir='/grid/0/data', is_non_root_dir=False, dirs_unmounted=dirs_unmounted, error_messages = [], manage_dirs_on_root = False, curr_mount_point = '/')) + self.assertEqual(dirs_unmounted, set(['/grid/0/data'])) # same mount = root, manage_dirs_on_root = False # folder should not be managed dirs_unmounted=set() - self.assertEquals(False, mounted_dirs_helper._may_manage_folder(dir_='/grid/0/data', last_mount_point_for_dir='/', is_non_root_dir=False, dirs_unmounted=dirs_unmounted, error_messages = [], manage_dirs_on_root = False, curr_mount_point = '/')) - self.assertEquals(dirs_unmounted, set()) + self.assertEqual(False, mounted_dirs_helper._may_manage_folder(dir_='/grid/0/data', last_mount_point_for_dir='/', is_non_root_dir=False, dirs_unmounted=dirs_unmounted, error_messages = [], manage_dirs_on_root = False, curr_mount_point = '/')) + self.assertEqual(dirs_unmounted, set()) # same mount = root, manage_dirs_on_root = True # folder should be managed dirs_unmounted=set() - self.assertEquals(True, mounted_dirs_helper._may_manage_folder(dir_='/grid/0/data', last_mount_point_for_dir='/', is_non_root_dir=False, dirs_unmounted=dirs_unmounted, error_messages = [], manage_dirs_on_root = True, curr_mount_point = '/')) - self.assertEquals(dirs_unmounted, set()) + self.assertEqual(True, mounted_dirs_helper._may_manage_folder(dir_='/grid/0/data', last_mount_point_for_dir='/', is_non_root_dir=False, dirs_unmounted=dirs_unmounted, error_messages = [], manage_dirs_on_root = True, curr_mount_point = '/')) + self.assertEqual(dirs_unmounted, set()) # mount changed to non root, manage_dirs_on_root = False # folder should not be managed dirs_unmounted=set() - self.assertEquals(False, mounted_dirs_helper._may_manage_folder('/grid/0/data', '/', True, dirs_unmounted, [], False, '/grid/0')) - self.assertEquals(dirs_unmounted, set(['/grid/0/data'])) + self.assertEqual(False, mounted_dirs_helper._may_manage_folder('/grid/0/data', '/', True, dirs_unmounted, [], False, '/grid/0')) + self.assertEqual(dirs_unmounted, set(['/grid/0/data'])) diff --git a/ambari-agent/src/test/python/resource_management/TestDirectoryResource.py b/ambari-agent/src/test/python/resource_management/TestDirectoryResource.py index f91c1ce1fcc..16b1db2869b 100644 --- a/ambari-agent/src/test/python/resource_management/TestDirectoryResource.py +++ b/ambari-agent/src/test/python/resource_management/TestDirectoryResource.py @@ -56,19 +56,19 @@ def test_create_directory_recursive(self, getgrnam_mock, getpwnam_mock, getgrnam_mock.return_value = MagicMock() getgrnam_mock.return_value.gr_gid = 77 - os_stat_mock.return_value = type("", (), dict(st_mode=0755, st_uid=0, st_gid=0))() + os_stat_mock.return_value = type("", (), dict(st_mode=0o755, st_uid=0, st_gid=0))() with Environment('/') as env: Directory('/a/b/c/d', action='create', - mode=0777, + mode=0o777, owner="hdfs", group="hadoop", create_parents = True ) - os_makedirs_mock.assert_called_with('/a/b/c/d', 0777) - os_chmod_mock.assert_called_with('/a/b/c/d', 0777) + os_makedirs_mock.assert_called_with('/a/b/c/d', 0o777) + os_chmod_mock.assert_called_with('/a/b/c/d', 0o777) os_chown_mock.assert_any_call('/a/b/c/d', getpwnam_mock.return_value, getgrnam_mock.return_value) @patch("resource_management.core.sudo.path_exists") @@ -91,18 +91,18 @@ def test_create_directory_not_recursive(self, getgrnam_mock, getpwnam_mock, getpwnam_mock.return_value.pw_uid = 66 getgrnam_mock.return_value = MagicMock() getpwnam_mock.return_value.gr_gid = 77 - os_stat_mock.return_value = type("", (), dict(st_mode=0755, st_uid=0, st_gid=0))() + os_stat_mock.return_value = type("", (), dict(st_mode=0o755, st_uid=0, st_gid=0))() with Environment('/') as env: Directory('/a/b/c/d', action='create', - mode=0777, + mode=0o777, owner="hdfs", group="hadoop" ) - mkdir_mock.assert_called_with('/a/b/c/d', 0777) - os_chmod_mock.assert_called_with('/a/b/c/d', 0777) + mkdir_mock.assert_called_with('/a/b/c/d', 0o777) + os_chmod_mock.assert_called_with('/a/b/c/d', 0o777) os_chown_mock.assert_any_call('/a/b/c/d', getpwnam_mock.return_value, getgrnam_mock.return_value) @patch("resource_management.core.sudo.path_exists") @@ -119,7 +119,7 @@ def test_create_directory_failed_no_parent(self, isdir_mock, os_dirname_mock, with Environment('/') as env: Directory('/a/b/c/d', action='create', - mode=0777, + mode=0o777, owner="hdfs", group="hadoop" ) @@ -138,7 +138,7 @@ def test_create_directory_path_is_file_or_line(self, isdir_mock, os_path_exists_ with Environment('/') as env: Directory('/a/b/c/d', action='create', - mode=0777, + mode=0o777, owner="hdfs", group="hadoop" ) diff --git a/ambari-agent/src/test/python/resource_management/TestEncryption.py b/ambari-agent/src/test/python/resource_management/TestEncryption.py index 0f4227443f4..175fa349f9a 100644 --- a/ambari-agent/src/test/python/resource_management/TestEncryption.py +++ b/ambari-agent/src/test/python/resource_management/TestEncryption.py @@ -24,4 +24,4 @@ class TestUtils(TestCase): def test_attr_to_bitmask(self): encypted_value = '${enc=aes256_hex, value=616639333036363938646230613262383a3a32313537386561376136326362656436656135626165313664613265316336663a3a6361633666333432653532393863313364393064626133653562353663663235}' encyption_key = 'i%r041K%1VC!C5 K=(' - self.assertEquals('mysecret', ensure_decrypted(encypted_value, encyption_key)) + self.assertEqual(b'mysecret', ensure_decrypted(encypted_value, encyption_key)) diff --git a/ambari-agent/src/test/python/resource_management/TestExecuteResource.py b/ambari-agent/src/test/python/resource_management/TestExecuteResource.py index bd7059ec523..8330e6e44dd 100644 --- a/ambari-agent/src/test/python/resource_management/TestExecuteResource.py +++ b/ambari-agent/src/test/python/resource_management/TestExecuteResource.py @@ -28,7 +28,7 @@ from resource_management.core.environment import Environment from resource_management.core.shell import quote_bash_args -from ambari_commons import subprocess32 +import subprocess import logging import os from resource_management import Fail @@ -45,7 +45,7 @@ class TestExecuteResource(TestCase): @patch.object(os, "read") @patch.object(select, "select") @patch.object(logging.Logger, "info") - @patch.object(subprocess32, "Popen") + @patch.object(subprocess, "Popen") def test_attribute_logoutput(self, popen_mock, info_mock, select_mock, os_read_mock): subproc_mock = MagicMock() subproc_mock.wait.return_value = MagicMock() @@ -64,8 +64,8 @@ def test_attribute_logoutput(self, popen_mock, info_mock, select_mock, os_read_m info_mock.assert_called('1') self.assertTrue("call('2')" not in str(info_mock.mock_calls)) - @patch('subprocess32.Popen.communicate') - @patch.object(subprocess32, "Popen") + @patch('subprocess.Popen.communicate') + @patch.object(subprocess, "Popen") def test_attribute_wait(self, popen_mock, proc_communicate_mock): with Environment("/") as env: Execute('echo "1"', @@ -73,11 +73,11 @@ def test_attribute_wait(self, popen_mock, proc_communicate_mock): Execute('echo "2"', wait_for_finish=False) - self.assertTrue(popen_mock.called, 'subprocess32.Popen should have been called!') + self.assertTrue(popen_mock.called, 'subprocess.Popen should have been called!') self.assertFalse(proc_communicate_mock.called, 'proc.communicate should not have been called!') @patch("resource_management.core.sudo.path_exists") - @patch.object(subprocess32, "Popen") + @patch.object(subprocess, "Popen") def test_attribute_creates(self, popen_mock, exists_mock): exists_mock.return_value = True @@ -96,7 +96,7 @@ def test_attribute_creates(self, popen_mock, exists_mock): @patch.object(os, "read") @patch.object(select, "select") - @patch.object(subprocess32, "Popen") + @patch.object(subprocess, "Popen") def test_attribute_path(self, popen_mock, select_mock, os_read_mock): subproc_mock = MagicMock() subproc_mock.wait.return_value = MagicMock() @@ -116,7 +116,7 @@ def test_attribute_path(self, popen_mock, select_mock, os_read_mock): @patch.object(os, "read") @patch.object(select, "select") @patch('time.sleep') - @patch.object(subprocess32, "Popen") + @patch.object(subprocess, "Popen") def test_attribute_try_sleep_tries(self, popen_mock, time_mock, select_mock, os_read_mock): expected_call = "call('Retrying after %d seconds. Reason: %s', 1, 'Fail')" @@ -157,7 +157,7 @@ def error(argument): @patch.object(os, "read") @patch.object(select, "select") - @patch.object(subprocess32, "Popen") + @patch.object(subprocess, "Popen") def test_attribute_environment(self, popen_mock, select_mock, os_read_mock): expected_dict = {"JAVA_HOME": "/test/java/home"} @@ -179,7 +179,7 @@ def test_attribute_environment(self, popen_mock, select_mock, os_read_mock): @patch.object(os, "read") @patch.object(select, "select") - @patch.object(subprocess32, "Popen") + @patch.object(subprocess, "Popen") def test_attribute_environment_non_root(self, popen_mock, select_mock, os_read_mock): expected_user = 'test_user' @@ -197,15 +197,15 @@ def test_attribute_environment_non_root(self, popen_mock, select_mock, os_read_m environment={'JAVA_HOME': '/test/java/home', 'PATH': "/bin"} ) - - expected_command = ['/bin/bash', '--login', '--noprofile', '-c', 'ambari-sudo.sh su test_user -l -s /bin/bash -c ' + quote_bash_args('export PATH=' + quote_bash_args(os.environ['PATH'] + ':/bin') + ' JAVA_HOME=/test/java/home ; echo "1"')] + + expected_command = ['/bin/bash', '--login', '--noprofile', '-c', 'ambari-sudo.sh su test_user -l -s /bin/bash -c ' + quote_bash_args('export JAVA_HOME=/test/java/home' + ' PATH=' + quote_bash_args(os.environ['PATH'] + ':/bin') + ' ; echo "1"')] self.assertEqual(popen_mock.call_args_list[0][0][0], expected_command) @patch.object(os, "read") @patch.object(select, "select") - @patch.object(subprocess32, "Popen") + @patch.object(subprocess, "Popen") def test_attribute_cwd(self, popen_mock, select_mock, os_read_mock): expected_cwd = "/test/work/directory" @@ -226,7 +226,7 @@ def test_attribute_cwd(self, popen_mock, select_mock, os_read_mock): @patch.object(os, "read") @patch.object(select, "select") - @patch.object(subprocess32, "Popen") + @patch.object(subprocess, "Popen") def test_attribute_command_escaping(self, popen_mock, select_mock, os_read_mock): expected_command0 = "arg1 arg2 'quoted arg'" expected_command1 = "arg1 arg2 'command \"arg\"'" @@ -266,7 +266,7 @@ def test_attribute_command_escaping(self, popen_mock, select_mock, os_read_mock) @patch.object(os, "read") @patch.object(select, "select") - @patch.object(subprocess32, "Popen") + @patch.object(subprocess, "Popen") def test_attribute_command_one_line(self, popen_mock, select_mock, os_read_mock): expected_command = "rm -rf /somedir" diff --git a/ambari-agent/src/test/python/resource_management/TestFcntlBasedProcessLock.py b/ambari-agent/src/test/python/resource_management/TestFcntlBasedProcessLock.py index be6ff8040dd..2b0b66360cd 100644 --- a/ambari-agent/src/test/python/resource_management/TestFcntlBasedProcessLock.py +++ b/ambari-agent/src/test/python/resource_management/TestFcntlBasedProcessLock.py @@ -56,7 +56,7 @@ def dummy_task(index, mutex): for p in process_list: p.join(2) - self.assertEquals(p.exitcode, 0) + self.assertEqual(p.exitcode, 0) finally: shutil.rmtree(test_temp_dir) diff --git a/ambari-agent/src/test/python/resource_management/TestFileResource.py b/ambari-agent/src/test/python/resource_management/TestFileResource.py index bcabdd29667..faba3e296e3 100644 --- a/ambari-agent/src/test/python/resource_management/TestFileResource.py +++ b/ambari-agent/src/test/python/resource_management/TestFileResource.py @@ -52,7 +52,7 @@ def test_action_create_dir_exist(self, isdir_mock, dirname_mock): with Environment('/') as env: File('/existent_directory', action='create', - mode=0777, + mode=0o777, content='file-content' ) @@ -75,7 +75,7 @@ def test_action_create_parent_dir_non_exist(self, isdir_mock, dirname_mock): with Environment('/') as env: File('/non_existent_directory/file', action='create', - mode=0777, + mode=0o777, content='file-content' ) @@ -100,7 +100,7 @@ def test_action_create_non_existent_file(self, isdir_mock, exists_mock, create_f with Environment('/') as env: File('/directory/file', action='create', - mode=0777, + mode=0o777, content='file-content' ) @@ -124,7 +124,7 @@ def test_action_create_replace(self, isdir_mock, exists_mock, create_file_mock, with Environment('/') as env: File('/directory/file', action='create', - mode=0777, + mode=0o777, backup=False, content='new-content' ) @@ -146,7 +146,7 @@ def test_action_delete_is_directory(self, isdir_mock, exist_mock, unlink_mock): with Environment('/') as env: File('/directory/file', action='delete', - mode=0777, + mode=0o777, backup=False, content='new-content' ) @@ -171,7 +171,7 @@ def test_action_delete(self, isdir_mock, exist_mock, unlink_mock): with Environment('/') as env: File('/directory/file', action='delete', - mode=0777, + mode=0o777, backup=False, content='new-content' ) @@ -193,7 +193,7 @@ def test_attribute_path(self, isdir_mock): with Environment('/') as env: File('/existent_directory', action='create', - mode=0777, + mode=0o777, content='file-content' ) @@ -219,7 +219,7 @@ def test_attribute_backup(self, isdir_mock, exists_mock, create_file_mock, read with Environment('/') as env: File('/directory/file', action='create', - mode=0777, + mode=0o777, backup=False, content='new-content' ) @@ -230,7 +230,7 @@ def test_attribute_backup(self, isdir_mock, exists_mock, create_file_mock, read with Environment('/') as env: File('/directory/file', action='create', - mode=0777, + mode=0o777, backup=True, content='new-content' ) @@ -241,7 +241,7 @@ def test_attribute_backup(self, isdir_mock, exists_mock, create_file_mock, read @patch("resource_management.core.providers.system._ensure_metadata") - @patch("__builtin__.open") + @patch("builtins.open") @patch("resource_management.core.sudo.path_exists") @patch("resource_management.core.sudo.path_isdir") def test_attribute_replace(self, isdir_mock, exists_mock, open_mock, ensure_mock): @@ -257,7 +257,7 @@ def test_attribute_replace(self, isdir_mock, exists_mock, open_mock, ensure_mock with Environment('/') as env: File('/directory/file', action='create', - mode=0777, + mode=0o777, backup=False, content='new-content', replace=False @@ -284,7 +284,7 @@ def test_ensure_metadata(self, stat_mock, chmod_mock, chown_mock, getgrnam_mock, class stat(): def __init__(self): - self.st_mode = 0666 + self.st_mode = 0o666 self.st_uid = 1 self.st_gid = 1 @@ -295,7 +295,7 @@ def __init__(self): getgrnam_mock.return_value.gr_gid = 0 with Environment('/') as env: - _ensure_metadata('/directory/file', user='root', group='hdfs', mode=0777) + _ensure_metadata('/directory/file', user='root', group='hdfs', mode=0o777) stat_mock.assert_called_with('/directory/file') self.assertEqual(chmod_mock.call_count, 1) @@ -311,7 +311,7 @@ def __init__(self): getgrnam_mock.return_value.gr_gid = 1 with Environment('/') as env: - _ensure_metadata('/directory/file', user='root', group='hdfs', mode=0777) + _ensure_metadata('/directory/file', user='root', group='hdfs', mode=0o777) self.assertEqual(chmod_mock.call_count, 1) chown_mock.assert_called_with('/directory/file', None, None) @@ -333,7 +333,7 @@ def test_action_create_encoding(self, isdir_mock, exists_mock, create_file_mock, with Environment('/') as env: File('/directory/file', action='create', - mode=0777, + mode=0o777, content='file-content', encoding = "UTF-8" ) diff --git a/ambari-agent/src/test/python/resource_management/TestGetPathFromUrl.py b/ambari-agent/src/test/python/resource_management/TestGetPathFromUrl.py index 7550a006395..96744376a58 100644 --- a/ambari-agent/src/test/python/resource_management/TestGetPathFromUrl.py +++ b/ambari-agent/src/test/python/resource_management/TestGetPathFromUrl.py @@ -24,8 +24,8 @@ class TestGetPathFromUlr(TestCase): def test_get_path_from_url(self): - self.assertEquals(get_path_from_url("http://test.host:8888/test/path"), "test/path") - self.assertEquals(get_path_from_url("http://test.host/test/path"), "test/path") - self.assertEquals(get_path_from_url("test.host:8888/test/path"), "test/path") - self.assertEquals(get_path_from_url("test.host/test/path"), "test/path") - self.assertEquals(get_path_from_url("/test/path"), "test/path") + self.assertEqual(get_path_from_url("http://test.host:8888/test/path"), "test/path") + self.assertEqual(get_path_from_url("http://test.host/test/path"), "test/path") + self.assertEqual(get_path_from_url("test.host:8888/test/path"), "test/path") + self.assertEqual(get_path_from_url("test.host/test/path"), "test/path") + self.assertEqual(get_path_from_url("/test/path"), "test/path") diff --git a/ambari-agent/src/test/python/resource_management/TestGroupResource.py b/ambari-agent/src/test/python/resource_management/TestGroupResource.py index 5d27e77ded7..efbf89db789 100644 --- a/ambari-agent/src/test/python/resource_management/TestGroupResource.py +++ b/ambari-agent/src/test/python/resource_management/TestGroupResource.py @@ -29,7 +29,7 @@ import os import select -from ambari_commons import subprocess32 +import subprocess if get_platform() != PLATFORM_WINDOWS: import grp @@ -47,7 +47,7 @@ class TestGroupResource(TestCase): @patch("grp.getgrnam") - @patch.object(subprocess32, "Popen") + @patch.object(subprocess, "Popen") def test_action_create_nonexistent(self, popen_mock, getgrnam_mock): subproc_mock = MagicMock() subproc_mock.returncode = 0 @@ -68,7 +68,7 @@ def test_action_create_nonexistent(self, popen_mock, getgrnam_mock): @patch("grp.getgrnam") - @patch.object(subprocess32, "Popen") + @patch.object(subprocess, "Popen") def test_action_create_existent(self, popen_mock, getgrnam_mock): subproc_mock = MagicMock() subproc_mock.returncode = 0 @@ -85,12 +85,12 @@ def test_action_create_existent(self, popen_mock, getgrnam_mock): self.assertEqual(popen_mock.call_count, 1) - popen_mock.assert_called_with(['/bin/bash', '--login', '--noprofile', '-c', "ambari-sudo.sh PATH=/bin -H -E groupmod -p secure -g 2 mapred"], shell=False, preexec_fn=preexec_fn, stderr=-2, stdout=-1, env={'PATH': '/bin'}, cwd=None, close_fds=True) + popen_mock.assert_called_with(['/bin/bash', '--login', '--noprofile', '-c', "ambari-sudo.sh PATH=/bin -H -E groupmod -g 2 -p secure mapred"], shell=False, preexec_fn=preexec_fn, stderr=-2, stdout=-1, env={'PATH': '/bin'}, cwd=None, close_fds=True) getgrnam_mock.assert_called_with('mapred') @patch("grp.getgrnam") - @patch.object(subprocess32, "Popen") + @patch.object(subprocess, "Popen") def test_action_create_fail(self, popen_mock, getgrnam_mock): subproc_mock = MagicMock() subproc_mock.returncode = 1 @@ -110,12 +110,12 @@ def test_action_create_fail(self, popen_mock, getgrnam_mock): except Fail: pass self.assertEqual(popen_mock.call_count, 1) - popen_mock.assert_called_with(['/bin/bash', '--login', '--noprofile', '-c', "ambari-sudo.sh PATH=/bin -H -E groupmod -p secure -g 2 mapred"], shell=False, preexec_fn=preexec_fn, stderr=-2, stdout=-1, env={'PATH': '/bin'}, cwd=None, close_fds=True) + popen_mock.assert_called_with(['/bin/bash', '--login', '--noprofile', '-c', "ambari-sudo.sh PATH=/bin -H -E groupmod -g 2 -p secure mapred"], shell=False, preexec_fn=preexec_fn, stderr=-2, stdout=-1, env={'PATH': '/bin'}, cwd=None, close_fds=True) getgrnam_mock.assert_called_with('mapred') @patch("grp.getgrnam") - @patch.object(subprocess32, "Popen") + @patch.object(subprocess, "Popen") def test_action_remove(self, popen_mock, getgrnam_mock): subproc_mock = MagicMock() @@ -136,7 +136,7 @@ def test_action_remove(self, popen_mock, getgrnam_mock): @patch("grp.getgrnam") - @patch.object(subprocess32, "Popen") + @patch.object(subprocess, "Popen") def test_action_remove_fail(self, popen_mock, getgrnam_mock): subproc_mock = MagicMock() diff --git a/ambari-agent/src/test/python/resource_management/TestNamenodeHaUtils.py b/ambari-agent/src/test/python/resource_management/TestNamenodeHaUtils.py index 18f316f6941..3688da5f44c 100644 --- a/ambari-agent/src/test/python/resource_management/TestNamenodeHaUtils.py +++ b/ambari-agent/src/test/python/resource_management/TestNamenodeHaUtils.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one diff --git a/ambari-agent/src/test/python/resource_management/TestPackageResource.py b/ambari-agent/src/test/python/resource_management/TestPackageResource.py index 2e40052d660..43d17ab97f2 100644 --- a/ambari-agent/src/test/python/resource_management/TestPackageResource.py +++ b/ambari-agent/src/test/python/resource_management/TestPackageResource.py @@ -40,13 +40,13 @@ def test_action_install_pattern_rhel(self, shell_mock): shell_mock.return_value.__enter__.return_value = [] sys.modules['rpm'] = MagicMock() sys.modules['rpm'].TransactionSet.return_value = MagicMock() - sys.modules['rpm'].TransactionSet.return_value.dbMatch.return_value = [{'name':'some_packag'}] + sys.modules['rpm'].TransactionSet.return_value.dbMatch.return_value = [{'name': b'some_packag'}] with Environment('/') as env: Package("some_package*", logoutput = False ) - self.assertEquals(shell_mock.call_args_list[0][0][0],['/usr/bin/yum', '-d', '0', '-e', '0', '-y', 'install', 'some_package*']) + self.assertEqual(shell_mock.call_args_list[0][0][0],['/usr/bin/yum', '-d', '0', '-e', '0', '-y', 'install', 'some_package*']) @patch.object(ac_shell, "process_executor") @patch.object(ManagerFactory, "get", new=MagicMock(return_value=ManagerFactory.get_new_instance(OSConst.REDHAT_FAMILY))) @@ -55,7 +55,7 @@ def test_action_install_pattern_installed_rhel(self, shell_mock): sys.modules['yum'] = MagicMock() sys.modules['yum'].YumBase.return_value = MagicMock() sys.modules['yum'].YumBase.return_value.rpmdb = MagicMock() - sys.modules['yum'].YumBase.return_value.rpmdb.simplePkgList.return_value = [('some_package_1_2_3',)] + sys.modules['yum'].YumBase.return_value.rpmdb.simplePkgList.return_value = [( b'some_package_1_2_3',)] with Environment('/') as env: Package("some_package*", logoutput = False @@ -71,14 +71,14 @@ def test_action_install_pattern_suse(self, shell_mock, call_mock): ) call_mock.assert_has_calls([call("installed_pkgs=`rpm -qa 'some_package*'` ; [ ! -z \"$installed_pkgs\" ]"), call("zypper --non-interactive search --type package --uninstalled-only --match-exact 'some_package*'")]) - self.assertEquals(shell_mock.call_args_list[0][0][0],['/usr/bin/zypper', '--quiet', 'install', '--auto-agree-with-licenses', '--no-confirm', 'some_package*']) + self.assertEqual(shell_mock.call_args_list[0][0][0],['/usr/bin/zypper', '--quiet', 'install', '--auto-agree-with-licenses', '--no-confirm', 'some_package*']) @patch.object(ac_shell, "process_executor") @patch.object(ManagerFactory, "get", new=MagicMock(return_value=ManagerFactory.get_new_instance(OSConst.SUSE_FAMILY))) def test_action_install_pattern_suse(self, shell_mock): sys.modules['rpm'] = MagicMock() sys.modules['rpm'].TransactionSet.return_value = MagicMock() - sys.modules['rpm'].TransactionSet.return_value.dbMatch.return_value = [{'name':'some_packagetest'}] + sys.modules['rpm'].TransactionSet.return_value.dbMatch.return_value = [{'name': b'some_packagetest'}] with Environment('/') as env: Package("some_package*", ) @@ -89,7 +89,7 @@ def test_action_install_pattern_suse(self, shell_mock): def test_action_install_existent_rhel(self, shell_mock): sys.modules['rpm'] = MagicMock() sys.modules['rpm'].TransactionSet.return_value = MagicMock() - sys.modules['rpm'].TransactionSet.return_value.dbMatch.return_value = [{'name':'some_package'}] + sys.modules['rpm'].TransactionSet.return_value.dbMatch.return_value = [{'name': b'some_package'}] with Environment('/') as env: Package("some_package", ) @@ -100,7 +100,7 @@ def test_action_install_existent_rhel(self, shell_mock): def test_action_install_existent_suse(self, shell_mock): sys.modules['rpm'] = MagicMock() sys.modules['rpm'].TransactionSet.return_value = MagicMock() - sys.modules['rpm'].TransactionSet.return_value.dbMatch.return_value = [{'name':'some_package'}] + sys.modules['rpm'].TransactionSet.return_value.dbMatch.return_value = [{'name': b'some_package'}] with Environment('/') as env: Package("some_package", ) @@ -111,13 +111,13 @@ def test_action_install_existent_suse(self, shell_mock): def test_action_remove_rhel(self, shell_mock): sys.modules['rpm'] = MagicMock() sys.modules['rpm'].TransactionSet.return_value = MagicMock() - sys.modules['rpm'].TransactionSet.return_value.dbMatch.return_value = [{'name':'some_package'}] + sys.modules['rpm'].TransactionSet.return_value.dbMatch.return_value = [{'name': b'some_package'}] with Environment('/') as env: Package("some_package", action = "remove", logoutput = False ) - self.assertEquals(shell_mock.call_args_list[0][0][0], ['/usr/bin/yum', '-d', '0', '-e', '0', '-y', 'erase', 'some_package']) + self.assertEqual(shell_mock.call_args_list[0][0][0], ['/usr/bin/yum', '-d', '0', '-e', '0', '-y', 'erase', 'some_package']) @replace_underscores diff --git a/ambari-agent/src/test/python/resource_management/TestPropertiesFileResource.py b/ambari-agent/src/test/python/resource_management/TestPropertiesFileResource.py index 6b7ae8ff3d7..c1c8cb656f1 100644 --- a/ambari-agent/src/test/python/resource_management/TestPropertiesFileResource.py +++ b/ambari-agent/src/test/python/resource_management/TestPropertiesFileResource.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one @@ -69,7 +69,7 @@ def test_action_create_empty_properties_without_dir(self, properties={} ) - create_file_mock.assert_called_with('/somewhere_in_system/one_file.properties', u'# Generated by Apache Ambari. Today is Wednesday\n \n ', encoding="UTF-8", on_file_created=ANY) + create_file_mock.assert_called_with('/somewhere_in_system/one_file.properties', '# Generated by Apache Ambari. Today is Wednesday\n \n ', encoding="UTF-8", on_file_created=ANY) ensure_mock.assert_called() @@ -102,7 +102,7 @@ def test_action_create_empty_properties_with_dir(self, properties={}, ) - create_file_mock.assert_called_with('/dir/and/dir/file.txt', u'# Generated by Apache Ambari. Some other day\n \n ', encoding="UTF-8", on_file_created=ANY) + create_file_mock.assert_called_with('/dir/and/dir/file.txt', '# Generated by Apache Ambari. Some other day\n \n ', encoding="UTF-8", on_file_created=ANY) ensure_mock.assert_called() @@ -135,7 +135,7 @@ def test_action_create_properties_simple(self, properties={'property1': 'value1'}, ) - create_file_mock.assert_called_with('/dir/new_file', u'# Generated by Apache Ambari. 777\n \nproperty1=value1\n ', encoding="UTF-8", on_file_created=ANY) + create_file_mock.assert_called_with('/dir/new_file', '# Generated by Apache Ambari. 777\n \nproperty1=value1\n ', encoding="UTF-8", on_file_created=ANY) ensure_mock.assert_called() @@ -173,7 +173,7 @@ def test_action_create_properties_with_metacharacters(self, }, ) - create_file_mock.assert_called_with('/dir/new_file', u"# Generated by Apache Ambari. 777\n \n=\nprop.1='.'yyyy-MM-dd-HH\nprop.2=INFO, openjpa\nprop.3=%d{ISO8601} %5p %c{1}:%L - %m%n\nprop.4=${oozie.log.dir}/oozie.log\nprop.empty=\n ", encoding="UTF-8", on_file_created=ANY) + create_file_mock.assert_called_with('/dir/new_file', "# Generated by Apache Ambari. 777\n \n=\nprop.1='.'yyyy-MM-dd-HH\nprop.2=INFO, openjpa\nprop.3=%d{ISO8601} %5p %c{1}:%L - %m%n\nprop.4=${oozie.log.dir}/oozie.log\nprop.empty=\n ", encoding="UTF-8", on_file_created=ANY) ensure_mock.assert_called() @@ -210,5 +210,5 @@ def test_action_create_properties_rewrite_content(self, ) read_file_mock.assert_called() - create_file_mock.assert_called_with('/dir1/new_file', u'# Generated by Apache Ambari. 777\n \nproperty_1=value1\n ', encoding="UTF-8", on_file_created=ANY) + create_file_mock.assert_called_with('/dir1/new_file', '# Generated by Apache Ambari. 777\n \nproperty_1=value1\n ', encoding="UTF-8", on_file_created=ANY) ensure_mock.assert_called() diff --git a/ambari-agent/src/test/python/resource_management/TestRepositoryResource.py b/ambari-agent/src/test/python/resource_management/TestRepositoryResource.py index e296e1dd082..bc6343f19bc 100644 --- a/ambari-agent/src/test/python/resource_management/TestRepositoryResource.py +++ b/ambari-agent/src/test/python/resource_management/TestRepositoryResource.py @@ -16,8 +16,9 @@ limitations under the License. ''' -import os, sys +import os, sys, io import tempfile +from io import RawIOBase from unittest import TestCase from mock.mock import patch, MagicMock from only_for_platform import get_platform, not_for_platform, PLATFORM_WINDOWS @@ -32,6 +33,7 @@ if get_platform() != PLATFORM_WINDOWS: from resource_management.libraries.providers import repository + class DummyTemplate(object): def __init__(self, name, extra_imports=[], **kwargs): @@ -163,7 +165,7 @@ def test_recreate_repo_suse(self, filecmp_mock, read_file_mock, checked_call_moc self.assertTrue(checked_call_mock.called) - expected_repo_file_content = "[hadoop]\nname=hadoop\nmirrorlist=https://mirrors.base_url.org/?repo=Repository&arch=$basearch\n\npath=/\nenabled=1\ngpgcheck=0" + expected_repo_file_content = b"[hadoop]\nname=hadoop\nmirrorlist=https://mirrors.base_url.org/?repo=Repository&arch=$basearch\n\npath=/\nenabled=1\ngpgcheck=0" template = file_mock.call_args_list[0][1]['content'] self.assertEqual(expected_repo_file_content, template) @@ -180,7 +182,7 @@ def test_recreate_repo_suse(self, filecmp_mock, read_file_mock, checked_call_moc self.assertFalse(checked_call_mock.called) - expected_repo_file_content = "[hadoop]\nname=hadoop\nmirrorlist=https://mirrors.base_url.org/?repo=Repository&arch=$basearch\n\npath=/\nenabled=1\ngpgcheck=0" + expected_repo_file_content = b"[hadoop]\nname=hadoop\nmirrorlist=https://mirrors.base_url.org/?repo=Repository&arch=$basearch\n\npath=/\nenabled=1\ngpgcheck=0" template = file_mock.call_args_list[0][1]['content'] self.assertEqual(expected_repo_file_content, template) @@ -202,7 +204,7 @@ def test_create_repo_ubuntu_repo_exists(self, file_mock, execute_mock, is_redhat_family.return_value = False is_ubuntu_family.return_value = True is_suse_family.return_value = False - tempfile_mock.return_value = MagicMock(spec=file) + tempfile_mock.return_value = MagicMock(spec=RawIOBase) tempfile_mock.return_value.__enter__.return_value.name = "/tmp/1.txt" call_mock.return_value = 0, "The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 123ABCD" @@ -220,12 +222,12 @@ def test_create_repo_ubuntu_repo_exists(self, file_mock, execute_mock, template_name = call_content[0][0] template_content = call_content[1]['content'] - self.assertEquals(template_name, '/tmp/1.txt') - self.assertEquals(template_content, 'deb http://download.base_url.org/rpm/ a b c') + self.assertEqual(template_name, '/tmp/1.txt') + self.assertEqual(template_content, b'deb http://download.base_url.org/rpm/ a b c') copy_item0 = str(file_mock.call_args_list[1]) copy_item1 = str(file_mock.call_args_list[2]) - self.assertEqual(copy_item0, "call('/tmp/1.txt', owner='ambari-agent', content=StaticFile('/etc/apt/sources.list.d/HDP.list'))") + self.assertEqual(copy_item0, "call('/tmp/1.txt', content=StaticFile('/etc/apt/sources.list.d/HDP.list'), owner='ambari-agent')") self.assertEqual(copy_item1, "call('/etc/apt/sources.list.d/HDP.list', content=StaticFile('/tmp/1.txt'))") #'apt-get update -qq -o Dir::Etc::sourcelist="sources.list.d/HDP.list" -o APT::Get::List-Cleanup="0"') execute_command_item = execute_mock.call_args_list[0][0][0] @@ -247,7 +249,7 @@ def test_create_repo_ubuntu_gpg_key_wrong_output(self, file_mock, execute_mock, """ Checks that GPG key is extracted from output without \r sign """ - tempfile_mock.return_value = MagicMock(spec=file) + tempfile_mock.return_value = MagicMock(spec=RawIOBase) tempfile_mock.return_value.__enter__.return_value.name = "/tmp/1.txt" call_mock.return_value = 0, "The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 123ABCD\r\n" @@ -265,12 +267,12 @@ def test_create_repo_ubuntu_gpg_key_wrong_output(self, file_mock, execute_mock, template_name = call_content[0][0] template_content = call_content[1]['content'] - self.assertEquals(template_name, '/tmp/1.txt') - self.assertEquals(template_content, 'deb http://download.base_url.org/rpm/ a b c') + self.assertEqual(template_name, '/tmp/1.txt') + self.assertEqual(template_content, b'deb http://download.base_url.org/rpm/ a b c') copy_item0 = str(file_mock.call_args_list[1]) copy_item1 = str(file_mock.call_args_list[2]) - self.assertEqual(copy_item0, "call('/tmp/1.txt', owner='ambari-agent', content=StaticFile('/etc/apt/sources.list.d/HDP.list'))") + self.assertEqual(copy_item0, "call('/tmp/1.txt', content=StaticFile('/etc/apt/sources.list.d/HDP.list'), owner='ambari-agent')") self.assertEqual(copy_item1, "call('/etc/apt/sources.list.d/HDP.list', content=StaticFile('/tmp/1.txt'))") execute_command_item = execute_mock.call_args_list[0][0][0] @@ -285,7 +287,7 @@ def test_create_repo_ubuntu_gpg_key_wrong_output(self, file_mock, execute_mock, @patch.object(System, "os_release_name", new='precise') @patch.object(System, "os_family", new='ubuntu') def test_create_repo_ubuntu_doesnt_repo_exist(self, file_mock, execute_mock, tempfile_mock): - tempfile_mock.return_value = MagicMock(spec=file) + tempfile_mock.return_value = MagicMock(spec=RawIOBase) tempfile_mock.return_value.__enter__.return_value.name = "/tmp/1.txt" with Environment('/') as env: @@ -302,8 +304,8 @@ def test_create_repo_ubuntu_doesnt_repo_exist(self, file_mock, execute_mock, tem template_name = call_content[0][0] template_content = call_content[1]['content'] - self.assertEquals(template_name, '/tmp/1.txt') - self.assertEquals(template_content, 'deb http://download.base_url.org/rpm/ a b c') + self.assertEqual(template_name, '/tmp/1.txt') + self.assertEqual(template_content, b'deb http://download.base_url.org/rpm/ a b c') self.assertEqual(file_mock.call_count, 2) self.assertEqual(execute_mock.call_count, 0) diff --git a/ambari-agent/src/test/python/resource_management/TestScript.py b/ambari-agent/src/test/python/resource_management/TestScript.py index cc5c171d963..d7aaad371a7 100644 --- a/ambari-agent/src/test/python/resource_management/TestScript.py +++ b/ambari-agent/src/test/python/resource_management/TestScript.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -17,7 +17,7 @@ See the License for the specific language governing permissions and limitations under the License. ''' -import StringIO +import io import sys, pprint from resource_management.libraries.script import Script from resource_management.core.environment import Environment @@ -29,10 +29,10 @@ class TestScript(RMFTestCase): def setUp(self): # disable stdout - out = StringIO.StringIO() + out = io.StringIO() sys.stdout = out - @patch("__builtin__.open") + @patch("builtins.open") def test_structured_out(self, open_mock): script = Script() script.stroutfile = '' @@ -51,7 +51,7 @@ def test_structured_out(self, open_mock): self.assertEqual(open_mock.call_count, 3) self.assertEqual(Script.structuredOut, {"1": "3", "2": "2"}) - @patch("__builtin__.open") + @patch("builtins.open") def test_status_commands_clear_structured_out(self, open_mock): """ Tests that status commands will clear any stored structured output from prior status commands. @@ -83,7 +83,7 @@ def __enter__(self): pass self.assertTrue(open_mock.called) - self.assertEquals({}, Script.structuredOut) + self.assertEqual({}, Script.structuredOut) @patch.object(Logger, "error", new = MagicMock()) @@ -104,7 +104,7 @@ def test_save_version_structured_out_stack_select(self, pso_mock): script.save_component_version_to_structured_out("start") self.assertEqual(pso_mock.call_count, 1) - self.assertEquals(pso_mock.call_args[0][0], {'version':'2.6.0.0-1234'}) + self.assertEqual(pso_mock.call_args[0][0], {'version':'2.6.0.0-1234'}) def tearDown(self): diff --git a/ambari-agent/src/test/python/resource_management/TestSecurityCommons.py b/ambari-agent/src/test/python/resource_management/TestSecurityCommons.py index 870ca92590d..b68ce705fbc 100644 --- a/ambari-agent/src/test/python/resource_management/TestSecurityCommons.py +++ b/ambari-agent/src/test/python/resource_management/TestSecurityCommons.py @@ -43,27 +43,27 @@ def test_validate_security_config_properties(self, os_path_isfile_mock): configuration_rules["config_file"]["value_checks"]["property1"] = ["firstCase"] configuration_rules["config_file"]["value_checks"]["property2"] = ["secondCase"] - self.assertEquals(not validate_security_config_properties(params, configuration_rules), + self.assertEqual(not validate_security_config_properties(params, configuration_rules), True) # issues is empty #Testing with correct empty_checks configuration_rules["config_file"]["empty_checks"] = ["property3", "property4"] - self.assertEquals(not validate_security_config_properties(params, configuration_rules), + self.assertEqual(not validate_security_config_properties(params, configuration_rules), True) # issues is empty # Testing with correct read_checks configuration_rules["config_file"]["read_checks"] = ["property5", "property6"] os_path_isfile_mock.return_value = True - self.assertEquals(not validate_security_config_properties(params, configuration_rules), + self.assertEqual(not validate_security_config_properties(params, configuration_rules), True) # issues is empty # Testing with wrong values_checks configuration_rules["config_file"]["value_checks"]["property1"] = ["failCase"] configuration_rules["config_file"]["value_checks"]["property2"] = ["failCase2"] - self.assertEquals(not validate_security_config_properties(params, configuration_rules), + self.assertEqual(not validate_security_config_properties(params, configuration_rules), False) # Doesn't return an empty issues configuration_rules["config_file"]["value_checks"]["property1"] = ["firstCase"] @@ -72,7 +72,7 @@ def test_validate_security_config_properties(self, os_path_isfile_mock): # Testing with a property which doesn't exist in params configuration_rules["config_file"]["empty_checks"].append("property7") - self.assertEquals(not validate_security_config_properties(params, configuration_rules), + self.assertEqual(not validate_security_config_properties(params, configuration_rules), False) # Doesn't return an empty list configuration_rules["config_file"]["empty_checks"].remove("property7") @@ -80,7 +80,7 @@ def test_validate_security_config_properties(self, os_path_isfile_mock): # Testing with a property which doesn't exist in params configuration_rules["config_file"]["read_checks"].append("property8") - self.assertEquals(not validate_security_config_properties(params, configuration_rules), + self.assertEqual(not validate_security_config_properties(params, configuration_rules), False) # Doesn't return an empty list configuration_rules["config_file"]["read_checks"].remove("property8") @@ -93,7 +93,7 @@ def test_validate_security_config_properties(self, os_path_isfile_mock): params["config_file"]["property5"] = [""] params["config_file"]["property6"] = [""] - self.assertEquals(not validate_security_config_properties(params, configuration_rules), + self.assertEqual(not validate_security_config_properties(params, configuration_rules), False) # Doesn't return an empty list @@ -111,14 +111,14 @@ def test_build_expectations(self): result = build_expectations(config_file, value_checks, empty_checks, read_checks) - self.assertEquals(len(result[config_file]['value_checks']), len(value_checks)) - self.assertEquals(len(result[config_file]['empty_checks']), len(empty_checks)) - self.assertEquals(len(result[config_file]['read_checks']), len(read_checks)) + self.assertEqual(len(result[config_file]['value_checks']), len(value_checks)) + self.assertEqual(len(result[config_file]['empty_checks']), len(empty_checks)) + self.assertEqual(len(result[config_file]['read_checks']), len(read_checks)) # Testing that returns empty dict if is called without values result = build_expectations(config_file, [], [], []) - self.assertEquals(not result[config_file].items(), True) + self.assertEqual(not list(result[config_file].items()), True) def test_get_params_from_filesystem_JAAS(self): conf_dir = gettempdir() @@ -155,11 +155,11 @@ def test_get_params_from_filesystem_JAAS(self): } } - self.assertEquals(expected, result) + self.assertEqual(expected, result) os.unlink(jaas_file_path) - print result + print(result) @patch('xml.etree.ElementTree.parse') @patch('os.path.isfile') @@ -204,8 +204,8 @@ def test_get_params_from_filesystem(self, file_exists_mock, et_parser_mock): et_parser_mock.assert_called_with(conf_dir + os.sep + "config.xml") #Testing that the dictionary and the list from the result are not empty - self.assertEquals(not result, False) - self.assertEquals(not result[result.keys()[0]], False) + self.assertEqual(not result, False) + self.assertEqual(not result[list(result.keys())[0]], False) #Testing that returns an empty dictionary if is called with no props empty_props = [] @@ -214,15 +214,15 @@ def test_get_params_from_filesystem(self, file_exists_mock, et_parser_mock): result = get_params_from_filesystem(conf_dir, config_file) - self.assertEquals(not result, False) - self.assertEquals(not result['config'].items(), True) + self.assertEqual(not result, False) + self.assertEqual(not list(result['config'].items()), True) #Testing that returns an empty dictionary if is called with empty config_files empty_config_file = {} result = get_params_from_filesystem(conf_dir, empty_config_file) - self.assertEquals(not result, True) + self.assertEqual(not result, True) #Test that params returns an exception et_parser_mock.reset_mock() @@ -238,7 +238,7 @@ def test_get_params_from_filesystem(self, file_exists_mock, et_parser_mock): @patch('os.path.isfile') @patch('ambari_simplejson.load') @patch('resource_management.libraries.functions.security_commons.new_cached_exec') - @patch('__builtin__.open') + @patch('builtins.open') def test_cached_executor(self, open_file_mock, new_cached_exec_mock, ambari_simplejson_load_mock, os_isfile_mock, os_makedirs_mock, os_path_exists_mock): diff --git a/ambari-agent/src/test/python/resource_management/TestSubstituteVars.py b/ambari-agent/src/test/python/resource_management/TestSubstituteVars.py index 2e7bc59833c..c09596ed2f1 100644 --- a/ambari-agent/src/test/python/resource_management/TestSubstituteVars.py +++ b/ambari-agent/src/test/python/resource_management/TestSubstituteVars.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -21,12 +21,12 @@ from unittest import TestCase, main from resource_management.libraries.functions.substitute_vars import substitute_vars -import StringIO, sys +import io, sys class TestSubstituteVars(TestCase): def setUp(self): # disable stdout - out = StringIO.StringIO() + out = io.StringIO() sys.stdout = out def test_substitute_vars(self): diff --git a/ambari-agent/src/test/python/resource_management/TestTemplateConfigResource.py b/ambari-agent/src/test/python/resource_management/TestTemplateConfigResource.py index 864417af574..eb49c8e8857 100644 --- a/ambari-agent/src/test/python/resource_management/TestTemplateConfigResource.py +++ b/ambari-agent/src/test/python/resource_management/TestTemplateConfigResource.py @@ -36,18 +36,18 @@ def test_create_template_wo_tag(self, file_mock, template_mock): with Environment() as env: TemplateConfig("path", action="create", - mode=0755, + mode=0o755, owner="owner", group="group", extra_imports=["extra_imports"] ) defined_arguments = env.resources['TemplateConfig']['path'].arguments - expected_arguments = {'group': 'group', 'extra_imports': ['extra_imports'], 'action': ['create'], 'mode': 0755, 'owner': 'owner'} + expected_arguments = {'group': 'group', 'extra_imports': ['extra_imports'], 'action': ['create'], 'mode': 0o755, 'owner': 'owner'} self.assertEqual(defined_arguments,expected_arguments) self.assertEqual(file_mock.call_args[0][0],'path') call_args = file_mock.call_args[1].copy() del call_args['content'] - self.assertEqual(call_args,{'owner': 'owner', 'group': 'group', 'mode': 0755}) + self.assertEqual(call_args,{'owner': 'owner', 'group': 'group', 'mode': 0o755}) self.assertEqual(template_mock.call_args[0][0],'path.j2') self.assertEqual(template_mock.call_args[1],{'extra_imports': ['extra_imports']}) diff --git a/ambari-agent/src/test/python/resource_management/TestUserResource.py b/ambari-agent/src/test/python/resource_management/TestUserResource.py index e6c0d747083..1c5bcd7192a 100644 --- a/ambari-agent/src/test/python/resource_management/TestUserResource.py +++ b/ambari-agent/src/test/python/resource_management/TestUserResource.py @@ -27,7 +27,7 @@ from resource_management.core.system import System from resource_management.core.resources import User from resource_management.core.shell import preexec_fn -from ambari_commons import subprocess32 +import subprocess import os import select @@ -46,7 +46,7 @@ @patch.object(os, "close", new=MagicMock()) class TestUserResource(TestCase): - @patch.object(subprocess32, "Popen") + @patch.object(subprocess, "Popen") @patch("pwd.getpwnam") def test_action_create_nonexistent(self, getpwnam_mock, popen_mock): subproc_mock = MagicMock() @@ -60,7 +60,7 @@ def test_action_create_nonexistent(self, getpwnam_mock, popen_mock): popen_mock.assert_called_with(['/bin/bash', '--login', '--noprofile', '-c', "ambari-sudo.sh PATH=/bin -H -E useradd -m -s /bin/bash mapred"], shell=False, preexec_fn=preexec_fn, stderr=-2, stdout=-1, env={'PATH': '/bin'}, cwd=None, close_fds=True) self.assertEqual(popen_mock.call_count, 1) - @patch.object(subprocess32, "Popen") + @patch.object(subprocess, "Popen") @patch("pwd.getpwnam") def test_action_create_existent(self, getpwnam_mock, popen_mock): subproc_mock = MagicMock() @@ -75,7 +75,7 @@ def test_action_create_existent(self, getpwnam_mock, popen_mock): popen_mock.assert_called_with(['/bin/bash', '--login', '--noprofile', '-c', "ambari-sudo.sh PATH=/bin -H -E usermod -s /bin/bash mapred"], shell=False, preexec_fn=preexec_fn, stderr=-2, stdout=-1, env={'PATH': '/bin'}, cwd=None, close_fds=True) self.assertEqual(popen_mock.call_count, 1) - @patch.object(subprocess32, "Popen") + @patch.object(subprocess, "Popen") @patch("pwd.getpwnam") def test_action_delete(self, getpwnam_mock, popen_mock): subproc_mock = MagicMock() @@ -90,7 +90,7 @@ def test_action_delete(self, getpwnam_mock, popen_mock): popen_mock.assert_called_with(['/bin/bash', '--login', '--noprofile', '-c', 'ambari-sudo.sh PATH=/bin -H -E userdel mapred'], shell=False, preexec_fn=preexec_fn, stderr=-2, stdout=-1, env={'PATH': '/bin'}, cwd=None, close_fds=True) self.assertEqual(popen_mock.call_count, 1) - @patch.object(subprocess32, "Popen") + @patch.object(subprocess, "Popen") @patch("pwd.getpwnam") def test_attribute_comment(self, getpwnam_mock, popen_mock): subproc_mock = MagicMock() @@ -106,7 +106,7 @@ def test_attribute_comment(self, getpwnam_mock, popen_mock): popen_mock.assert_called_with(['/bin/bash', '--login', '--noprofile', '-c', "ambari-sudo.sh PATH=/bin -H -E usermod -c testComment -s /bin/bash mapred"], shell=False, preexec_fn=preexec_fn, stderr=-2, stdout=-1, env={'PATH': '/bin'}, cwd=None, close_fds=True) self.assertEqual(popen_mock.call_count, 1) - @patch.object(subprocess32, "Popen") + @patch.object(subprocess, "Popen") @patch("pwd.getpwnam") def test_attribute_home(self, getpwnam_mock, popen_mock): subproc_mock = MagicMock() @@ -122,7 +122,7 @@ def test_attribute_home(self, getpwnam_mock, popen_mock): popen_mock.assert_called_with(['/bin/bash', '--login', '--noprofile', '-c', "ambari-sudo.sh PATH=/bin -H -E usermod -s /bin/bash -d /test/home mapred"], shell=False, preexec_fn=preexec_fn, stderr=-2, stdout=-1, env={'PATH': '/bin'}, cwd=None, close_fds=True) self.assertEqual(popen_mock.call_count, 1) - @patch.object(subprocess32, "Popen") + @patch.object(subprocess, "Popen") @patch("pwd.getpwnam") def test_attribute_password(self, getpwnam_mock, popen_mock): subproc_mock = MagicMock() @@ -138,7 +138,7 @@ def test_attribute_password(self, getpwnam_mock, popen_mock): popen_mock.assert_called_with(['/bin/bash', '--login', '--noprofile', '-c', "ambari-sudo.sh PATH=/bin -H -E usermod -s /bin/bash -p secure mapred"], shell=False, preexec_fn=preexec_fn, stderr=-2, stdout=-1, env={'PATH': '/bin'}, cwd=None, close_fds=True) self.assertEqual(popen_mock.call_count, 1) - @patch.object(subprocess32, "Popen") + @patch.object(subprocess, "Popen") @patch("pwd.getpwnam") def test_attribute_shell(self, getpwnam_mock, popen_mock): subproc_mock = MagicMock() @@ -153,7 +153,7 @@ def test_attribute_shell(self, getpwnam_mock, popen_mock): popen_mock.assert_called_with(['/bin/bash', '--login', '--noprofile', '-c', "ambari-sudo.sh PATH=/bin -H -E usermod -s /bin/sh mapred"], shell=False, preexec_fn=preexec_fn, stderr=-2, stdout=-1, env={'PATH': '/bin'}, cwd=None, close_fds=True) self.assertEqual(popen_mock.call_count, 1) - @patch.object(subprocess32, "Popen") + @patch.object(subprocess, "Popen") @patch("pwd.getpwnam") def test_attribute_uid(self, getpwnam_mock, popen_mock): subproc_mock = MagicMock() @@ -165,10 +165,10 @@ def test_attribute_uid(self, getpwnam_mock, popen_mock): with Environment('/') as env: user = User("mapred", action = "create", uid = 1, shell = "/bin/bash") - popen_mock.assert_called_with(['/bin/bash', '--login', '--noprofile', '-c', "ambari-sudo.sh PATH=/bin -H -E usermod -s /bin/bash -u 1 mapred"], shell=False, preexec_fn=preexec_fn, stderr=-2, stdout=-1, env={'PATH': '/bin'}, cwd=None, close_fds=True) + popen_mock.assert_called_with(['/bin/bash', '--login', '--noprofile', '-c', "ambari-sudo.sh PATH=/bin -H -E usermod -u 1 -s /bin/bash mapred"], shell=False, preexec_fn=preexec_fn, stderr=-2, stdout=-1, env={'PATH': '/bin'}, cwd=None, close_fds=True) self.assertEqual(popen_mock.call_count, 1) - @patch.object(subprocess32, "Popen") + @patch.object(subprocess, "Popen") @patch("pwd.getpwnam") def test_attribute_gid(self, getpwnam_mock, popen_mock): subproc_mock = MagicMock() @@ -180,11 +180,11 @@ def test_attribute_gid(self, getpwnam_mock, popen_mock): with Environment('/') as env: user = User("mapred", action = "create", gid = "1", shell = "/bin/bash") - popen_mock.assert_called_with(['/bin/bash', '--login', '--noprofile', '-c', "ambari-sudo.sh PATH=/bin -H -E usermod -s /bin/bash -g 1 mapred"], shell=False, preexec_fn=preexec_fn, stderr=-2, stdout=-1, env={'PATH': '/bin'}, cwd=None, close_fds=True) + popen_mock.assert_called_with(['/bin/bash', '--login', '--noprofile', '-c', "ambari-sudo.sh PATH=/bin -H -E usermod -g 1 -s /bin/bash mapred"], shell=False, preexec_fn=preexec_fn, stderr=-2, stdout=-1, env={'PATH': '/bin'}, cwd=None, close_fds=True) self.assertEqual(popen_mock.call_count, 1) @patch('resource_management.core.providers.accounts.UserProvider.user_groups', new_callable=PropertyMock) - @patch.object(subprocess32, "Popen") + @patch.object(subprocess, "Popen") @patch("pwd.getpwnam") def test_attribute_groups(self, getpwnam_mock, popen_mock, user_groups_mock): subproc_mock = MagicMock() @@ -201,7 +201,7 @@ def test_attribute_groups(self, getpwnam_mock, popen_mock, user_groups_mock): popen_mock.assert_called_with(['/bin/bash', '--login', '--noprofile', '-c', 'ambari-sudo.sh PATH=/bin -H -E usermod -s /bin/bash -G 1,2,3,hadoop mapred'], shell=False, preexec_fn=preexec_fn, env={'PATH': '/bin'}, close_fds=True, stdout=-1, stderr=-2, cwd=None) self.assertEqual(popen_mock.call_count, 1) - @patch.object(subprocess32, "Popen") + @patch.object(subprocess, "Popen") @patch("pwd.getpwnam") def test_missing_shell_argument(self, getpwnam_mock, popen_mock): subproc_mock = MagicMock() @@ -215,7 +215,7 @@ def test_missing_shell_argument(self, getpwnam_mock, popen_mock): popen_mock.assert_called_with(['/bin/bash', '--login', '--noprofile', '-c', "ambari-sudo.sh PATH=/bin -H -E useradd -m mapred"], shell=False, preexec_fn=preexec_fn, stderr=-2, stdout=-1, env={'PATH': '/bin'}, cwd=None, close_fds=True) self.assertEqual(popen_mock.call_count, 1) - @patch('__builtin__.open') + @patch('builtins.open') @patch("pwd.getpwnam") def test_parsing_local_users(self, pwd_mock, open_mock): """ @@ -247,7 +247,7 @@ def __enter__(self): provider.resource.fetch_nonlocal_groups = False groups = provider.user_groups - self.assertEquals(1, len(groups)) + self.assertEqual(1, len(groups)) self.assertTrue("group2" in groups) diff --git a/ambari-agent/src/test/python/resource_management/TestUtils.py b/ambari-agent/src/test/python/resource_management/TestUtils.py index 0fbae3e05a5..0335e3ce1db 100644 --- a/ambari-agent/src/test/python/resource_management/TestUtils.py +++ b/ambari-agent/src/test/python/resource_management/TestUtils.py @@ -35,5 +35,5 @@ def test_attr_to_bitmask(self): for test in test_set: test_pattern, expected, initial_val = test bitmask = attr_to_bitmask(test_pattern, initial_bitmask= initial_val) - self.assertEquals(expected, bitmask, "Test set \"{0}\" failed, expected: {1} but got {2}".format( + self.assertEqual(expected, bitmask, "Test set \"{0}\" failed, expected: {1} but got {2}".format( test_pattern, expected, bitmask)) diff --git a/ambari-agent/src/test/python/resource_management/TestXmlConfigResource.py b/ambari-agent/src/test/python/resource_management/TestXmlConfigResource.py index a172da3da6c..8608f990d6b 100644 --- a/ambari-agent/src/test/python/resource_management/TestXmlConfigResource.py +++ b/ambari-agent/src/test/python/resource_management/TestXmlConfigResource.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one @@ -68,7 +68,7 @@ def test_action_create_empty_xml_config(self, configuration_attributes={} ) - create_file_mock.assert_called_with('/dir/conf/file.xml', u' \n \n ', + create_file_mock.assert_called_with('/dir/conf/file.xml', ' \n \n ', encoding='UTF-8', on_file_created=ANY) @@ -98,7 +98,7 @@ def test_action_create_simple_xml_config(self, configuration_attributes={'attr': {'property1': 'attr_value'}} ) - create_file_mock.assert_called_with('/dir/conf/file.xml', u' \n \n \n property1\n value1\n attr_value\n \n \n ', + create_file_mock.assert_called_with('/dir/conf/file.xml', ' \n \n \n property1\n value1\n attr_value\n \n \n ', encoding='UTF-8', on_file_created=ANY) @patch("resource_management.core.providers.system._ensure_metadata") @@ -128,7 +128,7 @@ def test_action_create_simple_xml_config_with_inclusion(self, xml_include_file="/dif/conf/include_file.xml" ) - create_file_mock.assert_called_with('/dir/conf/file.xml', u' \n \n \n property1\n value1\n attr_value\n \n \n \n \n ', + create_file_mock.assert_called_with('/dir/conf/file.xml', ' \n \n \n property1\n value1\n attr_value\n \n \n \n \n ', encoding='UTF-8', on_file_created=ANY) @patch("resource_management.core.providers.system._ensure_metadata") @@ -181,7 +181,7 @@ def test_action_create_xml_config_with_metacharacters(self, } }) - create_file_mock.assert_called_with('/dir/conf/file.xml', u' \n \n \n \n \n \n \n \n prop.1\n '.'yyyy-MM-dd-HH\n x\n \n \n \n prop.2\n INFO, openjpa\n \n \n \n prop.3\n %d{ISO8601} %5p %c{1}:%L - %m%n\n value3\n \n \n \n prop.4\n ${oozie.log.dir}/oozie.log\n \n value4\n \n \n \n prop.empty\n \n \n \n \n ', + create_file_mock.assert_called_with('/dir/conf/file.xml', ' \n \n \n \n \n \n \n \n prop.1\n '.'yyyy-MM-dd-HH\n x\n \n \n \n prop.2\n INFO, openjpa\n \n \n \n prop.3\n %d{ISO8601} %5p %c{1}:%L - %m%n\n value3\n \n \n \n prop.4\n ${oozie.log.dir}/oozie.log\n value4\n \n \n \n \n prop.empty\n \n \n \n \n ', encoding='UTF-8', on_file_created=ANY) @patch("resource_management.core.providers.system._ensure_metadata") @@ -215,7 +215,7 @@ def test_action_create_xml_config_sorted_by_key(self, configuration_attributes={} ) - create_file_mock.assert_called_with('/dir/conf/file.xml', u' \n \n \n \n \n \n \n \n first\n should be first\n \n \n \n second\n should be second\n \n \n \n third\n should be third\n \n \n \n z_last\n should be last\n \n \n ', + create_file_mock.assert_called_with('/dir/conf/file.xml', ' \n \n \n \n \n \n \n \n first\n should be first\n \n \n \n second\n should be second\n \n \n \n third\n should be third\n \n \n \n z_last\n should be last\n \n \n ', encoding='UTF-8', on_file_created=ANY) @patch("resource_management.libraries.providers.xml_config.File") @@ -231,7 +231,7 @@ def test_action_create_arguments(self, os_path_isdir_mock ,os_path_exists_mock, conf_dir='/dir/conf', configurations={'property1': 'value1'}, configuration_attributes={'attr': {'property1': 'attr_value'}}, - mode = 0755, + mode = 0o755, owner = "hdfs", group = "hadoop", encoding = "Code" @@ -240,4 +240,4 @@ def test_action_create_arguments(self, os_path_isdir_mock ,os_path_exists_mock, self.assertEqual(file_mock.call_args[0][0],'/dir/conf/xmlFile.xml') call_args = file_mock.call_args[1].copy() del call_args['content'] - self.assertEqual(call_args,{'owner': 'hdfs', 'group': 'hadoop', 'mode': 0755, 'encoding' : 'Code'}) + self.assertEqual(call_args,{'owner': 'hdfs', 'group': 'hadoop', 'mode': 0o755, 'encoding' : 'Code'}) diff --git a/ambari-agent/src/test/python/unitTests.py b/ambari-agent/src/test/python/unitTests.py index 785699f1952..0a6b8cc3aff 100644 --- a/ambari-agent/src/test/python/unitTests.py +++ b/ambari-agent/src/test/python/unitTests.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one diff --git a/ambari-common/src/main/python/ambari_commons/__init__.py b/ambari-common/src/main/python/ambari_commons/__init__.py index 2ae36bf554a..96710d6c2ef 100644 --- a/ambari-common/src/main/python/ambari_commons/__init__.py +++ b/ambari-common/src/main/python/ambari_commons/__init__.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python2.6 +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one diff --git a/ambari-common/src/main/python/ambari_commons/aggregate_functions.py b/ambari-common/src/main/python/ambari_commons/aggregate_functions.py index a0d8ceef5ca..be83aa998b3 100644 --- a/ambari-common/src/main/python/ambari_commons/aggregate_functions.py +++ b/ambari-common/src/main/python/ambari_commons/aggregate_functions.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one diff --git a/ambari-common/src/main/python/ambari_commons/ambari_metrics_helper.py b/ambari-common/src/main/python/ambari_commons/ambari_metrics_helper.py index 07e483170ff..67e748c87e9 100644 --- a/ambari-common/src/main/python/ambari_commons/ambari_metrics_helper.py +++ b/ambari-common/src/main/python/ambari_commons/ambari_metrics_helper.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -23,7 +23,7 @@ import logging import os import random -import urllib +import urllib.request, urllib.parse, urllib.error from ambari_agent.AmbariConfig import AmbariConfig from resource_management.libraries.functions import conf_select from resource_management.libraries.functions.default import default @@ -152,7 +152,7 @@ def load_metric(self, ams_metric, host_filter): metric_dict, http_code = self._load_metric(ams_collector_host, ams_metric, host_filter) if http_code == 200 and metric_dict: break - except Exception, exception: + except Exception as exception: if logger.isEnabledFor(logging.DEBUG): logger.exception("[Alert][{0}] Unable to retrieve metrics from AMS ({1}:{2}): {3}".format(self.alert_id, ams_collector_host, self.ams_collector_port, str(exception))) @@ -174,7 +174,7 @@ def _load_metric(self, ams_collector_host, ams_metric, host_filter): "precision": "seconds", "grouped": "true", } - encoded_get_metrics_parameters = urllib.urlencode(get_metrics_parameters) + encoded_get_metrics_parameters = urllib.parse.urlencode(get_metrics_parameters) url = AMS_METRICS_GET_URL % encoded_get_metrics_parameters _ssl_version = AmbariConfig.get_resolved_config().get_force_https_protocol_value() @@ -197,7 +197,7 @@ def _load_metric(self, ams_collector_host, ams_metric, host_filter): conn.request("GET", url) response = conn.getresponse() data = response.read() - except Exception, exception: + except Exception as exception: if logger.isEnabledFor(logging.DEBUG): logger.exception("[Alert][{0}] Unable to retrieve metrics from AMS: {1}".format(self.alert_id, str(exception))) status = response.status if response else None @@ -218,7 +218,7 @@ def _load_metric(self, ams_collector_host, ams_metric, host_filter): data_json = None try: data_json = json.loads(data) - except Exception, exception: + except Exception as exception: if logger.isEnabledFor(logging.DEBUG): logger.exception("[Alert][{0}] Convert response to json failed or json doesn't contain needed data: {1}". format(self.alert_id, str(exception))) diff --git a/ambari-common/src/main/python/ambari_commons/constants.py b/ambari-common/src/main/python/ambari_commons/constants.py index abb07dae770..9d88906e3cd 100644 --- a/ambari-common/src/main/python/ambari_commons/constants.py +++ b/ambari-common/src/main/python/ambari_commons/constants.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-common/src/main/python/ambari_commons/credential_store_helper.py b/ambari-common/src/main/python/ambari_commons/credential_store_helper.py index 40a10021888..a5fc1b94cc7 100644 --- a/ambari-common/src/main/python/ambari_commons/credential_store_helper.py +++ b/ambari-common/src/main/python/ambari_commons/credential_store_helper.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -41,7 +41,7 @@ def downloadjar(cs_lib_path, jdk_location): credential_util_url = jdk_location + '/' + credential_util_jar File(credential_util_path, content = DownloadSource(credential_util_url), - mode = 0755, + mode = 0o755, ) def get_password_from_credential_store(alias, provider_path, cs_lib_path, java_home, jdk_location): diff --git a/ambari-common/src/main/python/ambari_commons/exceptions.py b/ambari-common/src/main/python/ambari_commons/exceptions.py index dbccd75aaf9..e121306edc5 100644 --- a/ambari-common/src/main/python/ambari_commons/exceptions.py +++ b/ambari-common/src/main/python/ambari_commons/exceptions.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one diff --git a/ambari-common/src/main/python/ambari_commons/firewall.py b/ambari-common/src/main/python/ambari_commons/firewall.py index a7aa506255f..65c3d558353 100644 --- a/ambari-common/src/main/python/ambari_commons/firewall.py +++ b/ambari-common/src/main/python/ambari_commons/firewall.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -18,7 +18,7 @@ limitations under the License. ''' -from ambari_commons import subprocess32 +import subprocess from ambari_commons import OSCheck, OSConst from ambari_commons.logging_utils import print_warning_msg from ambari_commons.os_family_impl import OsFamilyImpl @@ -82,7 +82,8 @@ def check_result(self): def run_command(self): try: - retcode, out, err = shell.call(self.get_command(), stdout = subprocess32.PIPE, stderr = subprocess32.PIPE, timeout = 5, quiet = True) + retcode, out, err = shell.call(self.get_command(), stdout = subprocess.PIPE, stderr = subprocess.PIPE, + timeout = 5, quiet = True, universal_newlines=True) self.returncode = retcode self.stdoutdata = out self.stderrdata = err diff --git a/ambari-common/src/main/python/ambari_commons/get_ambari_version.py b/ambari-common/src/main/python/ambari_commons/get_ambari_version.py index c8c533679b8..6110f766e14 100644 --- a/ambari-common/src/main/python/ambari_commons/get_ambari_version.py +++ b/ambari-common/src/main/python/ambari_commons/get_ambari_version.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -19,7 +19,7 @@ """ import os -import ConfigParser +import configparser from resource_management.core.logger import Logger """ @@ -30,13 +30,13 @@ def get_ambari_version_agent(): AMBARI_AGENT_CONF = '/etc/ambari-agent/conf/ambari-agent.ini' if os.path.exists(AMBARI_AGENT_CONF): try: - ambari_agent_config = ConfigParser.RawConfigParser() + ambari_agent_config = configparser.RawConfigParser() ambari_agent_config.read(AMBARI_AGENT_CONF) data_dir = ambari_agent_config.get('agent', 'prefix') ver_file = os.path.join(data_dir, 'version') with open(ver_file, "r") as f: ambari_version = f.read().strip() - except Exception, e: + except Exception as e: Logger.info('Unable to determine ambari version from the agent version file.') Logger.debug('Exception: %s' % str(e)) pass diff --git a/ambari-common/src/main/python/ambari_commons/inet_utils.py b/ambari-common/src/main/python/ambari_commons/inet_utils.py index 0dadcfa4458..657ba39f6d7 100644 --- a/ambari-common/src/main/python/ambari_commons/inet_utils.py +++ b/ambari-common/src/main/python/ambari_commons/inet_utils.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -21,13 +21,13 @@ import os import time import sys -import urllib2 +import urllib.request, urllib.error, urllib.parse import socket import re from ambari_commons import OSCheck from functools import wraps -from exceptions import FatalException, NonFatalException, TimeoutError +from .exceptions import FatalException, NonFatalException, TimeoutError if OSCheck.is_windows_family(): from ambari_commons.os_windows import os_run_os_command @@ -36,8 +36,8 @@ from ambari_commons.os_linux import os_run_os_command pass -from logging_utils import * -from os_check import OSCheck +from .logging_utils import * +from .os_check import OSCheck def openurl(url, timeout=socket._GLOBAL_DEFAULT_TIMEOUT, *args, **kwargs): @@ -48,8 +48,8 @@ def openurl(url, timeout=socket._GLOBAL_DEFAULT_TIMEOUT, *args, **kwargs): :rtype urllib2.Request """ try: - return urllib2.urlopen(url, timeout=timeout, *args, **kwargs) - except urllib2.URLError as e: + return urllib.request.urlopen(url, timeout=timeout, *args, **kwargs) + except urllib.error.URLError as e: # Python 2.6 timeout handling if hasattr(e, "reason") and isinstance(e.reason, socket.timeout): raise TimeoutError(e.reason) @@ -79,7 +79,7 @@ def download_file_anyway(link, destination, chunk_size=16 * 1024, progress_func print_error_msg("Download {0} with python lib [urllib2] failed with error: {1}".format(link, str(sys.exc_info()))) if not os.path.exists(destination): - print "Trying to download {0} to {1} with [curl] command.".format(link, destination) + print("Trying to download {0} to {1} with [curl] command.".format(link, destination)) #print_info_msg("Trying to download {0} to {1} with [curl] command.".format(link, destination)) curl_command = "curl --fail -k -o %s %s" % (destination, link) retcode, out, err = os_run_os_command(curl_command) @@ -89,7 +89,7 @@ def download_file_anyway(link, destination, chunk_size=16 * 1024, progress_func if not os.path.exists(destination): print_error_msg("Unable to download file {0}!".format(link)) - print "ERROR: unable to donwload file %s!" % (link) + print("ERROR: unable to donwload file %s!" % (link)) def download_progress(file_name, downloaded_size, blockSize, totalSize): @@ -119,8 +119,8 @@ def wait_for_port_opened(hostname, port, tries_count, try_sleep): def find_range_components(meta): file_size = 0 seek_pos = 0 - hdr_range = meta.getheaders("Content-Range") - if len(hdr_range) > 0: + hdr_range = meta.get_all("Content-Range") + if hdr_range and len(hdr_range) > 0: range_comp1 = hdr_range[0].split('/') if len(range_comp1) > 1: range_comp2 = range_comp1[0].split(' ') #split away the "bytes" prefix @@ -133,8 +133,8 @@ def find_range_components(meta): if file_size == 0: #Try the old-fashioned way - hdrLen = meta.getheaders("Content-Length") - if len(hdrLen) == 0: + hdrLen = meta.get_all("Content-Length") + if hdrLen and len(hdrLen) == 0: raise FatalException(12, "Response header doesn't contain Content-Length. Chunked Transfer-Encoding is not supported for now.") file_size = int(hdrLen[0]) @@ -142,7 +142,7 @@ def find_range_components(meta): def force_download_file(link, destination, chunk_size = 16 * 1024, progress_func = None): - request = urllib2.Request(link) + request = urllib.request.Request(link) if os.path.exists(destination) and not os.path.isfile(destination): #Directory specified as target? Must be a mistake. Bail out, don't assume anything. @@ -168,7 +168,7 @@ def force_download_file(link, destination, chunk_size = 16 * 1024, progress_func if not os.path.exists(dest_path): os.makedirs(dest_path) - response = urllib2.urlopen(request) + response = urllib.request.urlopen(request) (file_size, seek_pos) = find_range_components(response.info()) print_info_msg("Downloading to: %s Bytes: %s" % (destination, file_size)) @@ -267,7 +267,7 @@ def get_host_from_url(uri): return None # if not a string, return None - if not isinstance(uri, basestring): + if not isinstance(uri, str): return None # RFC3986, Appendix B diff --git a/ambari-common/src/main/python/ambari_commons/kerberos/__init__.py b/ambari-common/src/main/python/ambari_commons/kerberos/__init__.py index 3cb6ecf2c70..cbbe344bd69 100644 --- a/ambari-common/src/main/python/ambari_commons/kerberos/__init__.py +++ b/ambari-common/src/main/python/ambari_commons/kerberos/__init__.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python2.6 +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one diff --git a/ambari-common/src/main/python/ambari_commons/kerberos/kerberos_common.py b/ambari-common/src/main/python/ambari_commons/kerberos/kerberos_common.py index 4b2f3e9e9f6..9fe23e0a9d3 100644 --- a/ambari-common/src/main/python/ambari_commons/kerberos/kerberos_common.py +++ b/ambari-common/src/main/python/ambari_commons/kerberos/kerberos_common.py @@ -86,7 +86,7 @@ def write_krb5_conf(params): owner='root', create_parents=True, group='root', - mode=0755 + mode=0o755 ) content = InlineTemplate(params.krb5_conf_template) @@ -95,7 +95,7 @@ def write_krb5_conf(params): content=content, owner='root', group='root', - mode=0644 + mode=0o644 ) @@ -116,7 +116,7 @@ def write_keytab_file(params, output_hook=lambda principal, keytab_file_path: No if (keytab_file_path is not None) and (len(keytab_file_path) > 0): head, tail = os.path.split(keytab_file_path) if head: - Directory(head, create_parents=True, mode=0755, owner="root", group="root") + Directory(head, create_parents=True, mode=0o755, owner="root", group="root") owner = get_property_value(item, 'keytab_file_owner_name') if not owner: diff --git a/ambari-common/src/main/python/ambari_commons/kerberos/utils.py b/ambari-common/src/main/python/ambari_commons/kerberos/utils.py index 00b2638cd4d..ee2e039909b 100644 --- a/ambari-common/src/main/python/ambari_commons/kerberos/utils.py +++ b/ambari-common/src/main/python/ambari_commons/kerberos/utils.py @@ -49,7 +49,7 @@ def get_property_value(dictionary, property_name, default_value=None, trim_strin # If the value is none, consider it empty... if value is None: value = empty_value - elif (type(value) == str) or (type(value) == unicode): + elif (type(value) == str) or (type(value) == str): value = value.strip() if len(value) == 0: @@ -61,7 +61,7 @@ def get_property_value(dictionary, property_name, default_value=None, trim_strin def get_unstructured_data(dictionary, property_name): prefix = property_name + '/' prefix_len = len(prefix) - return dict((k[prefix_len:], v) for k, v in dictionary.iteritems() if k.startswith(prefix)) + return dict((k[prefix_len:], v) for k, v in dictionary.items() if k.startswith(prefix)) def split_host_and_port(host): diff --git a/ambari-common/src/main/python/ambari_commons/libs/__init__.py b/ambari-common/src/main/python/ambari_commons/libs/__init__.py index e48e3598974..280aaf81b7d 100644 --- a/ambari-common/src/main/python/ambari_commons/libs/__init__.py +++ b/ambari-common/src/main/python/ambari_commons/libs/__init__.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python2.6 +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one diff --git a/ambari-common/src/main/python/ambari_commons/libs/ppc64le/__init__.py b/ambari-common/src/main/python/ambari_commons/libs/ppc64le/__init__.py index e48e3598974..280aaf81b7d 100644 --- a/ambari-common/src/main/python/ambari_commons/libs/ppc64le/__init__.py +++ b/ambari-common/src/main/python/ambari_commons/libs/ppc64le/__init__.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python2.6 +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one diff --git a/ambari-common/src/main/python/ambari_commons/libs/x86_64/__init__.py b/ambari-common/src/main/python/ambari_commons/libs/x86_64/__init__.py index e48e3598974..280aaf81b7d 100644 --- a/ambari-common/src/main/python/ambari_commons/libs/x86_64/__init__.py +++ b/ambari-common/src/main/python/ambari_commons/libs/x86_64/__init__.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python2.6 +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one diff --git a/ambari-common/src/main/python/ambari_commons/logging_utils.py b/ambari-common/src/main/python/ambari_commons/logging_utils.py index 6535ebcff7a..61417a5e8e3 100644 --- a/ambari-common/src/main/python/ambari_commons/logging_utils.py +++ b/ambari-common/src/main/python/ambari_commons/logging_utils.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one diff --git a/ambari-common/src/main/python/ambari_commons/network.py b/ambari-common/src/main/python/ambari_commons/network.py index edb9add75fc..1707c96caf3 100644 --- a/ambari-common/src/main/python/ambari_commons/network.py +++ b/ambari-common/src/main/python/ambari_commons/network.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -18,18 +18,18 @@ """ -import httplib +import http.client import ssl import socket -import urllib2 +import urllib.request, urllib.error, urllib.parse from ambari_commons.logging_utils import print_warning_msg from resource_management.core.exceptions import Fail # overrides default httplib.HTTPSConnection implementation to use specified ssl version -class HTTPSConnectionWithCustomSslVersion(httplib.HTTPSConnection): +class HTTPSConnectionWithCustomSslVersion(http.client.HTTPSConnection): def __init__(self, host, port, ssl_version, **kwargs): - httplib.HTTPSConnection.__init__(self, host, port, **kwargs) + http.client.HTTPSConnection.__init__(self, host, port, **kwargs) self.ssl_version = ssl_version def connect(self): @@ -48,7 +48,7 @@ def get_http_connection(host, port, https_enabled=False, ca_certs=None, ssl_vers check_ssl_certificate_and_return_ssl_version(host, port, ca_certs, ssl_version) return HTTPSConnectionWithCustomSslVersion(host, port, ssl_version) else: - return httplib.HTTPConnection(host, port) + return http.client.HTTPConnection(host, port) def check_ssl_certificate_and_return_ssl_version(host, port, ca_certs, ssl_version = ssl.PROTOCOL_SSLv23): try: @@ -67,6 +67,6 @@ def reconfigure_urllib2_opener(ignore_system_proxy=False): """ if ignore_system_proxy: - proxy_handler = urllib2.ProxyHandler({}) - opener = urllib2.build_opener(proxy_handler) - urllib2.install_opener(opener) + proxy_handler = urllib.request.ProxyHandler({}) + opener = urllib.request.build_opener(proxy_handler) + urllib.request.install_opener(opener) diff --git a/ambari-common/src/main/python/ambari_commons/os_check.py b/ambari-common/src/main/python/ambari_commons/os_check.py index 5979a8c58e4..44fce317b5f 100644 --- a/ambari-common/src/main/python/ambari_commons/os_check.py +++ b/ambari-common/src/main/python/ambari_commons/os_check.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -22,6 +22,7 @@ import os import sys import platform +import distro def _get_windows_version(): """ @@ -164,9 +165,7 @@ def __getattr__(cls, name): raise Exception("Unknown class property '%s'" % name) -class OSConst: - __metaclass__ = OS_CONST_TYPE - +class OSConst(metaclass=OS_CONST_TYPE): systemd_redhat_os_major_versions = ["7"] @@ -195,14 +194,7 @@ def os_distribution(): distribution = ("", "", "") else: # linux distribution - PYTHON_VER = sys.version_info[0] * 10 + sys.version_info[1] - - if PYTHON_VER <= 26: - raise RuntimeError("Python 2.6 or less not supported") - elif _is_redhat_linux(): - distribution = platform.dist() - else: - distribution = platform.linux_distribution() + distribution = distro.linux_distribution() if distribution[0] == '': distribution = advanced_check(distribution) diff --git a/ambari-common/src/main/python/ambari_commons/os_linux.py b/ambari-common/src/main/python/ambari_commons/os_linux.py index 448018383d3..b7deb1ffc2f 100644 --- a/ambari-common/src/main/python/ambari_commons/os_linux.py +++ b/ambari-common/src/main/python/ambari_commons/os_linux.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -22,7 +22,7 @@ import os import pwd import shlex -from ambari_commons import subprocess32 +import subprocess from ambari_commons.logging_utils import print_info_msg, print_warning_msg @@ -38,13 +38,14 @@ def os_run_os_command(cmd, env=None, shell=False, cwd=None): print_info_msg('about to run command: ' + str(cmd)) if type(cmd) == str: cmd = shlex.split(cmd) - process = subprocess32.Popen(cmd, - stdout=subprocess32.PIPE, - stdin=subprocess32.PIPE, - stderr=subprocess32.PIPE, + process = subprocess.Popen(cmd, + stdout=subprocess.PIPE, + stdin=subprocess.PIPE, + stderr=subprocess.PIPE, env=env, cwd=cwd, - shell=shell + shell=shell, + universal_newlines=True ) print_info_msg("\nprocess_pid=" + str(process.pid)) (stdoutdata, stderrdata) = process.communicate() diff --git a/ambari-common/src/main/python/ambari_commons/os_utils.py b/ambari-common/src/main/python/ambari_commons/os_utils.py index ac86154ec7d..6afcd9308a4 100644 --- a/ambari-common/src/main/python/ambari_commons/os_utils.py +++ b/ambari-common/src/main/python/ambari_commons/os_utils.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -57,7 +57,7 @@ def get_used_ram(): def is_valid_filepath(filepath): if not filepath or not os.path.exists(filepath) or os.path.isdir(filepath): - print 'Invalid path, please provide the absolute file path.' + print('Invalid path, please provide the absolute file path.') return False else: return True @@ -75,7 +75,7 @@ def trim_uri(file_uri): return file_uri def _search_file(filename, search_path, pathsep): - for path in string.split(search_path, pathsep): + for path in str.split(search_path, pathsep): candidate = os.path.join(path, filename) if os.path.exists(candidate): return os.path.abspath(candidate) @@ -88,9 +88,9 @@ def search_file(filename, search_path, pathsep=os.pathsep): def copy_file(src, dest_file): try: shutil.copyfile(src, dest_file) - except Exception, e: + except Exception as e: err = "Can not copy file {0} to {1} due to: {2} . Please check file " \ - "permissions and free disk space.".format(src, dest_file, e.message) + "permissions and free disk space.".format(src, dest_file, e) raise FatalException(1, err) def copy_files(files, dest_dir): @@ -105,7 +105,7 @@ def remove_file(filePath): if os.path.exists(filePath): try: os.remove(filePath) - except Exception, e: + except Exception as e: print_warning_msg('Unable to remove file: ' + str(e)) return 1 pass @@ -200,7 +200,7 @@ def translate_praceholders(fmt): properties = {} Template.idpattern = r'[_a-z][_a-z0-9\.]*' - with open(filename, "rb") as fp: + with open(filename, "rt") as fp: lines = fp.readlines() for line in lines: diff --git a/ambari-common/src/main/python/ambari_commons/os_windows.py b/ambari-common/src/main/python/ambari_commons/os_windows.py index f674894c873..f14814e213d 100644 --- a/ambari-common/src/main/python/ambari_commons/os_windows.py +++ b/ambari-common/src/main/python/ambari_commons/os_windows.py @@ -21,7 +21,7 @@ import os import random import shlex -from ambari_commons import subprocess32 +import subprocess import sys import tempfile import time @@ -145,7 +145,7 @@ def _parse_reparse_buffer(original, reparse_type=SYMBOLIC_LINK): 'print_name_offset' : SZUSHORT, 'print_name_length' : SZUSHORT, 'flags' : SZULONG, - 'buffer' : u'', + 'buffer' : '', 'pkeys' : [ 'substitute_name_offset', 'substitute_name_length', @@ -159,7 +159,7 @@ def _parse_reparse_buffer(original, reparse_type=SYMBOLIC_LINK): 'substitute_name_length' : SZUSHORT, 'print_name_offset' : SZUSHORT, 'print_name_length' : SZUSHORT, - 'buffer' : u'', + 'buffer' : '', 'pkeys' : [ 'substitute_name_offset', 'substitute_name_length', @@ -204,7 +204,7 @@ def readlink(fpath): try: # Open the file correctly depending on the string type. - if type(fpath) == unicode: + if type(fpath) == str: handle = win32file.CreateFileW(fpath, win32file.GENERIC_READ, 0, None, win32file.OPEN_EXISTING, win32file.FILE_FLAG_OPEN_REPARSE_POINT | win32file.FILE_FLAG_BACKUP_SEMANTICS, 0) else: handle = win32file.CreateFile(fpath, win32file.GENERIC_READ, 0, None, win32file.OPEN_EXISTING, win32file.FILE_FLAG_OPEN_REPARSE_POINT | win32file.FILE_FLAG_BACKUP_SEMANTICS, 0) @@ -227,7 +227,7 @@ def readlink(fpath): if len(rpath) > 4 and rpath[0:4] == '\\??\\': rpath = rpath[4:] return rpath - except pywintypes.error, e: + except pywintypes.error as e: raise OSError(e.winerror, e.strerror, fpath) os.readlink = readlink @@ -338,16 +338,17 @@ def run_os_command_impersonated(cmd, user, password, domain='.'): return exitcode, out, err def os_run_os_command(cmd, env=None, shell=False, cwd=None): - if isinstance(cmd,basestring): + if isinstance(cmd,str): cmd = cmd.replace("\\", "\\\\") cmd = shlex.split(cmd) - process = subprocess32.Popen(cmd, - stdout=subprocess32.PIPE, - stdin=subprocess32.PIPE, - stderr=subprocess32.PIPE, + process = subprocess.Popen(cmd, + stdout=subprocess.PIPE, + stdin=subprocess.PIPE, + stderr=subprocess.PIPE, env=env, cwd=cwd, - shell=shell + shell=shell, + universal_newlines=True ) (stdoutdata, stderrdata) = process.communicate() return process.returncode, stdoutdata, stderrdata @@ -527,7 +528,7 @@ def Start(serviceName, waitSecs=30): win32serviceutil.StartService(serviceName) if waitSecs: win32serviceutil.WaitForServiceStatus(serviceName, win32service.SERVICE_RUNNING, waitSecs) - except win32service.error, exc: + except win32service.error as exc: if exc.winerror != 1056: msg = "Error starting service: %s" % exc.strerror err = exc.winerror @@ -544,7 +545,7 @@ def Stop(serviceName, waitSecs=30): win32serviceutil.StopService(serviceName) if waitSecs: win32serviceutil.WaitForServiceStatus(serviceName, win32service.SERVICE_STOPPED, waitSecs) - except win32service.error, exc: + except win32service.error as exc: if exc.winerror != 1062: msg = "Error stopping service: %s (%d)" % (exc.strerror, exc.winerror) err = exc.winerror @@ -581,7 +582,7 @@ def EnsureServiceIsStarted(serviceName, waitSecs=30): win32serviceutil.StartService(serviceName) if waitSecs: win32serviceutil.WaitForServiceStatus(serviceName, win32service.SERVICE_RUNNING, waitSecs) - except win32service.error, exc: + except win32service.error as exc: if exc.winerror != 1056: err = exc.winerror return err @@ -602,7 +603,7 @@ def SvcDoRun(self): try: self.ReportServiceStatus(win32service.SERVICE_RUNNING) self.ServiceMain() - except Exception, x: + except Exception as x: #TODO: Log exception self.SvcStop() @@ -689,7 +690,7 @@ def _StopOrWaitForChildProcessToFinish(self, childProcess): #Sending signal.CTRL_BREAK_EVENT doesn't work. It only detaches the child process from the master. # Must brutally terminate the child process. Sorry Java. childProcess.terminate() - except OSError, e: + except OSError as e: print_info_msg("Unable to stop Ambari Server - " + str(e)) return False diff --git a/ambari-common/src/main/python/ambari_commons/parallel_processing.py b/ambari-common/src/main/python/ambari_commons/parallel_processing.py index c5a95de26a5..a2490102bc2 100644 --- a/ambari-common/src/main/python/ambari_commons/parallel_processing.py +++ b/ambari-common/src/main/python/ambari_commons/parallel_processing.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -90,6 +90,6 @@ def func (elem, params): if __name__ == "__main__": results = execute_in_parallel(func, ['F', 'BF', 'S'], None) for result in results: - print results[result].element - print results[result].status - print results[result].result \ No newline at end of file + print(results[result].element) + print(results[result].status) + print(results[result].result) \ No newline at end of file diff --git a/ambari-common/src/main/python/ambari_commons/repo_manager/yum_manager.py b/ambari-common/src/main/python/ambari_commons/repo_manager/yum_manager.py index 95e92cfb019..5fff7ce2921 100644 --- a/ambari-common/src/main/python/ambari_commons/repo_manager/yum_manager.py +++ b/ambari-common/src/main/python/ambari_commons/repo_manager/yum_manager.py @@ -16,7 +16,7 @@ limitations under the License. """ -import ConfigParser +import configparser import glob from .generic_manager import GenericManagerProperties, GenericManager @@ -26,7 +26,7 @@ from resource_management.core.utils import suppress_stdout from resource_management.core import sudo -from StringIO import StringIO +from io import StringIO import re import os @@ -276,29 +276,7 @@ def _check_existence(self, name): if not name: raise ValueError("Package name can't be empty") - if os.geteuid() == 0: - return self.yum_check_package_available(name) - else: - return self.rpm_check_package_available(name) - - def yum_check_package_available(self, name): - """ - Does the same as rpm_check_package_avaiable, but faster. - However need root permissions. - """ - import yum # Python Yum API is much faster then other check methods. (even then "import rpm") - yb = yum.YumBase() - name_regex = re.escape(name).replace("\\?", ".").replace("\\*", ".*") + '$' - regex = re.compile(name_regex) - - with suppress_stdout(): - package_list = yb.rpmdb.simplePkgList() - - for package in package_list: - if regex.match(package[0]): - return True - - return False + return self.rpm_check_package_available(name) @staticmethod def _build_repos_ids(repos): @@ -327,7 +305,7 @@ def _build_repos_ids(repos): # if there are any matches, it means the repo already exists and we should use it to search # for packages to install for repo_file in glob.glob(os.path.join(YumManagerProperties.repo_definition_location, "*.repo")): - config_parser = ConfigParser.ConfigParser() + config_parser = configparser.ConfigParser() config_parser.read(repo_file) sections = config_parser.sections() for section in sections: @@ -352,7 +330,8 @@ def rpm_check_package_available(self, name): regex = re.compile(name_regex) for package in packages: - if regex.match(package['name']): + pkg_name = package['name'].decode() if isinstance(package['name'], bytes) else package['name'] + if regex.match(pkg_name): return True return False diff --git a/ambari-common/src/main/python/ambari_commons/repo_manager/yum_parser.py b/ambari-common/src/main/python/ambari_commons/repo_manager/yum_parser.py index 567a39a6840..b3f3dca8ac1 100644 --- a/ambari-common/src/main/python/ambari_commons/repo_manager/yum_parser.py +++ b/ambari-common/src/main/python/ambari_commons/repo_manager/yum_parser.py @@ -130,9 +130,9 @@ def packages_reader(stream): bash.x86_64 4.1.2-48.el6 @CentOS/6.9 bind-libs.x86_64 32:9.8.2-0.62.rc1.el6_9.4 @Updates/6.9 """ - + remove_chars_map = str.maketrans('', '', REMOVE_CHARS) for line in stream: - line = ANSI_ESCAPE.sub('', line).translate(None, REMOVE_CHARS) # strip sh control seq. and ascii control ch. + line = ANSI_ESCAPE.sub('', line).translate(remove_chars_map) # strip sh control seq. and ascii control ch. pkg_name, _, line = line.lstrip().partition(" ") pkg_name, _, _ = str(pkg_name).rpartition(".") # cut architecture from package name pkg_version, _, line = line.lstrip().partition(" ") diff --git a/ambari-common/src/main/python/ambari_commons/repo_manager/zypper_manager.py b/ambari-common/src/main/python/ambari_commons/repo_manager/zypper_manager.py index 7e1249ffe8b..9d76d04833e 100644 --- a/ambari-common/src/main/python/ambari_commons/repo_manager/zypper_manager.py +++ b/ambari-common/src/main/python/ambari_commons/repo_manager/zypper_manager.py @@ -190,7 +190,7 @@ def install_package(self, name, context): active_base_repos = self.get_active_base_repos() if 'base' in context.use_repos: # Remove 'base' from use_repos list - use_repos = filter(lambda x: x != 'base', context.use_repos) + use_repos = [x for x in context.use_repos if x != 'base'] use_repos.extend(active_base_repos) use_repos_options = [] for repo in sorted(context.use_repos): @@ -257,7 +257,7 @@ def rpm_check_package_available(self, name): regex = re.compile(name_regex) for package in packages: - if regex.match(package['name']): + if regex.match(package['name'].decode()): return True return False diff --git a/ambari-common/src/main/python/ambari_commons/shell.py b/ambari-common/src/main/python/ambari_commons/shell.py index fda1782bd12..cedcde74ea8 100644 --- a/ambari-common/src/main/python/ambari_commons/shell.py +++ b/ambari-common/src/main/python/ambari_commons/shell.py @@ -22,7 +22,7 @@ import os import string import signal -from ambari_commons import subprocess32 as subprocess +import subprocess as subprocess import threading from contextlib import contextmanager import copy @@ -182,7 +182,7 @@ class PopenEx(subprocess.Popen): Same nice Popen with stdout handles hack to allow pty instead of pipe. This will allow to control terminal geometry to eliminate some applications bugs with output formatting according to terminal width. - TODO: move the code directly to subprocess32.py + TODO: move the code directly to subprocess.py """ def _get_handles(self, stdin, stdout, stderr): @@ -229,7 +229,7 @@ def quote_bash_args(command): if not command: return "''" - if not isinstance(command, basestring): + if not isinstance(command, str): raise ValueError("Command should be a list of strings, found '{0}' in command list elements".format(str(command))) valid = set(string.ascii_letters + string.digits + '@%_-+=:,./') @@ -273,8 +273,6 @@ def _geometry_helper(): """ Setting proper terminal geometry """ - if term_geometry: - __set_winsize(sys.stdout.fileno(), *term_geometry) # check term geometry # print "terminal_width: ", __terminal_width() @@ -283,15 +281,13 @@ def _geometry_helper(): command = "{0} -H -E {1}".format(AMBARI_SUDO_BINARY, string_cmd_from_args_list(command)) # core.shell.as_sudo elif not is_under_root() and isinstance(command, str): _logger.debug("Warning, command \"{0}\" doesn't support sudo appending".format(command)) - is_shell = not isinstance(command, (list, tuple)) environ = copy.deepcopy(os.environ) - if env: environ.update(env) - return PopenEx(command, stdout=PIPE_PTY, stderr=subprocess.PIPE, - shell=is_shell, preexec_fn=_geometry_helper, close_fds=True, env=environ) + return PopenEx(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, + shell=is_shell, preexec_fn=_geometry_helper, close_fds=True, env=environ, universal_newlines=True) def chunks_reader(cmd, kill_timer): @@ -440,12 +436,13 @@ def subprocess_executor(command, timeout=__TIMEOUT_SECONDS, strategy=ReaderStrat """ r = SubprocessCallResult() + def _error_handler(_command, _error_log, _exit_code): - r.error = os.linesep.join(_error_log) + r.error = os.linesep.join([errlog for errlog in _error_log]) r.code = _exit_code with process_executor(command, timeout, _error_handler, strategy, env=env) as output: - lines = [line for line in output] + lines = [line.decode() if isinstance(line, bytes) else line for line in output] r.out = os.linesep.join(lines) return r @@ -648,8 +645,8 @@ def kill_process_with_children(base_pid): exception_list = ["apt-get", "apt", "yum", "zypper", "zypp"] signals_to_post = { - "SIGTERM": signal.SIGTERM, - "SIGKILL": signal.SIGKILL + "SIGTERM": signal.SIGTERM.value, + "SIGKILL": signal.SIGKILL.value } full_child_pids = get_all_children(base_pid) all_child_pids = [item[0] for item in full_child_pids if item[1].lower() not in exception_list and item[0] != os.getpid()] @@ -784,7 +781,7 @@ def run(self, script, user=None): cmd = " ".join(script) else: cmd = script - p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=False) + p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=False, universal_newlines=True) out, err = p.communicate() code = p.wait() _logger.debug("Exitcode for %s is %d" % (cmd, code)) @@ -800,7 +797,7 @@ def runPowershell(self, f=None, script_block=None, args=set()): elif script_block: cmd = ['powershell', '-WindowStyle', 'Hidden', '-Command', script_block] + list(args) - p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=False) + p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=False, universal_newlines=True) out, err = p.communicate() code = p.wait() _logger.debug("Exitcode for %s is %d" % (cmd, code)) @@ -838,7 +835,7 @@ def run(self, script, user=None): cmd_list = ["/bin/bash", "--login", "--noprofile", "-c", cmd] p = subprocess.Popen(cmd_list, preexec_fn=self._change_uid, stdout=subprocess.PIPE, - stderr=subprocess.PIPE, shell=False, close_fds=True) + stderr=subprocess.PIPE, shell=False, close_fds=True, universal_newlines=True) out, err = p.communicate() code = p.wait() _logger.debug("Exitcode for %s is %d" % (cmd, code)) diff --git a/ambari-common/src/main/python/ambari_commons/str_utils.py b/ambari-common/src/main/python/ambari_commons/str_utils.py index c98e5a2c6e6..629effe7f4d 100644 --- a/ambari-common/src/main/python/ambari_commons/str_utils.py +++ b/ambari-common/src/main/python/ambari_commons/str_utils.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -80,7 +80,7 @@ def split_on_chunks(text, chunk_max_size): chunk = "" # if a single line itself is bigger than the max chunk size, split the line. if len(lines[0]) > chunk_max_size: - line_fragments = [lines[0][x:x+chunk_max_size] for x in xrange(0, len(lines[0]), chunk_max_size)] + line_fragments = [lines[0][x:x+chunk_max_size] for x in range(0, len(lines[0]), chunk_max_size)] for line_fragment in line_fragments: chunks.append(line_fragment) lines.pop(0) diff --git a/ambari-common/src/main/python/ambari_commons/subprocess32.py b/ambari-common/src/main/python/ambari_commons/subprocess32.py deleted file mode 100644 index 478c5799759..00000000000 --- a/ambari-common/src/main/python/ambari_commons/subprocess32.py +++ /dev/null @@ -1,1730 +0,0 @@ -# subprocess - Subprocesses with accessible I/O streams -# -# For more information about this module, see PEP 324. -# -# Copyright (c) 2003-2005 by Peter Astrand -# -# Licensed to PSF under a Contributor Agreement. -# See http://www.python.org/3.3/license for licensing details. - -r"""Subprocesses with accessible I/O streams - -This module allows you to spawn processes, connect to their -input/output/error pipes, and obtain their return codes. - -For a complete description of this module see the Python documentation. - -Main API -======== -run(...): Runs a command, waits for it to complete, then returns a - CompletedProcess instance. -Popen(...): A class for flexibly executing a command in a new process - -Constants ---------- -DEVNULL: Special value that indicates that os.devnull should be used -PIPE: Special value that indicates a pipe should be created -STDOUT: Special value that indicates that stderr should go to stdout - - -Older API -========= -call(...): Runs a command, waits for it to complete, then returns - the return code. -check_call(...): Same as call() but raises CalledProcessError() - if return code is not 0 -check_output(...): Same as check_call() but returns the contents of - stdout instead of a return code -""" - -# because ambari_commons also has 'exceptions' module -from __future__ import absolute_import - -import sys -mswindows = (sys.platform == "win32") - -import os -import exceptions -import types -import time -import traceback -import gc -import signal - -# Exception classes used by this module. -class SubprocessError(Exception): pass - - -class CalledProcessError(SubprocessError): - """Raised when run() is called with check=True and the process - returns a non-zero exit status. - - Attributes: - cmd, returncode, stdout, stderr, output - """ - def __init__(self, returncode, cmd, output=None, stderr=None): - self.returncode = returncode - self.cmd = cmd - self.output = output - self.stderr = stderr - - def __str__(self): - if self.returncode and self.returncode < 0: - try: - return "Command '%s' died with %r." % ( - self.cmd, signal.Signals(-self.returncode)) - except ValueError: - return "Command '%s' died with unknown signal %d." % ( - self.cmd, -self.returncode) - else: - return "Command '%s' returned non-zero exit status %d." % ( - self.cmd, self.returncode) - - #@property - def __stdout_getter(self): - """Alias for output attribute, to match stderr""" - return self.output - - #@stdout.setter # Required Python 2.6 - def __stdout_setter(self, value): - # There's no obvious reason to set this, but allow it anyway so - # .stdout is a transparent alias for .output - self.output = value - - stdout = property(__stdout_getter, __stdout_setter) # Python 2.4 - - -class TimeoutExpired(SubprocessError): - """This exception is raised when the timeout expires while waiting for a - child process. - - Attributes: - cmd, output, stdout, stderr, timeout - """ - def __init__(self, cmd, timeout, output=None, stderr=None): - self.cmd = cmd - self.timeout = timeout - self.output = output - self.stderr = stderr - - def __str__(self): - return ("Command '%s' timed out after %s seconds" % - (self.cmd, self.timeout)) - - #@property - def __stdout_getter(self): - return self.output - - #@stdout.setter # Required Python 2.6 - def __stdout_setter(self, value): - # There's no obvious reason to set this, but allow it anyway so - # .stdout is a transparent alias for .output - self.output = value - - stdout = property(__stdout_getter, __stdout_setter) # Python 2.4 - - -if mswindows: - import threading - import msvcrt - import _subprocess - class STARTUPINFO: - dwFlags = 0 - hStdInput = None - hStdOutput = None - hStdError = None - wShowWindow = 0 - class pywintypes: - error = IOError -else: - import select - _has_poll = hasattr(select, 'poll') - import errno - import fcntl - import pickle - import platform - import importlib - - posixsubprocess_package = "ambari_commons.libs.{0}".format(platform.machine()) - try: - _posixsubprocess = importlib.import_module('._posixsubprocess', posixsubprocess_package) - except ImportError: - _posixsubprocess = None - import warnings - warnings.warn("The _posixsubprocess module is not being used. Could not import it from " + posixsubprocess_package + " " - "Child process reliability may suffer if your " - "program uses threads.", RuntimeWarning) - try: - import threading - except ImportError: - import dummy_threading as threading - - # When select or poll has indicated that the file is writable, - # we can write up to _PIPE_BUF bytes without risk of blocking. - # POSIX defines PIPE_BUF as >= 512. - _PIPE_BUF = getattr(select, 'PIPE_BUF', 512) - - _FD_CLOEXEC = getattr(fcntl, 'FD_CLOEXEC', 1) - - def _set_cloexec(fd, cloexec): - old = fcntl.fcntl(fd, fcntl.F_GETFD) - if cloexec: - fcntl.fcntl(fd, fcntl.F_SETFD, old | _FD_CLOEXEC) - else: - fcntl.fcntl(fd, fcntl.F_SETFD, old & ~_FD_CLOEXEC) - - if _posixsubprocess: - _create_pipe = _posixsubprocess.cloexec_pipe - else: - def _create_pipe(): - fds = os.pipe() - _set_cloexec(fds[0], True) - _set_cloexec(fds[1], True) - return fds - -__all__ = ["Popen", "PIPE", "STDOUT", "call", "check_call", - "check_output", "CalledProcessError"] - -if mswindows: - from _subprocess import (CREATE_NEW_CONSOLE, CREATE_NEW_PROCESS_GROUP, - STD_INPUT_HANDLE, STD_OUTPUT_HANDLE, - STD_ERROR_HANDLE, SW_HIDE, - STARTF_USESTDHANDLES, STARTF_USESHOWWINDOW) - # https://msdn.microsoft.com/en-us/library/windows/desktop/ms687032(v=vs.85).aspx - # Note: In Python 3.3 this constant is found in the _winapi module. - _WAIT_TIMEOUT = 0x102 - - __all__.extend(["CREATE_NEW_CONSOLE", "CREATE_NEW_PROCESS_GROUP", - "STD_INPUT_HANDLE", "STD_OUTPUT_HANDLE", - "STD_ERROR_HANDLE", "SW_HIDE", - "STARTF_USESTDHANDLES", "STARTF_USESHOWWINDOW"]) -try: - MAXFD = os.sysconf("SC_OPEN_MAX") -except: - MAXFD = 256 - -# This lists holds Popen instances for which the underlying process had not -# exited at the time its __del__ method got called: those processes are wait()ed -# for synchronously from _cleanup() when a new Popen object is created, to avoid -# zombie processes. -_active = [] - -def _cleanup(): - for inst in _active[:]: - res = inst._internal_poll(_deadstate=sys.maxint) - if res is not None: - try: - _active.remove(inst) - except ValueError: - # This can happen if two threads create a new Popen instance. - # It's harmless that it was already removed, so ignore. - pass - -PIPE = -1 -STDOUT = -2 -DEVNULL = -3 - -# This function is only used by multiprocessing, it is here so that people -# can drop subprocess32 in as a replacement for the stdlib subprocess module. - -def _args_from_interpreter_flags(): - """Return a list of command-line arguments reproducing the current - settings in sys.flags and sys.warnoptions.""" - flag_opt_map = { - 'debug': 'd', - # 'inspect': 'i', - # 'interactive': 'i', - 'optimize': 'O', - 'dont_write_bytecode': 'B', - 'no_user_site': 's', - 'no_site': 'S', - 'ignore_environment': 'E', - 'verbose': 'v', - 'bytes_warning': 'b', - 'py3k_warning': '3', - } - args = [] - for flag, opt in flag_opt_map.items(): - v = getattr(sys.flags, flag) - if v > 0: - args.append('-' + opt * v) - if getattr(sys.flags, 'hash_randomization') != 0: - args.append('-R') - for opt in sys.warnoptions: - args.append('-W' + opt) - return args - - -def _eintr_retry_call(func, *args): - while True: - try: - return func(*args) - except (OSError, IOError), e: - if e.errno == errno.EINTR: - continue - raise - - -def _get_exec_path(env=None): - """Returns the sequence of directories that will be searched for the - named executable (similar to a shell) when launching a process. - - *env* must be an environment variable dict or None. If *env* is None, - os.environ will be used. - """ - if env is None: - env = os.environ - return env.get('PATH', os.defpath).split(os.pathsep) - - -if hasattr(os, 'get_exec_path'): - _get_exec_path = os.get_exec_path - - -def call(*popenargs, **kwargs): - """Run command with arguments. Wait for command to complete or - timeout, then return the returncode attribute. - - The arguments are the same as for the Popen constructor. Example: - - retcode = call(["ls", "-l"]) - """ - timeout = kwargs.pop('timeout', None) - p = Popen(*popenargs, **kwargs) - try: - return p.wait(timeout=timeout) - except TimeoutExpired: - p.kill() - p.wait() - raise - - -def check_call(*popenargs, **kwargs): - """Run command with arguments. Wait for command to complete. If - the exit code was zero then return, otherwise raise - CalledProcessError. The CalledProcessError object will have the - return code in the returncode attribute. - - The arguments are the same as for the call function. Example: - - check_call(["ls", "-l"]) - """ - retcode = call(*popenargs, **kwargs) - if retcode: - cmd = kwargs.get("args") - if cmd is None: - cmd = popenargs[0] - raise CalledProcessError(retcode, cmd) - return 0 - - -def check_output(*popenargs, **kwargs): - r"""Run command with arguments and return its output as a byte string. - - If the exit code was non-zero it raises a CalledProcessError. The - CalledProcessError object will have the return code in the returncode - attribute and output in the output attribute. - - The arguments are the same as for the Popen constructor. Example: - - >>> check_output(["ls", "-l", "/dev/null"]) - 'crw-rw-rw- 1 root root 1, 3 Oct 18 2007 /dev/null\n' - - The stdout argument is not allowed as it is used internally. - To capture standard error in the result, use stderr=STDOUT. - - >>> check_output(["/bin/sh", "-c", - ... "ls -l non_existent_file ; exit 0"], - ... stderr=STDOUT) - 'ls: non_existent_file: No such file or directory\n' - """ - timeout = kwargs.pop('timeout', None) - if 'stdout' in kwargs: - raise ValueError('stdout argument not allowed, it will be overridden.') - process = Popen(stdout=PIPE, *popenargs, **kwargs) - try: - output, unused_err = process.communicate(timeout=timeout) - except TimeoutExpired: - process.kill() - output, unused_err = process.communicate() - raise TimeoutExpired(process.args, timeout, output=output) - retcode = process.poll() - if retcode: - raise CalledProcessError(retcode, process.args, output=output) - return output - - -class CompletedProcess(object): - """A process that has finished running. - This is returned by run(). - Attributes: - args: The list or str args passed to run(). - returncode: The exit code of the process, negative for signals. - stdout: The standard output (None if not captured). - stderr: The standard error (None if not captured). - """ - def __init__(self, args, returncode, stdout=None, stderr=None): - self.args = args - self.returncode = returncode - self.stdout = stdout - self.stderr = stderr - - def __repr__(self): - args = ['args={!r}'.format(self.args), - 'returncode={!r}'.format(self.returncode)] - if self.stdout is not None: - args.append('stdout={!r}'.format(self.stdout)) - if self.stderr is not None: - args.append('stderr={!r}'.format(self.stderr)) - return "{}({})".format(type(self).__name__, ', '.join(args)) - - def check_returncode(self): - """Raise CalledProcessError if the exit code is non-zero.""" - if self.returncode: - raise CalledProcessError(self.returncode, self.args, self.stdout, - self.stderr) - - -def run(*popenargs, **kwargs): - """Run command with arguments and return a CompletedProcess instance. - The returned instance will have attributes args, returncode, stdout and - stderr. By default, stdout and stderr are not captured, and those attributes - will be None. Pass stdout=PIPE and/or stderr=PIPE in order to capture them. - If check is True and the exit code was non-zero, it raises a - CalledProcessError. The CalledProcessError object will have the return code - in the returncode attribute, and output & stderr attributes if those streams - were captured. - If timeout is given, and the process takes too long, a TimeoutExpired - exception will be raised. - There is an optional argument "input", allowing you to - pass a string to the subprocess's stdin. If you use this argument - you may not also use the Popen constructor's "stdin" argument, as - it will be used internally. - The other arguments are the same as for the Popen constructor. - If universal_newlines=True is passed, the "input" argument must be a - string and stdout/stderr in the returned object will be strings rather than - bytes. - """ - input = kwargs.pop('input', None) - timeout = kwargs.pop('timeout', None) - check = kwargs.pop('check', False) - if input is not None: - if 'stdin' in kwargs: - raise ValueError('stdin and input arguments may not both be used.') - kwargs['stdin'] = PIPE - - process = Popen(*popenargs, **kwargs) - try: - process.__enter__() # No-Op really... illustrate "with in 2.4" - try: - stdout, stderr = process.communicate(input, timeout=timeout) - except TimeoutExpired: - process.kill() - stdout, stderr = process.communicate() - raise TimeoutExpired(process.args, timeout, output=stdout, - stderr=stderr) - except: - process.kill() - process.wait() - raise - retcode = process.poll() - if check and retcode: - raise CalledProcessError(retcode, process.args, - output=stdout, stderr=stderr) - finally: - # None because our context manager __exit__ does not use them. - process.__exit__(None, None, None) - return CompletedProcess(process.args, retcode, stdout, stderr) - - -def list2cmdline(seq): - """ - Translate a sequence of arguments into a command line - string, using the same rules as the MS C runtime: - - 1) Arguments are delimited by white space, which is either a - space or a tab. - - 2) A string surrounded by double quotation marks is - interpreted as a single argument, regardless of white space - contained within. A quoted string can be embedded in an - argument. - - 3) A double quotation mark preceded by a backslash is - interpreted as a literal double quotation mark. - - 4) Backslashes are interpreted literally, unless they - immediately precede a double quotation mark. - - 5) If backslashes immediately precede a double quotation mark, - every pair of backslashes is interpreted as a literal - backslash. If the number of backslashes is odd, the last - backslash escapes the next double quotation mark as - described in rule 3. - """ - - # See - # http://msdn.microsoft.com/en-us/library/17w5ykft.aspx - # or search http://msdn.microsoft.com for - # "Parsing C++ Command-Line Arguments" - result = [] - needquote = False - for arg in seq: - bs_buf = [] - - # Add a space to separate this argument from the others - if result: - result.append(' ') - - needquote = (" " in arg) or ("\t" in arg) or not arg - if needquote: - result.append('"') - - for c in arg: - if c == '\\': - # Don't know if we need to double yet. - bs_buf.append(c) - elif c == '"': - # Double backslashes. - result.append('\\' * len(bs_buf)*2) - bs_buf = [] - result.append('\\"') - else: - # Normal char - if bs_buf: - result.extend(bs_buf) - bs_buf = [] - result.append(c) - - # Add remaining backslashes, if any. - if bs_buf: - result.extend(bs_buf) - - if needquote: - result.extend(bs_buf) - result.append('"') - - return ''.join(result) - - -_PLATFORM_DEFAULT_CLOSE_FDS = object() - - -class Popen(object): - def __init__(self, args, bufsize=0, executable=None, - stdin=None, stdout=None, stderr=None, - preexec_fn=None, close_fds=_PLATFORM_DEFAULT_CLOSE_FDS, - shell=False, cwd=None, env=None, universal_newlines=False, - startupinfo=None, creationflags=0, - restore_signals=True, start_new_session=False, - pass_fds=()): - """Create new Popen instance.""" - _cleanup() - # Held while anything is calling waitpid before returncode has been - # updated to prevent clobbering returncode if wait() or poll() are - # called from multiple threads at once. After acquiring the lock, - # code must re-check self.returncode to see if another thread just - # finished a waitpid() call. - self._waitpid_lock = threading.Lock() - - self._child_created = False - self._input = None - self._communication_started = False - if not isinstance(bufsize, (int, long)): - raise TypeError("bufsize must be an integer") - - if mswindows: - if preexec_fn is not None: - raise ValueError("preexec_fn is not supported on Windows " - "platforms") - any_stdio_set = (stdin is not None or stdout is not None or - stderr is not None) - if close_fds is _PLATFORM_DEFAULT_CLOSE_FDS: - if any_stdio_set: - close_fds = False - else: - close_fds = True - elif close_fds and any_stdio_set: - raise ValueError( - "close_fds is not supported on Windows platforms" - " if you redirect stdin/stdout/stderr") - else: - # POSIX - if close_fds is _PLATFORM_DEFAULT_CLOSE_FDS: - close_fds = True - if pass_fds and not close_fds: - warnings.warn("pass_fds overriding close_fds.", RuntimeWarning) - close_fds = True - if startupinfo is not None: - raise ValueError("startupinfo is only supported on Windows " - "platforms") - if creationflags != 0: - raise ValueError("creationflags is only supported on Windows " - "platforms") - - self.args = args - self.stdin = None - self.stdout = None - self.stderr = None - self.pid = None - self.returncode = None - self.universal_newlines = universal_newlines - - # Input and output objects. The general principle is like - # this: - # - # Parent Child - # ------ ----- - # p2cwrite ---stdin---> p2cread - # c2pread <--stdout--- c2pwrite - # errread <--stderr--- errwrite - # - # On POSIX, the child objects are file descriptors. On - # Windows, these are Windows file handles. The parent objects - # are file descriptors on both platforms. The parent objects - # are -1 when not using PIPEs. The child objects are -1 - # when not redirecting. - - (p2cread, p2cwrite, - c2pread, c2pwrite, - errread, errwrite) = self._get_handles(stdin, stdout, stderr) - - if mswindows: - if p2cwrite != -1: - p2cwrite = msvcrt.open_osfhandle(p2cwrite.Detach(), 0) - if c2pread != -1: - c2pread = msvcrt.open_osfhandle(c2pread.Detach(), 0) - if errread != -1: - errread = msvcrt.open_osfhandle(errread.Detach(), 0) - - if p2cwrite != -1: - self.stdin = os.fdopen(p2cwrite, 'wb', bufsize) - if c2pread != -1: - if universal_newlines: - self.stdout = os.fdopen(c2pread, 'rU', bufsize) - else: - self.stdout = os.fdopen(c2pread, 'rb', bufsize) - if errread != -1: - if universal_newlines: - self.stderr = os.fdopen(errread, 'rU', bufsize) - else: - self.stderr = os.fdopen(errread, 'rb', bufsize) - - self._closed_child_pipe_fds = False - exception_cleanup_needed = False - try: - try: - self._execute_child(args, executable, preexec_fn, close_fds, - pass_fds, cwd, env, universal_newlines, - startupinfo, creationflags, shell, - p2cread, p2cwrite, - c2pread, c2pwrite, - errread, errwrite, - restore_signals, start_new_session) - except: - # The cleanup is performed within the finally block rather - # than simply within this except block before the raise so - # that any exceptions raised and handled within it do not - # clobber the exception context we want to propagate upwards. - # This is only necessary in Python 2. - exception_cleanup_needed = True - raise - finally: - if exception_cleanup_needed: - for f in filter(None, (self.stdin, self.stdout, self.stderr)): - try: - f.close() - except EnvironmentError: - pass # Ignore EBADF or other errors - - if not self._closed_child_pipe_fds: - to_close = [] - if stdin == PIPE: - to_close.append(p2cread) - if stdout == PIPE: - to_close.append(c2pwrite) - if stderr == PIPE: - to_close.append(errwrite) - if hasattr(self, '_devnull'): - to_close.append(self._devnull) - for fd in to_close: - try: - os.close(fd) - except EnvironmentError: - pass - - def __enter__(self): - return self - - def __exit__(self, type, value, traceback): - if self.stdout: - self.stdout.close() - if self.stderr: - self.stderr.close() - if self.stdin: - self.stdin.close() - # Wait for the process to terminate, to avoid zombies. - self.wait() - - def _translate_newlines(self, data): - data = data.replace("\r\n", "\n") - data = data.replace("\r", "\n") - return data - - - def __del__(self, _maxint=sys.maxint, _active=_active): - # If __init__ hasn't had a chance to execute (e.g. if it - # was passed an undeclared keyword argument), we don't - # have a _child_created attribute at all. - if not getattr(self, '_child_created', False): - # We didn't get to successfully create a child process. - return - # In case the child hasn't been waited on, check if it's done. - self._internal_poll(_deadstate=_maxint) - if self.returncode is None and _active is not None: - # Child is still running, keep us alive until we can wait on it. - _active.append(self) - - - def _get_devnull(self): - if not hasattr(self, '_devnull'): - self._devnull = os.open(os.devnull, os.O_RDWR) - return self._devnull - - - def communicate(self, input=None, timeout=None): - """Interact with process: Send data to stdin. Read data from - stdout and stderr, until end-of-file is reached. Wait for - process to terminate. The optional input argument should be a - string to be sent to the child process, or None, if no data - should be sent to the child. - - communicate() returns a tuple (stdout, stderr).""" - - if self._communication_started and input: - raise ValueError("Cannot send input after starting communication") - - if timeout is not None: - endtime = time.time() + timeout - else: - endtime = None - - # Optimization: If we are not worried about timeouts, we haven't - # started communicating, and we have one or zero pipes, using select() - # or threads is unnecessary. - if (endtime is None and not self._communication_started and - [self.stdin, self.stdout, self.stderr].count(None) >= 2): - stdout = None - stderr = None - if self.stdin: - if input: - self.stdin.write(input) - self.stdin.close() - elif self.stdout: - stdout = _eintr_retry_call(self.stdout.read) - self.stdout.close() - elif self.stderr: - stderr = _eintr_retry_call(self.stderr.read) - self.stderr.close() - self.wait() - return (stdout, stderr) - - try: - stdout, stderr = self._communicate(input, endtime, timeout) - finally: - self._communication_started = True - - sts = self.wait(timeout=self._remaining_time(endtime)) - - return (stdout, stderr) - - - def poll(self): - return self._internal_poll() - - - def _remaining_time(self, endtime): - """Convenience for _communicate when computing timeouts.""" - if endtime is None: - return None - else: - return endtime - time.time() - - - def _check_timeout(self, endtime, orig_timeout): - """Convenience for checking if a timeout has expired.""" - if endtime is None: - return - if time.time() > endtime: - raise TimeoutExpired(self.args, orig_timeout) - - - if mswindows: - # - # Windows methods - # - def _get_handles(self, stdin, stdout, stderr): - """Construct and return tuple with IO objects: - p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite - """ - if stdin is None and stdout is None and stderr is None: - return (-1, -1, -1, -1, -1, -1) - - p2cread, p2cwrite = -1, -1 - c2pread, c2pwrite = -1, -1 - errread, errwrite = -1, -1 - - if stdin is None: - p2cread = _subprocess.GetStdHandle(_subprocess.STD_INPUT_HANDLE) - if p2cread is None: - p2cread, _ = _subprocess.CreatePipe(None, 0) - elif stdin == PIPE: - p2cread, p2cwrite = _subprocess.CreatePipe(None, 0) - elif stdin == DEVNULL: - p2cread = msvcrt.get_osfhandle(self._get_devnull()) - elif isinstance(stdin, int): - p2cread = msvcrt.get_osfhandle(stdin) - else: - # Assuming file-like object - p2cread = msvcrt.get_osfhandle(stdin.fileno()) - p2cread = self._make_inheritable(p2cread) - - if stdout is None: - c2pwrite = _subprocess.GetStdHandle(_subprocess.STD_OUTPUT_HANDLE) - if c2pwrite is None: - _, c2pwrite = _subprocess.CreatePipe(None, 0) - elif stdout == PIPE: - c2pread, c2pwrite = _subprocess.CreatePipe(None, 0) - elif stdout == DEVNULL: - c2pwrite = msvcrt.get_osfhandle(self._get_devnull()) - elif isinstance(stdout, int): - c2pwrite = msvcrt.get_osfhandle(stdout) - else: - # Assuming file-like object - c2pwrite = msvcrt.get_osfhandle(stdout.fileno()) - c2pwrite = self._make_inheritable(c2pwrite) - - if stderr is None: - errwrite = _subprocess.GetStdHandle(_subprocess.STD_ERROR_HANDLE) - if errwrite is None: - _, errwrite = _subprocess.CreatePipe(None, 0) - elif stderr == PIPE: - errread, errwrite = _subprocess.CreatePipe(None, 0) - elif stderr == STDOUT: - errwrite = c2pwrite - elif stderr == DEVNULL: - errwrite = msvcrt.get_osfhandle(self._get_devnull()) - elif isinstance(stderr, int): - errwrite = msvcrt.get_osfhandle(stderr) - else: - # Assuming file-like object - errwrite = msvcrt.get_osfhandle(stderr.fileno()) - errwrite = self._make_inheritable(errwrite) - - return (p2cread, p2cwrite, - c2pread, c2pwrite, - errread, errwrite) - - - def _make_inheritable(self, handle): - """Return a duplicate of handle, which is inheritable""" - return _subprocess.DuplicateHandle(_subprocess.GetCurrentProcess(), - handle, _subprocess.GetCurrentProcess(), 0, 1, - _subprocess.DUPLICATE_SAME_ACCESS) - - - def _find_w9xpopen(self): - """Find and return absolut path to w9xpopen.exe""" - w9xpopen = os.path.join( - os.path.dirname(_subprocess.GetModuleFileName(0)), - "w9xpopen.exe") - if not os.path.exists(w9xpopen): - # Eeek - file-not-found - possibly an embedding - # situation - see if we can locate it in sys.exec_prefix - w9xpopen = os.path.join(os.path.dirname(sys.exec_prefix), - "w9xpopen.exe") - if not os.path.exists(w9xpopen): - raise RuntimeError("Cannot locate w9xpopen.exe, which is " - "needed for Popen to work with your " - "shell or platform.") - return w9xpopen - - - def _execute_child(self, args, executable, preexec_fn, close_fds, - pass_fds, cwd, env, universal_newlines, - startupinfo, creationflags, shell, - p2cread, p2cwrite, - c2pread, c2pwrite, - errread, errwrite, - unused_restore_signals, unused_start_new_session): - """Execute program (MS Windows version)""" - - assert not pass_fds, "pass_fds not supported on Windows." - - if not isinstance(args, types.StringTypes): - args = list2cmdline(args) - - # Process startup details - if startupinfo is None: - startupinfo = STARTUPINFO() - if -1 not in (p2cread, c2pwrite, errwrite): - startupinfo.dwFlags |= _subprocess.STARTF_USESTDHANDLES - startupinfo.hStdInput = p2cread - startupinfo.hStdOutput = c2pwrite - startupinfo.hStdError = errwrite - - if shell: - startupinfo.dwFlags |= _subprocess.STARTF_USESHOWWINDOW - startupinfo.wShowWindow = _subprocess.SW_HIDE - comspec = os.environ.get("COMSPEC", "cmd.exe") - args = comspec + " /c " + '"%s"' % args - if (_subprocess.GetVersion() >= 0x80000000L or - os.path.basename(comspec).lower() == "command.com"): - # Win9x, or using command.com on NT. We need to - # use the w9xpopen intermediate program. For more - # information, see KB Q150956 - # (http://web.archive.org/web/20011105084002/http://support.microsoft.com/support/kb/articles/Q150/9/56.asp) - w9xpopen = self._find_w9xpopen() - args = '"%s" %s' % (w9xpopen, args) - # Not passing CREATE_NEW_CONSOLE has been known to - # cause random failures on win9x. Specifically a - # dialog: "Your program accessed mem currently in - # use at xxx" and a hopeful warning about the - # stability of your system. Cost is Ctrl+C wont - # kill children. - creationflags |= _subprocess.CREATE_NEW_CONSOLE - - # Start the process - try: - try: - hp, ht, pid, tid = _subprocess.CreateProcess(executable, args, - # no special security - None, None, - int(not close_fds), - creationflags, - env, - cwd, - startupinfo) - except pywintypes.error, e: - # Translate pywintypes.error to WindowsError, which is - # a subclass of OSError. FIXME: We should really - # translate errno using _sys_errlist (or similar), but - # how can this be done from Python? - raise WindowsError(*e.args) - finally: - # Child is launched. Close the parent's copy of those pipe - # handles that only the child should have open. You need - # to make sure that no handles to the write end of the - # output pipe are maintained in this process or else the - # pipe will not close when the child process exits and the - # ReadFile will hang. - if p2cread != -1: - p2cread.Close() - if c2pwrite != -1: - c2pwrite.Close() - if errwrite != -1: - errwrite.Close() - if hasattr(self, '_devnull'): - os.close(self._devnull) - - # Retain the process handle, but close the thread handle - self._child_created = True - self._handle = hp - self.pid = pid - ht.Close() - - def _internal_poll(self, _deadstate=None, - _WaitForSingleObject=_subprocess.WaitForSingleObject, - _WAIT_OBJECT_0=_subprocess.WAIT_OBJECT_0, - _GetExitCodeProcess=_subprocess.GetExitCodeProcess): - """Check if child process has terminated. Returns returncode - attribute. - - This method is called by __del__, so it can only refer to objects - in its local scope. - - """ - if self.returncode is None: - if _WaitForSingleObject(self._handle, 0) == _WAIT_OBJECT_0: - self.returncode = _GetExitCodeProcess(self._handle) - return self.returncode - - - def wait(self, timeout=None, endtime=None): - """Wait for child process to terminate. Returns returncode - attribute.""" - if endtime is not None: - timeout = self._remaining_time(endtime) - if timeout is None: - timeout = _subprocess.INFINITE - else: - timeout = int(timeout * 1000) - if self.returncode is None: - result = _subprocess.WaitForSingleObject(self._handle, timeout) - if result == _WAIT_TIMEOUT: - raise TimeoutExpired(self.args, timeout) - self.returncode = _subprocess.GetExitCodeProcess(self._handle) - return self.returncode - - - def _readerthread(self, fh, buffer): - buffer.append(fh.read()) - fh.close() - - - def _communicate(self, input, endtime, orig_timeout): - # Start reader threads feeding into a list hanging off of this - # object, unless they've already been started. - if self.stdout and not hasattr(self, "_stdout_buff"): - self._stdout_buff = [] - self.stdout_thread = \ - threading.Thread(target=self._readerthread, - args=(self.stdout, self._stdout_buff)) - self.stdout_thread.daemon = True - self.stdout_thread.start() - if self.stderr and not hasattr(self, "_stderr_buff"): - self._stderr_buff = [] - self.stderr_thread = \ - threading.Thread(target=self._readerthread, - args=(self.stderr, self._stderr_buff)) - self.stderr_thread.daemon = True - self.stderr_thread.start() - - if self.stdin: - if input is not None: - self.stdin.write(input) - self.stdin.close() - - # Wait for the reader threads, or time out. If we time out, the - # threads remain reading and the fds left open in case the user - # calls communicate again. - if self.stdout is not None: - self.stdout_thread.join(self._remaining_time(endtime)) - if self.stdout_thread.isAlive(): - raise TimeoutExpired(self.args, orig_timeout) - if self.stderr is not None: - self.stderr_thread.join(self._remaining_time(endtime)) - if self.stderr_thread.isAlive(): - raise TimeoutExpired(self.args, orig_timeout) - - # Collect the output from and close both pipes, now that we know - # both have been read successfully. - stdout = None - stderr = None - if self.stdout: - stdout = self._stdout_buff - self.stdout.close() - if self.stderr: - stderr = self._stderr_buff - self.stderr.close() - - # All data exchanged. Translate lists into strings. - if stdout is not None: - stdout = stdout[0] - if stderr is not None: - stderr = stderr[0] - - # Translate newlines, if requested. We cannot let the file - # object do the translation: It is based on stdio, which is - # impossible to combine with select (unless forcing no - # buffering). - if self.universal_newlines and hasattr(file, 'newlines'): - if stdout: - stdout = self._translate_newlines(stdout) - if stderr: - stderr = self._translate_newlines(stderr) - - return (stdout, stderr) - - def send_signal(self, sig): - """Send a signal to the process.""" - # Don't signal a process that we know has already died. - if self.returncode is not None: - return - if sig == signal.SIGTERM: - self.terminate() - elif sig == signal.CTRL_C_EVENT: - os.kill(self.pid, signal.CTRL_C_EVENT) - elif sig == signal.CTRL_BREAK_EVENT: - os.kill(self.pid, signal.CTRL_BREAK_EVENT) - else: - raise ValueError("Unsupported signal: %s" % sig) - - def terminate(self): - """Terminates the process.""" - # Don't terminate a process that we know has already died. - if self.returncode is not None: - return - _subprocess.TerminateProcess(self._handle, 1) - - kill = terminate - - else: - # - # POSIX methods - # - def _get_handles(self, stdin, stdout, stderr): - """Construct and return tuple with IO objects: - p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite - """ - p2cread, p2cwrite = -1, -1 - c2pread, c2pwrite = -1, -1 - errread, errwrite = -1, -1 - - if stdin is None: - pass - elif stdin == PIPE: - p2cread, p2cwrite = _create_pipe() - elif stdin == DEVNULL: - p2cread = self._get_devnull() - elif isinstance(stdin, int): - p2cread = stdin - else: - # Assuming file-like object - p2cread = stdin.fileno() - - if stdout is None: - pass - elif stdout == PIPE: - c2pread, c2pwrite = _create_pipe() - elif stdout == DEVNULL: - c2pwrite = self._get_devnull() - elif isinstance(stdout, int): - c2pwrite = stdout - else: - # Assuming file-like object - c2pwrite = stdout.fileno() - - if stderr is None: - pass - elif stderr == PIPE: - errread, errwrite = _create_pipe() - elif stderr == STDOUT: - if c2pwrite != -1: - errwrite = c2pwrite - else: # child's stdout is not set, use parent's stdout - errwrite = sys.__stdout__.fileno() - elif stderr == DEVNULL: - errwrite = self._get_devnull() - elif isinstance(stderr, int): - errwrite = stderr - else: - # Assuming file-like object - errwrite = stderr.fileno() - - return (p2cread, p2cwrite, - c2pread, c2pwrite, - errread, errwrite) - - - if hasattr(os, 'closerange'): # Introduced in 2.6 - @staticmethod - def _closerange(fd_low, fd_high): - os.closerange(fd_low, fd_high) - else: - @staticmethod - def _closerange(fd_low, fd_high): - for fd in xrange(fd_low, fd_high): - while True: - try: - os.close(fd) - except (OSError, IOError), e: - if e.errno == errno.EINTR: - continue - break - - - def _close_fds(self, but): - self._closerange(3, but) - self._closerange(but + 1, MAXFD) - - - def _close_all_but_a_sorted_few_fds(self, fds_to_keep): - # precondition: fds_to_keep must be sorted and unique - start_fd = 3 - for fd in fds_to_keep: - if fd >= start_fd: - self._closerange(start_fd, fd) - start_fd = fd + 1 - if start_fd <= MAXFD: - self._closerange(start_fd, MAXFD) - - - def _execute_child(self, args, executable, preexec_fn, close_fds, - pass_fds, cwd, env, universal_newlines, - startupinfo, creationflags, shell, - p2cread, p2cwrite, - c2pread, c2pwrite, - errread, errwrite, - restore_signals, start_new_session): - """Execute program (POSIX version)""" - - if isinstance(args, types.StringTypes): - args = [args] - else: - args = list(args) - - if shell: - args = ["/bin/sh", "-c"] + args - if executable: - args[0] = executable - - if executable is None: - executable = args[0] - orig_executable = executable - - # For transferring possible exec failure from child to parent. - # Data format: "exception name:hex errno:description" - # Pickle is not used; it is complex and involves memory allocation. - errpipe_read, errpipe_write = _create_pipe() - try: - try: - - if _posixsubprocess: - fs_encoding = sys.getfilesystemencoding() - def fs_encode(s): - """Encode s for use in the env, fs or cmdline.""" - if isinstance(s, str): - return s - else: - return s.encode(fs_encoding, 'strict') - - # We must avoid complex work that could involve - # malloc or free in the child process to avoid - # potential deadlocks, thus we do all this here. - # and pass it to fork_exec() - - if env is not None: - env_list = [fs_encode(k) + '=' + fs_encode(v) - for k, v in env.items()] - else: - env_list = None # Use execv instead of execve. - if os.path.dirname(executable): - executable_list = (fs_encode(executable),) - else: - # This matches the behavior of os._execvpe(). - path_list = _get_exec_path(env) - executable_list = (os.path.join(dir, executable) - for dir in path_list) - executable_list = tuple(fs_encode(exe) - for exe in executable_list) - fds_to_keep = set(pass_fds) - fds_to_keep.add(errpipe_write) - self.pid = _posixsubprocess.fork_exec( - args, executable_list, - close_fds, sorted(fds_to_keep), cwd, env_list, - p2cread, p2cwrite, c2pread, c2pwrite, - errread, errwrite, - errpipe_read, errpipe_write, - restore_signals, start_new_session, preexec_fn) - self._child_created = True - else: - # Pure Python implementation: It is not thread safe. - # This implementation may deadlock in the child if your - # parent process has any other threads running. - - gc_was_enabled = gc.isenabled() - # Disable gc to avoid bug where gc -> file_dealloc -> - # write to stderr -> hang. See issue1336 - gc.disable() - try: - self.pid = os.fork() - except: - if gc_was_enabled: - gc.enable() - raise - self._child_created = True - if self.pid == 0: - # Child - reached_preexec = False - try: - # Close parent's pipe ends - if p2cwrite != -1: - os.close(p2cwrite) - if c2pread != -1: - os.close(c2pread) - if errread != -1: - os.close(errread) - os.close(errpipe_read) - - # When duping fds, if there arises a situation - # where one of the fds is either 0, 1 or 2, it - # is possible that it is overwritten (#12607). - if c2pwrite == 0: - c2pwrite = os.dup(c2pwrite) - if errwrite == 0 or errwrite == 1: - errwrite = os.dup(errwrite) - - # Dup fds for child - def _dup2(a, b): - # dup2() removes the CLOEXEC flag but - # we must do it ourselves if dup2() - # would be a no-op (issue #10806). - if a == b: - _set_cloexec(a, False) - elif a != -1: - os.dup2(a, b) - _dup2(p2cread, 0) - _dup2(c2pwrite, 1) - _dup2(errwrite, 2) - - # Close pipe fds. Make sure we don't close the - # same fd more than once, or standard fds. - closed = set() - for fd in [p2cread, c2pwrite, errwrite]: - if fd > 2 and fd not in closed: - os.close(fd) - closed.add(fd) - - if cwd is not None: - os.chdir(cwd) - - # This is a copy of Python/pythonrun.c - # _Py_RestoreSignals(). If that were exposed - # as a sys._py_restoresignals func it would be - # better.. but this pure python implementation - # isn't likely to be used much anymore. - if restore_signals: - signals = ('SIGPIPE', 'SIGXFZ', 'SIGXFSZ') - for sig in signals: - if hasattr(signal, sig): - signal.signal(getattr(signal, sig), - signal.SIG_DFL) - - if start_new_session and hasattr(os, 'setsid'): - os.setsid() - - reached_preexec = True - if preexec_fn: - preexec_fn() - - # Close all other fds, if asked for - after - # preexec_fn(), which may open FDs. - if close_fds: - if pass_fds: - fds_to_keep = set(pass_fds) - fds_to_keep.add(errpipe_write) - self._close_all_but_a_sorted_few_fds( - sorted(fds_to_keep)) - else: - self._close_fds(but=errpipe_write) - - if env is None: - os.execvp(executable, args) - else: - os.execvpe(executable, args, env) - - except: - try: - exc_type, exc_value = sys.exc_info()[:2] - if isinstance(exc_value, OSError): - errno_num = exc_value.errno - else: - errno_num = 0 - if not reached_preexec: - exc_value = "noexec" - message = '%s:%x:%s' % (exc_type.__name__, - errno_num, exc_value) - os.write(errpipe_write, message) - except Exception: - # We MUST not allow anything odd happening - # above to prevent us from exiting below. - pass - - # This exitcode won't be reported to applications - # so it really doesn't matter what we return. - os._exit(255) - - # Parent - if gc_was_enabled: - gc.enable() - finally: - # be sure the FD is closed no matter what - os.close(errpipe_write) - - # A pair of non -1s means we created both fds and are - # responsible for closing them. - # self._devnull is not always defined. - devnull_fd = getattr(self, '_devnull', None) - if p2cread != -1 and p2cwrite != -1 and p2cread != devnull_fd: - os.close(p2cread) - if c2pwrite != -1 and c2pread != -1 and c2pwrite != devnull_fd: - os.close(c2pwrite) - if errwrite != -1 and errread != -1 and errwrite != devnull_fd: - os.close(errwrite) - if devnull_fd is not None: - os.close(devnull_fd) - # Prevent a double close of these fds from __init__ on error. - self._closed_child_pipe_fds = True - - # Wait for exec to fail or succeed; possibly raising exception - # exception (limited in size) - errpipe_data = '' - while True: - part = _eintr_retry_call(os.read, errpipe_read, 50000) - errpipe_data += part - if not part or len(errpipe_data) > 50000: - break - finally: - # be sure the FD is closed no matter what - os.close(errpipe_read) - - if errpipe_data != "": - try: - _eintr_retry_call(os.waitpid, self.pid, 0) - except OSError, e: - if e.errno != errno.ECHILD: - raise - try: - exception_name, hex_errno, err_msg = ( - errpipe_data.split(':', 2)) - except ValueError: - exception_name = 'RuntimeError' - hex_errno = '0' - err_msg = ('Bad exception data from child: ' + - repr(errpipe_data)) - child_exception_type = getattr( - exceptions, exception_name, RuntimeError) - if issubclass(child_exception_type, OSError) and hex_errno: - errno_num = int(hex_errno, 16) - child_exec_never_called = (err_msg == "noexec") - if child_exec_never_called: - err_msg = "" - if errno_num != 0: - err_msg = os.strerror(errno_num) - if errno_num == errno.ENOENT: - if child_exec_never_called: - # The error must be from chdir(cwd). - err_msg += ': ' + repr(cwd) - else: - err_msg += ': ' + repr(orig_executable) - raise child_exception_type(errno_num, err_msg) - try: - exception = child_exception_type(err_msg) - except Exception: - exception = RuntimeError( - 'Could not re-raise %r exception from the' - ' child with error message %r' % - (child_exception_type, err_msg)) - raise exception - - - def _handle_exitstatus(self, sts, _WIFSIGNALED=os.WIFSIGNALED, - _WTERMSIG=os.WTERMSIG, _WIFEXITED=os.WIFEXITED, - _WEXITSTATUS=os.WEXITSTATUS, _WIFSTOPPED=os.WIFSTOPPED, - _WSTOPSIG=os.WSTOPSIG): - """All callers to this function MUST hold self._waitpid_lock.""" - # This method is called (indirectly) by __del__, so it cannot - # refer to anything outside of its local scope.""" - if _WIFSIGNALED(sts): - self.returncode = -_WTERMSIG(sts) - elif _WIFEXITED(sts): - self.returncode = _WEXITSTATUS(sts) - elif _WIFSTOPPED(sts): - self.returncode = -_WSTOPSIG(sts) - else: - # Should never happen - raise RuntimeError("Unknown child exit status!") - - - def _internal_poll(self, _deadstate=None, _waitpid=os.waitpid, - _WNOHANG=os.WNOHANG, _os_error=os.error, _ECHILD=errno.ECHILD): - """Check if child process has terminated. Returns returncode - attribute. - - This method is called by __del__, so it cannot reference anything - outside of the local scope (nor can any methods it calls). - - """ - if self.returncode is None: - if not self._waitpid_lock.acquire(False): - # Something else is busy calling waitpid. Don't allow two - # at once. We know nothing yet. - return None - try: - try: - if self.returncode is not None: - return self.returncode # Another thread waited. - pid, sts = _waitpid(self.pid, _WNOHANG) - if pid == self.pid: - self._handle_exitstatus(sts) - except _os_error, e: - if _deadstate is not None: - self.returncode = _deadstate - elif e.errno == _ECHILD: - # This happens if SIGCLD is set to be ignored or - # waiting for child processes has otherwise been - # disabled for our process. This child is dead, we - # can't get the status. - # http://bugs.python.org/issue15756 - self.returncode = 0 - finally: - self._waitpid_lock.release() - return self.returncode - - - def _try_wait(self, wait_flags): - """All callers to this function MUST hold self._waitpid_lock.""" - try: - (pid, sts) = _eintr_retry_call(os.waitpid, self.pid, wait_flags) - except OSError, e: - if e.errno != errno.ECHILD: - raise - # This happens if SIGCLD is set to be ignored or waiting - # for child processes has otherwise been disabled for our - # process. This child is dead, we can't get the status. - pid = self.pid - sts = 0 - return (pid, sts) - - - def wait(self, timeout=None, endtime=None): - """Wait for child process to terminate. Returns returncode - attribute.""" - if self.returncode is not None: - return self.returncode - - # endtime is preferred to timeout. timeout is only used for - # printing. - if endtime is not None or timeout is not None: - if endtime is None: - endtime = time.time() + timeout - elif timeout is None: - timeout = self._remaining_time(endtime) - - if endtime is not None: - # Enter a busy loop if we have a timeout. This busy loop was - # cribbed from Lib/threading.py in Thread.wait() at r71065. - delay = 0.0005 # 500 us -> initial delay of 1 ms - while True: - if self._waitpid_lock.acquire(False): - try: - if self.returncode is not None: - break # Another thread waited. - (pid, sts) = self._try_wait(os.WNOHANG) - assert pid == self.pid or pid == 0 - if pid == self.pid: - self._handle_exitstatus(sts) - break - finally: - self._waitpid_lock.release() - remaining = self._remaining_time(endtime) - if remaining <= 0: - raise TimeoutExpired(self.args, timeout) - delay = min(delay * 2, remaining, .05) - time.sleep(delay) - else: - while self.returncode is None: - self._waitpid_lock.acquire() - try: - if self.returncode is not None: - break # Another thread waited. - (pid, sts) = self._try_wait(0) - # Check the pid and loop as waitpid has been known to - # return 0 even without WNOHANG in odd situations. - # http://bugs.python.org/issue14396. - if pid == self.pid: - self._handle_exitstatus(sts) - finally: - self._waitpid_lock.release() - return self.returncode - - - def _communicate(self, input, endtime, orig_timeout): - if self.stdin and not self._communication_started: - # Flush stdio buffer. This might block, if the user has - # been writing to .stdin in an uncontrolled fashion. - self.stdin.flush() - if not input: - self.stdin.close() - - if _has_poll: - stdout, stderr = self._communicate_with_poll(input, endtime, - orig_timeout) - else: - stdout, stderr = self._communicate_with_select(input, endtime, - orig_timeout) - - self.wait(timeout=self._remaining_time(endtime)) - - # All data exchanged. Translate lists into strings. - if stdout is not None: - stdout = ''.join(stdout) - if stderr is not None: - stderr = ''.join(stderr) - - # Translate newlines, if requested. We cannot let the file - # object do the translation: It is based on stdio, which is - # impossible to combine with select (unless forcing no - # buffering). - if self.universal_newlines and hasattr(file, 'newlines'): - if stdout: - stdout = self._translate_newlines(stdout) - if stderr: - stderr = self._translate_newlines(stderr) - - return (stdout, stderr) - - - def _communicate_with_poll(self, input, endtime, orig_timeout): - stdout = None # Return - stderr = None # Return - - if not self._communication_started: - self._fd2file = {} - - poller = select.poll() - def register_and_append(file_obj, eventmask): - poller.register(file_obj.fileno(), eventmask) - self._fd2file[file_obj.fileno()] = file_obj - - def close_unregister_and_remove(fd): - poller.unregister(fd) - self._fd2file[fd].close() - self._fd2file.pop(fd) - - if self.stdin and input: - register_and_append(self.stdin, select.POLLOUT) - - # Only create this mapping if we haven't already. - if not self._communication_started: - self._fd2output = {} - if self.stdout: - self._fd2output[self.stdout.fileno()] = [] - if self.stderr: - self._fd2output[self.stderr.fileno()] = [] - - select_POLLIN_POLLPRI = select.POLLIN | select.POLLPRI - if self.stdout: - register_and_append(self.stdout, select_POLLIN_POLLPRI) - stdout = self._fd2output[self.stdout.fileno()] - if self.stderr: - register_and_append(self.stderr, select_POLLIN_POLLPRI) - stderr = self._fd2output[self.stderr.fileno()] - - # Save the input here so that if we time out while communicating, - # we can continue sending input if we retry. - if self.stdin and self._input is None: - self._input_offset = 0 - self._input = input - if self.universal_newlines and isinstance(self._input, unicode): - self._input = self._input.encode( - self.stdin.encoding or sys.getdefaultencoding()) - - while self._fd2file: - try: - ready = poller.poll(self._remaining_time(endtime)) - except select.error, e: - if e.args[0] == errno.EINTR: - continue - raise - self._check_timeout(endtime, orig_timeout) - - for fd, mode in ready: - if mode & select.POLLOUT: - chunk = self._input[self._input_offset : - self._input_offset + _PIPE_BUF] - self._input_offset += os.write(fd, chunk) - if self._input_offset >= len(self._input): - close_unregister_and_remove(fd) - elif mode & select_POLLIN_POLLPRI: - data = os.read(fd, 4096) - if not data: - close_unregister_and_remove(fd) - self._fd2output[fd].append(data) - else: - # Ignore hang up or errors. - close_unregister_and_remove(fd) - - return (stdout, stderr) - - - def _communicate_with_select(self, input, endtime, orig_timeout): - if not self._communication_started: - self._read_set = [] - self._write_set = [] - if self.stdin and input: - self._write_set.append(self.stdin) - if self.stdout: - self._read_set.append(self.stdout) - if self.stderr: - self._read_set.append(self.stderr) - - if self.stdin and self._input is None: - self._input_offset = 0 - self._input = input - if self.universal_newlines and isinstance(self._input, unicode): - self._input = self._input.encode( - self.stdin.encoding or sys.getdefaultencoding()) - - stdout = None # Return - stderr = None # Return - - if self.stdout: - if not self._communication_started: - self._stdout_buff = [] - stdout = self._stdout_buff - if self.stderr: - if not self._communication_started: - self._stderr_buff = [] - stderr = self._stderr_buff - - while self._read_set or self._write_set: - try: - (rlist, wlist, xlist) = \ - select.select(self._read_set, self._write_set, [], - self._remaining_time(endtime)) - except select.error, e: - if e.args[0] == errno.EINTR: - continue - raise - - # According to the docs, returning three empty lists indicates - # that the timeout expired. - if not (rlist or wlist or xlist): - raise TimeoutExpired(self.args, orig_timeout) - # We also check what time it is ourselves for good measure. - self._check_timeout(endtime, orig_timeout) - - if self.stdin in wlist: - chunk = self._input[self._input_offset : - self._input_offset + _PIPE_BUF] - bytes_written = os.write(self.stdin.fileno(), chunk) - self._input_offset += bytes_written - if self._input_offset >= len(self._input): - self.stdin.close() - self._write_set.remove(self.stdin) - - if self.stdout in rlist: - data = os.read(self.stdout.fileno(), 1024) - if data == "": - self.stdout.close() - self._read_set.remove(self.stdout) - stdout.append(data) - - if self.stderr in rlist: - data = os.read(self.stderr.fileno(), 1024) - if data == "": - self.stderr.close() - self._read_set.remove(self.stderr) - stderr.append(data) - - return (stdout, stderr) - - - def send_signal(self, sig): - """Send a signal to the process - """ - # Skip signalling a process that we know has already died. - if self.returncode is None: - os.kill(self.pid, sig) - - def terminate(self): - """Terminate the process with SIGTERM - """ - self.send_signal(signal.SIGTERM) - - def kill(self): - """Kill the process with SIGKILL - """ - self.send_signal(signal.SIGKILL) diff --git a/ambari-common/src/main/python/ambari_commons/unicode_tolerant_fs.py b/ambari-common/src/main/python/ambari_commons/unicode_tolerant_fs.py index fe0c0bbc224..35de4dad74c 100644 --- a/ambari-common/src/main/python/ambari_commons/unicode_tolerant_fs.py +++ b/ambari-common/src/main/python/ambari_commons/unicode_tolerant_fs.py @@ -15,12 +15,6 @@ Ambari Agent """ -def get_encoded_string(data): - try: - return data.encode("utf8") - except UnicodeDecodeError: - return data - def unicode_walk(top, topdown=True, onerror=None, followlinks=False): """ Unicode tolerant version of os.walk. Can(and must) be used environments with messed locales(and other encoding-related @@ -32,20 +26,17 @@ def unicode_walk(top, topdown=True, onerror=None, followlinks=False): islink, join, isdir = os.path.islink, os.path.join, os.path.isdir - top = get_encoded_string(top) - try: # Note that listdir and error are globals in this module due # to earlier import-*. names = os.listdir(top) - except os.error, err: + except os.error as err: if onerror is not None: onerror(err) return dirs, nondirs = [], [] for name in names: - name = get_encoded_string(name) if isdir(join(top, name)): dirs.append(name) else: @@ -54,7 +45,6 @@ def unicode_walk(top, topdown=True, onerror=None, followlinks=False): if topdown: yield top, dirs, nondirs for name in dirs: - name = get_encoded_string(name) new_path = join(top, name) if followlinks or not islink(new_path): for x in unicode_walk(new_path, topdown, onerror, followlinks): diff --git a/ambari-common/src/main/python/ambari_commons/urllib_handlers.py b/ambari-common/src/main/python/ambari_commons/urllib_handlers.py index 04069712c24..bb840a67365 100644 --- a/ambari-common/src/main/python/ambari_commons/urllib_handlers.py +++ b/ambari-common/src/main/python/ambari_commons/urllib_handlers.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one @@ -21,10 +21,10 @@ import logging import string -from urllib2 import BaseHandler -from urlparse import urlparse -from urlparse import urlunparse -from urlparse import ParseResult +from urllib.request import BaseHandler +from urllib.parse import urlparse +from urllib.parse import urlunparse +from urllib.parse import ParseResult logger = logging.getLogger() @@ -77,7 +77,7 @@ def http_response(self, request, response): # at this point the header should resemble # Refresh: 3; url=http://c6403.ambari.apache.org:8088/ - semicolon_index = string.find(refresh_header, ';') + semicolon_index = str.find(refresh_header, ';') # slice the redirect URL out of # 3; url=http://c6403.ambari.apache.org:8088/jmx" @@ -86,7 +86,7 @@ def http_response(self, request, response): else: redirect_url_key_value_pair = refresh_header - equals_index = string.find(redirect_url_key_value_pair, '=') + equals_index = str.find(redirect_url_key_value_pair, '=') key = redirect_url_key_value_pair[:equals_index] redirect_url = redirect_url_key_value_pair[equals_index+1:] @@ -109,7 +109,7 @@ def http_response(self, request, response): # follow the new new and return the response return self.parent.open(redirect_url) - except Exception,exception: + except Exception as exception: logger.error("Unable to follow refresh header {0}. {1}".format( refresh_header, str(exception))) diff --git a/ambari-common/src/main/python/ambari_commons/yaml_utils.py b/ambari-common/src/main/python/ambari_commons/yaml_utils.py index dae5b563f6a..803a58d00b0 100644 --- a/ambari-common/src/main/python/ambari_commons/yaml_utils.py +++ b/ambari-common/src/main/python/ambari_commons/yaml_utils.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/_markupsafe/__init__.py b/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/_markupsafe/__init__.py index 74d0fe3a68f..8dfcb719712 100644 --- a/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/_markupsafe/__init__.py +++ b/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/_markupsafe/__init__.py @@ -9,7 +9,7 @@ :license: BSD, see LICENSE for more details. """ import re -from itertools import imap + __all__ = ['Markup', 'soft_unicode', 'escape', 'escape_silent'] @@ -19,7 +19,7 @@ _entity_re = re.compile(r'&([^;]+);') -class Markup(unicode): +class Markup(str): r"""Marks a string as being safe for inclusion in HTML/XML output without needing to be escaped. This implements the `__html__` interface a couple of frameworks and web applications use. :class:`Markup` is a direct @@ -64,60 +64,60 @@ class Markup(unicode): """ __slots__ = () - def __new__(cls, base=u'', encoding=None, errors='strict'): + def __new__(cls, base='', encoding=None, errors='strict'): if hasattr(base, '__html__'): base = base.__html__() if encoding is None: - return unicode.__new__(cls, base) - return unicode.__new__(cls, base, encoding, errors) + return str.__new__(cls, base) + return str.__new__(cls, base, encoding, errors) def __html__(self): return self def __add__(self, other): - if hasattr(other, '__html__') or isinstance(other, basestring): - return self.__class__(unicode(self) + unicode(escape(other))) + if hasattr(other, '__html__') or isinstance(other, str): + return self.__class__(str(self) + str(escape(other))) return NotImplemented def __radd__(self, other): - if hasattr(other, '__html__') or isinstance(other, basestring): - return self.__class__(unicode(escape(other)) + unicode(self)) + if hasattr(other, '__html__') or isinstance(other, str): + return self.__class__(str(escape(other)) + str(self)) return NotImplemented def __mul__(self, num): - if isinstance(num, (int, long)): - return self.__class__(unicode.__mul__(self, num)) + if isinstance(num, int): + return self.__class__(str.__mul__(self, num)) return NotImplemented __rmul__ = __mul__ def __mod__(self, arg): if isinstance(arg, tuple): - arg = tuple(imap(_MarkupEscapeHelper, arg)) + arg = tuple(map(_MarkupEscapeHelper, arg)) else: arg = _MarkupEscapeHelper(arg) - return self.__class__(unicode.__mod__(self, arg)) + return self.__class__(str.__mod__(self, arg)) def __repr__(self): return '%s(%s)' % ( self.__class__.__name__, - unicode.__repr__(self) + str.__repr__(self) ) def join(self, seq): - return self.__class__(unicode.join(self, imap(escape, seq))) - join.__doc__ = unicode.join.__doc__ + return self.__class__(str.join(self, list(map(escape, seq)))) + join.__doc__ = str.join.__doc__ def split(self, *args, **kwargs): - return map(self.__class__, unicode.split(self, *args, **kwargs)) - split.__doc__ = unicode.split.__doc__ + return map(self.__class__, str.split(self, *args, **kwargs)) + split.__doc__ = str.split.__doc__ def rsplit(self, *args, **kwargs): - return map(self.__class__, unicode.rsplit(self, *args, **kwargs)) - rsplit.__doc__ = unicode.rsplit.__doc__ + return map(self.__class__, str.rsplit(self, *args, **kwargs)) + rsplit.__doc__ = str.rsplit.__doc__ def splitlines(self, *args, **kwargs): - return map(self.__class__, unicode.splitlines(self, *args, **kwargs)) - splitlines.__doc__ = unicode.splitlines.__doc__ + return map(self.__class__, str.splitlines(self, *args, **kwargs)) + splitlines.__doc__ = str.splitlines.__doc__ def unescape(self): r"""Unescape markup again into an unicode string. This also resolves @@ -130,16 +130,16 @@ def unescape(self): def handle_match(m): name = m.group(1) if name in HTML_ENTITIES: - return unichr(HTML_ENTITIES[name]) + return chr(HTML_ENTITIES[name]) try: if name[:2] in ('#x', '#X'): - return unichr(int(name[2:], 16)) + return chr(int(name[2:], 16)) elif name.startswith('#'): - return unichr(int(name[1:])) + return chr(int(name[1:])) except ValueError: pass - return u'' - return _entity_re.sub(handle_match, unicode(self)) + return '' + return _entity_re.sub(handle_match, str(self)) def striptags(self): r"""Unescape markup into an unicode string and strip all tags. This @@ -149,7 +149,7 @@ def striptags(self): >>> Markup("Main » About").striptags() u'Main \xbb About' """ - stripped = u' '.join(_striptags_re.sub('', self).split()) + stripped = ' '.join(_striptags_re.sub('', self).split()) return Markup(stripped).unescape() @classmethod @@ -164,10 +164,10 @@ def escape(cls, s): return rv def make_wrapper(name): - orig = getattr(unicode, name) + orig = getattr(str, name) def func(self, *args, **kwargs): args = _escape_argspec(list(args), enumerate(args)) - _escape_argspec(kwargs, kwargs.iteritems()) + _escape_argspec(kwargs, kwargs.items()) return self.__class__(orig(self, *args, **kwargs)) func.__name__ = orig.__name__ func.__doc__ = orig.__doc__ @@ -180,16 +180,16 @@ def func(self, *args, **kwargs): locals()[method] = make_wrapper(method) # new in python 2.5 - if hasattr(unicode, 'partition'): + if hasattr(str, 'partition'): partition = make_wrapper('partition'), rpartition = make_wrapper('rpartition') # new in python 2.6 - if hasattr(unicode, 'format'): + if hasattr(str, 'format'): format = make_wrapper('format') # not in python 3 - if hasattr(unicode, '__getslice__'): + if hasattr(str, '__getslice__'): __getslice__ = make_wrapper('__getslice__') del method, make_wrapper @@ -198,7 +198,7 @@ def func(self, *args, **kwargs): def _escape_argspec(obj, iterable): """Helper for various string-wrapped functions.""" for key, value in iterable: - if hasattr(value, '__html__') or isinstance(value, basestring): + if hasattr(value, '__html__') or isinstance(value, str): obj[key] = escape(value) return obj @@ -211,7 +211,7 @@ def __init__(self, obj): __getitem__ = lambda s, x: _MarkupEscapeHelper(s.obj[x]) __str__ = lambda s: str(escape(s.obj)) - __unicode__ = lambda s: unicode(escape(s.obj)) + __unicode__ = lambda s: str(escape(s.obj)) __repr__ = lambda s: str(escape(repr(s.obj))) __int__ = lambda s: int(s.obj) __float__ = lambda s: float(s.obj) diff --git a/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/_markupsafe/_bundle.py b/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/_markupsafe/_bundle.py index de5d15e3536..724b1340af1 100644 --- a/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/_markupsafe/_bundle.py +++ b/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/_markupsafe/_bundle.py @@ -25,7 +25,7 @@ def rewrite_imports(lines): def main(): if len(sys.argv) != 2: - print 'error: only argument is path to markupsafe' + print('error: only argument is path to markupsafe') sys.exit(1) basedir = os.path.dirname(__file__) markupdir = sys.argv[1] diff --git a/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/_markupsafe/_native.py b/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/_markupsafe/_native.py index 97c8d35b097..454058cb869 100644 --- a/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/_markupsafe/_native.py +++ b/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/_markupsafe/_native.py @@ -18,7 +18,7 @@ def escape(s): """ if hasattr(s, '__html__'): return s.__html__() - return Markup(unicode(s) + return Markup(str(s) .replace('&', '&') .replace('>', '>') .replace('<', '<') @@ -40,6 +40,6 @@ def soft_unicode(s): """Make a string unicode if it isn't already. That way a markup string is not converted back to unicode. """ - if not isinstance(s, unicode): - s = unicode(s) + if not isinstance(s, str): + s = str(s) return s diff --git a/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/_markupsafe/tests.py b/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/_markupsafe/tests.py index 8e88bfe6c50..d66b4049836 100644 --- a/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/_markupsafe/tests.py +++ b/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/_markupsafe/tests.py @@ -9,7 +9,7 @@ def test_markup_operations(self): # adding two strings should escape the unsafe one unsafe = '' safe = Markup('username') - assert unsafe + safe == unicode(escape(unsafe)) + unicode(safe) + assert unsafe + safe == str(escape(unsafe)) + str(safe) # string interpolations are safe to use too assert Markup('%s') % '' == \ @@ -48,19 +48,19 @@ def test_all_set(self): def test_escape_silent(self): assert escape_silent(None) == Markup() assert escape(None) == Markup(None) - assert escape_silent('') == Markup(u'<foo>') + assert escape_silent('') == Markup('<foo>') class MarkupLeakTestCase(unittest.TestCase): def test_markup_leaks(self): counts = set() - for count in xrange(20): - for item in xrange(1000): + for count in range(20): + for item in range(1000): + escape("foo") + escape("") escape("foo") escape("") - escape(u"foo") - escape(u"") counts.add(len(gc.get_objects())) assert len(counts) == 1, 'ouch, c extension seems to leak objects' diff --git a/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/_stringdefs.py b/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/_stringdefs.py index 83d152873b0..9cd8400ece6 100644 --- a/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/_stringdefs.py +++ b/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/_stringdefs.py @@ -13,83 +13,83 @@ :license: BSD, see LICENSE for details. """ -Cc = u'\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f' +Cc = '\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f' -Cf = u'\xad\u0600\u0601\u0602\u0603\u06dd\u070f\u17b4\u17b5\u200b\u200c\u200d\u200e\u200f\u202a\u202b\u202c\u202d\u202e\u2060\u2061\u2062\u2063\u206a\u206b\u206c\u206d\u206e\u206f\ufeff\ufff9\ufffa\ufffb' +Cf = '\xad\u0600\u0601\u0602\u0603\u06dd\u070f\u17b4\u17b5\u200b\u200c\u200d\u200e\u200f\u202a\u202b\u202c\u202d\u202e\u2060\u2061\u2062\u2063\u206a\u206b\u206c\u206d\u206e\u206f\ufeff\ufff9\ufffa\ufffb' -Cn = u'\u0242\u0243\u0244\u0245\u0246\u0247\u0248\u0249\u024a\u024b\u024c\u024d\u024e\u024f\u0370\u0371\u0372\u0373\u0376\u0377\u0378\u0379\u037b\u037c\u037d\u037f\u0380\u0381\u0382\u0383\u038b\u038d\u03a2\u03cf\u0487\u04cf\u04fa\u04fb\u04fc\u04fd\u04fe\u04ff\u0510\u0511\u0512\u0513\u0514\u0515\u0516\u0517\u0518\u0519\u051a\u051b\u051c\u051d\u051e\u051f\u0520\u0521\u0522\u0523\u0524\u0525\u0526\u0527\u0528\u0529\u052a\u052b\u052c\u052d\u052e\u052f\u0530\u0557\u0558\u0560\u0588\u058b\u058c\u058d\u058e\u058f\u0590\u05ba\u05c8\u05c9\u05ca\u05cb\u05cc\u05cd\u05ce\u05cf\u05eb\u05ec\u05ed\u05ee\u05ef\u05f5\u05f6\u05f7\u05f8\u05f9\u05fa\u05fb\u05fc\u05fd\u05fe\u05ff\u0604\u0605\u0606\u0607\u0608\u0609\u060a\u0616\u0617\u0618\u0619\u061a\u061c\u061d\u0620\u063b\u063c\u063d\u063e\u063f\u065f\u070e\u074b\u074c\u076e\u076f\u0770\u0771\u0772\u0773\u0774\u0775\u0776\u0777\u0778\u0779\u077a\u077b\u077c\u077d\u077e\u077f\u07b2\u07b3\u07b4\u07b5\u07b6\u07b7\u07b8\u07b9\u07ba\u07bb\u07bc\u07bd\u07be\u07bf\u07c0\u07c1\u07c2\u07c3\u07c4\u07c5\u07c6\u07c7\u07c8\u07c9\u07ca\u07cb\u07cc\u07cd\u07ce\u07cf\u07d0\u07d1\u07d2\u07d3\u07d4\u07d5\u07d6\u07d7\u07d8\u07d9\u07da\u07db\u07dc\u07dd\u07de\u07df\u07e0\u07e1\u07e2\u07e3\u07e4\u07e5\u07e6\u07e7\u07e8\u07e9\u07ea\u07eb\u07ec\u07ed\u07ee\u07ef\u07f0\u07f1\u07f2\u07f3\u07f4\u07f5\u07f6\u07f7\u07f8\u07f9\u07fa\u07fb\u07fc\u07fd\u07fe\u07ff\u0800\u0801\u0802\u0803\u0804\u0805\u0806\u0807\u0808\u0809\u080a\u080b\u080c\u080d\u080e\u080f\u0810\u0811\u0812\u0813\u0814\u0815\u0816\u0817\u0818\u0819\u081a\u081b\u081c\u081d\u081e\u081f\u0820\u0821\u0822\u0823\u0824\u0825\u0826\u0827\u0828\u0829\u082a\u082b\u082c\u082d\u082e\u082f\u0830\u0831\u0832\u0833\u0834\u0835\u0836\u0837\u0838\u0839\u083a\u083b\u083c\u083d\u083e\u083f\u0840\u0841\u0842\u0843\u0844\u0845\u0846\u0847\u0848\u0849\u084a\u084b\u084c\u084d\u084e\u084f\u0850\u0851\u0852\u0853\u0854\u0855\u0856\u0857\u0858\u0859\u085a\u085b\u085c\u085d\u085e\u085f\u0860\u0861\u0862\u0863\u0864\u0865\u0866\u0867\u0868\u0869\u086a\u086b\u086c\u086d\u086e\u086f\u0870\u0871\u0872\u0873\u0874\u0875\u0876\u0877\u0878\u0879\u087a\u087b\u087c\u087d\u087e\u087f\u0880\u0881\u0882\u0883\u0884\u0885\u0886\u0887\u0888\u0889\u088a\u088b\u088c\u088d\u088e\u088f\u0890\u0891\u0892\u0893\u0894\u0895\u0896\u0897\u0898\u0899\u089a\u089b\u089c\u089d\u089e\u089f\u08a0\u08a1\u08a2\u08a3\u08a4\u08a5\u08a6\u08a7\u08a8\u08a9\u08aa\u08ab\u08ac\u08ad\u08ae\u08af\u08b0\u08b1\u08b2\u08b3\u08b4\u08b5\u08b6\u08b7\u08b8\u08b9\u08ba\u08bb\u08bc\u08bd\u08be\u08bf\u08c0\u08c1\u08c2\u08c3\u08c4\u08c5\u08c6\u08c7\u08c8\u08c9\u08ca\u08cb\u08cc\u08cd\u08ce\u08cf\u08d0\u08d1\u08d2\u08d3\u08d4\u08d5\u08d6\u08d7\u08d8\u08d9\u08da\u08db\u08dc\u08dd\u08de\u08df\u08e0\u08e1\u08e2\u08e3\u08e4\u08e5\u08e6\u08e7\u08e8\u08e9\u08ea\u08eb\u08ec\u08ed\u08ee\u08ef\u08f0\u08f1\u08f2\u08f3\u08f4\u08f5\u08f6\u08f7\u08f8\u08f9\u08fa\u08fb\u08fc\u08fd\u08fe\u08ff\u0900\u093a\u093b\u094e\u094f\u0955\u0956\u0957\u0971\u0972\u0973\u0974\u0975\u0976\u0977\u0978\u0979\u097a\u097b\u097c\u097e\u097f\u0980\u0984\u098d\u098e\u0991\u0992\u09a9\u09b1\u09b3\u09b4\u09b5\u09ba\u09bb\u09c5\u09c6\u09c9\u09ca\u09cf\u09d0\u09d1\u09d2\u09d3\u09d4\u09d5\u09d6\u09d8\u09d9\u09da\u09db\u09de\u09e4\u09e5\u09fb\u09fc\u09fd\u09fe\u09ff\u0a00\u0a04\u0a0b\u0a0c\u0a0d\u0a0e\u0a11\u0a12\u0a29\u0a31\u0a34\u0a37\u0a3a\u0a3b\u0a3d\u0a43\u0a44\u0a45\u0a46\u0a49\u0a4a\u0a4e\u0a4f\u0a50\u0a51\u0a52\u0a53\u0a54\u0a55\u0a56\u0a57\u0a58\u0a5d\u0a5f\u0a60\u0a61\u0a62\u0a63\u0a64\u0a65\u0a75\u0a76\u0a77\u0a78\u0a79\u0a7a\u0a7b\u0a7c\u0a7d\u0a7e\u0a7f\u0a80\u0a84\u0a8e\u0a92\u0aa9\u0ab1\u0ab4\u0aba\u0abb\u0ac6\u0aca\u0ace\u0acf\u0ad1\u0ad2\u0ad3\u0ad4\u0ad5\u0ad6\u0ad7\u0ad8\u0ad9\u0ada\u0adb\u0adc\u0add\u0ade\u0adf\u0ae4\u0ae5\u0af0\u0af2\u0af3\u0af4\u0af5\u0af6\u0af7\u0af8\u0af9\u0afa\u0afb\u0afc\u0afd\u0afe\u0aff\u0b00\u0b04\u0b0d\u0b0e\u0b11\u0b12\u0b29\u0b31\u0b34\u0b3a\u0b3b\u0b44\u0b45\u0b46\u0b49\u0b4a\u0b4e\u0b4f\u0b50\u0b51\u0b52\u0b53\u0b54\u0b55\u0b58\u0b59\u0b5a\u0b5b\u0b5e\u0b62\u0b63\u0b64\u0b65\u0b72\u0b73\u0b74\u0b75\u0b76\u0b77\u0b78\u0b79\u0b7a\u0b7b\u0b7c\u0b7d\u0b7e\u0b7f\u0b80\u0b81\u0b84\u0b8b\u0b8c\u0b8d\u0b91\u0b96\u0b97\u0b98\u0b9b\u0b9d\u0ba0\u0ba1\u0ba2\u0ba5\u0ba6\u0ba7\u0bab\u0bac\u0bad\u0bba\u0bbb\u0bbc\u0bbd\u0bc3\u0bc4\u0bc5\u0bc9\u0bce\u0bcf\u0bd0\u0bd1\u0bd2\u0bd3\u0bd4\u0bd5\u0bd6\u0bd8\u0bd9\u0bda\u0bdb\u0bdc\u0bdd\u0bde\u0bdf\u0be0\u0be1\u0be2\u0be3\u0be4\u0be5\u0bfb\u0bfc\u0bfd\u0bfe\u0bff\u0c00\u0c04\u0c0d\u0c11\u0c29\u0c34\u0c3a\u0c3b\u0c3c\u0c3d\u0c45\u0c49\u0c4e\u0c4f\u0c50\u0c51\u0c52\u0c53\u0c54\u0c57\u0c58\u0c59\u0c5a\u0c5b\u0c5c\u0c5d\u0c5e\u0c5f\u0c62\u0c63\u0c64\u0c65\u0c70\u0c71\u0c72\u0c73\u0c74\u0c75\u0c76\u0c77\u0c78\u0c79\u0c7a\u0c7b\u0c7c\u0c7d\u0c7e\u0c7f\u0c80\u0c81\u0c84\u0c8d\u0c91\u0ca9\u0cb4\u0cba\u0cbb\u0cc5\u0cc9\u0cce\u0ccf\u0cd0\u0cd1\u0cd2\u0cd3\u0cd4\u0cd7\u0cd8\u0cd9\u0cda\u0cdb\u0cdc\u0cdd\u0cdf\u0ce2\u0ce3\u0ce4\u0ce5\u0cf0\u0cf1\u0cf2\u0cf3\u0cf4\u0cf5\u0cf6\u0cf7\u0cf8\u0cf9\u0cfa\u0cfb\u0cfc\u0cfd\u0cfe\u0cff\u0d00\u0d01\u0d04\u0d0d\u0d11\u0d29\u0d3a\u0d3b\u0d3c\u0d3d\u0d44\u0d45\u0d49\u0d4e\u0d4f\u0d50\u0d51\u0d52\u0d53\u0d54\u0d55\u0d56\u0d58\u0d59\u0d5a\u0d5b\u0d5c\u0d5d\u0d5e\u0d5f\u0d62\u0d63\u0d64\u0d65\u0d70\u0d71\u0d72\u0d73\u0d74\u0d75\u0d76\u0d77\u0d78\u0d79\u0d7a\u0d7b\u0d7c\u0d7d\u0d7e\u0d7f\u0d80\u0d81\u0d84\u0d97\u0d98\u0d99\u0db2\u0dbc\u0dbe\u0dbf\u0dc7\u0dc8\u0dc9\u0dcb\u0dcc\u0dcd\u0dce\u0dd5\u0dd7\u0de0\u0de1\u0de2\u0de3\u0de4\u0de5\u0de6\u0de7\u0de8\u0de9\u0dea\u0deb\u0dec\u0ded\u0dee\u0def\u0df0\u0df1\u0df5\u0df6\u0df7\u0df8\u0df9\u0dfa\u0dfb\u0dfc\u0dfd\u0dfe\u0dff\u0e00\u0e3b\u0e3c\u0e3d\u0e3e\u0e5c\u0e5d\u0e5e\u0e5f\u0e60\u0e61\u0e62\u0e63\u0e64\u0e65\u0e66\u0e67\u0e68\u0e69\u0e6a\u0e6b\u0e6c\u0e6d\u0e6e\u0e6f\u0e70\u0e71\u0e72\u0e73\u0e74\u0e75\u0e76\u0e77\u0e78\u0e79\u0e7a\u0e7b\u0e7c\u0e7d\u0e7e\u0e7f\u0e80\u0e83\u0e85\u0e86\u0e89\u0e8b\u0e8c\u0e8e\u0e8f\u0e90\u0e91\u0e92\u0e93\u0e98\u0ea0\u0ea4\u0ea6\u0ea8\u0ea9\u0eac\u0eba\u0ebe\u0ebf\u0ec5\u0ec7\u0ece\u0ecf\u0eda\u0edb\u0ede\u0edf\u0ee0\u0ee1\u0ee2\u0ee3\u0ee4\u0ee5\u0ee6\u0ee7\u0ee8\u0ee9\u0eea\u0eeb\u0eec\u0eed\u0eee\u0eef\u0ef0\u0ef1\u0ef2\u0ef3\u0ef4\u0ef5\u0ef6\u0ef7\u0ef8\u0ef9\u0efa\u0efb\u0efc\u0efd\u0efe\u0eff\u0f48\u0f6b\u0f6c\u0f6d\u0f6e\u0f6f\u0f70\u0f8c\u0f8d\u0f8e\u0f8f\u0f98\u0fbd\u0fcd\u0fce\u0fd2\u0fd3\u0fd4\u0fd5\u0fd6\u0fd7\u0fd8\u0fd9\u0fda\u0fdb\u0fdc\u0fdd\u0fde\u0fdf\u0fe0\u0fe1\u0fe2\u0fe3\u0fe4\u0fe5\u0fe6\u0fe7\u0fe8\u0fe9\u0fea\u0feb\u0fec\u0fed\u0fee\u0fef\u0ff0\u0ff1\u0ff2\u0ff3\u0ff4\u0ff5\u0ff6\u0ff7\u0ff8\u0ff9\u0ffa\u0ffb\u0ffc\u0ffd\u0ffe\u0fff\u1022\u1028\u102b\u1033\u1034\u1035\u103a\u103b\u103c\u103d\u103e\u103f\u105a\u105b\u105c\u105d\u105e\u105f\u1060\u1061\u1062\u1063\u1064\u1065\u1066\u1067\u1068\u1069\u106a\u106b\u106c\u106d\u106e\u106f\u1070\u1071\u1072\u1073\u1074\u1075\u1076\u1077\u1078\u1079\u107a\u107b\u107c\u107d\u107e\u107f\u1080\u1081\u1082\u1083\u1084\u1085\u1086\u1087\u1088\u1089\u108a\u108b\u108c\u108d\u108e\u108f\u1090\u1091\u1092\u1093\u1094\u1095\u1096\u1097\u1098\u1099\u109a\u109b\u109c\u109d\u109e\u109f\u10c6\u10c7\u10c8\u10c9\u10ca\u10cb\u10cc\u10cd\u10ce\u10cf\u10fd\u10fe\u10ff\u115a\u115b\u115c\u115d\u115e\u11a3\u11a4\u11a5\u11a6\u11a7\u11fa\u11fb\u11fc\u11fd\u11fe\u11ff\u1249\u124e\u124f\u1257\u1259\u125e\u125f\u1289\u128e\u128f\u12b1\u12b6\u12b7\u12bf\u12c1\u12c6\u12c7\u12d7\u1311\u1316\u1317\u135b\u135c\u135d\u135e\u137d\u137e\u137f\u139a\u139b\u139c\u139d\u139e\u139f\u13f5\u13f6\u13f7\u13f8\u13f9\u13fa\u13fb\u13fc\u13fd\u13fe\u13ff\u1400\u1677\u1678\u1679\u167a\u167b\u167c\u167d\u167e\u167f\u169d\u169e\u169f\u16f1\u16f2\u16f3\u16f4\u16f5\u16f6\u16f7\u16f8\u16f9\u16fa\u16fb\u16fc\u16fd\u16fe\u16ff\u170d\u1715\u1716\u1717\u1718\u1719\u171a\u171b\u171c\u171d\u171e\u171f\u1737\u1738\u1739\u173a\u173b\u173c\u173d\u173e\u173f\u1754\u1755\u1756\u1757\u1758\u1759\u175a\u175b\u175c\u175d\u175e\u175f\u176d\u1771\u1774\u1775\u1776\u1777\u1778\u1779\u177a\u177b\u177c\u177d\u177e\u177f\u17de\u17df\u17ea\u17eb\u17ec\u17ed\u17ee\u17ef\u17fa\u17fb\u17fc\u17fd\u17fe\u17ff\u180f\u181a\u181b\u181c\u181d\u181e\u181f\u1878\u1879\u187a\u187b\u187c\u187d\u187e\u187f\u18aa\u18ab\u18ac\u18ad\u18ae\u18af\u18b0\u18b1\u18b2\u18b3\u18b4\u18b5\u18b6\u18b7\u18b8\u18b9\u18ba\u18bb\u18bc\u18bd\u18be\u18bf\u18c0\u18c1\u18c2\u18c3\u18c4\u18c5\u18c6\u18c7\u18c8\u18c9\u18ca\u18cb\u18cc\u18cd\u18ce\u18cf\u18d0\u18d1\u18d2\u18d3\u18d4\u18d5\u18d6\u18d7\u18d8\u18d9\u18da\u18db\u18dc\u18dd\u18de\u18df\u18e0\u18e1\u18e2\u18e3\u18e4\u18e5\u18e6\u18e7\u18e8\u18e9\u18ea\u18eb\u18ec\u18ed\u18ee\u18ef\u18f0\u18f1\u18f2\u18f3\u18f4\u18f5\u18f6\u18f7\u18f8\u18f9\u18fa\u18fb\u18fc\u18fd\u18fe\u18ff\u191d\u191e\u191f\u192c\u192d\u192e\u192f\u193c\u193d\u193e\u193f\u1941\u1942\u1943\u196e\u196f\u1975\u1976\u1977\u1978\u1979\u197a\u197b\u197c\u197d\u197e\u197f\u19aa\u19ab\u19ac\u19ad\u19ae\u19af\u19ca\u19cb\u19cc\u19cd\u19ce\u19cf\u19da\u19db\u19dc\u19dd\u1a1c\u1a1d\u1a20\u1a21\u1a22\u1a23\u1a24\u1a25\u1a26\u1a27\u1a28\u1a29\u1a2a\u1a2b\u1a2c\u1a2d\u1a2e\u1a2f\u1a30\u1a31\u1a32\u1a33\u1a34\u1a35\u1a36\u1a37\u1a38\u1a39\u1a3a\u1a3b\u1a3c\u1a3d\u1a3e\u1a3f\u1a40\u1a41\u1a42\u1a43\u1a44\u1a45\u1a46\u1a47\u1a48\u1a49\u1a4a\u1a4b\u1a4c\u1a4d\u1a4e\u1a4f\u1a50\u1a51\u1a52\u1a53\u1a54\u1a55\u1a56\u1a57\u1a58\u1a59\u1a5a\u1a5b\u1a5c\u1a5d\u1a5e\u1a5f\u1a60\u1a61\u1a62\u1a63\u1a64\u1a65\u1a66\u1a67\u1a68\u1a69\u1a6a\u1a6b\u1a6c\u1a6d\u1a6e\u1a6f\u1a70\u1a71\u1a72\u1a73\u1a74\u1a75\u1a76\u1a77\u1a78\u1a79\u1a7a\u1a7b\u1a7c\u1a7d\u1a7e\u1a7f\u1a80\u1a81\u1a82\u1a83\u1a84\u1a85\u1a86\u1a87\u1a88\u1a89\u1a8a\u1a8b\u1a8c\u1a8d\u1a8e\u1a8f\u1a90\u1a91\u1a92\u1a93\u1a94\u1a95\u1a96\u1a97\u1a98\u1a99\u1a9a\u1a9b\u1a9c\u1a9d\u1a9e\u1a9f\u1aa0\u1aa1\u1aa2\u1aa3\u1aa4\u1aa5\u1aa6\u1aa7\u1aa8\u1aa9\u1aaa\u1aab\u1aac\u1aad\u1aae\u1aaf\u1ab0\u1ab1\u1ab2\u1ab3\u1ab4\u1ab5\u1ab6\u1ab7\u1ab8\u1ab9\u1aba\u1abb\u1abc\u1abd\u1abe\u1abf\u1ac0\u1ac1\u1ac2\u1ac3\u1ac4\u1ac5\u1ac6\u1ac7\u1ac8\u1ac9\u1aca\u1acb\u1acc\u1acd\u1ace\u1acf\u1ad0\u1ad1\u1ad2\u1ad3\u1ad4\u1ad5\u1ad6\u1ad7\u1ad8\u1ad9\u1ada\u1adb\u1adc\u1add\u1ade\u1adf\u1ae0\u1ae1\u1ae2\u1ae3\u1ae4\u1ae5\u1ae6\u1ae7\u1ae8\u1ae9\u1aea\u1aeb\u1aec\u1aed\u1aee\u1aef\u1af0\u1af1\u1af2\u1af3\u1af4\u1af5\u1af6\u1af7\u1af8\u1af9\u1afa\u1afb\u1afc\u1afd\u1afe\u1aff\u1b00\u1b01\u1b02\u1b03\u1b04\u1b05\u1b06\u1b07\u1b08\u1b09\u1b0a\u1b0b\u1b0c\u1b0d\u1b0e\u1b0f\u1b10\u1b11\u1b12\u1b13\u1b14\u1b15\u1b16\u1b17\u1b18\u1b19\u1b1a\u1b1b\u1b1c\u1b1d\u1b1e\u1b1f\u1b20\u1b21\u1b22\u1b23\u1b24\u1b25\u1b26\u1b27\u1b28\u1b29\u1b2a\u1b2b\u1b2c\u1b2d\u1b2e\u1b2f\u1b30\u1b31\u1b32\u1b33\u1b34\u1b35\u1b36\u1b37\u1b38\u1b39\u1b3a\u1b3b\u1b3c\u1b3d\u1b3e\u1b3f\u1b40\u1b41\u1b42\u1b43\u1b44\u1b45\u1b46\u1b47\u1b48\u1b49\u1b4a\u1b4b\u1b4c\u1b4d\u1b4e\u1b4f\u1b50\u1b51\u1b52\u1b53\u1b54\u1b55\u1b56\u1b57\u1b58\u1b59\u1b5a\u1b5b\u1b5c\u1b5d\u1b5e\u1b5f\u1b60\u1b61\u1b62\u1b63\u1b64\u1b65\u1b66\u1b67\u1b68\u1b69\u1b6a\u1b6b\u1b6c\u1b6d\u1b6e\u1b6f\u1b70\u1b71\u1b72\u1b73\u1b74\u1b75\u1b76\u1b77\u1b78\u1b79\u1b7a\u1b7b\u1b7c\u1b7d\u1b7e\u1b7f\u1b80\u1b81\u1b82\u1b83\u1b84\u1b85\u1b86\u1b87\u1b88\u1b89\u1b8a\u1b8b\u1b8c\u1b8d\u1b8e\u1b8f\u1b90\u1b91\u1b92\u1b93\u1b94\u1b95\u1b96\u1b97\u1b98\u1b99\u1b9a\u1b9b\u1b9c\u1b9d\u1b9e\u1b9f\u1ba0\u1ba1\u1ba2\u1ba3\u1ba4\u1ba5\u1ba6\u1ba7\u1ba8\u1ba9\u1baa\u1bab\u1bac\u1bad\u1bae\u1baf\u1bb0\u1bb1\u1bb2\u1bb3\u1bb4\u1bb5\u1bb6\u1bb7\u1bb8\u1bb9\u1bba\u1bbb\u1bbc\u1bbd\u1bbe\u1bbf\u1bc0\u1bc1\u1bc2\u1bc3\u1bc4\u1bc5\u1bc6\u1bc7\u1bc8\u1bc9\u1bca\u1bcb\u1bcc\u1bcd\u1bce\u1bcf\u1bd0\u1bd1\u1bd2\u1bd3\u1bd4\u1bd5\u1bd6\u1bd7\u1bd8\u1bd9\u1bda\u1bdb\u1bdc\u1bdd\u1bde\u1bdf\u1be0\u1be1\u1be2\u1be3\u1be4\u1be5\u1be6\u1be7\u1be8\u1be9\u1bea\u1beb\u1bec\u1bed\u1bee\u1bef\u1bf0\u1bf1\u1bf2\u1bf3\u1bf4\u1bf5\u1bf6\u1bf7\u1bf8\u1bf9\u1bfa\u1bfb\u1bfc\u1bfd\u1bfe\u1bff\u1c00\u1c01\u1c02\u1c03\u1c04\u1c05\u1c06\u1c07\u1c08\u1c09\u1c0a\u1c0b\u1c0c\u1c0d\u1c0e\u1c0f\u1c10\u1c11\u1c12\u1c13\u1c14\u1c15\u1c16\u1c17\u1c18\u1c19\u1c1a\u1c1b\u1c1c\u1c1d\u1c1e\u1c1f\u1c20\u1c21\u1c22\u1c23\u1c24\u1c25\u1c26\u1c27\u1c28\u1c29\u1c2a\u1c2b\u1c2c\u1c2d\u1c2e\u1c2f\u1c30\u1c31\u1c32\u1c33\u1c34\u1c35\u1c36\u1c37\u1c38\u1c39\u1c3a\u1c3b\u1c3c\u1c3d\u1c3e\u1c3f\u1c40\u1c41\u1c42\u1c43\u1c44\u1c45\u1c46\u1c47\u1c48\u1c49\u1c4a\u1c4b\u1c4c\u1c4d\u1c4e\u1c4f\u1c50\u1c51\u1c52\u1c53\u1c54\u1c55\u1c56\u1c57\u1c58\u1c59\u1c5a\u1c5b\u1c5c\u1c5d\u1c5e\u1c5f\u1c60\u1c61\u1c62\u1c63\u1c64\u1c65\u1c66\u1c67\u1c68\u1c69\u1c6a\u1c6b\u1c6c\u1c6d\u1c6e\u1c6f\u1c70\u1c71\u1c72\u1c73\u1c74\u1c75\u1c76\u1c77\u1c78\u1c79\u1c7a\u1c7b\u1c7c\u1c7d\u1c7e\u1c7f\u1c80\u1c81\u1c82\u1c83\u1c84\u1c85\u1c86\u1c87\u1c88\u1c89\u1c8a\u1c8b\u1c8c\u1c8d\u1c8e\u1c8f\u1c90\u1c91\u1c92\u1c93\u1c94\u1c95\u1c96\u1c97\u1c98\u1c99\u1c9a\u1c9b\u1c9c\u1c9d\u1c9e\u1c9f\u1ca0\u1ca1\u1ca2\u1ca3\u1ca4\u1ca5\u1ca6\u1ca7\u1ca8\u1ca9\u1caa\u1cab\u1cac\u1cad\u1cae\u1caf\u1cb0\u1cb1\u1cb2\u1cb3\u1cb4\u1cb5\u1cb6\u1cb7\u1cb8\u1cb9\u1cba\u1cbb\u1cbc\u1cbd\u1cbe\u1cbf\u1cc0\u1cc1\u1cc2\u1cc3\u1cc4\u1cc5\u1cc6\u1cc7\u1cc8\u1cc9\u1cca\u1ccb\u1ccc\u1ccd\u1cce\u1ccf\u1cd0\u1cd1\u1cd2\u1cd3\u1cd4\u1cd5\u1cd6\u1cd7\u1cd8\u1cd9\u1cda\u1cdb\u1cdc\u1cdd\u1cde\u1cdf\u1ce0\u1ce1\u1ce2\u1ce3\u1ce4\u1ce5\u1ce6\u1ce7\u1ce8\u1ce9\u1cea\u1ceb\u1cec\u1ced\u1cee\u1cef\u1cf0\u1cf1\u1cf2\u1cf3\u1cf4\u1cf5\u1cf6\u1cf7\u1cf8\u1cf9\u1cfa\u1cfb\u1cfc\u1cfd\u1cfe\u1cff\u1dc4\u1dc5\u1dc6\u1dc7\u1dc8\u1dc9\u1dca\u1dcb\u1dcc\u1dcd\u1dce\u1dcf\u1dd0\u1dd1\u1dd2\u1dd3\u1dd4\u1dd5\u1dd6\u1dd7\u1dd8\u1dd9\u1dda\u1ddb\u1ddc\u1ddd\u1dde\u1ddf\u1de0\u1de1\u1de2\u1de3\u1de4\u1de5\u1de6\u1de7\u1de8\u1de9\u1dea\u1deb\u1dec\u1ded\u1dee\u1def\u1df0\u1df1\u1df2\u1df3\u1df4\u1df5\u1df6\u1df7\u1df8\u1df9\u1dfa\u1dfb\u1dfc\u1dfd\u1dfe\u1dff\u1e9c\u1e9d\u1e9e\u1e9f\u1efa\u1efb\u1efc\u1efd\u1efe\u1eff\u1f16\u1f17\u1f1e\u1f1f\u1f46\u1f47\u1f4e\u1f4f\u1f58\u1f5a\u1f5c\u1f5e\u1f7e\u1f7f\u1fb5\u1fc5\u1fd4\u1fd5\u1fdc\u1ff0\u1ff1\u1ff5\u1fff\u2064\u2065\u2066\u2067\u2068\u2069\u2072\u2073\u208f\u2095\u2096\u2097\u2098\u2099\u209a\u209b\u209c\u209d\u209e\u209f\u20b6\u20b7\u20b8\u20b9\u20ba\u20bb\u20bc\u20bd\u20be\u20bf\u20c0\u20c1\u20c2\u20c3\u20c4\u20c5\u20c6\u20c7\u20c8\u20c9\u20ca\u20cb\u20cc\u20cd\u20ce\u20cf\u20ec\u20ed\u20ee\u20ef\u20f0\u20f1\u20f2\u20f3\u20f4\u20f5\u20f6\u20f7\u20f8\u20f9\u20fa\u20fb\u20fc\u20fd\u20fe\u20ff\u214d\u214e\u214f\u2150\u2151\u2152\u2184\u2185\u2186\u2187\u2188\u2189\u218a\u218b\u218c\u218d\u218e\u218f\u23dc\u23dd\u23de\u23df\u23e0\u23e1\u23e2\u23e3\u23e4\u23e5\u23e6\u23e7\u23e8\u23e9\u23ea\u23eb\u23ec\u23ed\u23ee\u23ef\u23f0\u23f1\u23f2\u23f3\u23f4\u23f5\u23f6\u23f7\u23f8\u23f9\u23fa\u23fb\u23fc\u23fd\u23fe\u23ff\u2427\u2428\u2429\u242a\u242b\u242c\u242d\u242e\u242f\u2430\u2431\u2432\u2433\u2434\u2435\u2436\u2437\u2438\u2439\u243a\u243b\u243c\u243d\u243e\u243f\u244b\u244c\u244d\u244e\u244f\u2450\u2451\u2452\u2453\u2454\u2455\u2456\u2457\u2458\u2459\u245a\u245b\u245c\u245d\u245e\u245f\u269d\u269e\u269f\u26b2\u26b3\u26b4\u26b5\u26b6\u26b7\u26b8\u26b9\u26ba\u26bb\u26bc\u26bd\u26be\u26bf\u26c0\u26c1\u26c2\u26c3\u26c4\u26c5\u26c6\u26c7\u26c8\u26c9\u26ca\u26cb\u26cc\u26cd\u26ce\u26cf\u26d0\u26d1\u26d2\u26d3\u26d4\u26d5\u26d6\u26d7\u26d8\u26d9\u26da\u26db\u26dc\u26dd\u26de\u26df\u26e0\u26e1\u26e2\u26e3\u26e4\u26e5\u26e6\u26e7\u26e8\u26e9\u26ea\u26eb\u26ec\u26ed\u26ee\u26ef\u26f0\u26f1\u26f2\u26f3\u26f4\u26f5\u26f6\u26f7\u26f8\u26f9\u26fa\u26fb\u26fc\u26fd\u26fe\u26ff\u2700\u2705\u270a\u270b\u2728\u274c\u274e\u2753\u2754\u2755\u2757\u275f\u2760\u2795\u2796\u2797\u27b0\u27bf\u27c7\u27c8\u27c9\u27ca\u27cb\u27cc\u27cd\u27ce\u27cf\u27ec\u27ed\u27ee\u27ef\u2b14\u2b15\u2b16\u2b17\u2b18\u2b19\u2b1a\u2b1b\u2b1c\u2b1d\u2b1e\u2b1f\u2b20\u2b21\u2b22\u2b23\u2b24\u2b25\u2b26\u2b27\u2b28\u2b29\u2b2a\u2b2b\u2b2c\u2b2d\u2b2e\u2b2f\u2b30\u2b31\u2b32\u2b33\u2b34\u2b35\u2b36\u2b37\u2b38\u2b39\u2b3a\u2b3b\u2b3c\u2b3d\u2b3e\u2b3f\u2b40\u2b41\u2b42\u2b43\u2b44\u2b45\u2b46\u2b47\u2b48\u2b49\u2b4a\u2b4b\u2b4c\u2b4d\u2b4e\u2b4f\u2b50\u2b51\u2b52\u2b53\u2b54\u2b55\u2b56\u2b57\u2b58\u2b59\u2b5a\u2b5b\u2b5c\u2b5d\u2b5e\u2b5f\u2b60\u2b61\u2b62\u2b63\u2b64\u2b65\u2b66\u2b67\u2b68\u2b69\u2b6a\u2b6b\u2b6c\u2b6d\u2b6e\u2b6f\u2b70\u2b71\u2b72\u2b73\u2b74\u2b75\u2b76\u2b77\u2b78\u2b79\u2b7a\u2b7b\u2b7c\u2b7d\u2b7e\u2b7f\u2b80\u2b81\u2b82\u2b83\u2b84\u2b85\u2b86\u2b87\u2b88\u2b89\u2b8a\u2b8b\u2b8c\u2b8d\u2b8e\u2b8f\u2b90\u2b91\u2b92\u2b93\u2b94\u2b95\u2b96\u2b97\u2b98\u2b99\u2b9a\u2b9b\u2b9c\u2b9d\u2b9e\u2b9f\u2ba0\u2ba1\u2ba2\u2ba3\u2ba4\u2ba5\u2ba6\u2ba7\u2ba8\u2ba9\u2baa\u2bab\u2bac\u2bad\u2bae\u2baf\u2bb0\u2bb1\u2bb2\u2bb3\u2bb4\u2bb5\u2bb6\u2bb7\u2bb8\u2bb9\u2bba\u2bbb\u2bbc\u2bbd\u2bbe\u2bbf\u2bc0\u2bc1\u2bc2\u2bc3\u2bc4\u2bc5\u2bc6\u2bc7\u2bc8\u2bc9\u2bca\u2bcb\u2bcc\u2bcd\u2bce\u2bcf\u2bd0\u2bd1\u2bd2\u2bd3\u2bd4\u2bd5\u2bd6\u2bd7\u2bd8\u2bd9\u2bda\u2bdb\u2bdc\u2bdd\u2bde\u2bdf\u2be0\u2be1\u2be2\u2be3\u2be4\u2be5\u2be6\u2be7\u2be8\u2be9\u2bea\u2beb\u2bec\u2bed\u2bee\u2bef\u2bf0\u2bf1\u2bf2\u2bf3\u2bf4\u2bf5\u2bf6\u2bf7\u2bf8\u2bf9\u2bfa\u2bfb\u2bfc\u2bfd\u2bfe\u2bff\u2c2f\u2c5f\u2c60\u2c61\u2c62\u2c63\u2c64\u2c65\u2c66\u2c67\u2c68\u2c69\u2c6a\u2c6b\u2c6c\u2c6d\u2c6e\u2c6f\u2c70\u2c71\u2c72\u2c73\u2c74\u2c75\u2c76\u2c77\u2c78\u2c79\u2c7a\u2c7b\u2c7c\u2c7d\u2c7e\u2c7f\u2ceb\u2cec\u2ced\u2cee\u2cef\u2cf0\u2cf1\u2cf2\u2cf3\u2cf4\u2cf5\u2cf6\u2cf7\u2cf8\u2d26\u2d27\u2d28\u2d29\u2d2a\u2d2b\u2d2c\u2d2d\u2d2e\u2d2f\u2d66\u2d67\u2d68\u2d69\u2d6a\u2d6b\u2d6c\u2d6d\u2d6e\u2d70\u2d71\u2d72\u2d73\u2d74\u2d75\u2d76\u2d77\u2d78\u2d79\u2d7a\u2d7b\u2d7c\u2d7d\u2d7e\u2d7f\u2d97\u2d98\u2d99\u2d9a\u2d9b\u2d9c\u2d9d\u2d9e\u2d9f\u2da7\u2daf\u2db7\u2dbf\u2dc7\u2dcf\u2dd7\u2ddf\u2de0\u2de1\u2de2\u2de3\u2de4\u2de5\u2de6\u2de7\u2de8\u2de9\u2dea\u2deb\u2dec\u2ded\u2dee\u2def\u2df0\u2df1\u2df2\u2df3\u2df4\u2df5\u2df6\u2df7\u2df8\u2df9\u2dfa\u2dfb\u2dfc\u2dfd\u2dfe\u2dff\u2e18\u2e19\u2e1a\u2e1b\u2e1e\u2e1f\u2e20\u2e21\u2e22\u2e23\u2e24\u2e25\u2e26\u2e27\u2e28\u2e29\u2e2a\u2e2b\u2e2c\u2e2d\u2e2e\u2e2f\u2e30\u2e31\u2e32\u2e33\u2e34\u2e35\u2e36\u2e37\u2e38\u2e39\u2e3a\u2e3b\u2e3c\u2e3d\u2e3e\u2e3f\u2e40\u2e41\u2e42\u2e43\u2e44\u2e45\u2e46\u2e47\u2e48\u2e49\u2e4a\u2e4b\u2e4c\u2e4d\u2e4e\u2e4f\u2e50\u2e51\u2e52\u2e53\u2e54\u2e55\u2e56\u2e57\u2e58\u2e59\u2e5a\u2e5b\u2e5c\u2e5d\u2e5e\u2e5f\u2e60\u2e61\u2e62\u2e63\u2e64\u2e65\u2e66\u2e67\u2e68\u2e69\u2e6a\u2e6b\u2e6c\u2e6d\u2e6e\u2e6f\u2e70\u2e71\u2e72\u2e73\u2e74\u2e75\u2e76\u2e77\u2e78\u2e79\u2e7a\u2e7b\u2e7c\u2e7d\u2e7e\u2e7f\u2e9a\u2ef4\u2ef5\u2ef6\u2ef7\u2ef8\u2ef9\u2efa\u2efb\u2efc\u2efd\u2efe\u2eff\u2fd6\u2fd7\u2fd8\u2fd9\u2fda\u2fdb\u2fdc\u2fdd\u2fde\u2fdf\u2fe0\u2fe1\u2fe2\u2fe3\u2fe4\u2fe5\u2fe6\u2fe7\u2fe8\u2fe9\u2fea\u2feb\u2fec\u2fed\u2fee\u2fef\u2ffc\u2ffd\u2ffe\u2fff\u3040\u3097\u3098\u3100\u3101\u3102\u3103\u3104\u312d\u312e\u312f\u3130\u318f\u31b8\u31b9\u31ba\u31bb\u31bc\u31bd\u31be\u31bf\u31d0\u31d1\u31d2\u31d3\u31d4\u31d5\u31d6\u31d7\u31d8\u31d9\u31da\u31db\u31dc\u31dd\u31de\u31df\u31e0\u31e1\u31e2\u31e3\u31e4\u31e5\u31e6\u31e7\u31e8\u31e9\u31ea\u31eb\u31ec\u31ed\u31ee\u31ef\u321f\u3244\u3245\u3246\u3247\u3248\u3249\u324a\u324b\u324c\u324d\u324e\u324f\u32ff\u4db6\u4db7\u4db8\u4db9\u4dba\u4dbb\u4dbc\u4dbd\u4dbe\u4dbf\u9fbc\u9fbd\u9fbe\u9fbf\u9fc0\u9fc1\u9fc2\u9fc3\u9fc4\u9fc5\u9fc6\u9fc7\u9fc8\u9fc9\u9fca\u9fcb\u9fcc\u9fcd\u9fce\u9fcf\u9fd0\u9fd1\u9fd2\u9fd3\u9fd4\u9fd5\u9fd6\u9fd7\u9fd8\u9fd9\u9fda\u9fdb\u9fdc\u9fdd\u9fde\u9fdf\u9fe0\u9fe1\u9fe2\u9fe3\u9fe4\u9fe5\u9fe6\u9fe7\u9fe8\u9fe9\u9fea\u9feb\u9fec\u9fed\u9fee\u9fef\u9ff0\u9ff1\u9ff2\u9ff3\u9ff4\u9ff5\u9ff6\u9ff7\u9ff8\u9ff9\u9ffa\u9ffb\u9ffc\u9ffd\u9ffe\u9fff\ua48d\ua48e\ua48f\ua4c7\ua4c8\ua4c9\ua4ca\ua4cb\ua4cc\ua4cd\ua4ce\ua4cf\ua4d0\ua4d1\ua4d2\ua4d3\ua4d4\ua4d5\ua4d6\ua4d7\ua4d8\ua4d9\ua4da\ua4db\ua4dc\ua4dd\ua4de\ua4df\ua4e0\ua4e1\ua4e2\ua4e3\ua4e4\ua4e5\ua4e6\ua4e7\ua4e8\ua4e9\ua4ea\ua4eb\ua4ec\ua4ed\ua4ee\ua4ef\ua4f0\ua4f1\ua4f2\ua4f3\ua4f4\ua4f5\ua4f6\ua4f7\ua4f8\ua4f9\ua4fa\ua4fb\ua4fc\ua4fd\ua4fe\ua4ff\ua500\ua501\ua502\ua503\ua504\ua505\ua506\ua507\ua508\ua509\ua50a\ua50b\ua50c\ua50d\ua50e\ua50f\ua510\ua511\ua512\ua513\ua514\ua515\ua516\ua517\ua518\ua519\ua51a\ua51b\ua51c\ua51d\ua51e\ua51f\ua520\ua521\ua522\ua523\ua524\ua525\ua526\ua527\ua528\ua529\ua52a\ua52b\ua52c\ua52d\ua52e\ua52f\ua530\ua531\ua532\ua533\ua534\ua535\ua536\ua537\ua538\ua539\ua53a\ua53b\ua53c\ua53d\ua53e\ua53f\ua540\ua541\ua542\ua543\ua544\ua545\ua546\ua547\ua548\ua549\ua54a\ua54b\ua54c\ua54d\ua54e\ua54f\ua550\ua551\ua552\ua553\ua554\ua555\ua556\ua557\ua558\ua559\ua55a\ua55b\ua55c\ua55d\ua55e\ua55f\ua560\ua561\ua562\ua563\ua564\ua565\ua566\ua567\ua568\ua569\ua56a\ua56b\ua56c\ua56d\ua56e\ua56f\ua570\ua571\ua572\ua573\ua574\ua575\ua576\ua577\ua578\ua579\ua57a\ua57b\ua57c\ua57d\ua57e\ua57f\ua580\ua581\ua582\ua583\ua584\ua585\ua586\ua587\ua588\ua589\ua58a\ua58b\ua58c\ua58d\ua58e\ua58f\ua590\ua591\ua592\ua593\ua594\ua595\ua596\ua597\ua598\ua599\ua59a\ua59b\ua59c\ua59d\ua59e\ua59f\ua5a0\ua5a1\ua5a2\ua5a3\ua5a4\ua5a5\ua5a6\ua5a7\ua5a8\ua5a9\ua5aa\ua5ab\ua5ac\ua5ad\ua5ae\ua5af\ua5b0\ua5b1\ua5b2\ua5b3\ua5b4\ua5b5\ua5b6\ua5b7\ua5b8\ua5b9\ua5ba\ua5bb\ua5bc\ua5bd\ua5be\ua5bf\ua5c0\ua5c1\ua5c2\ua5c3\ua5c4\ua5c5\ua5c6\ua5c7\ua5c8\ua5c9\ua5ca\ua5cb\ua5cc\ua5cd\ua5ce\ua5cf\ua5d0\ua5d1\ua5d2\ua5d3\ua5d4\ua5d5\ua5d6\ua5d7\ua5d8\ua5d9\ua5da\ua5db\ua5dc\ua5dd\ua5de\ua5df\ua5e0\ua5e1\ua5e2\ua5e3\ua5e4\ua5e5\ua5e6\ua5e7\ua5e8\ua5e9\ua5ea\ua5eb\ua5ec\ua5ed\ua5ee\ua5ef\ua5f0\ua5f1\ua5f2\ua5f3\ua5f4\ua5f5\ua5f6\ua5f7\ua5f8\ua5f9\ua5fa\ua5fb\ua5fc\ua5fd\ua5fe\ua5ff\ua600\ua601\ua602\ua603\ua604\ua605\ua606\ua607\ua608\ua609\ua60a\ua60b\ua60c\ua60d\ua60e\ua60f\ua610\ua611\ua612\ua613\ua614\ua615\ua616\ua617\ua618\ua619\ua61a\ua61b\ua61c\ua61d\ua61e\ua61f\ua620\ua621\ua622\ua623\ua624\ua625\ua626\ua627\ua628\ua629\ua62a\ua62b\ua62c\ua62d\ua62e\ua62f\ua630\ua631\ua632\ua633\ua634\ua635\ua636\ua637\ua638\ua639\ua63a\ua63b\ua63c\ua63d\ua63e\ua63f\ua640\ua641\ua642\ua643\ua644\ua645\ua646\ua647\ua648\ua649\ua64a\ua64b\ua64c\ua64d\ua64e\ua64f\ua650\ua651\ua652\ua653\ua654\ua655\ua656\ua657\ua658\ua659\ua65a\ua65b\ua65c\ua65d\ua65e\ua65f\ua660\ua661\ua662\ua663\ua664\ua665\ua666\ua667\ua668\ua669\ua66a\ua66b\ua66c\ua66d\ua66e\ua66f\ua670\ua671\ua672\ua673\ua674\ua675\ua676\ua677\ua678\ua679\ua67a\ua67b\ua67c\ua67d\ua67e\ua67f\ua680\ua681\ua682\ua683\ua684\ua685\ua686\ua687\ua688\ua689\ua68a\ua68b\ua68c\ua68d\ua68e\ua68f\ua690\ua691\ua692\ua693\ua694\ua695\ua696\ua697\ua698\ua699\ua69a\ua69b\ua69c\ua69d\ua69e\ua69f\ua6a0\ua6a1\ua6a2\ua6a3\ua6a4\ua6a5\ua6a6\ua6a7\ua6a8\ua6a9\ua6aa\ua6ab\ua6ac\ua6ad\ua6ae\ua6af\ua6b0\ua6b1\ua6b2\ua6b3\ua6b4\ua6b5\ua6b6\ua6b7\ua6b8\ua6b9\ua6ba\ua6bb\ua6bc\ua6bd\ua6be\ua6bf\ua6c0\ua6c1\ua6c2\ua6c3\ua6c4\ua6c5\ua6c6\ua6c7\ua6c8\ua6c9\ua6ca\ua6cb\ua6cc\ua6cd\ua6ce\ua6cf\ua6d0\ua6d1\ua6d2\ua6d3\ua6d4\ua6d5\ua6d6\ua6d7\ua6d8\ua6d9\ua6da\ua6db\ua6dc\ua6dd\ua6de\ua6df\ua6e0\ua6e1\ua6e2\ua6e3\ua6e4\ua6e5\ua6e6\ua6e7\ua6e8\ua6e9\ua6ea\ua6eb\ua6ec\ua6ed\ua6ee\ua6ef\ua6f0\ua6f1\ua6f2\ua6f3\ua6f4\ua6f5\ua6f6\ua6f7\ua6f8\ua6f9\ua6fa\ua6fb\ua6fc\ua6fd\ua6fe\ua6ff\ua717\ua718\ua719\ua71a\ua71b\ua71c\ua71d\ua71e\ua71f\ua720\ua721\ua722\ua723\ua724\ua725\ua726\ua727\ua728\ua729\ua72a\ua72b\ua72c\ua72d\ua72e\ua72f\ua730\ua731\ua732\ua733\ua734\ua735\ua736\ua737\ua738\ua739\ua73a\ua73b\ua73c\ua73d\ua73e\ua73f\ua740\ua741\ua742\ua743\ua744\ua745\ua746\ua747\ua748\ua749\ua74a\ua74b\ua74c\ua74d\ua74e\ua74f\ua750\ua751\ua752\ua753\ua754\ua755\ua756\ua757\ua758\ua759\ua75a\ua75b\ua75c\ua75d\ua75e\ua75f\ua760\ua761\ua762\ua763\ua764\ua765\ua766\ua767\ua768\ua769\ua76a\ua76b\ua76c\ua76d\ua76e\ua76f\ua770\ua771\ua772\ua773\ua774\ua775\ua776\ua777\ua778\ua779\ua77a\ua77b\ua77c\ua77d\ua77e\ua77f\ua780\ua781\ua782\ua783\ua784\ua785\ua786\ua787\ua788\ua789\ua78a\ua78b\ua78c\ua78d\ua78e\ua78f\ua790\ua791\ua792\ua793\ua794\ua795\ua796\ua797\ua798\ua799\ua79a\ua79b\ua79c\ua79d\ua79e\ua79f\ua7a0\ua7a1\ua7a2\ua7a3\ua7a4\ua7a5\ua7a6\ua7a7\ua7a8\ua7a9\ua7aa\ua7ab\ua7ac\ua7ad\ua7ae\ua7af\ua7b0\ua7b1\ua7b2\ua7b3\ua7b4\ua7b5\ua7b6\ua7b7\ua7b8\ua7b9\ua7ba\ua7bb\ua7bc\ua7bd\ua7be\ua7bf\ua7c0\ua7c1\ua7c2\ua7c3\ua7c4\ua7c5\ua7c6\ua7c7\ua7c8\ua7c9\ua7ca\ua7cb\ua7cc\ua7cd\ua7ce\ua7cf\ua7d0\ua7d1\ua7d2\ua7d3\ua7d4\ua7d5\ua7d6\ua7d7\ua7d8\ua7d9\ua7da\ua7db\ua7dc\ua7dd\ua7de\ua7df\ua7e0\ua7e1\ua7e2\ua7e3\ua7e4\ua7e5\ua7e6\ua7e7\ua7e8\ua7e9\ua7ea\ua7eb\ua7ec\ua7ed\ua7ee\ua7ef\ua7f0\ua7f1\ua7f2\ua7f3\ua7f4\ua7f5\ua7f6\ua7f7\ua7f8\ua7f9\ua7fa\ua7fb\ua7fc\ua7fd\ua7fe\ua7ff\ua82c\ua82d\ua82e\ua82f\ua830\ua831\ua832\ua833\ua834\ua835\ua836\ua837\ua838\ua839\ua83a\ua83b\ua83c\ua83d\ua83e\ua83f\ua840\ua841\ua842\ua843\ua844\ua845\ua846\ua847\ua848\ua849\ua84a\ua84b\ua84c\ua84d\ua84e\ua84f\ua850\ua851\ua852\ua853\ua854\ua855\ua856\ua857\ua858\ua859\ua85a\ua85b\ua85c\ua85d\ua85e\ua85f\ua860\ua861\ua862\ua863\ua864\ua865\ua866\ua867\ua868\ua869\ua86a\ua86b\ua86c\ua86d\ua86e\ua86f\ua870\ua871\ua872\ua873\ua874\ua875\ua876\ua877\ua878\ua879\ua87a\ua87b\ua87c\ua87d\ua87e\ua87f\ua880\ua881\ua882\ua883\ua884\ua885\ua886\ua887\ua888\ua889\ua88a\ua88b\ua88c\ua88d\ua88e\ua88f\ua890\ua891\ua892\ua893\ua894\ua895\ua896\ua897\ua898\ua899\ua89a\ua89b\ua89c\ua89d\ua89e\ua89f\ua8a0\ua8a1\ua8a2\ua8a3\ua8a4\ua8a5\ua8a6\ua8a7\ua8a8\ua8a9\ua8aa\ua8ab\ua8ac\ua8ad\ua8ae\ua8af\ua8b0\ua8b1\ua8b2\ua8b3\ua8b4\ua8b5\ua8b6\ua8b7\ua8b8\ua8b9\ua8ba\ua8bb\ua8bc\ua8bd\ua8be\ua8bf\ua8c0\ua8c1\ua8c2\ua8c3\ua8c4\ua8c5\ua8c6\ua8c7\ua8c8\ua8c9\ua8ca\ua8cb\ua8cc\ua8cd\ua8ce\ua8cf\ua8d0\ua8d1\ua8d2\ua8d3\ua8d4\ua8d5\ua8d6\ua8d7\ua8d8\ua8d9\ua8da\ua8db\ua8dc\ua8dd\ua8de\ua8df\ua8e0\ua8e1\ua8e2\ua8e3\ua8e4\ua8e5\ua8e6\ua8e7\ua8e8\ua8e9\ua8ea\ua8eb\ua8ec\ua8ed\ua8ee\ua8ef\ua8f0\ua8f1\ua8f2\ua8f3\ua8f4\ua8f5\ua8f6\ua8f7\ua8f8\ua8f9\ua8fa\ua8fb\ua8fc\ua8fd\ua8fe\ua8ff\ua900\ua901\ua902\ua903\ua904\ua905\ua906\ua907\ua908\ua909\ua90a\ua90b\ua90c\ua90d\ua90e\ua90f\ua910\ua911\ua912\ua913\ua914\ua915\ua916\ua917\ua918\ua919\ua91a\ua91b\ua91c\ua91d\ua91e\ua91f\ua920\ua921\ua922\ua923\ua924\ua925\ua926\ua927\ua928\ua929\ua92a\ua92b\ua92c\ua92d\ua92e\ua92f\ua930\ua931\ua932\ua933\ua934\ua935\ua936\ua937\ua938\ua939\ua93a\ua93b\ua93c\ua93d\ua93e\ua93f\ua940\ua941\ua942\ua943\ua944\ua945\ua946\ua947\ua948\ua949\ua94a\ua94b\ua94c\ua94d\ua94e\ua94f\ua950\ua951\ua952\ua953\ua954\ua955\ua956\ua957\ua958\ua959\ua95a\ua95b\ua95c\ua95d\ua95e\ua95f\ua960\ua961\ua962\ua963\ua964\ua965\ua966\ua967\ua968\ua969\ua96a\ua96b\ua96c\ua96d\ua96e\ua96f\ua970\ua971\ua972\ua973\ua974\ua975\ua976\ua977\ua978\ua979\ua97a\ua97b\ua97c\ua97d\ua97e\ua97f\ua980\ua981\ua982\ua983\ua984\ua985\ua986\ua987\ua988\ua989\ua98a\ua98b\ua98c\ua98d\ua98e\ua98f\ua990\ua991\ua992\ua993\ua994\ua995\ua996\ua997\ua998\ua999\ua99a\ua99b\ua99c\ua99d\ua99e\ua99f\ua9a0\ua9a1\ua9a2\ua9a3\ua9a4\ua9a5\ua9a6\ua9a7\ua9a8\ua9a9\ua9aa\ua9ab\ua9ac\ua9ad\ua9ae\ua9af\ua9b0\ua9b1\ua9b2\ua9b3\ua9b4\ua9b5\ua9b6\ua9b7\ua9b8\ua9b9\ua9ba\ua9bb\ua9bc\ua9bd\ua9be\ua9bf\ua9c0\ua9c1\ua9c2\ua9c3\ua9c4\ua9c5\ua9c6\ua9c7\ua9c8\ua9c9\ua9ca\ua9cb\ua9cc\ua9cd\ua9ce\ua9cf\ua9d0\ua9d1\ua9d2\ua9d3\ua9d4\ua9d5\ua9d6\ua9d7\ua9d8\ua9d9\ua9da\ua9db\ua9dc\ua9dd\ua9de\ua9df\ua9e0\ua9e1\ua9e2\ua9e3\ua9e4\ua9e5\ua9e6\ua9e7\ua9e8\ua9e9\ua9ea\ua9eb\ua9ec\ua9ed\ua9ee\ua9ef\ua9f0\ua9f1\ua9f2\ua9f3\ua9f4\ua9f5\ua9f6\ua9f7\ua9f8\ua9f9\ua9fa\ua9fb\ua9fc\ua9fd\ua9fe\ua9ff\uaa00\uaa01\uaa02\uaa03\uaa04\uaa05\uaa06\uaa07\uaa08\uaa09\uaa0a\uaa0b\uaa0c\uaa0d\uaa0e\uaa0f\uaa10\uaa11\uaa12\uaa13\uaa14\uaa15\uaa16\uaa17\uaa18\uaa19\uaa1a\uaa1b\uaa1c\uaa1d\uaa1e\uaa1f\uaa20\uaa21\uaa22\uaa23\uaa24\uaa25\uaa26\uaa27\uaa28\uaa29\uaa2a\uaa2b\uaa2c\uaa2d\uaa2e\uaa2f\uaa30\uaa31\uaa32\uaa33\uaa34\uaa35\uaa36\uaa37\uaa38\uaa39\uaa3a\uaa3b\uaa3c\uaa3d\uaa3e\uaa3f\uaa40\uaa41\uaa42\uaa43\uaa44\uaa45\uaa46\uaa47\uaa48\uaa49\uaa4a\uaa4b\uaa4c\uaa4d\uaa4e\uaa4f\uaa50\uaa51\uaa52\uaa53\uaa54\uaa55\uaa56\uaa57\uaa58\uaa59\uaa5a\uaa5b\uaa5c\uaa5d\uaa5e\uaa5f\uaa60\uaa61\uaa62\uaa63\uaa64\uaa65\uaa66\uaa67\uaa68\uaa69\uaa6a\uaa6b\uaa6c\uaa6d\uaa6e\uaa6f\uaa70\uaa71\uaa72\uaa73\uaa74\uaa75\uaa76\uaa77\uaa78\uaa79\uaa7a\uaa7b\uaa7c\uaa7d\uaa7e\uaa7f\uaa80\uaa81\uaa82\uaa83\uaa84\uaa85\uaa86\uaa87\uaa88\uaa89\uaa8a\uaa8b\uaa8c\uaa8d\uaa8e\uaa8f\uaa90\uaa91\uaa92\uaa93\uaa94\uaa95\uaa96\uaa97\uaa98\uaa99\uaa9a\uaa9b\uaa9c\uaa9d\uaa9e\uaa9f\uaaa0\uaaa1\uaaa2\uaaa3\uaaa4\uaaa5\uaaa6\uaaa7\uaaa8\uaaa9\uaaaa\uaaab\uaaac\uaaad\uaaae\uaaaf\uaab0\uaab1\uaab2\uaab3\uaab4\uaab5\uaab6\uaab7\uaab8\uaab9\uaaba\uaabb\uaabc\uaabd\uaabe\uaabf\uaac0\uaac1\uaac2\uaac3\uaac4\uaac5\uaac6\uaac7\uaac8\uaac9\uaaca\uaacb\uaacc\uaacd\uaace\uaacf\uaad0\uaad1\uaad2\uaad3\uaad4\uaad5\uaad6\uaad7\uaad8\uaad9\uaada\uaadb\uaadc\uaadd\uaade\uaadf\uaae0\uaae1\uaae2\uaae3\uaae4\uaae5\uaae6\uaae7\uaae8\uaae9\uaaea\uaaeb\uaaec\uaaed\uaaee\uaaef\uaaf0\uaaf1\uaaf2\uaaf3\uaaf4\uaaf5\uaaf6\uaaf7\uaaf8\uaaf9\uaafa\uaafb\uaafc\uaafd\uaafe\uaaff\uab00\uab01\uab02\uab03\uab04\uab05\uab06\uab07\uab08\uab09\uab0a\uab0b\uab0c\uab0d\uab0e\uab0f\uab10\uab11\uab12\uab13\uab14\uab15\uab16\uab17\uab18\uab19\uab1a\uab1b\uab1c\uab1d\uab1e\uab1f\uab20\uab21\uab22\uab23\uab24\uab25\uab26\uab27\uab28\uab29\uab2a\uab2b\uab2c\uab2d\uab2e\uab2f\uab30\uab31\uab32\uab33\uab34\uab35\uab36\uab37\uab38\uab39\uab3a\uab3b\uab3c\uab3d\uab3e\uab3f\uab40\uab41\uab42\uab43\uab44\uab45\uab46\uab47\uab48\uab49\uab4a\uab4b\uab4c\uab4d\uab4e\uab4f\uab50\uab51\uab52\uab53\uab54\uab55\uab56\uab57\uab58\uab59\uab5a\uab5b\uab5c\uab5d\uab5e\uab5f\uab60\uab61\uab62\uab63\uab64\uab65\uab66\uab67\uab68\uab69\uab6a\uab6b\uab6c\uab6d\uab6e\uab6f\uab70\uab71\uab72\uab73\uab74\uab75\uab76\uab77\uab78\uab79\uab7a\uab7b\uab7c\uab7d\uab7e\uab7f\uab80\uab81\uab82\uab83\uab84\uab85\uab86\uab87\uab88\uab89\uab8a\uab8b\uab8c\uab8d\uab8e\uab8f\uab90\uab91\uab92\uab93\uab94\uab95\uab96\uab97\uab98\uab99\uab9a\uab9b\uab9c\uab9d\uab9e\uab9f\uaba0\uaba1\uaba2\uaba3\uaba4\uaba5\uaba6\uaba7\uaba8\uaba9\uabaa\uabab\uabac\uabad\uabae\uabaf\uabb0\uabb1\uabb2\uabb3\uabb4\uabb5\uabb6\uabb7\uabb8\uabb9\uabba\uabbb\uabbc\uabbd\uabbe\uabbf\uabc0\uabc1\uabc2\uabc3\uabc4\uabc5\uabc6\uabc7\uabc8\uabc9\uabca\uabcb\uabcc\uabcd\uabce\uabcf\uabd0\uabd1\uabd2\uabd3\uabd4\uabd5\uabd6\uabd7\uabd8\uabd9\uabda\uabdb\uabdc\uabdd\uabde\uabdf\uabe0\uabe1\uabe2\uabe3\uabe4\uabe5\uabe6\uabe7\uabe8\uabe9\uabea\uabeb\uabec\uabed\uabee\uabef\uabf0\uabf1\uabf2\uabf3\uabf4\uabf5\uabf6\uabf7\uabf8\uabf9\uabfa\uabfb\uabfc\uabfd\uabfe\uabff\ud7a4\ud7a5\ud7a6\ud7a7\ud7a8\ud7a9\ud7aa\ud7ab\ud7ac\ud7ad\ud7ae\ud7af\ud7b0\ud7b1\ud7b2\ud7b3\ud7b4\ud7b5\ud7b6\ud7b7\ud7b8\ud7b9\ud7ba\ud7bb\ud7bc\ud7bd\ud7be\ud7bf\ud7c0\ud7c1\ud7c2\ud7c3\ud7c4\ud7c5\ud7c6\ud7c7\ud7c8\ud7c9\ud7ca\ud7cb\ud7cc\ud7cd\ud7ce\ud7cf\ud7d0\ud7d1\ud7d2\ud7d3\ud7d4\ud7d5\ud7d6\ud7d7\ud7d8\ud7d9\ud7da\ud7db\ud7dc\ud7dd\ud7de\ud7df\ud7e0\ud7e1\ud7e2\ud7e3\ud7e4\ud7e5\ud7e6\ud7e7\ud7e8\ud7e9\ud7ea\ud7eb\ud7ec\ud7ed\ud7ee\ud7ef\ud7f0\ud7f1\ud7f2\ud7f3\ud7f4\ud7f5\ud7f6\ud7f7\ud7f8\ud7f9\ud7fa\ud7fb\ud7fc\ud7fd\ud7fe\ud7ff\ufa2e\ufa2f\ufa6b\ufa6c\ufa6d\ufa6e\ufa6f\ufada\ufadb\ufadc\ufadd\ufade\ufadf\ufae0\ufae1\ufae2\ufae3\ufae4\ufae5\ufae6\ufae7\ufae8\ufae9\ufaea\ufaeb\ufaec\ufaed\ufaee\ufaef\ufaf0\ufaf1\ufaf2\ufaf3\ufaf4\ufaf5\ufaf6\ufaf7\ufaf8\ufaf9\ufafa\ufafb\ufafc\ufafd\ufafe\ufaff\ufb07\ufb08\ufb09\ufb0a\ufb0b\ufb0c\ufb0d\ufb0e\ufb0f\ufb10\ufb11\ufb12\ufb18\ufb19\ufb1a\ufb1b\ufb1c\ufb37\ufb3d\ufb3f\ufb42\ufb45\ufbb2\ufbb3\ufbb4\ufbb5\ufbb6\ufbb7\ufbb8\ufbb9\ufbba\ufbbb\ufbbc\ufbbd\ufbbe\ufbbf\ufbc0\ufbc1\ufbc2\ufbc3\ufbc4\ufbc5\ufbc6\ufbc7\ufbc8\ufbc9\ufbca\ufbcb\ufbcc\ufbcd\ufbce\ufbcf\ufbd0\ufbd1\ufbd2\ufd40\ufd41\ufd42\ufd43\ufd44\ufd45\ufd46\ufd47\ufd48\ufd49\ufd4a\ufd4b\ufd4c\ufd4d\ufd4e\ufd4f\ufd90\ufd91\ufdc8\ufdc9\ufdca\ufdcb\ufdcc\ufdcd\ufdce\ufdcf\ufdd0\ufdd1\ufdd2\ufdd3\ufdd4\ufdd5\ufdd6\ufdd7\ufdd8\ufdd9\ufdda\ufddb\ufddc\ufddd\ufdde\ufddf\ufde0\ufde1\ufde2\ufde3\ufde4\ufde5\ufde6\ufde7\ufde8\ufde9\ufdea\ufdeb\ufdec\ufded\ufdee\ufdef\ufdfe\ufdff\ufe1a\ufe1b\ufe1c\ufe1d\ufe1e\ufe1f\ufe24\ufe25\ufe26\ufe27\ufe28\ufe29\ufe2a\ufe2b\ufe2c\ufe2d\ufe2e\ufe2f\ufe53\ufe67\ufe6c\ufe6d\ufe6e\ufe6f\ufe75\ufefd\ufefe\uff00\uffbf\uffc0\uffc1\uffc8\uffc9\uffd0\uffd1\uffd8\uffd9\uffdd\uffde\uffdf\uffe7\uffef\ufff0\ufff1\ufff2\ufff3\ufff4\ufff5\ufff6\ufff7\ufff8\ufffe' +Cn = '\u0242\u0243\u0244\u0245\u0246\u0247\u0248\u0249\u024a\u024b\u024c\u024d\u024e\u024f\u0370\u0371\u0372\u0373\u0376\u0377\u0378\u0379\u037b\u037c\u037d\u037f\u0380\u0381\u0382\u0383\u038b\u038d\u03a2\u03cf\u0487\u04cf\u04fa\u04fb\u04fc\u04fd\u04fe\u04ff\u0510\u0511\u0512\u0513\u0514\u0515\u0516\u0517\u0518\u0519\u051a\u051b\u051c\u051d\u051e\u051f\u0520\u0521\u0522\u0523\u0524\u0525\u0526\u0527\u0528\u0529\u052a\u052b\u052c\u052d\u052e\u052f\u0530\u0557\u0558\u0560\u0588\u058b\u058c\u058d\u058e\u058f\u0590\u05ba\u05c8\u05c9\u05ca\u05cb\u05cc\u05cd\u05ce\u05cf\u05eb\u05ec\u05ed\u05ee\u05ef\u05f5\u05f6\u05f7\u05f8\u05f9\u05fa\u05fb\u05fc\u05fd\u05fe\u05ff\u0604\u0605\u0606\u0607\u0608\u0609\u060a\u0616\u0617\u0618\u0619\u061a\u061c\u061d\u0620\u063b\u063c\u063d\u063e\u063f\u065f\u070e\u074b\u074c\u076e\u076f\u0770\u0771\u0772\u0773\u0774\u0775\u0776\u0777\u0778\u0779\u077a\u077b\u077c\u077d\u077e\u077f\u07b2\u07b3\u07b4\u07b5\u07b6\u07b7\u07b8\u07b9\u07ba\u07bb\u07bc\u07bd\u07be\u07bf\u07c0\u07c1\u07c2\u07c3\u07c4\u07c5\u07c6\u07c7\u07c8\u07c9\u07ca\u07cb\u07cc\u07cd\u07ce\u07cf\u07d0\u07d1\u07d2\u07d3\u07d4\u07d5\u07d6\u07d7\u07d8\u07d9\u07da\u07db\u07dc\u07dd\u07de\u07df\u07e0\u07e1\u07e2\u07e3\u07e4\u07e5\u07e6\u07e7\u07e8\u07e9\u07ea\u07eb\u07ec\u07ed\u07ee\u07ef\u07f0\u07f1\u07f2\u07f3\u07f4\u07f5\u07f6\u07f7\u07f8\u07f9\u07fa\u07fb\u07fc\u07fd\u07fe\u07ff\u0800\u0801\u0802\u0803\u0804\u0805\u0806\u0807\u0808\u0809\u080a\u080b\u080c\u080d\u080e\u080f\u0810\u0811\u0812\u0813\u0814\u0815\u0816\u0817\u0818\u0819\u081a\u081b\u081c\u081d\u081e\u081f\u0820\u0821\u0822\u0823\u0824\u0825\u0826\u0827\u0828\u0829\u082a\u082b\u082c\u082d\u082e\u082f\u0830\u0831\u0832\u0833\u0834\u0835\u0836\u0837\u0838\u0839\u083a\u083b\u083c\u083d\u083e\u083f\u0840\u0841\u0842\u0843\u0844\u0845\u0846\u0847\u0848\u0849\u084a\u084b\u084c\u084d\u084e\u084f\u0850\u0851\u0852\u0853\u0854\u0855\u0856\u0857\u0858\u0859\u085a\u085b\u085c\u085d\u085e\u085f\u0860\u0861\u0862\u0863\u0864\u0865\u0866\u0867\u0868\u0869\u086a\u086b\u086c\u086d\u086e\u086f\u0870\u0871\u0872\u0873\u0874\u0875\u0876\u0877\u0878\u0879\u087a\u087b\u087c\u087d\u087e\u087f\u0880\u0881\u0882\u0883\u0884\u0885\u0886\u0887\u0888\u0889\u088a\u088b\u088c\u088d\u088e\u088f\u0890\u0891\u0892\u0893\u0894\u0895\u0896\u0897\u0898\u0899\u089a\u089b\u089c\u089d\u089e\u089f\u08a0\u08a1\u08a2\u08a3\u08a4\u08a5\u08a6\u08a7\u08a8\u08a9\u08aa\u08ab\u08ac\u08ad\u08ae\u08af\u08b0\u08b1\u08b2\u08b3\u08b4\u08b5\u08b6\u08b7\u08b8\u08b9\u08ba\u08bb\u08bc\u08bd\u08be\u08bf\u08c0\u08c1\u08c2\u08c3\u08c4\u08c5\u08c6\u08c7\u08c8\u08c9\u08ca\u08cb\u08cc\u08cd\u08ce\u08cf\u08d0\u08d1\u08d2\u08d3\u08d4\u08d5\u08d6\u08d7\u08d8\u08d9\u08da\u08db\u08dc\u08dd\u08de\u08df\u08e0\u08e1\u08e2\u08e3\u08e4\u08e5\u08e6\u08e7\u08e8\u08e9\u08ea\u08eb\u08ec\u08ed\u08ee\u08ef\u08f0\u08f1\u08f2\u08f3\u08f4\u08f5\u08f6\u08f7\u08f8\u08f9\u08fa\u08fb\u08fc\u08fd\u08fe\u08ff\u0900\u093a\u093b\u094e\u094f\u0955\u0956\u0957\u0971\u0972\u0973\u0974\u0975\u0976\u0977\u0978\u0979\u097a\u097b\u097c\u097e\u097f\u0980\u0984\u098d\u098e\u0991\u0992\u09a9\u09b1\u09b3\u09b4\u09b5\u09ba\u09bb\u09c5\u09c6\u09c9\u09ca\u09cf\u09d0\u09d1\u09d2\u09d3\u09d4\u09d5\u09d6\u09d8\u09d9\u09da\u09db\u09de\u09e4\u09e5\u09fb\u09fc\u09fd\u09fe\u09ff\u0a00\u0a04\u0a0b\u0a0c\u0a0d\u0a0e\u0a11\u0a12\u0a29\u0a31\u0a34\u0a37\u0a3a\u0a3b\u0a3d\u0a43\u0a44\u0a45\u0a46\u0a49\u0a4a\u0a4e\u0a4f\u0a50\u0a51\u0a52\u0a53\u0a54\u0a55\u0a56\u0a57\u0a58\u0a5d\u0a5f\u0a60\u0a61\u0a62\u0a63\u0a64\u0a65\u0a75\u0a76\u0a77\u0a78\u0a79\u0a7a\u0a7b\u0a7c\u0a7d\u0a7e\u0a7f\u0a80\u0a84\u0a8e\u0a92\u0aa9\u0ab1\u0ab4\u0aba\u0abb\u0ac6\u0aca\u0ace\u0acf\u0ad1\u0ad2\u0ad3\u0ad4\u0ad5\u0ad6\u0ad7\u0ad8\u0ad9\u0ada\u0adb\u0adc\u0add\u0ade\u0adf\u0ae4\u0ae5\u0af0\u0af2\u0af3\u0af4\u0af5\u0af6\u0af7\u0af8\u0af9\u0afa\u0afb\u0afc\u0afd\u0afe\u0aff\u0b00\u0b04\u0b0d\u0b0e\u0b11\u0b12\u0b29\u0b31\u0b34\u0b3a\u0b3b\u0b44\u0b45\u0b46\u0b49\u0b4a\u0b4e\u0b4f\u0b50\u0b51\u0b52\u0b53\u0b54\u0b55\u0b58\u0b59\u0b5a\u0b5b\u0b5e\u0b62\u0b63\u0b64\u0b65\u0b72\u0b73\u0b74\u0b75\u0b76\u0b77\u0b78\u0b79\u0b7a\u0b7b\u0b7c\u0b7d\u0b7e\u0b7f\u0b80\u0b81\u0b84\u0b8b\u0b8c\u0b8d\u0b91\u0b96\u0b97\u0b98\u0b9b\u0b9d\u0ba0\u0ba1\u0ba2\u0ba5\u0ba6\u0ba7\u0bab\u0bac\u0bad\u0bba\u0bbb\u0bbc\u0bbd\u0bc3\u0bc4\u0bc5\u0bc9\u0bce\u0bcf\u0bd0\u0bd1\u0bd2\u0bd3\u0bd4\u0bd5\u0bd6\u0bd8\u0bd9\u0bda\u0bdb\u0bdc\u0bdd\u0bde\u0bdf\u0be0\u0be1\u0be2\u0be3\u0be4\u0be5\u0bfb\u0bfc\u0bfd\u0bfe\u0bff\u0c00\u0c04\u0c0d\u0c11\u0c29\u0c34\u0c3a\u0c3b\u0c3c\u0c3d\u0c45\u0c49\u0c4e\u0c4f\u0c50\u0c51\u0c52\u0c53\u0c54\u0c57\u0c58\u0c59\u0c5a\u0c5b\u0c5c\u0c5d\u0c5e\u0c5f\u0c62\u0c63\u0c64\u0c65\u0c70\u0c71\u0c72\u0c73\u0c74\u0c75\u0c76\u0c77\u0c78\u0c79\u0c7a\u0c7b\u0c7c\u0c7d\u0c7e\u0c7f\u0c80\u0c81\u0c84\u0c8d\u0c91\u0ca9\u0cb4\u0cba\u0cbb\u0cc5\u0cc9\u0cce\u0ccf\u0cd0\u0cd1\u0cd2\u0cd3\u0cd4\u0cd7\u0cd8\u0cd9\u0cda\u0cdb\u0cdc\u0cdd\u0cdf\u0ce2\u0ce3\u0ce4\u0ce5\u0cf0\u0cf1\u0cf2\u0cf3\u0cf4\u0cf5\u0cf6\u0cf7\u0cf8\u0cf9\u0cfa\u0cfb\u0cfc\u0cfd\u0cfe\u0cff\u0d00\u0d01\u0d04\u0d0d\u0d11\u0d29\u0d3a\u0d3b\u0d3c\u0d3d\u0d44\u0d45\u0d49\u0d4e\u0d4f\u0d50\u0d51\u0d52\u0d53\u0d54\u0d55\u0d56\u0d58\u0d59\u0d5a\u0d5b\u0d5c\u0d5d\u0d5e\u0d5f\u0d62\u0d63\u0d64\u0d65\u0d70\u0d71\u0d72\u0d73\u0d74\u0d75\u0d76\u0d77\u0d78\u0d79\u0d7a\u0d7b\u0d7c\u0d7d\u0d7e\u0d7f\u0d80\u0d81\u0d84\u0d97\u0d98\u0d99\u0db2\u0dbc\u0dbe\u0dbf\u0dc7\u0dc8\u0dc9\u0dcb\u0dcc\u0dcd\u0dce\u0dd5\u0dd7\u0de0\u0de1\u0de2\u0de3\u0de4\u0de5\u0de6\u0de7\u0de8\u0de9\u0dea\u0deb\u0dec\u0ded\u0dee\u0def\u0df0\u0df1\u0df5\u0df6\u0df7\u0df8\u0df9\u0dfa\u0dfb\u0dfc\u0dfd\u0dfe\u0dff\u0e00\u0e3b\u0e3c\u0e3d\u0e3e\u0e5c\u0e5d\u0e5e\u0e5f\u0e60\u0e61\u0e62\u0e63\u0e64\u0e65\u0e66\u0e67\u0e68\u0e69\u0e6a\u0e6b\u0e6c\u0e6d\u0e6e\u0e6f\u0e70\u0e71\u0e72\u0e73\u0e74\u0e75\u0e76\u0e77\u0e78\u0e79\u0e7a\u0e7b\u0e7c\u0e7d\u0e7e\u0e7f\u0e80\u0e83\u0e85\u0e86\u0e89\u0e8b\u0e8c\u0e8e\u0e8f\u0e90\u0e91\u0e92\u0e93\u0e98\u0ea0\u0ea4\u0ea6\u0ea8\u0ea9\u0eac\u0eba\u0ebe\u0ebf\u0ec5\u0ec7\u0ece\u0ecf\u0eda\u0edb\u0ede\u0edf\u0ee0\u0ee1\u0ee2\u0ee3\u0ee4\u0ee5\u0ee6\u0ee7\u0ee8\u0ee9\u0eea\u0eeb\u0eec\u0eed\u0eee\u0eef\u0ef0\u0ef1\u0ef2\u0ef3\u0ef4\u0ef5\u0ef6\u0ef7\u0ef8\u0ef9\u0efa\u0efb\u0efc\u0efd\u0efe\u0eff\u0f48\u0f6b\u0f6c\u0f6d\u0f6e\u0f6f\u0f70\u0f8c\u0f8d\u0f8e\u0f8f\u0f98\u0fbd\u0fcd\u0fce\u0fd2\u0fd3\u0fd4\u0fd5\u0fd6\u0fd7\u0fd8\u0fd9\u0fda\u0fdb\u0fdc\u0fdd\u0fde\u0fdf\u0fe0\u0fe1\u0fe2\u0fe3\u0fe4\u0fe5\u0fe6\u0fe7\u0fe8\u0fe9\u0fea\u0feb\u0fec\u0fed\u0fee\u0fef\u0ff0\u0ff1\u0ff2\u0ff3\u0ff4\u0ff5\u0ff6\u0ff7\u0ff8\u0ff9\u0ffa\u0ffb\u0ffc\u0ffd\u0ffe\u0fff\u1022\u1028\u102b\u1033\u1034\u1035\u103a\u103b\u103c\u103d\u103e\u103f\u105a\u105b\u105c\u105d\u105e\u105f\u1060\u1061\u1062\u1063\u1064\u1065\u1066\u1067\u1068\u1069\u106a\u106b\u106c\u106d\u106e\u106f\u1070\u1071\u1072\u1073\u1074\u1075\u1076\u1077\u1078\u1079\u107a\u107b\u107c\u107d\u107e\u107f\u1080\u1081\u1082\u1083\u1084\u1085\u1086\u1087\u1088\u1089\u108a\u108b\u108c\u108d\u108e\u108f\u1090\u1091\u1092\u1093\u1094\u1095\u1096\u1097\u1098\u1099\u109a\u109b\u109c\u109d\u109e\u109f\u10c6\u10c7\u10c8\u10c9\u10ca\u10cb\u10cc\u10cd\u10ce\u10cf\u10fd\u10fe\u10ff\u115a\u115b\u115c\u115d\u115e\u11a3\u11a4\u11a5\u11a6\u11a7\u11fa\u11fb\u11fc\u11fd\u11fe\u11ff\u1249\u124e\u124f\u1257\u1259\u125e\u125f\u1289\u128e\u128f\u12b1\u12b6\u12b7\u12bf\u12c1\u12c6\u12c7\u12d7\u1311\u1316\u1317\u135b\u135c\u135d\u135e\u137d\u137e\u137f\u139a\u139b\u139c\u139d\u139e\u139f\u13f5\u13f6\u13f7\u13f8\u13f9\u13fa\u13fb\u13fc\u13fd\u13fe\u13ff\u1400\u1677\u1678\u1679\u167a\u167b\u167c\u167d\u167e\u167f\u169d\u169e\u169f\u16f1\u16f2\u16f3\u16f4\u16f5\u16f6\u16f7\u16f8\u16f9\u16fa\u16fb\u16fc\u16fd\u16fe\u16ff\u170d\u1715\u1716\u1717\u1718\u1719\u171a\u171b\u171c\u171d\u171e\u171f\u1737\u1738\u1739\u173a\u173b\u173c\u173d\u173e\u173f\u1754\u1755\u1756\u1757\u1758\u1759\u175a\u175b\u175c\u175d\u175e\u175f\u176d\u1771\u1774\u1775\u1776\u1777\u1778\u1779\u177a\u177b\u177c\u177d\u177e\u177f\u17de\u17df\u17ea\u17eb\u17ec\u17ed\u17ee\u17ef\u17fa\u17fb\u17fc\u17fd\u17fe\u17ff\u180f\u181a\u181b\u181c\u181d\u181e\u181f\u1878\u1879\u187a\u187b\u187c\u187d\u187e\u187f\u18aa\u18ab\u18ac\u18ad\u18ae\u18af\u18b0\u18b1\u18b2\u18b3\u18b4\u18b5\u18b6\u18b7\u18b8\u18b9\u18ba\u18bb\u18bc\u18bd\u18be\u18bf\u18c0\u18c1\u18c2\u18c3\u18c4\u18c5\u18c6\u18c7\u18c8\u18c9\u18ca\u18cb\u18cc\u18cd\u18ce\u18cf\u18d0\u18d1\u18d2\u18d3\u18d4\u18d5\u18d6\u18d7\u18d8\u18d9\u18da\u18db\u18dc\u18dd\u18de\u18df\u18e0\u18e1\u18e2\u18e3\u18e4\u18e5\u18e6\u18e7\u18e8\u18e9\u18ea\u18eb\u18ec\u18ed\u18ee\u18ef\u18f0\u18f1\u18f2\u18f3\u18f4\u18f5\u18f6\u18f7\u18f8\u18f9\u18fa\u18fb\u18fc\u18fd\u18fe\u18ff\u191d\u191e\u191f\u192c\u192d\u192e\u192f\u193c\u193d\u193e\u193f\u1941\u1942\u1943\u196e\u196f\u1975\u1976\u1977\u1978\u1979\u197a\u197b\u197c\u197d\u197e\u197f\u19aa\u19ab\u19ac\u19ad\u19ae\u19af\u19ca\u19cb\u19cc\u19cd\u19ce\u19cf\u19da\u19db\u19dc\u19dd\u1a1c\u1a1d\u1a20\u1a21\u1a22\u1a23\u1a24\u1a25\u1a26\u1a27\u1a28\u1a29\u1a2a\u1a2b\u1a2c\u1a2d\u1a2e\u1a2f\u1a30\u1a31\u1a32\u1a33\u1a34\u1a35\u1a36\u1a37\u1a38\u1a39\u1a3a\u1a3b\u1a3c\u1a3d\u1a3e\u1a3f\u1a40\u1a41\u1a42\u1a43\u1a44\u1a45\u1a46\u1a47\u1a48\u1a49\u1a4a\u1a4b\u1a4c\u1a4d\u1a4e\u1a4f\u1a50\u1a51\u1a52\u1a53\u1a54\u1a55\u1a56\u1a57\u1a58\u1a59\u1a5a\u1a5b\u1a5c\u1a5d\u1a5e\u1a5f\u1a60\u1a61\u1a62\u1a63\u1a64\u1a65\u1a66\u1a67\u1a68\u1a69\u1a6a\u1a6b\u1a6c\u1a6d\u1a6e\u1a6f\u1a70\u1a71\u1a72\u1a73\u1a74\u1a75\u1a76\u1a77\u1a78\u1a79\u1a7a\u1a7b\u1a7c\u1a7d\u1a7e\u1a7f\u1a80\u1a81\u1a82\u1a83\u1a84\u1a85\u1a86\u1a87\u1a88\u1a89\u1a8a\u1a8b\u1a8c\u1a8d\u1a8e\u1a8f\u1a90\u1a91\u1a92\u1a93\u1a94\u1a95\u1a96\u1a97\u1a98\u1a99\u1a9a\u1a9b\u1a9c\u1a9d\u1a9e\u1a9f\u1aa0\u1aa1\u1aa2\u1aa3\u1aa4\u1aa5\u1aa6\u1aa7\u1aa8\u1aa9\u1aaa\u1aab\u1aac\u1aad\u1aae\u1aaf\u1ab0\u1ab1\u1ab2\u1ab3\u1ab4\u1ab5\u1ab6\u1ab7\u1ab8\u1ab9\u1aba\u1abb\u1abc\u1abd\u1abe\u1abf\u1ac0\u1ac1\u1ac2\u1ac3\u1ac4\u1ac5\u1ac6\u1ac7\u1ac8\u1ac9\u1aca\u1acb\u1acc\u1acd\u1ace\u1acf\u1ad0\u1ad1\u1ad2\u1ad3\u1ad4\u1ad5\u1ad6\u1ad7\u1ad8\u1ad9\u1ada\u1adb\u1adc\u1add\u1ade\u1adf\u1ae0\u1ae1\u1ae2\u1ae3\u1ae4\u1ae5\u1ae6\u1ae7\u1ae8\u1ae9\u1aea\u1aeb\u1aec\u1aed\u1aee\u1aef\u1af0\u1af1\u1af2\u1af3\u1af4\u1af5\u1af6\u1af7\u1af8\u1af9\u1afa\u1afb\u1afc\u1afd\u1afe\u1aff\u1b00\u1b01\u1b02\u1b03\u1b04\u1b05\u1b06\u1b07\u1b08\u1b09\u1b0a\u1b0b\u1b0c\u1b0d\u1b0e\u1b0f\u1b10\u1b11\u1b12\u1b13\u1b14\u1b15\u1b16\u1b17\u1b18\u1b19\u1b1a\u1b1b\u1b1c\u1b1d\u1b1e\u1b1f\u1b20\u1b21\u1b22\u1b23\u1b24\u1b25\u1b26\u1b27\u1b28\u1b29\u1b2a\u1b2b\u1b2c\u1b2d\u1b2e\u1b2f\u1b30\u1b31\u1b32\u1b33\u1b34\u1b35\u1b36\u1b37\u1b38\u1b39\u1b3a\u1b3b\u1b3c\u1b3d\u1b3e\u1b3f\u1b40\u1b41\u1b42\u1b43\u1b44\u1b45\u1b46\u1b47\u1b48\u1b49\u1b4a\u1b4b\u1b4c\u1b4d\u1b4e\u1b4f\u1b50\u1b51\u1b52\u1b53\u1b54\u1b55\u1b56\u1b57\u1b58\u1b59\u1b5a\u1b5b\u1b5c\u1b5d\u1b5e\u1b5f\u1b60\u1b61\u1b62\u1b63\u1b64\u1b65\u1b66\u1b67\u1b68\u1b69\u1b6a\u1b6b\u1b6c\u1b6d\u1b6e\u1b6f\u1b70\u1b71\u1b72\u1b73\u1b74\u1b75\u1b76\u1b77\u1b78\u1b79\u1b7a\u1b7b\u1b7c\u1b7d\u1b7e\u1b7f\u1b80\u1b81\u1b82\u1b83\u1b84\u1b85\u1b86\u1b87\u1b88\u1b89\u1b8a\u1b8b\u1b8c\u1b8d\u1b8e\u1b8f\u1b90\u1b91\u1b92\u1b93\u1b94\u1b95\u1b96\u1b97\u1b98\u1b99\u1b9a\u1b9b\u1b9c\u1b9d\u1b9e\u1b9f\u1ba0\u1ba1\u1ba2\u1ba3\u1ba4\u1ba5\u1ba6\u1ba7\u1ba8\u1ba9\u1baa\u1bab\u1bac\u1bad\u1bae\u1baf\u1bb0\u1bb1\u1bb2\u1bb3\u1bb4\u1bb5\u1bb6\u1bb7\u1bb8\u1bb9\u1bba\u1bbb\u1bbc\u1bbd\u1bbe\u1bbf\u1bc0\u1bc1\u1bc2\u1bc3\u1bc4\u1bc5\u1bc6\u1bc7\u1bc8\u1bc9\u1bca\u1bcb\u1bcc\u1bcd\u1bce\u1bcf\u1bd0\u1bd1\u1bd2\u1bd3\u1bd4\u1bd5\u1bd6\u1bd7\u1bd8\u1bd9\u1bda\u1bdb\u1bdc\u1bdd\u1bde\u1bdf\u1be0\u1be1\u1be2\u1be3\u1be4\u1be5\u1be6\u1be7\u1be8\u1be9\u1bea\u1beb\u1bec\u1bed\u1bee\u1bef\u1bf0\u1bf1\u1bf2\u1bf3\u1bf4\u1bf5\u1bf6\u1bf7\u1bf8\u1bf9\u1bfa\u1bfb\u1bfc\u1bfd\u1bfe\u1bff\u1c00\u1c01\u1c02\u1c03\u1c04\u1c05\u1c06\u1c07\u1c08\u1c09\u1c0a\u1c0b\u1c0c\u1c0d\u1c0e\u1c0f\u1c10\u1c11\u1c12\u1c13\u1c14\u1c15\u1c16\u1c17\u1c18\u1c19\u1c1a\u1c1b\u1c1c\u1c1d\u1c1e\u1c1f\u1c20\u1c21\u1c22\u1c23\u1c24\u1c25\u1c26\u1c27\u1c28\u1c29\u1c2a\u1c2b\u1c2c\u1c2d\u1c2e\u1c2f\u1c30\u1c31\u1c32\u1c33\u1c34\u1c35\u1c36\u1c37\u1c38\u1c39\u1c3a\u1c3b\u1c3c\u1c3d\u1c3e\u1c3f\u1c40\u1c41\u1c42\u1c43\u1c44\u1c45\u1c46\u1c47\u1c48\u1c49\u1c4a\u1c4b\u1c4c\u1c4d\u1c4e\u1c4f\u1c50\u1c51\u1c52\u1c53\u1c54\u1c55\u1c56\u1c57\u1c58\u1c59\u1c5a\u1c5b\u1c5c\u1c5d\u1c5e\u1c5f\u1c60\u1c61\u1c62\u1c63\u1c64\u1c65\u1c66\u1c67\u1c68\u1c69\u1c6a\u1c6b\u1c6c\u1c6d\u1c6e\u1c6f\u1c70\u1c71\u1c72\u1c73\u1c74\u1c75\u1c76\u1c77\u1c78\u1c79\u1c7a\u1c7b\u1c7c\u1c7d\u1c7e\u1c7f\u1c80\u1c81\u1c82\u1c83\u1c84\u1c85\u1c86\u1c87\u1c88\u1c89\u1c8a\u1c8b\u1c8c\u1c8d\u1c8e\u1c8f\u1c90\u1c91\u1c92\u1c93\u1c94\u1c95\u1c96\u1c97\u1c98\u1c99\u1c9a\u1c9b\u1c9c\u1c9d\u1c9e\u1c9f\u1ca0\u1ca1\u1ca2\u1ca3\u1ca4\u1ca5\u1ca6\u1ca7\u1ca8\u1ca9\u1caa\u1cab\u1cac\u1cad\u1cae\u1caf\u1cb0\u1cb1\u1cb2\u1cb3\u1cb4\u1cb5\u1cb6\u1cb7\u1cb8\u1cb9\u1cba\u1cbb\u1cbc\u1cbd\u1cbe\u1cbf\u1cc0\u1cc1\u1cc2\u1cc3\u1cc4\u1cc5\u1cc6\u1cc7\u1cc8\u1cc9\u1cca\u1ccb\u1ccc\u1ccd\u1cce\u1ccf\u1cd0\u1cd1\u1cd2\u1cd3\u1cd4\u1cd5\u1cd6\u1cd7\u1cd8\u1cd9\u1cda\u1cdb\u1cdc\u1cdd\u1cde\u1cdf\u1ce0\u1ce1\u1ce2\u1ce3\u1ce4\u1ce5\u1ce6\u1ce7\u1ce8\u1ce9\u1cea\u1ceb\u1cec\u1ced\u1cee\u1cef\u1cf0\u1cf1\u1cf2\u1cf3\u1cf4\u1cf5\u1cf6\u1cf7\u1cf8\u1cf9\u1cfa\u1cfb\u1cfc\u1cfd\u1cfe\u1cff\u1dc4\u1dc5\u1dc6\u1dc7\u1dc8\u1dc9\u1dca\u1dcb\u1dcc\u1dcd\u1dce\u1dcf\u1dd0\u1dd1\u1dd2\u1dd3\u1dd4\u1dd5\u1dd6\u1dd7\u1dd8\u1dd9\u1dda\u1ddb\u1ddc\u1ddd\u1dde\u1ddf\u1de0\u1de1\u1de2\u1de3\u1de4\u1de5\u1de6\u1de7\u1de8\u1de9\u1dea\u1deb\u1dec\u1ded\u1dee\u1def\u1df0\u1df1\u1df2\u1df3\u1df4\u1df5\u1df6\u1df7\u1df8\u1df9\u1dfa\u1dfb\u1dfc\u1dfd\u1dfe\u1dff\u1e9c\u1e9d\u1e9e\u1e9f\u1efa\u1efb\u1efc\u1efd\u1efe\u1eff\u1f16\u1f17\u1f1e\u1f1f\u1f46\u1f47\u1f4e\u1f4f\u1f58\u1f5a\u1f5c\u1f5e\u1f7e\u1f7f\u1fb5\u1fc5\u1fd4\u1fd5\u1fdc\u1ff0\u1ff1\u1ff5\u1fff\u2064\u2065\u2066\u2067\u2068\u2069\u2072\u2073\u208f\u2095\u2096\u2097\u2098\u2099\u209a\u209b\u209c\u209d\u209e\u209f\u20b6\u20b7\u20b8\u20b9\u20ba\u20bb\u20bc\u20bd\u20be\u20bf\u20c0\u20c1\u20c2\u20c3\u20c4\u20c5\u20c6\u20c7\u20c8\u20c9\u20ca\u20cb\u20cc\u20cd\u20ce\u20cf\u20ec\u20ed\u20ee\u20ef\u20f0\u20f1\u20f2\u20f3\u20f4\u20f5\u20f6\u20f7\u20f8\u20f9\u20fa\u20fb\u20fc\u20fd\u20fe\u20ff\u214d\u214e\u214f\u2150\u2151\u2152\u2184\u2185\u2186\u2187\u2188\u2189\u218a\u218b\u218c\u218d\u218e\u218f\u23dc\u23dd\u23de\u23df\u23e0\u23e1\u23e2\u23e3\u23e4\u23e5\u23e6\u23e7\u23e8\u23e9\u23ea\u23eb\u23ec\u23ed\u23ee\u23ef\u23f0\u23f1\u23f2\u23f3\u23f4\u23f5\u23f6\u23f7\u23f8\u23f9\u23fa\u23fb\u23fc\u23fd\u23fe\u23ff\u2427\u2428\u2429\u242a\u242b\u242c\u242d\u242e\u242f\u2430\u2431\u2432\u2433\u2434\u2435\u2436\u2437\u2438\u2439\u243a\u243b\u243c\u243d\u243e\u243f\u244b\u244c\u244d\u244e\u244f\u2450\u2451\u2452\u2453\u2454\u2455\u2456\u2457\u2458\u2459\u245a\u245b\u245c\u245d\u245e\u245f\u269d\u269e\u269f\u26b2\u26b3\u26b4\u26b5\u26b6\u26b7\u26b8\u26b9\u26ba\u26bb\u26bc\u26bd\u26be\u26bf\u26c0\u26c1\u26c2\u26c3\u26c4\u26c5\u26c6\u26c7\u26c8\u26c9\u26ca\u26cb\u26cc\u26cd\u26ce\u26cf\u26d0\u26d1\u26d2\u26d3\u26d4\u26d5\u26d6\u26d7\u26d8\u26d9\u26da\u26db\u26dc\u26dd\u26de\u26df\u26e0\u26e1\u26e2\u26e3\u26e4\u26e5\u26e6\u26e7\u26e8\u26e9\u26ea\u26eb\u26ec\u26ed\u26ee\u26ef\u26f0\u26f1\u26f2\u26f3\u26f4\u26f5\u26f6\u26f7\u26f8\u26f9\u26fa\u26fb\u26fc\u26fd\u26fe\u26ff\u2700\u2705\u270a\u270b\u2728\u274c\u274e\u2753\u2754\u2755\u2757\u275f\u2760\u2795\u2796\u2797\u27b0\u27bf\u27c7\u27c8\u27c9\u27ca\u27cb\u27cc\u27cd\u27ce\u27cf\u27ec\u27ed\u27ee\u27ef\u2b14\u2b15\u2b16\u2b17\u2b18\u2b19\u2b1a\u2b1b\u2b1c\u2b1d\u2b1e\u2b1f\u2b20\u2b21\u2b22\u2b23\u2b24\u2b25\u2b26\u2b27\u2b28\u2b29\u2b2a\u2b2b\u2b2c\u2b2d\u2b2e\u2b2f\u2b30\u2b31\u2b32\u2b33\u2b34\u2b35\u2b36\u2b37\u2b38\u2b39\u2b3a\u2b3b\u2b3c\u2b3d\u2b3e\u2b3f\u2b40\u2b41\u2b42\u2b43\u2b44\u2b45\u2b46\u2b47\u2b48\u2b49\u2b4a\u2b4b\u2b4c\u2b4d\u2b4e\u2b4f\u2b50\u2b51\u2b52\u2b53\u2b54\u2b55\u2b56\u2b57\u2b58\u2b59\u2b5a\u2b5b\u2b5c\u2b5d\u2b5e\u2b5f\u2b60\u2b61\u2b62\u2b63\u2b64\u2b65\u2b66\u2b67\u2b68\u2b69\u2b6a\u2b6b\u2b6c\u2b6d\u2b6e\u2b6f\u2b70\u2b71\u2b72\u2b73\u2b74\u2b75\u2b76\u2b77\u2b78\u2b79\u2b7a\u2b7b\u2b7c\u2b7d\u2b7e\u2b7f\u2b80\u2b81\u2b82\u2b83\u2b84\u2b85\u2b86\u2b87\u2b88\u2b89\u2b8a\u2b8b\u2b8c\u2b8d\u2b8e\u2b8f\u2b90\u2b91\u2b92\u2b93\u2b94\u2b95\u2b96\u2b97\u2b98\u2b99\u2b9a\u2b9b\u2b9c\u2b9d\u2b9e\u2b9f\u2ba0\u2ba1\u2ba2\u2ba3\u2ba4\u2ba5\u2ba6\u2ba7\u2ba8\u2ba9\u2baa\u2bab\u2bac\u2bad\u2bae\u2baf\u2bb0\u2bb1\u2bb2\u2bb3\u2bb4\u2bb5\u2bb6\u2bb7\u2bb8\u2bb9\u2bba\u2bbb\u2bbc\u2bbd\u2bbe\u2bbf\u2bc0\u2bc1\u2bc2\u2bc3\u2bc4\u2bc5\u2bc6\u2bc7\u2bc8\u2bc9\u2bca\u2bcb\u2bcc\u2bcd\u2bce\u2bcf\u2bd0\u2bd1\u2bd2\u2bd3\u2bd4\u2bd5\u2bd6\u2bd7\u2bd8\u2bd9\u2bda\u2bdb\u2bdc\u2bdd\u2bde\u2bdf\u2be0\u2be1\u2be2\u2be3\u2be4\u2be5\u2be6\u2be7\u2be8\u2be9\u2bea\u2beb\u2bec\u2bed\u2bee\u2bef\u2bf0\u2bf1\u2bf2\u2bf3\u2bf4\u2bf5\u2bf6\u2bf7\u2bf8\u2bf9\u2bfa\u2bfb\u2bfc\u2bfd\u2bfe\u2bff\u2c2f\u2c5f\u2c60\u2c61\u2c62\u2c63\u2c64\u2c65\u2c66\u2c67\u2c68\u2c69\u2c6a\u2c6b\u2c6c\u2c6d\u2c6e\u2c6f\u2c70\u2c71\u2c72\u2c73\u2c74\u2c75\u2c76\u2c77\u2c78\u2c79\u2c7a\u2c7b\u2c7c\u2c7d\u2c7e\u2c7f\u2ceb\u2cec\u2ced\u2cee\u2cef\u2cf0\u2cf1\u2cf2\u2cf3\u2cf4\u2cf5\u2cf6\u2cf7\u2cf8\u2d26\u2d27\u2d28\u2d29\u2d2a\u2d2b\u2d2c\u2d2d\u2d2e\u2d2f\u2d66\u2d67\u2d68\u2d69\u2d6a\u2d6b\u2d6c\u2d6d\u2d6e\u2d70\u2d71\u2d72\u2d73\u2d74\u2d75\u2d76\u2d77\u2d78\u2d79\u2d7a\u2d7b\u2d7c\u2d7d\u2d7e\u2d7f\u2d97\u2d98\u2d99\u2d9a\u2d9b\u2d9c\u2d9d\u2d9e\u2d9f\u2da7\u2daf\u2db7\u2dbf\u2dc7\u2dcf\u2dd7\u2ddf\u2de0\u2de1\u2de2\u2de3\u2de4\u2de5\u2de6\u2de7\u2de8\u2de9\u2dea\u2deb\u2dec\u2ded\u2dee\u2def\u2df0\u2df1\u2df2\u2df3\u2df4\u2df5\u2df6\u2df7\u2df8\u2df9\u2dfa\u2dfb\u2dfc\u2dfd\u2dfe\u2dff\u2e18\u2e19\u2e1a\u2e1b\u2e1e\u2e1f\u2e20\u2e21\u2e22\u2e23\u2e24\u2e25\u2e26\u2e27\u2e28\u2e29\u2e2a\u2e2b\u2e2c\u2e2d\u2e2e\u2e2f\u2e30\u2e31\u2e32\u2e33\u2e34\u2e35\u2e36\u2e37\u2e38\u2e39\u2e3a\u2e3b\u2e3c\u2e3d\u2e3e\u2e3f\u2e40\u2e41\u2e42\u2e43\u2e44\u2e45\u2e46\u2e47\u2e48\u2e49\u2e4a\u2e4b\u2e4c\u2e4d\u2e4e\u2e4f\u2e50\u2e51\u2e52\u2e53\u2e54\u2e55\u2e56\u2e57\u2e58\u2e59\u2e5a\u2e5b\u2e5c\u2e5d\u2e5e\u2e5f\u2e60\u2e61\u2e62\u2e63\u2e64\u2e65\u2e66\u2e67\u2e68\u2e69\u2e6a\u2e6b\u2e6c\u2e6d\u2e6e\u2e6f\u2e70\u2e71\u2e72\u2e73\u2e74\u2e75\u2e76\u2e77\u2e78\u2e79\u2e7a\u2e7b\u2e7c\u2e7d\u2e7e\u2e7f\u2e9a\u2ef4\u2ef5\u2ef6\u2ef7\u2ef8\u2ef9\u2efa\u2efb\u2efc\u2efd\u2efe\u2eff\u2fd6\u2fd7\u2fd8\u2fd9\u2fda\u2fdb\u2fdc\u2fdd\u2fde\u2fdf\u2fe0\u2fe1\u2fe2\u2fe3\u2fe4\u2fe5\u2fe6\u2fe7\u2fe8\u2fe9\u2fea\u2feb\u2fec\u2fed\u2fee\u2fef\u2ffc\u2ffd\u2ffe\u2fff\u3040\u3097\u3098\u3100\u3101\u3102\u3103\u3104\u312d\u312e\u312f\u3130\u318f\u31b8\u31b9\u31ba\u31bb\u31bc\u31bd\u31be\u31bf\u31d0\u31d1\u31d2\u31d3\u31d4\u31d5\u31d6\u31d7\u31d8\u31d9\u31da\u31db\u31dc\u31dd\u31de\u31df\u31e0\u31e1\u31e2\u31e3\u31e4\u31e5\u31e6\u31e7\u31e8\u31e9\u31ea\u31eb\u31ec\u31ed\u31ee\u31ef\u321f\u3244\u3245\u3246\u3247\u3248\u3249\u324a\u324b\u324c\u324d\u324e\u324f\u32ff\u4db6\u4db7\u4db8\u4db9\u4dba\u4dbb\u4dbc\u4dbd\u4dbe\u4dbf\u9fbc\u9fbd\u9fbe\u9fbf\u9fc0\u9fc1\u9fc2\u9fc3\u9fc4\u9fc5\u9fc6\u9fc7\u9fc8\u9fc9\u9fca\u9fcb\u9fcc\u9fcd\u9fce\u9fcf\u9fd0\u9fd1\u9fd2\u9fd3\u9fd4\u9fd5\u9fd6\u9fd7\u9fd8\u9fd9\u9fda\u9fdb\u9fdc\u9fdd\u9fde\u9fdf\u9fe0\u9fe1\u9fe2\u9fe3\u9fe4\u9fe5\u9fe6\u9fe7\u9fe8\u9fe9\u9fea\u9feb\u9fec\u9fed\u9fee\u9fef\u9ff0\u9ff1\u9ff2\u9ff3\u9ff4\u9ff5\u9ff6\u9ff7\u9ff8\u9ff9\u9ffa\u9ffb\u9ffc\u9ffd\u9ffe\u9fff\ua48d\ua48e\ua48f\ua4c7\ua4c8\ua4c9\ua4ca\ua4cb\ua4cc\ua4cd\ua4ce\ua4cf\ua4d0\ua4d1\ua4d2\ua4d3\ua4d4\ua4d5\ua4d6\ua4d7\ua4d8\ua4d9\ua4da\ua4db\ua4dc\ua4dd\ua4de\ua4df\ua4e0\ua4e1\ua4e2\ua4e3\ua4e4\ua4e5\ua4e6\ua4e7\ua4e8\ua4e9\ua4ea\ua4eb\ua4ec\ua4ed\ua4ee\ua4ef\ua4f0\ua4f1\ua4f2\ua4f3\ua4f4\ua4f5\ua4f6\ua4f7\ua4f8\ua4f9\ua4fa\ua4fb\ua4fc\ua4fd\ua4fe\ua4ff\ua500\ua501\ua502\ua503\ua504\ua505\ua506\ua507\ua508\ua509\ua50a\ua50b\ua50c\ua50d\ua50e\ua50f\ua510\ua511\ua512\ua513\ua514\ua515\ua516\ua517\ua518\ua519\ua51a\ua51b\ua51c\ua51d\ua51e\ua51f\ua520\ua521\ua522\ua523\ua524\ua525\ua526\ua527\ua528\ua529\ua52a\ua52b\ua52c\ua52d\ua52e\ua52f\ua530\ua531\ua532\ua533\ua534\ua535\ua536\ua537\ua538\ua539\ua53a\ua53b\ua53c\ua53d\ua53e\ua53f\ua540\ua541\ua542\ua543\ua544\ua545\ua546\ua547\ua548\ua549\ua54a\ua54b\ua54c\ua54d\ua54e\ua54f\ua550\ua551\ua552\ua553\ua554\ua555\ua556\ua557\ua558\ua559\ua55a\ua55b\ua55c\ua55d\ua55e\ua55f\ua560\ua561\ua562\ua563\ua564\ua565\ua566\ua567\ua568\ua569\ua56a\ua56b\ua56c\ua56d\ua56e\ua56f\ua570\ua571\ua572\ua573\ua574\ua575\ua576\ua577\ua578\ua579\ua57a\ua57b\ua57c\ua57d\ua57e\ua57f\ua580\ua581\ua582\ua583\ua584\ua585\ua586\ua587\ua588\ua589\ua58a\ua58b\ua58c\ua58d\ua58e\ua58f\ua590\ua591\ua592\ua593\ua594\ua595\ua596\ua597\ua598\ua599\ua59a\ua59b\ua59c\ua59d\ua59e\ua59f\ua5a0\ua5a1\ua5a2\ua5a3\ua5a4\ua5a5\ua5a6\ua5a7\ua5a8\ua5a9\ua5aa\ua5ab\ua5ac\ua5ad\ua5ae\ua5af\ua5b0\ua5b1\ua5b2\ua5b3\ua5b4\ua5b5\ua5b6\ua5b7\ua5b8\ua5b9\ua5ba\ua5bb\ua5bc\ua5bd\ua5be\ua5bf\ua5c0\ua5c1\ua5c2\ua5c3\ua5c4\ua5c5\ua5c6\ua5c7\ua5c8\ua5c9\ua5ca\ua5cb\ua5cc\ua5cd\ua5ce\ua5cf\ua5d0\ua5d1\ua5d2\ua5d3\ua5d4\ua5d5\ua5d6\ua5d7\ua5d8\ua5d9\ua5da\ua5db\ua5dc\ua5dd\ua5de\ua5df\ua5e0\ua5e1\ua5e2\ua5e3\ua5e4\ua5e5\ua5e6\ua5e7\ua5e8\ua5e9\ua5ea\ua5eb\ua5ec\ua5ed\ua5ee\ua5ef\ua5f0\ua5f1\ua5f2\ua5f3\ua5f4\ua5f5\ua5f6\ua5f7\ua5f8\ua5f9\ua5fa\ua5fb\ua5fc\ua5fd\ua5fe\ua5ff\ua600\ua601\ua602\ua603\ua604\ua605\ua606\ua607\ua608\ua609\ua60a\ua60b\ua60c\ua60d\ua60e\ua60f\ua610\ua611\ua612\ua613\ua614\ua615\ua616\ua617\ua618\ua619\ua61a\ua61b\ua61c\ua61d\ua61e\ua61f\ua620\ua621\ua622\ua623\ua624\ua625\ua626\ua627\ua628\ua629\ua62a\ua62b\ua62c\ua62d\ua62e\ua62f\ua630\ua631\ua632\ua633\ua634\ua635\ua636\ua637\ua638\ua639\ua63a\ua63b\ua63c\ua63d\ua63e\ua63f\ua640\ua641\ua642\ua643\ua644\ua645\ua646\ua647\ua648\ua649\ua64a\ua64b\ua64c\ua64d\ua64e\ua64f\ua650\ua651\ua652\ua653\ua654\ua655\ua656\ua657\ua658\ua659\ua65a\ua65b\ua65c\ua65d\ua65e\ua65f\ua660\ua661\ua662\ua663\ua664\ua665\ua666\ua667\ua668\ua669\ua66a\ua66b\ua66c\ua66d\ua66e\ua66f\ua670\ua671\ua672\ua673\ua674\ua675\ua676\ua677\ua678\ua679\ua67a\ua67b\ua67c\ua67d\ua67e\ua67f\ua680\ua681\ua682\ua683\ua684\ua685\ua686\ua687\ua688\ua689\ua68a\ua68b\ua68c\ua68d\ua68e\ua68f\ua690\ua691\ua692\ua693\ua694\ua695\ua696\ua697\ua698\ua699\ua69a\ua69b\ua69c\ua69d\ua69e\ua69f\ua6a0\ua6a1\ua6a2\ua6a3\ua6a4\ua6a5\ua6a6\ua6a7\ua6a8\ua6a9\ua6aa\ua6ab\ua6ac\ua6ad\ua6ae\ua6af\ua6b0\ua6b1\ua6b2\ua6b3\ua6b4\ua6b5\ua6b6\ua6b7\ua6b8\ua6b9\ua6ba\ua6bb\ua6bc\ua6bd\ua6be\ua6bf\ua6c0\ua6c1\ua6c2\ua6c3\ua6c4\ua6c5\ua6c6\ua6c7\ua6c8\ua6c9\ua6ca\ua6cb\ua6cc\ua6cd\ua6ce\ua6cf\ua6d0\ua6d1\ua6d2\ua6d3\ua6d4\ua6d5\ua6d6\ua6d7\ua6d8\ua6d9\ua6da\ua6db\ua6dc\ua6dd\ua6de\ua6df\ua6e0\ua6e1\ua6e2\ua6e3\ua6e4\ua6e5\ua6e6\ua6e7\ua6e8\ua6e9\ua6ea\ua6eb\ua6ec\ua6ed\ua6ee\ua6ef\ua6f0\ua6f1\ua6f2\ua6f3\ua6f4\ua6f5\ua6f6\ua6f7\ua6f8\ua6f9\ua6fa\ua6fb\ua6fc\ua6fd\ua6fe\ua6ff\ua717\ua718\ua719\ua71a\ua71b\ua71c\ua71d\ua71e\ua71f\ua720\ua721\ua722\ua723\ua724\ua725\ua726\ua727\ua728\ua729\ua72a\ua72b\ua72c\ua72d\ua72e\ua72f\ua730\ua731\ua732\ua733\ua734\ua735\ua736\ua737\ua738\ua739\ua73a\ua73b\ua73c\ua73d\ua73e\ua73f\ua740\ua741\ua742\ua743\ua744\ua745\ua746\ua747\ua748\ua749\ua74a\ua74b\ua74c\ua74d\ua74e\ua74f\ua750\ua751\ua752\ua753\ua754\ua755\ua756\ua757\ua758\ua759\ua75a\ua75b\ua75c\ua75d\ua75e\ua75f\ua760\ua761\ua762\ua763\ua764\ua765\ua766\ua767\ua768\ua769\ua76a\ua76b\ua76c\ua76d\ua76e\ua76f\ua770\ua771\ua772\ua773\ua774\ua775\ua776\ua777\ua778\ua779\ua77a\ua77b\ua77c\ua77d\ua77e\ua77f\ua780\ua781\ua782\ua783\ua784\ua785\ua786\ua787\ua788\ua789\ua78a\ua78b\ua78c\ua78d\ua78e\ua78f\ua790\ua791\ua792\ua793\ua794\ua795\ua796\ua797\ua798\ua799\ua79a\ua79b\ua79c\ua79d\ua79e\ua79f\ua7a0\ua7a1\ua7a2\ua7a3\ua7a4\ua7a5\ua7a6\ua7a7\ua7a8\ua7a9\ua7aa\ua7ab\ua7ac\ua7ad\ua7ae\ua7af\ua7b0\ua7b1\ua7b2\ua7b3\ua7b4\ua7b5\ua7b6\ua7b7\ua7b8\ua7b9\ua7ba\ua7bb\ua7bc\ua7bd\ua7be\ua7bf\ua7c0\ua7c1\ua7c2\ua7c3\ua7c4\ua7c5\ua7c6\ua7c7\ua7c8\ua7c9\ua7ca\ua7cb\ua7cc\ua7cd\ua7ce\ua7cf\ua7d0\ua7d1\ua7d2\ua7d3\ua7d4\ua7d5\ua7d6\ua7d7\ua7d8\ua7d9\ua7da\ua7db\ua7dc\ua7dd\ua7de\ua7df\ua7e0\ua7e1\ua7e2\ua7e3\ua7e4\ua7e5\ua7e6\ua7e7\ua7e8\ua7e9\ua7ea\ua7eb\ua7ec\ua7ed\ua7ee\ua7ef\ua7f0\ua7f1\ua7f2\ua7f3\ua7f4\ua7f5\ua7f6\ua7f7\ua7f8\ua7f9\ua7fa\ua7fb\ua7fc\ua7fd\ua7fe\ua7ff\ua82c\ua82d\ua82e\ua82f\ua830\ua831\ua832\ua833\ua834\ua835\ua836\ua837\ua838\ua839\ua83a\ua83b\ua83c\ua83d\ua83e\ua83f\ua840\ua841\ua842\ua843\ua844\ua845\ua846\ua847\ua848\ua849\ua84a\ua84b\ua84c\ua84d\ua84e\ua84f\ua850\ua851\ua852\ua853\ua854\ua855\ua856\ua857\ua858\ua859\ua85a\ua85b\ua85c\ua85d\ua85e\ua85f\ua860\ua861\ua862\ua863\ua864\ua865\ua866\ua867\ua868\ua869\ua86a\ua86b\ua86c\ua86d\ua86e\ua86f\ua870\ua871\ua872\ua873\ua874\ua875\ua876\ua877\ua878\ua879\ua87a\ua87b\ua87c\ua87d\ua87e\ua87f\ua880\ua881\ua882\ua883\ua884\ua885\ua886\ua887\ua888\ua889\ua88a\ua88b\ua88c\ua88d\ua88e\ua88f\ua890\ua891\ua892\ua893\ua894\ua895\ua896\ua897\ua898\ua899\ua89a\ua89b\ua89c\ua89d\ua89e\ua89f\ua8a0\ua8a1\ua8a2\ua8a3\ua8a4\ua8a5\ua8a6\ua8a7\ua8a8\ua8a9\ua8aa\ua8ab\ua8ac\ua8ad\ua8ae\ua8af\ua8b0\ua8b1\ua8b2\ua8b3\ua8b4\ua8b5\ua8b6\ua8b7\ua8b8\ua8b9\ua8ba\ua8bb\ua8bc\ua8bd\ua8be\ua8bf\ua8c0\ua8c1\ua8c2\ua8c3\ua8c4\ua8c5\ua8c6\ua8c7\ua8c8\ua8c9\ua8ca\ua8cb\ua8cc\ua8cd\ua8ce\ua8cf\ua8d0\ua8d1\ua8d2\ua8d3\ua8d4\ua8d5\ua8d6\ua8d7\ua8d8\ua8d9\ua8da\ua8db\ua8dc\ua8dd\ua8de\ua8df\ua8e0\ua8e1\ua8e2\ua8e3\ua8e4\ua8e5\ua8e6\ua8e7\ua8e8\ua8e9\ua8ea\ua8eb\ua8ec\ua8ed\ua8ee\ua8ef\ua8f0\ua8f1\ua8f2\ua8f3\ua8f4\ua8f5\ua8f6\ua8f7\ua8f8\ua8f9\ua8fa\ua8fb\ua8fc\ua8fd\ua8fe\ua8ff\ua900\ua901\ua902\ua903\ua904\ua905\ua906\ua907\ua908\ua909\ua90a\ua90b\ua90c\ua90d\ua90e\ua90f\ua910\ua911\ua912\ua913\ua914\ua915\ua916\ua917\ua918\ua919\ua91a\ua91b\ua91c\ua91d\ua91e\ua91f\ua920\ua921\ua922\ua923\ua924\ua925\ua926\ua927\ua928\ua929\ua92a\ua92b\ua92c\ua92d\ua92e\ua92f\ua930\ua931\ua932\ua933\ua934\ua935\ua936\ua937\ua938\ua939\ua93a\ua93b\ua93c\ua93d\ua93e\ua93f\ua940\ua941\ua942\ua943\ua944\ua945\ua946\ua947\ua948\ua949\ua94a\ua94b\ua94c\ua94d\ua94e\ua94f\ua950\ua951\ua952\ua953\ua954\ua955\ua956\ua957\ua958\ua959\ua95a\ua95b\ua95c\ua95d\ua95e\ua95f\ua960\ua961\ua962\ua963\ua964\ua965\ua966\ua967\ua968\ua969\ua96a\ua96b\ua96c\ua96d\ua96e\ua96f\ua970\ua971\ua972\ua973\ua974\ua975\ua976\ua977\ua978\ua979\ua97a\ua97b\ua97c\ua97d\ua97e\ua97f\ua980\ua981\ua982\ua983\ua984\ua985\ua986\ua987\ua988\ua989\ua98a\ua98b\ua98c\ua98d\ua98e\ua98f\ua990\ua991\ua992\ua993\ua994\ua995\ua996\ua997\ua998\ua999\ua99a\ua99b\ua99c\ua99d\ua99e\ua99f\ua9a0\ua9a1\ua9a2\ua9a3\ua9a4\ua9a5\ua9a6\ua9a7\ua9a8\ua9a9\ua9aa\ua9ab\ua9ac\ua9ad\ua9ae\ua9af\ua9b0\ua9b1\ua9b2\ua9b3\ua9b4\ua9b5\ua9b6\ua9b7\ua9b8\ua9b9\ua9ba\ua9bb\ua9bc\ua9bd\ua9be\ua9bf\ua9c0\ua9c1\ua9c2\ua9c3\ua9c4\ua9c5\ua9c6\ua9c7\ua9c8\ua9c9\ua9ca\ua9cb\ua9cc\ua9cd\ua9ce\ua9cf\ua9d0\ua9d1\ua9d2\ua9d3\ua9d4\ua9d5\ua9d6\ua9d7\ua9d8\ua9d9\ua9da\ua9db\ua9dc\ua9dd\ua9de\ua9df\ua9e0\ua9e1\ua9e2\ua9e3\ua9e4\ua9e5\ua9e6\ua9e7\ua9e8\ua9e9\ua9ea\ua9eb\ua9ec\ua9ed\ua9ee\ua9ef\ua9f0\ua9f1\ua9f2\ua9f3\ua9f4\ua9f5\ua9f6\ua9f7\ua9f8\ua9f9\ua9fa\ua9fb\ua9fc\ua9fd\ua9fe\ua9ff\uaa00\uaa01\uaa02\uaa03\uaa04\uaa05\uaa06\uaa07\uaa08\uaa09\uaa0a\uaa0b\uaa0c\uaa0d\uaa0e\uaa0f\uaa10\uaa11\uaa12\uaa13\uaa14\uaa15\uaa16\uaa17\uaa18\uaa19\uaa1a\uaa1b\uaa1c\uaa1d\uaa1e\uaa1f\uaa20\uaa21\uaa22\uaa23\uaa24\uaa25\uaa26\uaa27\uaa28\uaa29\uaa2a\uaa2b\uaa2c\uaa2d\uaa2e\uaa2f\uaa30\uaa31\uaa32\uaa33\uaa34\uaa35\uaa36\uaa37\uaa38\uaa39\uaa3a\uaa3b\uaa3c\uaa3d\uaa3e\uaa3f\uaa40\uaa41\uaa42\uaa43\uaa44\uaa45\uaa46\uaa47\uaa48\uaa49\uaa4a\uaa4b\uaa4c\uaa4d\uaa4e\uaa4f\uaa50\uaa51\uaa52\uaa53\uaa54\uaa55\uaa56\uaa57\uaa58\uaa59\uaa5a\uaa5b\uaa5c\uaa5d\uaa5e\uaa5f\uaa60\uaa61\uaa62\uaa63\uaa64\uaa65\uaa66\uaa67\uaa68\uaa69\uaa6a\uaa6b\uaa6c\uaa6d\uaa6e\uaa6f\uaa70\uaa71\uaa72\uaa73\uaa74\uaa75\uaa76\uaa77\uaa78\uaa79\uaa7a\uaa7b\uaa7c\uaa7d\uaa7e\uaa7f\uaa80\uaa81\uaa82\uaa83\uaa84\uaa85\uaa86\uaa87\uaa88\uaa89\uaa8a\uaa8b\uaa8c\uaa8d\uaa8e\uaa8f\uaa90\uaa91\uaa92\uaa93\uaa94\uaa95\uaa96\uaa97\uaa98\uaa99\uaa9a\uaa9b\uaa9c\uaa9d\uaa9e\uaa9f\uaaa0\uaaa1\uaaa2\uaaa3\uaaa4\uaaa5\uaaa6\uaaa7\uaaa8\uaaa9\uaaaa\uaaab\uaaac\uaaad\uaaae\uaaaf\uaab0\uaab1\uaab2\uaab3\uaab4\uaab5\uaab6\uaab7\uaab8\uaab9\uaaba\uaabb\uaabc\uaabd\uaabe\uaabf\uaac0\uaac1\uaac2\uaac3\uaac4\uaac5\uaac6\uaac7\uaac8\uaac9\uaaca\uaacb\uaacc\uaacd\uaace\uaacf\uaad0\uaad1\uaad2\uaad3\uaad4\uaad5\uaad6\uaad7\uaad8\uaad9\uaada\uaadb\uaadc\uaadd\uaade\uaadf\uaae0\uaae1\uaae2\uaae3\uaae4\uaae5\uaae6\uaae7\uaae8\uaae9\uaaea\uaaeb\uaaec\uaaed\uaaee\uaaef\uaaf0\uaaf1\uaaf2\uaaf3\uaaf4\uaaf5\uaaf6\uaaf7\uaaf8\uaaf9\uaafa\uaafb\uaafc\uaafd\uaafe\uaaff\uab00\uab01\uab02\uab03\uab04\uab05\uab06\uab07\uab08\uab09\uab0a\uab0b\uab0c\uab0d\uab0e\uab0f\uab10\uab11\uab12\uab13\uab14\uab15\uab16\uab17\uab18\uab19\uab1a\uab1b\uab1c\uab1d\uab1e\uab1f\uab20\uab21\uab22\uab23\uab24\uab25\uab26\uab27\uab28\uab29\uab2a\uab2b\uab2c\uab2d\uab2e\uab2f\uab30\uab31\uab32\uab33\uab34\uab35\uab36\uab37\uab38\uab39\uab3a\uab3b\uab3c\uab3d\uab3e\uab3f\uab40\uab41\uab42\uab43\uab44\uab45\uab46\uab47\uab48\uab49\uab4a\uab4b\uab4c\uab4d\uab4e\uab4f\uab50\uab51\uab52\uab53\uab54\uab55\uab56\uab57\uab58\uab59\uab5a\uab5b\uab5c\uab5d\uab5e\uab5f\uab60\uab61\uab62\uab63\uab64\uab65\uab66\uab67\uab68\uab69\uab6a\uab6b\uab6c\uab6d\uab6e\uab6f\uab70\uab71\uab72\uab73\uab74\uab75\uab76\uab77\uab78\uab79\uab7a\uab7b\uab7c\uab7d\uab7e\uab7f\uab80\uab81\uab82\uab83\uab84\uab85\uab86\uab87\uab88\uab89\uab8a\uab8b\uab8c\uab8d\uab8e\uab8f\uab90\uab91\uab92\uab93\uab94\uab95\uab96\uab97\uab98\uab99\uab9a\uab9b\uab9c\uab9d\uab9e\uab9f\uaba0\uaba1\uaba2\uaba3\uaba4\uaba5\uaba6\uaba7\uaba8\uaba9\uabaa\uabab\uabac\uabad\uabae\uabaf\uabb0\uabb1\uabb2\uabb3\uabb4\uabb5\uabb6\uabb7\uabb8\uabb9\uabba\uabbb\uabbc\uabbd\uabbe\uabbf\uabc0\uabc1\uabc2\uabc3\uabc4\uabc5\uabc6\uabc7\uabc8\uabc9\uabca\uabcb\uabcc\uabcd\uabce\uabcf\uabd0\uabd1\uabd2\uabd3\uabd4\uabd5\uabd6\uabd7\uabd8\uabd9\uabda\uabdb\uabdc\uabdd\uabde\uabdf\uabe0\uabe1\uabe2\uabe3\uabe4\uabe5\uabe6\uabe7\uabe8\uabe9\uabea\uabeb\uabec\uabed\uabee\uabef\uabf0\uabf1\uabf2\uabf3\uabf4\uabf5\uabf6\uabf7\uabf8\uabf9\uabfa\uabfb\uabfc\uabfd\uabfe\uabff\ud7a4\ud7a5\ud7a6\ud7a7\ud7a8\ud7a9\ud7aa\ud7ab\ud7ac\ud7ad\ud7ae\ud7af\ud7b0\ud7b1\ud7b2\ud7b3\ud7b4\ud7b5\ud7b6\ud7b7\ud7b8\ud7b9\ud7ba\ud7bb\ud7bc\ud7bd\ud7be\ud7bf\ud7c0\ud7c1\ud7c2\ud7c3\ud7c4\ud7c5\ud7c6\ud7c7\ud7c8\ud7c9\ud7ca\ud7cb\ud7cc\ud7cd\ud7ce\ud7cf\ud7d0\ud7d1\ud7d2\ud7d3\ud7d4\ud7d5\ud7d6\ud7d7\ud7d8\ud7d9\ud7da\ud7db\ud7dc\ud7dd\ud7de\ud7df\ud7e0\ud7e1\ud7e2\ud7e3\ud7e4\ud7e5\ud7e6\ud7e7\ud7e8\ud7e9\ud7ea\ud7eb\ud7ec\ud7ed\ud7ee\ud7ef\ud7f0\ud7f1\ud7f2\ud7f3\ud7f4\ud7f5\ud7f6\ud7f7\ud7f8\ud7f9\ud7fa\ud7fb\ud7fc\ud7fd\ud7fe\ud7ff\ufa2e\ufa2f\ufa6b\ufa6c\ufa6d\ufa6e\ufa6f\ufada\ufadb\ufadc\ufadd\ufade\ufadf\ufae0\ufae1\ufae2\ufae3\ufae4\ufae5\ufae6\ufae7\ufae8\ufae9\ufaea\ufaeb\ufaec\ufaed\ufaee\ufaef\ufaf0\ufaf1\ufaf2\ufaf3\ufaf4\ufaf5\ufaf6\ufaf7\ufaf8\ufaf9\ufafa\ufafb\ufafc\ufafd\ufafe\ufaff\ufb07\ufb08\ufb09\ufb0a\ufb0b\ufb0c\ufb0d\ufb0e\ufb0f\ufb10\ufb11\ufb12\ufb18\ufb19\ufb1a\ufb1b\ufb1c\ufb37\ufb3d\ufb3f\ufb42\ufb45\ufbb2\ufbb3\ufbb4\ufbb5\ufbb6\ufbb7\ufbb8\ufbb9\ufbba\ufbbb\ufbbc\ufbbd\ufbbe\ufbbf\ufbc0\ufbc1\ufbc2\ufbc3\ufbc4\ufbc5\ufbc6\ufbc7\ufbc8\ufbc9\ufbca\ufbcb\ufbcc\ufbcd\ufbce\ufbcf\ufbd0\ufbd1\ufbd2\ufd40\ufd41\ufd42\ufd43\ufd44\ufd45\ufd46\ufd47\ufd48\ufd49\ufd4a\ufd4b\ufd4c\ufd4d\ufd4e\ufd4f\ufd90\ufd91\ufdc8\ufdc9\ufdca\ufdcb\ufdcc\ufdcd\ufdce\ufdcf\ufdd0\ufdd1\ufdd2\ufdd3\ufdd4\ufdd5\ufdd6\ufdd7\ufdd8\ufdd9\ufdda\ufddb\ufddc\ufddd\ufdde\ufddf\ufde0\ufde1\ufde2\ufde3\ufde4\ufde5\ufde6\ufde7\ufde8\ufde9\ufdea\ufdeb\ufdec\ufded\ufdee\ufdef\ufdfe\ufdff\ufe1a\ufe1b\ufe1c\ufe1d\ufe1e\ufe1f\ufe24\ufe25\ufe26\ufe27\ufe28\ufe29\ufe2a\ufe2b\ufe2c\ufe2d\ufe2e\ufe2f\ufe53\ufe67\ufe6c\ufe6d\ufe6e\ufe6f\ufe75\ufefd\ufefe\uff00\uffbf\uffc0\uffc1\uffc8\uffc9\uffd0\uffd1\uffd8\uffd9\uffdd\uffde\uffdf\uffe7\uffef\ufff0\ufff1\ufff2\ufff3\ufff4\ufff5\ufff6\ufff7\ufff8\ufffe' -Co = u'\ue000\ue001\ue002\ue003\ue004\ue005\ue006\ue007\ue008\ue009\ue00a\ue00b\ue00c\ue00d\ue00e\ue00f\ue010\ue011\ue012\ue013\ue014\ue015\ue016\ue017\ue018\ue019\ue01a\ue01b\ue01c\ue01d\ue01e\ue01f\ue020\ue021\ue022\ue023\ue024\ue025\ue026\ue027\ue028\ue029\ue02a\ue02b\ue02c\ue02d\ue02e\ue02f\ue030\ue031\ue032\ue033\ue034\ue035\ue036\ue037\ue038\ue039\ue03a\ue03b\ue03c\ue03d\ue03e\ue03f\ue040\ue041\ue042\ue043\ue044\ue045\ue046\ue047\ue048\ue049\ue04a\ue04b\ue04c\ue04d\ue04e\ue04f\ue050\ue051\ue052\ue053\ue054\ue055\ue056\ue057\ue058\ue059\ue05a\ue05b\ue05c\ue05d\ue05e\ue05f\ue060\ue061\ue062\ue063\ue064\ue065\ue066\ue067\ue068\ue069\ue06a\ue06b\ue06c\ue06d\ue06e\ue06f\ue070\ue071\ue072\ue073\ue074\ue075\ue076\ue077\ue078\ue079\ue07a\ue07b\ue07c\ue07d\ue07e\ue07f\ue080\ue081\ue082\ue083\ue084\ue085\ue086\ue087\ue088\ue089\ue08a\ue08b\ue08c\ue08d\ue08e\ue08f\ue090\ue091\ue092\ue093\ue094\ue095\ue096\ue097\ue098\ue099\ue09a\ue09b\ue09c\ue09d\ue09e\ue09f\ue0a0\ue0a1\ue0a2\ue0a3\ue0a4\ue0a5\ue0a6\ue0a7\ue0a8\ue0a9\ue0aa\ue0ab\ue0ac\ue0ad\ue0ae\ue0af\ue0b0\ue0b1\ue0b2\ue0b3\ue0b4\ue0b5\ue0b6\ue0b7\ue0b8\ue0b9\ue0ba\ue0bb\ue0bc\ue0bd\ue0be\ue0bf\ue0c0\ue0c1\ue0c2\ue0c3\ue0c4\ue0c5\ue0c6\ue0c7\ue0c8\ue0c9\ue0ca\ue0cb\ue0cc\ue0cd\ue0ce\ue0cf\ue0d0\ue0d1\ue0d2\ue0d3\ue0d4\ue0d5\ue0d6\ue0d7\ue0d8\ue0d9\ue0da\ue0db\ue0dc\ue0dd\ue0de\ue0df\ue0e0\ue0e1\ue0e2\ue0e3\ue0e4\ue0e5\ue0e6\ue0e7\ue0e8\ue0e9\ue0ea\ue0eb\ue0ec\ue0ed\ue0ee\ue0ef\ue0f0\ue0f1\ue0f2\ue0f3\ue0f4\ue0f5\ue0f6\ue0f7\ue0f8\ue0f9\ue0fa\ue0fb\ue0fc\ue0fd\ue0fe\ue0ff\ue100\ue101\ue102\ue103\ue104\ue105\ue106\ue107\ue108\ue109\ue10a\ue10b\ue10c\ue10d\ue10e\ue10f\ue110\ue111\ue112\ue113\ue114\ue115\ue116\ue117\ue118\ue119\ue11a\ue11b\ue11c\ue11d\ue11e\ue11f\ue120\ue121\ue122\ue123\ue124\ue125\ue126\ue127\ue128\ue129\ue12a\ue12b\ue12c\ue12d\ue12e\ue12f\ue130\ue131\ue132\ue133\ue134\ue135\ue136\ue137\ue138\ue139\ue13a\ue13b\ue13c\ue13d\ue13e\ue13f\ue140\ue141\ue142\ue143\ue144\ue145\ue146\ue147\ue148\ue149\ue14a\ue14b\ue14c\ue14d\ue14e\ue14f\ue150\ue151\ue152\ue153\ue154\ue155\ue156\ue157\ue158\ue159\ue15a\ue15b\ue15c\ue15d\ue15e\ue15f\ue160\ue161\ue162\ue163\ue164\ue165\ue166\ue167\ue168\ue169\ue16a\ue16b\ue16c\ue16d\ue16e\ue16f\ue170\ue171\ue172\ue173\ue174\ue175\ue176\ue177\ue178\ue179\ue17a\ue17b\ue17c\ue17d\ue17e\ue17f\ue180\ue181\ue182\ue183\ue184\ue185\ue186\ue187\ue188\ue189\ue18a\ue18b\ue18c\ue18d\ue18e\ue18f\ue190\ue191\ue192\ue193\ue194\ue195\ue196\ue197\ue198\ue199\ue19a\ue19b\ue19c\ue19d\ue19e\ue19f\ue1a0\ue1a1\ue1a2\ue1a3\ue1a4\ue1a5\ue1a6\ue1a7\ue1a8\ue1a9\ue1aa\ue1ab\ue1ac\ue1ad\ue1ae\ue1af\ue1b0\ue1b1\ue1b2\ue1b3\ue1b4\ue1b5\ue1b6\ue1b7\ue1b8\ue1b9\ue1ba\ue1bb\ue1bc\ue1bd\ue1be\ue1bf\ue1c0\ue1c1\ue1c2\ue1c3\ue1c4\ue1c5\ue1c6\ue1c7\ue1c8\ue1c9\ue1ca\ue1cb\ue1cc\ue1cd\ue1ce\ue1cf\ue1d0\ue1d1\ue1d2\ue1d3\ue1d4\ue1d5\ue1d6\ue1d7\ue1d8\ue1d9\ue1da\ue1db\ue1dc\ue1dd\ue1de\ue1df\ue1e0\ue1e1\ue1e2\ue1e3\ue1e4\ue1e5\ue1e6\ue1e7\ue1e8\ue1e9\ue1ea\ue1eb\ue1ec\ue1ed\ue1ee\ue1ef\ue1f0\ue1f1\ue1f2\ue1f3\ue1f4\ue1f5\ue1f6\ue1f7\ue1f8\ue1f9\ue1fa\ue1fb\ue1fc\ue1fd\ue1fe\ue1ff\ue200\ue201\ue202\ue203\ue204\ue205\ue206\ue207\ue208\ue209\ue20a\ue20b\ue20c\ue20d\ue20e\ue20f\ue210\ue211\ue212\ue213\ue214\ue215\ue216\ue217\ue218\ue219\ue21a\ue21b\ue21c\ue21d\ue21e\ue21f\ue220\ue221\ue222\ue223\ue224\ue225\ue226\ue227\ue228\ue229\ue22a\ue22b\ue22c\ue22d\ue22e\ue22f\ue230\ue231\ue232\ue233\ue234\ue235\ue236\ue237\ue238\ue239\ue23a\ue23b\ue23c\ue23d\ue23e\ue23f\ue240\ue241\ue242\ue243\ue244\ue245\ue246\ue247\ue248\ue249\ue24a\ue24b\ue24c\ue24d\ue24e\ue24f\ue250\ue251\ue252\ue253\ue254\ue255\ue256\ue257\ue258\ue259\ue25a\ue25b\ue25c\ue25d\ue25e\ue25f\ue260\ue261\ue262\ue263\ue264\ue265\ue266\ue267\ue268\ue269\ue26a\ue26b\ue26c\ue26d\ue26e\ue26f\ue270\ue271\ue272\ue273\ue274\ue275\ue276\ue277\ue278\ue279\ue27a\ue27b\ue27c\ue27d\ue27e\ue27f\ue280\ue281\ue282\ue283\ue284\ue285\ue286\ue287\ue288\ue289\ue28a\ue28b\ue28c\ue28d\ue28e\ue28f\ue290\ue291\ue292\ue293\ue294\ue295\ue296\ue297\ue298\ue299\ue29a\ue29b\ue29c\ue29d\ue29e\ue29f\ue2a0\ue2a1\ue2a2\ue2a3\ue2a4\ue2a5\ue2a6\ue2a7\ue2a8\ue2a9\ue2aa\ue2ab\ue2ac\ue2ad\ue2ae\ue2af\ue2b0\ue2b1\ue2b2\ue2b3\ue2b4\ue2b5\ue2b6\ue2b7\ue2b8\ue2b9\ue2ba\ue2bb\ue2bc\ue2bd\ue2be\ue2bf\ue2c0\ue2c1\ue2c2\ue2c3\ue2c4\ue2c5\ue2c6\ue2c7\ue2c8\ue2c9\ue2ca\ue2cb\ue2cc\ue2cd\ue2ce\ue2cf\ue2d0\ue2d1\ue2d2\ue2d3\ue2d4\ue2d5\ue2d6\ue2d7\ue2d8\ue2d9\ue2da\ue2db\ue2dc\ue2dd\ue2de\ue2df\ue2e0\ue2e1\ue2e2\ue2e3\ue2e4\ue2e5\ue2e6\ue2e7\ue2e8\ue2e9\ue2ea\ue2eb\ue2ec\ue2ed\ue2ee\ue2ef\ue2f0\ue2f1\ue2f2\ue2f3\ue2f4\ue2f5\ue2f6\ue2f7\ue2f8\ue2f9\ue2fa\ue2fb\ue2fc\ue2fd\ue2fe\ue2ff\ue300\ue301\ue302\ue303\ue304\ue305\ue306\ue307\ue308\ue309\ue30a\ue30b\ue30c\ue30d\ue30e\ue30f\ue310\ue311\ue312\ue313\ue314\ue315\ue316\ue317\ue318\ue319\ue31a\ue31b\ue31c\ue31d\ue31e\ue31f\ue320\ue321\ue322\ue323\ue324\ue325\ue326\ue327\ue328\ue329\ue32a\ue32b\ue32c\ue32d\ue32e\ue32f\ue330\ue331\ue332\ue333\ue334\ue335\ue336\ue337\ue338\ue339\ue33a\ue33b\ue33c\ue33d\ue33e\ue33f\ue340\ue341\ue342\ue343\ue344\ue345\ue346\ue347\ue348\ue349\ue34a\ue34b\ue34c\ue34d\ue34e\ue34f\ue350\ue351\ue352\ue353\ue354\ue355\ue356\ue357\ue358\ue359\ue35a\ue35b\ue35c\ue35d\ue35e\ue35f\ue360\ue361\ue362\ue363\ue364\ue365\ue366\ue367\ue368\ue369\ue36a\ue36b\ue36c\ue36d\ue36e\ue36f\ue370\ue371\ue372\ue373\ue374\ue375\ue376\ue377\ue378\ue379\ue37a\ue37b\ue37c\ue37d\ue37e\ue37f\ue380\ue381\ue382\ue383\ue384\ue385\ue386\ue387\ue388\ue389\ue38a\ue38b\ue38c\ue38d\ue38e\ue38f\ue390\ue391\ue392\ue393\ue394\ue395\ue396\ue397\ue398\ue399\ue39a\ue39b\ue39c\ue39d\ue39e\ue39f\ue3a0\ue3a1\ue3a2\ue3a3\ue3a4\ue3a5\ue3a6\ue3a7\ue3a8\ue3a9\ue3aa\ue3ab\ue3ac\ue3ad\ue3ae\ue3af\ue3b0\ue3b1\ue3b2\ue3b3\ue3b4\ue3b5\ue3b6\ue3b7\ue3b8\ue3b9\ue3ba\ue3bb\ue3bc\ue3bd\ue3be\ue3bf\ue3c0\ue3c1\ue3c2\ue3c3\ue3c4\ue3c5\ue3c6\ue3c7\ue3c8\ue3c9\ue3ca\ue3cb\ue3cc\ue3cd\ue3ce\ue3cf\ue3d0\ue3d1\ue3d2\ue3d3\ue3d4\ue3d5\ue3d6\ue3d7\ue3d8\ue3d9\ue3da\ue3db\ue3dc\ue3dd\ue3de\ue3df\ue3e0\ue3e1\ue3e2\ue3e3\ue3e4\ue3e5\ue3e6\ue3e7\ue3e8\ue3e9\ue3ea\ue3eb\ue3ec\ue3ed\ue3ee\ue3ef\ue3f0\ue3f1\ue3f2\ue3f3\ue3f4\ue3f5\ue3f6\ue3f7\ue3f8\ue3f9\ue3fa\ue3fb\ue3fc\ue3fd\ue3fe\ue3ff\ue400\ue401\ue402\ue403\ue404\ue405\ue406\ue407\ue408\ue409\ue40a\ue40b\ue40c\ue40d\ue40e\ue40f\ue410\ue411\ue412\ue413\ue414\ue415\ue416\ue417\ue418\ue419\ue41a\ue41b\ue41c\ue41d\ue41e\ue41f\ue420\ue421\ue422\ue423\ue424\ue425\ue426\ue427\ue428\ue429\ue42a\ue42b\ue42c\ue42d\ue42e\ue42f\ue430\ue431\ue432\ue433\ue434\ue435\ue436\ue437\ue438\ue439\ue43a\ue43b\ue43c\ue43d\ue43e\ue43f\ue440\ue441\ue442\ue443\ue444\ue445\ue446\ue447\ue448\ue449\ue44a\ue44b\ue44c\ue44d\ue44e\ue44f\ue450\ue451\ue452\ue453\ue454\ue455\ue456\ue457\ue458\ue459\ue45a\ue45b\ue45c\ue45d\ue45e\ue45f\ue460\ue461\ue462\ue463\ue464\ue465\ue466\ue467\ue468\ue469\ue46a\ue46b\ue46c\ue46d\ue46e\ue46f\ue470\ue471\ue472\ue473\ue474\ue475\ue476\ue477\ue478\ue479\ue47a\ue47b\ue47c\ue47d\ue47e\ue47f\ue480\ue481\ue482\ue483\ue484\ue485\ue486\ue487\ue488\ue489\ue48a\ue48b\ue48c\ue48d\ue48e\ue48f\ue490\ue491\ue492\ue493\ue494\ue495\ue496\ue497\ue498\ue499\ue49a\ue49b\ue49c\ue49d\ue49e\ue49f\ue4a0\ue4a1\ue4a2\ue4a3\ue4a4\ue4a5\ue4a6\ue4a7\ue4a8\ue4a9\ue4aa\ue4ab\ue4ac\ue4ad\ue4ae\ue4af\ue4b0\ue4b1\ue4b2\ue4b3\ue4b4\ue4b5\ue4b6\ue4b7\ue4b8\ue4b9\ue4ba\ue4bb\ue4bc\ue4bd\ue4be\ue4bf\ue4c0\ue4c1\ue4c2\ue4c3\ue4c4\ue4c5\ue4c6\ue4c7\ue4c8\ue4c9\ue4ca\ue4cb\ue4cc\ue4cd\ue4ce\ue4cf\ue4d0\ue4d1\ue4d2\ue4d3\ue4d4\ue4d5\ue4d6\ue4d7\ue4d8\ue4d9\ue4da\ue4db\ue4dc\ue4dd\ue4de\ue4df\ue4e0\ue4e1\ue4e2\ue4e3\ue4e4\ue4e5\ue4e6\ue4e7\ue4e8\ue4e9\ue4ea\ue4eb\ue4ec\ue4ed\ue4ee\ue4ef\ue4f0\ue4f1\ue4f2\ue4f3\ue4f4\ue4f5\ue4f6\ue4f7\ue4f8\ue4f9\ue4fa\ue4fb\ue4fc\ue4fd\ue4fe\ue4ff\ue500\ue501\ue502\ue503\ue504\ue505\ue506\ue507\ue508\ue509\ue50a\ue50b\ue50c\ue50d\ue50e\ue50f\ue510\ue511\ue512\ue513\ue514\ue515\ue516\ue517\ue518\ue519\ue51a\ue51b\ue51c\ue51d\ue51e\ue51f\ue520\ue521\ue522\ue523\ue524\ue525\ue526\ue527\ue528\ue529\ue52a\ue52b\ue52c\ue52d\ue52e\ue52f\ue530\ue531\ue532\ue533\ue534\ue535\ue536\ue537\ue538\ue539\ue53a\ue53b\ue53c\ue53d\ue53e\ue53f\ue540\ue541\ue542\ue543\ue544\ue545\ue546\ue547\ue548\ue549\ue54a\ue54b\ue54c\ue54d\ue54e\ue54f\ue550\ue551\ue552\ue553\ue554\ue555\ue556\ue557\ue558\ue559\ue55a\ue55b\ue55c\ue55d\ue55e\ue55f\ue560\ue561\ue562\ue563\ue564\ue565\ue566\ue567\ue568\ue569\ue56a\ue56b\ue56c\ue56d\ue56e\ue56f\ue570\ue571\ue572\ue573\ue574\ue575\ue576\ue577\ue578\ue579\ue57a\ue57b\ue57c\ue57d\ue57e\ue57f\ue580\ue581\ue582\ue583\ue584\ue585\ue586\ue587\ue588\ue589\ue58a\ue58b\ue58c\ue58d\ue58e\ue58f\ue590\ue591\ue592\ue593\ue594\ue595\ue596\ue597\ue598\ue599\ue59a\ue59b\ue59c\ue59d\ue59e\ue59f\ue5a0\ue5a1\ue5a2\ue5a3\ue5a4\ue5a5\ue5a6\ue5a7\ue5a8\ue5a9\ue5aa\ue5ab\ue5ac\ue5ad\ue5ae\ue5af\ue5b0\ue5b1\ue5b2\ue5b3\ue5b4\ue5b5\ue5b6\ue5b7\ue5b8\ue5b9\ue5ba\ue5bb\ue5bc\ue5bd\ue5be\ue5bf\ue5c0\ue5c1\ue5c2\ue5c3\ue5c4\ue5c5\ue5c6\ue5c7\ue5c8\ue5c9\ue5ca\ue5cb\ue5cc\ue5cd\ue5ce\ue5cf\ue5d0\ue5d1\ue5d2\ue5d3\ue5d4\ue5d5\ue5d6\ue5d7\ue5d8\ue5d9\ue5da\ue5db\ue5dc\ue5dd\ue5de\ue5df\ue5e0\ue5e1\ue5e2\ue5e3\ue5e4\ue5e5\ue5e6\ue5e7\ue5e8\ue5e9\ue5ea\ue5eb\ue5ec\ue5ed\ue5ee\ue5ef\ue5f0\ue5f1\ue5f2\ue5f3\ue5f4\ue5f5\ue5f6\ue5f7\ue5f8\ue5f9\ue5fa\ue5fb\ue5fc\ue5fd\ue5fe\ue5ff\ue600\ue601\ue602\ue603\ue604\ue605\ue606\ue607\ue608\ue609\ue60a\ue60b\ue60c\ue60d\ue60e\ue60f\ue610\ue611\ue612\ue613\ue614\ue615\ue616\ue617\ue618\ue619\ue61a\ue61b\ue61c\ue61d\ue61e\ue61f\ue620\ue621\ue622\ue623\ue624\ue625\ue626\ue627\ue628\ue629\ue62a\ue62b\ue62c\ue62d\ue62e\ue62f\ue630\ue631\ue632\ue633\ue634\ue635\ue636\ue637\ue638\ue639\ue63a\ue63b\ue63c\ue63d\ue63e\ue63f\ue640\ue641\ue642\ue643\ue644\ue645\ue646\ue647\ue648\ue649\ue64a\ue64b\ue64c\ue64d\ue64e\ue64f\ue650\ue651\ue652\ue653\ue654\ue655\ue656\ue657\ue658\ue659\ue65a\ue65b\ue65c\ue65d\ue65e\ue65f\ue660\ue661\ue662\ue663\ue664\ue665\ue666\ue667\ue668\ue669\ue66a\ue66b\ue66c\ue66d\ue66e\ue66f\ue670\ue671\ue672\ue673\ue674\ue675\ue676\ue677\ue678\ue679\ue67a\ue67b\ue67c\ue67d\ue67e\ue67f\ue680\ue681\ue682\ue683\ue684\ue685\ue686\ue687\ue688\ue689\ue68a\ue68b\ue68c\ue68d\ue68e\ue68f\ue690\ue691\ue692\ue693\ue694\ue695\ue696\ue697\ue698\ue699\ue69a\ue69b\ue69c\ue69d\ue69e\ue69f\ue6a0\ue6a1\ue6a2\ue6a3\ue6a4\ue6a5\ue6a6\ue6a7\ue6a8\ue6a9\ue6aa\ue6ab\ue6ac\ue6ad\ue6ae\ue6af\ue6b0\ue6b1\ue6b2\ue6b3\ue6b4\ue6b5\ue6b6\ue6b7\ue6b8\ue6b9\ue6ba\ue6bb\ue6bc\ue6bd\ue6be\ue6bf\ue6c0\ue6c1\ue6c2\ue6c3\ue6c4\ue6c5\ue6c6\ue6c7\ue6c8\ue6c9\ue6ca\ue6cb\ue6cc\ue6cd\ue6ce\ue6cf\ue6d0\ue6d1\ue6d2\ue6d3\ue6d4\ue6d5\ue6d6\ue6d7\ue6d8\ue6d9\ue6da\ue6db\ue6dc\ue6dd\ue6de\ue6df\ue6e0\ue6e1\ue6e2\ue6e3\ue6e4\ue6e5\ue6e6\ue6e7\ue6e8\ue6e9\ue6ea\ue6eb\ue6ec\ue6ed\ue6ee\ue6ef\ue6f0\ue6f1\ue6f2\ue6f3\ue6f4\ue6f5\ue6f6\ue6f7\ue6f8\ue6f9\ue6fa\ue6fb\ue6fc\ue6fd\ue6fe\ue6ff\ue700\ue701\ue702\ue703\ue704\ue705\ue706\ue707\ue708\ue709\ue70a\ue70b\ue70c\ue70d\ue70e\ue70f\ue710\ue711\ue712\ue713\ue714\ue715\ue716\ue717\ue718\ue719\ue71a\ue71b\ue71c\ue71d\ue71e\ue71f\ue720\ue721\ue722\ue723\ue724\ue725\ue726\ue727\ue728\ue729\ue72a\ue72b\ue72c\ue72d\ue72e\ue72f\ue730\ue731\ue732\ue733\ue734\ue735\ue736\ue737\ue738\ue739\ue73a\ue73b\ue73c\ue73d\ue73e\ue73f\ue740\ue741\ue742\ue743\ue744\ue745\ue746\ue747\ue748\ue749\ue74a\ue74b\ue74c\ue74d\ue74e\ue74f\ue750\ue751\ue752\ue753\ue754\ue755\ue756\ue757\ue758\ue759\ue75a\ue75b\ue75c\ue75d\ue75e\ue75f\ue760\ue761\ue762\ue763\ue764\ue765\ue766\ue767\ue768\ue769\ue76a\ue76b\ue76c\ue76d\ue76e\ue76f\ue770\ue771\ue772\ue773\ue774\ue775\ue776\ue777\ue778\ue779\ue77a\ue77b\ue77c\ue77d\ue77e\ue77f\ue780\ue781\ue782\ue783\ue784\ue785\ue786\ue787\ue788\ue789\ue78a\ue78b\ue78c\ue78d\ue78e\ue78f\ue790\ue791\ue792\ue793\ue794\ue795\ue796\ue797\ue798\ue799\ue79a\ue79b\ue79c\ue79d\ue79e\ue79f\ue7a0\ue7a1\ue7a2\ue7a3\ue7a4\ue7a5\ue7a6\ue7a7\ue7a8\ue7a9\ue7aa\ue7ab\ue7ac\ue7ad\ue7ae\ue7af\ue7b0\ue7b1\ue7b2\ue7b3\ue7b4\ue7b5\ue7b6\ue7b7\ue7b8\ue7b9\ue7ba\ue7bb\ue7bc\ue7bd\ue7be\ue7bf\ue7c0\ue7c1\ue7c2\ue7c3\ue7c4\ue7c5\ue7c6\ue7c7\ue7c8\ue7c9\ue7ca\ue7cb\ue7cc\ue7cd\ue7ce\ue7cf\ue7d0\ue7d1\ue7d2\ue7d3\ue7d4\ue7d5\ue7d6\ue7d7\ue7d8\ue7d9\ue7da\ue7db\ue7dc\ue7dd\ue7de\ue7df\ue7e0\ue7e1\ue7e2\ue7e3\ue7e4\ue7e5\ue7e6\ue7e7\ue7e8\ue7e9\ue7ea\ue7eb\ue7ec\ue7ed\ue7ee\ue7ef\ue7f0\ue7f1\ue7f2\ue7f3\ue7f4\ue7f5\ue7f6\ue7f7\ue7f8\ue7f9\ue7fa\ue7fb\ue7fc\ue7fd\ue7fe\ue7ff\ue800\ue801\ue802\ue803\ue804\ue805\ue806\ue807\ue808\ue809\ue80a\ue80b\ue80c\ue80d\ue80e\ue80f\ue810\ue811\ue812\ue813\ue814\ue815\ue816\ue817\ue818\ue819\ue81a\ue81b\ue81c\ue81d\ue81e\ue81f\ue820\ue821\ue822\ue823\ue824\ue825\ue826\ue827\ue828\ue829\ue82a\ue82b\ue82c\ue82d\ue82e\ue82f\ue830\ue831\ue832\ue833\ue834\ue835\ue836\ue837\ue838\ue839\ue83a\ue83b\ue83c\ue83d\ue83e\ue83f\ue840\ue841\ue842\ue843\ue844\ue845\ue846\ue847\ue848\ue849\ue84a\ue84b\ue84c\ue84d\ue84e\ue84f\ue850\ue851\ue852\ue853\ue854\ue855\ue856\ue857\ue858\ue859\ue85a\ue85b\ue85c\ue85d\ue85e\ue85f\ue860\ue861\ue862\ue863\ue864\ue865\ue866\ue867\ue868\ue869\ue86a\ue86b\ue86c\ue86d\ue86e\ue86f\ue870\ue871\ue872\ue873\ue874\ue875\ue876\ue877\ue878\ue879\ue87a\ue87b\ue87c\ue87d\ue87e\ue87f\ue880\ue881\ue882\ue883\ue884\ue885\ue886\ue887\ue888\ue889\ue88a\ue88b\ue88c\ue88d\ue88e\ue88f\ue890\ue891\ue892\ue893\ue894\ue895\ue896\ue897\ue898\ue899\ue89a\ue89b\ue89c\ue89d\ue89e\ue89f\ue8a0\ue8a1\ue8a2\ue8a3\ue8a4\ue8a5\ue8a6\ue8a7\ue8a8\ue8a9\ue8aa\ue8ab\ue8ac\ue8ad\ue8ae\ue8af\ue8b0\ue8b1\ue8b2\ue8b3\ue8b4\ue8b5\ue8b6\ue8b7\ue8b8\ue8b9\ue8ba\ue8bb\ue8bc\ue8bd\ue8be\ue8bf\ue8c0\ue8c1\ue8c2\ue8c3\ue8c4\ue8c5\ue8c6\ue8c7\ue8c8\ue8c9\ue8ca\ue8cb\ue8cc\ue8cd\ue8ce\ue8cf\ue8d0\ue8d1\ue8d2\ue8d3\ue8d4\ue8d5\ue8d6\ue8d7\ue8d8\ue8d9\ue8da\ue8db\ue8dc\ue8dd\ue8de\ue8df\ue8e0\ue8e1\ue8e2\ue8e3\ue8e4\ue8e5\ue8e6\ue8e7\ue8e8\ue8e9\ue8ea\ue8eb\ue8ec\ue8ed\ue8ee\ue8ef\ue8f0\ue8f1\ue8f2\ue8f3\ue8f4\ue8f5\ue8f6\ue8f7\ue8f8\ue8f9\ue8fa\ue8fb\ue8fc\ue8fd\ue8fe\ue8ff\ue900\ue901\ue902\ue903\ue904\ue905\ue906\ue907\ue908\ue909\ue90a\ue90b\ue90c\ue90d\ue90e\ue90f\ue910\ue911\ue912\ue913\ue914\ue915\ue916\ue917\ue918\ue919\ue91a\ue91b\ue91c\ue91d\ue91e\ue91f\ue920\ue921\ue922\ue923\ue924\ue925\ue926\ue927\ue928\ue929\ue92a\ue92b\ue92c\ue92d\ue92e\ue92f\ue930\ue931\ue932\ue933\ue934\ue935\ue936\ue937\ue938\ue939\ue93a\ue93b\ue93c\ue93d\ue93e\ue93f\ue940\ue941\ue942\ue943\ue944\ue945\ue946\ue947\ue948\ue949\ue94a\ue94b\ue94c\ue94d\ue94e\ue94f\ue950\ue951\ue952\ue953\ue954\ue955\ue956\ue957\ue958\ue959\ue95a\ue95b\ue95c\ue95d\ue95e\ue95f\ue960\ue961\ue962\ue963\ue964\ue965\ue966\ue967\ue968\ue969\ue96a\ue96b\ue96c\ue96d\ue96e\ue96f\ue970\ue971\ue972\ue973\ue974\ue975\ue976\ue977\ue978\ue979\ue97a\ue97b\ue97c\ue97d\ue97e\ue97f\ue980\ue981\ue982\ue983\ue984\ue985\ue986\ue987\ue988\ue989\ue98a\ue98b\ue98c\ue98d\ue98e\ue98f\ue990\ue991\ue992\ue993\ue994\ue995\ue996\ue997\ue998\ue999\ue99a\ue99b\ue99c\ue99d\ue99e\ue99f\ue9a0\ue9a1\ue9a2\ue9a3\ue9a4\ue9a5\ue9a6\ue9a7\ue9a8\ue9a9\ue9aa\ue9ab\ue9ac\ue9ad\ue9ae\ue9af\ue9b0\ue9b1\ue9b2\ue9b3\ue9b4\ue9b5\ue9b6\ue9b7\ue9b8\ue9b9\ue9ba\ue9bb\ue9bc\ue9bd\ue9be\ue9bf\ue9c0\ue9c1\ue9c2\ue9c3\ue9c4\ue9c5\ue9c6\ue9c7\ue9c8\ue9c9\ue9ca\ue9cb\ue9cc\ue9cd\ue9ce\ue9cf\ue9d0\ue9d1\ue9d2\ue9d3\ue9d4\ue9d5\ue9d6\ue9d7\ue9d8\ue9d9\ue9da\ue9db\ue9dc\ue9dd\ue9de\ue9df\ue9e0\ue9e1\ue9e2\ue9e3\ue9e4\ue9e5\ue9e6\ue9e7\ue9e8\ue9e9\ue9ea\ue9eb\ue9ec\ue9ed\ue9ee\ue9ef\ue9f0\ue9f1\ue9f2\ue9f3\ue9f4\ue9f5\ue9f6\ue9f7\ue9f8\ue9f9\ue9fa\ue9fb\ue9fc\ue9fd\ue9fe\ue9ff\uea00\uea01\uea02\uea03\uea04\uea05\uea06\uea07\uea08\uea09\uea0a\uea0b\uea0c\uea0d\uea0e\uea0f\uea10\uea11\uea12\uea13\uea14\uea15\uea16\uea17\uea18\uea19\uea1a\uea1b\uea1c\uea1d\uea1e\uea1f\uea20\uea21\uea22\uea23\uea24\uea25\uea26\uea27\uea28\uea29\uea2a\uea2b\uea2c\uea2d\uea2e\uea2f\uea30\uea31\uea32\uea33\uea34\uea35\uea36\uea37\uea38\uea39\uea3a\uea3b\uea3c\uea3d\uea3e\uea3f\uea40\uea41\uea42\uea43\uea44\uea45\uea46\uea47\uea48\uea49\uea4a\uea4b\uea4c\uea4d\uea4e\uea4f\uea50\uea51\uea52\uea53\uea54\uea55\uea56\uea57\uea58\uea59\uea5a\uea5b\uea5c\uea5d\uea5e\uea5f\uea60\uea61\uea62\uea63\uea64\uea65\uea66\uea67\uea68\uea69\uea6a\uea6b\uea6c\uea6d\uea6e\uea6f\uea70\uea71\uea72\uea73\uea74\uea75\uea76\uea77\uea78\uea79\uea7a\uea7b\uea7c\uea7d\uea7e\uea7f\uea80\uea81\uea82\uea83\uea84\uea85\uea86\uea87\uea88\uea89\uea8a\uea8b\uea8c\uea8d\uea8e\uea8f\uea90\uea91\uea92\uea93\uea94\uea95\uea96\uea97\uea98\uea99\uea9a\uea9b\uea9c\uea9d\uea9e\uea9f\ueaa0\ueaa1\ueaa2\ueaa3\ueaa4\ueaa5\ueaa6\ueaa7\ueaa8\ueaa9\ueaaa\ueaab\ueaac\ueaad\ueaae\ueaaf\ueab0\ueab1\ueab2\ueab3\ueab4\ueab5\ueab6\ueab7\ueab8\ueab9\ueaba\ueabb\ueabc\ueabd\ueabe\ueabf\ueac0\ueac1\ueac2\ueac3\ueac4\ueac5\ueac6\ueac7\ueac8\ueac9\ueaca\ueacb\ueacc\ueacd\ueace\ueacf\uead0\uead1\uead2\uead3\uead4\uead5\uead6\uead7\uead8\uead9\ueada\ueadb\ueadc\ueadd\ueade\ueadf\ueae0\ueae1\ueae2\ueae3\ueae4\ueae5\ueae6\ueae7\ueae8\ueae9\ueaea\ueaeb\ueaec\ueaed\ueaee\ueaef\ueaf0\ueaf1\ueaf2\ueaf3\ueaf4\ueaf5\ueaf6\ueaf7\ueaf8\ueaf9\ueafa\ueafb\ueafc\ueafd\ueafe\ueaff\ueb00\ueb01\ueb02\ueb03\ueb04\ueb05\ueb06\ueb07\ueb08\ueb09\ueb0a\ueb0b\ueb0c\ueb0d\ueb0e\ueb0f\ueb10\ueb11\ueb12\ueb13\ueb14\ueb15\ueb16\ueb17\ueb18\ueb19\ueb1a\ueb1b\ueb1c\ueb1d\ueb1e\ueb1f\ueb20\ueb21\ueb22\ueb23\ueb24\ueb25\ueb26\ueb27\ueb28\ueb29\ueb2a\ueb2b\ueb2c\ueb2d\ueb2e\ueb2f\ueb30\ueb31\ueb32\ueb33\ueb34\ueb35\ueb36\ueb37\ueb38\ueb39\ueb3a\ueb3b\ueb3c\ueb3d\ueb3e\ueb3f\ueb40\ueb41\ueb42\ueb43\ueb44\ueb45\ueb46\ueb47\ueb48\ueb49\ueb4a\ueb4b\ueb4c\ueb4d\ueb4e\ueb4f\ueb50\ueb51\ueb52\ueb53\ueb54\ueb55\ueb56\ueb57\ueb58\ueb59\ueb5a\ueb5b\ueb5c\ueb5d\ueb5e\ueb5f\ueb60\ueb61\ueb62\ueb63\ueb64\ueb65\ueb66\ueb67\ueb68\ueb69\ueb6a\ueb6b\ueb6c\ueb6d\ueb6e\ueb6f\ueb70\ueb71\ueb72\ueb73\ueb74\ueb75\ueb76\ueb77\ueb78\ueb79\ueb7a\ueb7b\ueb7c\ueb7d\ueb7e\ueb7f\ueb80\ueb81\ueb82\ueb83\ueb84\ueb85\ueb86\ueb87\ueb88\ueb89\ueb8a\ueb8b\ueb8c\ueb8d\ueb8e\ueb8f\ueb90\ueb91\ueb92\ueb93\ueb94\ueb95\ueb96\ueb97\ueb98\ueb99\ueb9a\ueb9b\ueb9c\ueb9d\ueb9e\ueb9f\ueba0\ueba1\ueba2\ueba3\ueba4\ueba5\ueba6\ueba7\ueba8\ueba9\uebaa\uebab\uebac\uebad\uebae\uebaf\uebb0\uebb1\uebb2\uebb3\uebb4\uebb5\uebb6\uebb7\uebb8\uebb9\uebba\uebbb\uebbc\uebbd\uebbe\uebbf\uebc0\uebc1\uebc2\uebc3\uebc4\uebc5\uebc6\uebc7\uebc8\uebc9\uebca\uebcb\uebcc\uebcd\uebce\uebcf\uebd0\uebd1\uebd2\uebd3\uebd4\uebd5\uebd6\uebd7\uebd8\uebd9\uebda\uebdb\uebdc\uebdd\uebde\uebdf\uebe0\uebe1\uebe2\uebe3\uebe4\uebe5\uebe6\uebe7\uebe8\uebe9\uebea\uebeb\uebec\uebed\uebee\uebef\uebf0\uebf1\uebf2\uebf3\uebf4\uebf5\uebf6\uebf7\uebf8\uebf9\uebfa\uebfb\uebfc\uebfd\uebfe\uebff\uec00\uec01\uec02\uec03\uec04\uec05\uec06\uec07\uec08\uec09\uec0a\uec0b\uec0c\uec0d\uec0e\uec0f\uec10\uec11\uec12\uec13\uec14\uec15\uec16\uec17\uec18\uec19\uec1a\uec1b\uec1c\uec1d\uec1e\uec1f\uec20\uec21\uec22\uec23\uec24\uec25\uec26\uec27\uec28\uec29\uec2a\uec2b\uec2c\uec2d\uec2e\uec2f\uec30\uec31\uec32\uec33\uec34\uec35\uec36\uec37\uec38\uec39\uec3a\uec3b\uec3c\uec3d\uec3e\uec3f\uec40\uec41\uec42\uec43\uec44\uec45\uec46\uec47\uec48\uec49\uec4a\uec4b\uec4c\uec4d\uec4e\uec4f\uec50\uec51\uec52\uec53\uec54\uec55\uec56\uec57\uec58\uec59\uec5a\uec5b\uec5c\uec5d\uec5e\uec5f\uec60\uec61\uec62\uec63\uec64\uec65\uec66\uec67\uec68\uec69\uec6a\uec6b\uec6c\uec6d\uec6e\uec6f\uec70\uec71\uec72\uec73\uec74\uec75\uec76\uec77\uec78\uec79\uec7a\uec7b\uec7c\uec7d\uec7e\uec7f\uec80\uec81\uec82\uec83\uec84\uec85\uec86\uec87\uec88\uec89\uec8a\uec8b\uec8c\uec8d\uec8e\uec8f\uec90\uec91\uec92\uec93\uec94\uec95\uec96\uec97\uec98\uec99\uec9a\uec9b\uec9c\uec9d\uec9e\uec9f\ueca0\ueca1\ueca2\ueca3\ueca4\ueca5\ueca6\ueca7\ueca8\ueca9\uecaa\uecab\uecac\uecad\uecae\uecaf\uecb0\uecb1\uecb2\uecb3\uecb4\uecb5\uecb6\uecb7\uecb8\uecb9\uecba\uecbb\uecbc\uecbd\uecbe\uecbf\uecc0\uecc1\uecc2\uecc3\uecc4\uecc5\uecc6\uecc7\uecc8\uecc9\uecca\ueccb\ueccc\ueccd\uecce\ueccf\uecd0\uecd1\uecd2\uecd3\uecd4\uecd5\uecd6\uecd7\uecd8\uecd9\uecda\uecdb\uecdc\uecdd\uecde\uecdf\uece0\uece1\uece2\uece3\uece4\uece5\uece6\uece7\uece8\uece9\uecea\ueceb\uecec\ueced\uecee\uecef\uecf0\uecf1\uecf2\uecf3\uecf4\uecf5\uecf6\uecf7\uecf8\uecf9\uecfa\uecfb\uecfc\uecfd\uecfe\uecff\ued00\ued01\ued02\ued03\ued04\ued05\ued06\ued07\ued08\ued09\ued0a\ued0b\ued0c\ued0d\ued0e\ued0f\ued10\ued11\ued12\ued13\ued14\ued15\ued16\ued17\ued18\ued19\ued1a\ued1b\ued1c\ued1d\ued1e\ued1f\ued20\ued21\ued22\ued23\ued24\ued25\ued26\ued27\ued28\ued29\ued2a\ued2b\ued2c\ued2d\ued2e\ued2f\ued30\ued31\ued32\ued33\ued34\ued35\ued36\ued37\ued38\ued39\ued3a\ued3b\ued3c\ued3d\ued3e\ued3f\ued40\ued41\ued42\ued43\ued44\ued45\ued46\ued47\ued48\ued49\ued4a\ued4b\ued4c\ued4d\ued4e\ued4f\ued50\ued51\ued52\ued53\ued54\ued55\ued56\ued57\ued58\ued59\ued5a\ued5b\ued5c\ued5d\ued5e\ued5f\ued60\ued61\ued62\ued63\ued64\ued65\ued66\ued67\ued68\ued69\ued6a\ued6b\ued6c\ued6d\ued6e\ued6f\ued70\ued71\ued72\ued73\ued74\ued75\ued76\ued77\ued78\ued79\ued7a\ued7b\ued7c\ued7d\ued7e\ued7f\ued80\ued81\ued82\ued83\ued84\ued85\ued86\ued87\ued88\ued89\ued8a\ued8b\ued8c\ued8d\ued8e\ued8f\ued90\ued91\ued92\ued93\ued94\ued95\ued96\ued97\ued98\ued99\ued9a\ued9b\ued9c\ued9d\ued9e\ued9f\ueda0\ueda1\ueda2\ueda3\ueda4\ueda5\ueda6\ueda7\ueda8\ueda9\uedaa\uedab\uedac\uedad\uedae\uedaf\uedb0\uedb1\uedb2\uedb3\uedb4\uedb5\uedb6\uedb7\uedb8\uedb9\uedba\uedbb\uedbc\uedbd\uedbe\uedbf\uedc0\uedc1\uedc2\uedc3\uedc4\uedc5\uedc6\uedc7\uedc8\uedc9\uedca\uedcb\uedcc\uedcd\uedce\uedcf\uedd0\uedd1\uedd2\uedd3\uedd4\uedd5\uedd6\uedd7\uedd8\uedd9\uedda\ueddb\ueddc\ueddd\uedde\ueddf\uede0\uede1\uede2\uede3\uede4\uede5\uede6\uede7\uede8\uede9\uedea\uedeb\uedec\ueded\uedee\uedef\uedf0\uedf1\uedf2\uedf3\uedf4\uedf5\uedf6\uedf7\uedf8\uedf9\uedfa\uedfb\uedfc\uedfd\uedfe\uedff\uee00\uee01\uee02\uee03\uee04\uee05\uee06\uee07\uee08\uee09\uee0a\uee0b\uee0c\uee0d\uee0e\uee0f\uee10\uee11\uee12\uee13\uee14\uee15\uee16\uee17\uee18\uee19\uee1a\uee1b\uee1c\uee1d\uee1e\uee1f\uee20\uee21\uee22\uee23\uee24\uee25\uee26\uee27\uee28\uee29\uee2a\uee2b\uee2c\uee2d\uee2e\uee2f\uee30\uee31\uee32\uee33\uee34\uee35\uee36\uee37\uee38\uee39\uee3a\uee3b\uee3c\uee3d\uee3e\uee3f\uee40\uee41\uee42\uee43\uee44\uee45\uee46\uee47\uee48\uee49\uee4a\uee4b\uee4c\uee4d\uee4e\uee4f\uee50\uee51\uee52\uee53\uee54\uee55\uee56\uee57\uee58\uee59\uee5a\uee5b\uee5c\uee5d\uee5e\uee5f\uee60\uee61\uee62\uee63\uee64\uee65\uee66\uee67\uee68\uee69\uee6a\uee6b\uee6c\uee6d\uee6e\uee6f\uee70\uee71\uee72\uee73\uee74\uee75\uee76\uee77\uee78\uee79\uee7a\uee7b\uee7c\uee7d\uee7e\uee7f\uee80\uee81\uee82\uee83\uee84\uee85\uee86\uee87\uee88\uee89\uee8a\uee8b\uee8c\uee8d\uee8e\uee8f\uee90\uee91\uee92\uee93\uee94\uee95\uee96\uee97\uee98\uee99\uee9a\uee9b\uee9c\uee9d\uee9e\uee9f\ueea0\ueea1\ueea2\ueea3\ueea4\ueea5\ueea6\ueea7\ueea8\ueea9\ueeaa\ueeab\ueeac\ueead\ueeae\ueeaf\ueeb0\ueeb1\ueeb2\ueeb3\ueeb4\ueeb5\ueeb6\ueeb7\ueeb8\ueeb9\ueeba\ueebb\ueebc\ueebd\ueebe\ueebf\ueec0\ueec1\ueec2\ueec3\ueec4\ueec5\ueec6\ueec7\ueec8\ueec9\ueeca\ueecb\ueecc\ueecd\ueece\ueecf\ueed0\ueed1\ueed2\ueed3\ueed4\ueed5\ueed6\ueed7\ueed8\ueed9\ueeda\ueedb\ueedc\ueedd\ueede\ueedf\ueee0\ueee1\ueee2\ueee3\ueee4\ueee5\ueee6\ueee7\ueee8\ueee9\ueeea\ueeeb\ueeec\ueeed\ueeee\ueeef\ueef0\ueef1\ueef2\ueef3\ueef4\ueef5\ueef6\ueef7\ueef8\ueef9\ueefa\ueefb\ueefc\ueefd\ueefe\ueeff\uef00\uef01\uef02\uef03\uef04\uef05\uef06\uef07\uef08\uef09\uef0a\uef0b\uef0c\uef0d\uef0e\uef0f\uef10\uef11\uef12\uef13\uef14\uef15\uef16\uef17\uef18\uef19\uef1a\uef1b\uef1c\uef1d\uef1e\uef1f\uef20\uef21\uef22\uef23\uef24\uef25\uef26\uef27\uef28\uef29\uef2a\uef2b\uef2c\uef2d\uef2e\uef2f\uef30\uef31\uef32\uef33\uef34\uef35\uef36\uef37\uef38\uef39\uef3a\uef3b\uef3c\uef3d\uef3e\uef3f\uef40\uef41\uef42\uef43\uef44\uef45\uef46\uef47\uef48\uef49\uef4a\uef4b\uef4c\uef4d\uef4e\uef4f\uef50\uef51\uef52\uef53\uef54\uef55\uef56\uef57\uef58\uef59\uef5a\uef5b\uef5c\uef5d\uef5e\uef5f\uef60\uef61\uef62\uef63\uef64\uef65\uef66\uef67\uef68\uef69\uef6a\uef6b\uef6c\uef6d\uef6e\uef6f\uef70\uef71\uef72\uef73\uef74\uef75\uef76\uef77\uef78\uef79\uef7a\uef7b\uef7c\uef7d\uef7e\uef7f\uef80\uef81\uef82\uef83\uef84\uef85\uef86\uef87\uef88\uef89\uef8a\uef8b\uef8c\uef8d\uef8e\uef8f\uef90\uef91\uef92\uef93\uef94\uef95\uef96\uef97\uef98\uef99\uef9a\uef9b\uef9c\uef9d\uef9e\uef9f\uefa0\uefa1\uefa2\uefa3\uefa4\uefa5\uefa6\uefa7\uefa8\uefa9\uefaa\uefab\uefac\uefad\uefae\uefaf\uefb0\uefb1\uefb2\uefb3\uefb4\uefb5\uefb6\uefb7\uefb8\uefb9\uefba\uefbb\uefbc\uefbd\uefbe\uefbf\uefc0\uefc1\uefc2\uefc3\uefc4\uefc5\uefc6\uefc7\uefc8\uefc9\uefca\uefcb\uefcc\uefcd\uefce\uefcf\uefd0\uefd1\uefd2\uefd3\uefd4\uefd5\uefd6\uefd7\uefd8\uefd9\uefda\uefdb\uefdc\uefdd\uefde\uefdf\uefe0\uefe1\uefe2\uefe3\uefe4\uefe5\uefe6\uefe7\uefe8\uefe9\uefea\uefeb\uefec\uefed\uefee\uefef\ueff0\ueff1\ueff2\ueff3\ueff4\ueff5\ueff6\ueff7\ueff8\ueff9\ueffa\ueffb\ueffc\ueffd\ueffe\uefff\uf000\uf001\uf002\uf003\uf004\uf005\uf006\uf007\uf008\uf009\uf00a\uf00b\uf00c\uf00d\uf00e\uf00f\uf010\uf011\uf012\uf013\uf014\uf015\uf016\uf017\uf018\uf019\uf01a\uf01b\uf01c\uf01d\uf01e\uf01f\uf020\uf021\uf022\uf023\uf024\uf025\uf026\uf027\uf028\uf029\uf02a\uf02b\uf02c\uf02d\uf02e\uf02f\uf030\uf031\uf032\uf033\uf034\uf035\uf036\uf037\uf038\uf039\uf03a\uf03b\uf03c\uf03d\uf03e\uf03f\uf040\uf041\uf042\uf043\uf044\uf045\uf046\uf047\uf048\uf049\uf04a\uf04b\uf04c\uf04d\uf04e\uf04f\uf050\uf051\uf052\uf053\uf054\uf055\uf056\uf057\uf058\uf059\uf05a\uf05b\uf05c\uf05d\uf05e\uf05f\uf060\uf061\uf062\uf063\uf064\uf065\uf066\uf067\uf068\uf069\uf06a\uf06b\uf06c\uf06d\uf06e\uf06f\uf070\uf071\uf072\uf073\uf074\uf075\uf076\uf077\uf078\uf079\uf07a\uf07b\uf07c\uf07d\uf07e\uf07f\uf080\uf081\uf082\uf083\uf084\uf085\uf086\uf087\uf088\uf089\uf08a\uf08b\uf08c\uf08d\uf08e\uf08f\uf090\uf091\uf092\uf093\uf094\uf095\uf096\uf097\uf098\uf099\uf09a\uf09b\uf09c\uf09d\uf09e\uf09f\uf0a0\uf0a1\uf0a2\uf0a3\uf0a4\uf0a5\uf0a6\uf0a7\uf0a8\uf0a9\uf0aa\uf0ab\uf0ac\uf0ad\uf0ae\uf0af\uf0b0\uf0b1\uf0b2\uf0b3\uf0b4\uf0b5\uf0b6\uf0b7\uf0b8\uf0b9\uf0ba\uf0bb\uf0bc\uf0bd\uf0be\uf0bf\uf0c0\uf0c1\uf0c2\uf0c3\uf0c4\uf0c5\uf0c6\uf0c7\uf0c8\uf0c9\uf0ca\uf0cb\uf0cc\uf0cd\uf0ce\uf0cf\uf0d0\uf0d1\uf0d2\uf0d3\uf0d4\uf0d5\uf0d6\uf0d7\uf0d8\uf0d9\uf0da\uf0db\uf0dc\uf0dd\uf0de\uf0df\uf0e0\uf0e1\uf0e2\uf0e3\uf0e4\uf0e5\uf0e6\uf0e7\uf0e8\uf0e9\uf0ea\uf0eb\uf0ec\uf0ed\uf0ee\uf0ef\uf0f0\uf0f1\uf0f2\uf0f3\uf0f4\uf0f5\uf0f6\uf0f7\uf0f8\uf0f9\uf0fa\uf0fb\uf0fc\uf0fd\uf0fe\uf0ff\uf100\uf101\uf102\uf103\uf104\uf105\uf106\uf107\uf108\uf109\uf10a\uf10b\uf10c\uf10d\uf10e\uf10f\uf110\uf111\uf112\uf113\uf114\uf115\uf116\uf117\uf118\uf119\uf11a\uf11b\uf11c\uf11d\uf11e\uf11f\uf120\uf121\uf122\uf123\uf124\uf125\uf126\uf127\uf128\uf129\uf12a\uf12b\uf12c\uf12d\uf12e\uf12f\uf130\uf131\uf132\uf133\uf134\uf135\uf136\uf137\uf138\uf139\uf13a\uf13b\uf13c\uf13d\uf13e\uf13f\uf140\uf141\uf142\uf143\uf144\uf145\uf146\uf147\uf148\uf149\uf14a\uf14b\uf14c\uf14d\uf14e\uf14f\uf150\uf151\uf152\uf153\uf154\uf155\uf156\uf157\uf158\uf159\uf15a\uf15b\uf15c\uf15d\uf15e\uf15f\uf160\uf161\uf162\uf163\uf164\uf165\uf166\uf167\uf168\uf169\uf16a\uf16b\uf16c\uf16d\uf16e\uf16f\uf170\uf171\uf172\uf173\uf174\uf175\uf176\uf177\uf178\uf179\uf17a\uf17b\uf17c\uf17d\uf17e\uf17f\uf180\uf181\uf182\uf183\uf184\uf185\uf186\uf187\uf188\uf189\uf18a\uf18b\uf18c\uf18d\uf18e\uf18f\uf190\uf191\uf192\uf193\uf194\uf195\uf196\uf197\uf198\uf199\uf19a\uf19b\uf19c\uf19d\uf19e\uf19f\uf1a0\uf1a1\uf1a2\uf1a3\uf1a4\uf1a5\uf1a6\uf1a7\uf1a8\uf1a9\uf1aa\uf1ab\uf1ac\uf1ad\uf1ae\uf1af\uf1b0\uf1b1\uf1b2\uf1b3\uf1b4\uf1b5\uf1b6\uf1b7\uf1b8\uf1b9\uf1ba\uf1bb\uf1bc\uf1bd\uf1be\uf1bf\uf1c0\uf1c1\uf1c2\uf1c3\uf1c4\uf1c5\uf1c6\uf1c7\uf1c8\uf1c9\uf1ca\uf1cb\uf1cc\uf1cd\uf1ce\uf1cf\uf1d0\uf1d1\uf1d2\uf1d3\uf1d4\uf1d5\uf1d6\uf1d7\uf1d8\uf1d9\uf1da\uf1db\uf1dc\uf1dd\uf1de\uf1df\uf1e0\uf1e1\uf1e2\uf1e3\uf1e4\uf1e5\uf1e6\uf1e7\uf1e8\uf1e9\uf1ea\uf1eb\uf1ec\uf1ed\uf1ee\uf1ef\uf1f0\uf1f1\uf1f2\uf1f3\uf1f4\uf1f5\uf1f6\uf1f7\uf1f8\uf1f9\uf1fa\uf1fb\uf1fc\uf1fd\uf1fe\uf1ff\uf200\uf201\uf202\uf203\uf204\uf205\uf206\uf207\uf208\uf209\uf20a\uf20b\uf20c\uf20d\uf20e\uf20f\uf210\uf211\uf212\uf213\uf214\uf215\uf216\uf217\uf218\uf219\uf21a\uf21b\uf21c\uf21d\uf21e\uf21f\uf220\uf221\uf222\uf223\uf224\uf225\uf226\uf227\uf228\uf229\uf22a\uf22b\uf22c\uf22d\uf22e\uf22f\uf230\uf231\uf232\uf233\uf234\uf235\uf236\uf237\uf238\uf239\uf23a\uf23b\uf23c\uf23d\uf23e\uf23f\uf240\uf241\uf242\uf243\uf244\uf245\uf246\uf247\uf248\uf249\uf24a\uf24b\uf24c\uf24d\uf24e\uf24f\uf250\uf251\uf252\uf253\uf254\uf255\uf256\uf257\uf258\uf259\uf25a\uf25b\uf25c\uf25d\uf25e\uf25f\uf260\uf261\uf262\uf263\uf264\uf265\uf266\uf267\uf268\uf269\uf26a\uf26b\uf26c\uf26d\uf26e\uf26f\uf270\uf271\uf272\uf273\uf274\uf275\uf276\uf277\uf278\uf279\uf27a\uf27b\uf27c\uf27d\uf27e\uf27f\uf280\uf281\uf282\uf283\uf284\uf285\uf286\uf287\uf288\uf289\uf28a\uf28b\uf28c\uf28d\uf28e\uf28f\uf290\uf291\uf292\uf293\uf294\uf295\uf296\uf297\uf298\uf299\uf29a\uf29b\uf29c\uf29d\uf29e\uf29f\uf2a0\uf2a1\uf2a2\uf2a3\uf2a4\uf2a5\uf2a6\uf2a7\uf2a8\uf2a9\uf2aa\uf2ab\uf2ac\uf2ad\uf2ae\uf2af\uf2b0\uf2b1\uf2b2\uf2b3\uf2b4\uf2b5\uf2b6\uf2b7\uf2b8\uf2b9\uf2ba\uf2bb\uf2bc\uf2bd\uf2be\uf2bf\uf2c0\uf2c1\uf2c2\uf2c3\uf2c4\uf2c5\uf2c6\uf2c7\uf2c8\uf2c9\uf2ca\uf2cb\uf2cc\uf2cd\uf2ce\uf2cf\uf2d0\uf2d1\uf2d2\uf2d3\uf2d4\uf2d5\uf2d6\uf2d7\uf2d8\uf2d9\uf2da\uf2db\uf2dc\uf2dd\uf2de\uf2df\uf2e0\uf2e1\uf2e2\uf2e3\uf2e4\uf2e5\uf2e6\uf2e7\uf2e8\uf2e9\uf2ea\uf2eb\uf2ec\uf2ed\uf2ee\uf2ef\uf2f0\uf2f1\uf2f2\uf2f3\uf2f4\uf2f5\uf2f6\uf2f7\uf2f8\uf2f9\uf2fa\uf2fb\uf2fc\uf2fd\uf2fe\uf2ff\uf300\uf301\uf302\uf303\uf304\uf305\uf306\uf307\uf308\uf309\uf30a\uf30b\uf30c\uf30d\uf30e\uf30f\uf310\uf311\uf312\uf313\uf314\uf315\uf316\uf317\uf318\uf319\uf31a\uf31b\uf31c\uf31d\uf31e\uf31f\uf320\uf321\uf322\uf323\uf324\uf325\uf326\uf327\uf328\uf329\uf32a\uf32b\uf32c\uf32d\uf32e\uf32f\uf330\uf331\uf332\uf333\uf334\uf335\uf336\uf337\uf338\uf339\uf33a\uf33b\uf33c\uf33d\uf33e\uf33f\uf340\uf341\uf342\uf343\uf344\uf345\uf346\uf347\uf348\uf349\uf34a\uf34b\uf34c\uf34d\uf34e\uf34f\uf350\uf351\uf352\uf353\uf354\uf355\uf356\uf357\uf358\uf359\uf35a\uf35b\uf35c\uf35d\uf35e\uf35f\uf360\uf361\uf362\uf363\uf364\uf365\uf366\uf367\uf368\uf369\uf36a\uf36b\uf36c\uf36d\uf36e\uf36f\uf370\uf371\uf372\uf373\uf374\uf375\uf376\uf377\uf378\uf379\uf37a\uf37b\uf37c\uf37d\uf37e\uf37f\uf380\uf381\uf382\uf383\uf384\uf385\uf386\uf387\uf388\uf389\uf38a\uf38b\uf38c\uf38d\uf38e\uf38f\uf390\uf391\uf392\uf393\uf394\uf395\uf396\uf397\uf398\uf399\uf39a\uf39b\uf39c\uf39d\uf39e\uf39f\uf3a0\uf3a1\uf3a2\uf3a3\uf3a4\uf3a5\uf3a6\uf3a7\uf3a8\uf3a9\uf3aa\uf3ab\uf3ac\uf3ad\uf3ae\uf3af\uf3b0\uf3b1\uf3b2\uf3b3\uf3b4\uf3b5\uf3b6\uf3b7\uf3b8\uf3b9\uf3ba\uf3bb\uf3bc\uf3bd\uf3be\uf3bf\uf3c0\uf3c1\uf3c2\uf3c3\uf3c4\uf3c5\uf3c6\uf3c7\uf3c8\uf3c9\uf3ca\uf3cb\uf3cc\uf3cd\uf3ce\uf3cf\uf3d0\uf3d1\uf3d2\uf3d3\uf3d4\uf3d5\uf3d6\uf3d7\uf3d8\uf3d9\uf3da\uf3db\uf3dc\uf3dd\uf3de\uf3df\uf3e0\uf3e1\uf3e2\uf3e3\uf3e4\uf3e5\uf3e6\uf3e7\uf3e8\uf3e9\uf3ea\uf3eb\uf3ec\uf3ed\uf3ee\uf3ef\uf3f0\uf3f1\uf3f2\uf3f3\uf3f4\uf3f5\uf3f6\uf3f7\uf3f8\uf3f9\uf3fa\uf3fb\uf3fc\uf3fd\uf3fe\uf3ff\uf400\uf401\uf402\uf403\uf404\uf405\uf406\uf407\uf408\uf409\uf40a\uf40b\uf40c\uf40d\uf40e\uf40f\uf410\uf411\uf412\uf413\uf414\uf415\uf416\uf417\uf418\uf419\uf41a\uf41b\uf41c\uf41d\uf41e\uf41f\uf420\uf421\uf422\uf423\uf424\uf425\uf426\uf427\uf428\uf429\uf42a\uf42b\uf42c\uf42d\uf42e\uf42f\uf430\uf431\uf432\uf433\uf434\uf435\uf436\uf437\uf438\uf439\uf43a\uf43b\uf43c\uf43d\uf43e\uf43f\uf440\uf441\uf442\uf443\uf444\uf445\uf446\uf447\uf448\uf449\uf44a\uf44b\uf44c\uf44d\uf44e\uf44f\uf450\uf451\uf452\uf453\uf454\uf455\uf456\uf457\uf458\uf459\uf45a\uf45b\uf45c\uf45d\uf45e\uf45f\uf460\uf461\uf462\uf463\uf464\uf465\uf466\uf467\uf468\uf469\uf46a\uf46b\uf46c\uf46d\uf46e\uf46f\uf470\uf471\uf472\uf473\uf474\uf475\uf476\uf477\uf478\uf479\uf47a\uf47b\uf47c\uf47d\uf47e\uf47f\uf480\uf481\uf482\uf483\uf484\uf485\uf486\uf487\uf488\uf489\uf48a\uf48b\uf48c\uf48d\uf48e\uf48f\uf490\uf491\uf492\uf493\uf494\uf495\uf496\uf497\uf498\uf499\uf49a\uf49b\uf49c\uf49d\uf49e\uf49f\uf4a0\uf4a1\uf4a2\uf4a3\uf4a4\uf4a5\uf4a6\uf4a7\uf4a8\uf4a9\uf4aa\uf4ab\uf4ac\uf4ad\uf4ae\uf4af\uf4b0\uf4b1\uf4b2\uf4b3\uf4b4\uf4b5\uf4b6\uf4b7\uf4b8\uf4b9\uf4ba\uf4bb\uf4bc\uf4bd\uf4be\uf4bf\uf4c0\uf4c1\uf4c2\uf4c3\uf4c4\uf4c5\uf4c6\uf4c7\uf4c8\uf4c9\uf4ca\uf4cb\uf4cc\uf4cd\uf4ce\uf4cf\uf4d0\uf4d1\uf4d2\uf4d3\uf4d4\uf4d5\uf4d6\uf4d7\uf4d8\uf4d9\uf4da\uf4db\uf4dc\uf4dd\uf4de\uf4df\uf4e0\uf4e1\uf4e2\uf4e3\uf4e4\uf4e5\uf4e6\uf4e7\uf4e8\uf4e9\uf4ea\uf4eb\uf4ec\uf4ed\uf4ee\uf4ef\uf4f0\uf4f1\uf4f2\uf4f3\uf4f4\uf4f5\uf4f6\uf4f7\uf4f8\uf4f9\uf4fa\uf4fb\uf4fc\uf4fd\uf4fe\uf4ff\uf500\uf501\uf502\uf503\uf504\uf505\uf506\uf507\uf508\uf509\uf50a\uf50b\uf50c\uf50d\uf50e\uf50f\uf510\uf511\uf512\uf513\uf514\uf515\uf516\uf517\uf518\uf519\uf51a\uf51b\uf51c\uf51d\uf51e\uf51f\uf520\uf521\uf522\uf523\uf524\uf525\uf526\uf527\uf528\uf529\uf52a\uf52b\uf52c\uf52d\uf52e\uf52f\uf530\uf531\uf532\uf533\uf534\uf535\uf536\uf537\uf538\uf539\uf53a\uf53b\uf53c\uf53d\uf53e\uf53f\uf540\uf541\uf542\uf543\uf544\uf545\uf546\uf547\uf548\uf549\uf54a\uf54b\uf54c\uf54d\uf54e\uf54f\uf550\uf551\uf552\uf553\uf554\uf555\uf556\uf557\uf558\uf559\uf55a\uf55b\uf55c\uf55d\uf55e\uf55f\uf560\uf561\uf562\uf563\uf564\uf565\uf566\uf567\uf568\uf569\uf56a\uf56b\uf56c\uf56d\uf56e\uf56f\uf570\uf571\uf572\uf573\uf574\uf575\uf576\uf577\uf578\uf579\uf57a\uf57b\uf57c\uf57d\uf57e\uf57f\uf580\uf581\uf582\uf583\uf584\uf585\uf586\uf587\uf588\uf589\uf58a\uf58b\uf58c\uf58d\uf58e\uf58f\uf590\uf591\uf592\uf593\uf594\uf595\uf596\uf597\uf598\uf599\uf59a\uf59b\uf59c\uf59d\uf59e\uf59f\uf5a0\uf5a1\uf5a2\uf5a3\uf5a4\uf5a5\uf5a6\uf5a7\uf5a8\uf5a9\uf5aa\uf5ab\uf5ac\uf5ad\uf5ae\uf5af\uf5b0\uf5b1\uf5b2\uf5b3\uf5b4\uf5b5\uf5b6\uf5b7\uf5b8\uf5b9\uf5ba\uf5bb\uf5bc\uf5bd\uf5be\uf5bf\uf5c0\uf5c1\uf5c2\uf5c3\uf5c4\uf5c5\uf5c6\uf5c7\uf5c8\uf5c9\uf5ca\uf5cb\uf5cc\uf5cd\uf5ce\uf5cf\uf5d0\uf5d1\uf5d2\uf5d3\uf5d4\uf5d5\uf5d6\uf5d7\uf5d8\uf5d9\uf5da\uf5db\uf5dc\uf5dd\uf5de\uf5df\uf5e0\uf5e1\uf5e2\uf5e3\uf5e4\uf5e5\uf5e6\uf5e7\uf5e8\uf5e9\uf5ea\uf5eb\uf5ec\uf5ed\uf5ee\uf5ef\uf5f0\uf5f1\uf5f2\uf5f3\uf5f4\uf5f5\uf5f6\uf5f7\uf5f8\uf5f9\uf5fa\uf5fb\uf5fc\uf5fd\uf5fe\uf5ff\uf600\uf601\uf602\uf603\uf604\uf605\uf606\uf607\uf608\uf609\uf60a\uf60b\uf60c\uf60d\uf60e\uf60f\uf610\uf611\uf612\uf613\uf614\uf615\uf616\uf617\uf618\uf619\uf61a\uf61b\uf61c\uf61d\uf61e\uf61f\uf620\uf621\uf622\uf623\uf624\uf625\uf626\uf627\uf628\uf629\uf62a\uf62b\uf62c\uf62d\uf62e\uf62f\uf630\uf631\uf632\uf633\uf634\uf635\uf636\uf637\uf638\uf639\uf63a\uf63b\uf63c\uf63d\uf63e\uf63f\uf640\uf641\uf642\uf643\uf644\uf645\uf646\uf647\uf648\uf649\uf64a\uf64b\uf64c\uf64d\uf64e\uf64f\uf650\uf651\uf652\uf653\uf654\uf655\uf656\uf657\uf658\uf659\uf65a\uf65b\uf65c\uf65d\uf65e\uf65f\uf660\uf661\uf662\uf663\uf664\uf665\uf666\uf667\uf668\uf669\uf66a\uf66b\uf66c\uf66d\uf66e\uf66f\uf670\uf671\uf672\uf673\uf674\uf675\uf676\uf677\uf678\uf679\uf67a\uf67b\uf67c\uf67d\uf67e\uf67f\uf680\uf681\uf682\uf683\uf684\uf685\uf686\uf687\uf688\uf689\uf68a\uf68b\uf68c\uf68d\uf68e\uf68f\uf690\uf691\uf692\uf693\uf694\uf695\uf696\uf697\uf698\uf699\uf69a\uf69b\uf69c\uf69d\uf69e\uf69f\uf6a0\uf6a1\uf6a2\uf6a3\uf6a4\uf6a5\uf6a6\uf6a7\uf6a8\uf6a9\uf6aa\uf6ab\uf6ac\uf6ad\uf6ae\uf6af\uf6b0\uf6b1\uf6b2\uf6b3\uf6b4\uf6b5\uf6b6\uf6b7\uf6b8\uf6b9\uf6ba\uf6bb\uf6bc\uf6bd\uf6be\uf6bf\uf6c0\uf6c1\uf6c2\uf6c3\uf6c4\uf6c5\uf6c6\uf6c7\uf6c8\uf6c9\uf6ca\uf6cb\uf6cc\uf6cd\uf6ce\uf6cf\uf6d0\uf6d1\uf6d2\uf6d3\uf6d4\uf6d5\uf6d6\uf6d7\uf6d8\uf6d9\uf6da\uf6db\uf6dc\uf6dd\uf6de\uf6df\uf6e0\uf6e1\uf6e2\uf6e3\uf6e4\uf6e5\uf6e6\uf6e7\uf6e8\uf6e9\uf6ea\uf6eb\uf6ec\uf6ed\uf6ee\uf6ef\uf6f0\uf6f1\uf6f2\uf6f3\uf6f4\uf6f5\uf6f6\uf6f7\uf6f8\uf6f9\uf6fa\uf6fb\uf6fc\uf6fd\uf6fe\uf6ff\uf700\uf701\uf702\uf703\uf704\uf705\uf706\uf707\uf708\uf709\uf70a\uf70b\uf70c\uf70d\uf70e\uf70f\uf710\uf711\uf712\uf713\uf714\uf715\uf716\uf717\uf718\uf719\uf71a\uf71b\uf71c\uf71d\uf71e\uf71f\uf720\uf721\uf722\uf723\uf724\uf725\uf726\uf727\uf728\uf729\uf72a\uf72b\uf72c\uf72d\uf72e\uf72f\uf730\uf731\uf732\uf733\uf734\uf735\uf736\uf737\uf738\uf739\uf73a\uf73b\uf73c\uf73d\uf73e\uf73f\uf740\uf741\uf742\uf743\uf744\uf745\uf746\uf747\uf748\uf749\uf74a\uf74b\uf74c\uf74d\uf74e\uf74f\uf750\uf751\uf752\uf753\uf754\uf755\uf756\uf757\uf758\uf759\uf75a\uf75b\uf75c\uf75d\uf75e\uf75f\uf760\uf761\uf762\uf763\uf764\uf765\uf766\uf767\uf768\uf769\uf76a\uf76b\uf76c\uf76d\uf76e\uf76f\uf770\uf771\uf772\uf773\uf774\uf775\uf776\uf777\uf778\uf779\uf77a\uf77b\uf77c\uf77d\uf77e\uf77f\uf780\uf781\uf782\uf783\uf784\uf785\uf786\uf787\uf788\uf789\uf78a\uf78b\uf78c\uf78d\uf78e\uf78f\uf790\uf791\uf792\uf793\uf794\uf795\uf796\uf797\uf798\uf799\uf79a\uf79b\uf79c\uf79d\uf79e\uf79f\uf7a0\uf7a1\uf7a2\uf7a3\uf7a4\uf7a5\uf7a6\uf7a7\uf7a8\uf7a9\uf7aa\uf7ab\uf7ac\uf7ad\uf7ae\uf7af\uf7b0\uf7b1\uf7b2\uf7b3\uf7b4\uf7b5\uf7b6\uf7b7\uf7b8\uf7b9\uf7ba\uf7bb\uf7bc\uf7bd\uf7be\uf7bf\uf7c0\uf7c1\uf7c2\uf7c3\uf7c4\uf7c5\uf7c6\uf7c7\uf7c8\uf7c9\uf7ca\uf7cb\uf7cc\uf7cd\uf7ce\uf7cf\uf7d0\uf7d1\uf7d2\uf7d3\uf7d4\uf7d5\uf7d6\uf7d7\uf7d8\uf7d9\uf7da\uf7db\uf7dc\uf7dd\uf7de\uf7df\uf7e0\uf7e1\uf7e2\uf7e3\uf7e4\uf7e5\uf7e6\uf7e7\uf7e8\uf7e9\uf7ea\uf7eb\uf7ec\uf7ed\uf7ee\uf7ef\uf7f0\uf7f1\uf7f2\uf7f3\uf7f4\uf7f5\uf7f6\uf7f7\uf7f8\uf7f9\uf7fa\uf7fb\uf7fc\uf7fd\uf7fe\uf7ff\uf800\uf801\uf802\uf803\uf804\uf805\uf806\uf807\uf808\uf809\uf80a\uf80b\uf80c\uf80d\uf80e\uf80f\uf810\uf811\uf812\uf813\uf814\uf815\uf816\uf817\uf818\uf819\uf81a\uf81b\uf81c\uf81d\uf81e\uf81f\uf820\uf821\uf822\uf823\uf824\uf825\uf826\uf827\uf828\uf829\uf82a\uf82b\uf82c\uf82d\uf82e\uf82f\uf830\uf831\uf832\uf833\uf834\uf835\uf836\uf837\uf838\uf839\uf83a\uf83b\uf83c\uf83d\uf83e\uf83f\uf840\uf841\uf842\uf843\uf844\uf845\uf846\uf847\uf848\uf849\uf84a\uf84b\uf84c\uf84d\uf84e\uf84f\uf850\uf851\uf852\uf853\uf854\uf855\uf856\uf857\uf858\uf859\uf85a\uf85b\uf85c\uf85d\uf85e\uf85f\uf860\uf861\uf862\uf863\uf864\uf865\uf866\uf867\uf868\uf869\uf86a\uf86b\uf86c\uf86d\uf86e\uf86f\uf870\uf871\uf872\uf873\uf874\uf875\uf876\uf877\uf878\uf879\uf87a\uf87b\uf87c\uf87d\uf87e\uf87f\uf880\uf881\uf882\uf883\uf884\uf885\uf886\uf887\uf888\uf889\uf88a\uf88b\uf88c\uf88d\uf88e\uf88f\uf890\uf891\uf892\uf893\uf894\uf895\uf896\uf897\uf898\uf899\uf89a\uf89b\uf89c\uf89d\uf89e\uf89f\uf8a0\uf8a1\uf8a2\uf8a3\uf8a4\uf8a5\uf8a6\uf8a7\uf8a8\uf8a9\uf8aa\uf8ab\uf8ac\uf8ad\uf8ae\uf8af\uf8b0\uf8b1\uf8b2\uf8b3\uf8b4\uf8b5\uf8b6\uf8b7\uf8b8\uf8b9\uf8ba\uf8bb\uf8bc\uf8bd\uf8be\uf8bf\uf8c0\uf8c1\uf8c2\uf8c3\uf8c4\uf8c5\uf8c6\uf8c7\uf8c8\uf8c9\uf8ca\uf8cb\uf8cc\uf8cd\uf8ce\uf8cf\uf8d0\uf8d1\uf8d2\uf8d3\uf8d4\uf8d5\uf8d6\uf8d7\uf8d8\uf8d9\uf8da\uf8db\uf8dc\uf8dd\uf8de\uf8df\uf8e0\uf8e1\uf8e2\uf8e3\uf8e4\uf8e5\uf8e6\uf8e7\uf8e8\uf8e9\uf8ea\uf8eb\uf8ec\uf8ed\uf8ee\uf8ef\uf8f0\uf8f1\uf8f2\uf8f3\uf8f4\uf8f5\uf8f6\uf8f7\uf8f8\uf8f9\uf8fa\uf8fb\uf8fc\uf8fd\uf8fe\uf8ff' +Co = '\ue000\ue001\ue002\ue003\ue004\ue005\ue006\ue007\ue008\ue009\ue00a\ue00b\ue00c\ue00d\ue00e\ue00f\ue010\ue011\ue012\ue013\ue014\ue015\ue016\ue017\ue018\ue019\ue01a\ue01b\ue01c\ue01d\ue01e\ue01f\ue020\ue021\ue022\ue023\ue024\ue025\ue026\ue027\ue028\ue029\ue02a\ue02b\ue02c\ue02d\ue02e\ue02f\ue030\ue031\ue032\ue033\ue034\ue035\ue036\ue037\ue038\ue039\ue03a\ue03b\ue03c\ue03d\ue03e\ue03f\ue040\ue041\ue042\ue043\ue044\ue045\ue046\ue047\ue048\ue049\ue04a\ue04b\ue04c\ue04d\ue04e\ue04f\ue050\ue051\ue052\ue053\ue054\ue055\ue056\ue057\ue058\ue059\ue05a\ue05b\ue05c\ue05d\ue05e\ue05f\ue060\ue061\ue062\ue063\ue064\ue065\ue066\ue067\ue068\ue069\ue06a\ue06b\ue06c\ue06d\ue06e\ue06f\ue070\ue071\ue072\ue073\ue074\ue075\ue076\ue077\ue078\ue079\ue07a\ue07b\ue07c\ue07d\ue07e\ue07f\ue080\ue081\ue082\ue083\ue084\ue085\ue086\ue087\ue088\ue089\ue08a\ue08b\ue08c\ue08d\ue08e\ue08f\ue090\ue091\ue092\ue093\ue094\ue095\ue096\ue097\ue098\ue099\ue09a\ue09b\ue09c\ue09d\ue09e\ue09f\ue0a0\ue0a1\ue0a2\ue0a3\ue0a4\ue0a5\ue0a6\ue0a7\ue0a8\ue0a9\ue0aa\ue0ab\ue0ac\ue0ad\ue0ae\ue0af\ue0b0\ue0b1\ue0b2\ue0b3\ue0b4\ue0b5\ue0b6\ue0b7\ue0b8\ue0b9\ue0ba\ue0bb\ue0bc\ue0bd\ue0be\ue0bf\ue0c0\ue0c1\ue0c2\ue0c3\ue0c4\ue0c5\ue0c6\ue0c7\ue0c8\ue0c9\ue0ca\ue0cb\ue0cc\ue0cd\ue0ce\ue0cf\ue0d0\ue0d1\ue0d2\ue0d3\ue0d4\ue0d5\ue0d6\ue0d7\ue0d8\ue0d9\ue0da\ue0db\ue0dc\ue0dd\ue0de\ue0df\ue0e0\ue0e1\ue0e2\ue0e3\ue0e4\ue0e5\ue0e6\ue0e7\ue0e8\ue0e9\ue0ea\ue0eb\ue0ec\ue0ed\ue0ee\ue0ef\ue0f0\ue0f1\ue0f2\ue0f3\ue0f4\ue0f5\ue0f6\ue0f7\ue0f8\ue0f9\ue0fa\ue0fb\ue0fc\ue0fd\ue0fe\ue0ff\ue100\ue101\ue102\ue103\ue104\ue105\ue106\ue107\ue108\ue109\ue10a\ue10b\ue10c\ue10d\ue10e\ue10f\ue110\ue111\ue112\ue113\ue114\ue115\ue116\ue117\ue118\ue119\ue11a\ue11b\ue11c\ue11d\ue11e\ue11f\ue120\ue121\ue122\ue123\ue124\ue125\ue126\ue127\ue128\ue129\ue12a\ue12b\ue12c\ue12d\ue12e\ue12f\ue130\ue131\ue132\ue133\ue134\ue135\ue136\ue137\ue138\ue139\ue13a\ue13b\ue13c\ue13d\ue13e\ue13f\ue140\ue141\ue142\ue143\ue144\ue145\ue146\ue147\ue148\ue149\ue14a\ue14b\ue14c\ue14d\ue14e\ue14f\ue150\ue151\ue152\ue153\ue154\ue155\ue156\ue157\ue158\ue159\ue15a\ue15b\ue15c\ue15d\ue15e\ue15f\ue160\ue161\ue162\ue163\ue164\ue165\ue166\ue167\ue168\ue169\ue16a\ue16b\ue16c\ue16d\ue16e\ue16f\ue170\ue171\ue172\ue173\ue174\ue175\ue176\ue177\ue178\ue179\ue17a\ue17b\ue17c\ue17d\ue17e\ue17f\ue180\ue181\ue182\ue183\ue184\ue185\ue186\ue187\ue188\ue189\ue18a\ue18b\ue18c\ue18d\ue18e\ue18f\ue190\ue191\ue192\ue193\ue194\ue195\ue196\ue197\ue198\ue199\ue19a\ue19b\ue19c\ue19d\ue19e\ue19f\ue1a0\ue1a1\ue1a2\ue1a3\ue1a4\ue1a5\ue1a6\ue1a7\ue1a8\ue1a9\ue1aa\ue1ab\ue1ac\ue1ad\ue1ae\ue1af\ue1b0\ue1b1\ue1b2\ue1b3\ue1b4\ue1b5\ue1b6\ue1b7\ue1b8\ue1b9\ue1ba\ue1bb\ue1bc\ue1bd\ue1be\ue1bf\ue1c0\ue1c1\ue1c2\ue1c3\ue1c4\ue1c5\ue1c6\ue1c7\ue1c8\ue1c9\ue1ca\ue1cb\ue1cc\ue1cd\ue1ce\ue1cf\ue1d0\ue1d1\ue1d2\ue1d3\ue1d4\ue1d5\ue1d6\ue1d7\ue1d8\ue1d9\ue1da\ue1db\ue1dc\ue1dd\ue1de\ue1df\ue1e0\ue1e1\ue1e2\ue1e3\ue1e4\ue1e5\ue1e6\ue1e7\ue1e8\ue1e9\ue1ea\ue1eb\ue1ec\ue1ed\ue1ee\ue1ef\ue1f0\ue1f1\ue1f2\ue1f3\ue1f4\ue1f5\ue1f6\ue1f7\ue1f8\ue1f9\ue1fa\ue1fb\ue1fc\ue1fd\ue1fe\ue1ff\ue200\ue201\ue202\ue203\ue204\ue205\ue206\ue207\ue208\ue209\ue20a\ue20b\ue20c\ue20d\ue20e\ue20f\ue210\ue211\ue212\ue213\ue214\ue215\ue216\ue217\ue218\ue219\ue21a\ue21b\ue21c\ue21d\ue21e\ue21f\ue220\ue221\ue222\ue223\ue224\ue225\ue226\ue227\ue228\ue229\ue22a\ue22b\ue22c\ue22d\ue22e\ue22f\ue230\ue231\ue232\ue233\ue234\ue235\ue236\ue237\ue238\ue239\ue23a\ue23b\ue23c\ue23d\ue23e\ue23f\ue240\ue241\ue242\ue243\ue244\ue245\ue246\ue247\ue248\ue249\ue24a\ue24b\ue24c\ue24d\ue24e\ue24f\ue250\ue251\ue252\ue253\ue254\ue255\ue256\ue257\ue258\ue259\ue25a\ue25b\ue25c\ue25d\ue25e\ue25f\ue260\ue261\ue262\ue263\ue264\ue265\ue266\ue267\ue268\ue269\ue26a\ue26b\ue26c\ue26d\ue26e\ue26f\ue270\ue271\ue272\ue273\ue274\ue275\ue276\ue277\ue278\ue279\ue27a\ue27b\ue27c\ue27d\ue27e\ue27f\ue280\ue281\ue282\ue283\ue284\ue285\ue286\ue287\ue288\ue289\ue28a\ue28b\ue28c\ue28d\ue28e\ue28f\ue290\ue291\ue292\ue293\ue294\ue295\ue296\ue297\ue298\ue299\ue29a\ue29b\ue29c\ue29d\ue29e\ue29f\ue2a0\ue2a1\ue2a2\ue2a3\ue2a4\ue2a5\ue2a6\ue2a7\ue2a8\ue2a9\ue2aa\ue2ab\ue2ac\ue2ad\ue2ae\ue2af\ue2b0\ue2b1\ue2b2\ue2b3\ue2b4\ue2b5\ue2b6\ue2b7\ue2b8\ue2b9\ue2ba\ue2bb\ue2bc\ue2bd\ue2be\ue2bf\ue2c0\ue2c1\ue2c2\ue2c3\ue2c4\ue2c5\ue2c6\ue2c7\ue2c8\ue2c9\ue2ca\ue2cb\ue2cc\ue2cd\ue2ce\ue2cf\ue2d0\ue2d1\ue2d2\ue2d3\ue2d4\ue2d5\ue2d6\ue2d7\ue2d8\ue2d9\ue2da\ue2db\ue2dc\ue2dd\ue2de\ue2df\ue2e0\ue2e1\ue2e2\ue2e3\ue2e4\ue2e5\ue2e6\ue2e7\ue2e8\ue2e9\ue2ea\ue2eb\ue2ec\ue2ed\ue2ee\ue2ef\ue2f0\ue2f1\ue2f2\ue2f3\ue2f4\ue2f5\ue2f6\ue2f7\ue2f8\ue2f9\ue2fa\ue2fb\ue2fc\ue2fd\ue2fe\ue2ff\ue300\ue301\ue302\ue303\ue304\ue305\ue306\ue307\ue308\ue309\ue30a\ue30b\ue30c\ue30d\ue30e\ue30f\ue310\ue311\ue312\ue313\ue314\ue315\ue316\ue317\ue318\ue319\ue31a\ue31b\ue31c\ue31d\ue31e\ue31f\ue320\ue321\ue322\ue323\ue324\ue325\ue326\ue327\ue328\ue329\ue32a\ue32b\ue32c\ue32d\ue32e\ue32f\ue330\ue331\ue332\ue333\ue334\ue335\ue336\ue337\ue338\ue339\ue33a\ue33b\ue33c\ue33d\ue33e\ue33f\ue340\ue341\ue342\ue343\ue344\ue345\ue346\ue347\ue348\ue349\ue34a\ue34b\ue34c\ue34d\ue34e\ue34f\ue350\ue351\ue352\ue353\ue354\ue355\ue356\ue357\ue358\ue359\ue35a\ue35b\ue35c\ue35d\ue35e\ue35f\ue360\ue361\ue362\ue363\ue364\ue365\ue366\ue367\ue368\ue369\ue36a\ue36b\ue36c\ue36d\ue36e\ue36f\ue370\ue371\ue372\ue373\ue374\ue375\ue376\ue377\ue378\ue379\ue37a\ue37b\ue37c\ue37d\ue37e\ue37f\ue380\ue381\ue382\ue383\ue384\ue385\ue386\ue387\ue388\ue389\ue38a\ue38b\ue38c\ue38d\ue38e\ue38f\ue390\ue391\ue392\ue393\ue394\ue395\ue396\ue397\ue398\ue399\ue39a\ue39b\ue39c\ue39d\ue39e\ue39f\ue3a0\ue3a1\ue3a2\ue3a3\ue3a4\ue3a5\ue3a6\ue3a7\ue3a8\ue3a9\ue3aa\ue3ab\ue3ac\ue3ad\ue3ae\ue3af\ue3b0\ue3b1\ue3b2\ue3b3\ue3b4\ue3b5\ue3b6\ue3b7\ue3b8\ue3b9\ue3ba\ue3bb\ue3bc\ue3bd\ue3be\ue3bf\ue3c0\ue3c1\ue3c2\ue3c3\ue3c4\ue3c5\ue3c6\ue3c7\ue3c8\ue3c9\ue3ca\ue3cb\ue3cc\ue3cd\ue3ce\ue3cf\ue3d0\ue3d1\ue3d2\ue3d3\ue3d4\ue3d5\ue3d6\ue3d7\ue3d8\ue3d9\ue3da\ue3db\ue3dc\ue3dd\ue3de\ue3df\ue3e0\ue3e1\ue3e2\ue3e3\ue3e4\ue3e5\ue3e6\ue3e7\ue3e8\ue3e9\ue3ea\ue3eb\ue3ec\ue3ed\ue3ee\ue3ef\ue3f0\ue3f1\ue3f2\ue3f3\ue3f4\ue3f5\ue3f6\ue3f7\ue3f8\ue3f9\ue3fa\ue3fb\ue3fc\ue3fd\ue3fe\ue3ff\ue400\ue401\ue402\ue403\ue404\ue405\ue406\ue407\ue408\ue409\ue40a\ue40b\ue40c\ue40d\ue40e\ue40f\ue410\ue411\ue412\ue413\ue414\ue415\ue416\ue417\ue418\ue419\ue41a\ue41b\ue41c\ue41d\ue41e\ue41f\ue420\ue421\ue422\ue423\ue424\ue425\ue426\ue427\ue428\ue429\ue42a\ue42b\ue42c\ue42d\ue42e\ue42f\ue430\ue431\ue432\ue433\ue434\ue435\ue436\ue437\ue438\ue439\ue43a\ue43b\ue43c\ue43d\ue43e\ue43f\ue440\ue441\ue442\ue443\ue444\ue445\ue446\ue447\ue448\ue449\ue44a\ue44b\ue44c\ue44d\ue44e\ue44f\ue450\ue451\ue452\ue453\ue454\ue455\ue456\ue457\ue458\ue459\ue45a\ue45b\ue45c\ue45d\ue45e\ue45f\ue460\ue461\ue462\ue463\ue464\ue465\ue466\ue467\ue468\ue469\ue46a\ue46b\ue46c\ue46d\ue46e\ue46f\ue470\ue471\ue472\ue473\ue474\ue475\ue476\ue477\ue478\ue479\ue47a\ue47b\ue47c\ue47d\ue47e\ue47f\ue480\ue481\ue482\ue483\ue484\ue485\ue486\ue487\ue488\ue489\ue48a\ue48b\ue48c\ue48d\ue48e\ue48f\ue490\ue491\ue492\ue493\ue494\ue495\ue496\ue497\ue498\ue499\ue49a\ue49b\ue49c\ue49d\ue49e\ue49f\ue4a0\ue4a1\ue4a2\ue4a3\ue4a4\ue4a5\ue4a6\ue4a7\ue4a8\ue4a9\ue4aa\ue4ab\ue4ac\ue4ad\ue4ae\ue4af\ue4b0\ue4b1\ue4b2\ue4b3\ue4b4\ue4b5\ue4b6\ue4b7\ue4b8\ue4b9\ue4ba\ue4bb\ue4bc\ue4bd\ue4be\ue4bf\ue4c0\ue4c1\ue4c2\ue4c3\ue4c4\ue4c5\ue4c6\ue4c7\ue4c8\ue4c9\ue4ca\ue4cb\ue4cc\ue4cd\ue4ce\ue4cf\ue4d0\ue4d1\ue4d2\ue4d3\ue4d4\ue4d5\ue4d6\ue4d7\ue4d8\ue4d9\ue4da\ue4db\ue4dc\ue4dd\ue4de\ue4df\ue4e0\ue4e1\ue4e2\ue4e3\ue4e4\ue4e5\ue4e6\ue4e7\ue4e8\ue4e9\ue4ea\ue4eb\ue4ec\ue4ed\ue4ee\ue4ef\ue4f0\ue4f1\ue4f2\ue4f3\ue4f4\ue4f5\ue4f6\ue4f7\ue4f8\ue4f9\ue4fa\ue4fb\ue4fc\ue4fd\ue4fe\ue4ff\ue500\ue501\ue502\ue503\ue504\ue505\ue506\ue507\ue508\ue509\ue50a\ue50b\ue50c\ue50d\ue50e\ue50f\ue510\ue511\ue512\ue513\ue514\ue515\ue516\ue517\ue518\ue519\ue51a\ue51b\ue51c\ue51d\ue51e\ue51f\ue520\ue521\ue522\ue523\ue524\ue525\ue526\ue527\ue528\ue529\ue52a\ue52b\ue52c\ue52d\ue52e\ue52f\ue530\ue531\ue532\ue533\ue534\ue535\ue536\ue537\ue538\ue539\ue53a\ue53b\ue53c\ue53d\ue53e\ue53f\ue540\ue541\ue542\ue543\ue544\ue545\ue546\ue547\ue548\ue549\ue54a\ue54b\ue54c\ue54d\ue54e\ue54f\ue550\ue551\ue552\ue553\ue554\ue555\ue556\ue557\ue558\ue559\ue55a\ue55b\ue55c\ue55d\ue55e\ue55f\ue560\ue561\ue562\ue563\ue564\ue565\ue566\ue567\ue568\ue569\ue56a\ue56b\ue56c\ue56d\ue56e\ue56f\ue570\ue571\ue572\ue573\ue574\ue575\ue576\ue577\ue578\ue579\ue57a\ue57b\ue57c\ue57d\ue57e\ue57f\ue580\ue581\ue582\ue583\ue584\ue585\ue586\ue587\ue588\ue589\ue58a\ue58b\ue58c\ue58d\ue58e\ue58f\ue590\ue591\ue592\ue593\ue594\ue595\ue596\ue597\ue598\ue599\ue59a\ue59b\ue59c\ue59d\ue59e\ue59f\ue5a0\ue5a1\ue5a2\ue5a3\ue5a4\ue5a5\ue5a6\ue5a7\ue5a8\ue5a9\ue5aa\ue5ab\ue5ac\ue5ad\ue5ae\ue5af\ue5b0\ue5b1\ue5b2\ue5b3\ue5b4\ue5b5\ue5b6\ue5b7\ue5b8\ue5b9\ue5ba\ue5bb\ue5bc\ue5bd\ue5be\ue5bf\ue5c0\ue5c1\ue5c2\ue5c3\ue5c4\ue5c5\ue5c6\ue5c7\ue5c8\ue5c9\ue5ca\ue5cb\ue5cc\ue5cd\ue5ce\ue5cf\ue5d0\ue5d1\ue5d2\ue5d3\ue5d4\ue5d5\ue5d6\ue5d7\ue5d8\ue5d9\ue5da\ue5db\ue5dc\ue5dd\ue5de\ue5df\ue5e0\ue5e1\ue5e2\ue5e3\ue5e4\ue5e5\ue5e6\ue5e7\ue5e8\ue5e9\ue5ea\ue5eb\ue5ec\ue5ed\ue5ee\ue5ef\ue5f0\ue5f1\ue5f2\ue5f3\ue5f4\ue5f5\ue5f6\ue5f7\ue5f8\ue5f9\ue5fa\ue5fb\ue5fc\ue5fd\ue5fe\ue5ff\ue600\ue601\ue602\ue603\ue604\ue605\ue606\ue607\ue608\ue609\ue60a\ue60b\ue60c\ue60d\ue60e\ue60f\ue610\ue611\ue612\ue613\ue614\ue615\ue616\ue617\ue618\ue619\ue61a\ue61b\ue61c\ue61d\ue61e\ue61f\ue620\ue621\ue622\ue623\ue624\ue625\ue626\ue627\ue628\ue629\ue62a\ue62b\ue62c\ue62d\ue62e\ue62f\ue630\ue631\ue632\ue633\ue634\ue635\ue636\ue637\ue638\ue639\ue63a\ue63b\ue63c\ue63d\ue63e\ue63f\ue640\ue641\ue642\ue643\ue644\ue645\ue646\ue647\ue648\ue649\ue64a\ue64b\ue64c\ue64d\ue64e\ue64f\ue650\ue651\ue652\ue653\ue654\ue655\ue656\ue657\ue658\ue659\ue65a\ue65b\ue65c\ue65d\ue65e\ue65f\ue660\ue661\ue662\ue663\ue664\ue665\ue666\ue667\ue668\ue669\ue66a\ue66b\ue66c\ue66d\ue66e\ue66f\ue670\ue671\ue672\ue673\ue674\ue675\ue676\ue677\ue678\ue679\ue67a\ue67b\ue67c\ue67d\ue67e\ue67f\ue680\ue681\ue682\ue683\ue684\ue685\ue686\ue687\ue688\ue689\ue68a\ue68b\ue68c\ue68d\ue68e\ue68f\ue690\ue691\ue692\ue693\ue694\ue695\ue696\ue697\ue698\ue699\ue69a\ue69b\ue69c\ue69d\ue69e\ue69f\ue6a0\ue6a1\ue6a2\ue6a3\ue6a4\ue6a5\ue6a6\ue6a7\ue6a8\ue6a9\ue6aa\ue6ab\ue6ac\ue6ad\ue6ae\ue6af\ue6b0\ue6b1\ue6b2\ue6b3\ue6b4\ue6b5\ue6b6\ue6b7\ue6b8\ue6b9\ue6ba\ue6bb\ue6bc\ue6bd\ue6be\ue6bf\ue6c0\ue6c1\ue6c2\ue6c3\ue6c4\ue6c5\ue6c6\ue6c7\ue6c8\ue6c9\ue6ca\ue6cb\ue6cc\ue6cd\ue6ce\ue6cf\ue6d0\ue6d1\ue6d2\ue6d3\ue6d4\ue6d5\ue6d6\ue6d7\ue6d8\ue6d9\ue6da\ue6db\ue6dc\ue6dd\ue6de\ue6df\ue6e0\ue6e1\ue6e2\ue6e3\ue6e4\ue6e5\ue6e6\ue6e7\ue6e8\ue6e9\ue6ea\ue6eb\ue6ec\ue6ed\ue6ee\ue6ef\ue6f0\ue6f1\ue6f2\ue6f3\ue6f4\ue6f5\ue6f6\ue6f7\ue6f8\ue6f9\ue6fa\ue6fb\ue6fc\ue6fd\ue6fe\ue6ff\ue700\ue701\ue702\ue703\ue704\ue705\ue706\ue707\ue708\ue709\ue70a\ue70b\ue70c\ue70d\ue70e\ue70f\ue710\ue711\ue712\ue713\ue714\ue715\ue716\ue717\ue718\ue719\ue71a\ue71b\ue71c\ue71d\ue71e\ue71f\ue720\ue721\ue722\ue723\ue724\ue725\ue726\ue727\ue728\ue729\ue72a\ue72b\ue72c\ue72d\ue72e\ue72f\ue730\ue731\ue732\ue733\ue734\ue735\ue736\ue737\ue738\ue739\ue73a\ue73b\ue73c\ue73d\ue73e\ue73f\ue740\ue741\ue742\ue743\ue744\ue745\ue746\ue747\ue748\ue749\ue74a\ue74b\ue74c\ue74d\ue74e\ue74f\ue750\ue751\ue752\ue753\ue754\ue755\ue756\ue757\ue758\ue759\ue75a\ue75b\ue75c\ue75d\ue75e\ue75f\ue760\ue761\ue762\ue763\ue764\ue765\ue766\ue767\ue768\ue769\ue76a\ue76b\ue76c\ue76d\ue76e\ue76f\ue770\ue771\ue772\ue773\ue774\ue775\ue776\ue777\ue778\ue779\ue77a\ue77b\ue77c\ue77d\ue77e\ue77f\ue780\ue781\ue782\ue783\ue784\ue785\ue786\ue787\ue788\ue789\ue78a\ue78b\ue78c\ue78d\ue78e\ue78f\ue790\ue791\ue792\ue793\ue794\ue795\ue796\ue797\ue798\ue799\ue79a\ue79b\ue79c\ue79d\ue79e\ue79f\ue7a0\ue7a1\ue7a2\ue7a3\ue7a4\ue7a5\ue7a6\ue7a7\ue7a8\ue7a9\ue7aa\ue7ab\ue7ac\ue7ad\ue7ae\ue7af\ue7b0\ue7b1\ue7b2\ue7b3\ue7b4\ue7b5\ue7b6\ue7b7\ue7b8\ue7b9\ue7ba\ue7bb\ue7bc\ue7bd\ue7be\ue7bf\ue7c0\ue7c1\ue7c2\ue7c3\ue7c4\ue7c5\ue7c6\ue7c7\ue7c8\ue7c9\ue7ca\ue7cb\ue7cc\ue7cd\ue7ce\ue7cf\ue7d0\ue7d1\ue7d2\ue7d3\ue7d4\ue7d5\ue7d6\ue7d7\ue7d8\ue7d9\ue7da\ue7db\ue7dc\ue7dd\ue7de\ue7df\ue7e0\ue7e1\ue7e2\ue7e3\ue7e4\ue7e5\ue7e6\ue7e7\ue7e8\ue7e9\ue7ea\ue7eb\ue7ec\ue7ed\ue7ee\ue7ef\ue7f0\ue7f1\ue7f2\ue7f3\ue7f4\ue7f5\ue7f6\ue7f7\ue7f8\ue7f9\ue7fa\ue7fb\ue7fc\ue7fd\ue7fe\ue7ff\ue800\ue801\ue802\ue803\ue804\ue805\ue806\ue807\ue808\ue809\ue80a\ue80b\ue80c\ue80d\ue80e\ue80f\ue810\ue811\ue812\ue813\ue814\ue815\ue816\ue817\ue818\ue819\ue81a\ue81b\ue81c\ue81d\ue81e\ue81f\ue820\ue821\ue822\ue823\ue824\ue825\ue826\ue827\ue828\ue829\ue82a\ue82b\ue82c\ue82d\ue82e\ue82f\ue830\ue831\ue832\ue833\ue834\ue835\ue836\ue837\ue838\ue839\ue83a\ue83b\ue83c\ue83d\ue83e\ue83f\ue840\ue841\ue842\ue843\ue844\ue845\ue846\ue847\ue848\ue849\ue84a\ue84b\ue84c\ue84d\ue84e\ue84f\ue850\ue851\ue852\ue853\ue854\ue855\ue856\ue857\ue858\ue859\ue85a\ue85b\ue85c\ue85d\ue85e\ue85f\ue860\ue861\ue862\ue863\ue864\ue865\ue866\ue867\ue868\ue869\ue86a\ue86b\ue86c\ue86d\ue86e\ue86f\ue870\ue871\ue872\ue873\ue874\ue875\ue876\ue877\ue878\ue879\ue87a\ue87b\ue87c\ue87d\ue87e\ue87f\ue880\ue881\ue882\ue883\ue884\ue885\ue886\ue887\ue888\ue889\ue88a\ue88b\ue88c\ue88d\ue88e\ue88f\ue890\ue891\ue892\ue893\ue894\ue895\ue896\ue897\ue898\ue899\ue89a\ue89b\ue89c\ue89d\ue89e\ue89f\ue8a0\ue8a1\ue8a2\ue8a3\ue8a4\ue8a5\ue8a6\ue8a7\ue8a8\ue8a9\ue8aa\ue8ab\ue8ac\ue8ad\ue8ae\ue8af\ue8b0\ue8b1\ue8b2\ue8b3\ue8b4\ue8b5\ue8b6\ue8b7\ue8b8\ue8b9\ue8ba\ue8bb\ue8bc\ue8bd\ue8be\ue8bf\ue8c0\ue8c1\ue8c2\ue8c3\ue8c4\ue8c5\ue8c6\ue8c7\ue8c8\ue8c9\ue8ca\ue8cb\ue8cc\ue8cd\ue8ce\ue8cf\ue8d0\ue8d1\ue8d2\ue8d3\ue8d4\ue8d5\ue8d6\ue8d7\ue8d8\ue8d9\ue8da\ue8db\ue8dc\ue8dd\ue8de\ue8df\ue8e0\ue8e1\ue8e2\ue8e3\ue8e4\ue8e5\ue8e6\ue8e7\ue8e8\ue8e9\ue8ea\ue8eb\ue8ec\ue8ed\ue8ee\ue8ef\ue8f0\ue8f1\ue8f2\ue8f3\ue8f4\ue8f5\ue8f6\ue8f7\ue8f8\ue8f9\ue8fa\ue8fb\ue8fc\ue8fd\ue8fe\ue8ff\ue900\ue901\ue902\ue903\ue904\ue905\ue906\ue907\ue908\ue909\ue90a\ue90b\ue90c\ue90d\ue90e\ue90f\ue910\ue911\ue912\ue913\ue914\ue915\ue916\ue917\ue918\ue919\ue91a\ue91b\ue91c\ue91d\ue91e\ue91f\ue920\ue921\ue922\ue923\ue924\ue925\ue926\ue927\ue928\ue929\ue92a\ue92b\ue92c\ue92d\ue92e\ue92f\ue930\ue931\ue932\ue933\ue934\ue935\ue936\ue937\ue938\ue939\ue93a\ue93b\ue93c\ue93d\ue93e\ue93f\ue940\ue941\ue942\ue943\ue944\ue945\ue946\ue947\ue948\ue949\ue94a\ue94b\ue94c\ue94d\ue94e\ue94f\ue950\ue951\ue952\ue953\ue954\ue955\ue956\ue957\ue958\ue959\ue95a\ue95b\ue95c\ue95d\ue95e\ue95f\ue960\ue961\ue962\ue963\ue964\ue965\ue966\ue967\ue968\ue969\ue96a\ue96b\ue96c\ue96d\ue96e\ue96f\ue970\ue971\ue972\ue973\ue974\ue975\ue976\ue977\ue978\ue979\ue97a\ue97b\ue97c\ue97d\ue97e\ue97f\ue980\ue981\ue982\ue983\ue984\ue985\ue986\ue987\ue988\ue989\ue98a\ue98b\ue98c\ue98d\ue98e\ue98f\ue990\ue991\ue992\ue993\ue994\ue995\ue996\ue997\ue998\ue999\ue99a\ue99b\ue99c\ue99d\ue99e\ue99f\ue9a0\ue9a1\ue9a2\ue9a3\ue9a4\ue9a5\ue9a6\ue9a7\ue9a8\ue9a9\ue9aa\ue9ab\ue9ac\ue9ad\ue9ae\ue9af\ue9b0\ue9b1\ue9b2\ue9b3\ue9b4\ue9b5\ue9b6\ue9b7\ue9b8\ue9b9\ue9ba\ue9bb\ue9bc\ue9bd\ue9be\ue9bf\ue9c0\ue9c1\ue9c2\ue9c3\ue9c4\ue9c5\ue9c6\ue9c7\ue9c8\ue9c9\ue9ca\ue9cb\ue9cc\ue9cd\ue9ce\ue9cf\ue9d0\ue9d1\ue9d2\ue9d3\ue9d4\ue9d5\ue9d6\ue9d7\ue9d8\ue9d9\ue9da\ue9db\ue9dc\ue9dd\ue9de\ue9df\ue9e0\ue9e1\ue9e2\ue9e3\ue9e4\ue9e5\ue9e6\ue9e7\ue9e8\ue9e9\ue9ea\ue9eb\ue9ec\ue9ed\ue9ee\ue9ef\ue9f0\ue9f1\ue9f2\ue9f3\ue9f4\ue9f5\ue9f6\ue9f7\ue9f8\ue9f9\ue9fa\ue9fb\ue9fc\ue9fd\ue9fe\ue9ff\uea00\uea01\uea02\uea03\uea04\uea05\uea06\uea07\uea08\uea09\uea0a\uea0b\uea0c\uea0d\uea0e\uea0f\uea10\uea11\uea12\uea13\uea14\uea15\uea16\uea17\uea18\uea19\uea1a\uea1b\uea1c\uea1d\uea1e\uea1f\uea20\uea21\uea22\uea23\uea24\uea25\uea26\uea27\uea28\uea29\uea2a\uea2b\uea2c\uea2d\uea2e\uea2f\uea30\uea31\uea32\uea33\uea34\uea35\uea36\uea37\uea38\uea39\uea3a\uea3b\uea3c\uea3d\uea3e\uea3f\uea40\uea41\uea42\uea43\uea44\uea45\uea46\uea47\uea48\uea49\uea4a\uea4b\uea4c\uea4d\uea4e\uea4f\uea50\uea51\uea52\uea53\uea54\uea55\uea56\uea57\uea58\uea59\uea5a\uea5b\uea5c\uea5d\uea5e\uea5f\uea60\uea61\uea62\uea63\uea64\uea65\uea66\uea67\uea68\uea69\uea6a\uea6b\uea6c\uea6d\uea6e\uea6f\uea70\uea71\uea72\uea73\uea74\uea75\uea76\uea77\uea78\uea79\uea7a\uea7b\uea7c\uea7d\uea7e\uea7f\uea80\uea81\uea82\uea83\uea84\uea85\uea86\uea87\uea88\uea89\uea8a\uea8b\uea8c\uea8d\uea8e\uea8f\uea90\uea91\uea92\uea93\uea94\uea95\uea96\uea97\uea98\uea99\uea9a\uea9b\uea9c\uea9d\uea9e\uea9f\ueaa0\ueaa1\ueaa2\ueaa3\ueaa4\ueaa5\ueaa6\ueaa7\ueaa8\ueaa9\ueaaa\ueaab\ueaac\ueaad\ueaae\ueaaf\ueab0\ueab1\ueab2\ueab3\ueab4\ueab5\ueab6\ueab7\ueab8\ueab9\ueaba\ueabb\ueabc\ueabd\ueabe\ueabf\ueac0\ueac1\ueac2\ueac3\ueac4\ueac5\ueac6\ueac7\ueac8\ueac9\ueaca\ueacb\ueacc\ueacd\ueace\ueacf\uead0\uead1\uead2\uead3\uead4\uead5\uead6\uead7\uead8\uead9\ueada\ueadb\ueadc\ueadd\ueade\ueadf\ueae0\ueae1\ueae2\ueae3\ueae4\ueae5\ueae6\ueae7\ueae8\ueae9\ueaea\ueaeb\ueaec\ueaed\ueaee\ueaef\ueaf0\ueaf1\ueaf2\ueaf3\ueaf4\ueaf5\ueaf6\ueaf7\ueaf8\ueaf9\ueafa\ueafb\ueafc\ueafd\ueafe\ueaff\ueb00\ueb01\ueb02\ueb03\ueb04\ueb05\ueb06\ueb07\ueb08\ueb09\ueb0a\ueb0b\ueb0c\ueb0d\ueb0e\ueb0f\ueb10\ueb11\ueb12\ueb13\ueb14\ueb15\ueb16\ueb17\ueb18\ueb19\ueb1a\ueb1b\ueb1c\ueb1d\ueb1e\ueb1f\ueb20\ueb21\ueb22\ueb23\ueb24\ueb25\ueb26\ueb27\ueb28\ueb29\ueb2a\ueb2b\ueb2c\ueb2d\ueb2e\ueb2f\ueb30\ueb31\ueb32\ueb33\ueb34\ueb35\ueb36\ueb37\ueb38\ueb39\ueb3a\ueb3b\ueb3c\ueb3d\ueb3e\ueb3f\ueb40\ueb41\ueb42\ueb43\ueb44\ueb45\ueb46\ueb47\ueb48\ueb49\ueb4a\ueb4b\ueb4c\ueb4d\ueb4e\ueb4f\ueb50\ueb51\ueb52\ueb53\ueb54\ueb55\ueb56\ueb57\ueb58\ueb59\ueb5a\ueb5b\ueb5c\ueb5d\ueb5e\ueb5f\ueb60\ueb61\ueb62\ueb63\ueb64\ueb65\ueb66\ueb67\ueb68\ueb69\ueb6a\ueb6b\ueb6c\ueb6d\ueb6e\ueb6f\ueb70\ueb71\ueb72\ueb73\ueb74\ueb75\ueb76\ueb77\ueb78\ueb79\ueb7a\ueb7b\ueb7c\ueb7d\ueb7e\ueb7f\ueb80\ueb81\ueb82\ueb83\ueb84\ueb85\ueb86\ueb87\ueb88\ueb89\ueb8a\ueb8b\ueb8c\ueb8d\ueb8e\ueb8f\ueb90\ueb91\ueb92\ueb93\ueb94\ueb95\ueb96\ueb97\ueb98\ueb99\ueb9a\ueb9b\ueb9c\ueb9d\ueb9e\ueb9f\ueba0\ueba1\ueba2\ueba3\ueba4\ueba5\ueba6\ueba7\ueba8\ueba9\uebaa\uebab\uebac\uebad\uebae\uebaf\uebb0\uebb1\uebb2\uebb3\uebb4\uebb5\uebb6\uebb7\uebb8\uebb9\uebba\uebbb\uebbc\uebbd\uebbe\uebbf\uebc0\uebc1\uebc2\uebc3\uebc4\uebc5\uebc6\uebc7\uebc8\uebc9\uebca\uebcb\uebcc\uebcd\uebce\uebcf\uebd0\uebd1\uebd2\uebd3\uebd4\uebd5\uebd6\uebd7\uebd8\uebd9\uebda\uebdb\uebdc\uebdd\uebde\uebdf\uebe0\uebe1\uebe2\uebe3\uebe4\uebe5\uebe6\uebe7\uebe8\uebe9\uebea\uebeb\uebec\uebed\uebee\uebef\uebf0\uebf1\uebf2\uebf3\uebf4\uebf5\uebf6\uebf7\uebf8\uebf9\uebfa\uebfb\uebfc\uebfd\uebfe\uebff\uec00\uec01\uec02\uec03\uec04\uec05\uec06\uec07\uec08\uec09\uec0a\uec0b\uec0c\uec0d\uec0e\uec0f\uec10\uec11\uec12\uec13\uec14\uec15\uec16\uec17\uec18\uec19\uec1a\uec1b\uec1c\uec1d\uec1e\uec1f\uec20\uec21\uec22\uec23\uec24\uec25\uec26\uec27\uec28\uec29\uec2a\uec2b\uec2c\uec2d\uec2e\uec2f\uec30\uec31\uec32\uec33\uec34\uec35\uec36\uec37\uec38\uec39\uec3a\uec3b\uec3c\uec3d\uec3e\uec3f\uec40\uec41\uec42\uec43\uec44\uec45\uec46\uec47\uec48\uec49\uec4a\uec4b\uec4c\uec4d\uec4e\uec4f\uec50\uec51\uec52\uec53\uec54\uec55\uec56\uec57\uec58\uec59\uec5a\uec5b\uec5c\uec5d\uec5e\uec5f\uec60\uec61\uec62\uec63\uec64\uec65\uec66\uec67\uec68\uec69\uec6a\uec6b\uec6c\uec6d\uec6e\uec6f\uec70\uec71\uec72\uec73\uec74\uec75\uec76\uec77\uec78\uec79\uec7a\uec7b\uec7c\uec7d\uec7e\uec7f\uec80\uec81\uec82\uec83\uec84\uec85\uec86\uec87\uec88\uec89\uec8a\uec8b\uec8c\uec8d\uec8e\uec8f\uec90\uec91\uec92\uec93\uec94\uec95\uec96\uec97\uec98\uec99\uec9a\uec9b\uec9c\uec9d\uec9e\uec9f\ueca0\ueca1\ueca2\ueca3\ueca4\ueca5\ueca6\ueca7\ueca8\ueca9\uecaa\uecab\uecac\uecad\uecae\uecaf\uecb0\uecb1\uecb2\uecb3\uecb4\uecb5\uecb6\uecb7\uecb8\uecb9\uecba\uecbb\uecbc\uecbd\uecbe\uecbf\uecc0\uecc1\uecc2\uecc3\uecc4\uecc5\uecc6\uecc7\uecc8\uecc9\uecca\ueccb\ueccc\ueccd\uecce\ueccf\uecd0\uecd1\uecd2\uecd3\uecd4\uecd5\uecd6\uecd7\uecd8\uecd9\uecda\uecdb\uecdc\uecdd\uecde\uecdf\uece0\uece1\uece2\uece3\uece4\uece5\uece6\uece7\uece8\uece9\uecea\ueceb\uecec\ueced\uecee\uecef\uecf0\uecf1\uecf2\uecf3\uecf4\uecf5\uecf6\uecf7\uecf8\uecf9\uecfa\uecfb\uecfc\uecfd\uecfe\uecff\ued00\ued01\ued02\ued03\ued04\ued05\ued06\ued07\ued08\ued09\ued0a\ued0b\ued0c\ued0d\ued0e\ued0f\ued10\ued11\ued12\ued13\ued14\ued15\ued16\ued17\ued18\ued19\ued1a\ued1b\ued1c\ued1d\ued1e\ued1f\ued20\ued21\ued22\ued23\ued24\ued25\ued26\ued27\ued28\ued29\ued2a\ued2b\ued2c\ued2d\ued2e\ued2f\ued30\ued31\ued32\ued33\ued34\ued35\ued36\ued37\ued38\ued39\ued3a\ued3b\ued3c\ued3d\ued3e\ued3f\ued40\ued41\ued42\ued43\ued44\ued45\ued46\ued47\ued48\ued49\ued4a\ued4b\ued4c\ued4d\ued4e\ued4f\ued50\ued51\ued52\ued53\ued54\ued55\ued56\ued57\ued58\ued59\ued5a\ued5b\ued5c\ued5d\ued5e\ued5f\ued60\ued61\ued62\ued63\ued64\ued65\ued66\ued67\ued68\ued69\ued6a\ued6b\ued6c\ued6d\ued6e\ued6f\ued70\ued71\ued72\ued73\ued74\ued75\ued76\ued77\ued78\ued79\ued7a\ued7b\ued7c\ued7d\ued7e\ued7f\ued80\ued81\ued82\ued83\ued84\ued85\ued86\ued87\ued88\ued89\ued8a\ued8b\ued8c\ued8d\ued8e\ued8f\ued90\ued91\ued92\ued93\ued94\ued95\ued96\ued97\ued98\ued99\ued9a\ued9b\ued9c\ued9d\ued9e\ued9f\ueda0\ueda1\ueda2\ueda3\ueda4\ueda5\ueda6\ueda7\ueda8\ueda9\uedaa\uedab\uedac\uedad\uedae\uedaf\uedb0\uedb1\uedb2\uedb3\uedb4\uedb5\uedb6\uedb7\uedb8\uedb9\uedba\uedbb\uedbc\uedbd\uedbe\uedbf\uedc0\uedc1\uedc2\uedc3\uedc4\uedc5\uedc6\uedc7\uedc8\uedc9\uedca\uedcb\uedcc\uedcd\uedce\uedcf\uedd0\uedd1\uedd2\uedd3\uedd4\uedd5\uedd6\uedd7\uedd8\uedd9\uedda\ueddb\ueddc\ueddd\uedde\ueddf\uede0\uede1\uede2\uede3\uede4\uede5\uede6\uede7\uede8\uede9\uedea\uedeb\uedec\ueded\uedee\uedef\uedf0\uedf1\uedf2\uedf3\uedf4\uedf5\uedf6\uedf7\uedf8\uedf9\uedfa\uedfb\uedfc\uedfd\uedfe\uedff\uee00\uee01\uee02\uee03\uee04\uee05\uee06\uee07\uee08\uee09\uee0a\uee0b\uee0c\uee0d\uee0e\uee0f\uee10\uee11\uee12\uee13\uee14\uee15\uee16\uee17\uee18\uee19\uee1a\uee1b\uee1c\uee1d\uee1e\uee1f\uee20\uee21\uee22\uee23\uee24\uee25\uee26\uee27\uee28\uee29\uee2a\uee2b\uee2c\uee2d\uee2e\uee2f\uee30\uee31\uee32\uee33\uee34\uee35\uee36\uee37\uee38\uee39\uee3a\uee3b\uee3c\uee3d\uee3e\uee3f\uee40\uee41\uee42\uee43\uee44\uee45\uee46\uee47\uee48\uee49\uee4a\uee4b\uee4c\uee4d\uee4e\uee4f\uee50\uee51\uee52\uee53\uee54\uee55\uee56\uee57\uee58\uee59\uee5a\uee5b\uee5c\uee5d\uee5e\uee5f\uee60\uee61\uee62\uee63\uee64\uee65\uee66\uee67\uee68\uee69\uee6a\uee6b\uee6c\uee6d\uee6e\uee6f\uee70\uee71\uee72\uee73\uee74\uee75\uee76\uee77\uee78\uee79\uee7a\uee7b\uee7c\uee7d\uee7e\uee7f\uee80\uee81\uee82\uee83\uee84\uee85\uee86\uee87\uee88\uee89\uee8a\uee8b\uee8c\uee8d\uee8e\uee8f\uee90\uee91\uee92\uee93\uee94\uee95\uee96\uee97\uee98\uee99\uee9a\uee9b\uee9c\uee9d\uee9e\uee9f\ueea0\ueea1\ueea2\ueea3\ueea4\ueea5\ueea6\ueea7\ueea8\ueea9\ueeaa\ueeab\ueeac\ueead\ueeae\ueeaf\ueeb0\ueeb1\ueeb2\ueeb3\ueeb4\ueeb5\ueeb6\ueeb7\ueeb8\ueeb9\ueeba\ueebb\ueebc\ueebd\ueebe\ueebf\ueec0\ueec1\ueec2\ueec3\ueec4\ueec5\ueec6\ueec7\ueec8\ueec9\ueeca\ueecb\ueecc\ueecd\ueece\ueecf\ueed0\ueed1\ueed2\ueed3\ueed4\ueed5\ueed6\ueed7\ueed8\ueed9\ueeda\ueedb\ueedc\ueedd\ueede\ueedf\ueee0\ueee1\ueee2\ueee3\ueee4\ueee5\ueee6\ueee7\ueee8\ueee9\ueeea\ueeeb\ueeec\ueeed\ueeee\ueeef\ueef0\ueef1\ueef2\ueef3\ueef4\ueef5\ueef6\ueef7\ueef8\ueef9\ueefa\ueefb\ueefc\ueefd\ueefe\ueeff\uef00\uef01\uef02\uef03\uef04\uef05\uef06\uef07\uef08\uef09\uef0a\uef0b\uef0c\uef0d\uef0e\uef0f\uef10\uef11\uef12\uef13\uef14\uef15\uef16\uef17\uef18\uef19\uef1a\uef1b\uef1c\uef1d\uef1e\uef1f\uef20\uef21\uef22\uef23\uef24\uef25\uef26\uef27\uef28\uef29\uef2a\uef2b\uef2c\uef2d\uef2e\uef2f\uef30\uef31\uef32\uef33\uef34\uef35\uef36\uef37\uef38\uef39\uef3a\uef3b\uef3c\uef3d\uef3e\uef3f\uef40\uef41\uef42\uef43\uef44\uef45\uef46\uef47\uef48\uef49\uef4a\uef4b\uef4c\uef4d\uef4e\uef4f\uef50\uef51\uef52\uef53\uef54\uef55\uef56\uef57\uef58\uef59\uef5a\uef5b\uef5c\uef5d\uef5e\uef5f\uef60\uef61\uef62\uef63\uef64\uef65\uef66\uef67\uef68\uef69\uef6a\uef6b\uef6c\uef6d\uef6e\uef6f\uef70\uef71\uef72\uef73\uef74\uef75\uef76\uef77\uef78\uef79\uef7a\uef7b\uef7c\uef7d\uef7e\uef7f\uef80\uef81\uef82\uef83\uef84\uef85\uef86\uef87\uef88\uef89\uef8a\uef8b\uef8c\uef8d\uef8e\uef8f\uef90\uef91\uef92\uef93\uef94\uef95\uef96\uef97\uef98\uef99\uef9a\uef9b\uef9c\uef9d\uef9e\uef9f\uefa0\uefa1\uefa2\uefa3\uefa4\uefa5\uefa6\uefa7\uefa8\uefa9\uefaa\uefab\uefac\uefad\uefae\uefaf\uefb0\uefb1\uefb2\uefb3\uefb4\uefb5\uefb6\uefb7\uefb8\uefb9\uefba\uefbb\uefbc\uefbd\uefbe\uefbf\uefc0\uefc1\uefc2\uefc3\uefc4\uefc5\uefc6\uefc7\uefc8\uefc9\uefca\uefcb\uefcc\uefcd\uefce\uefcf\uefd0\uefd1\uefd2\uefd3\uefd4\uefd5\uefd6\uefd7\uefd8\uefd9\uefda\uefdb\uefdc\uefdd\uefde\uefdf\uefe0\uefe1\uefe2\uefe3\uefe4\uefe5\uefe6\uefe7\uefe8\uefe9\uefea\uefeb\uefec\uefed\uefee\uefef\ueff0\ueff1\ueff2\ueff3\ueff4\ueff5\ueff6\ueff7\ueff8\ueff9\ueffa\ueffb\ueffc\ueffd\ueffe\uefff\uf000\uf001\uf002\uf003\uf004\uf005\uf006\uf007\uf008\uf009\uf00a\uf00b\uf00c\uf00d\uf00e\uf00f\uf010\uf011\uf012\uf013\uf014\uf015\uf016\uf017\uf018\uf019\uf01a\uf01b\uf01c\uf01d\uf01e\uf01f\uf020\uf021\uf022\uf023\uf024\uf025\uf026\uf027\uf028\uf029\uf02a\uf02b\uf02c\uf02d\uf02e\uf02f\uf030\uf031\uf032\uf033\uf034\uf035\uf036\uf037\uf038\uf039\uf03a\uf03b\uf03c\uf03d\uf03e\uf03f\uf040\uf041\uf042\uf043\uf044\uf045\uf046\uf047\uf048\uf049\uf04a\uf04b\uf04c\uf04d\uf04e\uf04f\uf050\uf051\uf052\uf053\uf054\uf055\uf056\uf057\uf058\uf059\uf05a\uf05b\uf05c\uf05d\uf05e\uf05f\uf060\uf061\uf062\uf063\uf064\uf065\uf066\uf067\uf068\uf069\uf06a\uf06b\uf06c\uf06d\uf06e\uf06f\uf070\uf071\uf072\uf073\uf074\uf075\uf076\uf077\uf078\uf079\uf07a\uf07b\uf07c\uf07d\uf07e\uf07f\uf080\uf081\uf082\uf083\uf084\uf085\uf086\uf087\uf088\uf089\uf08a\uf08b\uf08c\uf08d\uf08e\uf08f\uf090\uf091\uf092\uf093\uf094\uf095\uf096\uf097\uf098\uf099\uf09a\uf09b\uf09c\uf09d\uf09e\uf09f\uf0a0\uf0a1\uf0a2\uf0a3\uf0a4\uf0a5\uf0a6\uf0a7\uf0a8\uf0a9\uf0aa\uf0ab\uf0ac\uf0ad\uf0ae\uf0af\uf0b0\uf0b1\uf0b2\uf0b3\uf0b4\uf0b5\uf0b6\uf0b7\uf0b8\uf0b9\uf0ba\uf0bb\uf0bc\uf0bd\uf0be\uf0bf\uf0c0\uf0c1\uf0c2\uf0c3\uf0c4\uf0c5\uf0c6\uf0c7\uf0c8\uf0c9\uf0ca\uf0cb\uf0cc\uf0cd\uf0ce\uf0cf\uf0d0\uf0d1\uf0d2\uf0d3\uf0d4\uf0d5\uf0d6\uf0d7\uf0d8\uf0d9\uf0da\uf0db\uf0dc\uf0dd\uf0de\uf0df\uf0e0\uf0e1\uf0e2\uf0e3\uf0e4\uf0e5\uf0e6\uf0e7\uf0e8\uf0e9\uf0ea\uf0eb\uf0ec\uf0ed\uf0ee\uf0ef\uf0f0\uf0f1\uf0f2\uf0f3\uf0f4\uf0f5\uf0f6\uf0f7\uf0f8\uf0f9\uf0fa\uf0fb\uf0fc\uf0fd\uf0fe\uf0ff\uf100\uf101\uf102\uf103\uf104\uf105\uf106\uf107\uf108\uf109\uf10a\uf10b\uf10c\uf10d\uf10e\uf10f\uf110\uf111\uf112\uf113\uf114\uf115\uf116\uf117\uf118\uf119\uf11a\uf11b\uf11c\uf11d\uf11e\uf11f\uf120\uf121\uf122\uf123\uf124\uf125\uf126\uf127\uf128\uf129\uf12a\uf12b\uf12c\uf12d\uf12e\uf12f\uf130\uf131\uf132\uf133\uf134\uf135\uf136\uf137\uf138\uf139\uf13a\uf13b\uf13c\uf13d\uf13e\uf13f\uf140\uf141\uf142\uf143\uf144\uf145\uf146\uf147\uf148\uf149\uf14a\uf14b\uf14c\uf14d\uf14e\uf14f\uf150\uf151\uf152\uf153\uf154\uf155\uf156\uf157\uf158\uf159\uf15a\uf15b\uf15c\uf15d\uf15e\uf15f\uf160\uf161\uf162\uf163\uf164\uf165\uf166\uf167\uf168\uf169\uf16a\uf16b\uf16c\uf16d\uf16e\uf16f\uf170\uf171\uf172\uf173\uf174\uf175\uf176\uf177\uf178\uf179\uf17a\uf17b\uf17c\uf17d\uf17e\uf17f\uf180\uf181\uf182\uf183\uf184\uf185\uf186\uf187\uf188\uf189\uf18a\uf18b\uf18c\uf18d\uf18e\uf18f\uf190\uf191\uf192\uf193\uf194\uf195\uf196\uf197\uf198\uf199\uf19a\uf19b\uf19c\uf19d\uf19e\uf19f\uf1a0\uf1a1\uf1a2\uf1a3\uf1a4\uf1a5\uf1a6\uf1a7\uf1a8\uf1a9\uf1aa\uf1ab\uf1ac\uf1ad\uf1ae\uf1af\uf1b0\uf1b1\uf1b2\uf1b3\uf1b4\uf1b5\uf1b6\uf1b7\uf1b8\uf1b9\uf1ba\uf1bb\uf1bc\uf1bd\uf1be\uf1bf\uf1c0\uf1c1\uf1c2\uf1c3\uf1c4\uf1c5\uf1c6\uf1c7\uf1c8\uf1c9\uf1ca\uf1cb\uf1cc\uf1cd\uf1ce\uf1cf\uf1d0\uf1d1\uf1d2\uf1d3\uf1d4\uf1d5\uf1d6\uf1d7\uf1d8\uf1d9\uf1da\uf1db\uf1dc\uf1dd\uf1de\uf1df\uf1e0\uf1e1\uf1e2\uf1e3\uf1e4\uf1e5\uf1e6\uf1e7\uf1e8\uf1e9\uf1ea\uf1eb\uf1ec\uf1ed\uf1ee\uf1ef\uf1f0\uf1f1\uf1f2\uf1f3\uf1f4\uf1f5\uf1f6\uf1f7\uf1f8\uf1f9\uf1fa\uf1fb\uf1fc\uf1fd\uf1fe\uf1ff\uf200\uf201\uf202\uf203\uf204\uf205\uf206\uf207\uf208\uf209\uf20a\uf20b\uf20c\uf20d\uf20e\uf20f\uf210\uf211\uf212\uf213\uf214\uf215\uf216\uf217\uf218\uf219\uf21a\uf21b\uf21c\uf21d\uf21e\uf21f\uf220\uf221\uf222\uf223\uf224\uf225\uf226\uf227\uf228\uf229\uf22a\uf22b\uf22c\uf22d\uf22e\uf22f\uf230\uf231\uf232\uf233\uf234\uf235\uf236\uf237\uf238\uf239\uf23a\uf23b\uf23c\uf23d\uf23e\uf23f\uf240\uf241\uf242\uf243\uf244\uf245\uf246\uf247\uf248\uf249\uf24a\uf24b\uf24c\uf24d\uf24e\uf24f\uf250\uf251\uf252\uf253\uf254\uf255\uf256\uf257\uf258\uf259\uf25a\uf25b\uf25c\uf25d\uf25e\uf25f\uf260\uf261\uf262\uf263\uf264\uf265\uf266\uf267\uf268\uf269\uf26a\uf26b\uf26c\uf26d\uf26e\uf26f\uf270\uf271\uf272\uf273\uf274\uf275\uf276\uf277\uf278\uf279\uf27a\uf27b\uf27c\uf27d\uf27e\uf27f\uf280\uf281\uf282\uf283\uf284\uf285\uf286\uf287\uf288\uf289\uf28a\uf28b\uf28c\uf28d\uf28e\uf28f\uf290\uf291\uf292\uf293\uf294\uf295\uf296\uf297\uf298\uf299\uf29a\uf29b\uf29c\uf29d\uf29e\uf29f\uf2a0\uf2a1\uf2a2\uf2a3\uf2a4\uf2a5\uf2a6\uf2a7\uf2a8\uf2a9\uf2aa\uf2ab\uf2ac\uf2ad\uf2ae\uf2af\uf2b0\uf2b1\uf2b2\uf2b3\uf2b4\uf2b5\uf2b6\uf2b7\uf2b8\uf2b9\uf2ba\uf2bb\uf2bc\uf2bd\uf2be\uf2bf\uf2c0\uf2c1\uf2c2\uf2c3\uf2c4\uf2c5\uf2c6\uf2c7\uf2c8\uf2c9\uf2ca\uf2cb\uf2cc\uf2cd\uf2ce\uf2cf\uf2d0\uf2d1\uf2d2\uf2d3\uf2d4\uf2d5\uf2d6\uf2d7\uf2d8\uf2d9\uf2da\uf2db\uf2dc\uf2dd\uf2de\uf2df\uf2e0\uf2e1\uf2e2\uf2e3\uf2e4\uf2e5\uf2e6\uf2e7\uf2e8\uf2e9\uf2ea\uf2eb\uf2ec\uf2ed\uf2ee\uf2ef\uf2f0\uf2f1\uf2f2\uf2f3\uf2f4\uf2f5\uf2f6\uf2f7\uf2f8\uf2f9\uf2fa\uf2fb\uf2fc\uf2fd\uf2fe\uf2ff\uf300\uf301\uf302\uf303\uf304\uf305\uf306\uf307\uf308\uf309\uf30a\uf30b\uf30c\uf30d\uf30e\uf30f\uf310\uf311\uf312\uf313\uf314\uf315\uf316\uf317\uf318\uf319\uf31a\uf31b\uf31c\uf31d\uf31e\uf31f\uf320\uf321\uf322\uf323\uf324\uf325\uf326\uf327\uf328\uf329\uf32a\uf32b\uf32c\uf32d\uf32e\uf32f\uf330\uf331\uf332\uf333\uf334\uf335\uf336\uf337\uf338\uf339\uf33a\uf33b\uf33c\uf33d\uf33e\uf33f\uf340\uf341\uf342\uf343\uf344\uf345\uf346\uf347\uf348\uf349\uf34a\uf34b\uf34c\uf34d\uf34e\uf34f\uf350\uf351\uf352\uf353\uf354\uf355\uf356\uf357\uf358\uf359\uf35a\uf35b\uf35c\uf35d\uf35e\uf35f\uf360\uf361\uf362\uf363\uf364\uf365\uf366\uf367\uf368\uf369\uf36a\uf36b\uf36c\uf36d\uf36e\uf36f\uf370\uf371\uf372\uf373\uf374\uf375\uf376\uf377\uf378\uf379\uf37a\uf37b\uf37c\uf37d\uf37e\uf37f\uf380\uf381\uf382\uf383\uf384\uf385\uf386\uf387\uf388\uf389\uf38a\uf38b\uf38c\uf38d\uf38e\uf38f\uf390\uf391\uf392\uf393\uf394\uf395\uf396\uf397\uf398\uf399\uf39a\uf39b\uf39c\uf39d\uf39e\uf39f\uf3a0\uf3a1\uf3a2\uf3a3\uf3a4\uf3a5\uf3a6\uf3a7\uf3a8\uf3a9\uf3aa\uf3ab\uf3ac\uf3ad\uf3ae\uf3af\uf3b0\uf3b1\uf3b2\uf3b3\uf3b4\uf3b5\uf3b6\uf3b7\uf3b8\uf3b9\uf3ba\uf3bb\uf3bc\uf3bd\uf3be\uf3bf\uf3c0\uf3c1\uf3c2\uf3c3\uf3c4\uf3c5\uf3c6\uf3c7\uf3c8\uf3c9\uf3ca\uf3cb\uf3cc\uf3cd\uf3ce\uf3cf\uf3d0\uf3d1\uf3d2\uf3d3\uf3d4\uf3d5\uf3d6\uf3d7\uf3d8\uf3d9\uf3da\uf3db\uf3dc\uf3dd\uf3de\uf3df\uf3e0\uf3e1\uf3e2\uf3e3\uf3e4\uf3e5\uf3e6\uf3e7\uf3e8\uf3e9\uf3ea\uf3eb\uf3ec\uf3ed\uf3ee\uf3ef\uf3f0\uf3f1\uf3f2\uf3f3\uf3f4\uf3f5\uf3f6\uf3f7\uf3f8\uf3f9\uf3fa\uf3fb\uf3fc\uf3fd\uf3fe\uf3ff\uf400\uf401\uf402\uf403\uf404\uf405\uf406\uf407\uf408\uf409\uf40a\uf40b\uf40c\uf40d\uf40e\uf40f\uf410\uf411\uf412\uf413\uf414\uf415\uf416\uf417\uf418\uf419\uf41a\uf41b\uf41c\uf41d\uf41e\uf41f\uf420\uf421\uf422\uf423\uf424\uf425\uf426\uf427\uf428\uf429\uf42a\uf42b\uf42c\uf42d\uf42e\uf42f\uf430\uf431\uf432\uf433\uf434\uf435\uf436\uf437\uf438\uf439\uf43a\uf43b\uf43c\uf43d\uf43e\uf43f\uf440\uf441\uf442\uf443\uf444\uf445\uf446\uf447\uf448\uf449\uf44a\uf44b\uf44c\uf44d\uf44e\uf44f\uf450\uf451\uf452\uf453\uf454\uf455\uf456\uf457\uf458\uf459\uf45a\uf45b\uf45c\uf45d\uf45e\uf45f\uf460\uf461\uf462\uf463\uf464\uf465\uf466\uf467\uf468\uf469\uf46a\uf46b\uf46c\uf46d\uf46e\uf46f\uf470\uf471\uf472\uf473\uf474\uf475\uf476\uf477\uf478\uf479\uf47a\uf47b\uf47c\uf47d\uf47e\uf47f\uf480\uf481\uf482\uf483\uf484\uf485\uf486\uf487\uf488\uf489\uf48a\uf48b\uf48c\uf48d\uf48e\uf48f\uf490\uf491\uf492\uf493\uf494\uf495\uf496\uf497\uf498\uf499\uf49a\uf49b\uf49c\uf49d\uf49e\uf49f\uf4a0\uf4a1\uf4a2\uf4a3\uf4a4\uf4a5\uf4a6\uf4a7\uf4a8\uf4a9\uf4aa\uf4ab\uf4ac\uf4ad\uf4ae\uf4af\uf4b0\uf4b1\uf4b2\uf4b3\uf4b4\uf4b5\uf4b6\uf4b7\uf4b8\uf4b9\uf4ba\uf4bb\uf4bc\uf4bd\uf4be\uf4bf\uf4c0\uf4c1\uf4c2\uf4c3\uf4c4\uf4c5\uf4c6\uf4c7\uf4c8\uf4c9\uf4ca\uf4cb\uf4cc\uf4cd\uf4ce\uf4cf\uf4d0\uf4d1\uf4d2\uf4d3\uf4d4\uf4d5\uf4d6\uf4d7\uf4d8\uf4d9\uf4da\uf4db\uf4dc\uf4dd\uf4de\uf4df\uf4e0\uf4e1\uf4e2\uf4e3\uf4e4\uf4e5\uf4e6\uf4e7\uf4e8\uf4e9\uf4ea\uf4eb\uf4ec\uf4ed\uf4ee\uf4ef\uf4f0\uf4f1\uf4f2\uf4f3\uf4f4\uf4f5\uf4f6\uf4f7\uf4f8\uf4f9\uf4fa\uf4fb\uf4fc\uf4fd\uf4fe\uf4ff\uf500\uf501\uf502\uf503\uf504\uf505\uf506\uf507\uf508\uf509\uf50a\uf50b\uf50c\uf50d\uf50e\uf50f\uf510\uf511\uf512\uf513\uf514\uf515\uf516\uf517\uf518\uf519\uf51a\uf51b\uf51c\uf51d\uf51e\uf51f\uf520\uf521\uf522\uf523\uf524\uf525\uf526\uf527\uf528\uf529\uf52a\uf52b\uf52c\uf52d\uf52e\uf52f\uf530\uf531\uf532\uf533\uf534\uf535\uf536\uf537\uf538\uf539\uf53a\uf53b\uf53c\uf53d\uf53e\uf53f\uf540\uf541\uf542\uf543\uf544\uf545\uf546\uf547\uf548\uf549\uf54a\uf54b\uf54c\uf54d\uf54e\uf54f\uf550\uf551\uf552\uf553\uf554\uf555\uf556\uf557\uf558\uf559\uf55a\uf55b\uf55c\uf55d\uf55e\uf55f\uf560\uf561\uf562\uf563\uf564\uf565\uf566\uf567\uf568\uf569\uf56a\uf56b\uf56c\uf56d\uf56e\uf56f\uf570\uf571\uf572\uf573\uf574\uf575\uf576\uf577\uf578\uf579\uf57a\uf57b\uf57c\uf57d\uf57e\uf57f\uf580\uf581\uf582\uf583\uf584\uf585\uf586\uf587\uf588\uf589\uf58a\uf58b\uf58c\uf58d\uf58e\uf58f\uf590\uf591\uf592\uf593\uf594\uf595\uf596\uf597\uf598\uf599\uf59a\uf59b\uf59c\uf59d\uf59e\uf59f\uf5a0\uf5a1\uf5a2\uf5a3\uf5a4\uf5a5\uf5a6\uf5a7\uf5a8\uf5a9\uf5aa\uf5ab\uf5ac\uf5ad\uf5ae\uf5af\uf5b0\uf5b1\uf5b2\uf5b3\uf5b4\uf5b5\uf5b6\uf5b7\uf5b8\uf5b9\uf5ba\uf5bb\uf5bc\uf5bd\uf5be\uf5bf\uf5c0\uf5c1\uf5c2\uf5c3\uf5c4\uf5c5\uf5c6\uf5c7\uf5c8\uf5c9\uf5ca\uf5cb\uf5cc\uf5cd\uf5ce\uf5cf\uf5d0\uf5d1\uf5d2\uf5d3\uf5d4\uf5d5\uf5d6\uf5d7\uf5d8\uf5d9\uf5da\uf5db\uf5dc\uf5dd\uf5de\uf5df\uf5e0\uf5e1\uf5e2\uf5e3\uf5e4\uf5e5\uf5e6\uf5e7\uf5e8\uf5e9\uf5ea\uf5eb\uf5ec\uf5ed\uf5ee\uf5ef\uf5f0\uf5f1\uf5f2\uf5f3\uf5f4\uf5f5\uf5f6\uf5f7\uf5f8\uf5f9\uf5fa\uf5fb\uf5fc\uf5fd\uf5fe\uf5ff\uf600\uf601\uf602\uf603\uf604\uf605\uf606\uf607\uf608\uf609\uf60a\uf60b\uf60c\uf60d\uf60e\uf60f\uf610\uf611\uf612\uf613\uf614\uf615\uf616\uf617\uf618\uf619\uf61a\uf61b\uf61c\uf61d\uf61e\uf61f\uf620\uf621\uf622\uf623\uf624\uf625\uf626\uf627\uf628\uf629\uf62a\uf62b\uf62c\uf62d\uf62e\uf62f\uf630\uf631\uf632\uf633\uf634\uf635\uf636\uf637\uf638\uf639\uf63a\uf63b\uf63c\uf63d\uf63e\uf63f\uf640\uf641\uf642\uf643\uf644\uf645\uf646\uf647\uf648\uf649\uf64a\uf64b\uf64c\uf64d\uf64e\uf64f\uf650\uf651\uf652\uf653\uf654\uf655\uf656\uf657\uf658\uf659\uf65a\uf65b\uf65c\uf65d\uf65e\uf65f\uf660\uf661\uf662\uf663\uf664\uf665\uf666\uf667\uf668\uf669\uf66a\uf66b\uf66c\uf66d\uf66e\uf66f\uf670\uf671\uf672\uf673\uf674\uf675\uf676\uf677\uf678\uf679\uf67a\uf67b\uf67c\uf67d\uf67e\uf67f\uf680\uf681\uf682\uf683\uf684\uf685\uf686\uf687\uf688\uf689\uf68a\uf68b\uf68c\uf68d\uf68e\uf68f\uf690\uf691\uf692\uf693\uf694\uf695\uf696\uf697\uf698\uf699\uf69a\uf69b\uf69c\uf69d\uf69e\uf69f\uf6a0\uf6a1\uf6a2\uf6a3\uf6a4\uf6a5\uf6a6\uf6a7\uf6a8\uf6a9\uf6aa\uf6ab\uf6ac\uf6ad\uf6ae\uf6af\uf6b0\uf6b1\uf6b2\uf6b3\uf6b4\uf6b5\uf6b6\uf6b7\uf6b8\uf6b9\uf6ba\uf6bb\uf6bc\uf6bd\uf6be\uf6bf\uf6c0\uf6c1\uf6c2\uf6c3\uf6c4\uf6c5\uf6c6\uf6c7\uf6c8\uf6c9\uf6ca\uf6cb\uf6cc\uf6cd\uf6ce\uf6cf\uf6d0\uf6d1\uf6d2\uf6d3\uf6d4\uf6d5\uf6d6\uf6d7\uf6d8\uf6d9\uf6da\uf6db\uf6dc\uf6dd\uf6de\uf6df\uf6e0\uf6e1\uf6e2\uf6e3\uf6e4\uf6e5\uf6e6\uf6e7\uf6e8\uf6e9\uf6ea\uf6eb\uf6ec\uf6ed\uf6ee\uf6ef\uf6f0\uf6f1\uf6f2\uf6f3\uf6f4\uf6f5\uf6f6\uf6f7\uf6f8\uf6f9\uf6fa\uf6fb\uf6fc\uf6fd\uf6fe\uf6ff\uf700\uf701\uf702\uf703\uf704\uf705\uf706\uf707\uf708\uf709\uf70a\uf70b\uf70c\uf70d\uf70e\uf70f\uf710\uf711\uf712\uf713\uf714\uf715\uf716\uf717\uf718\uf719\uf71a\uf71b\uf71c\uf71d\uf71e\uf71f\uf720\uf721\uf722\uf723\uf724\uf725\uf726\uf727\uf728\uf729\uf72a\uf72b\uf72c\uf72d\uf72e\uf72f\uf730\uf731\uf732\uf733\uf734\uf735\uf736\uf737\uf738\uf739\uf73a\uf73b\uf73c\uf73d\uf73e\uf73f\uf740\uf741\uf742\uf743\uf744\uf745\uf746\uf747\uf748\uf749\uf74a\uf74b\uf74c\uf74d\uf74e\uf74f\uf750\uf751\uf752\uf753\uf754\uf755\uf756\uf757\uf758\uf759\uf75a\uf75b\uf75c\uf75d\uf75e\uf75f\uf760\uf761\uf762\uf763\uf764\uf765\uf766\uf767\uf768\uf769\uf76a\uf76b\uf76c\uf76d\uf76e\uf76f\uf770\uf771\uf772\uf773\uf774\uf775\uf776\uf777\uf778\uf779\uf77a\uf77b\uf77c\uf77d\uf77e\uf77f\uf780\uf781\uf782\uf783\uf784\uf785\uf786\uf787\uf788\uf789\uf78a\uf78b\uf78c\uf78d\uf78e\uf78f\uf790\uf791\uf792\uf793\uf794\uf795\uf796\uf797\uf798\uf799\uf79a\uf79b\uf79c\uf79d\uf79e\uf79f\uf7a0\uf7a1\uf7a2\uf7a3\uf7a4\uf7a5\uf7a6\uf7a7\uf7a8\uf7a9\uf7aa\uf7ab\uf7ac\uf7ad\uf7ae\uf7af\uf7b0\uf7b1\uf7b2\uf7b3\uf7b4\uf7b5\uf7b6\uf7b7\uf7b8\uf7b9\uf7ba\uf7bb\uf7bc\uf7bd\uf7be\uf7bf\uf7c0\uf7c1\uf7c2\uf7c3\uf7c4\uf7c5\uf7c6\uf7c7\uf7c8\uf7c9\uf7ca\uf7cb\uf7cc\uf7cd\uf7ce\uf7cf\uf7d0\uf7d1\uf7d2\uf7d3\uf7d4\uf7d5\uf7d6\uf7d7\uf7d8\uf7d9\uf7da\uf7db\uf7dc\uf7dd\uf7de\uf7df\uf7e0\uf7e1\uf7e2\uf7e3\uf7e4\uf7e5\uf7e6\uf7e7\uf7e8\uf7e9\uf7ea\uf7eb\uf7ec\uf7ed\uf7ee\uf7ef\uf7f0\uf7f1\uf7f2\uf7f3\uf7f4\uf7f5\uf7f6\uf7f7\uf7f8\uf7f9\uf7fa\uf7fb\uf7fc\uf7fd\uf7fe\uf7ff\uf800\uf801\uf802\uf803\uf804\uf805\uf806\uf807\uf808\uf809\uf80a\uf80b\uf80c\uf80d\uf80e\uf80f\uf810\uf811\uf812\uf813\uf814\uf815\uf816\uf817\uf818\uf819\uf81a\uf81b\uf81c\uf81d\uf81e\uf81f\uf820\uf821\uf822\uf823\uf824\uf825\uf826\uf827\uf828\uf829\uf82a\uf82b\uf82c\uf82d\uf82e\uf82f\uf830\uf831\uf832\uf833\uf834\uf835\uf836\uf837\uf838\uf839\uf83a\uf83b\uf83c\uf83d\uf83e\uf83f\uf840\uf841\uf842\uf843\uf844\uf845\uf846\uf847\uf848\uf849\uf84a\uf84b\uf84c\uf84d\uf84e\uf84f\uf850\uf851\uf852\uf853\uf854\uf855\uf856\uf857\uf858\uf859\uf85a\uf85b\uf85c\uf85d\uf85e\uf85f\uf860\uf861\uf862\uf863\uf864\uf865\uf866\uf867\uf868\uf869\uf86a\uf86b\uf86c\uf86d\uf86e\uf86f\uf870\uf871\uf872\uf873\uf874\uf875\uf876\uf877\uf878\uf879\uf87a\uf87b\uf87c\uf87d\uf87e\uf87f\uf880\uf881\uf882\uf883\uf884\uf885\uf886\uf887\uf888\uf889\uf88a\uf88b\uf88c\uf88d\uf88e\uf88f\uf890\uf891\uf892\uf893\uf894\uf895\uf896\uf897\uf898\uf899\uf89a\uf89b\uf89c\uf89d\uf89e\uf89f\uf8a0\uf8a1\uf8a2\uf8a3\uf8a4\uf8a5\uf8a6\uf8a7\uf8a8\uf8a9\uf8aa\uf8ab\uf8ac\uf8ad\uf8ae\uf8af\uf8b0\uf8b1\uf8b2\uf8b3\uf8b4\uf8b5\uf8b6\uf8b7\uf8b8\uf8b9\uf8ba\uf8bb\uf8bc\uf8bd\uf8be\uf8bf\uf8c0\uf8c1\uf8c2\uf8c3\uf8c4\uf8c5\uf8c6\uf8c7\uf8c8\uf8c9\uf8ca\uf8cb\uf8cc\uf8cd\uf8ce\uf8cf\uf8d0\uf8d1\uf8d2\uf8d3\uf8d4\uf8d5\uf8d6\uf8d7\uf8d8\uf8d9\uf8da\uf8db\uf8dc\uf8dd\uf8de\uf8df\uf8e0\uf8e1\uf8e2\uf8e3\uf8e4\uf8e5\uf8e6\uf8e7\uf8e8\uf8e9\uf8ea\uf8eb\uf8ec\uf8ed\uf8ee\uf8ef\uf8f0\uf8f1\uf8f2\uf8f3\uf8f4\uf8f5\uf8f6\uf8f7\uf8f8\uf8f9\uf8fa\uf8fb\uf8fc\uf8fd\uf8fe\uf8ff' try: Cs = eval(r"'\ud800\ud801\ud802\ud803\ud804\ud805\ud806\ud807\ud808\ud809\ud80a\ud80b\ud80c\ud80d\ud80e\ud80f\ud810\ud811\ud812\ud813\ud814\ud815\ud816\ud817\ud818\ud819\ud81a\ud81b\ud81c\ud81d\ud81e\ud81f\ud820\ud821\ud822\ud823\ud824\ud825\ud826\ud827\ud828\ud829\ud82a\ud82b\ud82c\ud82d\ud82e\ud82f\ud830\ud831\ud832\ud833\ud834\ud835\ud836\ud837\ud838\ud839\ud83a\ud83b\ud83c\ud83d\ud83e\ud83f\ud840\ud841\ud842\ud843\ud844\ud845\ud846\ud847\ud848\ud849\ud84a\ud84b\ud84c\ud84d\ud84e\ud84f\ud850\ud851\ud852\ud853\ud854\ud855\ud856\ud857\ud858\ud859\ud85a\ud85b\ud85c\ud85d\ud85e\ud85f\ud860\ud861\ud862\ud863\ud864\ud865\ud866\ud867\ud868\ud869\ud86a\ud86b\ud86c\ud86d\ud86e\ud86f\ud870\ud871\ud872\ud873\ud874\ud875\ud876\ud877\ud878\ud879\ud87a\ud87b\ud87c\ud87d\ud87e\ud87f\ud880\ud881\ud882\ud883\ud884\ud885\ud886\ud887\ud888\ud889\ud88a\ud88b\ud88c\ud88d\ud88e\ud88f\ud890\ud891\ud892\ud893\ud894\ud895\ud896\ud897\ud898\ud899\ud89a\ud89b\ud89c\ud89d\ud89e\ud89f\ud8a0\ud8a1\ud8a2\ud8a3\ud8a4\ud8a5\ud8a6\ud8a7\ud8a8\ud8a9\ud8aa\ud8ab\ud8ac\ud8ad\ud8ae\ud8af\ud8b0\ud8b1\ud8b2\ud8b3\ud8b4\ud8b5\ud8b6\ud8b7\ud8b8\ud8b9\ud8ba\ud8bb\ud8bc\ud8bd\ud8be\ud8bf\ud8c0\ud8c1\ud8c2\ud8c3\ud8c4\ud8c5\ud8c6\ud8c7\ud8c8\ud8c9\ud8ca\ud8cb\ud8cc\ud8cd\ud8ce\ud8cf\ud8d0\ud8d1\ud8d2\ud8d3\ud8d4\ud8d5\ud8d6\ud8d7\ud8d8\ud8d9\ud8da\ud8db\ud8dc\ud8dd\ud8de\ud8df\ud8e0\ud8e1\ud8e2\ud8e3\ud8e4\ud8e5\ud8e6\ud8e7\ud8e8\ud8e9\ud8ea\ud8eb\ud8ec\ud8ed\ud8ee\ud8ef\ud8f0\ud8f1\ud8f2\ud8f3\ud8f4\ud8f5\ud8f6\ud8f7\ud8f8\ud8f9\ud8fa\ud8fb\ud8fc\ud8fd\ud8fe\ud8ff\ud900\ud901\ud902\ud903\ud904\ud905\ud906\ud907\ud908\ud909\ud90a\ud90b\ud90c\ud90d\ud90e\ud90f\ud910\ud911\ud912\ud913\ud914\ud915\ud916\ud917\ud918\ud919\ud91a\ud91b\ud91c\ud91d\ud91e\ud91f\ud920\ud921\ud922\ud923\ud924\ud925\ud926\ud927\ud928\ud929\ud92a\ud92b\ud92c\ud92d\ud92e\ud92f\ud930\ud931\ud932\ud933\ud934\ud935\ud936\ud937\ud938\ud939\ud93a\ud93b\ud93c\ud93d\ud93e\ud93f\ud940\ud941\ud942\ud943\ud944\ud945\ud946\ud947\ud948\ud949\ud94a\ud94b\ud94c\ud94d\ud94e\ud94f\ud950\ud951\ud952\ud953\ud954\ud955\ud956\ud957\ud958\ud959\ud95a\ud95b\ud95c\ud95d\ud95e\ud95f\ud960\ud961\ud962\ud963\ud964\ud965\ud966\ud967\ud968\ud969\ud96a\ud96b\ud96c\ud96d\ud96e\ud96f\ud970\ud971\ud972\ud973\ud974\ud975\ud976\ud977\ud978\ud979\ud97a\ud97b\ud97c\ud97d\ud97e\ud97f\ud980\ud981\ud982\ud983\ud984\ud985\ud986\ud987\ud988\ud989\ud98a\ud98b\ud98c\ud98d\ud98e\ud98f\ud990\ud991\ud992\ud993\ud994\ud995\ud996\ud997\ud998\ud999\ud99a\ud99b\ud99c\ud99d\ud99e\ud99f\ud9a0\ud9a1\ud9a2\ud9a3\ud9a4\ud9a5\ud9a6\ud9a7\ud9a8\ud9a9\ud9aa\ud9ab\ud9ac\ud9ad\ud9ae\ud9af\ud9b0\ud9b1\ud9b2\ud9b3\ud9b4\ud9b5\ud9b6\ud9b7\ud9b8\ud9b9\ud9ba\ud9bb\ud9bc\ud9bd\ud9be\ud9bf\ud9c0\ud9c1\ud9c2\ud9c3\ud9c4\ud9c5\ud9c6\ud9c7\ud9c8\ud9c9\ud9ca\ud9cb\ud9cc\ud9cd\ud9ce\ud9cf\ud9d0\ud9d1\ud9d2\ud9d3\ud9d4\ud9d5\ud9d6\ud9d7\ud9d8\ud9d9\ud9da\ud9db\ud9dc\ud9dd\ud9de\ud9df\ud9e0\ud9e1\ud9e2\ud9e3\ud9e4\ud9e5\ud9e6\ud9e7\ud9e8\ud9e9\ud9ea\ud9eb\ud9ec\ud9ed\ud9ee\ud9ef\ud9f0\ud9f1\ud9f2\ud9f3\ud9f4\ud9f5\ud9f6\ud9f7\ud9f8\ud9f9\ud9fa\ud9fb\ud9fc\ud9fd\ud9fe\ud9ff\uda00\uda01\uda02\uda03\uda04\uda05\uda06\uda07\uda08\uda09\uda0a\uda0b\uda0c\uda0d\uda0e\uda0f\uda10\uda11\uda12\uda13\uda14\uda15\uda16\uda17\uda18\uda19\uda1a\uda1b\uda1c\uda1d\uda1e\uda1f\uda20\uda21\uda22\uda23\uda24\uda25\uda26\uda27\uda28\uda29\uda2a\uda2b\uda2c\uda2d\uda2e\uda2f\uda30\uda31\uda32\uda33\uda34\uda35\uda36\uda37\uda38\uda39\uda3a\uda3b\uda3c\uda3d\uda3e\uda3f\uda40\uda41\uda42\uda43\uda44\uda45\uda46\uda47\uda48\uda49\uda4a\uda4b\uda4c\uda4d\uda4e\uda4f\uda50\uda51\uda52\uda53\uda54\uda55\uda56\uda57\uda58\uda59\uda5a\uda5b\uda5c\uda5d\uda5e\uda5f\uda60\uda61\uda62\uda63\uda64\uda65\uda66\uda67\uda68\uda69\uda6a\uda6b\uda6c\uda6d\uda6e\uda6f\uda70\uda71\uda72\uda73\uda74\uda75\uda76\uda77\uda78\uda79\uda7a\uda7b\uda7c\uda7d\uda7e\uda7f\uda80\uda81\uda82\uda83\uda84\uda85\uda86\uda87\uda88\uda89\uda8a\uda8b\uda8c\uda8d\uda8e\uda8f\uda90\uda91\uda92\uda93\uda94\uda95\uda96\uda97\uda98\uda99\uda9a\uda9b\uda9c\uda9d\uda9e\uda9f\udaa0\udaa1\udaa2\udaa3\udaa4\udaa5\udaa6\udaa7\udaa8\udaa9\udaaa\udaab\udaac\udaad\udaae\udaaf\udab0\udab1\udab2\udab3\udab4\udab5\udab6\udab7\udab8\udab9\udaba\udabb\udabc\udabd\udabe\udabf\udac0\udac1\udac2\udac3\udac4\udac5\udac6\udac7\udac8\udac9\udaca\udacb\udacc\udacd\udace\udacf\udad0\udad1\udad2\udad3\udad4\udad5\udad6\udad7\udad8\udad9\udada\udadb\udadc\udadd\udade\udadf\udae0\udae1\udae2\udae3\udae4\udae5\udae6\udae7\udae8\udae9\udaea\udaeb\udaec\udaed\udaee\udaef\udaf0\udaf1\udaf2\udaf3\udaf4\udaf5\udaf6\udaf7\udaf8\udaf9\udafa\udafb\udafc\udafd\udafe\udaff\udb00\udb01\udb02\udb03\udb04\udb05\udb06\udb07\udb08\udb09\udb0a\udb0b\udb0c\udb0d\udb0e\udb0f\udb10\udb11\udb12\udb13\udb14\udb15\udb16\udb17\udb18\udb19\udb1a\udb1b\udb1c\udb1d\udb1e\udb1f\udb20\udb21\udb22\udb23\udb24\udb25\udb26\udb27\udb28\udb29\udb2a\udb2b\udb2c\udb2d\udb2e\udb2f\udb30\udb31\udb32\udb33\udb34\udb35\udb36\udb37\udb38\udb39\udb3a\udb3b\udb3c\udb3d\udb3e\udb3f\udb40\udb41\udb42\udb43\udb44\udb45\udb46\udb47\udb48\udb49\udb4a\udb4b\udb4c\udb4d\udb4e\udb4f\udb50\udb51\udb52\udb53\udb54\udb55\udb56\udb57\udb58\udb59\udb5a\udb5b\udb5c\udb5d\udb5e\udb5f\udb60\udb61\udb62\udb63\udb64\udb65\udb66\udb67\udb68\udb69\udb6a\udb6b\udb6c\udb6d\udb6e\udb6f\udb70\udb71\udb72\udb73\udb74\udb75\udb76\udb77\udb78\udb79\udb7a\udb7b\udb7c\udb7d\udb7e\udb7f\udb80\udb81\udb82\udb83\udb84\udb85\udb86\udb87\udb88\udb89\udb8a\udb8b\udb8c\udb8d\udb8e\udb8f\udb90\udb91\udb92\udb93\udb94\udb95\udb96\udb97\udb98\udb99\udb9a\udb9b\udb9c\udb9d\udb9e\udb9f\udba0\udba1\udba2\udba3\udba4\udba5\udba6\udba7\udba8\udba9\udbaa\udbab\udbac\udbad\udbae\udbaf\udbb0\udbb1\udbb2\udbb3\udbb4\udbb5\udbb6\udbb7\udbb8\udbb9\udbba\udbbb\udbbc\udbbd\udbbe\udbbf\udbc0\udbc1\udbc2\udbc3\udbc4\udbc5\udbc6\udbc7\udbc8\udbc9\udbca\udbcb\udbcc\udbcd\udbce\udbcf\udbd0\udbd1\udbd2\udbd3\udbd4\udbd5\udbd6\udbd7\udbd8\udbd9\udbda\udbdb\udbdc\udbdd\udbde\udbdf\udbe0\udbe1\udbe2\udbe3\udbe4\udbe5\udbe6\udbe7\udbe8\udbe9\udbea\udbeb\udbec\udbed\udbee\udbef\udbf0\udbf1\udbf2\udbf3\udbf4\udbf5\udbf6\udbf7\udbf8\udbf9\udbfa\udbfb\udbfc\udbfd\udbfe\U0010fc00\udc01\udc02\udc03\udc04\udc05\udc06\udc07\udc08\udc09\udc0a\udc0b\udc0c\udc0d\udc0e\udc0f\udc10\udc11\udc12\udc13\udc14\udc15\udc16\udc17\udc18\udc19\udc1a\udc1b\udc1c\udc1d\udc1e\udc1f\udc20\udc21\udc22\udc23\udc24\udc25\udc26\udc27\udc28\udc29\udc2a\udc2b\udc2c\udc2d\udc2e\udc2f\udc30\udc31\udc32\udc33\udc34\udc35\udc36\udc37\udc38\udc39\udc3a\udc3b\udc3c\udc3d\udc3e\udc3f\udc40\udc41\udc42\udc43\udc44\udc45\udc46\udc47\udc48\udc49\udc4a\udc4b\udc4c\udc4d\udc4e\udc4f\udc50\udc51\udc52\udc53\udc54\udc55\udc56\udc57\udc58\udc59\udc5a\udc5b\udc5c\udc5d\udc5e\udc5f\udc60\udc61\udc62\udc63\udc64\udc65\udc66\udc67\udc68\udc69\udc6a\udc6b\udc6c\udc6d\udc6e\udc6f\udc70\udc71\udc72\udc73\udc74\udc75\udc76\udc77\udc78\udc79\udc7a\udc7b\udc7c\udc7d\udc7e\udc7f\udc80\udc81\udc82\udc83\udc84\udc85\udc86\udc87\udc88\udc89\udc8a\udc8b\udc8c\udc8d\udc8e\udc8f\udc90\udc91\udc92\udc93\udc94\udc95\udc96\udc97\udc98\udc99\udc9a\udc9b\udc9c\udc9d\udc9e\udc9f\udca0\udca1\udca2\udca3\udca4\udca5\udca6\udca7\udca8\udca9\udcaa\udcab\udcac\udcad\udcae\udcaf\udcb0\udcb1\udcb2\udcb3\udcb4\udcb5\udcb6\udcb7\udcb8\udcb9\udcba\udcbb\udcbc\udcbd\udcbe\udcbf\udcc0\udcc1\udcc2\udcc3\udcc4\udcc5\udcc6\udcc7\udcc8\udcc9\udcca\udccb\udccc\udccd\udcce\udccf\udcd0\udcd1\udcd2\udcd3\udcd4\udcd5\udcd6\udcd7\udcd8\udcd9\udcda\udcdb\udcdc\udcdd\udcde\udcdf\udce0\udce1\udce2\udce3\udce4\udce5\udce6\udce7\udce8\udce9\udcea\udceb\udcec\udced\udcee\udcef\udcf0\udcf1\udcf2\udcf3\udcf4\udcf5\udcf6\udcf7\udcf8\udcf9\udcfa\udcfb\udcfc\udcfd\udcfe\udcff\udd00\udd01\udd02\udd03\udd04\udd05\udd06\udd07\udd08\udd09\udd0a\udd0b\udd0c\udd0d\udd0e\udd0f\udd10\udd11\udd12\udd13\udd14\udd15\udd16\udd17\udd18\udd19\udd1a\udd1b\udd1c\udd1d\udd1e\udd1f\udd20\udd21\udd22\udd23\udd24\udd25\udd26\udd27\udd28\udd29\udd2a\udd2b\udd2c\udd2d\udd2e\udd2f\udd30\udd31\udd32\udd33\udd34\udd35\udd36\udd37\udd38\udd39\udd3a\udd3b\udd3c\udd3d\udd3e\udd3f\udd40\udd41\udd42\udd43\udd44\udd45\udd46\udd47\udd48\udd49\udd4a\udd4b\udd4c\udd4d\udd4e\udd4f\udd50\udd51\udd52\udd53\udd54\udd55\udd56\udd57\udd58\udd59\udd5a\udd5b\udd5c\udd5d\udd5e\udd5f\udd60\udd61\udd62\udd63\udd64\udd65\udd66\udd67\udd68\udd69\udd6a\udd6b\udd6c\udd6d\udd6e\udd6f\udd70\udd71\udd72\udd73\udd74\udd75\udd76\udd77\udd78\udd79\udd7a\udd7b\udd7c\udd7d\udd7e\udd7f\udd80\udd81\udd82\udd83\udd84\udd85\udd86\udd87\udd88\udd89\udd8a\udd8b\udd8c\udd8d\udd8e\udd8f\udd90\udd91\udd92\udd93\udd94\udd95\udd96\udd97\udd98\udd99\udd9a\udd9b\udd9c\udd9d\udd9e\udd9f\udda0\udda1\udda2\udda3\udda4\udda5\udda6\udda7\udda8\udda9\uddaa\uddab\uddac\uddad\uddae\uddaf\uddb0\uddb1\uddb2\uddb3\uddb4\uddb5\uddb6\uddb7\uddb8\uddb9\uddba\uddbb\uddbc\uddbd\uddbe\uddbf\uddc0\uddc1\uddc2\uddc3\uddc4\uddc5\uddc6\uddc7\uddc8\uddc9\uddca\uddcb\uddcc\uddcd\uddce\uddcf\uddd0\uddd1\uddd2\uddd3\uddd4\uddd5\uddd6\uddd7\uddd8\uddd9\uddda\udddb\udddc\udddd\uddde\udddf\udde0\udde1\udde2\udde3\udde4\udde5\udde6\udde7\udde8\udde9\uddea\uddeb\uddec\udded\uddee\uddef\uddf0\uddf1\uddf2\uddf3\uddf4\uddf5\uddf6\uddf7\uddf8\uddf9\uddfa\uddfb\uddfc\uddfd\uddfe\uddff\ude00\ude01\ude02\ude03\ude04\ude05\ude06\ude07\ude08\ude09\ude0a\ude0b\ude0c\ude0d\ude0e\ude0f\ude10\ude11\ude12\ude13\ude14\ude15\ude16\ude17\ude18\ude19\ude1a\ude1b\ude1c\ude1d\ude1e\ude1f\ude20\ude21\ude22\ude23\ude24\ude25\ude26\ude27\ude28\ude29\ude2a\ude2b\ude2c\ude2d\ude2e\ude2f\ude30\ude31\ude32\ude33\ude34\ude35\ude36\ude37\ude38\ude39\ude3a\ude3b\ude3c\ude3d\ude3e\ude3f\ude40\ude41\ude42\ude43\ude44\ude45\ude46\ude47\ude48\ude49\ude4a\ude4b\ude4c\ude4d\ude4e\ude4f\ude50\ude51\ude52\ude53\ude54\ude55\ude56\ude57\ude58\ude59\ude5a\ude5b\ude5c\ude5d\ude5e\ude5f\ude60\ude61\ude62\ude63\ude64\ude65\ude66\ude67\ude68\ude69\ude6a\ude6b\ude6c\ude6d\ude6e\ude6f\ude70\ude71\ude72\ude73\ude74\ude75\ude76\ude77\ude78\ude79\ude7a\ude7b\ude7c\ude7d\ude7e\ude7f\ude80\ude81\ude82\ude83\ude84\ude85\ude86\ude87\ude88\ude89\ude8a\ude8b\ude8c\ude8d\ude8e\ude8f\ude90\ude91\ude92\ude93\ude94\ude95\ude96\ude97\ude98\ude99\ude9a\ude9b\ude9c\ude9d\ude9e\ude9f\udea0\udea1\udea2\udea3\udea4\udea5\udea6\udea7\udea8\udea9\udeaa\udeab\udeac\udead\udeae\udeaf\udeb0\udeb1\udeb2\udeb3\udeb4\udeb5\udeb6\udeb7\udeb8\udeb9\udeba\udebb\udebc\udebd\udebe\udebf\udec0\udec1\udec2\udec3\udec4\udec5\udec6\udec7\udec8\udec9\udeca\udecb\udecc\udecd\udece\udecf\uded0\uded1\uded2\uded3\uded4\uded5\uded6\uded7\uded8\uded9\udeda\udedb\udedc\udedd\udede\udedf\udee0\udee1\udee2\udee3\udee4\udee5\udee6\udee7\udee8\udee9\udeea\udeeb\udeec\udeed\udeee\udeef\udef0\udef1\udef2\udef3\udef4\udef5\udef6\udef7\udef8\udef9\udefa\udefb\udefc\udefd\udefe\udeff\udf00\udf01\udf02\udf03\udf04\udf05\udf06\udf07\udf08\udf09\udf0a\udf0b\udf0c\udf0d\udf0e\udf0f\udf10\udf11\udf12\udf13\udf14\udf15\udf16\udf17\udf18\udf19\udf1a\udf1b\udf1c\udf1d\udf1e\udf1f\udf20\udf21\udf22\udf23\udf24\udf25\udf26\udf27\udf28\udf29\udf2a\udf2b\udf2c\udf2d\udf2e\udf2f\udf30\udf31\udf32\udf33\udf34\udf35\udf36\udf37\udf38\udf39\udf3a\udf3b\udf3c\udf3d\udf3e\udf3f\udf40\udf41\udf42\udf43\udf44\udf45\udf46\udf47\udf48\udf49\udf4a\udf4b\udf4c\udf4d\udf4e\udf4f\udf50\udf51\udf52\udf53\udf54\udf55\udf56\udf57\udf58\udf59\udf5a\udf5b\udf5c\udf5d\udf5e\udf5f\udf60\udf61\udf62\udf63\udf64\udf65\udf66\udf67\udf68\udf69\udf6a\udf6b\udf6c\udf6d\udf6e\udf6f\udf70\udf71\udf72\udf73\udf74\udf75\udf76\udf77\udf78\udf79\udf7a\udf7b\udf7c\udf7d\udf7e\udf7f\udf80\udf81\udf82\udf83\udf84\udf85\udf86\udf87\udf88\udf89\udf8a\udf8b\udf8c\udf8d\udf8e\udf8f\udf90\udf91\udf92\udf93\udf94\udf95\udf96\udf97\udf98\udf99\udf9a\udf9b\udf9c\udf9d\udf9e\udf9f\udfa0\udfa1\udfa2\udfa3\udfa4\udfa5\udfa6\udfa7\udfa8\udfa9\udfaa\udfab\udfac\udfad\udfae\udfaf\udfb0\udfb1\udfb2\udfb3\udfb4\udfb5\udfb6\udfb7\udfb8\udfb9\udfba\udfbb\udfbc\udfbd\udfbe\udfbf\udfc0\udfc1\udfc2\udfc3\udfc4\udfc5\udfc6\udfc7\udfc8\udfc9\udfca\udfcb\udfcc\udfcd\udfce\udfcf\udfd0\udfd1\udfd2\udfd3\udfd4\udfd5\udfd6\udfd7\udfd8\udfd9\udfda\udfdb\udfdc\udfdd\udfde\udfdf\udfe0\udfe1\udfe2\udfe3\udfe4\udfe5\udfe6\udfe7\udfe8\udfe9\udfea\udfeb\udfec\udfed\udfee\udfef\udff0\udff1\udff2\udff3\udff4\udff5\udff6\udff7\udff8\udff9\udffa\udffb\udffc\udffd\udffe\udfff'") except UnicodeDecodeError: Cs = '' # Jython can't handle isolated surrogates -Ll = u'abcdefghijklmnopqrstuvwxyz\xaa\xb5\xba\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff\u0101\u0103\u0105\u0107\u0109\u010b\u010d\u010f\u0111\u0113\u0115\u0117\u0119\u011b\u011d\u011f\u0121\u0123\u0125\u0127\u0129\u012b\u012d\u012f\u0131\u0133\u0135\u0137\u0138\u013a\u013c\u013e\u0140\u0142\u0144\u0146\u0148\u0149\u014b\u014d\u014f\u0151\u0153\u0155\u0157\u0159\u015b\u015d\u015f\u0161\u0163\u0165\u0167\u0169\u016b\u016d\u016f\u0171\u0173\u0175\u0177\u017a\u017c\u017e\u017f\u0180\u0183\u0185\u0188\u018c\u018d\u0192\u0195\u0199\u019a\u019b\u019e\u01a1\u01a3\u01a5\u01a8\u01aa\u01ab\u01ad\u01b0\u01b4\u01b6\u01b9\u01ba\u01bd\u01be\u01bf\u01c6\u01c9\u01cc\u01ce\u01d0\u01d2\u01d4\u01d6\u01d8\u01da\u01dc\u01dd\u01df\u01e1\u01e3\u01e5\u01e7\u01e9\u01eb\u01ed\u01ef\u01f0\u01f3\u01f5\u01f9\u01fb\u01fd\u01ff\u0201\u0203\u0205\u0207\u0209\u020b\u020d\u020f\u0211\u0213\u0215\u0217\u0219\u021b\u021d\u021f\u0221\u0223\u0225\u0227\u0229\u022b\u022d\u022f\u0231\u0233\u0234\u0235\u0236\u0237\u0238\u0239\u023c\u023f\u0240\u0250\u0251\u0252\u0253\u0254\u0255\u0256\u0257\u0258\u0259\u025a\u025b\u025c\u025d\u025e\u025f\u0260\u0261\u0262\u0263\u0264\u0265\u0266\u0267\u0268\u0269\u026a\u026b\u026c\u026d\u026e\u026f\u0270\u0271\u0272\u0273\u0274\u0275\u0276\u0277\u0278\u0279\u027a\u027b\u027c\u027d\u027e\u027f\u0280\u0281\u0282\u0283\u0284\u0285\u0286\u0287\u0288\u0289\u028a\u028b\u028c\u028d\u028e\u028f\u0290\u0291\u0292\u0293\u0294\u0295\u0296\u0297\u0298\u0299\u029a\u029b\u029c\u029d\u029e\u029f\u02a0\u02a1\u02a2\u02a3\u02a4\u02a5\u02a6\u02a7\u02a8\u02a9\u02aa\u02ab\u02ac\u02ad\u02ae\u02af\u0390\u03ac\u03ad\u03ae\u03af\u03b0\u03b1\u03b2\u03b3\u03b4\u03b5\u03b6\u03b7\u03b8\u03b9\u03ba\u03bb\u03bc\u03bd\u03be\u03bf\u03c0\u03c1\u03c2\u03c3\u03c4\u03c5\u03c6\u03c7\u03c8\u03c9\u03ca\u03cb\u03cc\u03cd\u03ce\u03d0\u03d1\u03d5\u03d6\u03d7\u03d9\u03db\u03dd\u03df\u03e1\u03e3\u03e5\u03e7\u03e9\u03eb\u03ed\u03ef\u03f0\u03f1\u03f2\u03f3\u03f5\u03f8\u03fb\u03fc\u0430\u0431\u0432\u0433\u0434\u0435\u0436\u0437\u0438\u0439\u043a\u043b\u043c\u043d\u043e\u043f\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044a\u044b\u044c\u044d\u044e\u044f\u0450\u0451\u0452\u0453\u0454\u0455\u0456\u0457\u0458\u0459\u045a\u045b\u045c\u045d\u045e\u045f\u0461\u0463\u0465\u0467\u0469\u046b\u046d\u046f\u0471\u0473\u0475\u0477\u0479\u047b\u047d\u047f\u0481\u048b\u048d\u048f\u0491\u0493\u0495\u0497\u0499\u049b\u049d\u049f\u04a1\u04a3\u04a5\u04a7\u04a9\u04ab\u04ad\u04af\u04b1\u04b3\u04b5\u04b7\u04b9\u04bb\u04bd\u04bf\u04c2\u04c4\u04c6\u04c8\u04ca\u04cc\u04ce\u04d1\u04d3\u04d5\u04d7\u04d9\u04db\u04dd\u04df\u04e1\u04e3\u04e5\u04e7\u04e9\u04eb\u04ed\u04ef\u04f1\u04f3\u04f5\u04f7\u04f9\u0501\u0503\u0505\u0507\u0509\u050b\u050d\u050f\u0561\u0562\u0563\u0564\u0565\u0566\u0567\u0568\u0569\u056a\u056b\u056c\u056d\u056e\u056f\u0570\u0571\u0572\u0573\u0574\u0575\u0576\u0577\u0578\u0579\u057a\u057b\u057c\u057d\u057e\u057f\u0580\u0581\u0582\u0583\u0584\u0585\u0586\u0587\u1d00\u1d01\u1d02\u1d03\u1d04\u1d05\u1d06\u1d07\u1d08\u1d09\u1d0a\u1d0b\u1d0c\u1d0d\u1d0e\u1d0f\u1d10\u1d11\u1d12\u1d13\u1d14\u1d15\u1d16\u1d17\u1d18\u1d19\u1d1a\u1d1b\u1d1c\u1d1d\u1d1e\u1d1f\u1d20\u1d21\u1d22\u1d23\u1d24\u1d25\u1d26\u1d27\u1d28\u1d29\u1d2a\u1d2b\u1d62\u1d63\u1d64\u1d65\u1d66\u1d67\u1d68\u1d69\u1d6a\u1d6b\u1d6c\u1d6d\u1d6e\u1d6f\u1d70\u1d71\u1d72\u1d73\u1d74\u1d75\u1d76\u1d77\u1d79\u1d7a\u1d7b\u1d7c\u1d7d\u1d7e\u1d7f\u1d80\u1d81\u1d82\u1d83\u1d84\u1d85\u1d86\u1d87\u1d88\u1d89\u1d8a\u1d8b\u1d8c\u1d8d\u1d8e\u1d8f\u1d90\u1d91\u1d92\u1d93\u1d94\u1d95\u1d96\u1d97\u1d98\u1d99\u1d9a\u1e01\u1e03\u1e05\u1e07\u1e09\u1e0b\u1e0d\u1e0f\u1e11\u1e13\u1e15\u1e17\u1e19\u1e1b\u1e1d\u1e1f\u1e21\u1e23\u1e25\u1e27\u1e29\u1e2b\u1e2d\u1e2f\u1e31\u1e33\u1e35\u1e37\u1e39\u1e3b\u1e3d\u1e3f\u1e41\u1e43\u1e45\u1e47\u1e49\u1e4b\u1e4d\u1e4f\u1e51\u1e53\u1e55\u1e57\u1e59\u1e5b\u1e5d\u1e5f\u1e61\u1e63\u1e65\u1e67\u1e69\u1e6b\u1e6d\u1e6f\u1e71\u1e73\u1e75\u1e77\u1e79\u1e7b\u1e7d\u1e7f\u1e81\u1e83\u1e85\u1e87\u1e89\u1e8b\u1e8d\u1e8f\u1e91\u1e93\u1e95\u1e96\u1e97\u1e98\u1e99\u1e9a\u1e9b\u1ea1\u1ea3\u1ea5\u1ea7\u1ea9\u1eab\u1ead\u1eaf\u1eb1\u1eb3\u1eb5\u1eb7\u1eb9\u1ebb\u1ebd\u1ebf\u1ec1\u1ec3\u1ec5\u1ec7\u1ec9\u1ecb\u1ecd\u1ecf\u1ed1\u1ed3\u1ed5\u1ed7\u1ed9\u1edb\u1edd\u1edf\u1ee1\u1ee3\u1ee5\u1ee7\u1ee9\u1eeb\u1eed\u1eef\u1ef1\u1ef3\u1ef5\u1ef7\u1ef9\u1f00\u1f01\u1f02\u1f03\u1f04\u1f05\u1f06\u1f07\u1f10\u1f11\u1f12\u1f13\u1f14\u1f15\u1f20\u1f21\u1f22\u1f23\u1f24\u1f25\u1f26\u1f27\u1f30\u1f31\u1f32\u1f33\u1f34\u1f35\u1f36\u1f37\u1f40\u1f41\u1f42\u1f43\u1f44\u1f45\u1f50\u1f51\u1f52\u1f53\u1f54\u1f55\u1f56\u1f57\u1f60\u1f61\u1f62\u1f63\u1f64\u1f65\u1f66\u1f67\u1f70\u1f71\u1f72\u1f73\u1f74\u1f75\u1f76\u1f77\u1f78\u1f79\u1f7a\u1f7b\u1f7c\u1f7d\u1f80\u1f81\u1f82\u1f83\u1f84\u1f85\u1f86\u1f87\u1f90\u1f91\u1f92\u1f93\u1f94\u1f95\u1f96\u1f97\u1fa0\u1fa1\u1fa2\u1fa3\u1fa4\u1fa5\u1fa6\u1fa7\u1fb0\u1fb1\u1fb2\u1fb3\u1fb4\u1fb6\u1fb7\u1fbe\u1fc2\u1fc3\u1fc4\u1fc6\u1fc7\u1fd0\u1fd1\u1fd2\u1fd3\u1fd6\u1fd7\u1fe0\u1fe1\u1fe2\u1fe3\u1fe4\u1fe5\u1fe6\u1fe7\u1ff2\u1ff3\u1ff4\u1ff6\u1ff7\u2071\u207f\u210a\u210e\u210f\u2113\u212f\u2134\u2139\u213c\u213d\u2146\u2147\u2148\u2149\u2c30\u2c31\u2c32\u2c33\u2c34\u2c35\u2c36\u2c37\u2c38\u2c39\u2c3a\u2c3b\u2c3c\u2c3d\u2c3e\u2c3f\u2c40\u2c41\u2c42\u2c43\u2c44\u2c45\u2c46\u2c47\u2c48\u2c49\u2c4a\u2c4b\u2c4c\u2c4d\u2c4e\u2c4f\u2c50\u2c51\u2c52\u2c53\u2c54\u2c55\u2c56\u2c57\u2c58\u2c59\u2c5a\u2c5b\u2c5c\u2c5d\u2c5e\u2c81\u2c83\u2c85\u2c87\u2c89\u2c8b\u2c8d\u2c8f\u2c91\u2c93\u2c95\u2c97\u2c99\u2c9b\u2c9d\u2c9f\u2ca1\u2ca3\u2ca5\u2ca7\u2ca9\u2cab\u2cad\u2caf\u2cb1\u2cb3\u2cb5\u2cb7\u2cb9\u2cbb\u2cbd\u2cbf\u2cc1\u2cc3\u2cc5\u2cc7\u2cc9\u2ccb\u2ccd\u2ccf\u2cd1\u2cd3\u2cd5\u2cd7\u2cd9\u2cdb\u2cdd\u2cdf\u2ce1\u2ce3\u2ce4\u2d00\u2d01\u2d02\u2d03\u2d04\u2d05\u2d06\u2d07\u2d08\u2d09\u2d0a\u2d0b\u2d0c\u2d0d\u2d0e\u2d0f\u2d10\u2d11\u2d12\u2d13\u2d14\u2d15\u2d16\u2d17\u2d18\u2d19\u2d1a\u2d1b\u2d1c\u2d1d\u2d1e\u2d1f\u2d20\u2d21\u2d22\u2d23\u2d24\u2d25\ufb00\ufb01\ufb02\ufb03\ufb04\ufb05\ufb06\ufb13\ufb14\ufb15\ufb16\ufb17\uff41\uff42\uff43\uff44\uff45\uff46\uff47\uff48\uff49\uff4a\uff4b\uff4c\uff4d\uff4e\uff4f\uff50\uff51\uff52\uff53\uff54\uff55\uff56\uff57\uff58\uff59\uff5a' +Ll = 'abcdefghijklmnopqrstuvwxyz\xaa\xb5\xba\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff\u0101\u0103\u0105\u0107\u0109\u010b\u010d\u010f\u0111\u0113\u0115\u0117\u0119\u011b\u011d\u011f\u0121\u0123\u0125\u0127\u0129\u012b\u012d\u012f\u0131\u0133\u0135\u0137\u0138\u013a\u013c\u013e\u0140\u0142\u0144\u0146\u0148\u0149\u014b\u014d\u014f\u0151\u0153\u0155\u0157\u0159\u015b\u015d\u015f\u0161\u0163\u0165\u0167\u0169\u016b\u016d\u016f\u0171\u0173\u0175\u0177\u017a\u017c\u017e\u017f\u0180\u0183\u0185\u0188\u018c\u018d\u0192\u0195\u0199\u019a\u019b\u019e\u01a1\u01a3\u01a5\u01a8\u01aa\u01ab\u01ad\u01b0\u01b4\u01b6\u01b9\u01ba\u01bd\u01be\u01bf\u01c6\u01c9\u01cc\u01ce\u01d0\u01d2\u01d4\u01d6\u01d8\u01da\u01dc\u01dd\u01df\u01e1\u01e3\u01e5\u01e7\u01e9\u01eb\u01ed\u01ef\u01f0\u01f3\u01f5\u01f9\u01fb\u01fd\u01ff\u0201\u0203\u0205\u0207\u0209\u020b\u020d\u020f\u0211\u0213\u0215\u0217\u0219\u021b\u021d\u021f\u0221\u0223\u0225\u0227\u0229\u022b\u022d\u022f\u0231\u0233\u0234\u0235\u0236\u0237\u0238\u0239\u023c\u023f\u0240\u0250\u0251\u0252\u0253\u0254\u0255\u0256\u0257\u0258\u0259\u025a\u025b\u025c\u025d\u025e\u025f\u0260\u0261\u0262\u0263\u0264\u0265\u0266\u0267\u0268\u0269\u026a\u026b\u026c\u026d\u026e\u026f\u0270\u0271\u0272\u0273\u0274\u0275\u0276\u0277\u0278\u0279\u027a\u027b\u027c\u027d\u027e\u027f\u0280\u0281\u0282\u0283\u0284\u0285\u0286\u0287\u0288\u0289\u028a\u028b\u028c\u028d\u028e\u028f\u0290\u0291\u0292\u0293\u0294\u0295\u0296\u0297\u0298\u0299\u029a\u029b\u029c\u029d\u029e\u029f\u02a0\u02a1\u02a2\u02a3\u02a4\u02a5\u02a6\u02a7\u02a8\u02a9\u02aa\u02ab\u02ac\u02ad\u02ae\u02af\u0390\u03ac\u03ad\u03ae\u03af\u03b0\u03b1\u03b2\u03b3\u03b4\u03b5\u03b6\u03b7\u03b8\u03b9\u03ba\u03bb\u03bc\u03bd\u03be\u03bf\u03c0\u03c1\u03c2\u03c3\u03c4\u03c5\u03c6\u03c7\u03c8\u03c9\u03ca\u03cb\u03cc\u03cd\u03ce\u03d0\u03d1\u03d5\u03d6\u03d7\u03d9\u03db\u03dd\u03df\u03e1\u03e3\u03e5\u03e7\u03e9\u03eb\u03ed\u03ef\u03f0\u03f1\u03f2\u03f3\u03f5\u03f8\u03fb\u03fc\u0430\u0431\u0432\u0433\u0434\u0435\u0436\u0437\u0438\u0439\u043a\u043b\u043c\u043d\u043e\u043f\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044a\u044b\u044c\u044d\u044e\u044f\u0450\u0451\u0452\u0453\u0454\u0455\u0456\u0457\u0458\u0459\u045a\u045b\u045c\u045d\u045e\u045f\u0461\u0463\u0465\u0467\u0469\u046b\u046d\u046f\u0471\u0473\u0475\u0477\u0479\u047b\u047d\u047f\u0481\u048b\u048d\u048f\u0491\u0493\u0495\u0497\u0499\u049b\u049d\u049f\u04a1\u04a3\u04a5\u04a7\u04a9\u04ab\u04ad\u04af\u04b1\u04b3\u04b5\u04b7\u04b9\u04bb\u04bd\u04bf\u04c2\u04c4\u04c6\u04c8\u04ca\u04cc\u04ce\u04d1\u04d3\u04d5\u04d7\u04d9\u04db\u04dd\u04df\u04e1\u04e3\u04e5\u04e7\u04e9\u04eb\u04ed\u04ef\u04f1\u04f3\u04f5\u04f7\u04f9\u0501\u0503\u0505\u0507\u0509\u050b\u050d\u050f\u0561\u0562\u0563\u0564\u0565\u0566\u0567\u0568\u0569\u056a\u056b\u056c\u056d\u056e\u056f\u0570\u0571\u0572\u0573\u0574\u0575\u0576\u0577\u0578\u0579\u057a\u057b\u057c\u057d\u057e\u057f\u0580\u0581\u0582\u0583\u0584\u0585\u0586\u0587\u1d00\u1d01\u1d02\u1d03\u1d04\u1d05\u1d06\u1d07\u1d08\u1d09\u1d0a\u1d0b\u1d0c\u1d0d\u1d0e\u1d0f\u1d10\u1d11\u1d12\u1d13\u1d14\u1d15\u1d16\u1d17\u1d18\u1d19\u1d1a\u1d1b\u1d1c\u1d1d\u1d1e\u1d1f\u1d20\u1d21\u1d22\u1d23\u1d24\u1d25\u1d26\u1d27\u1d28\u1d29\u1d2a\u1d2b\u1d62\u1d63\u1d64\u1d65\u1d66\u1d67\u1d68\u1d69\u1d6a\u1d6b\u1d6c\u1d6d\u1d6e\u1d6f\u1d70\u1d71\u1d72\u1d73\u1d74\u1d75\u1d76\u1d77\u1d79\u1d7a\u1d7b\u1d7c\u1d7d\u1d7e\u1d7f\u1d80\u1d81\u1d82\u1d83\u1d84\u1d85\u1d86\u1d87\u1d88\u1d89\u1d8a\u1d8b\u1d8c\u1d8d\u1d8e\u1d8f\u1d90\u1d91\u1d92\u1d93\u1d94\u1d95\u1d96\u1d97\u1d98\u1d99\u1d9a\u1e01\u1e03\u1e05\u1e07\u1e09\u1e0b\u1e0d\u1e0f\u1e11\u1e13\u1e15\u1e17\u1e19\u1e1b\u1e1d\u1e1f\u1e21\u1e23\u1e25\u1e27\u1e29\u1e2b\u1e2d\u1e2f\u1e31\u1e33\u1e35\u1e37\u1e39\u1e3b\u1e3d\u1e3f\u1e41\u1e43\u1e45\u1e47\u1e49\u1e4b\u1e4d\u1e4f\u1e51\u1e53\u1e55\u1e57\u1e59\u1e5b\u1e5d\u1e5f\u1e61\u1e63\u1e65\u1e67\u1e69\u1e6b\u1e6d\u1e6f\u1e71\u1e73\u1e75\u1e77\u1e79\u1e7b\u1e7d\u1e7f\u1e81\u1e83\u1e85\u1e87\u1e89\u1e8b\u1e8d\u1e8f\u1e91\u1e93\u1e95\u1e96\u1e97\u1e98\u1e99\u1e9a\u1e9b\u1ea1\u1ea3\u1ea5\u1ea7\u1ea9\u1eab\u1ead\u1eaf\u1eb1\u1eb3\u1eb5\u1eb7\u1eb9\u1ebb\u1ebd\u1ebf\u1ec1\u1ec3\u1ec5\u1ec7\u1ec9\u1ecb\u1ecd\u1ecf\u1ed1\u1ed3\u1ed5\u1ed7\u1ed9\u1edb\u1edd\u1edf\u1ee1\u1ee3\u1ee5\u1ee7\u1ee9\u1eeb\u1eed\u1eef\u1ef1\u1ef3\u1ef5\u1ef7\u1ef9\u1f00\u1f01\u1f02\u1f03\u1f04\u1f05\u1f06\u1f07\u1f10\u1f11\u1f12\u1f13\u1f14\u1f15\u1f20\u1f21\u1f22\u1f23\u1f24\u1f25\u1f26\u1f27\u1f30\u1f31\u1f32\u1f33\u1f34\u1f35\u1f36\u1f37\u1f40\u1f41\u1f42\u1f43\u1f44\u1f45\u1f50\u1f51\u1f52\u1f53\u1f54\u1f55\u1f56\u1f57\u1f60\u1f61\u1f62\u1f63\u1f64\u1f65\u1f66\u1f67\u1f70\u1f71\u1f72\u1f73\u1f74\u1f75\u1f76\u1f77\u1f78\u1f79\u1f7a\u1f7b\u1f7c\u1f7d\u1f80\u1f81\u1f82\u1f83\u1f84\u1f85\u1f86\u1f87\u1f90\u1f91\u1f92\u1f93\u1f94\u1f95\u1f96\u1f97\u1fa0\u1fa1\u1fa2\u1fa3\u1fa4\u1fa5\u1fa6\u1fa7\u1fb0\u1fb1\u1fb2\u1fb3\u1fb4\u1fb6\u1fb7\u1fbe\u1fc2\u1fc3\u1fc4\u1fc6\u1fc7\u1fd0\u1fd1\u1fd2\u1fd3\u1fd6\u1fd7\u1fe0\u1fe1\u1fe2\u1fe3\u1fe4\u1fe5\u1fe6\u1fe7\u1ff2\u1ff3\u1ff4\u1ff6\u1ff7\u2071\u207f\u210a\u210e\u210f\u2113\u212f\u2134\u2139\u213c\u213d\u2146\u2147\u2148\u2149\u2c30\u2c31\u2c32\u2c33\u2c34\u2c35\u2c36\u2c37\u2c38\u2c39\u2c3a\u2c3b\u2c3c\u2c3d\u2c3e\u2c3f\u2c40\u2c41\u2c42\u2c43\u2c44\u2c45\u2c46\u2c47\u2c48\u2c49\u2c4a\u2c4b\u2c4c\u2c4d\u2c4e\u2c4f\u2c50\u2c51\u2c52\u2c53\u2c54\u2c55\u2c56\u2c57\u2c58\u2c59\u2c5a\u2c5b\u2c5c\u2c5d\u2c5e\u2c81\u2c83\u2c85\u2c87\u2c89\u2c8b\u2c8d\u2c8f\u2c91\u2c93\u2c95\u2c97\u2c99\u2c9b\u2c9d\u2c9f\u2ca1\u2ca3\u2ca5\u2ca7\u2ca9\u2cab\u2cad\u2caf\u2cb1\u2cb3\u2cb5\u2cb7\u2cb9\u2cbb\u2cbd\u2cbf\u2cc1\u2cc3\u2cc5\u2cc7\u2cc9\u2ccb\u2ccd\u2ccf\u2cd1\u2cd3\u2cd5\u2cd7\u2cd9\u2cdb\u2cdd\u2cdf\u2ce1\u2ce3\u2ce4\u2d00\u2d01\u2d02\u2d03\u2d04\u2d05\u2d06\u2d07\u2d08\u2d09\u2d0a\u2d0b\u2d0c\u2d0d\u2d0e\u2d0f\u2d10\u2d11\u2d12\u2d13\u2d14\u2d15\u2d16\u2d17\u2d18\u2d19\u2d1a\u2d1b\u2d1c\u2d1d\u2d1e\u2d1f\u2d20\u2d21\u2d22\u2d23\u2d24\u2d25\ufb00\ufb01\ufb02\ufb03\ufb04\ufb05\ufb06\ufb13\ufb14\ufb15\ufb16\ufb17\uff41\uff42\uff43\uff44\uff45\uff46\uff47\uff48\uff49\uff4a\uff4b\uff4c\uff4d\uff4e\uff4f\uff50\uff51\uff52\uff53\uff54\uff55\uff56\uff57\uff58\uff59\uff5a' -Lm = u'\u02b0\u02b1\u02b2\u02b3\u02b4\u02b5\u02b6\u02b7\u02b8\u02b9\u02ba\u02bb\u02bc\u02bd\u02be\u02bf\u02c0\u02c1\u02c6\u02c7\u02c8\u02c9\u02ca\u02cb\u02cc\u02cd\u02ce\u02cf\u02d0\u02d1\u02e0\u02e1\u02e2\u02e3\u02e4\u02ee\u037a\u0559\u0640\u06e5\u06e6\u0e46\u0ec6\u10fc\u17d7\u1843\u1d2c\u1d2d\u1d2e\u1d2f\u1d30\u1d31\u1d32\u1d33\u1d34\u1d35\u1d36\u1d37\u1d38\u1d39\u1d3a\u1d3b\u1d3c\u1d3d\u1d3e\u1d3f\u1d40\u1d41\u1d42\u1d43\u1d44\u1d45\u1d46\u1d47\u1d48\u1d49\u1d4a\u1d4b\u1d4c\u1d4d\u1d4e\u1d4f\u1d50\u1d51\u1d52\u1d53\u1d54\u1d55\u1d56\u1d57\u1d58\u1d59\u1d5a\u1d5b\u1d5c\u1d5d\u1d5e\u1d5f\u1d60\u1d61\u1d78\u1d9b\u1d9c\u1d9d\u1d9e\u1d9f\u1da0\u1da1\u1da2\u1da3\u1da4\u1da5\u1da6\u1da7\u1da8\u1da9\u1daa\u1dab\u1dac\u1dad\u1dae\u1daf\u1db0\u1db1\u1db2\u1db3\u1db4\u1db5\u1db6\u1db7\u1db8\u1db9\u1dba\u1dbb\u1dbc\u1dbd\u1dbe\u1dbf\u2090\u2091\u2092\u2093\u2094\u2d6f\u3005\u3031\u3032\u3033\u3034\u3035\u303b\u309d\u309e\u30fc\u30fd\u30fe\ua015\uff70\uff9e\uff9f' +Lm = '\u02b0\u02b1\u02b2\u02b3\u02b4\u02b5\u02b6\u02b7\u02b8\u02b9\u02ba\u02bb\u02bc\u02bd\u02be\u02bf\u02c0\u02c1\u02c6\u02c7\u02c8\u02c9\u02ca\u02cb\u02cc\u02cd\u02ce\u02cf\u02d0\u02d1\u02e0\u02e1\u02e2\u02e3\u02e4\u02ee\u037a\u0559\u0640\u06e5\u06e6\u0e46\u0ec6\u10fc\u17d7\u1843\u1d2c\u1d2d\u1d2e\u1d2f\u1d30\u1d31\u1d32\u1d33\u1d34\u1d35\u1d36\u1d37\u1d38\u1d39\u1d3a\u1d3b\u1d3c\u1d3d\u1d3e\u1d3f\u1d40\u1d41\u1d42\u1d43\u1d44\u1d45\u1d46\u1d47\u1d48\u1d49\u1d4a\u1d4b\u1d4c\u1d4d\u1d4e\u1d4f\u1d50\u1d51\u1d52\u1d53\u1d54\u1d55\u1d56\u1d57\u1d58\u1d59\u1d5a\u1d5b\u1d5c\u1d5d\u1d5e\u1d5f\u1d60\u1d61\u1d78\u1d9b\u1d9c\u1d9d\u1d9e\u1d9f\u1da0\u1da1\u1da2\u1da3\u1da4\u1da5\u1da6\u1da7\u1da8\u1da9\u1daa\u1dab\u1dac\u1dad\u1dae\u1daf\u1db0\u1db1\u1db2\u1db3\u1db4\u1db5\u1db6\u1db7\u1db8\u1db9\u1dba\u1dbb\u1dbc\u1dbd\u1dbe\u1dbf\u2090\u2091\u2092\u2093\u2094\u2d6f\u3005\u3031\u3032\u3033\u3034\u3035\u303b\u309d\u309e\u30fc\u30fd\u30fe\ua015\uff70\uff9e\uff9f' -Lo = u'\u01bb\u01c0\u01c1\u01c2\u01c3\u05d0\u05d1\u05d2\u05d3\u05d4\u05d5\u05d6\u05d7\u05d8\u05d9\u05da\u05db\u05dc\u05dd\u05de\u05df\u05e0\u05e1\u05e2\u05e3\u05e4\u05e5\u05e6\u05e7\u05e8\u05e9\u05ea\u05f0\u05f1\u05f2\u0621\u0622\u0623\u0624\u0625\u0626\u0627\u0628\u0629\u062a\u062b\u062c\u062d\u062e\u062f\u0630\u0631\u0632\u0633\u0634\u0635\u0636\u0637\u0638\u0639\u063a\u0641\u0642\u0643\u0644\u0645\u0646\u0647\u0648\u0649\u064a\u066e\u066f\u0671\u0672\u0673\u0674\u0675\u0676\u0677\u0678\u0679\u067a\u067b\u067c\u067d\u067e\u067f\u0680\u0681\u0682\u0683\u0684\u0685\u0686\u0687\u0688\u0689\u068a\u068b\u068c\u068d\u068e\u068f\u0690\u0691\u0692\u0693\u0694\u0695\u0696\u0697\u0698\u0699\u069a\u069b\u069c\u069d\u069e\u069f\u06a0\u06a1\u06a2\u06a3\u06a4\u06a5\u06a6\u06a7\u06a8\u06a9\u06aa\u06ab\u06ac\u06ad\u06ae\u06af\u06b0\u06b1\u06b2\u06b3\u06b4\u06b5\u06b6\u06b7\u06b8\u06b9\u06ba\u06bb\u06bc\u06bd\u06be\u06bf\u06c0\u06c1\u06c2\u06c3\u06c4\u06c5\u06c6\u06c7\u06c8\u06c9\u06ca\u06cb\u06cc\u06cd\u06ce\u06cf\u06d0\u06d1\u06d2\u06d3\u06d5\u06ee\u06ef\u06fa\u06fb\u06fc\u06ff\u0710\u0712\u0713\u0714\u0715\u0716\u0717\u0718\u0719\u071a\u071b\u071c\u071d\u071e\u071f\u0720\u0721\u0722\u0723\u0724\u0725\u0726\u0727\u0728\u0729\u072a\u072b\u072c\u072d\u072e\u072f\u074d\u074e\u074f\u0750\u0751\u0752\u0753\u0754\u0755\u0756\u0757\u0758\u0759\u075a\u075b\u075c\u075d\u075e\u075f\u0760\u0761\u0762\u0763\u0764\u0765\u0766\u0767\u0768\u0769\u076a\u076b\u076c\u076d\u0780\u0781\u0782\u0783\u0784\u0785\u0786\u0787\u0788\u0789\u078a\u078b\u078c\u078d\u078e\u078f\u0790\u0791\u0792\u0793\u0794\u0795\u0796\u0797\u0798\u0799\u079a\u079b\u079c\u079d\u079e\u079f\u07a0\u07a1\u07a2\u07a3\u07a4\u07a5\u07b1\u0904\u0905\u0906\u0907\u0908\u0909\u090a\u090b\u090c\u090d\u090e\u090f\u0910\u0911\u0912\u0913\u0914\u0915\u0916\u0917\u0918\u0919\u091a\u091b\u091c\u091d\u091e\u091f\u0920\u0921\u0922\u0923\u0924\u0925\u0926\u0927\u0928\u0929\u092a\u092b\u092c\u092d\u092e\u092f\u0930\u0931\u0932\u0933\u0934\u0935\u0936\u0937\u0938\u0939\u093d\u0950\u0958\u0959\u095a\u095b\u095c\u095d\u095e\u095f\u0960\u0961\u097d\u0985\u0986\u0987\u0988\u0989\u098a\u098b\u098c\u098f\u0990\u0993\u0994\u0995\u0996\u0997\u0998\u0999\u099a\u099b\u099c\u099d\u099e\u099f\u09a0\u09a1\u09a2\u09a3\u09a4\u09a5\u09a6\u09a7\u09a8\u09aa\u09ab\u09ac\u09ad\u09ae\u09af\u09b0\u09b2\u09b6\u09b7\u09b8\u09b9\u09bd\u09ce\u09dc\u09dd\u09df\u09e0\u09e1\u09f0\u09f1\u0a05\u0a06\u0a07\u0a08\u0a09\u0a0a\u0a0f\u0a10\u0a13\u0a14\u0a15\u0a16\u0a17\u0a18\u0a19\u0a1a\u0a1b\u0a1c\u0a1d\u0a1e\u0a1f\u0a20\u0a21\u0a22\u0a23\u0a24\u0a25\u0a26\u0a27\u0a28\u0a2a\u0a2b\u0a2c\u0a2d\u0a2e\u0a2f\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59\u0a5a\u0a5b\u0a5c\u0a5e\u0a72\u0a73\u0a74\u0a85\u0a86\u0a87\u0a88\u0a89\u0a8a\u0a8b\u0a8c\u0a8d\u0a8f\u0a90\u0a91\u0a93\u0a94\u0a95\u0a96\u0a97\u0a98\u0a99\u0a9a\u0a9b\u0a9c\u0a9d\u0a9e\u0a9f\u0aa0\u0aa1\u0aa2\u0aa3\u0aa4\u0aa5\u0aa6\u0aa7\u0aa8\u0aaa\u0aab\u0aac\u0aad\u0aae\u0aaf\u0ab0\u0ab2\u0ab3\u0ab5\u0ab6\u0ab7\u0ab8\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0b05\u0b06\u0b07\u0b08\u0b09\u0b0a\u0b0b\u0b0c\u0b0f\u0b10\u0b13\u0b14\u0b15\u0b16\u0b17\u0b18\u0b19\u0b1a\u0b1b\u0b1c\u0b1d\u0b1e\u0b1f\u0b20\u0b21\u0b22\u0b23\u0b24\u0b25\u0b26\u0b27\u0b28\u0b2a\u0b2b\u0b2c\u0b2d\u0b2e\u0b2f\u0b30\u0b32\u0b33\u0b35\u0b36\u0b37\u0b38\u0b39\u0b3d\u0b5c\u0b5d\u0b5f\u0b60\u0b61\u0b71\u0b83\u0b85\u0b86\u0b87\u0b88\u0b89\u0b8a\u0b8e\u0b8f\u0b90\u0b92\u0b93\u0b94\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8\u0ba9\u0baa\u0bae\u0baf\u0bb0\u0bb1\u0bb2\u0bb3\u0bb4\u0bb5\u0bb6\u0bb7\u0bb8\u0bb9\u0c05\u0c06\u0c07\u0c08\u0c09\u0c0a\u0c0b\u0c0c\u0c0e\u0c0f\u0c10\u0c12\u0c13\u0c14\u0c15\u0c16\u0c17\u0c18\u0c19\u0c1a\u0c1b\u0c1c\u0c1d\u0c1e\u0c1f\u0c20\u0c21\u0c22\u0c23\u0c24\u0c25\u0c26\u0c27\u0c28\u0c2a\u0c2b\u0c2c\u0c2d\u0c2e\u0c2f\u0c30\u0c31\u0c32\u0c33\u0c35\u0c36\u0c37\u0c38\u0c39\u0c60\u0c61\u0c85\u0c86\u0c87\u0c88\u0c89\u0c8a\u0c8b\u0c8c\u0c8e\u0c8f\u0c90\u0c92\u0c93\u0c94\u0c95\u0c96\u0c97\u0c98\u0c99\u0c9a\u0c9b\u0c9c\u0c9d\u0c9e\u0c9f\u0ca0\u0ca1\u0ca2\u0ca3\u0ca4\u0ca5\u0ca6\u0ca7\u0ca8\u0caa\u0cab\u0cac\u0cad\u0cae\u0caf\u0cb0\u0cb1\u0cb2\u0cb3\u0cb5\u0cb6\u0cb7\u0cb8\u0cb9\u0cbd\u0cde\u0ce0\u0ce1\u0d05\u0d06\u0d07\u0d08\u0d09\u0d0a\u0d0b\u0d0c\u0d0e\u0d0f\u0d10\u0d12\u0d13\u0d14\u0d15\u0d16\u0d17\u0d18\u0d19\u0d1a\u0d1b\u0d1c\u0d1d\u0d1e\u0d1f\u0d20\u0d21\u0d22\u0d23\u0d24\u0d25\u0d26\u0d27\u0d28\u0d2a\u0d2b\u0d2c\u0d2d\u0d2e\u0d2f\u0d30\u0d31\u0d32\u0d33\u0d34\u0d35\u0d36\u0d37\u0d38\u0d39\u0d60\u0d61\u0d85\u0d86\u0d87\u0d88\u0d89\u0d8a\u0d8b\u0d8c\u0d8d\u0d8e\u0d8f\u0d90\u0d91\u0d92\u0d93\u0d94\u0d95\u0d96\u0d9a\u0d9b\u0d9c\u0d9d\u0d9e\u0d9f\u0da0\u0da1\u0da2\u0da3\u0da4\u0da5\u0da6\u0da7\u0da8\u0da9\u0daa\u0dab\u0dac\u0dad\u0dae\u0daf\u0db0\u0db1\u0db3\u0db4\u0db5\u0db6\u0db7\u0db8\u0db9\u0dba\u0dbb\u0dbd\u0dc0\u0dc1\u0dc2\u0dc3\u0dc4\u0dc5\u0dc6\u0e01\u0e02\u0e03\u0e04\u0e05\u0e06\u0e07\u0e08\u0e09\u0e0a\u0e0b\u0e0c\u0e0d\u0e0e\u0e0f\u0e10\u0e11\u0e12\u0e13\u0e14\u0e15\u0e16\u0e17\u0e18\u0e19\u0e1a\u0e1b\u0e1c\u0e1d\u0e1e\u0e1f\u0e20\u0e21\u0e22\u0e23\u0e24\u0e25\u0e26\u0e27\u0e28\u0e29\u0e2a\u0e2b\u0e2c\u0e2d\u0e2e\u0e2f\u0e30\u0e32\u0e33\u0e40\u0e41\u0e42\u0e43\u0e44\u0e45\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94\u0e95\u0e96\u0e97\u0e99\u0e9a\u0e9b\u0e9c\u0e9d\u0e9e\u0e9f\u0ea1\u0ea2\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead\u0eae\u0eaf\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0\u0ec1\u0ec2\u0ec3\u0ec4\u0edc\u0edd\u0f00\u0f40\u0f41\u0f42\u0f43\u0f44\u0f45\u0f46\u0f47\u0f49\u0f4a\u0f4b\u0f4c\u0f4d\u0f4e\u0f4f\u0f50\u0f51\u0f52\u0f53\u0f54\u0f55\u0f56\u0f57\u0f58\u0f59\u0f5a\u0f5b\u0f5c\u0f5d\u0f5e\u0f5f\u0f60\u0f61\u0f62\u0f63\u0f64\u0f65\u0f66\u0f67\u0f68\u0f69\u0f6a\u0f88\u0f89\u0f8a\u0f8b\u1000\u1001\u1002\u1003\u1004\u1005\u1006\u1007\u1008\u1009\u100a\u100b\u100c\u100d\u100e\u100f\u1010\u1011\u1012\u1013\u1014\u1015\u1016\u1017\u1018\u1019\u101a\u101b\u101c\u101d\u101e\u101f\u1020\u1021\u1023\u1024\u1025\u1026\u1027\u1029\u102a\u1050\u1051\u1052\u1053\u1054\u1055\u10d0\u10d1\u10d2\u10d3\u10d4\u10d5\u10d6\u10d7\u10d8\u10d9\u10da\u10db\u10dc\u10dd\u10de\u10df\u10e0\u10e1\u10e2\u10e3\u10e4\u10e5\u10e6\u10e7\u10e8\u10e9\u10ea\u10eb\u10ec\u10ed\u10ee\u10ef\u10f0\u10f1\u10f2\u10f3\u10f4\u10f5\u10f6\u10f7\u10f8\u10f9\u10fa\u1100\u1101\u1102\u1103\u1104\u1105\u1106\u1107\u1108\u1109\u110a\u110b\u110c\u110d\u110e\u110f\u1110\u1111\u1112\u1113\u1114\u1115\u1116\u1117\u1118\u1119\u111a\u111b\u111c\u111d\u111e\u111f\u1120\u1121\u1122\u1123\u1124\u1125\u1126\u1127\u1128\u1129\u112a\u112b\u112c\u112d\u112e\u112f\u1130\u1131\u1132\u1133\u1134\u1135\u1136\u1137\u1138\u1139\u113a\u113b\u113c\u113d\u113e\u113f\u1140\u1141\u1142\u1143\u1144\u1145\u1146\u1147\u1148\u1149\u114a\u114b\u114c\u114d\u114e\u114f\u1150\u1151\u1152\u1153\u1154\u1155\u1156\u1157\u1158\u1159\u115f\u1160\u1161\u1162\u1163\u1164\u1165\u1166\u1167\u1168\u1169\u116a\u116b\u116c\u116d\u116e\u116f\u1170\u1171\u1172\u1173\u1174\u1175\u1176\u1177\u1178\u1179\u117a\u117b\u117c\u117d\u117e\u117f\u1180\u1181\u1182\u1183\u1184\u1185\u1186\u1187\u1188\u1189\u118a\u118b\u118c\u118d\u118e\u118f\u1190\u1191\u1192\u1193\u1194\u1195\u1196\u1197\u1198\u1199\u119a\u119b\u119c\u119d\u119e\u119f\u11a0\u11a1\u11a2\u11a8\u11a9\u11aa\u11ab\u11ac\u11ad\u11ae\u11af\u11b0\u11b1\u11b2\u11b3\u11b4\u11b5\u11b6\u11b7\u11b8\u11b9\u11ba\u11bb\u11bc\u11bd\u11be\u11bf\u11c0\u11c1\u11c2\u11c3\u11c4\u11c5\u11c6\u11c7\u11c8\u11c9\u11ca\u11cb\u11cc\u11cd\u11ce\u11cf\u11d0\u11d1\u11d2\u11d3\u11d4\u11d5\u11d6\u11d7\u11d8\u11d9\u11da\u11db\u11dc\u11dd\u11de\u11df\u11e0\u11e1\u11e2\u11e3\u11e4\u11e5\u11e6\u11e7\u11e8\u11e9\u11ea\u11eb\u11ec\u11ed\u11ee\u11ef\u11f0\u11f1\u11f2\u11f3\u11f4\u11f5\u11f6\u11f7\u11f8\u11f9\u1200\u1201\u1202\u1203\u1204\u1205\u1206\u1207\u1208\u1209\u120a\u120b\u120c\u120d\u120e\u120f\u1210\u1211\u1212\u1213\u1214\u1215\u1216\u1217\u1218\u1219\u121a\u121b\u121c\u121d\u121e\u121f\u1220\u1221\u1222\u1223\u1224\u1225\u1226\u1227\u1228\u1229\u122a\u122b\u122c\u122d\u122e\u122f\u1230\u1231\u1232\u1233\u1234\u1235\u1236\u1237\u1238\u1239\u123a\u123b\u123c\u123d\u123e\u123f\u1240\u1241\u1242\u1243\u1244\u1245\u1246\u1247\u1248\u124a\u124b\u124c\u124d\u1250\u1251\u1252\u1253\u1254\u1255\u1256\u1258\u125a\u125b\u125c\u125d\u1260\u1261\u1262\u1263\u1264\u1265\u1266\u1267\u1268\u1269\u126a\u126b\u126c\u126d\u126e\u126f\u1270\u1271\u1272\u1273\u1274\u1275\u1276\u1277\u1278\u1279\u127a\u127b\u127c\u127d\u127e\u127f\u1280\u1281\u1282\u1283\u1284\u1285\u1286\u1287\u1288\u128a\u128b\u128c\u128d\u1290\u1291\u1292\u1293\u1294\u1295\u1296\u1297\u1298\u1299\u129a\u129b\u129c\u129d\u129e\u129f\u12a0\u12a1\u12a2\u12a3\u12a4\u12a5\u12a6\u12a7\u12a8\u12a9\u12aa\u12ab\u12ac\u12ad\u12ae\u12af\u12b0\u12b2\u12b3\u12b4\u12b5\u12b8\u12b9\u12ba\u12bb\u12bc\u12bd\u12be\u12c0\u12c2\u12c3\u12c4\u12c5\u12c8\u12c9\u12ca\u12cb\u12cc\u12cd\u12ce\u12cf\u12d0\u12d1\u12d2\u12d3\u12d4\u12d5\u12d6\u12d8\u12d9\u12da\u12db\u12dc\u12dd\u12de\u12df\u12e0\u12e1\u12e2\u12e3\u12e4\u12e5\u12e6\u12e7\u12e8\u12e9\u12ea\u12eb\u12ec\u12ed\u12ee\u12ef\u12f0\u12f1\u12f2\u12f3\u12f4\u12f5\u12f6\u12f7\u12f8\u12f9\u12fa\u12fb\u12fc\u12fd\u12fe\u12ff\u1300\u1301\u1302\u1303\u1304\u1305\u1306\u1307\u1308\u1309\u130a\u130b\u130c\u130d\u130e\u130f\u1310\u1312\u1313\u1314\u1315\u1318\u1319\u131a\u131b\u131c\u131d\u131e\u131f\u1320\u1321\u1322\u1323\u1324\u1325\u1326\u1327\u1328\u1329\u132a\u132b\u132c\u132d\u132e\u132f\u1330\u1331\u1332\u1333\u1334\u1335\u1336\u1337\u1338\u1339\u133a\u133b\u133c\u133d\u133e\u133f\u1340\u1341\u1342\u1343\u1344\u1345\u1346\u1347\u1348\u1349\u134a\u134b\u134c\u134d\u134e\u134f\u1350\u1351\u1352\u1353\u1354\u1355\u1356\u1357\u1358\u1359\u135a\u1380\u1381\u1382\u1383\u1384\u1385\u1386\u1387\u1388\u1389\u138a\u138b\u138c\u138d\u138e\u138f\u13a0\u13a1\u13a2\u13a3\u13a4\u13a5\u13a6\u13a7\u13a8\u13a9\u13aa\u13ab\u13ac\u13ad\u13ae\u13af\u13b0\u13b1\u13b2\u13b3\u13b4\u13b5\u13b6\u13b7\u13b8\u13b9\u13ba\u13bb\u13bc\u13bd\u13be\u13bf\u13c0\u13c1\u13c2\u13c3\u13c4\u13c5\u13c6\u13c7\u13c8\u13c9\u13ca\u13cb\u13cc\u13cd\u13ce\u13cf\u13d0\u13d1\u13d2\u13d3\u13d4\u13d5\u13d6\u13d7\u13d8\u13d9\u13da\u13db\u13dc\u13dd\u13de\u13df\u13e0\u13e1\u13e2\u13e3\u13e4\u13e5\u13e6\u13e7\u13e8\u13e9\u13ea\u13eb\u13ec\u13ed\u13ee\u13ef\u13f0\u13f1\u13f2\u13f3\u13f4\u1401\u1402\u1403\u1404\u1405\u1406\u1407\u1408\u1409\u140a\u140b\u140c\u140d\u140e\u140f\u1410\u1411\u1412\u1413\u1414\u1415\u1416\u1417\u1418\u1419\u141a\u141b\u141c\u141d\u141e\u141f\u1420\u1421\u1422\u1423\u1424\u1425\u1426\u1427\u1428\u1429\u142a\u142b\u142c\u142d\u142e\u142f\u1430\u1431\u1432\u1433\u1434\u1435\u1436\u1437\u1438\u1439\u143a\u143b\u143c\u143d\u143e\u143f\u1440\u1441\u1442\u1443\u1444\u1445\u1446\u1447\u1448\u1449\u144a\u144b\u144c\u144d\u144e\u144f\u1450\u1451\u1452\u1453\u1454\u1455\u1456\u1457\u1458\u1459\u145a\u145b\u145c\u145d\u145e\u145f\u1460\u1461\u1462\u1463\u1464\u1465\u1466\u1467\u1468\u1469\u146a\u146b\u146c\u146d\u146e\u146f\u1470\u1471\u1472\u1473\u1474\u1475\u1476\u1477\u1478\u1479\u147a\u147b\u147c\u147d\u147e\u147f\u1480\u1481\u1482\u1483\u1484\u1485\u1486\u1487\u1488\u1489\u148a\u148b\u148c\u148d\u148e\u148f\u1490\u1491\u1492\u1493\u1494\u1495\u1496\u1497\u1498\u1499\u149a\u149b\u149c\u149d\u149e\u149f\u14a0\u14a1\u14a2\u14a3\u14a4\u14a5\u14a6\u14a7\u14a8\u14a9\u14aa\u14ab\u14ac\u14ad\u14ae\u14af\u14b0\u14b1\u14b2\u14b3\u14b4\u14b5\u14b6\u14b7\u14b8\u14b9\u14ba\u14bb\u14bc\u14bd\u14be\u14bf\u14c0\u14c1\u14c2\u14c3\u14c4\u14c5\u14c6\u14c7\u14c8\u14c9\u14ca\u14cb\u14cc\u14cd\u14ce\u14cf\u14d0\u14d1\u14d2\u14d3\u14d4\u14d5\u14d6\u14d7\u14d8\u14d9\u14da\u14db\u14dc\u14dd\u14de\u14df\u14e0\u14e1\u14e2\u14e3\u14e4\u14e5\u14e6\u14e7\u14e8\u14e9\u14ea\u14eb\u14ec\u14ed\u14ee\u14ef\u14f0\u14f1\u14f2\u14f3\u14f4\u14f5\u14f6\u14f7\u14f8\u14f9\u14fa\u14fb\u14fc\u14fd\u14fe\u14ff\u1500\u1501\u1502\u1503\u1504\u1505\u1506\u1507\u1508\u1509\u150a\u150b\u150c\u150d\u150e\u150f\u1510\u1511\u1512\u1513\u1514\u1515\u1516\u1517\u1518\u1519\u151a\u151b\u151c\u151d\u151e\u151f\u1520\u1521\u1522\u1523\u1524\u1525\u1526\u1527\u1528\u1529\u152a\u152b\u152c\u152d\u152e\u152f\u1530\u1531\u1532\u1533\u1534\u1535\u1536\u1537\u1538\u1539\u153a\u153b\u153c\u153d\u153e\u153f\u1540\u1541\u1542\u1543\u1544\u1545\u1546\u1547\u1548\u1549\u154a\u154b\u154c\u154d\u154e\u154f\u1550\u1551\u1552\u1553\u1554\u1555\u1556\u1557\u1558\u1559\u155a\u155b\u155c\u155d\u155e\u155f\u1560\u1561\u1562\u1563\u1564\u1565\u1566\u1567\u1568\u1569\u156a\u156b\u156c\u156d\u156e\u156f\u1570\u1571\u1572\u1573\u1574\u1575\u1576\u1577\u1578\u1579\u157a\u157b\u157c\u157d\u157e\u157f\u1580\u1581\u1582\u1583\u1584\u1585\u1586\u1587\u1588\u1589\u158a\u158b\u158c\u158d\u158e\u158f\u1590\u1591\u1592\u1593\u1594\u1595\u1596\u1597\u1598\u1599\u159a\u159b\u159c\u159d\u159e\u159f\u15a0\u15a1\u15a2\u15a3\u15a4\u15a5\u15a6\u15a7\u15a8\u15a9\u15aa\u15ab\u15ac\u15ad\u15ae\u15af\u15b0\u15b1\u15b2\u15b3\u15b4\u15b5\u15b6\u15b7\u15b8\u15b9\u15ba\u15bb\u15bc\u15bd\u15be\u15bf\u15c0\u15c1\u15c2\u15c3\u15c4\u15c5\u15c6\u15c7\u15c8\u15c9\u15ca\u15cb\u15cc\u15cd\u15ce\u15cf\u15d0\u15d1\u15d2\u15d3\u15d4\u15d5\u15d6\u15d7\u15d8\u15d9\u15da\u15db\u15dc\u15dd\u15de\u15df\u15e0\u15e1\u15e2\u15e3\u15e4\u15e5\u15e6\u15e7\u15e8\u15e9\u15ea\u15eb\u15ec\u15ed\u15ee\u15ef\u15f0\u15f1\u15f2\u15f3\u15f4\u15f5\u15f6\u15f7\u15f8\u15f9\u15fa\u15fb\u15fc\u15fd\u15fe\u15ff\u1600\u1601\u1602\u1603\u1604\u1605\u1606\u1607\u1608\u1609\u160a\u160b\u160c\u160d\u160e\u160f\u1610\u1611\u1612\u1613\u1614\u1615\u1616\u1617\u1618\u1619\u161a\u161b\u161c\u161d\u161e\u161f\u1620\u1621\u1622\u1623\u1624\u1625\u1626\u1627\u1628\u1629\u162a\u162b\u162c\u162d\u162e\u162f\u1630\u1631\u1632\u1633\u1634\u1635\u1636\u1637\u1638\u1639\u163a\u163b\u163c\u163d\u163e\u163f\u1640\u1641\u1642\u1643\u1644\u1645\u1646\u1647\u1648\u1649\u164a\u164b\u164c\u164d\u164e\u164f\u1650\u1651\u1652\u1653\u1654\u1655\u1656\u1657\u1658\u1659\u165a\u165b\u165c\u165d\u165e\u165f\u1660\u1661\u1662\u1663\u1664\u1665\u1666\u1667\u1668\u1669\u166a\u166b\u166c\u166f\u1670\u1671\u1672\u1673\u1674\u1675\u1676\u1681\u1682\u1683\u1684\u1685\u1686\u1687\u1688\u1689\u168a\u168b\u168c\u168d\u168e\u168f\u1690\u1691\u1692\u1693\u1694\u1695\u1696\u1697\u1698\u1699\u169a\u16a0\u16a1\u16a2\u16a3\u16a4\u16a5\u16a6\u16a7\u16a8\u16a9\u16aa\u16ab\u16ac\u16ad\u16ae\u16af\u16b0\u16b1\u16b2\u16b3\u16b4\u16b5\u16b6\u16b7\u16b8\u16b9\u16ba\u16bb\u16bc\u16bd\u16be\u16bf\u16c0\u16c1\u16c2\u16c3\u16c4\u16c5\u16c6\u16c7\u16c8\u16c9\u16ca\u16cb\u16cc\u16cd\u16ce\u16cf\u16d0\u16d1\u16d2\u16d3\u16d4\u16d5\u16d6\u16d7\u16d8\u16d9\u16da\u16db\u16dc\u16dd\u16de\u16df\u16e0\u16e1\u16e2\u16e3\u16e4\u16e5\u16e6\u16e7\u16e8\u16e9\u16ea\u1700\u1701\u1702\u1703\u1704\u1705\u1706\u1707\u1708\u1709\u170a\u170b\u170c\u170e\u170f\u1710\u1711\u1720\u1721\u1722\u1723\u1724\u1725\u1726\u1727\u1728\u1729\u172a\u172b\u172c\u172d\u172e\u172f\u1730\u1731\u1740\u1741\u1742\u1743\u1744\u1745\u1746\u1747\u1748\u1749\u174a\u174b\u174c\u174d\u174e\u174f\u1750\u1751\u1760\u1761\u1762\u1763\u1764\u1765\u1766\u1767\u1768\u1769\u176a\u176b\u176c\u176e\u176f\u1770\u1780\u1781\u1782\u1783\u1784\u1785\u1786\u1787\u1788\u1789\u178a\u178b\u178c\u178d\u178e\u178f\u1790\u1791\u1792\u1793\u1794\u1795\u1796\u1797\u1798\u1799\u179a\u179b\u179c\u179d\u179e\u179f\u17a0\u17a1\u17a2\u17a3\u17a4\u17a5\u17a6\u17a7\u17a8\u17a9\u17aa\u17ab\u17ac\u17ad\u17ae\u17af\u17b0\u17b1\u17b2\u17b3\u17dc\u1820\u1821\u1822\u1823\u1824\u1825\u1826\u1827\u1828\u1829\u182a\u182b\u182c\u182d\u182e\u182f\u1830\u1831\u1832\u1833\u1834\u1835\u1836\u1837\u1838\u1839\u183a\u183b\u183c\u183d\u183e\u183f\u1840\u1841\u1842\u1844\u1845\u1846\u1847\u1848\u1849\u184a\u184b\u184c\u184d\u184e\u184f\u1850\u1851\u1852\u1853\u1854\u1855\u1856\u1857\u1858\u1859\u185a\u185b\u185c\u185d\u185e\u185f\u1860\u1861\u1862\u1863\u1864\u1865\u1866\u1867\u1868\u1869\u186a\u186b\u186c\u186d\u186e\u186f\u1870\u1871\u1872\u1873\u1874\u1875\u1876\u1877\u1880\u1881\u1882\u1883\u1884\u1885\u1886\u1887\u1888\u1889\u188a\u188b\u188c\u188d\u188e\u188f\u1890\u1891\u1892\u1893\u1894\u1895\u1896\u1897\u1898\u1899\u189a\u189b\u189c\u189d\u189e\u189f\u18a0\u18a1\u18a2\u18a3\u18a4\u18a5\u18a6\u18a7\u18a8\u1900\u1901\u1902\u1903\u1904\u1905\u1906\u1907\u1908\u1909\u190a\u190b\u190c\u190d\u190e\u190f\u1910\u1911\u1912\u1913\u1914\u1915\u1916\u1917\u1918\u1919\u191a\u191b\u191c\u1950\u1951\u1952\u1953\u1954\u1955\u1956\u1957\u1958\u1959\u195a\u195b\u195c\u195d\u195e\u195f\u1960\u1961\u1962\u1963\u1964\u1965\u1966\u1967\u1968\u1969\u196a\u196b\u196c\u196d\u1970\u1971\u1972\u1973\u1974\u1980\u1981\u1982\u1983\u1984\u1985\u1986\u1987\u1988\u1989\u198a\u198b\u198c\u198d\u198e\u198f\u1990\u1991\u1992\u1993\u1994\u1995\u1996\u1997\u1998\u1999\u199a\u199b\u199c\u199d\u199e\u199f\u19a0\u19a1\u19a2\u19a3\u19a4\u19a5\u19a6\u19a7\u19a8\u19a9\u19c1\u19c2\u19c3\u19c4\u19c5\u19c6\u19c7\u1a00\u1a01\u1a02\u1a03\u1a04\u1a05\u1a06\u1a07\u1a08\u1a09\u1a0a\u1a0b\u1a0c\u1a0d\u1a0e\u1a0f\u1a10\u1a11\u1a12\u1a13\u1a14\u1a15\u1a16\u2135\u2136\u2137\u2138\u2d30\u2d31\u2d32\u2d33\u2d34\u2d35\u2d36\u2d37\u2d38\u2d39\u2d3a\u2d3b\u2d3c\u2d3d\u2d3e\u2d3f\u2d40\u2d41\u2d42\u2d43\u2d44\u2d45\u2d46\u2d47\u2d48\u2d49\u2d4a\u2d4b\u2d4c\u2d4d\u2d4e\u2d4f\u2d50\u2d51\u2d52\u2d53\u2d54\u2d55\u2d56\u2d57\u2d58\u2d59\u2d5a\u2d5b\u2d5c\u2d5d\u2d5e\u2d5f\u2d60\u2d61\u2d62\u2d63\u2d64\u2d65\u2d80\u2d81\u2d82\u2d83\u2d84\u2d85\u2d86\u2d87\u2d88\u2d89\u2d8a\u2d8b\u2d8c\u2d8d\u2d8e\u2d8f\u2d90\u2d91\u2d92\u2d93\u2d94\u2d95\u2d96\u2da0\u2da1\u2da2\u2da3\u2da4\u2da5\u2da6\u2da8\u2da9\u2daa\u2dab\u2dac\u2dad\u2dae\u2db0\u2db1\u2db2\u2db3\u2db4\u2db5\u2db6\u2db8\u2db9\u2dba\u2dbb\u2dbc\u2dbd\u2dbe\u2dc0\u2dc1\u2dc2\u2dc3\u2dc4\u2dc5\u2dc6\u2dc8\u2dc9\u2dca\u2dcb\u2dcc\u2dcd\u2dce\u2dd0\u2dd1\u2dd2\u2dd3\u2dd4\u2dd5\u2dd6\u2dd8\u2dd9\u2dda\u2ddb\u2ddc\u2ddd\u2dde\u3006\u303c\u3041\u3042\u3043\u3044\u3045\u3046\u3047\u3048\u3049\u304a\u304b\u304c\u304d\u304e\u304f\u3050\u3051\u3052\u3053\u3054\u3055\u3056\u3057\u3058\u3059\u305a\u305b\u305c\u305d\u305e\u305f\u3060\u3061\u3062\u3063\u3064\u3065\u3066\u3067\u3068\u3069\u306a\u306b\u306c\u306d\u306e\u306f\u3070\u3071\u3072\u3073\u3074\u3075\u3076\u3077\u3078\u3079\u307a\u307b\u307c\u307d\u307e\u307f\u3080\u3081\u3082\u3083\u3084\u3085\u3086\u3087\u3088\u3089\u308a\u308b\u308c\u308d\u308e\u308f\u3090\u3091\u3092\u3093\u3094\u3095\u3096\u309f\u30a1\u30a2\u30a3\u30a4\u30a5\u30a6\u30a7\u30a8\u30a9\u30aa\u30ab\u30ac\u30ad\u30ae\u30af\u30b0\u30b1\u30b2\u30b3\u30b4\u30b5\u30b6\u30b7\u30b8\u30b9\u30ba\u30bb\u30bc\u30bd\u30be\u30bf\u30c0\u30c1\u30c2\u30c3\u30c4\u30c5\u30c6\u30c7\u30c8\u30c9\u30ca\u30cb\u30cc\u30cd\u30ce\u30cf\u30d0\u30d1\u30d2\u30d3\u30d4\u30d5\u30d6\u30d7\u30d8\u30d9\u30da\u30db\u30dc\u30dd\u30de\u30df\u30e0\u30e1\u30e2\u30e3\u30e4\u30e5\u30e6\u30e7\u30e8\u30e9\u30ea\u30eb\u30ec\u30ed\u30ee\u30ef\u30f0\u30f1\u30f2\u30f3\u30f4\u30f5\u30f6\u30f7\u30f8\u30f9\u30fa\u30ff\u3105\u3106\u3107\u3108\u3109\u310a\u310b\u310c\u310d\u310e\u310f\u3110\u3111\u3112\u3113\u3114\u3115\u3116\u3117\u3118\u3119\u311a\u311b\u311c\u311d\u311e\u311f\u3120\u3121\u3122\u3123\u3124\u3125\u3126\u3127\u3128\u3129\u312a\u312b\u312c\u3131\u3132\u3133\u3134\u3135\u3136\u3137\u3138\u3139\u313a\u313b\u313c\u313d\u313e\u313f\u3140\u3141\u3142\u3143\u3144\u3145\u3146\u3147\u3148\u3149\u314a\u314b\u314c\u314d\u314e\u314f\u3150\u3151\u3152\u3153\u3154\u3155\u3156\u3157\u3158\u3159\u315a\u315b\u315c\u315d\u315e\u315f\u3160\u3161\u3162\u3163\u3164\u3165\u3166\u3167\u3168\u3169\u316a\u316b\u316c\u316d\u316e\u316f\u3170\u3171\u3172\u3173\u3174\u3175\u3176\u3177\u3178\u3179\u317a\u317b\u317c\u317d\u317e\u317f\u3180\u3181\u3182\u3183\u3184\u3185\u3186\u3187\u3188\u3189\u318a\u318b\u318c\u318d\u318e\u31a0\u31a1\u31a2\u31a3\u31a4\u31a5\u31a6\u31a7\u31a8\u31a9\u31aa\u31ab\u31ac\u31ad\u31ae\u31af\u31b0\u31b1\u31b2\u31b3\u31b4\u31b5\u31b6\u31b7\u31f0\u31f1\u31f2\u31f3\u31f4\u31f5\u31f6\u31f7\u31f8\u31f9\u31fa\u31fb\u31fc\u31fd\u31fe\u31ff\u3400\u3401\u3402\u3403\u3404\u3405\u3406\u3407\u3408\u3409\u340a\u340b\u340c\u340d\u340e\u340f\u3410\u3411\u3412\u3413\u3414\u3415\u3416\u3417\u3418\u3419\u341a\u341b\u341c\u341d\u341e\u341f\u3420\u3421\u3422\u3423\u3424\u3425\u3426\u3427\u3428\u3429\u342a\u342b\u342c\u342d\u342e\u342f\u3430\u3431\u3432\u3433\u3434\u3435\u3436\u3437\u3438\u3439\u343a\u343b\u343c\u343d\u343e\u343f\u3440\u3441\u3442\u3443\u3444\u3445\u3446\u3447\u3448\u3449\u344a\u344b\u344c\u344d\u344e\u344f\u3450\u3451\u3452\u3453\u3454\u3455\u3456\u3457\u3458\u3459\u345a\u345b\u345c\u345d\u345e\u345f\u3460\u3461\u3462\u3463\u3464\u3465\u3466\u3467\u3468\u3469\u346a\u346b\u346c\u346d\u346e\u346f\u3470\u3471\u3472\u3473\u3474\u3475\u3476\u3477\u3478\u3479\u347a\u347b\u347c\u347d\u347e\u347f\u3480\u3481\u3482\u3483\u3484\u3485\u3486\u3487\u3488\u3489\u348a\u348b\u348c\u348d\u348e\u348f\u3490\u3491\u3492\u3493\u3494\u3495\u3496\u3497\u3498\u3499\u349a\u349b\u349c\u349d\u349e\u349f\u34a0\u34a1\u34a2\u34a3\u34a4\u34a5\u34a6\u34a7\u34a8\u34a9\u34aa\u34ab\u34ac\u34ad\u34ae\u34af\u34b0\u34b1\u34b2\u34b3\u34b4\u34b5\u34b6\u34b7\u34b8\u34b9\u34ba\u34bb\u34bc\u34bd\u34be\u34bf\u34c0\u34c1\u34c2\u34c3\u34c4\u34c5\u34c6\u34c7\u34c8\u34c9\u34ca\u34cb\u34cc\u34cd\u34ce\u34cf\u34d0\u34d1\u34d2\u34d3\u34d4\u34d5\u34d6\u34d7\u34d8\u34d9\u34da\u34db\u34dc\u34dd\u34de\u34df\u34e0\u34e1\u34e2\u34e3\u34e4\u34e5\u34e6\u34e7\u34e8\u34e9\u34ea\u34eb\u34ec\u34ed\u34ee\u34ef\u34f0\u34f1\u34f2\u34f3\u34f4\u34f5\u34f6\u34f7\u34f8\u34f9\u34fa\u34fb\u34fc\u34fd\u34fe\u34ff\u3500\u3501\u3502\u3503\u3504\u3505\u3506\u3507\u3508\u3509\u350a\u350b\u350c\u350d\u350e\u350f\u3510\u3511\u3512\u3513\u3514\u3515\u3516\u3517\u3518\u3519\u351a\u351b\u351c\u351d\u351e\u351f\u3520\u3521\u3522\u3523\u3524\u3525\u3526\u3527\u3528\u3529\u352a\u352b\u352c\u352d\u352e\u352f\u3530\u3531\u3532\u3533\u3534\u3535\u3536\u3537\u3538\u3539\u353a\u353b\u353c\u353d\u353e\u353f\u3540\u3541\u3542\u3543\u3544\u3545\u3546\u3547\u3548\u3549\u354a\u354b\u354c\u354d\u354e\u354f\u3550\u3551\u3552\u3553\u3554\u3555\u3556\u3557\u3558\u3559\u355a\u355b\u355c\u355d\u355e\u355f\u3560\u3561\u3562\u3563\u3564\u3565\u3566\u3567\u3568\u3569\u356a\u356b\u356c\u356d\u356e\u356f\u3570\u3571\u3572\u3573\u3574\u3575\u3576\u3577\u3578\u3579\u357a\u357b\u357c\u357d\u357e\u357f\u3580\u3581\u3582\u3583\u3584\u3585\u3586\u3587\u3588\u3589\u358a\u358b\u358c\u358d\u358e\u358f\u3590\u3591\u3592\u3593\u3594\u3595\u3596\u3597\u3598\u3599\u359a\u359b\u359c\u359d\u359e\u359f\u35a0\u35a1\u35a2\u35a3\u35a4\u35a5\u35a6\u35a7\u35a8\u35a9\u35aa\u35ab\u35ac\u35ad\u35ae\u35af\u35b0\u35b1\u35b2\u35b3\u35b4\u35b5\u35b6\u35b7\u35b8\u35b9\u35ba\u35bb\u35bc\u35bd\u35be\u35bf\u35c0\u35c1\u35c2\u35c3\u35c4\u35c5\u35c6\u35c7\u35c8\u35c9\u35ca\u35cb\u35cc\u35cd\u35ce\u35cf\u35d0\u35d1\u35d2\u35d3\u35d4\u35d5\u35d6\u35d7\u35d8\u35d9\u35da\u35db\u35dc\u35dd\u35de\u35df\u35e0\u35e1\u35e2\u35e3\u35e4\u35e5\u35e6\u35e7\u35e8\u35e9\u35ea\u35eb\u35ec\u35ed\u35ee\u35ef\u35f0\u35f1\u35f2\u35f3\u35f4\u35f5\u35f6\u35f7\u35f8\u35f9\u35fa\u35fb\u35fc\u35fd\u35fe\u35ff\u3600\u3601\u3602\u3603\u3604\u3605\u3606\u3607\u3608\u3609\u360a\u360b\u360c\u360d\u360e\u360f\u3610\u3611\u3612\u3613\u3614\u3615\u3616\u3617\u3618\u3619\u361a\u361b\u361c\u361d\u361e\u361f\u3620\u3621\u3622\u3623\u3624\u3625\u3626\u3627\u3628\u3629\u362a\u362b\u362c\u362d\u362e\u362f\u3630\u3631\u3632\u3633\u3634\u3635\u3636\u3637\u3638\u3639\u363a\u363b\u363c\u363d\u363e\u363f\u3640\u3641\u3642\u3643\u3644\u3645\u3646\u3647\u3648\u3649\u364a\u364b\u364c\u364d\u364e\u364f\u3650\u3651\u3652\u3653\u3654\u3655\u3656\u3657\u3658\u3659\u365a\u365b\u365c\u365d\u365e\u365f\u3660\u3661\u3662\u3663\u3664\u3665\u3666\u3667\u3668\u3669\u366a\u366b\u366c\u366d\u366e\u366f\u3670\u3671\u3672\u3673\u3674\u3675\u3676\u3677\u3678\u3679\u367a\u367b\u367c\u367d\u367e\u367f\u3680\u3681\u3682\u3683\u3684\u3685\u3686\u3687\u3688\u3689\u368a\u368b\u368c\u368d\u368e\u368f\u3690\u3691\u3692\u3693\u3694\u3695\u3696\u3697\u3698\u3699\u369a\u369b\u369c\u369d\u369e\u369f\u36a0\u36a1\u36a2\u36a3\u36a4\u36a5\u36a6\u36a7\u36a8\u36a9\u36aa\u36ab\u36ac\u36ad\u36ae\u36af\u36b0\u36b1\u36b2\u36b3\u36b4\u36b5\u36b6\u36b7\u36b8\u36b9\u36ba\u36bb\u36bc\u36bd\u36be\u36bf\u36c0\u36c1\u36c2\u36c3\u36c4\u36c5\u36c6\u36c7\u36c8\u36c9\u36ca\u36cb\u36cc\u36cd\u36ce\u36cf\u36d0\u36d1\u36d2\u36d3\u36d4\u36d5\u36d6\u36d7\u36d8\u36d9\u36da\u36db\u36dc\u36dd\u36de\u36df\u36e0\u36e1\u36e2\u36e3\u36e4\u36e5\u36e6\u36e7\u36e8\u36e9\u36ea\u36eb\u36ec\u36ed\u36ee\u36ef\u36f0\u36f1\u36f2\u36f3\u36f4\u36f5\u36f6\u36f7\u36f8\u36f9\u36fa\u36fb\u36fc\u36fd\u36fe\u36ff\u3700\u3701\u3702\u3703\u3704\u3705\u3706\u3707\u3708\u3709\u370a\u370b\u370c\u370d\u370e\u370f\u3710\u3711\u3712\u3713\u3714\u3715\u3716\u3717\u3718\u3719\u371a\u371b\u371c\u371d\u371e\u371f\u3720\u3721\u3722\u3723\u3724\u3725\u3726\u3727\u3728\u3729\u372a\u372b\u372c\u372d\u372e\u372f\u3730\u3731\u3732\u3733\u3734\u3735\u3736\u3737\u3738\u3739\u373a\u373b\u373c\u373d\u373e\u373f\u3740\u3741\u3742\u3743\u3744\u3745\u3746\u3747\u3748\u3749\u374a\u374b\u374c\u374d\u374e\u374f\u3750\u3751\u3752\u3753\u3754\u3755\u3756\u3757\u3758\u3759\u375a\u375b\u375c\u375d\u375e\u375f\u3760\u3761\u3762\u3763\u3764\u3765\u3766\u3767\u3768\u3769\u376a\u376b\u376c\u376d\u376e\u376f\u3770\u3771\u3772\u3773\u3774\u3775\u3776\u3777\u3778\u3779\u377a\u377b\u377c\u377d\u377e\u377f\u3780\u3781\u3782\u3783\u3784\u3785\u3786\u3787\u3788\u3789\u378a\u378b\u378c\u378d\u378e\u378f\u3790\u3791\u3792\u3793\u3794\u3795\u3796\u3797\u3798\u3799\u379a\u379b\u379c\u379d\u379e\u379f\u37a0\u37a1\u37a2\u37a3\u37a4\u37a5\u37a6\u37a7\u37a8\u37a9\u37aa\u37ab\u37ac\u37ad\u37ae\u37af\u37b0\u37b1\u37b2\u37b3\u37b4\u37b5\u37b6\u37b7\u37b8\u37b9\u37ba\u37bb\u37bc\u37bd\u37be\u37bf\u37c0\u37c1\u37c2\u37c3\u37c4\u37c5\u37c6\u37c7\u37c8\u37c9\u37ca\u37cb\u37cc\u37cd\u37ce\u37cf\u37d0\u37d1\u37d2\u37d3\u37d4\u37d5\u37d6\u37d7\u37d8\u37d9\u37da\u37db\u37dc\u37dd\u37de\u37df\u37e0\u37e1\u37e2\u37e3\u37e4\u37e5\u37e6\u37e7\u37e8\u37e9\u37ea\u37eb\u37ec\u37ed\u37ee\u37ef\u37f0\u37f1\u37f2\u37f3\u37f4\u37f5\u37f6\u37f7\u37f8\u37f9\u37fa\u37fb\u37fc\u37fd\u37fe\u37ff\u3800\u3801\u3802\u3803\u3804\u3805\u3806\u3807\u3808\u3809\u380a\u380b\u380c\u380d\u380e\u380f\u3810\u3811\u3812\u3813\u3814\u3815\u3816\u3817\u3818\u3819\u381a\u381b\u381c\u381d\u381e\u381f\u3820\u3821\u3822\u3823\u3824\u3825\u3826\u3827\u3828\u3829\u382a\u382b\u382c\u382d\u382e\u382f\u3830\u3831\u3832\u3833\u3834\u3835\u3836\u3837\u3838\u3839\u383a\u383b\u383c\u383d\u383e\u383f\u3840\u3841\u3842\u3843\u3844\u3845\u3846\u3847\u3848\u3849\u384a\u384b\u384c\u384d\u384e\u384f\u3850\u3851\u3852\u3853\u3854\u3855\u3856\u3857\u3858\u3859\u385a\u385b\u385c\u385d\u385e\u385f\u3860\u3861\u3862\u3863\u3864\u3865\u3866\u3867\u3868\u3869\u386a\u386b\u386c\u386d\u386e\u386f\u3870\u3871\u3872\u3873\u3874\u3875\u3876\u3877\u3878\u3879\u387a\u387b\u387c\u387d\u387e\u387f\u3880\u3881\u3882\u3883\u3884\u3885\u3886\u3887\u3888\u3889\u388a\u388b\u388c\u388d\u388e\u388f\u3890\u3891\u3892\u3893\u3894\u3895\u3896\u3897\u3898\u3899\u389a\u389b\u389c\u389d\u389e\u389f\u38a0\u38a1\u38a2\u38a3\u38a4\u38a5\u38a6\u38a7\u38a8\u38a9\u38aa\u38ab\u38ac\u38ad\u38ae\u38af\u38b0\u38b1\u38b2\u38b3\u38b4\u38b5\u38b6\u38b7\u38b8\u38b9\u38ba\u38bb\u38bc\u38bd\u38be\u38bf\u38c0\u38c1\u38c2\u38c3\u38c4\u38c5\u38c6\u38c7\u38c8\u38c9\u38ca\u38cb\u38cc\u38cd\u38ce\u38cf\u38d0\u38d1\u38d2\u38d3\u38d4\u38d5\u38d6\u38d7\u38d8\u38d9\u38da\u38db\u38dc\u38dd\u38de\u38df\u38e0\u38e1\u38e2\u38e3\u38e4\u38e5\u38e6\u38e7\u38e8\u38e9\u38ea\u38eb\u38ec\u38ed\u38ee\u38ef\u38f0\u38f1\u38f2\u38f3\u38f4\u38f5\u38f6\u38f7\u38f8\u38f9\u38fa\u38fb\u38fc\u38fd\u38fe\u38ff\u3900\u3901\u3902\u3903\u3904\u3905\u3906\u3907\u3908\u3909\u390a\u390b\u390c\u390d\u390e\u390f\u3910\u3911\u3912\u3913\u3914\u3915\u3916\u3917\u3918\u3919\u391a\u391b\u391c\u391d\u391e\u391f\u3920\u3921\u3922\u3923\u3924\u3925\u3926\u3927\u3928\u3929\u392a\u392b\u392c\u392d\u392e\u392f\u3930\u3931\u3932\u3933\u3934\u3935\u3936\u3937\u3938\u3939\u393a\u393b\u393c\u393d\u393e\u393f\u3940\u3941\u3942\u3943\u3944\u3945\u3946\u3947\u3948\u3949\u394a\u394b\u394c\u394d\u394e\u394f\u3950\u3951\u3952\u3953\u3954\u3955\u3956\u3957\u3958\u3959\u395a\u395b\u395c\u395d\u395e\u395f\u3960\u3961\u3962\u3963\u3964\u3965\u3966\u3967\u3968\u3969\u396a\u396b\u396c\u396d\u396e\u396f\u3970\u3971\u3972\u3973\u3974\u3975\u3976\u3977\u3978\u3979\u397a\u397b\u397c\u397d\u397e\u397f\u3980\u3981\u3982\u3983\u3984\u3985\u3986\u3987\u3988\u3989\u398a\u398b\u398c\u398d\u398e\u398f\u3990\u3991\u3992\u3993\u3994\u3995\u3996\u3997\u3998\u3999\u399a\u399b\u399c\u399d\u399e\u399f\u39a0\u39a1\u39a2\u39a3\u39a4\u39a5\u39a6\u39a7\u39a8\u39a9\u39aa\u39ab\u39ac\u39ad\u39ae\u39af\u39b0\u39b1\u39b2\u39b3\u39b4\u39b5\u39b6\u39b7\u39b8\u39b9\u39ba\u39bb\u39bc\u39bd\u39be\u39bf\u39c0\u39c1\u39c2\u39c3\u39c4\u39c5\u39c6\u39c7\u39c8\u39c9\u39ca\u39cb\u39cc\u39cd\u39ce\u39cf\u39d0\u39d1\u39d2\u39d3\u39d4\u39d5\u39d6\u39d7\u39d8\u39d9\u39da\u39db\u39dc\u39dd\u39de\u39df\u39e0\u39e1\u39e2\u39e3\u39e4\u39e5\u39e6\u39e7\u39e8\u39e9\u39ea\u39eb\u39ec\u39ed\u39ee\u39ef\u39f0\u39f1\u39f2\u39f3\u39f4\u39f5\u39f6\u39f7\u39f8\u39f9\u39fa\u39fb\u39fc\u39fd\u39fe\u39ff\u3a00\u3a01\u3a02\u3a03\u3a04\u3a05\u3a06\u3a07\u3a08\u3a09\u3a0a\u3a0b\u3a0c\u3a0d\u3a0e\u3a0f\u3a10\u3a11\u3a12\u3a13\u3a14\u3a15\u3a16\u3a17\u3a18\u3a19\u3a1a\u3a1b\u3a1c\u3a1d\u3a1e\u3a1f\u3a20\u3a21\u3a22\u3a23\u3a24\u3a25\u3a26\u3a27\u3a28\u3a29\u3a2a\u3a2b\u3a2c\u3a2d\u3a2e\u3a2f\u3a30\u3a31\u3a32\u3a33\u3a34\u3a35\u3a36\u3a37\u3a38\u3a39\u3a3a\u3a3b\u3a3c\u3a3d\u3a3e\u3a3f\u3a40\u3a41\u3a42\u3a43\u3a44\u3a45\u3a46\u3a47\u3a48\u3a49\u3a4a\u3a4b\u3a4c\u3a4d\u3a4e\u3a4f\u3a50\u3a51\u3a52\u3a53\u3a54\u3a55\u3a56\u3a57\u3a58\u3a59\u3a5a\u3a5b\u3a5c\u3a5d\u3a5e\u3a5f\u3a60\u3a61\u3a62\u3a63\u3a64\u3a65\u3a66\u3a67\u3a68\u3a69\u3a6a\u3a6b\u3a6c\u3a6d\u3a6e\u3a6f\u3a70\u3a71\u3a72\u3a73\u3a74\u3a75\u3a76\u3a77\u3a78\u3a79\u3a7a\u3a7b\u3a7c\u3a7d\u3a7e\u3a7f\u3a80\u3a81\u3a82\u3a83\u3a84\u3a85\u3a86\u3a87\u3a88\u3a89\u3a8a\u3a8b\u3a8c\u3a8d\u3a8e\u3a8f\u3a90\u3a91\u3a92\u3a93\u3a94\u3a95\u3a96\u3a97\u3a98\u3a99\u3a9a\u3a9b\u3a9c\u3a9d\u3a9e\u3a9f\u3aa0\u3aa1\u3aa2\u3aa3\u3aa4\u3aa5\u3aa6\u3aa7\u3aa8\u3aa9\u3aaa\u3aab\u3aac\u3aad\u3aae\u3aaf\u3ab0\u3ab1\u3ab2\u3ab3\u3ab4\u3ab5\u3ab6\u3ab7\u3ab8\u3ab9\u3aba\u3abb\u3abc\u3abd\u3abe\u3abf\u3ac0\u3ac1\u3ac2\u3ac3\u3ac4\u3ac5\u3ac6\u3ac7\u3ac8\u3ac9\u3aca\u3acb\u3acc\u3acd\u3ace\u3acf\u3ad0\u3ad1\u3ad2\u3ad3\u3ad4\u3ad5\u3ad6\u3ad7\u3ad8\u3ad9\u3ada\u3adb\u3adc\u3add\u3ade\u3adf\u3ae0\u3ae1\u3ae2\u3ae3\u3ae4\u3ae5\u3ae6\u3ae7\u3ae8\u3ae9\u3aea\u3aeb\u3aec\u3aed\u3aee\u3aef\u3af0\u3af1\u3af2\u3af3\u3af4\u3af5\u3af6\u3af7\u3af8\u3af9\u3afa\u3afb\u3afc\u3afd\u3afe\u3aff\u3b00\u3b01\u3b02\u3b03\u3b04\u3b05\u3b06\u3b07\u3b08\u3b09\u3b0a\u3b0b\u3b0c\u3b0d\u3b0e\u3b0f\u3b10\u3b11\u3b12\u3b13\u3b14\u3b15\u3b16\u3b17\u3b18\u3b19\u3b1a\u3b1b\u3b1c\u3b1d\u3b1e\u3b1f\u3b20\u3b21\u3b22\u3b23\u3b24\u3b25\u3b26\u3b27\u3b28\u3b29\u3b2a\u3b2b\u3b2c\u3b2d\u3b2e\u3b2f\u3b30\u3b31\u3b32\u3b33\u3b34\u3b35\u3b36\u3b37\u3b38\u3b39\u3b3a\u3b3b\u3b3c\u3b3d\u3b3e\u3b3f\u3b40\u3b41\u3b42\u3b43\u3b44\u3b45\u3b46\u3b47\u3b48\u3b49\u3b4a\u3b4b\u3b4c\u3b4d\u3b4e\u3b4f\u3b50\u3b51\u3b52\u3b53\u3b54\u3b55\u3b56\u3b57\u3b58\u3b59\u3b5a\u3b5b\u3b5c\u3b5d\u3b5e\u3b5f\u3b60\u3b61\u3b62\u3b63\u3b64\u3b65\u3b66\u3b67\u3b68\u3b69\u3b6a\u3b6b\u3b6c\u3b6d\u3b6e\u3b6f\u3b70\u3b71\u3b72\u3b73\u3b74\u3b75\u3b76\u3b77\u3b78\u3b79\u3b7a\u3b7b\u3b7c\u3b7d\u3b7e\u3b7f\u3b80\u3b81\u3b82\u3b83\u3b84\u3b85\u3b86\u3b87\u3b88\u3b89\u3b8a\u3b8b\u3b8c\u3b8d\u3b8e\u3b8f\u3b90\u3b91\u3b92\u3b93\u3b94\u3b95\u3b96\u3b97\u3b98\u3b99\u3b9a\u3b9b\u3b9c\u3b9d\u3b9e\u3b9f\u3ba0\u3ba1\u3ba2\u3ba3\u3ba4\u3ba5\u3ba6\u3ba7\u3ba8\u3ba9\u3baa\u3bab\u3bac\u3bad\u3bae\u3baf\u3bb0\u3bb1\u3bb2\u3bb3\u3bb4\u3bb5\u3bb6\u3bb7\u3bb8\u3bb9\u3bba\u3bbb\u3bbc\u3bbd\u3bbe\u3bbf\u3bc0\u3bc1\u3bc2\u3bc3\u3bc4\u3bc5\u3bc6\u3bc7\u3bc8\u3bc9\u3bca\u3bcb\u3bcc\u3bcd\u3bce\u3bcf\u3bd0\u3bd1\u3bd2\u3bd3\u3bd4\u3bd5\u3bd6\u3bd7\u3bd8\u3bd9\u3bda\u3bdb\u3bdc\u3bdd\u3bde\u3bdf\u3be0\u3be1\u3be2\u3be3\u3be4\u3be5\u3be6\u3be7\u3be8\u3be9\u3bea\u3beb\u3bec\u3bed\u3bee\u3bef\u3bf0\u3bf1\u3bf2\u3bf3\u3bf4\u3bf5\u3bf6\u3bf7\u3bf8\u3bf9\u3bfa\u3bfb\u3bfc\u3bfd\u3bfe\u3bff\u3c00\u3c01\u3c02\u3c03\u3c04\u3c05\u3c06\u3c07\u3c08\u3c09\u3c0a\u3c0b\u3c0c\u3c0d\u3c0e\u3c0f\u3c10\u3c11\u3c12\u3c13\u3c14\u3c15\u3c16\u3c17\u3c18\u3c19\u3c1a\u3c1b\u3c1c\u3c1d\u3c1e\u3c1f\u3c20\u3c21\u3c22\u3c23\u3c24\u3c25\u3c26\u3c27\u3c28\u3c29\u3c2a\u3c2b\u3c2c\u3c2d\u3c2e\u3c2f\u3c30\u3c31\u3c32\u3c33\u3c34\u3c35\u3c36\u3c37\u3c38\u3c39\u3c3a\u3c3b\u3c3c\u3c3d\u3c3e\u3c3f\u3c40\u3c41\u3c42\u3c43\u3c44\u3c45\u3c46\u3c47\u3c48\u3c49\u3c4a\u3c4b\u3c4c\u3c4d\u3c4e\u3c4f\u3c50\u3c51\u3c52\u3c53\u3c54\u3c55\u3c56\u3c57\u3c58\u3c59\u3c5a\u3c5b\u3c5c\u3c5d\u3c5e\u3c5f\u3c60\u3c61\u3c62\u3c63\u3c64\u3c65\u3c66\u3c67\u3c68\u3c69\u3c6a\u3c6b\u3c6c\u3c6d\u3c6e\u3c6f\u3c70\u3c71\u3c72\u3c73\u3c74\u3c75\u3c76\u3c77\u3c78\u3c79\u3c7a\u3c7b\u3c7c\u3c7d\u3c7e\u3c7f\u3c80\u3c81\u3c82\u3c83\u3c84\u3c85\u3c86\u3c87\u3c88\u3c89\u3c8a\u3c8b\u3c8c\u3c8d\u3c8e\u3c8f\u3c90\u3c91\u3c92\u3c93\u3c94\u3c95\u3c96\u3c97\u3c98\u3c99\u3c9a\u3c9b\u3c9c\u3c9d\u3c9e\u3c9f\u3ca0\u3ca1\u3ca2\u3ca3\u3ca4\u3ca5\u3ca6\u3ca7\u3ca8\u3ca9\u3caa\u3cab\u3cac\u3cad\u3cae\u3caf\u3cb0\u3cb1\u3cb2\u3cb3\u3cb4\u3cb5\u3cb6\u3cb7\u3cb8\u3cb9\u3cba\u3cbb\u3cbc\u3cbd\u3cbe\u3cbf\u3cc0\u3cc1\u3cc2\u3cc3\u3cc4\u3cc5\u3cc6\u3cc7\u3cc8\u3cc9\u3cca\u3ccb\u3ccc\u3ccd\u3cce\u3ccf\u3cd0\u3cd1\u3cd2\u3cd3\u3cd4\u3cd5\u3cd6\u3cd7\u3cd8\u3cd9\u3cda\u3cdb\u3cdc\u3cdd\u3cde\u3cdf\u3ce0\u3ce1\u3ce2\u3ce3\u3ce4\u3ce5\u3ce6\u3ce7\u3ce8\u3ce9\u3cea\u3ceb\u3cec\u3ced\u3cee\u3cef\u3cf0\u3cf1\u3cf2\u3cf3\u3cf4\u3cf5\u3cf6\u3cf7\u3cf8\u3cf9\u3cfa\u3cfb\u3cfc\u3cfd\u3cfe\u3cff\u3d00\u3d01\u3d02\u3d03\u3d04\u3d05\u3d06\u3d07\u3d08\u3d09\u3d0a\u3d0b\u3d0c\u3d0d\u3d0e\u3d0f\u3d10\u3d11\u3d12\u3d13\u3d14\u3d15\u3d16\u3d17\u3d18\u3d19\u3d1a\u3d1b\u3d1c\u3d1d\u3d1e\u3d1f\u3d20\u3d21\u3d22\u3d23\u3d24\u3d25\u3d26\u3d27\u3d28\u3d29\u3d2a\u3d2b\u3d2c\u3d2d\u3d2e\u3d2f\u3d30\u3d31\u3d32\u3d33\u3d34\u3d35\u3d36\u3d37\u3d38\u3d39\u3d3a\u3d3b\u3d3c\u3d3d\u3d3e\u3d3f\u3d40\u3d41\u3d42\u3d43\u3d44\u3d45\u3d46\u3d47\u3d48\u3d49\u3d4a\u3d4b\u3d4c\u3d4d\u3d4e\u3d4f\u3d50\u3d51\u3d52\u3d53\u3d54\u3d55\u3d56\u3d57\u3d58\u3d59\u3d5a\u3d5b\u3d5c\u3d5d\u3d5e\u3d5f\u3d60\u3d61\u3d62\u3d63\u3d64\u3d65\u3d66\u3d67\u3d68\u3d69\u3d6a\u3d6b\u3d6c\u3d6d\u3d6e\u3d6f\u3d70\u3d71\u3d72\u3d73\u3d74\u3d75\u3d76\u3d77\u3d78\u3d79\u3d7a\u3d7b\u3d7c\u3d7d\u3d7e\u3d7f\u3d80\u3d81\u3d82\u3d83\u3d84\u3d85\u3d86\u3d87\u3d88\u3d89\u3d8a\u3d8b\u3d8c\u3d8d\u3d8e\u3d8f\u3d90\u3d91\u3d92\u3d93\u3d94\u3d95\u3d96\u3d97\u3d98\u3d99\u3d9a\u3d9b\u3d9c\u3d9d\u3d9e\u3d9f\u3da0\u3da1\u3da2\u3da3\u3da4\u3da5\u3da6\u3da7\u3da8\u3da9\u3daa\u3dab\u3dac\u3dad\u3dae\u3daf\u3db0\u3db1\u3db2\u3db3\u3db4\u3db5\u3db6\u3db7\u3db8\u3db9\u3dba\u3dbb\u3dbc\u3dbd\u3dbe\u3dbf\u3dc0\u3dc1\u3dc2\u3dc3\u3dc4\u3dc5\u3dc6\u3dc7\u3dc8\u3dc9\u3dca\u3dcb\u3dcc\u3dcd\u3dce\u3dcf\u3dd0\u3dd1\u3dd2\u3dd3\u3dd4\u3dd5\u3dd6\u3dd7\u3dd8\u3dd9\u3dda\u3ddb\u3ddc\u3ddd\u3dde\u3ddf\u3de0\u3de1\u3de2\u3de3\u3de4\u3de5\u3de6\u3de7\u3de8\u3de9\u3dea\u3deb\u3dec\u3ded\u3dee\u3def\u3df0\u3df1\u3df2\u3df3\u3df4\u3df5\u3df6\u3df7\u3df8\u3df9\u3dfa\u3dfb\u3dfc\u3dfd\u3dfe\u3dff\u3e00\u3e01\u3e02\u3e03\u3e04\u3e05\u3e06\u3e07\u3e08\u3e09\u3e0a\u3e0b\u3e0c\u3e0d\u3e0e\u3e0f\u3e10\u3e11\u3e12\u3e13\u3e14\u3e15\u3e16\u3e17\u3e18\u3e19\u3e1a\u3e1b\u3e1c\u3e1d\u3e1e\u3e1f\u3e20\u3e21\u3e22\u3e23\u3e24\u3e25\u3e26\u3e27\u3e28\u3e29\u3e2a\u3e2b\u3e2c\u3e2d\u3e2e\u3e2f\u3e30\u3e31\u3e32\u3e33\u3e34\u3e35\u3e36\u3e37\u3e38\u3e39\u3e3a\u3e3b\u3e3c\u3e3d\u3e3e\u3e3f\u3e40\u3e41\u3e42\u3e43\u3e44\u3e45\u3e46\u3e47\u3e48\u3e49\u3e4a\u3e4b\u3e4c\u3e4d\u3e4e\u3e4f\u3e50\u3e51\u3e52\u3e53\u3e54\u3e55\u3e56\u3e57\u3e58\u3e59\u3e5a\u3e5b\u3e5c\u3e5d\u3e5e\u3e5f\u3e60\u3e61\u3e62\u3e63\u3e64\u3e65\u3e66\u3e67\u3e68\u3e69\u3e6a\u3e6b\u3e6c\u3e6d\u3e6e\u3e6f\u3e70\u3e71\u3e72\u3e73\u3e74\u3e75\u3e76\u3e77\u3e78\u3e79\u3e7a\u3e7b\u3e7c\u3e7d\u3e7e\u3e7f\u3e80\u3e81\u3e82\u3e83\u3e84\u3e85\u3e86\u3e87\u3e88\u3e89\u3e8a\u3e8b\u3e8c\u3e8d\u3e8e\u3e8f\u3e90\u3e91\u3e92\u3e93\u3e94\u3e95\u3e96\u3e97\u3e98\u3e99\u3e9a\u3e9b\u3e9c\u3e9d\u3e9e\u3e9f\u3ea0\u3ea1\u3ea2\u3ea3\u3ea4\u3ea5\u3ea6\u3ea7\u3ea8\u3ea9\u3eaa\u3eab\u3eac\u3ead\u3eae\u3eaf\u3eb0\u3eb1\u3eb2\u3eb3\u3eb4\u3eb5\u3eb6\u3eb7\u3eb8\u3eb9\u3eba\u3ebb\u3ebc\u3ebd\u3ebe\u3ebf\u3ec0\u3ec1\u3ec2\u3ec3\u3ec4\u3ec5\u3ec6\u3ec7\u3ec8\u3ec9\u3eca\u3ecb\u3ecc\u3ecd\u3ece\u3ecf\u3ed0\u3ed1\u3ed2\u3ed3\u3ed4\u3ed5\u3ed6\u3ed7\u3ed8\u3ed9\u3eda\u3edb\u3edc\u3edd\u3ede\u3edf\u3ee0\u3ee1\u3ee2\u3ee3\u3ee4\u3ee5\u3ee6\u3ee7\u3ee8\u3ee9\u3eea\u3eeb\u3eec\u3eed\u3eee\u3eef\u3ef0\u3ef1\u3ef2\u3ef3\u3ef4\u3ef5\u3ef6\u3ef7\u3ef8\u3ef9\u3efa\u3efb\u3efc\u3efd\u3efe\u3eff\u3f00\u3f01\u3f02\u3f03\u3f04\u3f05\u3f06\u3f07\u3f08\u3f09\u3f0a\u3f0b\u3f0c\u3f0d\u3f0e\u3f0f\u3f10\u3f11\u3f12\u3f13\u3f14\u3f15\u3f16\u3f17\u3f18\u3f19\u3f1a\u3f1b\u3f1c\u3f1d\u3f1e\u3f1f\u3f20\u3f21\u3f22\u3f23\u3f24\u3f25\u3f26\u3f27\u3f28\u3f29\u3f2a\u3f2b\u3f2c\u3f2d\u3f2e\u3f2f\u3f30\u3f31\u3f32\u3f33\u3f34\u3f35\u3f36\u3f37\u3f38\u3f39\u3f3a\u3f3b\u3f3c\u3f3d\u3f3e\u3f3f\u3f40\u3f41\u3f42\u3f43\u3f44\u3f45\u3f46\u3f47\u3f48\u3f49\u3f4a\u3f4b\u3f4c\u3f4d\u3f4e\u3f4f\u3f50\u3f51\u3f52\u3f53\u3f54\u3f55\u3f56\u3f57\u3f58\u3f59\u3f5a\u3f5b\u3f5c\u3f5d\u3f5e\u3f5f\u3f60\u3f61\u3f62\u3f63\u3f64\u3f65\u3f66\u3f67\u3f68\u3f69\u3f6a\u3f6b\u3f6c\u3f6d\u3f6e\u3f6f\u3f70\u3f71\u3f72\u3f73\u3f74\u3f75\u3f76\u3f77\u3f78\u3f79\u3f7a\u3f7b\u3f7c\u3f7d\u3f7e\u3f7f\u3f80\u3f81\u3f82\u3f83\u3f84\u3f85\u3f86\u3f87\u3f88\u3f89\u3f8a\u3f8b\u3f8c\u3f8d\u3f8e\u3f8f\u3f90\u3f91\u3f92\u3f93\u3f94\u3f95\u3f96\u3f97\u3f98\u3f99\u3f9a\u3f9b\u3f9c\u3f9d\u3f9e\u3f9f\u3fa0\u3fa1\u3fa2\u3fa3\u3fa4\u3fa5\u3fa6\u3fa7\u3fa8\u3fa9\u3faa\u3fab\u3fac\u3fad\u3fae\u3faf\u3fb0\u3fb1\u3fb2\u3fb3\u3fb4\u3fb5\u3fb6\u3fb7\u3fb8\u3fb9\u3fba\u3fbb\u3fbc\u3fbd\u3fbe\u3fbf\u3fc0\u3fc1\u3fc2\u3fc3\u3fc4\u3fc5\u3fc6\u3fc7\u3fc8\u3fc9\u3fca\u3fcb\u3fcc\u3fcd\u3fce\u3fcf\u3fd0\u3fd1\u3fd2\u3fd3\u3fd4\u3fd5\u3fd6\u3fd7\u3fd8\u3fd9\u3fda\u3fdb\u3fdc\u3fdd\u3fde\u3fdf\u3fe0\u3fe1\u3fe2\u3fe3\u3fe4\u3fe5\u3fe6\u3fe7\u3fe8\u3fe9\u3fea\u3feb\u3fec\u3fed\u3fee\u3fef\u3ff0\u3ff1\u3ff2\u3ff3\u3ff4\u3ff5\u3ff6\u3ff7\u3ff8\u3ff9\u3ffa\u3ffb\u3ffc\u3ffd\u3ffe\u3fff\u4000\u4001\u4002\u4003\u4004\u4005\u4006\u4007\u4008\u4009\u400a\u400b\u400c\u400d\u400e\u400f\u4010\u4011\u4012\u4013\u4014\u4015\u4016\u4017\u4018\u4019\u401a\u401b\u401c\u401d\u401e\u401f\u4020\u4021\u4022\u4023\u4024\u4025\u4026\u4027\u4028\u4029\u402a\u402b\u402c\u402d\u402e\u402f\u4030\u4031\u4032\u4033\u4034\u4035\u4036\u4037\u4038\u4039\u403a\u403b\u403c\u403d\u403e\u403f\u4040\u4041\u4042\u4043\u4044\u4045\u4046\u4047\u4048\u4049\u404a\u404b\u404c\u404d\u404e\u404f\u4050\u4051\u4052\u4053\u4054\u4055\u4056\u4057\u4058\u4059\u405a\u405b\u405c\u405d\u405e\u405f\u4060\u4061\u4062\u4063\u4064\u4065\u4066\u4067\u4068\u4069\u406a\u406b\u406c\u406d\u406e\u406f\u4070\u4071\u4072\u4073\u4074\u4075\u4076\u4077\u4078\u4079\u407a\u407b\u407c\u407d\u407e\u407f\u4080\u4081\u4082\u4083\u4084\u4085\u4086\u4087\u4088\u4089\u408a\u408b\u408c\u408d\u408e\u408f\u4090\u4091\u4092\u4093\u4094\u4095\u4096\u4097\u4098\u4099\u409a\u409b\u409c\u409d\u409e\u409f\u40a0\u40a1\u40a2\u40a3\u40a4\u40a5\u40a6\u40a7\u40a8\u40a9\u40aa\u40ab\u40ac\u40ad\u40ae\u40af\u40b0\u40b1\u40b2\u40b3\u40b4\u40b5\u40b6\u40b7\u40b8\u40b9\u40ba\u40bb\u40bc\u40bd\u40be\u40bf\u40c0\u40c1\u40c2\u40c3\u40c4\u40c5\u40c6\u40c7\u40c8\u40c9\u40ca\u40cb\u40cc\u40cd\u40ce\u40cf\u40d0\u40d1\u40d2\u40d3\u40d4\u40d5\u40d6\u40d7\u40d8\u40d9\u40da\u40db\u40dc\u40dd\u40de\u40df\u40e0\u40e1\u40e2\u40e3\u40e4\u40e5\u40e6\u40e7\u40e8\u40e9\u40ea\u40eb\u40ec\u40ed\u40ee\u40ef\u40f0\u40f1\u40f2\u40f3\u40f4\u40f5\u40f6\u40f7\u40f8\u40f9\u40fa\u40fb\u40fc\u40fd\u40fe\u40ff\u4100\u4101\u4102\u4103\u4104\u4105\u4106\u4107\u4108\u4109\u410a\u410b\u410c\u410d\u410e\u410f\u4110\u4111\u4112\u4113\u4114\u4115\u4116\u4117\u4118\u4119\u411a\u411b\u411c\u411d\u411e\u411f\u4120\u4121\u4122\u4123\u4124\u4125\u4126\u4127\u4128\u4129\u412a\u412b\u412c\u412d\u412e\u412f\u4130\u4131\u4132\u4133\u4134\u4135\u4136\u4137\u4138\u4139\u413a\u413b\u413c\u413d\u413e\u413f\u4140\u4141\u4142\u4143\u4144\u4145\u4146\u4147\u4148\u4149\u414a\u414b\u414c\u414d\u414e\u414f\u4150\u4151\u4152\u4153\u4154\u4155\u4156\u4157\u4158\u4159\u415a\u415b\u415c\u415d\u415e\u415f\u4160\u4161\u4162\u4163\u4164\u4165\u4166\u4167\u4168\u4169\u416a\u416b\u416c\u416d\u416e\u416f\u4170\u4171\u4172\u4173\u4174\u4175\u4176\u4177\u4178\u4179\u417a\u417b\u417c\u417d\u417e\u417f\u4180\u4181\u4182\u4183\u4184\u4185\u4186\u4187\u4188\u4189\u418a\u418b\u418c\u418d\u418e\u418f\u4190\u4191\u4192\u4193\u4194\u4195\u4196\u4197\u4198\u4199\u419a\u419b\u419c\u419d\u419e\u419f\u41a0\u41a1\u41a2\u41a3\u41a4\u41a5\u41a6\u41a7\u41a8\u41a9\u41aa\u41ab\u41ac\u41ad\u41ae\u41af\u41b0\u41b1\u41b2\u41b3\u41b4\u41b5\u41b6\u41b7\u41b8\u41b9\u41ba\u41bb\u41bc\u41bd\u41be\u41bf\u41c0\u41c1\u41c2\u41c3\u41c4\u41c5\u41c6\u41c7\u41c8\u41c9\u41ca\u41cb\u41cc\u41cd\u41ce\u41cf\u41d0\u41d1\u41d2\u41d3\u41d4\u41d5\u41d6\u41d7\u41d8\u41d9\u41da\u41db\u41dc\u41dd\u41de\u41df\u41e0\u41e1\u41e2\u41e3\u41e4\u41e5\u41e6\u41e7\u41e8\u41e9\u41ea\u41eb\u41ec\u41ed\u41ee\u41ef\u41f0\u41f1\u41f2\u41f3\u41f4\u41f5\u41f6\u41f7\u41f8\u41f9\u41fa\u41fb\u41fc\u41fd\u41fe\u41ff\u4200\u4201\u4202\u4203\u4204\u4205\u4206\u4207\u4208\u4209\u420a\u420b\u420c\u420d\u420e\u420f\u4210\u4211\u4212\u4213\u4214\u4215\u4216\u4217\u4218\u4219\u421a\u421b\u421c\u421d\u421e\u421f\u4220\u4221\u4222\u4223\u4224\u4225\u4226\u4227\u4228\u4229\u422a\u422b\u422c\u422d\u422e\u422f\u4230\u4231\u4232\u4233\u4234\u4235\u4236\u4237\u4238\u4239\u423a\u423b\u423c\u423d\u423e\u423f\u4240\u4241\u4242\u4243\u4244\u4245\u4246\u4247\u4248\u4249\u424a\u424b\u424c\u424d\u424e\u424f\u4250\u4251\u4252\u4253\u4254\u4255\u4256\u4257\u4258\u4259\u425a\u425b\u425c\u425d\u425e\u425f\u4260\u4261\u4262\u4263\u4264\u4265\u4266\u4267\u4268\u4269\u426a\u426b\u426c\u426d\u426e\u426f\u4270\u4271\u4272\u4273\u4274\u4275\u4276\u4277\u4278\u4279\u427a\u427b\u427c\u427d\u427e\u427f\u4280\u4281\u4282\u4283\u4284\u4285\u4286\u4287\u4288\u4289\u428a\u428b\u428c\u428d\u428e\u428f\u4290\u4291\u4292\u4293\u4294\u4295\u4296\u4297\u4298\u4299\u429a\u429b\u429c\u429d\u429e\u429f\u42a0\u42a1\u42a2\u42a3\u42a4\u42a5\u42a6\u42a7\u42a8\u42a9\u42aa\u42ab\u42ac\u42ad\u42ae\u42af\u42b0\u42b1\u42b2\u42b3\u42b4\u42b5\u42b6\u42b7\u42b8\u42b9\u42ba\u42bb\u42bc\u42bd\u42be\u42bf\u42c0\u42c1\u42c2\u42c3\u42c4\u42c5\u42c6\u42c7\u42c8\u42c9\u42ca\u42cb\u42cc\u42cd\u42ce\u42cf\u42d0\u42d1\u42d2\u42d3\u42d4\u42d5\u42d6\u42d7\u42d8\u42d9\u42da\u42db\u42dc\u42dd\u42de\u42df\u42e0\u42e1\u42e2\u42e3\u42e4\u42e5\u42e6\u42e7\u42e8\u42e9\u42ea\u42eb\u42ec\u42ed\u42ee\u42ef\u42f0\u42f1\u42f2\u42f3\u42f4\u42f5\u42f6\u42f7\u42f8\u42f9\u42fa\u42fb\u42fc\u42fd\u42fe\u42ff\u4300\u4301\u4302\u4303\u4304\u4305\u4306\u4307\u4308\u4309\u430a\u430b\u430c\u430d\u430e\u430f\u4310\u4311\u4312\u4313\u4314\u4315\u4316\u4317\u4318\u4319\u431a\u431b\u431c\u431d\u431e\u431f\u4320\u4321\u4322\u4323\u4324\u4325\u4326\u4327\u4328\u4329\u432a\u432b\u432c\u432d\u432e\u432f\u4330\u4331\u4332\u4333\u4334\u4335\u4336\u4337\u4338\u4339\u433a\u433b\u433c\u433d\u433e\u433f\u4340\u4341\u4342\u4343\u4344\u4345\u4346\u4347\u4348\u4349\u434a\u434b\u434c\u434d\u434e\u434f\u4350\u4351\u4352\u4353\u4354\u4355\u4356\u4357\u4358\u4359\u435a\u435b\u435c\u435d\u435e\u435f\u4360\u4361\u4362\u4363\u4364\u4365\u4366\u4367\u4368\u4369\u436a\u436b\u436c\u436d\u436e\u436f\u4370\u4371\u4372\u4373\u4374\u4375\u4376\u4377\u4378\u4379\u437a\u437b\u437c\u437d\u437e\u437f\u4380\u4381\u4382\u4383\u4384\u4385\u4386\u4387\u4388\u4389\u438a\u438b\u438c\u438d\u438e\u438f\u4390\u4391\u4392\u4393\u4394\u4395\u4396\u4397\u4398\u4399\u439a\u439b\u439c\u439d\u439e\u439f\u43a0\u43a1\u43a2\u43a3\u43a4\u43a5\u43a6\u43a7\u43a8\u43a9\u43aa\u43ab\u43ac\u43ad\u43ae\u43af\u43b0\u43b1\u43b2\u43b3\u43b4\u43b5\u43b6\u43b7\u43b8\u43b9\u43ba\u43bb\u43bc\u43bd\u43be\u43bf\u43c0\u43c1\u43c2\u43c3\u43c4\u43c5\u43c6\u43c7\u43c8\u43c9\u43ca\u43cb\u43cc\u43cd\u43ce\u43cf\u43d0\u43d1\u43d2\u43d3\u43d4\u43d5\u43d6\u43d7\u43d8\u43d9\u43da\u43db\u43dc\u43dd\u43de\u43df\u43e0\u43e1\u43e2\u43e3\u43e4\u43e5\u43e6\u43e7\u43e8\u43e9\u43ea\u43eb\u43ec\u43ed\u43ee\u43ef\u43f0\u43f1\u43f2\u43f3\u43f4\u43f5\u43f6\u43f7\u43f8\u43f9\u43fa\u43fb\u43fc\u43fd\u43fe\u43ff\u4400\u4401\u4402\u4403\u4404\u4405\u4406\u4407\u4408\u4409\u440a\u440b\u440c\u440d\u440e\u440f\u4410\u4411\u4412\u4413\u4414\u4415\u4416\u4417\u4418\u4419\u441a\u441b\u441c\u441d\u441e\u441f\u4420\u4421\u4422\u4423\u4424\u4425\u4426\u4427\u4428\u4429\u442a\u442b\u442c\u442d\u442e\u442f\u4430\u4431\u4432\u4433\u4434\u4435\u4436\u4437\u4438\u4439\u443a\u443b\u443c\u443d\u443e\u443f\u4440\u4441\u4442\u4443\u4444\u4445\u4446\u4447\u4448\u4449\u444a\u444b\u444c\u444d\u444e\u444f\u4450\u4451\u4452\u4453\u4454\u4455\u4456\u4457\u4458\u4459\u445a\u445b\u445c\u445d\u445e\u445f\u4460\u4461\u4462\u4463\u4464\u4465\u4466\u4467\u4468\u4469\u446a\u446b\u446c\u446d\u446e\u446f\u4470\u4471\u4472\u4473\u4474\u4475\u4476\u4477\u4478\u4479\u447a\u447b\u447c\u447d\u447e\u447f\u4480\u4481\u4482\u4483\u4484\u4485\u4486\u4487\u4488\u4489\u448a\u448b\u448c\u448d\u448e\u448f\u4490\u4491\u4492\u4493\u4494\u4495\u4496\u4497\u4498\u4499\u449a\u449b\u449c\u449d\u449e\u449f\u44a0\u44a1\u44a2\u44a3\u44a4\u44a5\u44a6\u44a7\u44a8\u44a9\u44aa\u44ab\u44ac\u44ad\u44ae\u44af\u44b0\u44b1\u44b2\u44b3\u44b4\u44b5\u44b6\u44b7\u44b8\u44b9\u44ba\u44bb\u44bc\u44bd\u44be\u44bf\u44c0\u44c1\u44c2\u44c3\u44c4\u44c5\u44c6\u44c7\u44c8\u44c9\u44ca\u44cb\u44cc\u44cd\u44ce\u44cf\u44d0\u44d1\u44d2\u44d3\u44d4\u44d5\u44d6\u44d7\u44d8\u44d9\u44da\u44db\u44dc\u44dd\u44de\u44df\u44e0\u44e1\u44e2\u44e3\u44e4\u44e5\u44e6\u44e7\u44e8\u44e9\u44ea\u44eb\u44ec\u44ed\u44ee\u44ef\u44f0\u44f1\u44f2\u44f3\u44f4\u44f5\u44f6\u44f7\u44f8\u44f9\u44fa\u44fb\u44fc\u44fd\u44fe\u44ff\u4500\u4501\u4502\u4503\u4504\u4505\u4506\u4507\u4508\u4509\u450a\u450b\u450c\u450d\u450e\u450f\u4510\u4511\u4512\u4513\u4514\u4515\u4516\u4517\u4518\u4519\u451a\u451b\u451c\u451d\u451e\u451f\u4520\u4521\u4522\u4523\u4524\u4525\u4526\u4527\u4528\u4529\u452a\u452b\u452c\u452d\u452e\u452f\u4530\u4531\u4532\u4533\u4534\u4535\u4536\u4537\u4538\u4539\u453a\u453b\u453c\u453d\u453e\u453f\u4540\u4541\u4542\u4543\u4544\u4545\u4546\u4547\u4548\u4549\u454a\u454b\u454c\u454d\u454e\u454f\u4550\u4551\u4552\u4553\u4554\u4555\u4556\u4557\u4558\u4559\u455a\u455b\u455c\u455d\u455e\u455f\u4560\u4561\u4562\u4563\u4564\u4565\u4566\u4567\u4568\u4569\u456a\u456b\u456c\u456d\u456e\u456f\u4570\u4571\u4572\u4573\u4574\u4575\u4576\u4577\u4578\u4579\u457a\u457b\u457c\u457d\u457e\u457f\u4580\u4581\u4582\u4583\u4584\u4585\u4586\u4587\u4588\u4589\u458a\u458b\u458c\u458d\u458e\u458f\u4590\u4591\u4592\u4593\u4594\u4595\u4596\u4597\u4598\u4599\u459a\u459b\u459c\u459d\u459e\u459f\u45a0\u45a1\u45a2\u45a3\u45a4\u45a5\u45a6\u45a7\u45a8\u45a9\u45aa\u45ab\u45ac\u45ad\u45ae\u45af\u45b0\u45b1\u45b2\u45b3\u45b4\u45b5\u45b6\u45b7\u45b8\u45b9\u45ba\u45bb\u45bc\u45bd\u45be\u45bf\u45c0\u45c1\u45c2\u45c3\u45c4\u45c5\u45c6\u45c7\u45c8\u45c9\u45ca\u45cb\u45cc\u45cd\u45ce\u45cf\u45d0\u45d1\u45d2\u45d3\u45d4\u45d5\u45d6\u45d7\u45d8\u45d9\u45da\u45db\u45dc\u45dd\u45de\u45df\u45e0\u45e1\u45e2\u45e3\u45e4\u45e5\u45e6\u45e7\u45e8\u45e9\u45ea\u45eb\u45ec\u45ed\u45ee\u45ef\u45f0\u45f1\u45f2\u45f3\u45f4\u45f5\u45f6\u45f7\u45f8\u45f9\u45fa\u45fb\u45fc\u45fd\u45fe\u45ff\u4600\u4601\u4602\u4603\u4604\u4605\u4606\u4607\u4608\u4609\u460a\u460b\u460c\u460d\u460e\u460f\u4610\u4611\u4612\u4613\u4614\u4615\u4616\u4617\u4618\u4619\u461a\u461b\u461c\u461d\u461e\u461f\u4620\u4621\u4622\u4623\u4624\u4625\u4626\u4627\u4628\u4629\u462a\u462b\u462c\u462d\u462e\u462f\u4630\u4631\u4632\u4633\u4634\u4635\u4636\u4637\u4638\u4639\u463a\u463b\u463c\u463d\u463e\u463f\u4640\u4641\u4642\u4643\u4644\u4645\u4646\u4647\u4648\u4649\u464a\u464b\u464c\u464d\u464e\u464f\u4650\u4651\u4652\u4653\u4654\u4655\u4656\u4657\u4658\u4659\u465a\u465b\u465c\u465d\u465e\u465f\u4660\u4661\u4662\u4663\u4664\u4665\u4666\u4667\u4668\u4669\u466a\u466b\u466c\u466d\u466e\u466f\u4670\u4671\u4672\u4673\u4674\u4675\u4676\u4677\u4678\u4679\u467a\u467b\u467c\u467d\u467e\u467f\u4680\u4681\u4682\u4683\u4684\u4685\u4686\u4687\u4688\u4689\u468a\u468b\u468c\u468d\u468e\u468f\u4690\u4691\u4692\u4693\u4694\u4695\u4696\u4697\u4698\u4699\u469a\u469b\u469c\u469d\u469e\u469f\u46a0\u46a1\u46a2\u46a3\u46a4\u46a5\u46a6\u46a7\u46a8\u46a9\u46aa\u46ab\u46ac\u46ad\u46ae\u46af\u46b0\u46b1\u46b2\u46b3\u46b4\u46b5\u46b6\u46b7\u46b8\u46b9\u46ba\u46bb\u46bc\u46bd\u46be\u46bf\u46c0\u46c1\u46c2\u46c3\u46c4\u46c5\u46c6\u46c7\u46c8\u46c9\u46ca\u46cb\u46cc\u46cd\u46ce\u46cf\u46d0\u46d1\u46d2\u46d3\u46d4\u46d5\u46d6\u46d7\u46d8\u46d9\u46da\u46db\u46dc\u46dd\u46de\u46df\u46e0\u46e1\u46e2\u46e3\u46e4\u46e5\u46e6\u46e7\u46e8\u46e9\u46ea\u46eb\u46ec\u46ed\u46ee\u46ef\u46f0\u46f1\u46f2\u46f3\u46f4\u46f5\u46f6\u46f7\u46f8\u46f9\u46fa\u46fb\u46fc\u46fd\u46fe\u46ff\u4700\u4701\u4702\u4703\u4704\u4705\u4706\u4707\u4708\u4709\u470a\u470b\u470c\u470d\u470e\u470f\u4710\u4711\u4712\u4713\u4714\u4715\u4716\u4717\u4718\u4719\u471a\u471b\u471c\u471d\u471e\u471f\u4720\u4721\u4722\u4723\u4724\u4725\u4726\u4727\u4728\u4729\u472a\u472b\u472c\u472d\u472e\u472f\u4730\u4731\u4732\u4733\u4734\u4735\u4736\u4737\u4738\u4739\u473a\u473b\u473c\u473d\u473e\u473f\u4740\u4741\u4742\u4743\u4744\u4745\u4746\u4747\u4748\u4749\u474a\u474b\u474c\u474d\u474e\u474f\u4750\u4751\u4752\u4753\u4754\u4755\u4756\u4757\u4758\u4759\u475a\u475b\u475c\u475d\u475e\u475f\u4760\u4761\u4762\u4763\u4764\u4765\u4766\u4767\u4768\u4769\u476a\u476b\u476c\u476d\u476e\u476f\u4770\u4771\u4772\u4773\u4774\u4775\u4776\u4777\u4778\u4779\u477a\u477b\u477c\u477d\u477e\u477f\u4780\u4781\u4782\u4783\u4784\u4785\u4786\u4787\u4788\u4789\u478a\u478b\u478c\u478d\u478e\u478f\u4790\u4791\u4792\u4793\u4794\u4795\u4796\u4797\u4798\u4799\u479a\u479b\u479c\u479d\u479e\u479f\u47a0\u47a1\u47a2\u47a3\u47a4\u47a5\u47a6\u47a7\u47a8\u47a9\u47aa\u47ab\u47ac\u47ad\u47ae\u47af\u47b0\u47b1\u47b2\u47b3\u47b4\u47b5\u47b6\u47b7\u47b8\u47b9\u47ba\u47bb\u47bc\u47bd\u47be\u47bf\u47c0\u47c1\u47c2\u47c3\u47c4\u47c5\u47c6\u47c7\u47c8\u47c9\u47ca\u47cb\u47cc\u47cd\u47ce\u47cf\u47d0\u47d1\u47d2\u47d3\u47d4\u47d5\u47d6\u47d7\u47d8\u47d9\u47da\u47db\u47dc\u47dd\u47de\u47df\u47e0\u47e1\u47e2\u47e3\u47e4\u47e5\u47e6\u47e7\u47e8\u47e9\u47ea\u47eb\u47ec\u47ed\u47ee\u47ef\u47f0\u47f1\u47f2\u47f3\u47f4\u47f5\u47f6\u47f7\u47f8\u47f9\u47fa\u47fb\u47fc\u47fd\u47fe\u47ff\u4800\u4801\u4802\u4803\u4804\u4805\u4806\u4807\u4808\u4809\u480a\u480b\u480c\u480d\u480e\u480f\u4810\u4811\u4812\u4813\u4814\u4815\u4816\u4817\u4818\u4819\u481a\u481b\u481c\u481d\u481e\u481f\u4820\u4821\u4822\u4823\u4824\u4825\u4826\u4827\u4828\u4829\u482a\u482b\u482c\u482d\u482e\u482f\u4830\u4831\u4832\u4833\u4834\u4835\u4836\u4837\u4838\u4839\u483a\u483b\u483c\u483d\u483e\u483f\u4840\u4841\u4842\u4843\u4844\u4845\u4846\u4847\u4848\u4849\u484a\u484b\u484c\u484d\u484e\u484f\u4850\u4851\u4852\u4853\u4854\u4855\u4856\u4857\u4858\u4859\u485a\u485b\u485c\u485d\u485e\u485f\u4860\u4861\u4862\u4863\u4864\u4865\u4866\u4867\u4868\u4869\u486a\u486b\u486c\u486d\u486e\u486f\u4870\u4871\u4872\u4873\u4874\u4875\u4876\u4877\u4878\u4879\u487a\u487b\u487c\u487d\u487e\u487f\u4880\u4881\u4882\u4883\u4884\u4885\u4886\u4887\u4888\u4889\u488a\u488b\u488c\u488d\u488e\u488f\u4890\u4891\u4892\u4893\u4894\u4895\u4896\u4897\u4898\u4899\u489a\u489b\u489c\u489d\u489e\u489f\u48a0\u48a1\u48a2\u48a3\u48a4\u48a5\u48a6\u48a7\u48a8\u48a9\u48aa\u48ab\u48ac\u48ad\u48ae\u48af\u48b0\u48b1\u48b2\u48b3\u48b4\u48b5\u48b6\u48b7\u48b8\u48b9\u48ba\u48bb\u48bc\u48bd\u48be\u48bf\u48c0\u48c1\u48c2\u48c3\u48c4\u48c5\u48c6\u48c7\u48c8\u48c9\u48ca\u48cb\u48cc\u48cd\u48ce\u48cf\u48d0\u48d1\u48d2\u48d3\u48d4\u48d5\u48d6\u48d7\u48d8\u48d9\u48da\u48db\u48dc\u48dd\u48de\u48df\u48e0\u48e1\u48e2\u48e3\u48e4\u48e5\u48e6\u48e7\u48e8\u48e9\u48ea\u48eb\u48ec\u48ed\u48ee\u48ef\u48f0\u48f1\u48f2\u48f3\u48f4\u48f5\u48f6\u48f7\u48f8\u48f9\u48fa\u48fb\u48fc\u48fd\u48fe\u48ff\u4900\u4901\u4902\u4903\u4904\u4905\u4906\u4907\u4908\u4909\u490a\u490b\u490c\u490d\u490e\u490f\u4910\u4911\u4912\u4913\u4914\u4915\u4916\u4917\u4918\u4919\u491a\u491b\u491c\u491d\u491e\u491f\u4920\u4921\u4922\u4923\u4924\u4925\u4926\u4927\u4928\u4929\u492a\u492b\u492c\u492d\u492e\u492f\u4930\u4931\u4932\u4933\u4934\u4935\u4936\u4937\u4938\u4939\u493a\u493b\u493c\u493d\u493e\u493f\u4940\u4941\u4942\u4943\u4944\u4945\u4946\u4947\u4948\u4949\u494a\u494b\u494c\u494d\u494e\u494f\u4950\u4951\u4952\u4953\u4954\u4955\u4956\u4957\u4958\u4959\u495a\u495b\u495c\u495d\u495e\u495f\u4960\u4961\u4962\u4963\u4964\u4965\u4966\u4967\u4968\u4969\u496a\u496b\u496c\u496d\u496e\u496f\u4970\u4971\u4972\u4973\u4974\u4975\u4976\u4977\u4978\u4979\u497a\u497b\u497c\u497d\u497e\u497f\u4980\u4981\u4982\u4983\u4984\u4985\u4986\u4987\u4988\u4989\u498a\u498b\u498c\u498d\u498e\u498f\u4990\u4991\u4992\u4993\u4994\u4995\u4996\u4997\u4998\u4999\u499a\u499b\u499c\u499d\u499e\u499f\u49a0\u49a1\u49a2\u49a3\u49a4\u49a5\u49a6\u49a7\u49a8\u49a9\u49aa\u49ab\u49ac\u49ad\u49ae\u49af\u49b0\u49b1\u49b2\u49b3\u49b4\u49b5\u49b6\u49b7\u49b8\u49b9\u49ba\u49bb\u49bc\u49bd\u49be\u49bf\u49c0\u49c1\u49c2\u49c3\u49c4\u49c5\u49c6\u49c7\u49c8\u49c9\u49ca\u49cb\u49cc\u49cd\u49ce\u49cf\u49d0\u49d1\u49d2\u49d3\u49d4\u49d5\u49d6\u49d7\u49d8\u49d9\u49da\u49db\u49dc\u49dd\u49de\u49df\u49e0\u49e1\u49e2\u49e3\u49e4\u49e5\u49e6\u49e7\u49e8\u49e9\u49ea\u49eb\u49ec\u49ed\u49ee\u49ef\u49f0\u49f1\u49f2\u49f3\u49f4\u49f5\u49f6\u49f7\u49f8\u49f9\u49fa\u49fb\u49fc\u49fd\u49fe\u49ff\u4a00\u4a01\u4a02\u4a03\u4a04\u4a05\u4a06\u4a07\u4a08\u4a09\u4a0a\u4a0b\u4a0c\u4a0d\u4a0e\u4a0f\u4a10\u4a11\u4a12\u4a13\u4a14\u4a15\u4a16\u4a17\u4a18\u4a19\u4a1a\u4a1b\u4a1c\u4a1d\u4a1e\u4a1f\u4a20\u4a21\u4a22\u4a23\u4a24\u4a25\u4a26\u4a27\u4a28\u4a29\u4a2a\u4a2b\u4a2c\u4a2d\u4a2e\u4a2f\u4a30\u4a31\u4a32\u4a33\u4a34\u4a35\u4a36\u4a37\u4a38\u4a39\u4a3a\u4a3b\u4a3c\u4a3d\u4a3e\u4a3f\u4a40\u4a41\u4a42\u4a43\u4a44\u4a45\u4a46\u4a47\u4a48\u4a49\u4a4a\u4a4b\u4a4c\u4a4d\u4a4e\u4a4f\u4a50\u4a51\u4a52\u4a53\u4a54\u4a55\u4a56\u4a57\u4a58\u4a59\u4a5a\u4a5b\u4a5c\u4a5d\u4a5e\u4a5f\u4a60\u4a61\u4a62\u4a63\u4a64\u4a65\u4a66\u4a67\u4a68\u4a69\u4a6a\u4a6b\u4a6c\u4a6d\u4a6e\u4a6f\u4a70\u4a71\u4a72\u4a73\u4a74\u4a75\u4a76\u4a77\u4a78\u4a79\u4a7a\u4a7b\u4a7c\u4a7d\u4a7e\u4a7f\u4a80\u4a81\u4a82\u4a83\u4a84\u4a85\u4a86\u4a87\u4a88\u4a89\u4a8a\u4a8b\u4a8c\u4a8d\u4a8e\u4a8f\u4a90\u4a91\u4a92\u4a93\u4a94\u4a95\u4a96\u4a97\u4a98\u4a99\u4a9a\u4a9b\u4a9c\u4a9d\u4a9e\u4a9f\u4aa0\u4aa1\u4aa2\u4aa3\u4aa4\u4aa5\u4aa6\u4aa7\u4aa8\u4aa9\u4aaa\u4aab\u4aac\u4aad\u4aae\u4aaf\u4ab0\u4ab1\u4ab2\u4ab3\u4ab4\u4ab5\u4ab6\u4ab7\u4ab8\u4ab9\u4aba\u4abb\u4abc\u4abd\u4abe\u4abf\u4ac0\u4ac1\u4ac2\u4ac3\u4ac4\u4ac5\u4ac6\u4ac7\u4ac8\u4ac9\u4aca\u4acb\u4acc\u4acd\u4ace\u4acf\u4ad0\u4ad1\u4ad2\u4ad3\u4ad4\u4ad5\u4ad6\u4ad7\u4ad8\u4ad9\u4ada\u4adb\u4adc\u4add\u4ade\u4adf\u4ae0\u4ae1\u4ae2\u4ae3\u4ae4\u4ae5\u4ae6\u4ae7\u4ae8\u4ae9\u4aea\u4aeb\u4aec\u4aed\u4aee\u4aef\u4af0\u4af1\u4af2\u4af3\u4af4\u4af5\u4af6\u4af7\u4af8\u4af9\u4afa\u4afb\u4afc\u4afd\u4afe\u4aff\u4b00\u4b01\u4b02\u4b03\u4b04\u4b05\u4b06\u4b07\u4b08\u4b09\u4b0a\u4b0b\u4b0c\u4b0d\u4b0e\u4b0f\u4b10\u4b11\u4b12\u4b13\u4b14\u4b15\u4b16\u4b17\u4b18\u4b19\u4b1a\u4b1b\u4b1c\u4b1d\u4b1e\u4b1f\u4b20\u4b21\u4b22\u4b23\u4b24\u4b25\u4b26\u4b27\u4b28\u4b29\u4b2a\u4b2b\u4b2c\u4b2d\u4b2e\u4b2f\u4b30\u4b31\u4b32\u4b33\u4b34\u4b35\u4b36\u4b37\u4b38\u4b39\u4b3a\u4b3b\u4b3c\u4b3d\u4b3e\u4b3f\u4b40\u4b41\u4b42\u4b43\u4b44\u4b45\u4b46\u4b47\u4b48\u4b49\u4b4a\u4b4b\u4b4c\u4b4d\u4b4e\u4b4f\u4b50\u4b51\u4b52\u4b53\u4b54\u4b55\u4b56\u4b57\u4b58\u4b59\u4b5a\u4b5b\u4b5c\u4b5d\u4b5e\u4b5f\u4b60\u4b61\u4b62\u4b63\u4b64\u4b65\u4b66\u4b67\u4b68\u4b69\u4b6a\u4b6b\u4b6c\u4b6d\u4b6e\u4b6f\u4b70\u4b71\u4b72\u4b73\u4b74\u4b75\u4b76\u4b77\u4b78\u4b79\u4b7a\u4b7b\u4b7c\u4b7d\u4b7e\u4b7f\u4b80\u4b81\u4b82\u4b83\u4b84\u4b85\u4b86\u4b87\u4b88\u4b89\u4b8a\u4b8b\u4b8c\u4b8d\u4b8e\u4b8f\u4b90\u4b91\u4b92\u4b93\u4b94\u4b95\u4b96\u4b97\u4b98\u4b99\u4b9a\u4b9b\u4b9c\u4b9d\u4b9e\u4b9f\u4ba0\u4ba1\u4ba2\u4ba3\u4ba4\u4ba5\u4ba6\u4ba7\u4ba8\u4ba9\u4baa\u4bab\u4bac\u4bad\u4bae\u4baf\u4bb0\u4bb1\u4bb2\u4bb3\u4bb4\u4bb5\u4bb6\u4bb7\u4bb8\u4bb9\u4bba\u4bbb\u4bbc\u4bbd\u4bbe\u4bbf\u4bc0\u4bc1\u4bc2\u4bc3\u4bc4\u4bc5\u4bc6\u4bc7\u4bc8\u4bc9\u4bca\u4bcb\u4bcc\u4bcd\u4bce\u4bcf\u4bd0\u4bd1\u4bd2\u4bd3\u4bd4\u4bd5\u4bd6\u4bd7\u4bd8\u4bd9\u4bda\u4bdb\u4bdc\u4bdd\u4bde\u4bdf\u4be0\u4be1\u4be2\u4be3\u4be4\u4be5\u4be6\u4be7\u4be8\u4be9\u4bea\u4beb\u4bec\u4bed\u4bee\u4bef\u4bf0\u4bf1\u4bf2\u4bf3\u4bf4\u4bf5\u4bf6\u4bf7\u4bf8\u4bf9\u4bfa\u4bfb\u4bfc\u4bfd\u4bfe\u4bff\u4c00\u4c01\u4c02\u4c03\u4c04\u4c05\u4c06\u4c07\u4c08\u4c09\u4c0a\u4c0b\u4c0c\u4c0d\u4c0e\u4c0f\u4c10\u4c11\u4c12\u4c13\u4c14\u4c15\u4c16\u4c17\u4c18\u4c19\u4c1a\u4c1b\u4c1c\u4c1d\u4c1e\u4c1f\u4c20\u4c21\u4c22\u4c23\u4c24\u4c25\u4c26\u4c27\u4c28\u4c29\u4c2a\u4c2b\u4c2c\u4c2d\u4c2e\u4c2f\u4c30\u4c31\u4c32\u4c33\u4c34\u4c35\u4c36\u4c37\u4c38\u4c39\u4c3a\u4c3b\u4c3c\u4c3d\u4c3e\u4c3f\u4c40\u4c41\u4c42\u4c43\u4c44\u4c45\u4c46\u4c47\u4c48\u4c49\u4c4a\u4c4b\u4c4c\u4c4d\u4c4e\u4c4f\u4c50\u4c51\u4c52\u4c53\u4c54\u4c55\u4c56\u4c57\u4c58\u4c59\u4c5a\u4c5b\u4c5c\u4c5d\u4c5e\u4c5f\u4c60\u4c61\u4c62\u4c63\u4c64\u4c65\u4c66\u4c67\u4c68\u4c69\u4c6a\u4c6b\u4c6c\u4c6d\u4c6e\u4c6f\u4c70\u4c71\u4c72\u4c73\u4c74\u4c75\u4c76\u4c77\u4c78\u4c79\u4c7a\u4c7b\u4c7c\u4c7d\u4c7e\u4c7f\u4c80\u4c81\u4c82\u4c83\u4c84\u4c85\u4c86\u4c87\u4c88\u4c89\u4c8a\u4c8b\u4c8c\u4c8d\u4c8e\u4c8f\u4c90\u4c91\u4c92\u4c93\u4c94\u4c95\u4c96\u4c97\u4c98\u4c99\u4c9a\u4c9b\u4c9c\u4c9d\u4c9e\u4c9f\u4ca0\u4ca1\u4ca2\u4ca3\u4ca4\u4ca5\u4ca6\u4ca7\u4ca8\u4ca9\u4caa\u4cab\u4cac\u4cad\u4cae\u4caf\u4cb0\u4cb1\u4cb2\u4cb3\u4cb4\u4cb5\u4cb6\u4cb7\u4cb8\u4cb9\u4cba\u4cbb\u4cbc\u4cbd\u4cbe\u4cbf\u4cc0\u4cc1\u4cc2\u4cc3\u4cc4\u4cc5\u4cc6\u4cc7\u4cc8\u4cc9\u4cca\u4ccb\u4ccc\u4ccd\u4cce\u4ccf\u4cd0\u4cd1\u4cd2\u4cd3\u4cd4\u4cd5\u4cd6\u4cd7\u4cd8\u4cd9\u4cda\u4cdb\u4cdc\u4cdd\u4cde\u4cdf\u4ce0\u4ce1\u4ce2\u4ce3\u4ce4\u4ce5\u4ce6\u4ce7\u4ce8\u4ce9\u4cea\u4ceb\u4cec\u4ced\u4cee\u4cef\u4cf0\u4cf1\u4cf2\u4cf3\u4cf4\u4cf5\u4cf6\u4cf7\u4cf8\u4cf9\u4cfa\u4cfb\u4cfc\u4cfd\u4cfe\u4cff\u4d00\u4d01\u4d02\u4d03\u4d04\u4d05\u4d06\u4d07\u4d08\u4d09\u4d0a\u4d0b\u4d0c\u4d0d\u4d0e\u4d0f\u4d10\u4d11\u4d12\u4d13\u4d14\u4d15\u4d16\u4d17\u4d18\u4d19\u4d1a\u4d1b\u4d1c\u4d1d\u4d1e\u4d1f\u4d20\u4d21\u4d22\u4d23\u4d24\u4d25\u4d26\u4d27\u4d28\u4d29\u4d2a\u4d2b\u4d2c\u4d2d\u4d2e\u4d2f\u4d30\u4d31\u4d32\u4d33\u4d34\u4d35\u4d36\u4d37\u4d38\u4d39\u4d3a\u4d3b\u4d3c\u4d3d\u4d3e\u4d3f\u4d40\u4d41\u4d42\u4d43\u4d44\u4d45\u4d46\u4d47\u4d48\u4d49\u4d4a\u4d4b\u4d4c\u4d4d\u4d4e\u4d4f\u4d50\u4d51\u4d52\u4d53\u4d54\u4d55\u4d56\u4d57\u4d58\u4d59\u4d5a\u4d5b\u4d5c\u4d5d\u4d5e\u4d5f\u4d60\u4d61\u4d62\u4d63\u4d64\u4d65\u4d66\u4d67\u4d68\u4d69\u4d6a\u4d6b\u4d6c\u4d6d\u4d6e\u4d6f\u4d70\u4d71\u4d72\u4d73\u4d74\u4d75\u4d76\u4d77\u4d78\u4d79\u4d7a\u4d7b\u4d7c\u4d7d\u4d7e\u4d7f\u4d80\u4d81\u4d82\u4d83\u4d84\u4d85\u4d86\u4d87\u4d88\u4d89\u4d8a\u4d8b\u4d8c\u4d8d\u4d8e\u4d8f\u4d90\u4d91\u4d92\u4d93\u4d94\u4d95\u4d96\u4d97\u4d98\u4d99\u4d9a\u4d9b\u4d9c\u4d9d\u4d9e\u4d9f\u4da0\u4da1\u4da2\u4da3\u4da4\u4da5\u4da6\u4da7\u4da8\u4da9\u4daa\u4dab\u4dac\u4dad\u4dae\u4daf\u4db0\u4db1\u4db2\u4db3\u4db4\u4db5\u4e00\u4e01\u4e02\u4e03\u4e04\u4e05\u4e06\u4e07\u4e08\u4e09\u4e0a\u4e0b\u4e0c\u4e0d\u4e0e\u4e0f\u4e10\u4e11\u4e12\u4e13\u4e14\u4e15\u4e16\u4e17\u4e18\u4e19\u4e1a\u4e1b\u4e1c\u4e1d\u4e1e\u4e1f\u4e20\u4e21\u4e22\u4e23\u4e24\u4e25\u4e26\u4e27\u4e28\u4e29\u4e2a\u4e2b\u4e2c\u4e2d\u4e2e\u4e2f\u4e30\u4e31\u4e32\u4e33\u4e34\u4e35\u4e36\u4e37\u4e38\u4e39\u4e3a\u4e3b\u4e3c\u4e3d\u4e3e\u4e3f\u4e40\u4e41\u4e42\u4e43\u4e44\u4e45\u4e46\u4e47\u4e48\u4e49\u4e4a\u4e4b\u4e4c\u4e4d\u4e4e\u4e4f\u4e50\u4e51\u4e52\u4e53\u4e54\u4e55\u4e56\u4e57\u4e58\u4e59\u4e5a\u4e5b\u4e5c\u4e5d\u4e5e\u4e5f\u4e60\u4e61\u4e62\u4e63\u4e64\u4e65\u4e66\u4e67\u4e68\u4e69\u4e6a\u4e6b\u4e6c\u4e6d\u4e6e\u4e6f\u4e70\u4e71\u4e72\u4e73\u4e74\u4e75\u4e76\u4e77\u4e78\u4e79\u4e7a\u4e7b\u4e7c\u4e7d\u4e7e\u4e7f\u4e80\u4e81\u4e82\u4e83\u4e84\u4e85\u4e86\u4e87\u4e88\u4e89\u4e8a\u4e8b\u4e8c\u4e8d\u4e8e\u4e8f\u4e90\u4e91\u4e92\u4e93\u4e94\u4e95\u4e96\u4e97\u4e98\u4e99\u4e9a\u4e9b\u4e9c\u4e9d\u4e9e\u4e9f\u4ea0\u4ea1\u4ea2\u4ea3\u4ea4\u4ea5\u4ea6\u4ea7\u4ea8\u4ea9\u4eaa\u4eab\u4eac\u4ead\u4eae\u4eaf\u4eb0\u4eb1\u4eb2\u4eb3\u4eb4\u4eb5\u4eb6\u4eb7\u4eb8\u4eb9\u4eba\u4ebb\u4ebc\u4ebd\u4ebe\u4ebf\u4ec0\u4ec1\u4ec2\u4ec3\u4ec4\u4ec5\u4ec6\u4ec7\u4ec8\u4ec9\u4eca\u4ecb\u4ecc\u4ecd\u4ece\u4ecf\u4ed0\u4ed1\u4ed2\u4ed3\u4ed4\u4ed5\u4ed6\u4ed7\u4ed8\u4ed9\u4eda\u4edb\u4edc\u4edd\u4ede\u4edf\u4ee0\u4ee1\u4ee2\u4ee3\u4ee4\u4ee5\u4ee6\u4ee7\u4ee8\u4ee9\u4eea\u4eeb\u4eec\u4eed\u4eee\u4eef\u4ef0\u4ef1\u4ef2\u4ef3\u4ef4\u4ef5\u4ef6\u4ef7\u4ef8\u4ef9\u4efa\u4efb\u4efc\u4efd\u4efe\u4eff\u4f00\u4f01\u4f02\u4f03\u4f04\u4f05\u4f06\u4f07\u4f08\u4f09\u4f0a\u4f0b\u4f0c\u4f0d\u4f0e\u4f0f\u4f10\u4f11\u4f12\u4f13\u4f14\u4f15\u4f16\u4f17\u4f18\u4f19\u4f1a\u4f1b\u4f1c\u4f1d\u4f1e\u4f1f\u4f20\u4f21\u4f22\u4f23\u4f24\u4f25\u4f26\u4f27\u4f28\u4f29\u4f2a\u4f2b\u4f2c\u4f2d\u4f2e\u4f2f\u4f30\u4f31\u4f32\u4f33\u4f34\u4f35\u4f36\u4f37\u4f38\u4f39\u4f3a\u4f3b\u4f3c\u4f3d\u4f3e\u4f3f\u4f40\u4f41\u4f42\u4f43\u4f44\u4f45\u4f46\u4f47\u4f48\u4f49\u4f4a\u4f4b\u4f4c\u4f4d\u4f4e\u4f4f\u4f50\u4f51\u4f52\u4f53\u4f54\u4f55\u4f56\u4f57\u4f58\u4f59\u4f5a\u4f5b\u4f5c\u4f5d\u4f5e\u4f5f\u4f60\u4f61\u4f62\u4f63\u4f64\u4f65\u4f66\u4f67\u4f68\u4f69\u4f6a\u4f6b\u4f6c\u4f6d\u4f6e\u4f6f\u4f70\u4f71\u4f72\u4f73\u4f74\u4f75\u4f76\u4f77\u4f78\u4f79\u4f7a\u4f7b\u4f7c\u4f7d\u4f7e\u4f7f\u4f80\u4f81\u4f82\u4f83\u4f84\u4f85\u4f86\u4f87\u4f88\u4f89\u4f8a\u4f8b\u4f8c\u4f8d\u4f8e\u4f8f\u4f90\u4f91\u4f92\u4f93\u4f94\u4f95\u4f96\u4f97\u4f98\u4f99\u4f9a\u4f9b\u4f9c\u4f9d\u4f9e\u4f9f\u4fa0\u4fa1\u4fa2\u4fa3\u4fa4\u4fa5\u4fa6\u4fa7\u4fa8\u4fa9\u4faa\u4fab\u4fac\u4fad\u4fae\u4faf\u4fb0\u4fb1\u4fb2\u4fb3\u4fb4\u4fb5\u4fb6\u4fb7\u4fb8\u4fb9\u4fba\u4fbb\u4fbc\u4fbd\u4fbe\u4fbf\u4fc0\u4fc1\u4fc2\u4fc3\u4fc4\u4fc5\u4fc6\u4fc7\u4fc8\u4fc9\u4fca\u4fcb\u4fcc\u4fcd\u4fce\u4fcf\u4fd0\u4fd1\u4fd2\u4fd3\u4fd4\u4fd5\u4fd6\u4fd7\u4fd8\u4fd9\u4fda\u4fdb\u4fdc\u4fdd\u4fde\u4fdf\u4fe0\u4fe1\u4fe2\u4fe3\u4fe4\u4fe5\u4fe6\u4fe7\u4fe8\u4fe9\u4fea\u4feb\u4fec\u4fed\u4fee\u4fef\u4ff0\u4ff1\u4ff2\u4ff3\u4ff4\u4ff5\u4ff6\u4ff7\u4ff8\u4ff9\u4ffa\u4ffb\u4ffc\u4ffd\u4ffe\u4fff\u5000\u5001\u5002\u5003\u5004\u5005\u5006\u5007\u5008\u5009\u500a\u500b\u500c\u500d\u500e\u500f\u5010\u5011\u5012\u5013\u5014\u5015\u5016\u5017\u5018\u5019\u501a\u501b\u501c\u501d\u501e\u501f\u5020\u5021\u5022\u5023\u5024\u5025\u5026\u5027\u5028\u5029\u502a\u502b\u502c\u502d\u502e\u502f\u5030\u5031\u5032\u5033\u5034\u5035\u5036\u5037\u5038\u5039\u503a\u503b\u503c\u503d\u503e\u503f\u5040\u5041\u5042\u5043\u5044\u5045\u5046\u5047\u5048\u5049\u504a\u504b\u504c\u504d\u504e\u504f\u5050\u5051\u5052\u5053\u5054\u5055\u5056\u5057\u5058\u5059\u505a\u505b\u505c\u505d\u505e\u505f\u5060\u5061\u5062\u5063\u5064\u5065\u5066\u5067\u5068\u5069\u506a\u506b\u506c\u506d\u506e\u506f\u5070\u5071\u5072\u5073\u5074\u5075\u5076\u5077\u5078\u5079\u507a\u507b\u507c\u507d\u507e\u507f\u5080\u5081\u5082\u5083\u5084\u5085\u5086\u5087\u5088\u5089\u508a\u508b\u508c\u508d\u508e\u508f\u5090\u5091\u5092\u5093\u5094\u5095\u5096\u5097\u5098\u5099\u509a\u509b\u509c\u509d\u509e\u509f\u50a0\u50a1\u50a2\u50a3\u50a4\u50a5\u50a6\u50a7\u50a8\u50a9\u50aa\u50ab\u50ac\u50ad\u50ae\u50af\u50b0\u50b1\u50b2\u50b3\u50b4\u50b5\u50b6\u50b7\u50b8\u50b9\u50ba\u50bb\u50bc\u50bd\u50be\u50bf\u50c0\u50c1\u50c2\u50c3\u50c4\u50c5\u50c6\u50c7\u50c8\u50c9\u50ca\u50cb\u50cc\u50cd\u50ce\u50cf\u50d0\u50d1\u50d2\u50d3\u50d4\u50d5\u50d6\u50d7\u50d8\u50d9\u50da\u50db\u50dc\u50dd\u50de\u50df\u50e0\u50e1\u50e2\u50e3\u50e4\u50e5\u50e6\u50e7\u50e8\u50e9\u50ea\u50eb\u50ec\u50ed\u50ee\u50ef\u50f0\u50f1\u50f2\u50f3\u50f4\u50f5\u50f6\u50f7\u50f8\u50f9\u50fa\u50fb\u50fc\u50fd\u50fe\u50ff\u5100\u5101\u5102\u5103\u5104\u5105\u5106\u5107\u5108\u5109\u510a\u510b\u510c\u510d\u510e\u510f\u5110\u5111\u5112\u5113\u5114\u5115\u5116\u5117\u5118\u5119\u511a\u511b\u511c\u511d\u511e\u511f\u5120\u5121\u5122\u5123\u5124\u5125\u5126\u5127\u5128\u5129\u512a\u512b\u512c\u512d\u512e\u512f\u5130\u5131\u5132\u5133\u5134\u5135\u5136\u5137\u5138\u5139\u513a\u513b\u513c\u513d\u513e\u513f\u5140\u5141\u5142\u5143\u5144\u5145\u5146\u5147\u5148\u5149\u514a\u514b\u514c\u514d\u514e\u514f\u5150\u5151\u5152\u5153\u5154\u5155\u5156\u5157\u5158\u5159\u515a\u515b\u515c\u515d\u515e\u515f\u5160\u5161\u5162\u5163\u5164\u5165\u5166\u5167\u5168\u5169\u516a\u516b\u516c\u516d\u516e\u516f\u5170\u5171\u5172\u5173\u5174\u5175\u5176\u5177\u5178\u5179\u517a\u517b\u517c\u517d\u517e\u517f\u5180\u5181\u5182\u5183\u5184\u5185\u5186\u5187\u5188\u5189\u518a\u518b\u518c\u518d\u518e\u518f\u5190\u5191\u5192\u5193\u5194\u5195\u5196\u5197\u5198\u5199\u519a\u519b\u519c\u519d\u519e\u519f\u51a0\u51a1\u51a2\u51a3\u51a4\u51a5\u51a6\u51a7\u51a8\u51a9\u51aa\u51ab\u51ac\u51ad\u51ae\u51af\u51b0\u51b1\u51b2\u51b3\u51b4\u51b5\u51b6\u51b7\u51b8\u51b9\u51ba\u51bb\u51bc\u51bd\u51be\u51bf\u51c0\u51c1\u51c2\u51c3\u51c4\u51c5\u51c6\u51c7\u51c8\u51c9\u51ca\u51cb\u51cc\u51cd\u51ce\u51cf\u51d0\u51d1\u51d2\u51d3\u51d4\u51d5\u51d6\u51d7\u51d8\u51d9\u51da\u51db\u51dc\u51dd\u51de\u51df\u51e0\u51e1\u51e2\u51e3\u51e4\u51e5\u51e6\u51e7\u51e8\u51e9\u51ea\u51eb\u51ec\u51ed\u51ee\u51ef\u51f0\u51f1\u51f2\u51f3\u51f4\u51f5\u51f6\u51f7\u51f8\u51f9\u51fa\u51fb\u51fc\u51fd\u51fe\u51ff\u5200\u5201\u5202\u5203\u5204\u5205\u5206\u5207\u5208\u5209\u520a\u520b\u520c\u520d\u520e\u520f\u5210\u5211\u5212\u5213\u5214\u5215\u5216\u5217\u5218\u5219\u521a\u521b\u521c\u521d\u521e\u521f\u5220\u5221\u5222\u5223\u5224\u5225\u5226\u5227\u5228\u5229\u522a\u522b\u522c\u522d\u522e\u522f\u5230\u5231\u5232\u5233\u5234\u5235\u5236\u5237\u5238\u5239\u523a\u523b\u523c\u523d\u523e\u523f\u5240\u5241\u5242\u5243\u5244\u5245\u5246\u5247\u5248\u5249\u524a\u524b\u524c\u524d\u524e\u524f\u5250\u5251\u5252\u5253\u5254\u5255\u5256\u5257\u5258\u5259\u525a\u525b\u525c\u525d\u525e\u525f\u5260\u5261\u5262\u5263\u5264\u5265\u5266\u5267\u5268\u5269\u526a\u526b\u526c\u526d\u526e\u526f\u5270\u5271\u5272\u5273\u5274\u5275\u5276\u5277\u5278\u5279\u527a\u527b\u527c\u527d\u527e\u527f\u5280\u5281\u5282\u5283\u5284\u5285\u5286\u5287\u5288\u5289\u528a\u528b\u528c\u528d\u528e\u528f\u5290\u5291\u5292\u5293\u5294\u5295\u5296\u5297\u5298\u5299\u529a\u529b\u529c\u529d\u529e\u529f\u52a0\u52a1\u52a2\u52a3\u52a4\u52a5\u52a6\u52a7\u52a8\u52a9\u52aa\u52ab\u52ac\u52ad\u52ae\u52af\u52b0\u52b1\u52b2\u52b3\u52b4\u52b5\u52b6\u52b7\u52b8\u52b9\u52ba\u52bb\u52bc\u52bd\u52be\u52bf\u52c0\u52c1\u52c2\u52c3\u52c4\u52c5\u52c6\u52c7\u52c8\u52c9\u52ca\u52cb\u52cc\u52cd\u52ce\u52cf\u52d0\u52d1\u52d2\u52d3\u52d4\u52d5\u52d6\u52d7\u52d8\u52d9\u52da\u52db\u52dc\u52dd\u52de\u52df\u52e0\u52e1\u52e2\u52e3\u52e4\u52e5\u52e6\u52e7\u52e8\u52e9\u52ea\u52eb\u52ec\u52ed\u52ee\u52ef\u52f0\u52f1\u52f2\u52f3\u52f4\u52f5\u52f6\u52f7\u52f8\u52f9\u52fa\u52fb\u52fc\u52fd\u52fe\u52ff\u5300\u5301\u5302\u5303\u5304\u5305\u5306\u5307\u5308\u5309\u530a\u530b\u530c\u530d\u530e\u530f\u5310\u5311\u5312\u5313\u5314\u5315\u5316\u5317\u5318\u5319\u531a\u531b\u531c\u531d\u531e\u531f\u5320\u5321\u5322\u5323\u5324\u5325\u5326\u5327\u5328\u5329\u532a\u532b\u532c\u532d\u532e\u532f\u5330\u5331\u5332\u5333\u5334\u5335\u5336\u5337\u5338\u5339\u533a\u533b\u533c\u533d\u533e\u533f\u5340\u5341\u5342\u5343\u5344\u5345\u5346\u5347\u5348\u5349\u534a\u534b\u534c\u534d\u534e\u534f\u5350\u5351\u5352\u5353\u5354\u5355\u5356\u5357\u5358\u5359\u535a\u535b\u535c\u535d\u535e\u535f\u5360\u5361\u5362\u5363\u5364\u5365\u5366\u5367\u5368\u5369\u536a\u536b\u536c\u536d\u536e\u536f\u5370\u5371\u5372\u5373\u5374\u5375\u5376\u5377\u5378\u5379\u537a\u537b\u537c\u537d\u537e\u537f\u5380\u5381\u5382\u5383\u5384\u5385\u5386\u5387\u5388\u5389\u538a\u538b\u538c\u538d\u538e\u538f\u5390\u5391\u5392\u5393\u5394\u5395\u5396\u5397\u5398\u5399\u539a\u539b\u539c\u539d\u539e\u539f\u53a0\u53a1\u53a2\u53a3\u53a4\u53a5\u53a6\u53a7\u53a8\u53a9\u53aa\u53ab\u53ac\u53ad\u53ae\u53af\u53b0\u53b1\u53b2\u53b3\u53b4\u53b5\u53b6\u53b7\u53b8\u53b9\u53ba\u53bb\u53bc\u53bd\u53be\u53bf\u53c0\u53c1\u53c2\u53c3\u53c4\u53c5\u53c6\u53c7\u53c8\u53c9\u53ca\u53cb\u53cc\u53cd\u53ce\u53cf\u53d0\u53d1\u53d2\u53d3\u53d4\u53d5\u53d6\u53d7\u53d8\u53d9\u53da\u53db\u53dc\u53dd\u53de\u53df\u53e0\u53e1\u53e2\u53e3\u53e4\u53e5\u53e6\u53e7\u53e8\u53e9\u53ea\u53eb\u53ec\u53ed\u53ee\u53ef\u53f0\u53f1\u53f2\u53f3\u53f4\u53f5\u53f6\u53f7\u53f8\u53f9\u53fa\u53fb\u53fc\u53fd\u53fe\u53ff\u5400\u5401\u5402\u5403\u5404\u5405\u5406\u5407\u5408\u5409\u540a\u540b\u540c\u540d\u540e\u540f\u5410\u5411\u5412\u5413\u5414\u5415\u5416\u5417\u5418\u5419\u541a\u541b\u541c\u541d\u541e\u541f\u5420\u5421\u5422\u5423\u5424\u5425\u5426\u5427\u5428\u5429\u542a\u542b\u542c\u542d\u542e\u542f\u5430\u5431\u5432\u5433\u5434\u5435\u5436\u5437\u5438\u5439\u543a\u543b\u543c\u543d\u543e\u543f\u5440\u5441\u5442\u5443\u5444\u5445\u5446\u5447\u5448\u5449\u544a\u544b\u544c\u544d\u544e\u544f\u5450\u5451\u5452\u5453\u5454\u5455\u5456\u5457\u5458\u5459\u545a\u545b\u545c\u545d\u545e\u545f\u5460\u5461\u5462\u5463\u5464\u5465\u5466\u5467\u5468\u5469\u546a\u546b\u546c\u546d\u546e\u546f\u5470\u5471\u5472\u5473\u5474\u5475\u5476\u5477\u5478\u5479\u547a\u547b\u547c\u547d\u547e\u547f\u5480\u5481\u5482\u5483\u5484\u5485\u5486\u5487\u5488\u5489\u548a\u548b\u548c\u548d\u548e\u548f\u5490\u5491\u5492\u5493\u5494\u5495\u5496\u5497\u5498\u5499\u549a\u549b\u549c\u549d\u549e\u549f\u54a0\u54a1\u54a2\u54a3\u54a4\u54a5\u54a6\u54a7\u54a8\u54a9\u54aa\u54ab\u54ac\u54ad\u54ae\u54af\u54b0\u54b1\u54b2\u54b3\u54b4\u54b5\u54b6\u54b7\u54b8\u54b9\u54ba\u54bb\u54bc\u54bd\u54be\u54bf\u54c0\u54c1\u54c2\u54c3\u54c4\u54c5\u54c6\u54c7\u54c8\u54c9\u54ca\u54cb\u54cc\u54cd\u54ce\u54cf\u54d0\u54d1\u54d2\u54d3\u54d4\u54d5\u54d6\u54d7\u54d8\u54d9\u54da\u54db\u54dc\u54dd\u54de\u54df\u54e0\u54e1\u54e2\u54e3\u54e4\u54e5\u54e6\u54e7\u54e8\u54e9\u54ea\u54eb\u54ec\u54ed\u54ee\u54ef\u54f0\u54f1\u54f2\u54f3\u54f4\u54f5\u54f6\u54f7\u54f8\u54f9\u54fa\u54fb\u54fc\u54fd\u54fe\u54ff\u5500\u5501\u5502\u5503\u5504\u5505\u5506\u5507\u5508\u5509\u550a\u550b\u550c\u550d\u550e\u550f\u5510\u5511\u5512\u5513\u5514\u5515\u5516\u5517\u5518\u5519\u551a\u551b\u551c\u551d\u551e\u551f\u5520\u5521\u5522\u5523\u5524\u5525\u5526\u5527\u5528\u5529\u552a\u552b\u552c\u552d\u552e\u552f\u5530\u5531\u5532\u5533\u5534\u5535\u5536\u5537\u5538\u5539\u553a\u553b\u553c\u553d\u553e\u553f\u5540\u5541\u5542\u5543\u5544\u5545\u5546\u5547\u5548\u5549\u554a\u554b\u554c\u554d\u554e\u554f\u5550\u5551\u5552\u5553\u5554\u5555\u5556\u5557\u5558\u5559\u555a\u555b\u555c\u555d\u555e\u555f\u5560\u5561\u5562\u5563\u5564\u5565\u5566\u5567\u5568\u5569\u556a\u556b\u556c\u556d\u556e\u556f\u5570\u5571\u5572\u5573\u5574\u5575\u5576\u5577\u5578\u5579\u557a\u557b\u557c\u557d\u557e\u557f\u5580\u5581\u5582\u5583\u5584\u5585\u5586\u5587\u5588\u5589\u558a\u558b\u558c\u558d\u558e\u558f\u5590\u5591\u5592\u5593\u5594\u5595\u5596\u5597\u5598\u5599\u559a\u559b\u559c\u559d\u559e\u559f\u55a0\u55a1\u55a2\u55a3\u55a4\u55a5\u55a6\u55a7\u55a8\u55a9\u55aa\u55ab\u55ac\u55ad\u55ae\u55af\u55b0\u55b1\u55b2\u55b3\u55b4\u55b5\u55b6\u55b7\u55b8\u55b9\u55ba\u55bb\u55bc\u55bd\u55be\u55bf\u55c0\u55c1\u55c2\u55c3\u55c4\u55c5\u55c6\u55c7\u55c8\u55c9\u55ca\u55cb\u55cc\u55cd\u55ce\u55cf\u55d0\u55d1\u55d2\u55d3\u55d4\u55d5\u55d6\u55d7\u55d8\u55d9\u55da\u55db\u55dc\u55dd\u55de\u55df\u55e0\u55e1\u55e2\u55e3\u55e4\u55e5\u55e6\u55e7\u55e8\u55e9\u55ea\u55eb\u55ec\u55ed\u55ee\u55ef\u55f0\u55f1\u55f2\u55f3\u55f4\u55f5\u55f6\u55f7\u55f8\u55f9\u55fa\u55fb\u55fc\u55fd\u55fe\u55ff\u5600\u5601\u5602\u5603\u5604\u5605\u5606\u5607\u5608\u5609\u560a\u560b\u560c\u560d\u560e\u560f\u5610\u5611\u5612\u5613\u5614\u5615\u5616\u5617\u5618\u5619\u561a\u561b\u561c\u561d\u561e\u561f\u5620\u5621\u5622\u5623\u5624\u5625\u5626\u5627\u5628\u5629\u562a\u562b\u562c\u562d\u562e\u562f\u5630\u5631\u5632\u5633\u5634\u5635\u5636\u5637\u5638\u5639\u563a\u563b\u563c\u563d\u563e\u563f\u5640\u5641\u5642\u5643\u5644\u5645\u5646\u5647\u5648\u5649\u564a\u564b\u564c\u564d\u564e\u564f\u5650\u5651\u5652\u5653\u5654\u5655\u5656\u5657\u5658\u5659\u565a\u565b\u565c\u565d\u565e\u565f\u5660\u5661\u5662\u5663\u5664\u5665\u5666\u5667\u5668\u5669\u566a\u566b\u566c\u566d\u566e\u566f\u5670\u5671\u5672\u5673\u5674\u5675\u5676\u5677\u5678\u5679\u567a\u567b\u567c\u567d\u567e\u567f\u5680\u5681\u5682\u5683\u5684\u5685\u5686\u5687\u5688\u5689\u568a\u568b\u568c\u568d\u568e\u568f\u5690\u5691\u5692\u5693\u5694\u5695\u5696\u5697\u5698\u5699\u569a\u569b\u569c\u569d\u569e\u569f\u56a0\u56a1\u56a2\u56a3\u56a4\u56a5\u56a6\u56a7\u56a8\u56a9\u56aa\u56ab\u56ac\u56ad\u56ae\u56af\u56b0\u56b1\u56b2\u56b3\u56b4\u56b5\u56b6\u56b7\u56b8\u56b9\u56ba\u56bb\u56bc\u56bd\u56be\u56bf\u56c0\u56c1\u56c2\u56c3\u56c4\u56c5\u56c6\u56c7\u56c8\u56c9\u56ca\u56cb\u56cc\u56cd\u56ce\u56cf\u56d0\u56d1\u56d2\u56d3\u56d4\u56d5\u56d6\u56d7\u56d8\u56d9\u56da\u56db\u56dc\u56dd\u56de\u56df\u56e0\u56e1\u56e2\u56e3\u56e4\u56e5\u56e6\u56e7\u56e8\u56e9\u56ea\u56eb\u56ec\u56ed\u56ee\u56ef\u56f0\u56f1\u56f2\u56f3\u56f4\u56f5\u56f6\u56f7\u56f8\u56f9\u56fa\u56fb\u56fc\u56fd\u56fe\u56ff\u5700\u5701\u5702\u5703\u5704\u5705\u5706\u5707\u5708\u5709\u570a\u570b\u570c\u570d\u570e\u570f\u5710\u5711\u5712\u5713\u5714\u5715\u5716\u5717\u5718\u5719\u571a\u571b\u571c\u571d\u571e\u571f\u5720\u5721\u5722\u5723\u5724\u5725\u5726\u5727\u5728\u5729\u572a\u572b\u572c\u572d\u572e\u572f\u5730\u5731\u5732\u5733\u5734\u5735\u5736\u5737\u5738\u5739\u573a\u573b\u573c\u573d\u573e\u573f\u5740\u5741\u5742\u5743\u5744\u5745\u5746\u5747\u5748\u5749\u574a\u574b\u574c\u574d\u574e\u574f\u5750\u5751\u5752\u5753\u5754\u5755\u5756\u5757\u5758\u5759\u575a\u575b\u575c\u575d\u575e\u575f\u5760\u5761\u5762\u5763\u5764\u5765\u5766\u5767\u5768\u5769\u576a\u576b\u576c\u576d\u576e\u576f\u5770\u5771\u5772\u5773\u5774\u5775\u5776\u5777\u5778\u5779\u577a\u577b\u577c\u577d\u577e\u577f\u5780\u5781\u5782\u5783\u5784\u5785\u5786\u5787\u5788\u5789\u578a\u578b\u578c\u578d\u578e\u578f\u5790\u5791\u5792\u5793\u5794\u5795\u5796\u5797\u5798\u5799\u579a\u579b\u579c\u579d\u579e\u579f\u57a0\u57a1\u57a2\u57a3\u57a4\u57a5\u57a6\u57a7\u57a8\u57a9\u57aa\u57ab\u57ac\u57ad\u57ae\u57af\u57b0\u57b1\u57b2\u57b3\u57b4\u57b5\u57b6\u57b7\u57b8\u57b9\u57ba\u57bb\u57bc\u57bd\u57be\u57bf\u57c0\u57c1\u57c2\u57c3\u57c4\u57c5\u57c6\u57c7\u57c8\u57c9\u57ca\u57cb\u57cc\u57cd\u57ce\u57cf\u57d0\u57d1\u57d2\u57d3\u57d4\u57d5\u57d6\u57d7\u57d8\u57d9\u57da\u57db\u57dc\u57dd\u57de\u57df\u57e0\u57e1\u57e2\u57e3\u57e4\u57e5\u57e6\u57e7\u57e8\u57e9\u57ea\u57eb\u57ec\u57ed\u57ee\u57ef\u57f0\u57f1\u57f2\u57f3\u57f4\u57f5\u57f6\u57f7\u57f8\u57f9\u57fa\u57fb\u57fc\u57fd\u57fe\u57ff\u5800\u5801\u5802\u5803\u5804\u5805\u5806\u5807\u5808\u5809\u580a\u580b\u580c\u580d\u580e\u580f\u5810\u5811\u5812\u5813\u5814\u5815\u5816\u5817\u5818\u5819\u581a\u581b\u581c\u581d\u581e\u581f\u5820\u5821\u5822\u5823\u5824\u5825\u5826\u5827\u5828\u5829\u582a\u582b\u582c\u582d\u582e\u582f\u5830\u5831\u5832\u5833\u5834\u5835\u5836\u5837\u5838\u5839\u583a\u583b\u583c\u583d\u583e\u583f\u5840\u5841\u5842\u5843\u5844\u5845\u5846\u5847\u5848\u5849\u584a\u584b\u584c\u584d\u584e\u584f\u5850\u5851\u5852\u5853\u5854\u5855\u5856\u5857\u5858\u5859\u585a\u585b\u585c\u585d\u585e\u585f\u5860\u5861\u5862\u5863\u5864\u5865\u5866\u5867\u5868\u5869\u586a\u586b\u586c\u586d\u586e\u586f\u5870\u5871\u5872\u5873\u5874\u5875\u5876\u5877\u5878\u5879\u587a\u587b\u587c\u587d\u587e\u587f\u5880\u5881\u5882\u5883\u5884\u5885\u5886\u5887\u5888\u5889\u588a\u588b\u588c\u588d\u588e\u588f\u5890\u5891\u5892\u5893\u5894\u5895\u5896\u5897\u5898\u5899\u589a\u589b\u589c\u589d\u589e\u589f\u58a0\u58a1\u58a2\u58a3\u58a4\u58a5\u58a6\u58a7\u58a8\u58a9\u58aa\u58ab\u58ac\u58ad\u58ae\u58af\u58b0\u58b1\u58b2\u58b3\u58b4\u58b5\u58b6\u58b7\u58b8\u58b9\u58ba\u58bb\u58bc\u58bd\u58be\u58bf\u58c0\u58c1\u58c2\u58c3\u58c4\u58c5\u58c6\u58c7\u58c8\u58c9\u58ca\u58cb\u58cc\u58cd\u58ce\u58cf\u58d0\u58d1\u58d2\u58d3\u58d4\u58d5\u58d6\u58d7\u58d8\u58d9\u58da\u58db\u58dc\u58dd\u58de\u58df\u58e0\u58e1\u58e2\u58e3\u58e4\u58e5\u58e6\u58e7\u58e8\u58e9\u58ea\u58eb\u58ec\u58ed\u58ee\u58ef\u58f0\u58f1\u58f2\u58f3\u58f4\u58f5\u58f6\u58f7\u58f8\u58f9\u58fa\u58fb\u58fc\u58fd\u58fe\u58ff\u5900\u5901\u5902\u5903\u5904\u5905\u5906\u5907\u5908\u5909\u590a\u590b\u590c\u590d\u590e\u590f\u5910\u5911\u5912\u5913\u5914\u5915\u5916\u5917\u5918\u5919\u591a\u591b\u591c\u591d\u591e\u591f\u5920\u5921\u5922\u5923\u5924\u5925\u5926\u5927\u5928\u5929\u592a\u592b\u592c\u592d\u592e\u592f\u5930\u5931\u5932\u5933\u5934\u5935\u5936\u5937\u5938\u5939\u593a\u593b\u593c\u593d\u593e\u593f\u5940\u5941\u5942\u5943\u5944\u5945\u5946\u5947\u5948\u5949\u594a\u594b\u594c\u594d\u594e\u594f\u5950\u5951\u5952\u5953\u5954\u5955\u5956\u5957\u5958\u5959\u595a\u595b\u595c\u595d\u595e\u595f\u5960\u5961\u5962\u5963\u5964\u5965\u5966\u5967\u5968\u5969\u596a\u596b\u596c\u596d\u596e\u596f\u5970\u5971\u5972\u5973\u5974\u5975\u5976\u5977\u5978\u5979\u597a\u597b\u597c\u597d\u597e\u597f\u5980\u5981\u5982\u5983\u5984\u5985\u5986\u5987\u5988\u5989\u598a\u598b\u598c\u598d\u598e\u598f\u5990\u5991\u5992\u5993\u5994\u5995\u5996\u5997\u5998\u5999\u599a\u599b\u599c\u599d\u599e\u599f\u59a0\u59a1\u59a2\u59a3\u59a4\u59a5\u59a6\u59a7\u59a8\u59a9\u59aa\u59ab\u59ac\u59ad\u59ae\u59af\u59b0\u59b1\u59b2\u59b3\u59b4\u59b5\u59b6\u59b7\u59b8\u59b9\u59ba\u59bb\u59bc\u59bd\u59be\u59bf\u59c0\u59c1\u59c2\u59c3\u59c4\u59c5\u59c6\u59c7\u59c8\u59c9\u59ca\u59cb\u59cc\u59cd\u59ce\u59cf\u59d0\u59d1\u59d2\u59d3\u59d4\u59d5\u59d6\u59d7\u59d8\u59d9\u59da\u59db\u59dc\u59dd\u59de\u59df\u59e0\u59e1\u59e2\u59e3\u59e4\u59e5\u59e6\u59e7\u59e8\u59e9\u59ea\u59eb\u59ec\u59ed\u59ee\u59ef\u59f0\u59f1\u59f2\u59f3\u59f4\u59f5\u59f6\u59f7\u59f8\u59f9\u59fa\u59fb\u59fc\u59fd\u59fe\u59ff\u5a00\u5a01\u5a02\u5a03\u5a04\u5a05\u5a06\u5a07\u5a08\u5a09\u5a0a\u5a0b\u5a0c\u5a0d\u5a0e\u5a0f\u5a10\u5a11\u5a12\u5a13\u5a14\u5a15\u5a16\u5a17\u5a18\u5a19\u5a1a\u5a1b\u5a1c\u5a1d\u5a1e\u5a1f\u5a20\u5a21\u5a22\u5a23\u5a24\u5a25\u5a26\u5a27\u5a28\u5a29\u5a2a\u5a2b\u5a2c\u5a2d\u5a2e\u5a2f\u5a30\u5a31\u5a32\u5a33\u5a34\u5a35\u5a36\u5a37\u5a38\u5a39\u5a3a\u5a3b\u5a3c\u5a3d\u5a3e\u5a3f\u5a40\u5a41\u5a42\u5a43\u5a44\u5a45\u5a46\u5a47\u5a48\u5a49\u5a4a\u5a4b\u5a4c\u5a4d\u5a4e\u5a4f\u5a50\u5a51\u5a52\u5a53\u5a54\u5a55\u5a56\u5a57\u5a58\u5a59\u5a5a\u5a5b\u5a5c\u5a5d\u5a5e\u5a5f\u5a60\u5a61\u5a62\u5a63\u5a64\u5a65\u5a66\u5a67\u5a68\u5a69\u5a6a\u5a6b\u5a6c\u5a6d\u5a6e\u5a6f\u5a70\u5a71\u5a72\u5a73\u5a74\u5a75\u5a76\u5a77\u5a78\u5a79\u5a7a\u5a7b\u5a7c\u5a7d\u5a7e\u5a7f\u5a80\u5a81\u5a82\u5a83\u5a84\u5a85\u5a86\u5a87\u5a88\u5a89\u5a8a\u5a8b\u5a8c\u5a8d\u5a8e\u5a8f\u5a90\u5a91\u5a92\u5a93\u5a94\u5a95\u5a96\u5a97\u5a98\u5a99\u5a9a\u5a9b\u5a9c\u5a9d\u5a9e\u5a9f\u5aa0\u5aa1\u5aa2\u5aa3\u5aa4\u5aa5\u5aa6\u5aa7\u5aa8\u5aa9\u5aaa\u5aab\u5aac\u5aad\u5aae\u5aaf\u5ab0\u5ab1\u5ab2\u5ab3\u5ab4\u5ab5\u5ab6\u5ab7\u5ab8\u5ab9\u5aba\u5abb\u5abc\u5abd\u5abe\u5abf\u5ac0\u5ac1\u5ac2\u5ac3\u5ac4\u5ac5\u5ac6\u5ac7\u5ac8\u5ac9\u5aca\u5acb\u5acc\u5acd\u5ace\u5acf\u5ad0\u5ad1\u5ad2\u5ad3\u5ad4\u5ad5\u5ad6\u5ad7\u5ad8\u5ad9\u5ada\u5adb\u5adc\u5add\u5ade\u5adf\u5ae0\u5ae1\u5ae2\u5ae3\u5ae4\u5ae5\u5ae6\u5ae7\u5ae8\u5ae9\u5aea\u5aeb\u5aec\u5aed\u5aee\u5aef\u5af0\u5af1\u5af2\u5af3\u5af4\u5af5\u5af6\u5af7\u5af8\u5af9\u5afa\u5afb\u5afc\u5afd\u5afe\u5aff\u5b00\u5b01\u5b02\u5b03\u5b04\u5b05\u5b06\u5b07\u5b08\u5b09\u5b0a\u5b0b\u5b0c\u5b0d\u5b0e\u5b0f\u5b10\u5b11\u5b12\u5b13\u5b14\u5b15\u5b16\u5b17\u5b18\u5b19\u5b1a\u5b1b\u5b1c\u5b1d\u5b1e\u5b1f\u5b20\u5b21\u5b22\u5b23\u5b24\u5b25\u5b26\u5b27\u5b28\u5b29\u5b2a\u5b2b\u5b2c\u5b2d\u5b2e\u5b2f\u5b30\u5b31\u5b32\u5b33\u5b34\u5b35\u5b36\u5b37\u5b38\u5b39\u5b3a\u5b3b\u5b3c\u5b3d\u5b3e\u5b3f\u5b40\u5b41\u5b42\u5b43\u5b44\u5b45\u5b46\u5b47\u5b48\u5b49\u5b4a\u5b4b\u5b4c\u5b4d\u5b4e\u5b4f\u5b50\u5b51\u5b52\u5b53\u5b54\u5b55\u5b56\u5b57\u5b58\u5b59\u5b5a\u5b5b\u5b5c\u5b5d\u5b5e\u5b5f\u5b60\u5b61\u5b62\u5b63\u5b64\u5b65\u5b66\u5b67\u5b68\u5b69\u5b6a\u5b6b\u5b6c\u5b6d\u5b6e\u5b6f\u5b70\u5b71\u5b72\u5b73\u5b74\u5b75\u5b76\u5b77\u5b78\u5b79\u5b7a\u5b7b\u5b7c\u5b7d\u5b7e\u5b7f\u5b80\u5b81\u5b82\u5b83\u5b84\u5b85\u5b86\u5b87\u5b88\u5b89\u5b8a\u5b8b\u5b8c\u5b8d\u5b8e\u5b8f\u5b90\u5b91\u5b92\u5b93\u5b94\u5b95\u5b96\u5b97\u5b98\u5b99\u5b9a\u5b9b\u5b9c\u5b9d\u5b9e\u5b9f\u5ba0\u5ba1\u5ba2\u5ba3\u5ba4\u5ba5\u5ba6\u5ba7\u5ba8\u5ba9\u5baa\u5bab\u5bac\u5bad\u5bae\u5baf\u5bb0\u5bb1\u5bb2\u5bb3\u5bb4\u5bb5\u5bb6\u5bb7\u5bb8\u5bb9\u5bba\u5bbb\u5bbc\u5bbd\u5bbe\u5bbf\u5bc0\u5bc1\u5bc2\u5bc3\u5bc4\u5bc5\u5bc6\u5bc7\u5bc8\u5bc9\u5bca\u5bcb\u5bcc\u5bcd\u5bce\u5bcf\u5bd0\u5bd1\u5bd2\u5bd3\u5bd4\u5bd5\u5bd6\u5bd7\u5bd8\u5bd9\u5bda\u5bdb\u5bdc\u5bdd\u5bde\u5bdf\u5be0\u5be1\u5be2\u5be3\u5be4\u5be5\u5be6\u5be7\u5be8\u5be9\u5bea\u5beb\u5bec\u5bed\u5bee\u5bef\u5bf0\u5bf1\u5bf2\u5bf3\u5bf4\u5bf5\u5bf6\u5bf7\u5bf8\u5bf9\u5bfa\u5bfb\u5bfc\u5bfd\u5bfe\u5bff\u5c00\u5c01\u5c02\u5c03\u5c04\u5c05\u5c06\u5c07\u5c08\u5c09\u5c0a\u5c0b\u5c0c\u5c0d\u5c0e\u5c0f\u5c10\u5c11\u5c12\u5c13\u5c14\u5c15\u5c16\u5c17\u5c18\u5c19\u5c1a\u5c1b\u5c1c\u5c1d\u5c1e\u5c1f\u5c20\u5c21\u5c22\u5c23\u5c24\u5c25\u5c26\u5c27\u5c28\u5c29\u5c2a\u5c2b\u5c2c\u5c2d\u5c2e\u5c2f\u5c30\u5c31\u5c32\u5c33\u5c34\u5c35\u5c36\u5c37\u5c38\u5c39\u5c3a\u5c3b\u5c3c\u5c3d\u5c3e\u5c3f\u5c40\u5c41\u5c42\u5c43\u5c44\u5c45\u5c46\u5c47\u5c48\u5c49\u5c4a\u5c4b\u5c4c\u5c4d\u5c4e\u5c4f\u5c50\u5c51\u5c52\u5c53\u5c54\u5c55\u5c56\u5c57\u5c58\u5c59\u5c5a\u5c5b\u5c5c\u5c5d\u5c5e\u5c5f\u5c60\u5c61\u5c62\u5c63\u5c64\u5c65\u5c66\u5c67\u5c68\u5c69\u5c6a\u5c6b\u5c6c\u5c6d\u5c6e\u5c6f\u5c70\u5c71\u5c72\u5c73\u5c74\u5c75\u5c76\u5c77\u5c78\u5c79\u5c7a\u5c7b\u5c7c\u5c7d\u5c7e\u5c7f\u5c80\u5c81\u5c82\u5c83\u5c84\u5c85\u5c86\u5c87\u5c88\u5c89\u5c8a\u5c8b\u5c8c\u5c8d\u5c8e\u5c8f\u5c90\u5c91\u5c92\u5c93\u5c94\u5c95\u5c96\u5c97\u5c98\u5c99\u5c9a\u5c9b\u5c9c\u5c9d\u5c9e\u5c9f\u5ca0\u5ca1\u5ca2\u5ca3\u5ca4\u5ca5\u5ca6\u5ca7\u5ca8\u5ca9\u5caa\u5cab\u5cac\u5cad\u5cae\u5caf\u5cb0\u5cb1\u5cb2\u5cb3\u5cb4\u5cb5\u5cb6\u5cb7\u5cb8\u5cb9\u5cba\u5cbb\u5cbc\u5cbd\u5cbe\u5cbf\u5cc0\u5cc1\u5cc2\u5cc3\u5cc4\u5cc5\u5cc6\u5cc7\u5cc8\u5cc9\u5cca\u5ccb\u5ccc\u5ccd\u5cce\u5ccf\u5cd0\u5cd1\u5cd2\u5cd3\u5cd4\u5cd5\u5cd6\u5cd7\u5cd8\u5cd9\u5cda\u5cdb\u5cdc\u5cdd\u5cde\u5cdf\u5ce0\u5ce1\u5ce2\u5ce3\u5ce4\u5ce5\u5ce6\u5ce7\u5ce8\u5ce9\u5cea\u5ceb\u5cec\u5ced\u5cee\u5cef\u5cf0\u5cf1\u5cf2\u5cf3\u5cf4\u5cf5\u5cf6\u5cf7\u5cf8\u5cf9\u5cfa\u5cfb\u5cfc\u5cfd\u5cfe\u5cff\u5d00\u5d01\u5d02\u5d03\u5d04\u5d05\u5d06\u5d07\u5d08\u5d09\u5d0a\u5d0b\u5d0c\u5d0d\u5d0e\u5d0f\u5d10\u5d11\u5d12\u5d13\u5d14\u5d15\u5d16\u5d17\u5d18\u5d19\u5d1a\u5d1b\u5d1c\u5d1d\u5d1e\u5d1f\u5d20\u5d21\u5d22\u5d23\u5d24\u5d25\u5d26\u5d27\u5d28\u5d29\u5d2a\u5d2b\u5d2c\u5d2d\u5d2e\u5d2f\u5d30\u5d31\u5d32\u5d33\u5d34\u5d35\u5d36\u5d37\u5d38\u5d39\u5d3a\u5d3b\u5d3c\u5d3d\u5d3e\u5d3f\u5d40\u5d41\u5d42\u5d43\u5d44\u5d45\u5d46\u5d47\u5d48\u5d49\u5d4a\u5d4b\u5d4c\u5d4d\u5d4e\u5d4f\u5d50\u5d51\u5d52\u5d53\u5d54\u5d55\u5d56\u5d57\u5d58\u5d59\u5d5a\u5d5b\u5d5c\u5d5d\u5d5e\u5d5f\u5d60\u5d61\u5d62\u5d63\u5d64\u5d65\u5d66\u5d67\u5d68\u5d69\u5d6a\u5d6b\u5d6c\u5d6d\u5d6e\u5d6f\u5d70\u5d71\u5d72\u5d73\u5d74\u5d75\u5d76\u5d77\u5d78\u5d79\u5d7a\u5d7b\u5d7c\u5d7d\u5d7e\u5d7f\u5d80\u5d81\u5d82\u5d83\u5d84\u5d85\u5d86\u5d87\u5d88\u5d89\u5d8a\u5d8b\u5d8c\u5d8d\u5d8e\u5d8f\u5d90\u5d91\u5d92\u5d93\u5d94\u5d95\u5d96\u5d97\u5d98\u5d99\u5d9a\u5d9b\u5d9c\u5d9d\u5d9e\u5d9f\u5da0\u5da1\u5da2\u5da3\u5da4\u5da5\u5da6\u5da7\u5da8\u5da9\u5daa\u5dab\u5dac\u5dad\u5dae\u5daf\u5db0\u5db1\u5db2\u5db3\u5db4\u5db5\u5db6\u5db7\u5db8\u5db9\u5dba\u5dbb\u5dbc\u5dbd\u5dbe\u5dbf\u5dc0\u5dc1\u5dc2\u5dc3\u5dc4\u5dc5\u5dc6\u5dc7\u5dc8\u5dc9\u5dca\u5dcb\u5dcc\u5dcd\u5dce\u5dcf\u5dd0\u5dd1\u5dd2\u5dd3\u5dd4\u5dd5\u5dd6\u5dd7\u5dd8\u5dd9\u5dda\u5ddb\u5ddc\u5ddd\u5dde\u5ddf\u5de0\u5de1\u5de2\u5de3\u5de4\u5de5\u5de6\u5de7\u5de8\u5de9\u5dea\u5deb\u5dec\u5ded\u5dee\u5def\u5df0\u5df1\u5df2\u5df3\u5df4\u5df5\u5df6\u5df7\u5df8\u5df9\u5dfa\u5dfb\u5dfc\u5dfd\u5dfe\u5dff\u5e00\u5e01\u5e02\u5e03\u5e04\u5e05\u5e06\u5e07\u5e08\u5e09\u5e0a\u5e0b\u5e0c\u5e0d\u5e0e\u5e0f\u5e10\u5e11\u5e12\u5e13\u5e14\u5e15\u5e16\u5e17\u5e18\u5e19\u5e1a\u5e1b\u5e1c\u5e1d\u5e1e\u5e1f\u5e20\u5e21\u5e22\u5e23\u5e24\u5e25\u5e26\u5e27\u5e28\u5e29\u5e2a\u5e2b\u5e2c\u5e2d\u5e2e\u5e2f\u5e30\u5e31\u5e32\u5e33\u5e34\u5e35\u5e36\u5e37\u5e38\u5e39\u5e3a\u5e3b\u5e3c\u5e3d\u5e3e\u5e3f\u5e40\u5e41\u5e42\u5e43\u5e44\u5e45\u5e46\u5e47\u5e48\u5e49\u5e4a\u5e4b\u5e4c\u5e4d\u5e4e\u5e4f\u5e50\u5e51\u5e52\u5e53\u5e54\u5e55\u5e56\u5e57\u5e58\u5e59\u5e5a\u5e5b\u5e5c\u5e5d\u5e5e\u5e5f\u5e60\u5e61\u5e62\u5e63\u5e64\u5e65\u5e66\u5e67\u5e68\u5e69\u5e6a\u5e6b\u5e6c\u5e6d\u5e6e\u5e6f\u5e70\u5e71\u5e72\u5e73\u5e74\u5e75\u5e76\u5e77\u5e78\u5e79\u5e7a\u5e7b\u5e7c\u5e7d\u5e7e\u5e7f\u5e80\u5e81\u5e82\u5e83\u5e84\u5e85\u5e86\u5e87\u5e88\u5e89\u5e8a\u5e8b\u5e8c\u5e8d\u5e8e\u5e8f\u5e90\u5e91\u5e92\u5e93\u5e94\u5e95\u5e96\u5e97\u5e98\u5e99\u5e9a\u5e9b\u5e9c\u5e9d\u5e9e\u5e9f\u5ea0\u5ea1\u5ea2\u5ea3\u5ea4\u5ea5\u5ea6\u5ea7\u5ea8\u5ea9\u5eaa\u5eab\u5eac\u5ead\u5eae\u5eaf\u5eb0\u5eb1\u5eb2\u5eb3\u5eb4\u5eb5\u5eb6\u5eb7\u5eb8\u5eb9\u5eba\u5ebb\u5ebc\u5ebd\u5ebe\u5ebf\u5ec0\u5ec1\u5ec2\u5ec3\u5ec4\u5ec5\u5ec6\u5ec7\u5ec8\u5ec9\u5eca\u5ecb\u5ecc\u5ecd\u5ece\u5ecf\u5ed0\u5ed1\u5ed2\u5ed3\u5ed4\u5ed5\u5ed6\u5ed7\u5ed8\u5ed9\u5eda\u5edb\u5edc\u5edd\u5ede\u5edf\u5ee0\u5ee1\u5ee2\u5ee3\u5ee4\u5ee5\u5ee6\u5ee7\u5ee8\u5ee9\u5eea\u5eeb\u5eec\u5eed\u5eee\u5eef\u5ef0\u5ef1\u5ef2\u5ef3\u5ef4\u5ef5\u5ef6\u5ef7\u5ef8\u5ef9\u5efa\u5efb\u5efc\u5efd\u5efe\u5eff\u5f00\u5f01\u5f02\u5f03\u5f04\u5f05\u5f06\u5f07\u5f08\u5f09\u5f0a\u5f0b\u5f0c\u5f0d\u5f0e\u5f0f\u5f10\u5f11\u5f12\u5f13\u5f14\u5f15\u5f16\u5f17\u5f18\u5f19\u5f1a\u5f1b\u5f1c\u5f1d\u5f1e\u5f1f\u5f20\u5f21\u5f22\u5f23\u5f24\u5f25\u5f26\u5f27\u5f28\u5f29\u5f2a\u5f2b\u5f2c\u5f2d\u5f2e\u5f2f\u5f30\u5f31\u5f32\u5f33\u5f34\u5f35\u5f36\u5f37\u5f38\u5f39\u5f3a\u5f3b\u5f3c\u5f3d\u5f3e\u5f3f\u5f40\u5f41\u5f42\u5f43\u5f44\u5f45\u5f46\u5f47\u5f48\u5f49\u5f4a\u5f4b\u5f4c\u5f4d\u5f4e\u5f4f\u5f50\u5f51\u5f52\u5f53\u5f54\u5f55\u5f56\u5f57\u5f58\u5f59\u5f5a\u5f5b\u5f5c\u5f5d\u5f5e\u5f5f\u5f60\u5f61\u5f62\u5f63\u5f64\u5f65\u5f66\u5f67\u5f68\u5f69\u5f6a\u5f6b\u5f6c\u5f6d\u5f6e\u5f6f\u5f70\u5f71\u5f72\u5f73\u5f74\u5f75\u5f76\u5f77\u5f78\u5f79\u5f7a\u5f7b\u5f7c\u5f7d\u5f7e\u5f7f\u5f80\u5f81\u5f82\u5f83\u5f84\u5f85\u5f86\u5f87\u5f88\u5f89\u5f8a\u5f8b\u5f8c\u5f8d\u5f8e\u5f8f\u5f90\u5f91\u5f92\u5f93\u5f94\u5f95\u5f96\u5f97\u5f98\u5f99\u5f9a\u5f9b\u5f9c\u5f9d\u5f9e\u5f9f\u5fa0\u5fa1\u5fa2\u5fa3\u5fa4\u5fa5\u5fa6\u5fa7\u5fa8\u5fa9\u5faa\u5fab\u5fac\u5fad\u5fae\u5faf\u5fb0\u5fb1\u5fb2\u5fb3\u5fb4\u5fb5\u5fb6\u5fb7\u5fb8\u5fb9\u5fba\u5fbb\u5fbc\u5fbd\u5fbe\u5fbf\u5fc0\u5fc1\u5fc2\u5fc3\u5fc4\u5fc5\u5fc6\u5fc7\u5fc8\u5fc9\u5fca\u5fcb\u5fcc\u5fcd\u5fce\u5fcf\u5fd0\u5fd1\u5fd2\u5fd3\u5fd4\u5fd5\u5fd6\u5fd7\u5fd8\u5fd9\u5fda\u5fdb\u5fdc\u5fdd\u5fde\u5fdf\u5fe0\u5fe1\u5fe2\u5fe3\u5fe4\u5fe5\u5fe6\u5fe7\u5fe8\u5fe9\u5fea\u5feb\u5fec\u5fed\u5fee\u5fef\u5ff0\u5ff1\u5ff2\u5ff3\u5ff4\u5ff5\u5ff6\u5ff7\u5ff8\u5ff9\u5ffa\u5ffb\u5ffc\u5ffd\u5ffe\u5fff\u6000\u6001\u6002\u6003\u6004\u6005\u6006\u6007\u6008\u6009\u600a\u600b\u600c\u600d\u600e\u600f\u6010\u6011\u6012\u6013\u6014\u6015\u6016\u6017\u6018\u6019\u601a\u601b\u601c\u601d\u601e\u601f\u6020\u6021\u6022\u6023\u6024\u6025\u6026\u6027\u6028\u6029\u602a\u602b\u602c\u602d\u602e\u602f\u6030\u6031\u6032\u6033\u6034\u6035\u6036\u6037\u6038\u6039\u603a\u603b\u603c\u603d\u603e\u603f\u6040\u6041\u6042\u6043\u6044\u6045\u6046\u6047\u6048\u6049\u604a\u604b\u604c\u604d\u604e\u604f\u6050\u6051\u6052\u6053\u6054\u6055\u6056\u6057\u6058\u6059\u605a\u605b\u605c\u605d\u605e\u605f\u6060\u6061\u6062\u6063\u6064\u6065\u6066\u6067\u6068\u6069\u606a\u606b\u606c\u606d\u606e\u606f\u6070\u6071\u6072\u6073\u6074\u6075\u6076\u6077\u6078\u6079\u607a\u607b\u607c\u607d\u607e\u607f\u6080\u6081\u6082\u6083\u6084\u6085\u6086\u6087\u6088\u6089\u608a\u608b\u608c\u608d\u608e\u608f\u6090\u6091\u6092\u6093\u6094\u6095\u6096\u6097\u6098\u6099\u609a\u609b\u609c\u609d\u609e\u609f\u60a0\u60a1\u60a2\u60a3\u60a4\u60a5\u60a6\u60a7\u60a8\u60a9\u60aa\u60ab\u60ac\u60ad\u60ae\u60af\u60b0\u60b1\u60b2\u60b3\u60b4\u60b5\u60b6\u60b7\u60b8\u60b9\u60ba\u60bb\u60bc\u60bd\u60be\u60bf\u60c0\u60c1\u60c2\u60c3\u60c4\u60c5\u60c6\u60c7\u60c8\u60c9\u60ca\u60cb\u60cc\u60cd\u60ce\u60cf\u60d0\u60d1\u60d2\u60d3\u60d4\u60d5\u60d6\u60d7\u60d8\u60d9\u60da\u60db\u60dc\u60dd\u60de\u60df\u60e0\u60e1\u60e2\u60e3\u60e4\u60e5\u60e6\u60e7\u60e8\u60e9\u60ea\u60eb\u60ec\u60ed\u60ee\u60ef\u60f0\u60f1\u60f2\u60f3\u60f4\u60f5\u60f6\u60f7\u60f8\u60f9\u60fa\u60fb\u60fc\u60fd\u60fe\u60ff\u6100\u6101\u6102\u6103\u6104\u6105\u6106\u6107\u6108\u6109\u610a\u610b\u610c\u610d\u610e\u610f\u6110\u6111\u6112\u6113\u6114\u6115\u6116\u6117\u6118\u6119\u611a\u611b\u611c\u611d\u611e\u611f\u6120\u6121\u6122\u6123\u6124\u6125\u6126\u6127\u6128\u6129\u612a\u612b\u612c\u612d\u612e\u612f\u6130\u6131\u6132\u6133\u6134\u6135\u6136\u6137\u6138\u6139\u613a\u613b\u613c\u613d\u613e\u613f\u6140\u6141\u6142\u6143\u6144\u6145\u6146\u6147\u6148\u6149\u614a\u614b\u614c\u614d\u614e\u614f\u6150\u6151\u6152\u6153\u6154\u6155\u6156\u6157\u6158\u6159\u615a\u615b\u615c\u615d\u615e\u615f\u6160\u6161\u6162\u6163\u6164\u6165\u6166\u6167\u6168\u6169\u616a\u616b\u616c\u616d\u616e\u616f\u6170\u6171\u6172\u6173\u6174\u6175\u6176\u6177\u6178\u6179\u617a\u617b\u617c\u617d\u617e\u617f\u6180\u6181\u6182\u6183\u6184\u6185\u6186\u6187\u6188\u6189\u618a\u618b\u618c\u618d\u618e\u618f\u6190\u6191\u6192\u6193\u6194\u6195\u6196\u6197\u6198\u6199\u619a\u619b\u619c\u619d\u619e\u619f\u61a0\u61a1\u61a2\u61a3\u61a4\u61a5\u61a6\u61a7\u61a8\u61a9\u61aa\u61ab\u61ac\u61ad\u61ae\u61af\u61b0\u61b1\u61b2\u61b3\u61b4\u61b5\u61b6\u61b7\u61b8\u61b9\u61ba\u61bb\u61bc\u61bd\u61be\u61bf\u61c0\u61c1\u61c2\u61c3\u61c4\u61c5\u61c6\u61c7\u61c8\u61c9\u61ca\u61cb\u61cc\u61cd\u61ce\u61cf\u61d0\u61d1\u61d2\u61d3\u61d4\u61d5\u61d6\u61d7\u61d8\u61d9\u61da\u61db\u61dc\u61dd\u61de\u61df\u61e0\u61e1\u61e2\u61e3\u61e4\u61e5\u61e6\u61e7\u61e8\u61e9\u61ea\u61eb\u61ec\u61ed\u61ee\u61ef\u61f0\u61f1\u61f2\u61f3\u61f4\u61f5\u61f6\u61f7\u61f8\u61f9\u61fa\u61fb\u61fc\u61fd\u61fe\u61ff\u6200\u6201\u6202\u6203\u6204\u6205\u6206\u6207\u6208\u6209\u620a\u620b\u620c\u620d\u620e\u620f\u6210\u6211\u6212\u6213\u6214\u6215\u6216\u6217\u6218\u6219\u621a\u621b\u621c\u621d\u621e\u621f\u6220\u6221\u6222\u6223\u6224\u6225\u6226\u6227\u6228\u6229\u622a\u622b\u622c\u622d\u622e\u622f\u6230\u6231\u6232\u6233\u6234\u6235\u6236\u6237\u6238\u6239\u623a\u623b\u623c\u623d\u623e\u623f\u6240\u6241\u6242\u6243\u6244\u6245\u6246\u6247\u6248\u6249\u624a\u624b\u624c\u624d\u624e\u624f\u6250\u6251\u6252\u6253\u6254\u6255\u6256\u6257\u6258\u6259\u625a\u625b\u625c\u625d\u625e\u625f\u6260\u6261\u6262\u6263\u6264\u6265\u6266\u6267\u6268\u6269\u626a\u626b\u626c\u626d\u626e\u626f\u6270\u6271\u6272\u6273\u6274\u6275\u6276\u6277\u6278\u6279\u627a\u627b\u627c\u627d\u627e\u627f\u6280\u6281\u6282\u6283\u6284\u6285\u6286\u6287\u6288\u6289\u628a\u628b\u628c\u628d\u628e\u628f\u6290\u6291\u6292\u6293\u6294\u6295\u6296\u6297\u6298\u6299\u629a\u629b\u629c\u629d\u629e\u629f\u62a0\u62a1\u62a2\u62a3\u62a4\u62a5\u62a6\u62a7\u62a8\u62a9\u62aa\u62ab\u62ac\u62ad\u62ae\u62af\u62b0\u62b1\u62b2\u62b3\u62b4\u62b5\u62b6\u62b7\u62b8\u62b9\u62ba\u62bb\u62bc\u62bd\u62be\u62bf\u62c0\u62c1\u62c2\u62c3\u62c4\u62c5\u62c6\u62c7\u62c8\u62c9\u62ca\u62cb\u62cc\u62cd\u62ce\u62cf\u62d0\u62d1\u62d2\u62d3\u62d4\u62d5\u62d6\u62d7\u62d8\u62d9\u62da\u62db\u62dc\u62dd\u62de\u62df\u62e0\u62e1\u62e2\u62e3\u62e4\u62e5\u62e6\u62e7\u62e8\u62e9\u62ea\u62eb\u62ec\u62ed\u62ee\u62ef\u62f0\u62f1\u62f2\u62f3\u62f4\u62f5\u62f6\u62f7\u62f8\u62f9\u62fa\u62fb\u62fc\u62fd\u62fe\u62ff\u6300\u6301\u6302\u6303\u6304\u6305\u6306\u6307\u6308\u6309\u630a\u630b\u630c\u630d\u630e\u630f\u6310\u6311\u6312\u6313\u6314\u6315\u6316\u6317\u6318\u6319\u631a\u631b\u631c\u631d\u631e\u631f\u6320\u6321\u6322\u6323\u6324\u6325\u6326\u6327\u6328\u6329\u632a\u632b\u632c\u632d\u632e\u632f\u6330\u6331\u6332\u6333\u6334\u6335\u6336\u6337\u6338\u6339\u633a\u633b\u633c\u633d\u633e\u633f\u6340\u6341\u6342\u6343\u6344\u6345\u6346\u6347\u6348\u6349\u634a\u634b\u634c\u634d\u634e\u634f\u6350\u6351\u6352\u6353\u6354\u6355\u6356\u6357\u6358\u6359\u635a\u635b\u635c\u635d\u635e\u635f\u6360\u6361\u6362\u6363\u6364\u6365\u6366\u6367\u6368\u6369\u636a\u636b\u636c\u636d\u636e\u636f\u6370\u6371\u6372\u6373\u6374\u6375\u6376\u6377\u6378\u6379\u637a\u637b\u637c\u637d\u637e\u637f\u6380\u6381\u6382\u6383\u6384\u6385\u6386\u6387\u6388\u6389\u638a\u638b\u638c\u638d\u638e\u638f\u6390\u6391\u6392\u6393\u6394\u6395\u6396\u6397\u6398\u6399\u639a\u639b\u639c\u639d\u639e\u639f\u63a0\u63a1\u63a2\u63a3\u63a4\u63a5\u63a6\u63a7\u63a8\u63a9\u63aa\u63ab\u63ac\u63ad\u63ae\u63af\u63b0\u63b1\u63b2\u63b3\u63b4\u63b5\u63b6\u63b7\u63b8\u63b9\u63ba\u63bb\u63bc\u63bd\u63be\u63bf\u63c0\u63c1\u63c2\u63c3\u63c4\u63c5\u63c6\u63c7\u63c8\u63c9\u63ca\u63cb\u63cc\u63cd\u63ce\u63cf\u63d0\u63d1\u63d2\u63d3\u63d4\u63d5\u63d6\u63d7\u63d8\u63d9\u63da\u63db\u63dc\u63dd\u63de\u63df\u63e0\u63e1\u63e2\u63e3\u63e4\u63e5\u63e6\u63e7\u63e8\u63e9\u63ea\u63eb\u63ec\u63ed\u63ee\u63ef\u63f0\u63f1\u63f2\u63f3\u63f4\u63f5\u63f6\u63f7\u63f8\u63f9\u63fa\u63fb\u63fc\u63fd\u63fe\u63ff\u6400\u6401\u6402\u6403\u6404\u6405\u6406\u6407\u6408\u6409\u640a\u640b\u640c\u640d\u640e\u640f\u6410\u6411\u6412\u6413\u6414\u6415\u6416\u6417\u6418\u6419\u641a\u641b\u641c\u641d\u641e\u641f\u6420\u6421\u6422\u6423\u6424\u6425\u6426\u6427\u6428\u6429\u642a\u642b\u642c\u642d\u642e\u642f\u6430\u6431\u6432\u6433\u6434\u6435\u6436\u6437\u6438\u6439\u643a\u643b\u643c\u643d\u643e\u643f\u6440\u6441\u6442\u6443\u6444\u6445\u6446\u6447\u6448\u6449\u644a\u644b\u644c\u644d\u644e\u644f\u6450\u6451\u6452\u6453\u6454\u6455\u6456\u6457\u6458\u6459\u645a\u645b\u645c\u645d\u645e\u645f\u6460\u6461\u6462\u6463\u6464\u6465\u6466\u6467\u6468\u6469\u646a\u646b\u646c\u646d\u646e\u646f\u6470\u6471\u6472\u6473\u6474\u6475\u6476\u6477\u6478\u6479\u647a\u647b\u647c\u647d\u647e\u647f\u6480\u6481\u6482\u6483\u6484\u6485\u6486\u6487\u6488\u6489\u648a\u648b\u648c\u648d\u648e\u648f\u6490\u6491\u6492\u6493\u6494\u6495\u6496\u6497\u6498\u6499\u649a\u649b\u649c\u649d\u649e\u649f\u64a0\u64a1\u64a2\u64a3\u64a4\u64a5\u64a6\u64a7\u64a8\u64a9\u64aa\u64ab\u64ac\u64ad\u64ae\u64af\u64b0\u64b1\u64b2\u64b3\u64b4\u64b5\u64b6\u64b7\u64b8\u64b9\u64ba\u64bb\u64bc\u64bd\u64be\u64bf\u64c0\u64c1\u64c2\u64c3\u64c4\u64c5\u64c6\u64c7\u64c8\u64c9\u64ca\u64cb\u64cc\u64cd\u64ce\u64cf\u64d0\u64d1\u64d2\u64d3\u64d4\u64d5\u64d6\u64d7\u64d8\u64d9\u64da\u64db\u64dc\u64dd\u64de\u64df\u64e0\u64e1\u64e2\u64e3\u64e4\u64e5\u64e6\u64e7\u64e8\u64e9\u64ea\u64eb\u64ec\u64ed\u64ee\u64ef\u64f0\u64f1\u64f2\u64f3\u64f4\u64f5\u64f6\u64f7\u64f8\u64f9\u64fa\u64fb\u64fc\u64fd\u64fe\u64ff\u6500\u6501\u6502\u6503\u6504\u6505\u6506\u6507\u6508\u6509\u650a\u650b\u650c\u650d\u650e\u650f\u6510\u6511\u6512\u6513\u6514\u6515\u6516\u6517\u6518\u6519\u651a\u651b\u651c\u651d\u651e\u651f\u6520\u6521\u6522\u6523\u6524\u6525\u6526\u6527\u6528\u6529\u652a\u652b\u652c\u652d\u652e\u652f\u6530\u6531\u6532\u6533\u6534\u6535\u6536\u6537\u6538\u6539\u653a\u653b\u653c\u653d\u653e\u653f\u6540\u6541\u6542\u6543\u6544\u6545\u6546\u6547\u6548\u6549\u654a\u654b\u654c\u654d\u654e\u654f\u6550\u6551\u6552\u6553\u6554\u6555\u6556\u6557\u6558\u6559\u655a\u655b\u655c\u655d\u655e\u655f\u6560\u6561\u6562\u6563\u6564\u6565\u6566\u6567\u6568\u6569\u656a\u656b\u656c\u656d\u656e\u656f\u6570\u6571\u6572\u6573\u6574\u6575\u6576\u6577\u6578\u6579\u657a\u657b\u657c\u657d\u657e\u657f\u6580\u6581\u6582\u6583\u6584\u6585\u6586\u6587\u6588\u6589\u658a\u658b\u658c\u658d\u658e\u658f\u6590\u6591\u6592\u6593\u6594\u6595\u6596\u6597\u6598\u6599\u659a\u659b\u659c\u659d\u659e\u659f\u65a0\u65a1\u65a2\u65a3\u65a4\u65a5\u65a6\u65a7\u65a8\u65a9\u65aa\u65ab\u65ac\u65ad\u65ae\u65af\u65b0\u65b1\u65b2\u65b3\u65b4\u65b5\u65b6\u65b7\u65b8\u65b9\u65ba\u65bb\u65bc\u65bd\u65be\u65bf\u65c0\u65c1\u65c2\u65c3\u65c4\u65c5\u65c6\u65c7\u65c8\u65c9\u65ca\u65cb\u65cc\u65cd\u65ce\u65cf\u65d0\u65d1\u65d2\u65d3\u65d4\u65d5\u65d6\u65d7\u65d8\u65d9\u65da\u65db\u65dc\u65dd\u65de\u65df\u65e0\u65e1\u65e2\u65e3\u65e4\u65e5\u65e6\u65e7\u65e8\u65e9\u65ea\u65eb\u65ec\u65ed\u65ee\u65ef\u65f0\u65f1\u65f2\u65f3\u65f4\u65f5\u65f6\u65f7\u65f8\u65f9\u65fa\u65fb\u65fc\u65fd\u65fe\u65ff\u6600\u6601\u6602\u6603\u6604\u6605\u6606\u6607\u6608\u6609\u660a\u660b\u660c\u660d\u660e\u660f\u6610\u6611\u6612\u6613\u6614\u6615\u6616\u6617\u6618\u6619\u661a\u661b\u661c\u661d\u661e\u661f\u6620\u6621\u6622\u6623\u6624\u6625\u6626\u6627\u6628\u6629\u662a\u662b\u662c\u662d\u662e\u662f\u6630\u6631\u6632\u6633\u6634\u6635\u6636\u6637\u6638\u6639\u663a\u663b\u663c\u663d\u663e\u663f\u6640\u6641\u6642\u6643\u6644\u6645\u6646\u6647\u6648\u6649\u664a\u664b\u664c\u664d\u664e\u664f\u6650\u6651\u6652\u6653\u6654\u6655\u6656\u6657\u6658\u6659\u665a\u665b\u665c\u665d\u665e\u665f\u6660\u6661\u6662\u6663\u6664\u6665\u6666\u6667\u6668\u6669\u666a\u666b\u666c\u666d\u666e\u666f\u6670\u6671\u6672\u6673\u6674\u6675\u6676\u6677\u6678\u6679\u667a\u667b\u667c\u667d\u667e\u667f\u6680\u6681\u6682\u6683\u6684\u6685\u6686\u6687\u6688\u6689\u668a\u668b\u668c\u668d\u668e\u668f\u6690\u6691\u6692\u6693\u6694\u6695\u6696\u6697\u6698\u6699\u669a\u669b\u669c\u669d\u669e\u669f\u66a0\u66a1\u66a2\u66a3\u66a4\u66a5\u66a6\u66a7\u66a8\u66a9\u66aa\u66ab\u66ac\u66ad\u66ae\u66af\u66b0\u66b1\u66b2\u66b3\u66b4\u66b5\u66b6\u66b7\u66b8\u66b9\u66ba\u66bb\u66bc\u66bd\u66be\u66bf\u66c0\u66c1\u66c2\u66c3\u66c4\u66c5\u66c6\u66c7\u66c8\u66c9\u66ca\u66cb\u66cc\u66cd\u66ce\u66cf\u66d0\u66d1\u66d2\u66d3\u66d4\u66d5\u66d6\u66d7\u66d8\u66d9\u66da\u66db\u66dc\u66dd\u66de\u66df\u66e0\u66e1\u66e2\u66e3\u66e4\u66e5\u66e6\u66e7\u66e8\u66e9\u66ea\u66eb\u66ec\u66ed\u66ee\u66ef\u66f0\u66f1\u66f2\u66f3\u66f4\u66f5\u66f6\u66f7\u66f8\u66f9\u66fa\u66fb\u66fc\u66fd\u66fe\u66ff\u6700\u6701\u6702\u6703\u6704\u6705\u6706\u6707\u6708\u6709\u670a\u670b\u670c\u670d\u670e\u670f\u6710\u6711\u6712\u6713\u6714\u6715\u6716\u6717\u6718\u6719\u671a\u671b\u671c\u671d\u671e\u671f\u6720\u6721\u6722\u6723\u6724\u6725\u6726\u6727\u6728\u6729\u672a\u672b\u672c\u672d\u672e\u672f\u6730\u6731\u6732\u6733\u6734\u6735\u6736\u6737\u6738\u6739\u673a\u673b\u673c\u673d\u673e\u673f\u6740\u6741\u6742\u6743\u6744\u6745\u6746\u6747\u6748\u6749\u674a\u674b\u674c\u674d\u674e\u674f\u6750\u6751\u6752\u6753\u6754\u6755\u6756\u6757\u6758\u6759\u675a\u675b\u675c\u675d\u675e\u675f\u6760\u6761\u6762\u6763\u6764\u6765\u6766\u6767\u6768\u6769\u676a\u676b\u676c\u676d\u676e\u676f\u6770\u6771\u6772\u6773\u6774\u6775\u6776\u6777\u6778\u6779\u677a\u677b\u677c\u677d\u677e\u677f\u6780\u6781\u6782\u6783\u6784\u6785\u6786\u6787\u6788\u6789\u678a\u678b\u678c\u678d\u678e\u678f\u6790\u6791\u6792\u6793\u6794\u6795\u6796\u6797\u6798\u6799\u679a\u679b\u679c\u679d\u679e\u679f\u67a0\u67a1\u67a2\u67a3\u67a4\u67a5\u67a6\u67a7\u67a8\u67a9\u67aa\u67ab\u67ac\u67ad\u67ae\u67af\u67b0\u67b1\u67b2\u67b3\u67b4\u67b5\u67b6\u67b7\u67b8\u67b9\u67ba\u67bb\u67bc\u67bd\u67be\u67bf\u67c0\u67c1\u67c2\u67c3\u67c4\u67c5\u67c6\u67c7\u67c8\u67c9\u67ca\u67cb\u67cc\u67cd\u67ce\u67cf\u67d0\u67d1\u67d2\u67d3\u67d4\u67d5\u67d6\u67d7\u67d8\u67d9\u67da\u67db\u67dc\u67dd\u67de\u67df\u67e0\u67e1\u67e2\u67e3\u67e4\u67e5\u67e6\u67e7\u67e8\u67e9\u67ea\u67eb\u67ec\u67ed\u67ee\u67ef\u67f0\u67f1\u67f2\u67f3\u67f4\u67f5\u67f6\u67f7\u67f8\u67f9\u67fa\u67fb\u67fc\u67fd\u67fe\u67ff\u6800\u6801\u6802\u6803\u6804\u6805\u6806\u6807\u6808\u6809\u680a\u680b\u680c\u680d\u680e\u680f\u6810\u6811\u6812\u6813\u6814\u6815\u6816\u6817\u6818\u6819\u681a\u681b\u681c\u681d\u681e\u681f\u6820\u6821\u6822\u6823\u6824\u6825\u6826\u6827\u6828\u6829\u682a\u682b\u682c\u682d\u682e\u682f\u6830\u6831\u6832\u6833\u6834\u6835\u6836\u6837\u6838\u6839\u683a\u683b\u683c\u683d\u683e\u683f\u6840\u6841\u6842\u6843\u6844\u6845\u6846\u6847\u6848\u6849\u684a\u684b\u684c\u684d\u684e\u684f\u6850\u6851\u6852\u6853\u6854\u6855\u6856\u6857\u6858\u6859\u685a\u685b\u685c\u685d\u685e\u685f\u6860\u6861\u6862\u6863\u6864\u6865\u6866\u6867\u6868\u6869\u686a\u686b\u686c\u686d\u686e\u686f\u6870\u6871\u6872\u6873\u6874\u6875\u6876\u6877\u6878\u6879\u687a\u687b\u687c\u687d\u687e\u687f\u6880\u6881\u6882\u6883\u6884\u6885\u6886\u6887\u6888\u6889\u688a\u688b\u688c\u688d\u688e\u688f\u6890\u6891\u6892\u6893\u6894\u6895\u6896\u6897\u6898\u6899\u689a\u689b\u689c\u689d\u689e\u689f\u68a0\u68a1\u68a2\u68a3\u68a4\u68a5\u68a6\u68a7\u68a8\u68a9\u68aa\u68ab\u68ac\u68ad\u68ae\u68af\u68b0\u68b1\u68b2\u68b3\u68b4\u68b5\u68b6\u68b7\u68b8\u68b9\u68ba\u68bb\u68bc\u68bd\u68be\u68bf\u68c0\u68c1\u68c2\u68c3\u68c4\u68c5\u68c6\u68c7\u68c8\u68c9\u68ca\u68cb\u68cc\u68cd\u68ce\u68cf\u68d0\u68d1\u68d2\u68d3\u68d4\u68d5\u68d6\u68d7\u68d8\u68d9\u68da\u68db\u68dc\u68dd\u68de\u68df\u68e0\u68e1\u68e2\u68e3\u68e4\u68e5\u68e6\u68e7\u68e8\u68e9\u68ea\u68eb\u68ec\u68ed\u68ee\u68ef\u68f0\u68f1\u68f2\u68f3\u68f4\u68f5\u68f6\u68f7\u68f8\u68f9\u68fa\u68fb\u68fc\u68fd\u68fe\u68ff\u6900\u6901\u6902\u6903\u6904\u6905\u6906\u6907\u6908\u6909\u690a\u690b\u690c\u690d\u690e\u690f\u6910\u6911\u6912\u6913\u6914\u6915\u6916\u6917\u6918\u6919\u691a\u691b\u691c\u691d\u691e\u691f\u6920\u6921\u6922\u6923\u6924\u6925\u6926\u6927\u6928\u6929\u692a\u692b\u692c\u692d\u692e\u692f\u6930\u6931\u6932\u6933\u6934\u6935\u6936\u6937\u6938\u6939\u693a\u693b\u693c\u693d\u693e\u693f\u6940\u6941\u6942\u6943\u6944\u6945\u6946\u6947\u6948\u6949\u694a\u694b\u694c\u694d\u694e\u694f\u6950\u6951\u6952\u6953\u6954\u6955\u6956\u6957\u6958\u6959\u695a\u695b\u695c\u695d\u695e\u695f\u6960\u6961\u6962\u6963\u6964\u6965\u6966\u6967\u6968\u6969\u696a\u696b\u696c\u696d\u696e\u696f\u6970\u6971\u6972\u6973\u6974\u6975\u6976\u6977\u6978\u6979\u697a\u697b\u697c\u697d\u697e\u697f\u6980\u6981\u6982\u6983\u6984\u6985\u6986\u6987\u6988\u6989\u698a\u698b\u698c\u698d\u698e\u698f\u6990\u6991\u6992\u6993\u6994\u6995\u6996\u6997\u6998\u6999\u699a\u699b\u699c\u699d\u699e\u699f\u69a0\u69a1\u69a2\u69a3\u69a4\u69a5\u69a6\u69a7\u69a8\u69a9\u69aa\u69ab\u69ac\u69ad\u69ae\u69af\u69b0\u69b1\u69b2\u69b3\u69b4\u69b5\u69b6\u69b7\u69b8\u69b9\u69ba\u69bb\u69bc\u69bd\u69be\u69bf\u69c0\u69c1\u69c2\u69c3\u69c4\u69c5\u69c6\u69c7\u69c8\u69c9\u69ca\u69cb\u69cc\u69cd\u69ce\u69cf\u69d0\u69d1\u69d2\u69d3\u69d4\u69d5\u69d6\u69d7\u69d8\u69d9\u69da\u69db\u69dc\u69dd\u69de\u69df\u69e0\u69e1\u69e2\u69e3\u69e4\u69e5\u69e6\u69e7\u69e8\u69e9\u69ea\u69eb\u69ec\u69ed\u69ee\u69ef\u69f0\u69f1\u69f2\u69f3\u69f4\u69f5\u69f6\u69f7\u69f8\u69f9\u69fa\u69fb\u69fc\u69fd\u69fe\u69ff\u6a00\u6a01\u6a02\u6a03\u6a04\u6a05\u6a06\u6a07\u6a08\u6a09\u6a0a\u6a0b\u6a0c\u6a0d\u6a0e\u6a0f\u6a10\u6a11\u6a12\u6a13\u6a14\u6a15\u6a16\u6a17\u6a18\u6a19\u6a1a\u6a1b\u6a1c\u6a1d\u6a1e\u6a1f\u6a20\u6a21\u6a22\u6a23\u6a24\u6a25\u6a26\u6a27\u6a28\u6a29\u6a2a\u6a2b\u6a2c\u6a2d\u6a2e\u6a2f\u6a30\u6a31\u6a32\u6a33\u6a34\u6a35\u6a36\u6a37\u6a38\u6a39\u6a3a\u6a3b\u6a3c\u6a3d\u6a3e\u6a3f\u6a40\u6a41\u6a42\u6a43\u6a44\u6a45\u6a46\u6a47\u6a48\u6a49\u6a4a\u6a4b\u6a4c\u6a4d\u6a4e\u6a4f\u6a50\u6a51\u6a52\u6a53\u6a54\u6a55\u6a56\u6a57\u6a58\u6a59\u6a5a\u6a5b\u6a5c\u6a5d\u6a5e\u6a5f\u6a60\u6a61\u6a62\u6a63\u6a64\u6a65\u6a66\u6a67\u6a68\u6a69\u6a6a\u6a6b\u6a6c\u6a6d\u6a6e\u6a6f\u6a70\u6a71\u6a72\u6a73\u6a74\u6a75\u6a76\u6a77\u6a78\u6a79\u6a7a\u6a7b\u6a7c\u6a7d\u6a7e\u6a7f\u6a80\u6a81\u6a82\u6a83\u6a84\u6a85\u6a86\u6a87\u6a88\u6a89\u6a8a\u6a8b\u6a8c\u6a8d\u6a8e\u6a8f\u6a90\u6a91\u6a92\u6a93\u6a94\u6a95\u6a96\u6a97\u6a98\u6a99\u6a9a\u6a9b\u6a9c\u6a9d\u6a9e\u6a9f\u6aa0\u6aa1\u6aa2\u6aa3\u6aa4\u6aa5\u6aa6\u6aa7\u6aa8\u6aa9\u6aaa\u6aab\u6aac\u6aad\u6aae\u6aaf\u6ab0\u6ab1\u6ab2\u6ab3\u6ab4\u6ab5\u6ab6\u6ab7\u6ab8\u6ab9\u6aba\u6abb\u6abc\u6abd\u6abe\u6abf\u6ac0\u6ac1\u6ac2\u6ac3\u6ac4\u6ac5\u6ac6\u6ac7\u6ac8\u6ac9\u6aca\u6acb\u6acc\u6acd\u6ace\u6acf\u6ad0\u6ad1\u6ad2\u6ad3\u6ad4\u6ad5\u6ad6\u6ad7\u6ad8\u6ad9\u6ada\u6adb\u6adc\u6add\u6ade\u6adf\u6ae0\u6ae1\u6ae2\u6ae3\u6ae4\u6ae5\u6ae6\u6ae7\u6ae8\u6ae9\u6aea\u6aeb\u6aec\u6aed\u6aee\u6aef\u6af0\u6af1\u6af2\u6af3\u6af4\u6af5\u6af6\u6af7\u6af8\u6af9\u6afa\u6afb\u6afc\u6afd\u6afe\u6aff\u6b00\u6b01\u6b02\u6b03\u6b04\u6b05\u6b06\u6b07\u6b08\u6b09\u6b0a\u6b0b\u6b0c\u6b0d\u6b0e\u6b0f\u6b10\u6b11\u6b12\u6b13\u6b14\u6b15\u6b16\u6b17\u6b18\u6b19\u6b1a\u6b1b\u6b1c\u6b1d\u6b1e\u6b1f\u6b20\u6b21\u6b22\u6b23\u6b24\u6b25\u6b26\u6b27\u6b28\u6b29\u6b2a\u6b2b\u6b2c\u6b2d\u6b2e\u6b2f\u6b30\u6b31\u6b32\u6b33\u6b34\u6b35\u6b36\u6b37\u6b38\u6b39\u6b3a\u6b3b\u6b3c\u6b3d\u6b3e\u6b3f\u6b40\u6b41\u6b42\u6b43\u6b44\u6b45\u6b46\u6b47\u6b48\u6b49\u6b4a\u6b4b\u6b4c\u6b4d\u6b4e\u6b4f\u6b50\u6b51\u6b52\u6b53\u6b54\u6b55\u6b56\u6b57\u6b58\u6b59\u6b5a\u6b5b\u6b5c\u6b5d\u6b5e\u6b5f\u6b60\u6b61\u6b62\u6b63\u6b64\u6b65\u6b66\u6b67\u6b68\u6b69\u6b6a\u6b6b\u6b6c\u6b6d\u6b6e\u6b6f\u6b70\u6b71\u6b72\u6b73\u6b74\u6b75\u6b76\u6b77\u6b78\u6b79\u6b7a\u6b7b\u6b7c\u6b7d\u6b7e\u6b7f\u6b80\u6b81\u6b82\u6b83\u6b84\u6b85\u6b86\u6b87\u6b88\u6b89\u6b8a\u6b8b\u6b8c\u6b8d\u6b8e\u6b8f\u6b90\u6b91\u6b92\u6b93\u6b94\u6b95\u6b96\u6b97\u6b98\u6b99\u6b9a\u6b9b\u6b9c\u6b9d\u6b9e\u6b9f\u6ba0\u6ba1\u6ba2\u6ba3\u6ba4\u6ba5\u6ba6\u6ba7\u6ba8\u6ba9\u6baa\u6bab\u6bac\u6bad\u6bae\u6baf\u6bb0\u6bb1\u6bb2\u6bb3\u6bb4\u6bb5\u6bb6\u6bb7\u6bb8\u6bb9\u6bba\u6bbb\u6bbc\u6bbd\u6bbe\u6bbf\u6bc0\u6bc1\u6bc2\u6bc3\u6bc4\u6bc5\u6bc6\u6bc7\u6bc8\u6bc9\u6bca\u6bcb\u6bcc\u6bcd\u6bce\u6bcf\u6bd0\u6bd1\u6bd2\u6bd3\u6bd4\u6bd5\u6bd6\u6bd7\u6bd8\u6bd9\u6bda\u6bdb\u6bdc\u6bdd\u6bde\u6bdf\u6be0\u6be1\u6be2\u6be3\u6be4\u6be5\u6be6\u6be7\u6be8\u6be9\u6bea\u6beb\u6bec\u6bed\u6bee\u6bef\u6bf0\u6bf1\u6bf2\u6bf3\u6bf4\u6bf5\u6bf6\u6bf7\u6bf8\u6bf9\u6bfa\u6bfb\u6bfc\u6bfd\u6bfe\u6bff\u6c00\u6c01\u6c02\u6c03\u6c04\u6c05\u6c06\u6c07\u6c08\u6c09\u6c0a\u6c0b\u6c0c\u6c0d\u6c0e\u6c0f\u6c10\u6c11\u6c12\u6c13\u6c14\u6c15\u6c16\u6c17\u6c18\u6c19\u6c1a\u6c1b\u6c1c\u6c1d\u6c1e\u6c1f\u6c20\u6c21\u6c22\u6c23\u6c24\u6c25\u6c26\u6c27\u6c28\u6c29\u6c2a\u6c2b\u6c2c\u6c2d\u6c2e\u6c2f\u6c30\u6c31\u6c32\u6c33\u6c34\u6c35\u6c36\u6c37\u6c38\u6c39\u6c3a\u6c3b\u6c3c\u6c3d\u6c3e\u6c3f\u6c40\u6c41\u6c42\u6c43\u6c44\u6c45\u6c46\u6c47\u6c48\u6c49\u6c4a\u6c4b\u6c4c\u6c4d\u6c4e\u6c4f\u6c50\u6c51\u6c52\u6c53\u6c54\u6c55\u6c56\u6c57\u6c58\u6c59\u6c5a\u6c5b\u6c5c\u6c5d\u6c5e\u6c5f\u6c60\u6c61\u6c62\u6c63\u6c64\u6c65\u6c66\u6c67\u6c68\u6c69\u6c6a\u6c6b\u6c6c\u6c6d\u6c6e\u6c6f\u6c70\u6c71\u6c72\u6c73\u6c74\u6c75\u6c76\u6c77\u6c78\u6c79\u6c7a\u6c7b\u6c7c\u6c7d\u6c7e\u6c7f\u6c80\u6c81\u6c82\u6c83\u6c84\u6c85\u6c86\u6c87\u6c88\u6c89\u6c8a\u6c8b\u6c8c\u6c8d\u6c8e\u6c8f\u6c90\u6c91\u6c92\u6c93\u6c94\u6c95\u6c96\u6c97\u6c98\u6c99\u6c9a\u6c9b\u6c9c\u6c9d\u6c9e\u6c9f\u6ca0\u6ca1\u6ca2\u6ca3\u6ca4\u6ca5\u6ca6\u6ca7\u6ca8\u6ca9\u6caa\u6cab\u6cac\u6cad\u6cae\u6caf\u6cb0\u6cb1\u6cb2\u6cb3\u6cb4\u6cb5\u6cb6\u6cb7\u6cb8\u6cb9\u6cba\u6cbb\u6cbc\u6cbd\u6cbe\u6cbf\u6cc0\u6cc1\u6cc2\u6cc3\u6cc4\u6cc5\u6cc6\u6cc7\u6cc8\u6cc9\u6cca\u6ccb\u6ccc\u6ccd\u6cce\u6ccf\u6cd0\u6cd1\u6cd2\u6cd3\u6cd4\u6cd5\u6cd6\u6cd7\u6cd8\u6cd9\u6cda\u6cdb\u6cdc\u6cdd\u6cde\u6cdf\u6ce0\u6ce1\u6ce2\u6ce3\u6ce4\u6ce5\u6ce6\u6ce7\u6ce8\u6ce9\u6cea\u6ceb\u6cec\u6ced\u6cee\u6cef\u6cf0\u6cf1\u6cf2\u6cf3\u6cf4\u6cf5\u6cf6\u6cf7\u6cf8\u6cf9\u6cfa\u6cfb\u6cfc\u6cfd\u6cfe\u6cff\u6d00\u6d01\u6d02\u6d03\u6d04\u6d05\u6d06\u6d07\u6d08\u6d09\u6d0a\u6d0b\u6d0c\u6d0d\u6d0e\u6d0f\u6d10\u6d11\u6d12\u6d13\u6d14\u6d15\u6d16\u6d17\u6d18\u6d19\u6d1a\u6d1b\u6d1c\u6d1d\u6d1e\u6d1f\u6d20\u6d21\u6d22\u6d23\u6d24\u6d25\u6d26\u6d27\u6d28\u6d29\u6d2a\u6d2b\u6d2c\u6d2d\u6d2e\u6d2f\u6d30\u6d31\u6d32\u6d33\u6d34\u6d35\u6d36\u6d37\u6d38\u6d39\u6d3a\u6d3b\u6d3c\u6d3d\u6d3e\u6d3f\u6d40\u6d41\u6d42\u6d43\u6d44\u6d45\u6d46\u6d47\u6d48\u6d49\u6d4a\u6d4b\u6d4c\u6d4d\u6d4e\u6d4f\u6d50\u6d51\u6d52\u6d53\u6d54\u6d55\u6d56\u6d57\u6d58\u6d59\u6d5a\u6d5b\u6d5c\u6d5d\u6d5e\u6d5f\u6d60\u6d61\u6d62\u6d63\u6d64\u6d65\u6d66\u6d67\u6d68\u6d69\u6d6a\u6d6b\u6d6c\u6d6d\u6d6e\u6d6f\u6d70\u6d71\u6d72\u6d73\u6d74\u6d75\u6d76\u6d77\u6d78\u6d79\u6d7a\u6d7b\u6d7c\u6d7d\u6d7e\u6d7f\u6d80\u6d81\u6d82\u6d83\u6d84\u6d85\u6d86\u6d87\u6d88\u6d89\u6d8a\u6d8b\u6d8c\u6d8d\u6d8e\u6d8f\u6d90\u6d91\u6d92\u6d93\u6d94\u6d95\u6d96\u6d97\u6d98\u6d99\u6d9a\u6d9b\u6d9c\u6d9d\u6d9e\u6d9f\u6da0\u6da1\u6da2\u6da3\u6da4\u6da5\u6da6\u6da7\u6da8\u6da9\u6daa\u6dab\u6dac\u6dad\u6dae\u6daf\u6db0\u6db1\u6db2\u6db3\u6db4\u6db5\u6db6\u6db7\u6db8\u6db9\u6dba\u6dbb\u6dbc\u6dbd\u6dbe\u6dbf\u6dc0\u6dc1\u6dc2\u6dc3\u6dc4\u6dc5\u6dc6\u6dc7\u6dc8\u6dc9\u6dca\u6dcb\u6dcc\u6dcd\u6dce\u6dcf\u6dd0\u6dd1\u6dd2\u6dd3\u6dd4\u6dd5\u6dd6\u6dd7\u6dd8\u6dd9\u6dda\u6ddb\u6ddc\u6ddd\u6dde\u6ddf\u6de0\u6de1\u6de2\u6de3\u6de4\u6de5\u6de6\u6de7\u6de8\u6de9\u6dea\u6deb\u6dec\u6ded\u6dee\u6def\u6df0\u6df1\u6df2\u6df3\u6df4\u6df5\u6df6\u6df7\u6df8\u6df9\u6dfa\u6dfb\u6dfc\u6dfd\u6dfe\u6dff\u6e00\u6e01\u6e02\u6e03\u6e04\u6e05\u6e06\u6e07\u6e08\u6e09\u6e0a\u6e0b\u6e0c\u6e0d\u6e0e\u6e0f\u6e10\u6e11\u6e12\u6e13\u6e14\u6e15\u6e16\u6e17\u6e18\u6e19\u6e1a\u6e1b\u6e1c\u6e1d\u6e1e\u6e1f\u6e20\u6e21\u6e22\u6e23\u6e24\u6e25\u6e26\u6e27\u6e28\u6e29\u6e2a\u6e2b\u6e2c\u6e2d\u6e2e\u6e2f\u6e30\u6e31\u6e32\u6e33\u6e34\u6e35\u6e36\u6e37\u6e38\u6e39\u6e3a\u6e3b\u6e3c\u6e3d\u6e3e\u6e3f\u6e40\u6e41\u6e42\u6e43\u6e44\u6e45\u6e46\u6e47\u6e48\u6e49\u6e4a\u6e4b\u6e4c\u6e4d\u6e4e\u6e4f\u6e50\u6e51\u6e52\u6e53\u6e54\u6e55\u6e56\u6e57\u6e58\u6e59\u6e5a\u6e5b\u6e5c\u6e5d\u6e5e\u6e5f\u6e60\u6e61\u6e62\u6e63\u6e64\u6e65\u6e66\u6e67\u6e68\u6e69\u6e6a\u6e6b\u6e6c\u6e6d\u6e6e\u6e6f\u6e70\u6e71\u6e72\u6e73\u6e74\u6e75\u6e76\u6e77\u6e78\u6e79\u6e7a\u6e7b\u6e7c\u6e7d\u6e7e\u6e7f\u6e80\u6e81\u6e82\u6e83\u6e84\u6e85\u6e86\u6e87\u6e88\u6e89\u6e8a\u6e8b\u6e8c\u6e8d\u6e8e\u6e8f\u6e90\u6e91\u6e92\u6e93\u6e94\u6e95\u6e96\u6e97\u6e98\u6e99\u6e9a\u6e9b\u6e9c\u6e9d\u6e9e\u6e9f\u6ea0\u6ea1\u6ea2\u6ea3\u6ea4\u6ea5\u6ea6\u6ea7\u6ea8\u6ea9\u6eaa\u6eab\u6eac\u6ead\u6eae\u6eaf\u6eb0\u6eb1\u6eb2\u6eb3\u6eb4\u6eb5\u6eb6\u6eb7\u6eb8\u6eb9\u6eba\u6ebb\u6ebc\u6ebd\u6ebe\u6ebf\u6ec0\u6ec1\u6ec2\u6ec3\u6ec4\u6ec5\u6ec6\u6ec7\u6ec8\u6ec9\u6eca\u6ecb\u6ecc\u6ecd\u6ece\u6ecf\u6ed0\u6ed1\u6ed2\u6ed3\u6ed4\u6ed5\u6ed6\u6ed7\u6ed8\u6ed9\u6eda\u6edb\u6edc\u6edd\u6ede\u6edf\u6ee0\u6ee1\u6ee2\u6ee3\u6ee4\u6ee5\u6ee6\u6ee7\u6ee8\u6ee9\u6eea\u6eeb\u6eec\u6eed\u6eee\u6eef\u6ef0\u6ef1\u6ef2\u6ef3\u6ef4\u6ef5\u6ef6\u6ef7\u6ef8\u6ef9\u6efa\u6efb\u6efc\u6efd\u6efe\u6eff\u6f00\u6f01\u6f02\u6f03\u6f04\u6f05\u6f06\u6f07\u6f08\u6f09\u6f0a\u6f0b\u6f0c\u6f0d\u6f0e\u6f0f\u6f10\u6f11\u6f12\u6f13\u6f14\u6f15\u6f16\u6f17\u6f18\u6f19\u6f1a\u6f1b\u6f1c\u6f1d\u6f1e\u6f1f\u6f20\u6f21\u6f22\u6f23\u6f24\u6f25\u6f26\u6f27\u6f28\u6f29\u6f2a\u6f2b\u6f2c\u6f2d\u6f2e\u6f2f\u6f30\u6f31\u6f32\u6f33\u6f34\u6f35\u6f36\u6f37\u6f38\u6f39\u6f3a\u6f3b\u6f3c\u6f3d\u6f3e\u6f3f\u6f40\u6f41\u6f42\u6f43\u6f44\u6f45\u6f46\u6f47\u6f48\u6f49\u6f4a\u6f4b\u6f4c\u6f4d\u6f4e\u6f4f\u6f50\u6f51\u6f52\u6f53\u6f54\u6f55\u6f56\u6f57\u6f58\u6f59\u6f5a\u6f5b\u6f5c\u6f5d\u6f5e\u6f5f\u6f60\u6f61\u6f62\u6f63\u6f64\u6f65\u6f66\u6f67\u6f68\u6f69\u6f6a\u6f6b\u6f6c\u6f6d\u6f6e\u6f6f\u6f70\u6f71\u6f72\u6f73\u6f74\u6f75\u6f76\u6f77\u6f78\u6f79\u6f7a\u6f7b\u6f7c\u6f7d\u6f7e\u6f7f\u6f80\u6f81\u6f82\u6f83\u6f84\u6f85\u6f86\u6f87\u6f88\u6f89\u6f8a\u6f8b\u6f8c\u6f8d\u6f8e\u6f8f\u6f90\u6f91\u6f92\u6f93\u6f94\u6f95\u6f96\u6f97\u6f98\u6f99\u6f9a\u6f9b\u6f9c\u6f9d\u6f9e\u6f9f\u6fa0\u6fa1\u6fa2\u6fa3\u6fa4\u6fa5\u6fa6\u6fa7\u6fa8\u6fa9\u6faa\u6fab\u6fac\u6fad\u6fae\u6faf\u6fb0\u6fb1\u6fb2\u6fb3\u6fb4\u6fb5\u6fb6\u6fb7\u6fb8\u6fb9\u6fba\u6fbb\u6fbc\u6fbd\u6fbe\u6fbf\u6fc0\u6fc1\u6fc2\u6fc3\u6fc4\u6fc5\u6fc6\u6fc7\u6fc8\u6fc9\u6fca\u6fcb\u6fcc\u6fcd\u6fce\u6fcf\u6fd0\u6fd1\u6fd2\u6fd3\u6fd4\u6fd5\u6fd6\u6fd7\u6fd8\u6fd9\u6fda\u6fdb\u6fdc\u6fdd\u6fde\u6fdf\u6fe0\u6fe1\u6fe2\u6fe3\u6fe4\u6fe5\u6fe6\u6fe7\u6fe8\u6fe9\u6fea\u6feb\u6fec\u6fed\u6fee\u6fef\u6ff0\u6ff1\u6ff2\u6ff3\u6ff4\u6ff5\u6ff6\u6ff7\u6ff8\u6ff9\u6ffa\u6ffb\u6ffc\u6ffd\u6ffe\u6fff\u7000\u7001\u7002\u7003\u7004\u7005\u7006\u7007\u7008\u7009\u700a\u700b\u700c\u700d\u700e\u700f\u7010\u7011\u7012\u7013\u7014\u7015\u7016\u7017\u7018\u7019\u701a\u701b\u701c\u701d\u701e\u701f\u7020\u7021\u7022\u7023\u7024\u7025\u7026\u7027\u7028\u7029\u702a\u702b\u702c\u702d\u702e\u702f\u7030\u7031\u7032\u7033\u7034\u7035\u7036\u7037\u7038\u7039\u703a\u703b\u703c\u703d\u703e\u703f\u7040\u7041\u7042\u7043\u7044\u7045\u7046\u7047\u7048\u7049\u704a\u704b\u704c\u704d\u704e\u704f\u7050\u7051\u7052\u7053\u7054\u7055\u7056\u7057\u7058\u7059\u705a\u705b\u705c\u705d\u705e\u705f\u7060\u7061\u7062\u7063\u7064\u7065\u7066\u7067\u7068\u7069\u706a\u706b\u706c\u706d\u706e\u706f\u7070\u7071\u7072\u7073\u7074\u7075\u7076\u7077\u7078\u7079\u707a\u707b\u707c\u707d\u707e\u707f\u7080\u7081\u7082\u7083\u7084\u7085\u7086\u7087\u7088\u7089\u708a\u708b\u708c\u708d\u708e\u708f\u7090\u7091\u7092\u7093\u7094\u7095\u7096\u7097\u7098\u7099\u709a\u709b\u709c\u709d\u709e\u709f\u70a0\u70a1\u70a2\u70a3\u70a4\u70a5\u70a6\u70a7\u70a8\u70a9\u70aa\u70ab\u70ac\u70ad\u70ae\u70af\u70b0\u70b1\u70b2\u70b3\u70b4\u70b5\u70b6\u70b7\u70b8\u70b9\u70ba\u70bb\u70bc\u70bd\u70be\u70bf\u70c0\u70c1\u70c2\u70c3\u70c4\u70c5\u70c6\u70c7\u70c8\u70c9\u70ca\u70cb\u70cc\u70cd\u70ce\u70cf\u70d0\u70d1\u70d2\u70d3\u70d4\u70d5\u70d6\u70d7\u70d8\u70d9\u70da\u70db\u70dc\u70dd\u70de\u70df\u70e0\u70e1\u70e2\u70e3\u70e4\u70e5\u70e6\u70e7\u70e8\u70e9\u70ea\u70eb\u70ec\u70ed\u70ee\u70ef\u70f0\u70f1\u70f2\u70f3\u70f4\u70f5\u70f6\u70f7\u70f8\u70f9\u70fa\u70fb\u70fc\u70fd\u70fe\u70ff\u7100\u7101\u7102\u7103\u7104\u7105\u7106\u7107\u7108\u7109\u710a\u710b\u710c\u710d\u710e\u710f\u7110\u7111\u7112\u7113\u7114\u7115\u7116\u7117\u7118\u7119\u711a\u711b\u711c\u711d\u711e\u711f\u7120\u7121\u7122\u7123\u7124\u7125\u7126\u7127\u7128\u7129\u712a\u712b\u712c\u712d\u712e\u712f\u7130\u7131\u7132\u7133\u7134\u7135\u7136\u7137\u7138\u7139\u713a\u713b\u713c\u713d\u713e\u713f\u7140\u7141\u7142\u7143\u7144\u7145\u7146\u7147\u7148\u7149\u714a\u714b\u714c\u714d\u714e\u714f\u7150\u7151\u7152\u7153\u7154\u7155\u7156\u7157\u7158\u7159\u715a\u715b\u715c\u715d\u715e\u715f\u7160\u7161\u7162\u7163\u7164\u7165\u7166\u7167\u7168\u7169\u716a\u716b\u716c\u716d\u716e\u716f\u7170\u7171\u7172\u7173\u7174\u7175\u7176\u7177\u7178\u7179\u717a\u717b\u717c\u717d\u717e\u717f\u7180\u7181\u7182\u7183\u7184\u7185\u7186\u7187\u7188\u7189\u718a\u718b\u718c\u718d\u718e\u718f\u7190\u7191\u7192\u7193\u7194\u7195\u7196\u7197\u7198\u7199\u719a\u719b\u719c\u719d\u719e\u719f\u71a0\u71a1\u71a2\u71a3\u71a4\u71a5\u71a6\u71a7\u71a8\u71a9\u71aa\u71ab\u71ac\u71ad\u71ae\u71af\u71b0\u71b1\u71b2\u71b3\u71b4\u71b5\u71b6\u71b7\u71b8\u71b9\u71ba\u71bb\u71bc\u71bd\u71be\u71bf\u71c0\u71c1\u71c2\u71c3\u71c4\u71c5\u71c6\u71c7\u71c8\u71c9\u71ca\u71cb\u71cc\u71cd\u71ce\u71cf\u71d0\u71d1\u71d2\u71d3\u71d4\u71d5\u71d6\u71d7\u71d8\u71d9\u71da\u71db\u71dc\u71dd\u71de\u71df\u71e0\u71e1\u71e2\u71e3\u71e4\u71e5\u71e6\u71e7\u71e8\u71e9\u71ea\u71eb\u71ec\u71ed\u71ee\u71ef\u71f0\u71f1\u71f2\u71f3\u71f4\u71f5\u71f6\u71f7\u71f8\u71f9\u71fa\u71fb\u71fc\u71fd\u71fe\u71ff\u7200\u7201\u7202\u7203\u7204\u7205\u7206\u7207\u7208\u7209\u720a\u720b\u720c\u720d\u720e\u720f\u7210\u7211\u7212\u7213\u7214\u7215\u7216\u7217\u7218\u7219\u721a\u721b\u721c\u721d\u721e\u721f\u7220\u7221\u7222\u7223\u7224\u7225\u7226\u7227\u7228\u7229\u722a\u722b\u722c\u722d\u722e\u722f\u7230\u7231\u7232\u7233\u7234\u7235\u7236\u7237\u7238\u7239\u723a\u723b\u723c\u723d\u723e\u723f\u7240\u7241\u7242\u7243\u7244\u7245\u7246\u7247\u7248\u7249\u724a\u724b\u724c\u724d\u724e\u724f\u7250\u7251\u7252\u7253\u7254\u7255\u7256\u7257\u7258\u7259\u725a\u725b\u725c\u725d\u725e\u725f\u7260\u7261\u7262\u7263\u7264\u7265\u7266\u7267\u7268\u7269\u726a\u726b\u726c\u726d\u726e\u726f\u7270\u7271\u7272\u7273\u7274\u7275\u7276\u7277\u7278\u7279\u727a\u727b\u727c\u727d\u727e\u727f\u7280\u7281\u7282\u7283\u7284\u7285\u7286\u7287\u7288\u7289\u728a\u728b\u728c\u728d\u728e\u728f\u7290\u7291\u7292\u7293\u7294\u7295\u7296\u7297\u7298\u7299\u729a\u729b\u729c\u729d\u729e\u729f\u72a0\u72a1\u72a2\u72a3\u72a4\u72a5\u72a6\u72a7\u72a8\u72a9\u72aa\u72ab\u72ac\u72ad\u72ae\u72af\u72b0\u72b1\u72b2\u72b3\u72b4\u72b5\u72b6\u72b7\u72b8\u72b9\u72ba\u72bb\u72bc\u72bd\u72be\u72bf\u72c0\u72c1\u72c2\u72c3\u72c4\u72c5\u72c6\u72c7\u72c8\u72c9\u72ca\u72cb\u72cc\u72cd\u72ce\u72cf\u72d0\u72d1\u72d2\u72d3\u72d4\u72d5\u72d6\u72d7\u72d8\u72d9\u72da\u72db\u72dc\u72dd\u72de\u72df\u72e0\u72e1\u72e2\u72e3\u72e4\u72e5\u72e6\u72e7\u72e8\u72e9\u72ea\u72eb\u72ec\u72ed\u72ee\u72ef\u72f0\u72f1\u72f2\u72f3\u72f4\u72f5\u72f6\u72f7\u72f8\u72f9\u72fa\u72fb\u72fc\u72fd\u72fe\u72ff\u7300\u7301\u7302\u7303\u7304\u7305\u7306\u7307\u7308\u7309\u730a\u730b\u730c\u730d\u730e\u730f\u7310\u7311\u7312\u7313\u7314\u7315\u7316\u7317\u7318\u7319\u731a\u731b\u731c\u731d\u731e\u731f\u7320\u7321\u7322\u7323\u7324\u7325\u7326\u7327\u7328\u7329\u732a\u732b\u732c\u732d\u732e\u732f\u7330\u7331\u7332\u7333\u7334\u7335\u7336\u7337\u7338\u7339\u733a\u733b\u733c\u733d\u733e\u733f\u7340\u7341\u7342\u7343\u7344\u7345\u7346\u7347\u7348\u7349\u734a\u734b\u734c\u734d\u734e\u734f\u7350\u7351\u7352\u7353\u7354\u7355\u7356\u7357\u7358\u7359\u735a\u735b\u735c\u735d\u735e\u735f\u7360\u7361\u7362\u7363\u7364\u7365\u7366\u7367\u7368\u7369\u736a\u736b\u736c\u736d\u736e\u736f\u7370\u7371\u7372\u7373\u7374\u7375\u7376\u7377\u7378\u7379\u737a\u737b\u737c\u737d\u737e\u737f\u7380\u7381\u7382\u7383\u7384\u7385\u7386\u7387\u7388\u7389\u738a\u738b\u738c\u738d\u738e\u738f\u7390\u7391\u7392\u7393\u7394\u7395\u7396\u7397\u7398\u7399\u739a\u739b\u739c\u739d\u739e\u739f\u73a0\u73a1\u73a2\u73a3\u73a4\u73a5\u73a6\u73a7\u73a8\u73a9\u73aa\u73ab\u73ac\u73ad\u73ae\u73af\u73b0\u73b1\u73b2\u73b3\u73b4\u73b5\u73b6\u73b7\u73b8\u73b9\u73ba\u73bb\u73bc\u73bd\u73be\u73bf\u73c0\u73c1\u73c2\u73c3\u73c4\u73c5\u73c6\u73c7\u73c8\u73c9\u73ca\u73cb\u73cc\u73cd\u73ce\u73cf\u73d0\u73d1\u73d2\u73d3\u73d4\u73d5\u73d6\u73d7\u73d8\u73d9\u73da\u73db\u73dc\u73dd\u73de\u73df\u73e0\u73e1\u73e2\u73e3\u73e4\u73e5\u73e6\u73e7\u73e8\u73e9\u73ea\u73eb\u73ec\u73ed\u73ee\u73ef\u73f0\u73f1\u73f2\u73f3\u73f4\u73f5\u73f6\u73f7\u73f8\u73f9\u73fa\u73fb\u73fc\u73fd\u73fe\u73ff\u7400\u7401\u7402\u7403\u7404\u7405\u7406\u7407\u7408\u7409\u740a\u740b\u740c\u740d\u740e\u740f\u7410\u7411\u7412\u7413\u7414\u7415\u7416\u7417\u7418\u7419\u741a\u741b\u741c\u741d\u741e\u741f\u7420\u7421\u7422\u7423\u7424\u7425\u7426\u7427\u7428\u7429\u742a\u742b\u742c\u742d\u742e\u742f\u7430\u7431\u7432\u7433\u7434\u7435\u7436\u7437\u7438\u7439\u743a\u743b\u743c\u743d\u743e\u743f\u7440\u7441\u7442\u7443\u7444\u7445\u7446\u7447\u7448\u7449\u744a\u744b\u744c\u744d\u744e\u744f\u7450\u7451\u7452\u7453\u7454\u7455\u7456\u7457\u7458\u7459\u745a\u745b\u745c\u745d\u745e\u745f\u7460\u7461\u7462\u7463\u7464\u7465\u7466\u7467\u7468\u7469\u746a\u746b\u746c\u746d\u746e\u746f\u7470\u7471\u7472\u7473\u7474\u7475\u7476\u7477\u7478\u7479\u747a\u747b\u747c\u747d\u747e\u747f\u7480\u7481\u7482\u7483\u7484\u7485\u7486\u7487\u7488\u7489\u748a\u748b\u748c\u748d\u748e\u748f\u7490\u7491\u7492\u7493\u7494\u7495\u7496\u7497\u7498\u7499\u749a\u749b\u749c\u749d\u749e\u749f\u74a0\u74a1\u74a2\u74a3\u74a4\u74a5\u74a6\u74a7\u74a8\u74a9\u74aa\u74ab\u74ac\u74ad\u74ae\u74af\u74b0\u74b1\u74b2\u74b3\u74b4\u74b5\u74b6\u74b7\u74b8\u74b9\u74ba\u74bb\u74bc\u74bd\u74be\u74bf\u74c0\u74c1\u74c2\u74c3\u74c4\u74c5\u74c6\u74c7\u74c8\u74c9\u74ca\u74cb\u74cc\u74cd\u74ce\u74cf\u74d0\u74d1\u74d2\u74d3\u74d4\u74d5\u74d6\u74d7\u74d8\u74d9\u74da\u74db\u74dc\u74dd\u74de\u74df\u74e0\u74e1\u74e2\u74e3\u74e4\u74e5\u74e6\u74e7\u74e8\u74e9\u74ea\u74eb\u74ec\u74ed\u74ee\u74ef\u74f0\u74f1\u74f2\u74f3\u74f4\u74f5\u74f6\u74f7\u74f8\u74f9\u74fa\u74fb\u74fc\u74fd\u74fe\u74ff\u7500\u7501\u7502\u7503\u7504\u7505\u7506\u7507\u7508\u7509\u750a\u750b\u750c\u750d\u750e\u750f\u7510\u7511\u7512\u7513\u7514\u7515\u7516\u7517\u7518\u7519\u751a\u751b\u751c\u751d\u751e\u751f\u7520\u7521\u7522\u7523\u7524\u7525\u7526\u7527\u7528\u7529\u752a\u752b\u752c\u752d\u752e\u752f\u7530\u7531\u7532\u7533\u7534\u7535\u7536\u7537\u7538\u7539\u753a\u753b\u753c\u753d\u753e\u753f\u7540\u7541\u7542\u7543\u7544\u7545\u7546\u7547\u7548\u7549\u754a\u754b\u754c\u754d\u754e\u754f\u7550\u7551\u7552\u7553\u7554\u7555\u7556\u7557\u7558\u7559\u755a\u755b\u755c\u755d\u755e\u755f\u7560\u7561\u7562\u7563\u7564\u7565\u7566\u7567\u7568\u7569\u756a\u756b\u756c\u756d\u756e\u756f\u7570\u7571\u7572\u7573\u7574\u7575\u7576\u7577\u7578\u7579\u757a\u757b\u757c\u757d\u757e\u757f\u7580\u7581\u7582\u7583\u7584\u7585\u7586\u7587\u7588\u7589\u758a\u758b\u758c\u758d\u758e\u758f\u7590\u7591\u7592\u7593\u7594\u7595\u7596\u7597\u7598\u7599\u759a\u759b\u759c\u759d\u759e\u759f\u75a0\u75a1\u75a2\u75a3\u75a4\u75a5\u75a6\u75a7\u75a8\u75a9\u75aa\u75ab\u75ac\u75ad\u75ae\u75af\u75b0\u75b1\u75b2\u75b3\u75b4\u75b5\u75b6\u75b7\u75b8\u75b9\u75ba\u75bb\u75bc\u75bd\u75be\u75bf\u75c0\u75c1\u75c2\u75c3\u75c4\u75c5\u75c6\u75c7\u75c8\u75c9\u75ca\u75cb\u75cc\u75cd\u75ce\u75cf\u75d0\u75d1\u75d2\u75d3\u75d4\u75d5\u75d6\u75d7\u75d8\u75d9\u75da\u75db\u75dc\u75dd\u75de\u75df\u75e0\u75e1\u75e2\u75e3\u75e4\u75e5\u75e6\u75e7\u75e8\u75e9\u75ea\u75eb\u75ec\u75ed\u75ee\u75ef\u75f0\u75f1\u75f2\u75f3\u75f4\u75f5\u75f6\u75f7\u75f8\u75f9\u75fa\u75fb\u75fc\u75fd\u75fe\u75ff\u7600\u7601\u7602\u7603\u7604\u7605\u7606\u7607\u7608\u7609\u760a\u760b\u760c\u760d\u760e\u760f\u7610\u7611\u7612\u7613\u7614\u7615\u7616\u7617\u7618\u7619\u761a\u761b\u761c\u761d\u761e\u761f\u7620\u7621\u7622\u7623\u7624\u7625\u7626\u7627\u7628\u7629\u762a\u762b\u762c\u762d\u762e\u762f\u7630\u7631\u7632\u7633\u7634\u7635\u7636\u7637\u7638\u7639\u763a\u763b\u763c\u763d\u763e\u763f\u7640\u7641\u7642\u7643\u7644\u7645\u7646\u7647\u7648\u7649\u764a\u764b\u764c\u764d\u764e\u764f\u7650\u7651\u7652\u7653\u7654\u7655\u7656\u7657\u7658\u7659\u765a\u765b\u765c\u765d\u765e\u765f\u7660\u7661\u7662\u7663\u7664\u7665\u7666\u7667\u7668\u7669\u766a\u766b\u766c\u766d\u766e\u766f\u7670\u7671\u7672\u7673\u7674\u7675\u7676\u7677\u7678\u7679\u767a\u767b\u767c\u767d\u767e\u767f\u7680\u7681\u7682\u7683\u7684\u7685\u7686\u7687\u7688\u7689\u768a\u768b\u768c\u768d\u768e\u768f\u7690\u7691\u7692\u7693\u7694\u7695\u7696\u7697\u7698\u7699\u769a\u769b\u769c\u769d\u769e\u769f\u76a0\u76a1\u76a2\u76a3\u76a4\u76a5\u76a6\u76a7\u76a8\u76a9\u76aa\u76ab\u76ac\u76ad\u76ae\u76af\u76b0\u76b1\u76b2\u76b3\u76b4\u76b5\u76b6\u76b7\u76b8\u76b9\u76ba\u76bb\u76bc\u76bd\u76be\u76bf\u76c0\u76c1\u76c2\u76c3\u76c4\u76c5\u76c6\u76c7\u76c8\u76c9\u76ca\u76cb\u76cc\u76cd\u76ce\u76cf\u76d0\u76d1\u76d2\u76d3\u76d4\u76d5\u76d6\u76d7\u76d8\u76d9\u76da\u76db\u76dc\u76dd\u76de\u76df\u76e0\u76e1\u76e2\u76e3\u76e4\u76e5\u76e6\u76e7\u76e8\u76e9\u76ea\u76eb\u76ec\u76ed\u76ee\u76ef\u76f0\u76f1\u76f2\u76f3\u76f4\u76f5\u76f6\u76f7\u76f8\u76f9\u76fa\u76fb\u76fc\u76fd\u76fe\u76ff\u7700\u7701\u7702\u7703\u7704\u7705\u7706\u7707\u7708\u7709\u770a\u770b\u770c\u770d\u770e\u770f\u7710\u7711\u7712\u7713\u7714\u7715\u7716\u7717\u7718\u7719\u771a\u771b\u771c\u771d\u771e\u771f\u7720\u7721\u7722\u7723\u7724\u7725\u7726\u7727\u7728\u7729\u772a\u772b\u772c\u772d\u772e\u772f\u7730\u7731\u7732\u7733\u7734\u7735\u7736\u7737\u7738\u7739\u773a\u773b\u773c\u773d\u773e\u773f\u7740\u7741\u7742\u7743\u7744\u7745\u7746\u7747\u7748\u7749\u774a\u774b\u774c\u774d\u774e\u774f\u7750\u7751\u7752\u7753\u7754\u7755\u7756\u7757\u7758\u7759\u775a\u775b\u775c\u775d\u775e\u775f\u7760\u7761\u7762\u7763\u7764\u7765\u7766\u7767\u7768\u7769\u776a\u776b\u776c\u776d\u776e\u776f\u7770\u7771\u7772\u7773\u7774\u7775\u7776\u7777\u7778\u7779\u777a\u777b\u777c\u777d\u777e\u777f\u7780\u7781\u7782\u7783\u7784\u7785\u7786\u7787\u7788\u7789\u778a\u778b\u778c\u778d\u778e\u778f\u7790\u7791\u7792\u7793\u7794\u7795\u7796\u7797\u7798\u7799\u779a\u779b\u779c\u779d\u779e\u779f\u77a0\u77a1\u77a2\u77a3\u77a4\u77a5\u77a6\u77a7\u77a8\u77a9\u77aa\u77ab\u77ac\u77ad\u77ae\u77af\u77b0\u77b1\u77b2\u77b3\u77b4\u77b5\u77b6\u77b7\u77b8\u77b9\u77ba\u77bb\u77bc\u77bd\u77be\u77bf\u77c0\u77c1\u77c2\u77c3\u77c4\u77c5\u77c6\u77c7\u77c8\u77c9\u77ca\u77cb\u77cc\u77cd\u77ce\u77cf\u77d0\u77d1\u77d2\u77d3\u77d4\u77d5\u77d6\u77d7\u77d8\u77d9\u77da\u77db\u77dc\u77dd\u77de\u77df\u77e0\u77e1\u77e2\u77e3\u77e4\u77e5\u77e6\u77e7\u77e8\u77e9\u77ea\u77eb\u77ec\u77ed\u77ee\u77ef\u77f0\u77f1\u77f2\u77f3\u77f4\u77f5\u77f6\u77f7\u77f8\u77f9\u77fa\u77fb\u77fc\u77fd\u77fe\u77ff\u7800\u7801\u7802\u7803\u7804\u7805\u7806\u7807\u7808\u7809\u780a\u780b\u780c\u780d\u780e\u780f\u7810\u7811\u7812\u7813\u7814\u7815\u7816\u7817\u7818\u7819\u781a\u781b\u781c\u781d\u781e\u781f\u7820\u7821\u7822\u7823\u7824\u7825\u7826\u7827\u7828\u7829\u782a\u782b\u782c\u782d\u782e\u782f\u7830\u7831\u7832\u7833\u7834\u7835\u7836\u7837\u7838\u7839\u783a\u783b\u783c\u783d\u783e\u783f\u7840\u7841\u7842\u7843\u7844\u7845\u7846\u7847\u7848\u7849\u784a\u784b\u784c\u784d\u784e\u784f\u7850\u7851\u7852\u7853\u7854\u7855\u7856\u7857\u7858\u7859\u785a\u785b\u785c\u785d\u785e\u785f\u7860\u7861\u7862\u7863\u7864\u7865\u7866\u7867\u7868\u7869\u786a\u786b\u786c\u786d\u786e\u786f\u7870\u7871\u7872\u7873\u7874\u7875\u7876\u7877\u7878\u7879\u787a\u787b\u787c\u787d\u787e\u787f\u7880\u7881\u7882\u7883\u7884\u7885\u7886\u7887\u7888\u7889\u788a\u788b\u788c\u788d\u788e\u788f\u7890\u7891\u7892\u7893\u7894\u7895\u7896\u7897\u7898\u7899\u789a\u789b\u789c\u789d\u789e\u789f\u78a0\u78a1\u78a2\u78a3\u78a4\u78a5\u78a6\u78a7\u78a8\u78a9\u78aa\u78ab\u78ac\u78ad\u78ae\u78af\u78b0\u78b1\u78b2\u78b3\u78b4\u78b5\u78b6\u78b7\u78b8\u78b9\u78ba\u78bb\u78bc\u78bd\u78be\u78bf\u78c0\u78c1\u78c2\u78c3\u78c4\u78c5\u78c6\u78c7\u78c8\u78c9\u78ca\u78cb\u78cc\u78cd\u78ce\u78cf\u78d0\u78d1\u78d2\u78d3\u78d4\u78d5\u78d6\u78d7\u78d8\u78d9\u78da\u78db\u78dc\u78dd\u78de\u78df\u78e0\u78e1\u78e2\u78e3\u78e4\u78e5\u78e6\u78e7\u78e8\u78e9\u78ea\u78eb\u78ec\u78ed\u78ee\u78ef\u78f0\u78f1\u78f2\u78f3\u78f4\u78f5\u78f6\u78f7\u78f8\u78f9\u78fa\u78fb\u78fc\u78fd\u78fe\u78ff\u7900\u7901\u7902\u7903\u7904\u7905\u7906\u7907\u7908\u7909\u790a\u790b\u790c\u790d\u790e\u790f\u7910\u7911\u7912\u7913\u7914\u7915\u7916\u7917\u7918\u7919\u791a\u791b\u791c\u791d\u791e\u791f\u7920\u7921\u7922\u7923\u7924\u7925\u7926\u7927\u7928\u7929\u792a\u792b\u792c\u792d\u792e\u792f\u7930\u7931\u7932\u7933\u7934\u7935\u7936\u7937\u7938\u7939\u793a\u793b\u793c\u793d\u793e\u793f\u7940\u7941\u7942\u7943\u7944\u7945\u7946\u7947\u7948\u7949\u794a\u794b\u794c\u794d\u794e\u794f\u7950\u7951\u7952\u7953\u7954\u7955\u7956\u7957\u7958\u7959\u795a\u795b\u795c\u795d\u795e\u795f\u7960\u7961\u7962\u7963\u7964\u7965\u7966\u7967\u7968\u7969\u796a\u796b\u796c\u796d\u796e\u796f\u7970\u7971\u7972\u7973\u7974\u7975\u7976\u7977\u7978\u7979\u797a\u797b\u797c\u797d\u797e\u797f\u7980\u7981\u7982\u7983\u7984\u7985\u7986\u7987\u7988\u7989\u798a\u798b\u798c\u798d\u798e\u798f\u7990\u7991\u7992\u7993\u7994\u7995\u7996\u7997\u7998\u7999\u799a\u799b\u799c\u799d\u799e\u799f\u79a0\u79a1\u79a2\u79a3\u79a4\u79a5\u79a6\u79a7\u79a8\u79a9\u79aa\u79ab\u79ac\u79ad\u79ae\u79af\u79b0\u79b1\u79b2\u79b3\u79b4\u79b5\u79b6\u79b7\u79b8\u79b9\u79ba\u79bb\u79bc\u79bd\u79be\u79bf\u79c0\u79c1\u79c2\u79c3\u79c4\u79c5\u79c6\u79c7\u79c8\u79c9\u79ca\u79cb\u79cc\u79cd\u79ce\u79cf\u79d0\u79d1\u79d2\u79d3\u79d4\u79d5\u79d6\u79d7\u79d8\u79d9\u79da\u79db\u79dc\u79dd\u79de\u79df\u79e0\u79e1\u79e2\u79e3\u79e4\u79e5\u79e6\u79e7\u79e8\u79e9\u79ea\u79eb\u79ec\u79ed\u79ee\u79ef\u79f0\u79f1\u79f2\u79f3\u79f4\u79f5\u79f6\u79f7\u79f8\u79f9\u79fa\u79fb\u79fc\u79fd\u79fe\u79ff\u7a00\u7a01\u7a02\u7a03\u7a04\u7a05\u7a06\u7a07\u7a08\u7a09\u7a0a\u7a0b\u7a0c\u7a0d\u7a0e\u7a0f\u7a10\u7a11\u7a12\u7a13\u7a14\u7a15\u7a16\u7a17\u7a18\u7a19\u7a1a\u7a1b\u7a1c\u7a1d\u7a1e\u7a1f\u7a20\u7a21\u7a22\u7a23\u7a24\u7a25\u7a26\u7a27\u7a28\u7a29\u7a2a\u7a2b\u7a2c\u7a2d\u7a2e\u7a2f\u7a30\u7a31\u7a32\u7a33\u7a34\u7a35\u7a36\u7a37\u7a38\u7a39\u7a3a\u7a3b\u7a3c\u7a3d\u7a3e\u7a3f\u7a40\u7a41\u7a42\u7a43\u7a44\u7a45\u7a46\u7a47\u7a48\u7a49\u7a4a\u7a4b\u7a4c\u7a4d\u7a4e\u7a4f\u7a50\u7a51\u7a52\u7a53\u7a54\u7a55\u7a56\u7a57\u7a58\u7a59\u7a5a\u7a5b\u7a5c\u7a5d\u7a5e\u7a5f\u7a60\u7a61\u7a62\u7a63\u7a64\u7a65\u7a66\u7a67\u7a68\u7a69\u7a6a\u7a6b\u7a6c\u7a6d\u7a6e\u7a6f\u7a70\u7a71\u7a72\u7a73\u7a74\u7a75\u7a76\u7a77\u7a78\u7a79\u7a7a\u7a7b\u7a7c\u7a7d\u7a7e\u7a7f\u7a80\u7a81\u7a82\u7a83\u7a84\u7a85\u7a86\u7a87\u7a88\u7a89\u7a8a\u7a8b\u7a8c\u7a8d\u7a8e\u7a8f\u7a90\u7a91\u7a92\u7a93\u7a94\u7a95\u7a96\u7a97\u7a98\u7a99\u7a9a\u7a9b\u7a9c\u7a9d\u7a9e\u7a9f\u7aa0\u7aa1\u7aa2\u7aa3\u7aa4\u7aa5\u7aa6\u7aa7\u7aa8\u7aa9\u7aaa\u7aab\u7aac\u7aad\u7aae\u7aaf\u7ab0\u7ab1\u7ab2\u7ab3\u7ab4\u7ab5\u7ab6\u7ab7\u7ab8\u7ab9\u7aba\u7abb\u7abc\u7abd\u7abe\u7abf\u7ac0\u7ac1\u7ac2\u7ac3\u7ac4\u7ac5\u7ac6\u7ac7\u7ac8\u7ac9\u7aca\u7acb\u7acc\u7acd\u7ace\u7acf\u7ad0\u7ad1\u7ad2\u7ad3\u7ad4\u7ad5\u7ad6\u7ad7\u7ad8\u7ad9\u7ada\u7adb\u7adc\u7add\u7ade\u7adf\u7ae0\u7ae1\u7ae2\u7ae3\u7ae4\u7ae5\u7ae6\u7ae7\u7ae8\u7ae9\u7aea\u7aeb\u7aec\u7aed\u7aee\u7aef\u7af0\u7af1\u7af2\u7af3\u7af4\u7af5\u7af6\u7af7\u7af8\u7af9\u7afa\u7afb\u7afc\u7afd\u7afe\u7aff\u7b00\u7b01\u7b02\u7b03\u7b04\u7b05\u7b06\u7b07\u7b08\u7b09\u7b0a\u7b0b\u7b0c\u7b0d\u7b0e\u7b0f\u7b10\u7b11\u7b12\u7b13\u7b14\u7b15\u7b16\u7b17\u7b18\u7b19\u7b1a\u7b1b\u7b1c\u7b1d\u7b1e\u7b1f\u7b20\u7b21\u7b22\u7b23\u7b24\u7b25\u7b26\u7b27\u7b28\u7b29\u7b2a\u7b2b\u7b2c\u7b2d\u7b2e\u7b2f\u7b30\u7b31\u7b32\u7b33\u7b34\u7b35\u7b36\u7b37\u7b38\u7b39\u7b3a\u7b3b\u7b3c\u7b3d\u7b3e\u7b3f\u7b40\u7b41\u7b42\u7b43\u7b44\u7b45\u7b46\u7b47\u7b48\u7b49\u7b4a\u7b4b\u7b4c\u7b4d\u7b4e\u7b4f\u7b50\u7b51\u7b52\u7b53\u7b54\u7b55\u7b56\u7b57\u7b58\u7b59\u7b5a\u7b5b\u7b5c\u7b5d\u7b5e\u7b5f\u7b60\u7b61\u7b62\u7b63\u7b64\u7b65\u7b66\u7b67\u7b68\u7b69\u7b6a\u7b6b\u7b6c\u7b6d\u7b6e\u7b6f\u7b70\u7b71\u7b72\u7b73\u7b74\u7b75\u7b76\u7b77\u7b78\u7b79\u7b7a\u7b7b\u7b7c\u7b7d\u7b7e\u7b7f\u7b80\u7b81\u7b82\u7b83\u7b84\u7b85\u7b86\u7b87\u7b88\u7b89\u7b8a\u7b8b\u7b8c\u7b8d\u7b8e\u7b8f\u7b90\u7b91\u7b92\u7b93\u7b94\u7b95\u7b96\u7b97\u7b98\u7b99\u7b9a\u7b9b\u7b9c\u7b9d\u7b9e\u7b9f\u7ba0\u7ba1\u7ba2\u7ba3\u7ba4\u7ba5\u7ba6\u7ba7\u7ba8\u7ba9\u7baa\u7bab\u7bac\u7bad\u7bae\u7baf\u7bb0\u7bb1\u7bb2\u7bb3\u7bb4\u7bb5\u7bb6\u7bb7\u7bb8\u7bb9\u7bba\u7bbb\u7bbc\u7bbd\u7bbe\u7bbf\u7bc0\u7bc1\u7bc2\u7bc3\u7bc4\u7bc5\u7bc6\u7bc7\u7bc8\u7bc9\u7bca\u7bcb\u7bcc\u7bcd\u7bce\u7bcf\u7bd0\u7bd1\u7bd2\u7bd3\u7bd4\u7bd5\u7bd6\u7bd7\u7bd8\u7bd9\u7bda\u7bdb\u7bdc\u7bdd\u7bde\u7bdf\u7be0\u7be1\u7be2\u7be3\u7be4\u7be5\u7be6\u7be7\u7be8\u7be9\u7bea\u7beb\u7bec\u7bed\u7bee\u7bef\u7bf0\u7bf1\u7bf2\u7bf3\u7bf4\u7bf5\u7bf6\u7bf7\u7bf8\u7bf9\u7bfa\u7bfb\u7bfc\u7bfd\u7bfe\u7bff\u7c00\u7c01\u7c02\u7c03\u7c04\u7c05\u7c06\u7c07\u7c08\u7c09\u7c0a\u7c0b\u7c0c\u7c0d\u7c0e\u7c0f\u7c10\u7c11\u7c12\u7c13\u7c14\u7c15\u7c16\u7c17\u7c18\u7c19\u7c1a\u7c1b\u7c1c\u7c1d\u7c1e\u7c1f\u7c20\u7c21\u7c22\u7c23\u7c24\u7c25\u7c26\u7c27\u7c28\u7c29\u7c2a\u7c2b\u7c2c\u7c2d\u7c2e\u7c2f\u7c30\u7c31\u7c32\u7c33\u7c34\u7c35\u7c36\u7c37\u7c38\u7c39\u7c3a\u7c3b\u7c3c\u7c3d\u7c3e\u7c3f\u7c40\u7c41\u7c42\u7c43\u7c44\u7c45\u7c46\u7c47\u7c48\u7c49\u7c4a\u7c4b\u7c4c\u7c4d\u7c4e\u7c4f\u7c50\u7c51\u7c52\u7c53\u7c54\u7c55\u7c56\u7c57\u7c58\u7c59\u7c5a\u7c5b\u7c5c\u7c5d\u7c5e\u7c5f\u7c60\u7c61\u7c62\u7c63\u7c64\u7c65\u7c66\u7c67\u7c68\u7c69\u7c6a\u7c6b\u7c6c\u7c6d\u7c6e\u7c6f\u7c70\u7c71\u7c72\u7c73\u7c74\u7c75\u7c76\u7c77\u7c78\u7c79\u7c7a\u7c7b\u7c7c\u7c7d\u7c7e\u7c7f\u7c80\u7c81\u7c82\u7c83\u7c84\u7c85\u7c86\u7c87\u7c88\u7c89\u7c8a\u7c8b\u7c8c\u7c8d\u7c8e\u7c8f\u7c90\u7c91\u7c92\u7c93\u7c94\u7c95\u7c96\u7c97\u7c98\u7c99\u7c9a\u7c9b\u7c9c\u7c9d\u7c9e\u7c9f\u7ca0\u7ca1\u7ca2\u7ca3\u7ca4\u7ca5\u7ca6\u7ca7\u7ca8\u7ca9\u7caa\u7cab\u7cac\u7cad\u7cae\u7caf\u7cb0\u7cb1\u7cb2\u7cb3\u7cb4\u7cb5\u7cb6\u7cb7\u7cb8\u7cb9\u7cba\u7cbb\u7cbc\u7cbd\u7cbe\u7cbf\u7cc0\u7cc1\u7cc2\u7cc3\u7cc4\u7cc5\u7cc6\u7cc7\u7cc8\u7cc9\u7cca\u7ccb\u7ccc\u7ccd\u7cce\u7ccf\u7cd0\u7cd1\u7cd2\u7cd3\u7cd4\u7cd5\u7cd6\u7cd7\u7cd8\u7cd9\u7cda\u7cdb\u7cdc\u7cdd\u7cde\u7cdf\u7ce0\u7ce1\u7ce2\u7ce3\u7ce4\u7ce5\u7ce6\u7ce7\u7ce8\u7ce9\u7cea\u7ceb\u7cec\u7ced\u7cee\u7cef\u7cf0\u7cf1\u7cf2\u7cf3\u7cf4\u7cf5\u7cf6\u7cf7\u7cf8\u7cf9\u7cfa\u7cfb\u7cfc\u7cfd\u7cfe\u7cff\u7d00\u7d01\u7d02\u7d03\u7d04\u7d05\u7d06\u7d07\u7d08\u7d09\u7d0a\u7d0b\u7d0c\u7d0d\u7d0e\u7d0f\u7d10\u7d11\u7d12\u7d13\u7d14\u7d15\u7d16\u7d17\u7d18\u7d19\u7d1a\u7d1b\u7d1c\u7d1d\u7d1e\u7d1f\u7d20\u7d21\u7d22\u7d23\u7d24\u7d25\u7d26\u7d27\u7d28\u7d29\u7d2a\u7d2b\u7d2c\u7d2d\u7d2e\u7d2f\u7d30\u7d31\u7d32\u7d33\u7d34\u7d35\u7d36\u7d37\u7d38\u7d39\u7d3a\u7d3b\u7d3c\u7d3d\u7d3e\u7d3f\u7d40\u7d41\u7d42\u7d43\u7d44\u7d45\u7d46\u7d47\u7d48\u7d49\u7d4a\u7d4b\u7d4c\u7d4d\u7d4e\u7d4f\u7d50\u7d51\u7d52\u7d53\u7d54\u7d55\u7d56\u7d57\u7d58\u7d59\u7d5a\u7d5b\u7d5c\u7d5d\u7d5e\u7d5f\u7d60\u7d61\u7d62\u7d63\u7d64\u7d65\u7d66\u7d67\u7d68\u7d69\u7d6a\u7d6b\u7d6c\u7d6d\u7d6e\u7d6f\u7d70\u7d71\u7d72\u7d73\u7d74\u7d75\u7d76\u7d77\u7d78\u7d79\u7d7a\u7d7b\u7d7c\u7d7d\u7d7e\u7d7f\u7d80\u7d81\u7d82\u7d83\u7d84\u7d85\u7d86\u7d87\u7d88\u7d89\u7d8a\u7d8b\u7d8c\u7d8d\u7d8e\u7d8f\u7d90\u7d91\u7d92\u7d93\u7d94\u7d95\u7d96\u7d97\u7d98\u7d99\u7d9a\u7d9b\u7d9c\u7d9d\u7d9e\u7d9f\u7da0\u7da1\u7da2\u7da3\u7da4\u7da5\u7da6\u7da7\u7da8\u7da9\u7daa\u7dab\u7dac\u7dad\u7dae\u7daf\u7db0\u7db1\u7db2\u7db3\u7db4\u7db5\u7db6\u7db7\u7db8\u7db9\u7dba\u7dbb\u7dbc\u7dbd\u7dbe\u7dbf\u7dc0\u7dc1\u7dc2\u7dc3\u7dc4\u7dc5\u7dc6\u7dc7\u7dc8\u7dc9\u7dca\u7dcb\u7dcc\u7dcd\u7dce\u7dcf\u7dd0\u7dd1\u7dd2\u7dd3\u7dd4\u7dd5\u7dd6\u7dd7\u7dd8\u7dd9\u7dda\u7ddb\u7ddc\u7ddd\u7dde\u7ddf\u7de0\u7de1\u7de2\u7de3\u7de4\u7de5\u7de6\u7de7\u7de8\u7de9\u7dea\u7deb\u7dec\u7ded\u7dee\u7def\u7df0\u7df1\u7df2\u7df3\u7df4\u7df5\u7df6\u7df7\u7df8\u7df9\u7dfa\u7dfb\u7dfc\u7dfd\u7dfe\u7dff\u7e00\u7e01\u7e02\u7e03\u7e04\u7e05\u7e06\u7e07\u7e08\u7e09\u7e0a\u7e0b\u7e0c\u7e0d\u7e0e\u7e0f\u7e10\u7e11\u7e12\u7e13\u7e14\u7e15\u7e16\u7e17\u7e18\u7e19\u7e1a\u7e1b\u7e1c\u7e1d\u7e1e\u7e1f\u7e20\u7e21\u7e22\u7e23\u7e24\u7e25\u7e26\u7e27\u7e28\u7e29\u7e2a\u7e2b\u7e2c\u7e2d\u7e2e\u7e2f\u7e30\u7e31\u7e32\u7e33\u7e34\u7e35\u7e36\u7e37\u7e38\u7e39\u7e3a\u7e3b\u7e3c\u7e3d\u7e3e\u7e3f\u7e40\u7e41\u7e42\u7e43\u7e44\u7e45\u7e46\u7e47\u7e48\u7e49\u7e4a\u7e4b\u7e4c\u7e4d\u7e4e\u7e4f\u7e50\u7e51\u7e52\u7e53\u7e54\u7e55\u7e56\u7e57\u7e58\u7e59\u7e5a\u7e5b\u7e5c\u7e5d\u7e5e\u7e5f\u7e60\u7e61\u7e62\u7e63\u7e64\u7e65\u7e66\u7e67\u7e68\u7e69\u7e6a\u7e6b\u7e6c\u7e6d\u7e6e\u7e6f\u7e70\u7e71\u7e72\u7e73\u7e74\u7e75\u7e76\u7e77\u7e78\u7e79\u7e7a\u7e7b\u7e7c\u7e7d\u7e7e\u7e7f\u7e80\u7e81\u7e82\u7e83\u7e84\u7e85\u7e86\u7e87\u7e88\u7e89\u7e8a\u7e8b\u7e8c\u7e8d\u7e8e\u7e8f\u7e90\u7e91\u7e92\u7e93\u7e94\u7e95\u7e96\u7e97\u7e98\u7e99\u7e9a\u7e9b\u7e9c\u7e9d\u7e9e\u7e9f\u7ea0\u7ea1\u7ea2\u7ea3\u7ea4\u7ea5\u7ea6\u7ea7\u7ea8\u7ea9\u7eaa\u7eab\u7eac\u7ead\u7eae\u7eaf\u7eb0\u7eb1\u7eb2\u7eb3\u7eb4\u7eb5\u7eb6\u7eb7\u7eb8\u7eb9\u7eba\u7ebb\u7ebc\u7ebd\u7ebe\u7ebf\u7ec0\u7ec1\u7ec2\u7ec3\u7ec4\u7ec5\u7ec6\u7ec7\u7ec8\u7ec9\u7eca\u7ecb\u7ecc\u7ecd\u7ece\u7ecf\u7ed0\u7ed1\u7ed2\u7ed3\u7ed4\u7ed5\u7ed6\u7ed7\u7ed8\u7ed9\u7eda\u7edb\u7edc\u7edd\u7ede\u7edf\u7ee0\u7ee1\u7ee2\u7ee3\u7ee4\u7ee5\u7ee6\u7ee7\u7ee8\u7ee9\u7eea\u7eeb\u7eec\u7eed\u7eee\u7eef\u7ef0\u7ef1\u7ef2\u7ef3\u7ef4\u7ef5\u7ef6\u7ef7\u7ef8\u7ef9\u7efa\u7efb\u7efc\u7efd\u7efe\u7eff\u7f00\u7f01\u7f02\u7f03\u7f04\u7f05\u7f06\u7f07\u7f08\u7f09\u7f0a\u7f0b\u7f0c\u7f0d\u7f0e\u7f0f\u7f10\u7f11\u7f12\u7f13\u7f14\u7f15\u7f16\u7f17\u7f18\u7f19\u7f1a\u7f1b\u7f1c\u7f1d\u7f1e\u7f1f\u7f20\u7f21\u7f22\u7f23\u7f24\u7f25\u7f26\u7f27\u7f28\u7f29\u7f2a\u7f2b\u7f2c\u7f2d\u7f2e\u7f2f\u7f30\u7f31\u7f32\u7f33\u7f34\u7f35\u7f36\u7f37\u7f38\u7f39\u7f3a\u7f3b\u7f3c\u7f3d\u7f3e\u7f3f\u7f40\u7f41\u7f42\u7f43\u7f44\u7f45\u7f46\u7f47\u7f48\u7f49\u7f4a\u7f4b\u7f4c\u7f4d\u7f4e\u7f4f\u7f50\u7f51\u7f52\u7f53\u7f54\u7f55\u7f56\u7f57\u7f58\u7f59\u7f5a\u7f5b\u7f5c\u7f5d\u7f5e\u7f5f\u7f60\u7f61\u7f62\u7f63\u7f64\u7f65\u7f66\u7f67\u7f68\u7f69\u7f6a\u7f6b\u7f6c\u7f6d\u7f6e\u7f6f\u7f70\u7f71\u7f72\u7f73\u7f74\u7f75\u7f76\u7f77\u7f78\u7f79\u7f7a\u7f7b\u7f7c\u7f7d\u7f7e\u7f7f\u7f80\u7f81\u7f82\u7f83\u7f84\u7f85\u7f86\u7f87\u7f88\u7f89\u7f8a\u7f8b\u7f8c\u7f8d\u7f8e\u7f8f\u7f90\u7f91\u7f92\u7f93\u7f94\u7f95\u7f96\u7f97\u7f98\u7f99\u7f9a\u7f9b\u7f9c\u7f9d\u7f9e\u7f9f\u7fa0\u7fa1\u7fa2\u7fa3\u7fa4\u7fa5\u7fa6\u7fa7\u7fa8\u7fa9\u7faa\u7fab\u7fac\u7fad\u7fae\u7faf\u7fb0\u7fb1\u7fb2\u7fb3\u7fb4\u7fb5\u7fb6\u7fb7\u7fb8\u7fb9\u7fba\u7fbb\u7fbc\u7fbd\u7fbe\u7fbf\u7fc0\u7fc1\u7fc2\u7fc3\u7fc4\u7fc5\u7fc6\u7fc7\u7fc8\u7fc9\u7fca\u7fcb\u7fcc\u7fcd\u7fce\u7fcf\u7fd0\u7fd1\u7fd2\u7fd3\u7fd4\u7fd5\u7fd6\u7fd7\u7fd8\u7fd9\u7fda\u7fdb\u7fdc\u7fdd\u7fde\u7fdf\u7fe0\u7fe1\u7fe2\u7fe3\u7fe4\u7fe5\u7fe6\u7fe7\u7fe8\u7fe9\u7fea\u7feb\u7fec\u7fed\u7fee\u7fef\u7ff0\u7ff1\u7ff2\u7ff3\u7ff4\u7ff5\u7ff6\u7ff7\u7ff8\u7ff9\u7ffa\u7ffb\u7ffc\u7ffd\u7ffe\u7fff\u8000\u8001\u8002\u8003\u8004\u8005\u8006\u8007\u8008\u8009\u800a\u800b\u800c\u800d\u800e\u800f\u8010\u8011\u8012\u8013\u8014\u8015\u8016\u8017\u8018\u8019\u801a\u801b\u801c\u801d\u801e\u801f\u8020\u8021\u8022\u8023\u8024\u8025\u8026\u8027\u8028\u8029\u802a\u802b\u802c\u802d\u802e\u802f\u8030\u8031\u8032\u8033\u8034\u8035\u8036\u8037\u8038\u8039\u803a\u803b\u803c\u803d\u803e\u803f\u8040\u8041\u8042\u8043\u8044\u8045\u8046\u8047\u8048\u8049\u804a\u804b\u804c\u804d\u804e\u804f\u8050\u8051\u8052\u8053\u8054\u8055\u8056\u8057\u8058\u8059\u805a\u805b\u805c\u805d\u805e\u805f\u8060\u8061\u8062\u8063\u8064\u8065\u8066\u8067\u8068\u8069\u806a\u806b\u806c\u806d\u806e\u806f\u8070\u8071\u8072\u8073\u8074\u8075\u8076\u8077\u8078\u8079\u807a\u807b\u807c\u807d\u807e\u807f\u8080\u8081\u8082\u8083\u8084\u8085\u8086\u8087\u8088\u8089\u808a\u808b\u808c\u808d\u808e\u808f\u8090\u8091\u8092\u8093\u8094\u8095\u8096\u8097\u8098\u8099\u809a\u809b\u809c\u809d\u809e\u809f\u80a0\u80a1\u80a2\u80a3\u80a4\u80a5\u80a6\u80a7\u80a8\u80a9\u80aa\u80ab\u80ac\u80ad\u80ae\u80af\u80b0\u80b1\u80b2\u80b3\u80b4\u80b5\u80b6\u80b7\u80b8\u80b9\u80ba\u80bb\u80bc\u80bd\u80be\u80bf\u80c0\u80c1\u80c2\u80c3\u80c4\u80c5\u80c6\u80c7\u80c8\u80c9\u80ca\u80cb\u80cc\u80cd\u80ce\u80cf\u80d0\u80d1\u80d2\u80d3\u80d4\u80d5\u80d6\u80d7\u80d8\u80d9\u80da\u80db\u80dc\u80dd\u80de\u80df\u80e0\u80e1\u80e2\u80e3\u80e4\u80e5\u80e6\u80e7\u80e8\u80e9\u80ea\u80eb\u80ec\u80ed\u80ee\u80ef\u80f0\u80f1\u80f2\u80f3\u80f4\u80f5\u80f6\u80f7\u80f8\u80f9\u80fa\u80fb\u80fc\u80fd\u80fe\u80ff\u8100\u8101\u8102\u8103\u8104\u8105\u8106\u8107\u8108\u8109\u810a\u810b\u810c\u810d\u810e\u810f\u8110\u8111\u8112\u8113\u8114\u8115\u8116\u8117\u8118\u8119\u811a\u811b\u811c\u811d\u811e\u811f\u8120\u8121\u8122\u8123\u8124\u8125\u8126\u8127\u8128\u8129\u812a\u812b\u812c\u812d\u812e\u812f\u8130\u8131\u8132\u8133\u8134\u8135\u8136\u8137\u8138\u8139\u813a\u813b\u813c\u813d\u813e\u813f\u8140\u8141\u8142\u8143\u8144\u8145\u8146\u8147\u8148\u8149\u814a\u814b\u814c\u814d\u814e\u814f\u8150\u8151\u8152\u8153\u8154\u8155\u8156\u8157\u8158\u8159\u815a\u815b\u815c\u815d\u815e\u815f\u8160\u8161\u8162\u8163\u8164\u8165\u8166\u8167\u8168\u8169\u816a\u816b\u816c\u816d\u816e\u816f\u8170\u8171\u8172\u8173\u8174\u8175\u8176\u8177\u8178\u8179\u817a\u817b\u817c\u817d\u817e\u817f\u8180\u8181\u8182\u8183\u8184\u8185\u8186\u8187\u8188\u8189\u818a\u818b\u818c\u818d\u818e\u818f\u8190\u8191\u8192\u8193\u8194\u8195\u8196\u8197\u8198\u8199\u819a\u819b\u819c\u819d\u819e\u819f\u81a0\u81a1\u81a2\u81a3\u81a4\u81a5\u81a6\u81a7\u81a8\u81a9\u81aa\u81ab\u81ac\u81ad\u81ae\u81af\u81b0\u81b1\u81b2\u81b3\u81b4\u81b5\u81b6\u81b7\u81b8\u81b9\u81ba\u81bb\u81bc\u81bd\u81be\u81bf\u81c0\u81c1\u81c2\u81c3\u81c4\u81c5\u81c6\u81c7\u81c8\u81c9\u81ca\u81cb\u81cc\u81cd\u81ce\u81cf\u81d0\u81d1\u81d2\u81d3\u81d4\u81d5\u81d6\u81d7\u81d8\u81d9\u81da\u81db\u81dc\u81dd\u81de\u81df\u81e0\u81e1\u81e2\u81e3\u81e4\u81e5\u81e6\u81e7\u81e8\u81e9\u81ea\u81eb\u81ec\u81ed\u81ee\u81ef\u81f0\u81f1\u81f2\u81f3\u81f4\u81f5\u81f6\u81f7\u81f8\u81f9\u81fa\u81fb\u81fc\u81fd\u81fe\u81ff\u8200\u8201\u8202\u8203\u8204\u8205\u8206\u8207\u8208\u8209\u820a\u820b\u820c\u820d\u820e\u820f\u8210\u8211\u8212\u8213\u8214\u8215\u8216\u8217\u8218\u8219\u821a\u821b\u821c\u821d\u821e\u821f\u8220\u8221\u8222\u8223\u8224\u8225\u8226\u8227\u8228\u8229\u822a\u822b\u822c\u822d\u822e\u822f\u8230\u8231\u8232\u8233\u8234\u8235\u8236\u8237\u8238\u8239\u823a\u823b\u823c\u823d\u823e\u823f\u8240\u8241\u8242\u8243\u8244\u8245\u8246\u8247\u8248\u8249\u824a\u824b\u824c\u824d\u824e\u824f\u8250\u8251\u8252\u8253\u8254\u8255\u8256\u8257\u8258\u8259\u825a\u825b\u825c\u825d\u825e\u825f\u8260\u8261\u8262\u8263\u8264\u8265\u8266\u8267\u8268\u8269\u826a\u826b\u826c\u826d\u826e\u826f\u8270\u8271\u8272\u8273\u8274\u8275\u8276\u8277\u8278\u8279\u827a\u827b\u827c\u827d\u827e\u827f\u8280\u8281\u8282\u8283\u8284\u8285\u8286\u8287\u8288\u8289\u828a\u828b\u828c\u828d\u828e\u828f\u8290\u8291\u8292\u8293\u8294\u8295\u8296\u8297\u8298\u8299\u829a\u829b\u829c\u829d\u829e\u829f\u82a0\u82a1\u82a2\u82a3\u82a4\u82a5\u82a6\u82a7\u82a8\u82a9\u82aa\u82ab\u82ac\u82ad\u82ae\u82af\u82b0\u82b1\u82b2\u82b3\u82b4\u82b5\u82b6\u82b7\u82b8\u82b9\u82ba\u82bb\u82bc\u82bd\u82be\u82bf\u82c0\u82c1\u82c2\u82c3\u82c4\u82c5\u82c6\u82c7\u82c8\u82c9\u82ca\u82cb\u82cc\u82cd\u82ce\u82cf\u82d0\u82d1\u82d2\u82d3\u82d4\u82d5\u82d6\u82d7\u82d8\u82d9\u82da\u82db\u82dc\u82dd\u82de\u82df\u82e0\u82e1\u82e2\u82e3\u82e4\u82e5\u82e6\u82e7\u82e8\u82e9\u82ea\u82eb\u82ec\u82ed\u82ee\u82ef\u82f0\u82f1\u82f2\u82f3\u82f4\u82f5\u82f6\u82f7\u82f8\u82f9\u82fa\u82fb\u82fc\u82fd\u82fe\u82ff\u8300\u8301\u8302\u8303\u8304\u8305\u8306\u8307\u8308\u8309\u830a\u830b\u830c\u830d\u830e\u830f\u8310\u8311\u8312\u8313\u8314\u8315\u8316\u8317\u8318\u8319\u831a\u831b\u831c\u831d\u831e\u831f\u8320\u8321\u8322\u8323\u8324\u8325\u8326\u8327\u8328\u8329\u832a\u832b\u832c\u832d\u832e\u832f\u8330\u8331\u8332\u8333\u8334\u8335\u8336\u8337\u8338\u8339\u833a\u833b\u833c\u833d\u833e\u833f\u8340\u8341\u8342\u8343\u8344\u8345\u8346\u8347\u8348\u8349\u834a\u834b\u834c\u834d\u834e\u834f\u8350\u8351\u8352\u8353\u8354\u8355\u8356\u8357\u8358\u8359\u835a\u835b\u835c\u835d\u835e\u835f\u8360\u8361\u8362\u8363\u8364\u8365\u8366\u8367\u8368\u8369\u836a\u836b\u836c\u836d\u836e\u836f\u8370\u8371\u8372\u8373\u8374\u8375\u8376\u8377\u8378\u8379\u837a\u837b\u837c\u837d\u837e\u837f\u8380\u8381\u8382\u8383\u8384\u8385\u8386\u8387\u8388\u8389\u838a\u838b\u838c\u838d\u838e\u838f\u8390\u8391\u8392\u8393\u8394\u8395\u8396\u8397\u8398\u8399\u839a\u839b\u839c\u839d\u839e\u839f\u83a0\u83a1\u83a2\u83a3\u83a4\u83a5\u83a6\u83a7\u83a8\u83a9\u83aa\u83ab\u83ac\u83ad\u83ae\u83af\u83b0\u83b1\u83b2\u83b3\u83b4\u83b5\u83b6\u83b7\u83b8\u83b9\u83ba\u83bb\u83bc\u83bd\u83be\u83bf\u83c0\u83c1\u83c2\u83c3\u83c4\u83c5\u83c6\u83c7\u83c8\u83c9\u83ca\u83cb\u83cc\u83cd\u83ce\u83cf\u83d0\u83d1\u83d2\u83d3\u83d4\u83d5\u83d6\u83d7\u83d8\u83d9\u83da\u83db\u83dc\u83dd\u83de\u83df\u83e0\u83e1\u83e2\u83e3\u83e4\u83e5\u83e6\u83e7\u83e8\u83e9\u83ea\u83eb\u83ec\u83ed\u83ee\u83ef\u83f0\u83f1\u83f2\u83f3\u83f4\u83f5\u83f6\u83f7\u83f8\u83f9\u83fa\u83fb\u83fc\u83fd\u83fe\u83ff\u8400\u8401\u8402\u8403\u8404\u8405\u8406\u8407\u8408\u8409\u840a\u840b\u840c\u840d\u840e\u840f\u8410\u8411\u8412\u8413\u8414\u8415\u8416\u8417\u8418\u8419\u841a\u841b\u841c\u841d\u841e\u841f\u8420\u8421\u8422\u8423\u8424\u8425\u8426\u8427\u8428\u8429\u842a\u842b\u842c\u842d\u842e\u842f\u8430\u8431\u8432\u8433\u8434\u8435\u8436\u8437\u8438\u8439\u843a\u843b\u843c\u843d\u843e\u843f\u8440\u8441\u8442\u8443\u8444\u8445\u8446\u8447\u8448\u8449\u844a\u844b\u844c\u844d\u844e\u844f\u8450\u8451\u8452\u8453\u8454\u8455\u8456\u8457\u8458\u8459\u845a\u845b\u845c\u845d\u845e\u845f\u8460\u8461\u8462\u8463\u8464\u8465\u8466\u8467\u8468\u8469\u846a\u846b\u846c\u846d\u846e\u846f\u8470\u8471\u8472\u8473\u8474\u8475\u8476\u8477\u8478\u8479\u847a\u847b\u847c\u847d\u847e\u847f\u8480\u8481\u8482\u8483\u8484\u8485\u8486\u8487\u8488\u8489\u848a\u848b\u848c\u848d\u848e\u848f\u8490\u8491\u8492\u8493\u8494\u8495\u8496\u8497\u8498\u8499\u849a\u849b\u849c\u849d\u849e\u849f\u84a0\u84a1\u84a2\u84a3\u84a4\u84a5\u84a6\u84a7\u84a8\u84a9\u84aa\u84ab\u84ac\u84ad\u84ae\u84af\u84b0\u84b1\u84b2\u84b3\u84b4\u84b5\u84b6\u84b7\u84b8\u84b9\u84ba\u84bb\u84bc\u84bd\u84be\u84bf\u84c0\u84c1\u84c2\u84c3\u84c4\u84c5\u84c6\u84c7\u84c8\u84c9\u84ca\u84cb\u84cc\u84cd\u84ce\u84cf\u84d0\u84d1\u84d2\u84d3\u84d4\u84d5\u84d6\u84d7\u84d8\u84d9\u84da\u84db\u84dc\u84dd\u84de\u84df\u84e0\u84e1\u84e2\u84e3\u84e4\u84e5\u84e6\u84e7\u84e8\u84e9\u84ea\u84eb\u84ec\u84ed\u84ee\u84ef\u84f0\u84f1\u84f2\u84f3\u84f4\u84f5\u84f6\u84f7\u84f8\u84f9\u84fa\u84fb\u84fc\u84fd\u84fe\u84ff\u8500\u8501\u8502\u8503\u8504\u8505\u8506\u8507\u8508\u8509\u850a\u850b\u850c\u850d\u850e\u850f\u8510\u8511\u8512\u8513\u8514\u8515\u8516\u8517\u8518\u8519\u851a\u851b\u851c\u851d\u851e\u851f\u8520\u8521\u8522\u8523\u8524\u8525\u8526\u8527\u8528\u8529\u852a\u852b\u852c\u852d\u852e\u852f\u8530\u8531\u8532\u8533\u8534\u8535\u8536\u8537\u8538\u8539\u853a\u853b\u853c\u853d\u853e\u853f\u8540\u8541\u8542\u8543\u8544\u8545\u8546\u8547\u8548\u8549\u854a\u854b\u854c\u854d\u854e\u854f\u8550\u8551\u8552\u8553\u8554\u8555\u8556\u8557\u8558\u8559\u855a\u855b\u855c\u855d\u855e\u855f\u8560\u8561\u8562\u8563\u8564\u8565\u8566\u8567\u8568\u8569\u856a\u856b\u856c\u856d\u856e\u856f\u8570\u8571\u8572\u8573\u8574\u8575\u8576\u8577\u8578\u8579\u857a\u857b\u857c\u857d\u857e\u857f\u8580\u8581\u8582\u8583\u8584\u8585\u8586\u8587\u8588\u8589\u858a\u858b\u858c\u858d\u858e\u858f\u8590\u8591\u8592\u8593\u8594\u8595\u8596\u8597\u8598\u8599\u859a\u859b\u859c\u859d\u859e\u859f\u85a0\u85a1\u85a2\u85a3\u85a4\u85a5\u85a6\u85a7\u85a8\u85a9\u85aa\u85ab\u85ac\u85ad\u85ae\u85af\u85b0\u85b1\u85b2\u85b3\u85b4\u85b5\u85b6\u85b7\u85b8\u85b9\u85ba\u85bb\u85bc\u85bd\u85be\u85bf\u85c0\u85c1\u85c2\u85c3\u85c4\u85c5\u85c6\u85c7\u85c8\u85c9\u85ca\u85cb\u85cc\u85cd\u85ce\u85cf\u85d0\u85d1\u85d2\u85d3\u85d4\u85d5\u85d6\u85d7\u85d8\u85d9\u85da\u85db\u85dc\u85dd\u85de\u85df\u85e0\u85e1\u85e2\u85e3\u85e4\u85e5\u85e6\u85e7\u85e8\u85e9\u85ea\u85eb\u85ec\u85ed\u85ee\u85ef\u85f0\u85f1\u85f2\u85f3\u85f4\u85f5\u85f6\u85f7\u85f8\u85f9\u85fa\u85fb\u85fc\u85fd\u85fe\u85ff\u8600\u8601\u8602\u8603\u8604\u8605\u8606\u8607\u8608\u8609\u860a\u860b\u860c\u860d\u860e\u860f\u8610\u8611\u8612\u8613\u8614\u8615\u8616\u8617\u8618\u8619\u861a\u861b\u861c\u861d\u861e\u861f\u8620\u8621\u8622\u8623\u8624\u8625\u8626\u8627\u8628\u8629\u862a\u862b\u862c\u862d\u862e\u862f\u8630\u8631\u8632\u8633\u8634\u8635\u8636\u8637\u8638\u8639\u863a\u863b\u863c\u863d\u863e\u863f\u8640\u8641\u8642\u8643\u8644\u8645\u8646\u8647\u8648\u8649\u864a\u864b\u864c\u864d\u864e\u864f\u8650\u8651\u8652\u8653\u8654\u8655\u8656\u8657\u8658\u8659\u865a\u865b\u865c\u865d\u865e\u865f\u8660\u8661\u8662\u8663\u8664\u8665\u8666\u8667\u8668\u8669\u866a\u866b\u866c\u866d\u866e\u866f\u8670\u8671\u8672\u8673\u8674\u8675\u8676\u8677\u8678\u8679\u867a\u867b\u867c\u867d\u867e\u867f\u8680\u8681\u8682\u8683\u8684\u8685\u8686\u8687\u8688\u8689\u868a\u868b\u868c\u868d\u868e\u868f\u8690\u8691\u8692\u8693\u8694\u8695\u8696\u8697\u8698\u8699\u869a\u869b\u869c\u869d\u869e\u869f\u86a0\u86a1\u86a2\u86a3\u86a4\u86a5\u86a6\u86a7\u86a8\u86a9\u86aa\u86ab\u86ac\u86ad\u86ae\u86af\u86b0\u86b1\u86b2\u86b3\u86b4\u86b5\u86b6\u86b7\u86b8\u86b9\u86ba\u86bb\u86bc\u86bd\u86be\u86bf\u86c0\u86c1\u86c2\u86c3\u86c4\u86c5\u86c6\u86c7\u86c8\u86c9\u86ca\u86cb\u86cc\u86cd\u86ce\u86cf\u86d0\u86d1\u86d2\u86d3\u86d4\u86d5\u86d6\u86d7\u86d8\u86d9\u86da\u86db\u86dc\u86dd\u86de\u86df\u86e0\u86e1\u86e2\u86e3\u86e4\u86e5\u86e6\u86e7\u86e8\u86e9\u86ea\u86eb\u86ec\u86ed\u86ee\u86ef\u86f0\u86f1\u86f2\u86f3\u86f4\u86f5\u86f6\u86f7\u86f8\u86f9\u86fa\u86fb\u86fc\u86fd\u86fe\u86ff\u8700\u8701\u8702\u8703\u8704\u8705\u8706\u8707\u8708\u8709\u870a\u870b\u870c\u870d\u870e\u870f\u8710\u8711\u8712\u8713\u8714\u8715\u8716\u8717\u8718\u8719\u871a\u871b\u871c\u871d\u871e\u871f\u8720\u8721\u8722\u8723\u8724\u8725\u8726\u8727\u8728\u8729\u872a\u872b\u872c\u872d\u872e\u872f\u8730\u8731\u8732\u8733\u8734\u8735\u8736\u8737\u8738\u8739\u873a\u873b\u873c\u873d\u873e\u873f\u8740\u8741\u8742\u8743\u8744\u8745\u8746\u8747\u8748\u8749\u874a\u874b\u874c\u874d\u874e\u874f\u8750\u8751\u8752\u8753\u8754\u8755\u8756\u8757\u8758\u8759\u875a\u875b\u875c\u875d\u875e\u875f\u8760\u8761\u8762\u8763\u8764\u8765\u8766\u8767\u8768\u8769\u876a\u876b\u876c\u876d\u876e\u876f\u8770\u8771\u8772\u8773\u8774\u8775\u8776\u8777\u8778\u8779\u877a\u877b\u877c\u877d\u877e\u877f\u8780\u8781\u8782\u8783\u8784\u8785\u8786\u8787\u8788\u8789\u878a\u878b\u878c\u878d\u878e\u878f\u8790\u8791\u8792\u8793\u8794\u8795\u8796\u8797\u8798\u8799\u879a\u879b\u879c\u879d\u879e\u879f\u87a0\u87a1\u87a2\u87a3\u87a4\u87a5\u87a6\u87a7\u87a8\u87a9\u87aa\u87ab\u87ac\u87ad\u87ae\u87af\u87b0\u87b1\u87b2\u87b3\u87b4\u87b5\u87b6\u87b7\u87b8\u87b9\u87ba\u87bb\u87bc\u87bd\u87be\u87bf\u87c0\u87c1\u87c2\u87c3\u87c4\u87c5\u87c6\u87c7\u87c8\u87c9\u87ca\u87cb\u87cc\u87cd\u87ce\u87cf\u87d0\u87d1\u87d2\u87d3\u87d4\u87d5\u87d6\u87d7\u87d8\u87d9\u87da\u87db\u87dc\u87dd\u87de\u87df\u87e0\u87e1\u87e2\u87e3\u87e4\u87e5\u87e6\u87e7\u87e8\u87e9\u87ea\u87eb\u87ec\u87ed\u87ee\u87ef\u87f0\u87f1\u87f2\u87f3\u87f4\u87f5\u87f6\u87f7\u87f8\u87f9\u87fa\u87fb\u87fc\u87fd\u87fe\u87ff\u8800\u8801\u8802\u8803\u8804\u8805\u8806\u8807\u8808\u8809\u880a\u880b\u880c\u880d\u880e\u880f\u8810\u8811\u8812\u8813\u8814\u8815\u8816\u8817\u8818\u8819\u881a\u881b\u881c\u881d\u881e\u881f\u8820\u8821\u8822\u8823\u8824\u8825\u8826\u8827\u8828\u8829\u882a\u882b\u882c\u882d\u882e\u882f\u8830\u8831\u8832\u8833\u8834\u8835\u8836\u8837\u8838\u8839\u883a\u883b\u883c\u883d\u883e\u883f\u8840\u8841\u8842\u8843\u8844\u8845\u8846\u8847\u8848\u8849\u884a\u884b\u884c\u884d\u884e\u884f\u8850\u8851\u8852\u8853\u8854\u8855\u8856\u8857\u8858\u8859\u885a\u885b\u885c\u885d\u885e\u885f\u8860\u8861\u8862\u8863\u8864\u8865\u8866\u8867\u8868\u8869\u886a\u886b\u886c\u886d\u886e\u886f\u8870\u8871\u8872\u8873\u8874\u8875\u8876\u8877\u8878\u8879\u887a\u887b\u887c\u887d\u887e\u887f\u8880\u8881\u8882\u8883\u8884\u8885\u8886\u8887\u8888\u8889\u888a\u888b\u888c\u888d\u888e\u888f\u8890\u8891\u8892\u8893\u8894\u8895\u8896\u8897\u8898\u8899\u889a\u889b\u889c\u889d\u889e\u889f\u88a0\u88a1\u88a2\u88a3\u88a4\u88a5\u88a6\u88a7\u88a8\u88a9\u88aa\u88ab\u88ac\u88ad\u88ae\u88af\u88b0\u88b1\u88b2\u88b3\u88b4\u88b5\u88b6\u88b7\u88b8\u88b9\u88ba\u88bb\u88bc\u88bd\u88be\u88bf\u88c0\u88c1\u88c2\u88c3\u88c4\u88c5\u88c6\u88c7\u88c8\u88c9\u88ca\u88cb\u88cc\u88cd\u88ce\u88cf\u88d0\u88d1\u88d2\u88d3\u88d4\u88d5\u88d6\u88d7\u88d8\u88d9\u88da\u88db\u88dc\u88dd\u88de\u88df\u88e0\u88e1\u88e2\u88e3\u88e4\u88e5\u88e6\u88e7\u88e8\u88e9\u88ea\u88eb\u88ec\u88ed\u88ee\u88ef\u88f0\u88f1\u88f2\u88f3\u88f4\u88f5\u88f6\u88f7\u88f8\u88f9\u88fa\u88fb\u88fc\u88fd\u88fe\u88ff\u8900\u8901\u8902\u8903\u8904\u8905\u8906\u8907\u8908\u8909\u890a\u890b\u890c\u890d\u890e\u890f\u8910\u8911\u8912\u8913\u8914\u8915\u8916\u8917\u8918\u8919\u891a\u891b\u891c\u891d\u891e\u891f\u8920\u8921\u8922\u8923\u8924\u8925\u8926\u8927\u8928\u8929\u892a\u892b\u892c\u892d\u892e\u892f\u8930\u8931\u8932\u8933\u8934\u8935\u8936\u8937\u8938\u8939\u893a\u893b\u893c\u893d\u893e\u893f\u8940\u8941\u8942\u8943\u8944\u8945\u8946\u8947\u8948\u8949\u894a\u894b\u894c\u894d\u894e\u894f\u8950\u8951\u8952\u8953\u8954\u8955\u8956\u8957\u8958\u8959\u895a\u895b\u895c\u895d\u895e\u895f\u8960\u8961\u8962\u8963\u8964\u8965\u8966\u8967\u8968\u8969\u896a\u896b\u896c\u896d\u896e\u896f\u8970\u8971\u8972\u8973\u8974\u8975\u8976\u8977\u8978\u8979\u897a\u897b\u897c\u897d\u897e\u897f\u8980\u8981\u8982\u8983\u8984\u8985\u8986\u8987\u8988\u8989\u898a\u898b\u898c\u898d\u898e\u898f\u8990\u8991\u8992\u8993\u8994\u8995\u8996\u8997\u8998\u8999\u899a\u899b\u899c\u899d\u899e\u899f\u89a0\u89a1\u89a2\u89a3\u89a4\u89a5\u89a6\u89a7\u89a8\u89a9\u89aa\u89ab\u89ac\u89ad\u89ae\u89af\u89b0\u89b1\u89b2\u89b3\u89b4\u89b5\u89b6\u89b7\u89b8\u89b9\u89ba\u89bb\u89bc\u89bd\u89be\u89bf\u89c0\u89c1\u89c2\u89c3\u89c4\u89c5\u89c6\u89c7\u89c8\u89c9\u89ca\u89cb\u89cc\u89cd\u89ce\u89cf\u89d0\u89d1\u89d2\u89d3\u89d4\u89d5\u89d6\u89d7\u89d8\u89d9\u89da\u89db\u89dc\u89dd\u89de\u89df\u89e0\u89e1\u89e2\u89e3\u89e4\u89e5\u89e6\u89e7\u89e8\u89e9\u89ea\u89eb\u89ec\u89ed\u89ee\u89ef\u89f0\u89f1\u89f2\u89f3\u89f4\u89f5\u89f6\u89f7\u89f8\u89f9\u89fa\u89fb\u89fc\u89fd\u89fe\u89ff\u8a00\u8a01\u8a02\u8a03\u8a04\u8a05\u8a06\u8a07\u8a08\u8a09\u8a0a\u8a0b\u8a0c\u8a0d\u8a0e\u8a0f\u8a10\u8a11\u8a12\u8a13\u8a14\u8a15\u8a16\u8a17\u8a18\u8a19\u8a1a\u8a1b\u8a1c\u8a1d\u8a1e\u8a1f\u8a20\u8a21\u8a22\u8a23\u8a24\u8a25\u8a26\u8a27\u8a28\u8a29\u8a2a\u8a2b\u8a2c\u8a2d\u8a2e\u8a2f\u8a30\u8a31\u8a32\u8a33\u8a34\u8a35\u8a36\u8a37\u8a38\u8a39\u8a3a\u8a3b\u8a3c\u8a3d\u8a3e\u8a3f\u8a40\u8a41\u8a42\u8a43\u8a44\u8a45\u8a46\u8a47\u8a48\u8a49\u8a4a\u8a4b\u8a4c\u8a4d\u8a4e\u8a4f\u8a50\u8a51\u8a52\u8a53\u8a54\u8a55\u8a56\u8a57\u8a58\u8a59\u8a5a\u8a5b\u8a5c\u8a5d\u8a5e\u8a5f\u8a60\u8a61\u8a62\u8a63\u8a64\u8a65\u8a66\u8a67\u8a68\u8a69\u8a6a\u8a6b\u8a6c\u8a6d\u8a6e\u8a6f\u8a70\u8a71\u8a72\u8a73\u8a74\u8a75\u8a76\u8a77\u8a78\u8a79\u8a7a\u8a7b\u8a7c\u8a7d\u8a7e\u8a7f\u8a80\u8a81\u8a82\u8a83\u8a84\u8a85\u8a86\u8a87\u8a88\u8a89\u8a8a\u8a8b\u8a8c\u8a8d\u8a8e\u8a8f\u8a90\u8a91\u8a92\u8a93\u8a94\u8a95\u8a96\u8a97\u8a98\u8a99\u8a9a\u8a9b\u8a9c\u8a9d\u8a9e\u8a9f\u8aa0\u8aa1\u8aa2\u8aa3\u8aa4\u8aa5\u8aa6\u8aa7\u8aa8\u8aa9\u8aaa\u8aab\u8aac\u8aad\u8aae\u8aaf\u8ab0\u8ab1\u8ab2\u8ab3\u8ab4\u8ab5\u8ab6\u8ab7\u8ab8\u8ab9\u8aba\u8abb\u8abc\u8abd\u8abe\u8abf\u8ac0\u8ac1\u8ac2\u8ac3\u8ac4\u8ac5\u8ac6\u8ac7\u8ac8\u8ac9\u8aca\u8acb\u8acc\u8acd\u8ace\u8acf\u8ad0\u8ad1\u8ad2\u8ad3\u8ad4\u8ad5\u8ad6\u8ad7\u8ad8\u8ad9\u8ada\u8adb\u8adc\u8add\u8ade\u8adf\u8ae0\u8ae1\u8ae2\u8ae3\u8ae4\u8ae5\u8ae6\u8ae7\u8ae8\u8ae9\u8aea\u8aeb\u8aec\u8aed\u8aee\u8aef\u8af0\u8af1\u8af2\u8af3\u8af4\u8af5\u8af6\u8af7\u8af8\u8af9\u8afa\u8afb\u8afc\u8afd\u8afe\u8aff\u8b00\u8b01\u8b02\u8b03\u8b04\u8b05\u8b06\u8b07\u8b08\u8b09\u8b0a\u8b0b\u8b0c\u8b0d\u8b0e\u8b0f\u8b10\u8b11\u8b12\u8b13\u8b14\u8b15\u8b16\u8b17\u8b18\u8b19\u8b1a\u8b1b\u8b1c\u8b1d\u8b1e\u8b1f\u8b20\u8b21\u8b22\u8b23\u8b24\u8b25\u8b26\u8b27\u8b28\u8b29\u8b2a\u8b2b\u8b2c\u8b2d\u8b2e\u8b2f\u8b30\u8b31\u8b32\u8b33\u8b34\u8b35\u8b36\u8b37\u8b38\u8b39\u8b3a\u8b3b\u8b3c\u8b3d\u8b3e\u8b3f\u8b40\u8b41\u8b42\u8b43\u8b44\u8b45\u8b46\u8b47\u8b48\u8b49\u8b4a\u8b4b\u8b4c\u8b4d\u8b4e\u8b4f\u8b50\u8b51\u8b52\u8b53\u8b54\u8b55\u8b56\u8b57\u8b58\u8b59\u8b5a\u8b5b\u8b5c\u8b5d\u8b5e\u8b5f\u8b60\u8b61\u8b62\u8b63\u8b64\u8b65\u8b66\u8b67\u8b68\u8b69\u8b6a\u8b6b\u8b6c\u8b6d\u8b6e\u8b6f\u8b70\u8b71\u8b72\u8b73\u8b74\u8b75\u8b76\u8b77\u8b78\u8b79\u8b7a\u8b7b\u8b7c\u8b7d\u8b7e\u8b7f\u8b80\u8b81\u8b82\u8b83\u8b84\u8b85\u8b86\u8b87\u8b88\u8b89\u8b8a\u8b8b\u8b8c\u8b8d\u8b8e\u8b8f\u8b90\u8b91\u8b92\u8b93\u8b94\u8b95\u8b96\u8b97\u8b98\u8b99\u8b9a\u8b9b\u8b9c\u8b9d\u8b9e\u8b9f\u8ba0\u8ba1\u8ba2\u8ba3\u8ba4\u8ba5\u8ba6\u8ba7\u8ba8\u8ba9\u8baa\u8bab\u8bac\u8bad\u8bae\u8baf\u8bb0\u8bb1\u8bb2\u8bb3\u8bb4\u8bb5\u8bb6\u8bb7\u8bb8\u8bb9\u8bba\u8bbb\u8bbc\u8bbd\u8bbe\u8bbf\u8bc0\u8bc1\u8bc2\u8bc3\u8bc4\u8bc5\u8bc6\u8bc7\u8bc8\u8bc9\u8bca\u8bcb\u8bcc\u8bcd\u8bce\u8bcf\u8bd0\u8bd1\u8bd2\u8bd3\u8bd4\u8bd5\u8bd6\u8bd7\u8bd8\u8bd9\u8bda\u8bdb\u8bdc\u8bdd\u8bde\u8bdf\u8be0\u8be1\u8be2\u8be3\u8be4\u8be5\u8be6\u8be7\u8be8\u8be9\u8bea\u8beb\u8bec\u8bed\u8bee\u8bef\u8bf0\u8bf1\u8bf2\u8bf3\u8bf4\u8bf5\u8bf6\u8bf7\u8bf8\u8bf9\u8bfa\u8bfb\u8bfc\u8bfd\u8bfe\u8bff\u8c00\u8c01\u8c02\u8c03\u8c04\u8c05\u8c06\u8c07\u8c08\u8c09\u8c0a\u8c0b\u8c0c\u8c0d\u8c0e\u8c0f\u8c10\u8c11\u8c12\u8c13\u8c14\u8c15\u8c16\u8c17\u8c18\u8c19\u8c1a\u8c1b\u8c1c\u8c1d\u8c1e\u8c1f\u8c20\u8c21\u8c22\u8c23\u8c24\u8c25\u8c26\u8c27\u8c28\u8c29\u8c2a\u8c2b\u8c2c\u8c2d\u8c2e\u8c2f\u8c30\u8c31\u8c32\u8c33\u8c34\u8c35\u8c36\u8c37\u8c38\u8c39\u8c3a\u8c3b\u8c3c\u8c3d\u8c3e\u8c3f\u8c40\u8c41\u8c42\u8c43\u8c44\u8c45\u8c46\u8c47\u8c48\u8c49\u8c4a\u8c4b\u8c4c\u8c4d\u8c4e\u8c4f\u8c50\u8c51\u8c52\u8c53\u8c54\u8c55\u8c56\u8c57\u8c58\u8c59\u8c5a\u8c5b\u8c5c\u8c5d\u8c5e\u8c5f\u8c60\u8c61\u8c62\u8c63\u8c64\u8c65\u8c66\u8c67\u8c68\u8c69\u8c6a\u8c6b\u8c6c\u8c6d\u8c6e\u8c6f\u8c70\u8c71\u8c72\u8c73\u8c74\u8c75\u8c76\u8c77\u8c78\u8c79\u8c7a\u8c7b\u8c7c\u8c7d\u8c7e\u8c7f\u8c80\u8c81\u8c82\u8c83\u8c84\u8c85\u8c86\u8c87\u8c88\u8c89\u8c8a\u8c8b\u8c8c\u8c8d\u8c8e\u8c8f\u8c90\u8c91\u8c92\u8c93\u8c94\u8c95\u8c96\u8c97\u8c98\u8c99\u8c9a\u8c9b\u8c9c\u8c9d\u8c9e\u8c9f\u8ca0\u8ca1\u8ca2\u8ca3\u8ca4\u8ca5\u8ca6\u8ca7\u8ca8\u8ca9\u8caa\u8cab\u8cac\u8cad\u8cae\u8caf\u8cb0\u8cb1\u8cb2\u8cb3\u8cb4\u8cb5\u8cb6\u8cb7\u8cb8\u8cb9\u8cba\u8cbb\u8cbc\u8cbd\u8cbe\u8cbf\u8cc0\u8cc1\u8cc2\u8cc3\u8cc4\u8cc5\u8cc6\u8cc7\u8cc8\u8cc9\u8cca\u8ccb\u8ccc\u8ccd\u8cce\u8ccf\u8cd0\u8cd1\u8cd2\u8cd3\u8cd4\u8cd5\u8cd6\u8cd7\u8cd8\u8cd9\u8cda\u8cdb\u8cdc\u8cdd\u8cde\u8cdf\u8ce0\u8ce1\u8ce2\u8ce3\u8ce4\u8ce5\u8ce6\u8ce7\u8ce8\u8ce9\u8cea\u8ceb\u8cec\u8ced\u8cee\u8cef\u8cf0\u8cf1\u8cf2\u8cf3\u8cf4\u8cf5\u8cf6\u8cf7\u8cf8\u8cf9\u8cfa\u8cfb\u8cfc\u8cfd\u8cfe\u8cff\u8d00\u8d01\u8d02\u8d03\u8d04\u8d05\u8d06\u8d07\u8d08\u8d09\u8d0a\u8d0b\u8d0c\u8d0d\u8d0e\u8d0f\u8d10\u8d11\u8d12\u8d13\u8d14\u8d15\u8d16\u8d17\u8d18\u8d19\u8d1a\u8d1b\u8d1c\u8d1d\u8d1e\u8d1f\u8d20\u8d21\u8d22\u8d23\u8d24\u8d25\u8d26\u8d27\u8d28\u8d29\u8d2a\u8d2b\u8d2c\u8d2d\u8d2e\u8d2f\u8d30\u8d31\u8d32\u8d33\u8d34\u8d35\u8d36\u8d37\u8d38\u8d39\u8d3a\u8d3b\u8d3c\u8d3d\u8d3e\u8d3f\u8d40\u8d41\u8d42\u8d43\u8d44\u8d45\u8d46\u8d47\u8d48\u8d49\u8d4a\u8d4b\u8d4c\u8d4d\u8d4e\u8d4f\u8d50\u8d51\u8d52\u8d53\u8d54\u8d55\u8d56\u8d57\u8d58\u8d59\u8d5a\u8d5b\u8d5c\u8d5d\u8d5e\u8d5f\u8d60\u8d61\u8d62\u8d63\u8d64\u8d65\u8d66\u8d67\u8d68\u8d69\u8d6a\u8d6b\u8d6c\u8d6d\u8d6e\u8d6f\u8d70\u8d71\u8d72\u8d73\u8d74\u8d75\u8d76\u8d77\u8d78\u8d79\u8d7a\u8d7b\u8d7c\u8d7d\u8d7e\u8d7f\u8d80\u8d81\u8d82\u8d83\u8d84\u8d85\u8d86\u8d87\u8d88\u8d89\u8d8a\u8d8b\u8d8c\u8d8d\u8d8e\u8d8f\u8d90\u8d91\u8d92\u8d93\u8d94\u8d95\u8d96\u8d97\u8d98\u8d99\u8d9a\u8d9b\u8d9c\u8d9d\u8d9e\u8d9f\u8da0\u8da1\u8da2\u8da3\u8da4\u8da5\u8da6\u8da7\u8da8\u8da9\u8daa\u8dab\u8dac\u8dad\u8dae\u8daf\u8db0\u8db1\u8db2\u8db3\u8db4\u8db5\u8db6\u8db7\u8db8\u8db9\u8dba\u8dbb\u8dbc\u8dbd\u8dbe\u8dbf\u8dc0\u8dc1\u8dc2\u8dc3\u8dc4\u8dc5\u8dc6\u8dc7\u8dc8\u8dc9\u8dca\u8dcb\u8dcc\u8dcd\u8dce\u8dcf\u8dd0\u8dd1\u8dd2\u8dd3\u8dd4\u8dd5\u8dd6\u8dd7\u8dd8\u8dd9\u8dda\u8ddb\u8ddc\u8ddd\u8dde\u8ddf\u8de0\u8de1\u8de2\u8de3\u8de4\u8de5\u8de6\u8de7\u8de8\u8de9\u8dea\u8deb\u8dec\u8ded\u8dee\u8def\u8df0\u8df1\u8df2\u8df3\u8df4\u8df5\u8df6\u8df7\u8df8\u8df9\u8dfa\u8dfb\u8dfc\u8dfd\u8dfe\u8dff\u8e00\u8e01\u8e02\u8e03\u8e04\u8e05\u8e06\u8e07\u8e08\u8e09\u8e0a\u8e0b\u8e0c\u8e0d\u8e0e\u8e0f\u8e10\u8e11\u8e12\u8e13\u8e14\u8e15\u8e16\u8e17\u8e18\u8e19\u8e1a\u8e1b\u8e1c\u8e1d\u8e1e\u8e1f\u8e20\u8e21\u8e22\u8e23\u8e24\u8e25\u8e26\u8e27\u8e28\u8e29\u8e2a\u8e2b\u8e2c\u8e2d\u8e2e\u8e2f\u8e30\u8e31\u8e32\u8e33\u8e34\u8e35\u8e36\u8e37\u8e38\u8e39\u8e3a\u8e3b\u8e3c\u8e3d\u8e3e\u8e3f\u8e40\u8e41\u8e42\u8e43\u8e44\u8e45\u8e46\u8e47\u8e48\u8e49\u8e4a\u8e4b\u8e4c\u8e4d\u8e4e\u8e4f\u8e50\u8e51\u8e52\u8e53\u8e54\u8e55\u8e56\u8e57\u8e58\u8e59\u8e5a\u8e5b\u8e5c\u8e5d\u8e5e\u8e5f\u8e60\u8e61\u8e62\u8e63\u8e64\u8e65\u8e66\u8e67\u8e68\u8e69\u8e6a\u8e6b\u8e6c\u8e6d\u8e6e\u8e6f\u8e70\u8e71\u8e72\u8e73\u8e74\u8e75\u8e76\u8e77\u8e78\u8e79\u8e7a\u8e7b\u8e7c\u8e7d\u8e7e\u8e7f\u8e80\u8e81\u8e82\u8e83\u8e84\u8e85\u8e86\u8e87\u8e88\u8e89\u8e8a\u8e8b\u8e8c\u8e8d\u8e8e\u8e8f\u8e90\u8e91\u8e92\u8e93\u8e94\u8e95\u8e96\u8e97\u8e98\u8e99\u8e9a\u8e9b\u8e9c\u8e9d\u8e9e\u8e9f\u8ea0\u8ea1\u8ea2\u8ea3\u8ea4\u8ea5\u8ea6\u8ea7\u8ea8\u8ea9\u8eaa\u8eab\u8eac\u8ead\u8eae\u8eaf\u8eb0\u8eb1\u8eb2\u8eb3\u8eb4\u8eb5\u8eb6\u8eb7\u8eb8\u8eb9\u8eba\u8ebb\u8ebc\u8ebd\u8ebe\u8ebf\u8ec0\u8ec1\u8ec2\u8ec3\u8ec4\u8ec5\u8ec6\u8ec7\u8ec8\u8ec9\u8eca\u8ecb\u8ecc\u8ecd\u8ece\u8ecf\u8ed0\u8ed1\u8ed2\u8ed3\u8ed4\u8ed5\u8ed6\u8ed7\u8ed8\u8ed9\u8eda\u8edb\u8edc\u8edd\u8ede\u8edf\u8ee0\u8ee1\u8ee2\u8ee3\u8ee4\u8ee5\u8ee6\u8ee7\u8ee8\u8ee9\u8eea\u8eeb\u8eec\u8eed\u8eee\u8eef\u8ef0\u8ef1\u8ef2\u8ef3\u8ef4\u8ef5\u8ef6\u8ef7\u8ef8\u8ef9\u8efa\u8efb\u8efc\u8efd\u8efe\u8eff\u8f00\u8f01\u8f02\u8f03\u8f04\u8f05\u8f06\u8f07\u8f08\u8f09\u8f0a\u8f0b\u8f0c\u8f0d\u8f0e\u8f0f\u8f10\u8f11\u8f12\u8f13\u8f14\u8f15\u8f16\u8f17\u8f18\u8f19\u8f1a\u8f1b\u8f1c\u8f1d\u8f1e\u8f1f\u8f20\u8f21\u8f22\u8f23\u8f24\u8f25\u8f26\u8f27\u8f28\u8f29\u8f2a\u8f2b\u8f2c\u8f2d\u8f2e\u8f2f\u8f30\u8f31\u8f32\u8f33\u8f34\u8f35\u8f36\u8f37\u8f38\u8f39\u8f3a\u8f3b\u8f3c\u8f3d\u8f3e\u8f3f\u8f40\u8f41\u8f42\u8f43\u8f44\u8f45\u8f46\u8f47\u8f48\u8f49\u8f4a\u8f4b\u8f4c\u8f4d\u8f4e\u8f4f\u8f50\u8f51\u8f52\u8f53\u8f54\u8f55\u8f56\u8f57\u8f58\u8f59\u8f5a\u8f5b\u8f5c\u8f5d\u8f5e\u8f5f\u8f60\u8f61\u8f62\u8f63\u8f64\u8f65\u8f66\u8f67\u8f68\u8f69\u8f6a\u8f6b\u8f6c\u8f6d\u8f6e\u8f6f\u8f70\u8f71\u8f72\u8f73\u8f74\u8f75\u8f76\u8f77\u8f78\u8f79\u8f7a\u8f7b\u8f7c\u8f7d\u8f7e\u8f7f\u8f80\u8f81\u8f82\u8f83\u8f84\u8f85\u8f86\u8f87\u8f88\u8f89\u8f8a\u8f8b\u8f8c\u8f8d\u8f8e\u8f8f\u8f90\u8f91\u8f92\u8f93\u8f94\u8f95\u8f96\u8f97\u8f98\u8f99\u8f9a\u8f9b\u8f9c\u8f9d\u8f9e\u8f9f\u8fa0\u8fa1\u8fa2\u8fa3\u8fa4\u8fa5\u8fa6\u8fa7\u8fa8\u8fa9\u8faa\u8fab\u8fac\u8fad\u8fae\u8faf\u8fb0\u8fb1\u8fb2\u8fb3\u8fb4\u8fb5\u8fb6\u8fb7\u8fb8\u8fb9\u8fba\u8fbb\u8fbc\u8fbd\u8fbe\u8fbf\u8fc0\u8fc1\u8fc2\u8fc3\u8fc4\u8fc5\u8fc6\u8fc7\u8fc8\u8fc9\u8fca\u8fcb\u8fcc\u8fcd\u8fce\u8fcf\u8fd0\u8fd1\u8fd2\u8fd3\u8fd4\u8fd5\u8fd6\u8fd7\u8fd8\u8fd9\u8fda\u8fdb\u8fdc\u8fdd\u8fde\u8fdf\u8fe0\u8fe1\u8fe2\u8fe3\u8fe4\u8fe5\u8fe6\u8fe7\u8fe8\u8fe9\u8fea\u8feb\u8fec\u8fed\u8fee\u8fef\u8ff0\u8ff1\u8ff2\u8ff3\u8ff4\u8ff5\u8ff6\u8ff7\u8ff8\u8ff9\u8ffa\u8ffb\u8ffc\u8ffd\u8ffe\u8fff\u9000\u9001\u9002\u9003\u9004\u9005\u9006\u9007\u9008\u9009\u900a\u900b\u900c\u900d\u900e\u900f\u9010\u9011\u9012\u9013\u9014\u9015\u9016\u9017\u9018\u9019\u901a\u901b\u901c\u901d\u901e\u901f\u9020\u9021\u9022\u9023\u9024\u9025\u9026\u9027\u9028\u9029\u902a\u902b\u902c\u902d\u902e\u902f\u9030\u9031\u9032\u9033\u9034\u9035\u9036\u9037\u9038\u9039\u903a\u903b\u903c\u903d\u903e\u903f\u9040\u9041\u9042\u9043\u9044\u9045\u9046\u9047\u9048\u9049\u904a\u904b\u904c\u904d\u904e\u904f\u9050\u9051\u9052\u9053\u9054\u9055\u9056\u9057\u9058\u9059\u905a\u905b\u905c\u905d\u905e\u905f\u9060\u9061\u9062\u9063\u9064\u9065\u9066\u9067\u9068\u9069\u906a\u906b\u906c\u906d\u906e\u906f\u9070\u9071\u9072\u9073\u9074\u9075\u9076\u9077\u9078\u9079\u907a\u907b\u907c\u907d\u907e\u907f\u9080\u9081\u9082\u9083\u9084\u9085\u9086\u9087\u9088\u9089\u908a\u908b\u908c\u908d\u908e\u908f\u9090\u9091\u9092\u9093\u9094\u9095\u9096\u9097\u9098\u9099\u909a\u909b\u909c\u909d\u909e\u909f\u90a0\u90a1\u90a2\u90a3\u90a4\u90a5\u90a6\u90a7\u90a8\u90a9\u90aa\u90ab\u90ac\u90ad\u90ae\u90af\u90b0\u90b1\u90b2\u90b3\u90b4\u90b5\u90b6\u90b7\u90b8\u90b9\u90ba\u90bb\u90bc\u90bd\u90be\u90bf\u90c0\u90c1\u90c2\u90c3\u90c4\u90c5\u90c6\u90c7\u90c8\u90c9\u90ca\u90cb\u90cc\u90cd\u90ce\u90cf\u90d0\u90d1\u90d2\u90d3\u90d4\u90d5\u90d6\u90d7\u90d8\u90d9\u90da\u90db\u90dc\u90dd\u90de\u90df\u90e0\u90e1\u90e2\u90e3\u90e4\u90e5\u90e6\u90e7\u90e8\u90e9\u90ea\u90eb\u90ec\u90ed\u90ee\u90ef\u90f0\u90f1\u90f2\u90f3\u90f4\u90f5\u90f6\u90f7\u90f8\u90f9\u90fa\u90fb\u90fc\u90fd\u90fe\u90ff\u9100\u9101\u9102\u9103\u9104\u9105\u9106\u9107\u9108\u9109\u910a\u910b\u910c\u910d\u910e\u910f\u9110\u9111\u9112\u9113\u9114\u9115\u9116\u9117\u9118\u9119\u911a\u911b\u911c\u911d\u911e\u911f\u9120\u9121\u9122\u9123\u9124\u9125\u9126\u9127\u9128\u9129\u912a\u912b\u912c\u912d\u912e\u912f\u9130\u9131\u9132\u9133\u9134\u9135\u9136\u9137\u9138\u9139\u913a\u913b\u913c\u913d\u913e\u913f\u9140\u9141\u9142\u9143\u9144\u9145\u9146\u9147\u9148\u9149\u914a\u914b\u914c\u914d\u914e\u914f\u9150\u9151\u9152\u9153\u9154\u9155\u9156\u9157\u9158\u9159\u915a\u915b\u915c\u915d\u915e\u915f\u9160\u9161\u9162\u9163\u9164\u9165\u9166\u9167\u9168\u9169\u916a\u916b\u916c\u916d\u916e\u916f\u9170\u9171\u9172\u9173\u9174\u9175\u9176\u9177\u9178\u9179\u917a\u917b\u917c\u917d\u917e\u917f\u9180\u9181\u9182\u9183\u9184\u9185\u9186\u9187\u9188\u9189\u918a\u918b\u918c\u918d\u918e\u918f\u9190\u9191\u9192\u9193\u9194\u9195\u9196\u9197\u9198\u9199\u919a\u919b\u919c\u919d\u919e\u919f\u91a0\u91a1\u91a2\u91a3\u91a4\u91a5\u91a6\u91a7\u91a8\u91a9\u91aa\u91ab\u91ac\u91ad\u91ae\u91af\u91b0\u91b1\u91b2\u91b3\u91b4\u91b5\u91b6\u91b7\u91b8\u91b9\u91ba\u91bb\u91bc\u91bd\u91be\u91bf\u91c0\u91c1\u91c2\u91c3\u91c4\u91c5\u91c6\u91c7\u91c8\u91c9\u91ca\u91cb\u91cc\u91cd\u91ce\u91cf\u91d0\u91d1\u91d2\u91d3\u91d4\u91d5\u91d6\u91d7\u91d8\u91d9\u91da\u91db\u91dc\u91dd\u91de\u91df\u91e0\u91e1\u91e2\u91e3\u91e4\u91e5\u91e6\u91e7\u91e8\u91e9\u91ea\u91eb\u91ec\u91ed\u91ee\u91ef\u91f0\u91f1\u91f2\u91f3\u91f4\u91f5\u91f6\u91f7\u91f8\u91f9\u91fa\u91fb\u91fc\u91fd\u91fe\u91ff\u9200\u9201\u9202\u9203\u9204\u9205\u9206\u9207\u9208\u9209\u920a\u920b\u920c\u920d\u920e\u920f\u9210\u9211\u9212\u9213\u9214\u9215\u9216\u9217\u9218\u9219\u921a\u921b\u921c\u921d\u921e\u921f\u9220\u9221\u9222\u9223\u9224\u9225\u9226\u9227\u9228\u9229\u922a\u922b\u922c\u922d\u922e\u922f\u9230\u9231\u9232\u9233\u9234\u9235\u9236\u9237\u9238\u9239\u923a\u923b\u923c\u923d\u923e\u923f\u9240\u9241\u9242\u9243\u9244\u9245\u9246\u9247\u9248\u9249\u924a\u924b\u924c\u924d\u924e\u924f\u9250\u9251\u9252\u9253\u9254\u9255\u9256\u9257\u9258\u9259\u925a\u925b\u925c\u925d\u925e\u925f\u9260\u9261\u9262\u9263\u9264\u9265\u9266\u9267\u9268\u9269\u926a\u926b\u926c\u926d\u926e\u926f\u9270\u9271\u9272\u9273\u9274\u9275\u9276\u9277\u9278\u9279\u927a\u927b\u927c\u927d\u927e\u927f\u9280\u9281\u9282\u9283\u9284\u9285\u9286\u9287\u9288\u9289\u928a\u928b\u928c\u928d\u928e\u928f\u9290\u9291\u9292\u9293\u9294\u9295\u9296\u9297\u9298\u9299\u929a\u929b\u929c\u929d\u929e\u929f\u92a0\u92a1\u92a2\u92a3\u92a4\u92a5\u92a6\u92a7\u92a8\u92a9\u92aa\u92ab\u92ac\u92ad\u92ae\u92af\u92b0\u92b1\u92b2\u92b3\u92b4\u92b5\u92b6\u92b7\u92b8\u92b9\u92ba\u92bb\u92bc\u92bd\u92be\u92bf\u92c0\u92c1\u92c2\u92c3\u92c4\u92c5\u92c6\u92c7\u92c8\u92c9\u92ca\u92cb\u92cc\u92cd\u92ce\u92cf\u92d0\u92d1\u92d2\u92d3\u92d4\u92d5\u92d6\u92d7\u92d8\u92d9\u92da\u92db\u92dc\u92dd\u92de\u92df\u92e0\u92e1\u92e2\u92e3\u92e4\u92e5\u92e6\u92e7\u92e8\u92e9\u92ea\u92eb\u92ec\u92ed\u92ee\u92ef\u92f0\u92f1\u92f2\u92f3\u92f4\u92f5\u92f6\u92f7\u92f8\u92f9\u92fa\u92fb\u92fc\u92fd\u92fe\u92ff\u9300\u9301\u9302\u9303\u9304\u9305\u9306\u9307\u9308\u9309\u930a\u930b\u930c\u930d\u930e\u930f\u9310\u9311\u9312\u9313\u9314\u9315\u9316\u9317\u9318\u9319\u931a\u931b\u931c\u931d\u931e\u931f\u9320\u9321\u9322\u9323\u9324\u9325\u9326\u9327\u9328\u9329\u932a\u932b\u932c\u932d\u932e\u932f\u9330\u9331\u9332\u9333\u9334\u9335\u9336\u9337\u9338\u9339\u933a\u933b\u933c\u933d\u933e\u933f\u9340\u9341\u9342\u9343\u9344\u9345\u9346\u9347\u9348\u9349\u934a\u934b\u934c\u934d\u934e\u934f\u9350\u9351\u9352\u9353\u9354\u9355\u9356\u9357\u9358\u9359\u935a\u935b\u935c\u935d\u935e\u935f\u9360\u9361\u9362\u9363\u9364\u9365\u9366\u9367\u9368\u9369\u936a\u936b\u936c\u936d\u936e\u936f\u9370\u9371\u9372\u9373\u9374\u9375\u9376\u9377\u9378\u9379\u937a\u937b\u937c\u937d\u937e\u937f\u9380\u9381\u9382\u9383\u9384\u9385\u9386\u9387\u9388\u9389\u938a\u938b\u938c\u938d\u938e\u938f\u9390\u9391\u9392\u9393\u9394\u9395\u9396\u9397\u9398\u9399\u939a\u939b\u939c\u939d\u939e\u939f\u93a0\u93a1\u93a2\u93a3\u93a4\u93a5\u93a6\u93a7\u93a8\u93a9\u93aa\u93ab\u93ac\u93ad\u93ae\u93af\u93b0\u93b1\u93b2\u93b3\u93b4\u93b5\u93b6\u93b7\u93b8\u93b9\u93ba\u93bb\u93bc\u93bd\u93be\u93bf\u93c0\u93c1\u93c2\u93c3\u93c4\u93c5\u93c6\u93c7\u93c8\u93c9\u93ca\u93cb\u93cc\u93cd\u93ce\u93cf\u93d0\u93d1\u93d2\u93d3\u93d4\u93d5\u93d6\u93d7\u93d8\u93d9\u93da\u93db\u93dc\u93dd\u93de\u93df\u93e0\u93e1\u93e2\u93e3\u93e4\u93e5\u93e6\u93e7\u93e8\u93e9\u93ea\u93eb\u93ec\u93ed\u93ee\u93ef\u93f0\u93f1\u93f2\u93f3\u93f4\u93f5\u93f6\u93f7\u93f8\u93f9\u93fa\u93fb\u93fc\u93fd\u93fe\u93ff\u9400\u9401\u9402\u9403\u9404\u9405\u9406\u9407\u9408\u9409\u940a\u940b\u940c\u940d\u940e\u940f\u9410\u9411\u9412\u9413\u9414\u9415\u9416\u9417\u9418\u9419\u941a\u941b\u941c\u941d\u941e\u941f\u9420\u9421\u9422\u9423\u9424\u9425\u9426\u9427\u9428\u9429\u942a\u942b\u942c\u942d\u942e\u942f\u9430\u9431\u9432\u9433\u9434\u9435\u9436\u9437\u9438\u9439\u943a\u943b\u943c\u943d\u943e\u943f\u9440\u9441\u9442\u9443\u9444\u9445\u9446\u9447\u9448\u9449\u944a\u944b\u944c\u944d\u944e\u944f\u9450\u9451\u9452\u9453\u9454\u9455\u9456\u9457\u9458\u9459\u945a\u945b\u945c\u945d\u945e\u945f\u9460\u9461\u9462\u9463\u9464\u9465\u9466\u9467\u9468\u9469\u946a\u946b\u946c\u946d\u946e\u946f\u9470\u9471\u9472\u9473\u9474\u9475\u9476\u9477\u9478\u9479\u947a\u947b\u947c\u947d\u947e\u947f\u9480\u9481\u9482\u9483\u9484\u9485\u9486\u9487\u9488\u9489\u948a\u948b\u948c\u948d\u948e\u948f\u9490\u9491\u9492\u9493\u9494\u9495\u9496\u9497\u9498\u9499\u949a\u949b\u949c\u949d\u949e\u949f\u94a0\u94a1\u94a2\u94a3\u94a4\u94a5\u94a6\u94a7\u94a8\u94a9\u94aa\u94ab\u94ac\u94ad\u94ae\u94af\u94b0\u94b1\u94b2\u94b3\u94b4\u94b5\u94b6\u94b7\u94b8\u94b9\u94ba\u94bb\u94bc\u94bd\u94be\u94bf\u94c0\u94c1\u94c2\u94c3\u94c4\u94c5\u94c6\u94c7\u94c8\u94c9\u94ca\u94cb\u94cc\u94cd\u94ce\u94cf\u94d0\u94d1\u94d2\u94d3\u94d4\u94d5\u94d6\u94d7\u94d8\u94d9\u94da\u94db\u94dc\u94dd\u94de\u94df\u94e0\u94e1\u94e2\u94e3\u94e4\u94e5\u94e6\u94e7\u94e8\u94e9\u94ea\u94eb\u94ec\u94ed\u94ee\u94ef\u94f0\u94f1\u94f2\u94f3\u94f4\u94f5\u94f6\u94f7\u94f8\u94f9\u94fa\u94fb\u94fc\u94fd\u94fe\u94ff\u9500\u9501\u9502\u9503\u9504\u9505\u9506\u9507\u9508\u9509\u950a\u950b\u950c\u950d\u950e\u950f\u9510\u9511\u9512\u9513\u9514\u9515\u9516\u9517\u9518\u9519\u951a\u951b\u951c\u951d\u951e\u951f\u9520\u9521\u9522\u9523\u9524\u9525\u9526\u9527\u9528\u9529\u952a\u952b\u952c\u952d\u952e\u952f\u9530\u9531\u9532\u9533\u9534\u9535\u9536\u9537\u9538\u9539\u953a\u953b\u953c\u953d\u953e\u953f\u9540\u9541\u9542\u9543\u9544\u9545\u9546\u9547\u9548\u9549\u954a\u954b\u954c\u954d\u954e\u954f\u9550\u9551\u9552\u9553\u9554\u9555\u9556\u9557\u9558\u9559\u955a\u955b\u955c\u955d\u955e\u955f\u9560\u9561\u9562\u9563\u9564\u9565\u9566\u9567\u9568\u9569\u956a\u956b\u956c\u956d\u956e\u956f\u9570\u9571\u9572\u9573\u9574\u9575\u9576\u9577\u9578\u9579\u957a\u957b\u957c\u957d\u957e\u957f\u9580\u9581\u9582\u9583\u9584\u9585\u9586\u9587\u9588\u9589\u958a\u958b\u958c\u958d\u958e\u958f\u9590\u9591\u9592\u9593\u9594\u9595\u9596\u9597\u9598\u9599\u959a\u959b\u959c\u959d\u959e\u959f\u95a0\u95a1\u95a2\u95a3\u95a4\u95a5\u95a6\u95a7\u95a8\u95a9\u95aa\u95ab\u95ac\u95ad\u95ae\u95af\u95b0\u95b1\u95b2\u95b3\u95b4\u95b5\u95b6\u95b7\u95b8\u95b9\u95ba\u95bb\u95bc\u95bd\u95be\u95bf\u95c0\u95c1\u95c2\u95c3\u95c4\u95c5\u95c6\u95c7\u95c8\u95c9\u95ca\u95cb\u95cc\u95cd\u95ce\u95cf\u95d0\u95d1\u95d2\u95d3\u95d4\u95d5\u95d6\u95d7\u95d8\u95d9\u95da\u95db\u95dc\u95dd\u95de\u95df\u95e0\u95e1\u95e2\u95e3\u95e4\u95e5\u95e6\u95e7\u95e8\u95e9\u95ea\u95eb\u95ec\u95ed\u95ee\u95ef\u95f0\u95f1\u95f2\u95f3\u95f4\u95f5\u95f6\u95f7\u95f8\u95f9\u95fa\u95fb\u95fc\u95fd\u95fe\u95ff\u9600\u9601\u9602\u9603\u9604\u9605\u9606\u9607\u9608\u9609\u960a\u960b\u960c\u960d\u960e\u960f\u9610\u9611\u9612\u9613\u9614\u9615\u9616\u9617\u9618\u9619\u961a\u961b\u961c\u961d\u961e\u961f\u9620\u9621\u9622\u9623\u9624\u9625\u9626\u9627\u9628\u9629\u962a\u962b\u962c\u962d\u962e\u962f\u9630\u9631\u9632\u9633\u9634\u9635\u9636\u9637\u9638\u9639\u963a\u963b\u963c\u963d\u963e\u963f\u9640\u9641\u9642\u9643\u9644\u9645\u9646\u9647\u9648\u9649\u964a\u964b\u964c\u964d\u964e\u964f\u9650\u9651\u9652\u9653\u9654\u9655\u9656\u9657\u9658\u9659\u965a\u965b\u965c\u965d\u965e\u965f\u9660\u9661\u9662\u9663\u9664\u9665\u9666\u9667\u9668\u9669\u966a\u966b\u966c\u966d\u966e\u966f\u9670\u9671\u9672\u9673\u9674\u9675\u9676\u9677\u9678\u9679\u967a\u967b\u967c\u967d\u967e\u967f\u9680\u9681\u9682\u9683\u9684\u9685\u9686\u9687\u9688\u9689\u968a\u968b\u968c\u968d\u968e\u968f\u9690\u9691\u9692\u9693\u9694\u9695\u9696\u9697\u9698\u9699\u969a\u969b\u969c\u969d\u969e\u969f\u96a0\u96a1\u96a2\u96a3\u96a4\u96a5\u96a6\u96a7\u96a8\u96a9\u96aa\u96ab\u96ac\u96ad\u96ae\u96af\u96b0\u96b1\u96b2\u96b3\u96b4\u96b5\u96b6\u96b7\u96b8\u96b9\u96ba\u96bb\u96bc\u96bd\u96be\u96bf\u96c0\u96c1\u96c2\u96c3\u96c4\u96c5\u96c6\u96c7\u96c8\u96c9\u96ca\u96cb\u96cc\u96cd\u96ce\u96cf\u96d0\u96d1\u96d2\u96d3\u96d4\u96d5\u96d6\u96d7\u96d8\u96d9\u96da\u96db\u96dc\u96dd\u96de\u96df\u96e0\u96e1\u96e2\u96e3\u96e4\u96e5\u96e6\u96e7\u96e8\u96e9\u96ea\u96eb\u96ec\u96ed\u96ee\u96ef\u96f0\u96f1\u96f2\u96f3\u96f4\u96f5\u96f6\u96f7\u96f8\u96f9\u96fa\u96fb\u96fc\u96fd\u96fe\u96ff\u9700\u9701\u9702\u9703\u9704\u9705\u9706\u9707\u9708\u9709\u970a\u970b\u970c\u970d\u970e\u970f\u9710\u9711\u9712\u9713\u9714\u9715\u9716\u9717\u9718\u9719\u971a\u971b\u971c\u971d\u971e\u971f\u9720\u9721\u9722\u9723\u9724\u9725\u9726\u9727\u9728\u9729\u972a\u972b\u972c\u972d\u972e\u972f\u9730\u9731\u9732\u9733\u9734\u9735\u9736\u9737\u9738\u9739\u973a\u973b\u973c\u973d\u973e\u973f\u9740\u9741\u9742\u9743\u9744\u9745\u9746\u9747\u9748\u9749\u974a\u974b\u974c\u974d\u974e\u974f\u9750\u9751\u9752\u9753\u9754\u9755\u9756\u9757\u9758\u9759\u975a\u975b\u975c\u975d\u975e\u975f\u9760\u9761\u9762\u9763\u9764\u9765\u9766\u9767\u9768\u9769\u976a\u976b\u976c\u976d\u976e\u976f\u9770\u9771\u9772\u9773\u9774\u9775\u9776\u9777\u9778\u9779\u977a\u977b\u977c\u977d\u977e\u977f\u9780\u9781\u9782\u9783\u9784\u9785\u9786\u9787\u9788\u9789\u978a\u978b\u978c\u978d\u978e\u978f\u9790\u9791\u9792\u9793\u9794\u9795\u9796\u9797\u9798\u9799\u979a\u979b\u979c\u979d\u979e\u979f\u97a0\u97a1\u97a2\u97a3\u97a4\u97a5\u97a6\u97a7\u97a8\u97a9\u97aa\u97ab\u97ac\u97ad\u97ae\u97af\u97b0\u97b1\u97b2\u97b3\u97b4\u97b5\u97b6\u97b7\u97b8\u97b9\u97ba\u97bb\u97bc\u97bd\u97be\u97bf\u97c0\u97c1\u97c2\u97c3\u97c4\u97c5\u97c6\u97c7\u97c8\u97c9\u97ca\u97cb\u97cc\u97cd\u97ce\u97cf\u97d0\u97d1\u97d2\u97d3\u97d4\u97d5\u97d6\u97d7\u97d8\u97d9\u97da\u97db\u97dc\u97dd\u97de\u97df\u97e0\u97e1\u97e2\u97e3\u97e4\u97e5\u97e6\u97e7\u97e8\u97e9\u97ea\u97eb\u97ec\u97ed\u97ee\u97ef\u97f0\u97f1\u97f2\u97f3\u97f4\u97f5\u97f6\u97f7\u97f8\u97f9\u97fa\u97fb\u97fc\u97fd\u97fe\u97ff\u9800\u9801\u9802\u9803\u9804\u9805\u9806\u9807\u9808\u9809\u980a\u980b\u980c\u980d\u980e\u980f\u9810\u9811\u9812\u9813\u9814\u9815\u9816\u9817\u9818\u9819\u981a\u981b\u981c\u981d\u981e\u981f\u9820\u9821\u9822\u9823\u9824\u9825\u9826\u9827\u9828\u9829\u982a\u982b\u982c\u982d\u982e\u982f\u9830\u9831\u9832\u9833\u9834\u9835\u9836\u9837\u9838\u9839\u983a\u983b\u983c\u983d\u983e\u983f\u9840\u9841\u9842\u9843\u9844\u9845\u9846\u9847\u9848\u9849\u984a\u984b\u984c\u984d\u984e\u984f\u9850\u9851\u9852\u9853\u9854\u9855\u9856\u9857\u9858\u9859\u985a\u985b\u985c\u985d\u985e\u985f\u9860\u9861\u9862\u9863\u9864\u9865\u9866\u9867\u9868\u9869\u986a\u986b\u986c\u986d\u986e\u986f\u9870\u9871\u9872\u9873\u9874\u9875\u9876\u9877\u9878\u9879\u987a\u987b\u987c\u987d\u987e\u987f\u9880\u9881\u9882\u9883\u9884\u9885\u9886\u9887\u9888\u9889\u988a\u988b\u988c\u988d\u988e\u988f\u9890\u9891\u9892\u9893\u9894\u9895\u9896\u9897\u9898\u9899\u989a\u989b\u989c\u989d\u989e\u989f\u98a0\u98a1\u98a2\u98a3\u98a4\u98a5\u98a6\u98a7\u98a8\u98a9\u98aa\u98ab\u98ac\u98ad\u98ae\u98af\u98b0\u98b1\u98b2\u98b3\u98b4\u98b5\u98b6\u98b7\u98b8\u98b9\u98ba\u98bb\u98bc\u98bd\u98be\u98bf\u98c0\u98c1\u98c2\u98c3\u98c4\u98c5\u98c6\u98c7\u98c8\u98c9\u98ca\u98cb\u98cc\u98cd\u98ce\u98cf\u98d0\u98d1\u98d2\u98d3\u98d4\u98d5\u98d6\u98d7\u98d8\u98d9\u98da\u98db\u98dc\u98dd\u98de\u98df\u98e0\u98e1\u98e2\u98e3\u98e4\u98e5\u98e6\u98e7\u98e8\u98e9\u98ea\u98eb\u98ec\u98ed\u98ee\u98ef\u98f0\u98f1\u98f2\u98f3\u98f4\u98f5\u98f6\u98f7\u98f8\u98f9\u98fa\u98fb\u98fc\u98fd\u98fe\u98ff\u9900\u9901\u9902\u9903\u9904\u9905\u9906\u9907\u9908\u9909\u990a\u990b\u990c\u990d\u990e\u990f\u9910\u9911\u9912\u9913\u9914\u9915\u9916\u9917\u9918\u9919\u991a\u991b\u991c\u991d\u991e\u991f\u9920\u9921\u9922\u9923\u9924\u9925\u9926\u9927\u9928\u9929\u992a\u992b\u992c\u992d\u992e\u992f\u9930\u9931\u9932\u9933\u9934\u9935\u9936\u9937\u9938\u9939\u993a\u993b\u993c\u993d\u993e\u993f\u9940\u9941\u9942\u9943\u9944\u9945\u9946\u9947\u9948\u9949\u994a\u994b\u994c\u994d\u994e\u994f\u9950\u9951\u9952\u9953\u9954\u9955\u9956\u9957\u9958\u9959\u995a\u995b\u995c\u995d\u995e\u995f\u9960\u9961\u9962\u9963\u9964\u9965\u9966\u9967\u9968\u9969\u996a\u996b\u996c\u996d\u996e\u996f\u9970\u9971\u9972\u9973\u9974\u9975\u9976\u9977\u9978\u9979\u997a\u997b\u997c\u997d\u997e\u997f\u9980\u9981\u9982\u9983\u9984\u9985\u9986\u9987\u9988\u9989\u998a\u998b\u998c\u998d\u998e\u998f\u9990\u9991\u9992\u9993\u9994\u9995\u9996\u9997\u9998\u9999\u999a\u999b\u999c\u999d\u999e\u999f\u99a0\u99a1\u99a2\u99a3\u99a4\u99a5\u99a6\u99a7\u99a8\u99a9\u99aa\u99ab\u99ac\u99ad\u99ae\u99af\u99b0\u99b1\u99b2\u99b3\u99b4\u99b5\u99b6\u99b7\u99b8\u99b9\u99ba\u99bb\u99bc\u99bd\u99be\u99bf\u99c0\u99c1\u99c2\u99c3\u99c4\u99c5\u99c6\u99c7\u99c8\u99c9\u99ca\u99cb\u99cc\u99cd\u99ce\u99cf\u99d0\u99d1\u99d2\u99d3\u99d4\u99d5\u99d6\u99d7\u99d8\u99d9\u99da\u99db\u99dc\u99dd\u99de\u99df\u99e0\u99e1\u99e2\u99e3\u99e4\u99e5\u99e6\u99e7\u99e8\u99e9\u99ea\u99eb\u99ec\u99ed\u99ee\u99ef\u99f0\u99f1\u99f2\u99f3\u99f4\u99f5\u99f6\u99f7\u99f8\u99f9\u99fa\u99fb\u99fc\u99fd\u99fe\u99ff\u9a00\u9a01\u9a02\u9a03\u9a04\u9a05\u9a06\u9a07\u9a08\u9a09\u9a0a\u9a0b\u9a0c\u9a0d\u9a0e\u9a0f\u9a10\u9a11\u9a12\u9a13\u9a14\u9a15\u9a16\u9a17\u9a18\u9a19\u9a1a\u9a1b\u9a1c\u9a1d\u9a1e\u9a1f\u9a20\u9a21\u9a22\u9a23\u9a24\u9a25\u9a26\u9a27\u9a28\u9a29\u9a2a\u9a2b\u9a2c\u9a2d\u9a2e\u9a2f\u9a30\u9a31\u9a32\u9a33\u9a34\u9a35\u9a36\u9a37\u9a38\u9a39\u9a3a\u9a3b\u9a3c\u9a3d\u9a3e\u9a3f\u9a40\u9a41\u9a42\u9a43\u9a44\u9a45\u9a46\u9a47\u9a48\u9a49\u9a4a\u9a4b\u9a4c\u9a4d\u9a4e\u9a4f\u9a50\u9a51\u9a52\u9a53\u9a54\u9a55\u9a56\u9a57\u9a58\u9a59\u9a5a\u9a5b\u9a5c\u9a5d\u9a5e\u9a5f\u9a60\u9a61\u9a62\u9a63\u9a64\u9a65\u9a66\u9a67\u9a68\u9a69\u9a6a\u9a6b\u9a6c\u9a6d\u9a6e\u9a6f\u9a70\u9a71\u9a72\u9a73\u9a74\u9a75\u9a76\u9a77\u9a78\u9a79\u9a7a\u9a7b\u9a7c\u9a7d\u9a7e\u9a7f\u9a80\u9a81\u9a82\u9a83\u9a84\u9a85\u9a86\u9a87\u9a88\u9a89\u9a8a\u9a8b\u9a8c\u9a8d\u9a8e\u9a8f\u9a90\u9a91\u9a92\u9a93\u9a94\u9a95\u9a96\u9a97\u9a98\u9a99\u9a9a\u9a9b\u9a9c\u9a9d\u9a9e\u9a9f\u9aa0\u9aa1\u9aa2\u9aa3\u9aa4\u9aa5\u9aa6\u9aa7\u9aa8\u9aa9\u9aaa\u9aab\u9aac\u9aad\u9aae\u9aaf\u9ab0\u9ab1\u9ab2\u9ab3\u9ab4\u9ab5\u9ab6\u9ab7\u9ab8\u9ab9\u9aba\u9abb\u9abc\u9abd\u9abe\u9abf\u9ac0\u9ac1\u9ac2\u9ac3\u9ac4\u9ac5\u9ac6\u9ac7\u9ac8\u9ac9\u9aca\u9acb\u9acc\u9acd\u9ace\u9acf\u9ad0\u9ad1\u9ad2\u9ad3\u9ad4\u9ad5\u9ad6\u9ad7\u9ad8\u9ad9\u9ada\u9adb\u9adc\u9add\u9ade\u9adf\u9ae0\u9ae1\u9ae2\u9ae3\u9ae4\u9ae5\u9ae6\u9ae7\u9ae8\u9ae9\u9aea\u9aeb\u9aec\u9aed\u9aee\u9aef\u9af0\u9af1\u9af2\u9af3\u9af4\u9af5\u9af6\u9af7\u9af8\u9af9\u9afa\u9afb\u9afc\u9afd\u9afe\u9aff\u9b00\u9b01\u9b02\u9b03\u9b04\u9b05\u9b06\u9b07\u9b08\u9b09\u9b0a\u9b0b\u9b0c\u9b0d\u9b0e\u9b0f\u9b10\u9b11\u9b12\u9b13\u9b14\u9b15\u9b16\u9b17\u9b18\u9b19\u9b1a\u9b1b\u9b1c\u9b1d\u9b1e\u9b1f\u9b20\u9b21\u9b22\u9b23\u9b24\u9b25\u9b26\u9b27\u9b28\u9b29\u9b2a\u9b2b\u9b2c\u9b2d\u9b2e\u9b2f\u9b30\u9b31\u9b32\u9b33\u9b34\u9b35\u9b36\u9b37\u9b38\u9b39\u9b3a\u9b3b\u9b3c\u9b3d\u9b3e\u9b3f\u9b40\u9b41\u9b42\u9b43\u9b44\u9b45\u9b46\u9b47\u9b48\u9b49\u9b4a\u9b4b\u9b4c\u9b4d\u9b4e\u9b4f\u9b50\u9b51\u9b52\u9b53\u9b54\u9b55\u9b56\u9b57\u9b58\u9b59\u9b5a\u9b5b\u9b5c\u9b5d\u9b5e\u9b5f\u9b60\u9b61\u9b62\u9b63\u9b64\u9b65\u9b66\u9b67\u9b68\u9b69\u9b6a\u9b6b\u9b6c\u9b6d\u9b6e\u9b6f\u9b70\u9b71\u9b72\u9b73\u9b74\u9b75\u9b76\u9b77\u9b78\u9b79\u9b7a\u9b7b\u9b7c\u9b7d\u9b7e\u9b7f\u9b80\u9b81\u9b82\u9b83\u9b84\u9b85\u9b86\u9b87\u9b88\u9b89\u9b8a\u9b8b\u9b8c\u9b8d\u9b8e\u9b8f\u9b90\u9b91\u9b92\u9b93\u9b94\u9b95\u9b96\u9b97\u9b98\u9b99\u9b9a\u9b9b\u9b9c\u9b9d\u9b9e\u9b9f\u9ba0\u9ba1\u9ba2\u9ba3\u9ba4\u9ba5\u9ba6\u9ba7\u9ba8\u9ba9\u9baa\u9bab\u9bac\u9bad\u9bae\u9baf\u9bb0\u9bb1\u9bb2\u9bb3\u9bb4\u9bb5\u9bb6\u9bb7\u9bb8\u9bb9\u9bba\u9bbb\u9bbc\u9bbd\u9bbe\u9bbf\u9bc0\u9bc1\u9bc2\u9bc3\u9bc4\u9bc5\u9bc6\u9bc7\u9bc8\u9bc9\u9bca\u9bcb\u9bcc\u9bcd\u9bce\u9bcf\u9bd0\u9bd1\u9bd2\u9bd3\u9bd4\u9bd5\u9bd6\u9bd7\u9bd8\u9bd9\u9bda\u9bdb\u9bdc\u9bdd\u9bde\u9bdf\u9be0\u9be1\u9be2\u9be3\u9be4\u9be5\u9be6\u9be7\u9be8\u9be9\u9bea\u9beb\u9bec\u9bed\u9bee\u9bef\u9bf0\u9bf1\u9bf2\u9bf3\u9bf4\u9bf5\u9bf6\u9bf7\u9bf8\u9bf9\u9bfa\u9bfb\u9bfc\u9bfd\u9bfe\u9bff\u9c00\u9c01\u9c02\u9c03\u9c04\u9c05\u9c06\u9c07\u9c08\u9c09\u9c0a\u9c0b\u9c0c\u9c0d\u9c0e\u9c0f\u9c10\u9c11\u9c12\u9c13\u9c14\u9c15\u9c16\u9c17\u9c18\u9c19\u9c1a\u9c1b\u9c1c\u9c1d\u9c1e\u9c1f\u9c20\u9c21\u9c22\u9c23\u9c24\u9c25\u9c26\u9c27\u9c28\u9c29\u9c2a\u9c2b\u9c2c\u9c2d\u9c2e\u9c2f\u9c30\u9c31\u9c32\u9c33\u9c34\u9c35\u9c36\u9c37\u9c38\u9c39\u9c3a\u9c3b\u9c3c\u9c3d\u9c3e\u9c3f\u9c40\u9c41\u9c42\u9c43\u9c44\u9c45\u9c46\u9c47\u9c48\u9c49\u9c4a\u9c4b\u9c4c\u9c4d\u9c4e\u9c4f\u9c50\u9c51\u9c52\u9c53\u9c54\u9c55\u9c56\u9c57\u9c58\u9c59\u9c5a\u9c5b\u9c5c\u9c5d\u9c5e\u9c5f\u9c60\u9c61\u9c62\u9c63\u9c64\u9c65\u9c66\u9c67\u9c68\u9c69\u9c6a\u9c6b\u9c6c\u9c6d\u9c6e\u9c6f\u9c70\u9c71\u9c72\u9c73\u9c74\u9c75\u9c76\u9c77\u9c78\u9c79\u9c7a\u9c7b\u9c7c\u9c7d\u9c7e\u9c7f\u9c80\u9c81\u9c82\u9c83\u9c84\u9c85\u9c86\u9c87\u9c88\u9c89\u9c8a\u9c8b\u9c8c\u9c8d\u9c8e\u9c8f\u9c90\u9c91\u9c92\u9c93\u9c94\u9c95\u9c96\u9c97\u9c98\u9c99\u9c9a\u9c9b\u9c9c\u9c9d\u9c9e\u9c9f\u9ca0\u9ca1\u9ca2\u9ca3\u9ca4\u9ca5\u9ca6\u9ca7\u9ca8\u9ca9\u9caa\u9cab\u9cac\u9cad\u9cae\u9caf\u9cb0\u9cb1\u9cb2\u9cb3\u9cb4\u9cb5\u9cb6\u9cb7\u9cb8\u9cb9\u9cba\u9cbb\u9cbc\u9cbd\u9cbe\u9cbf\u9cc0\u9cc1\u9cc2\u9cc3\u9cc4\u9cc5\u9cc6\u9cc7\u9cc8\u9cc9\u9cca\u9ccb\u9ccc\u9ccd\u9cce\u9ccf\u9cd0\u9cd1\u9cd2\u9cd3\u9cd4\u9cd5\u9cd6\u9cd7\u9cd8\u9cd9\u9cda\u9cdb\u9cdc\u9cdd\u9cde\u9cdf\u9ce0\u9ce1\u9ce2\u9ce3\u9ce4\u9ce5\u9ce6\u9ce7\u9ce8\u9ce9\u9cea\u9ceb\u9cec\u9ced\u9cee\u9cef\u9cf0\u9cf1\u9cf2\u9cf3\u9cf4\u9cf5\u9cf6\u9cf7\u9cf8\u9cf9\u9cfa\u9cfb\u9cfc\u9cfd\u9cfe\u9cff\u9d00\u9d01\u9d02\u9d03\u9d04\u9d05\u9d06\u9d07\u9d08\u9d09\u9d0a\u9d0b\u9d0c\u9d0d\u9d0e\u9d0f\u9d10\u9d11\u9d12\u9d13\u9d14\u9d15\u9d16\u9d17\u9d18\u9d19\u9d1a\u9d1b\u9d1c\u9d1d\u9d1e\u9d1f\u9d20\u9d21\u9d22\u9d23\u9d24\u9d25\u9d26\u9d27\u9d28\u9d29\u9d2a\u9d2b\u9d2c\u9d2d\u9d2e\u9d2f\u9d30\u9d31\u9d32\u9d33\u9d34\u9d35\u9d36\u9d37\u9d38\u9d39\u9d3a\u9d3b\u9d3c\u9d3d\u9d3e\u9d3f\u9d40\u9d41\u9d42\u9d43\u9d44\u9d45\u9d46\u9d47\u9d48\u9d49\u9d4a\u9d4b\u9d4c\u9d4d\u9d4e\u9d4f\u9d50\u9d51\u9d52\u9d53\u9d54\u9d55\u9d56\u9d57\u9d58\u9d59\u9d5a\u9d5b\u9d5c\u9d5d\u9d5e\u9d5f\u9d60\u9d61\u9d62\u9d63\u9d64\u9d65\u9d66\u9d67\u9d68\u9d69\u9d6a\u9d6b\u9d6c\u9d6d\u9d6e\u9d6f\u9d70\u9d71\u9d72\u9d73\u9d74\u9d75\u9d76\u9d77\u9d78\u9d79\u9d7a\u9d7b\u9d7c\u9d7d\u9d7e\u9d7f\u9d80\u9d81\u9d82\u9d83\u9d84\u9d85\u9d86\u9d87\u9d88\u9d89\u9d8a\u9d8b\u9d8c\u9d8d\u9d8e\u9d8f\u9d90\u9d91\u9d92\u9d93\u9d94\u9d95\u9d96\u9d97\u9d98\u9d99\u9d9a\u9d9b\u9d9c\u9d9d\u9d9e\u9d9f\u9da0\u9da1\u9da2\u9da3\u9da4\u9da5\u9da6\u9da7\u9da8\u9da9\u9daa\u9dab\u9dac\u9dad\u9dae\u9daf\u9db0\u9db1\u9db2\u9db3\u9db4\u9db5\u9db6\u9db7\u9db8\u9db9\u9dba\u9dbb\u9dbc\u9dbd\u9dbe\u9dbf\u9dc0\u9dc1\u9dc2\u9dc3\u9dc4\u9dc5\u9dc6\u9dc7\u9dc8\u9dc9\u9dca\u9dcb\u9dcc\u9dcd\u9dce\u9dcf\u9dd0\u9dd1\u9dd2\u9dd3\u9dd4\u9dd5\u9dd6\u9dd7\u9dd8\u9dd9\u9dda\u9ddb\u9ddc\u9ddd\u9dde\u9ddf\u9de0\u9de1\u9de2\u9de3\u9de4\u9de5\u9de6\u9de7\u9de8\u9de9\u9dea\u9deb\u9dec\u9ded\u9dee\u9def\u9df0\u9df1\u9df2\u9df3\u9df4\u9df5\u9df6\u9df7\u9df8\u9df9\u9dfa\u9dfb\u9dfc\u9dfd\u9dfe\u9dff\u9e00\u9e01\u9e02\u9e03\u9e04\u9e05\u9e06\u9e07\u9e08\u9e09\u9e0a\u9e0b\u9e0c\u9e0d\u9e0e\u9e0f\u9e10\u9e11\u9e12\u9e13\u9e14\u9e15\u9e16\u9e17\u9e18\u9e19\u9e1a\u9e1b\u9e1c\u9e1d\u9e1e\u9e1f\u9e20\u9e21\u9e22\u9e23\u9e24\u9e25\u9e26\u9e27\u9e28\u9e29\u9e2a\u9e2b\u9e2c\u9e2d\u9e2e\u9e2f\u9e30\u9e31\u9e32\u9e33\u9e34\u9e35\u9e36\u9e37\u9e38\u9e39\u9e3a\u9e3b\u9e3c\u9e3d\u9e3e\u9e3f\u9e40\u9e41\u9e42\u9e43\u9e44\u9e45\u9e46\u9e47\u9e48\u9e49\u9e4a\u9e4b\u9e4c\u9e4d\u9e4e\u9e4f\u9e50\u9e51\u9e52\u9e53\u9e54\u9e55\u9e56\u9e57\u9e58\u9e59\u9e5a\u9e5b\u9e5c\u9e5d\u9e5e\u9e5f\u9e60\u9e61\u9e62\u9e63\u9e64\u9e65\u9e66\u9e67\u9e68\u9e69\u9e6a\u9e6b\u9e6c\u9e6d\u9e6e\u9e6f\u9e70\u9e71\u9e72\u9e73\u9e74\u9e75\u9e76\u9e77\u9e78\u9e79\u9e7a\u9e7b\u9e7c\u9e7d\u9e7e\u9e7f\u9e80\u9e81\u9e82\u9e83\u9e84\u9e85\u9e86\u9e87\u9e88\u9e89\u9e8a\u9e8b\u9e8c\u9e8d\u9e8e\u9e8f\u9e90\u9e91\u9e92\u9e93\u9e94\u9e95\u9e96\u9e97\u9e98\u9e99\u9e9a\u9e9b\u9e9c\u9e9d\u9e9e\u9e9f\u9ea0\u9ea1\u9ea2\u9ea3\u9ea4\u9ea5\u9ea6\u9ea7\u9ea8\u9ea9\u9eaa\u9eab\u9eac\u9ead\u9eae\u9eaf\u9eb0\u9eb1\u9eb2\u9eb3\u9eb4\u9eb5\u9eb6\u9eb7\u9eb8\u9eb9\u9eba\u9ebb\u9ebc\u9ebd\u9ebe\u9ebf\u9ec0\u9ec1\u9ec2\u9ec3\u9ec4\u9ec5\u9ec6\u9ec7\u9ec8\u9ec9\u9eca\u9ecb\u9ecc\u9ecd\u9ece\u9ecf\u9ed0\u9ed1\u9ed2\u9ed3\u9ed4\u9ed5\u9ed6\u9ed7\u9ed8\u9ed9\u9eda\u9edb\u9edc\u9edd\u9ede\u9edf\u9ee0\u9ee1\u9ee2\u9ee3\u9ee4\u9ee5\u9ee6\u9ee7\u9ee8\u9ee9\u9eea\u9eeb\u9eec\u9eed\u9eee\u9eef\u9ef0\u9ef1\u9ef2\u9ef3\u9ef4\u9ef5\u9ef6\u9ef7\u9ef8\u9ef9\u9efa\u9efb\u9efc\u9efd\u9efe\u9eff\u9f00\u9f01\u9f02\u9f03\u9f04\u9f05\u9f06\u9f07\u9f08\u9f09\u9f0a\u9f0b\u9f0c\u9f0d\u9f0e\u9f0f\u9f10\u9f11\u9f12\u9f13\u9f14\u9f15\u9f16\u9f17\u9f18\u9f19\u9f1a\u9f1b\u9f1c\u9f1d\u9f1e\u9f1f\u9f20\u9f21\u9f22\u9f23\u9f24\u9f25\u9f26\u9f27\u9f28\u9f29\u9f2a\u9f2b\u9f2c\u9f2d\u9f2e\u9f2f\u9f30\u9f31\u9f32\u9f33\u9f34\u9f35\u9f36\u9f37\u9f38\u9f39\u9f3a\u9f3b\u9f3c\u9f3d\u9f3e\u9f3f\u9f40\u9f41\u9f42\u9f43\u9f44\u9f45\u9f46\u9f47\u9f48\u9f49\u9f4a\u9f4b\u9f4c\u9f4d\u9f4e\u9f4f\u9f50\u9f51\u9f52\u9f53\u9f54\u9f55\u9f56\u9f57\u9f58\u9f59\u9f5a\u9f5b\u9f5c\u9f5d\u9f5e\u9f5f\u9f60\u9f61\u9f62\u9f63\u9f64\u9f65\u9f66\u9f67\u9f68\u9f69\u9f6a\u9f6b\u9f6c\u9f6d\u9f6e\u9f6f\u9f70\u9f71\u9f72\u9f73\u9f74\u9f75\u9f76\u9f77\u9f78\u9f79\u9f7a\u9f7b\u9f7c\u9f7d\u9f7e\u9f7f\u9f80\u9f81\u9f82\u9f83\u9f84\u9f85\u9f86\u9f87\u9f88\u9f89\u9f8a\u9f8b\u9f8c\u9f8d\u9f8e\u9f8f\u9f90\u9f91\u9f92\u9f93\u9f94\u9f95\u9f96\u9f97\u9f98\u9f99\u9f9a\u9f9b\u9f9c\u9f9d\u9f9e\u9f9f\u9fa0\u9fa1\u9fa2\u9fa3\u9fa4\u9fa5\u9fa6\u9fa7\u9fa8\u9fa9\u9faa\u9fab\u9fac\u9fad\u9fae\u9faf\u9fb0\u9fb1\u9fb2\u9fb3\u9fb4\u9fb5\u9fb6\u9fb7\u9fb8\u9fb9\u9fba\u9fbb\ua000\ua001\ua002\ua003\ua004\ua005\ua006\ua007\ua008\ua009\ua00a\ua00b\ua00c\ua00d\ua00e\ua00f\ua010\ua011\ua012\ua013\ua014\ua016\ua017\ua018\ua019\ua01a\ua01b\ua01c\ua01d\ua01e\ua01f\ua020\ua021\ua022\ua023\ua024\ua025\ua026\ua027\ua028\ua029\ua02a\ua02b\ua02c\ua02d\ua02e\ua02f\ua030\ua031\ua032\ua033\ua034\ua035\ua036\ua037\ua038\ua039\ua03a\ua03b\ua03c\ua03d\ua03e\ua03f\ua040\ua041\ua042\ua043\ua044\ua045\ua046\ua047\ua048\ua049\ua04a\ua04b\ua04c\ua04d\ua04e\ua04f\ua050\ua051\ua052\ua053\ua054\ua055\ua056\ua057\ua058\ua059\ua05a\ua05b\ua05c\ua05d\ua05e\ua05f\ua060\ua061\ua062\ua063\ua064\ua065\ua066\ua067\ua068\ua069\ua06a\ua06b\ua06c\ua06d\ua06e\ua06f\ua070\ua071\ua072\ua073\ua074\ua075\ua076\ua077\ua078\ua079\ua07a\ua07b\ua07c\ua07d\ua07e\ua07f\ua080\ua081\ua082\ua083\ua084\ua085\ua086\ua087\ua088\ua089\ua08a\ua08b\ua08c\ua08d\ua08e\ua08f\ua090\ua091\ua092\ua093\ua094\ua095\ua096\ua097\ua098\ua099\ua09a\ua09b\ua09c\ua09d\ua09e\ua09f\ua0a0\ua0a1\ua0a2\ua0a3\ua0a4\ua0a5\ua0a6\ua0a7\ua0a8\ua0a9\ua0aa\ua0ab\ua0ac\ua0ad\ua0ae\ua0af\ua0b0\ua0b1\ua0b2\ua0b3\ua0b4\ua0b5\ua0b6\ua0b7\ua0b8\ua0b9\ua0ba\ua0bb\ua0bc\ua0bd\ua0be\ua0bf\ua0c0\ua0c1\ua0c2\ua0c3\ua0c4\ua0c5\ua0c6\ua0c7\ua0c8\ua0c9\ua0ca\ua0cb\ua0cc\ua0cd\ua0ce\ua0cf\ua0d0\ua0d1\ua0d2\ua0d3\ua0d4\ua0d5\ua0d6\ua0d7\ua0d8\ua0d9\ua0da\ua0db\ua0dc\ua0dd\ua0de\ua0df\ua0e0\ua0e1\ua0e2\ua0e3\ua0e4\ua0e5\ua0e6\ua0e7\ua0e8\ua0e9\ua0ea\ua0eb\ua0ec\ua0ed\ua0ee\ua0ef\ua0f0\ua0f1\ua0f2\ua0f3\ua0f4\ua0f5\ua0f6\ua0f7\ua0f8\ua0f9\ua0fa\ua0fb\ua0fc\ua0fd\ua0fe\ua0ff\ua100\ua101\ua102\ua103\ua104\ua105\ua106\ua107\ua108\ua109\ua10a\ua10b\ua10c\ua10d\ua10e\ua10f\ua110\ua111\ua112\ua113\ua114\ua115\ua116\ua117\ua118\ua119\ua11a\ua11b\ua11c\ua11d\ua11e\ua11f\ua120\ua121\ua122\ua123\ua124\ua125\ua126\ua127\ua128\ua129\ua12a\ua12b\ua12c\ua12d\ua12e\ua12f\ua130\ua131\ua132\ua133\ua134\ua135\ua136\ua137\ua138\ua139\ua13a\ua13b\ua13c\ua13d\ua13e\ua13f\ua140\ua141\ua142\ua143\ua144\ua145\ua146\ua147\ua148\ua149\ua14a\ua14b\ua14c\ua14d\ua14e\ua14f\ua150\ua151\ua152\ua153\ua154\ua155\ua156\ua157\ua158\ua159\ua15a\ua15b\ua15c\ua15d\ua15e\ua15f\ua160\ua161\ua162\ua163\ua164\ua165\ua166\ua167\ua168\ua169\ua16a\ua16b\ua16c\ua16d\ua16e\ua16f\ua170\ua171\ua172\ua173\ua174\ua175\ua176\ua177\ua178\ua179\ua17a\ua17b\ua17c\ua17d\ua17e\ua17f\ua180\ua181\ua182\ua183\ua184\ua185\ua186\ua187\ua188\ua189\ua18a\ua18b\ua18c\ua18d\ua18e\ua18f\ua190\ua191\ua192\ua193\ua194\ua195\ua196\ua197\ua198\ua199\ua19a\ua19b\ua19c\ua19d\ua19e\ua19f\ua1a0\ua1a1\ua1a2\ua1a3\ua1a4\ua1a5\ua1a6\ua1a7\ua1a8\ua1a9\ua1aa\ua1ab\ua1ac\ua1ad\ua1ae\ua1af\ua1b0\ua1b1\ua1b2\ua1b3\ua1b4\ua1b5\ua1b6\ua1b7\ua1b8\ua1b9\ua1ba\ua1bb\ua1bc\ua1bd\ua1be\ua1bf\ua1c0\ua1c1\ua1c2\ua1c3\ua1c4\ua1c5\ua1c6\ua1c7\ua1c8\ua1c9\ua1ca\ua1cb\ua1cc\ua1cd\ua1ce\ua1cf\ua1d0\ua1d1\ua1d2\ua1d3\ua1d4\ua1d5\ua1d6\ua1d7\ua1d8\ua1d9\ua1da\ua1db\ua1dc\ua1dd\ua1de\ua1df\ua1e0\ua1e1\ua1e2\ua1e3\ua1e4\ua1e5\ua1e6\ua1e7\ua1e8\ua1e9\ua1ea\ua1eb\ua1ec\ua1ed\ua1ee\ua1ef\ua1f0\ua1f1\ua1f2\ua1f3\ua1f4\ua1f5\ua1f6\ua1f7\ua1f8\ua1f9\ua1fa\ua1fb\ua1fc\ua1fd\ua1fe\ua1ff\ua200\ua201\ua202\ua203\ua204\ua205\ua206\ua207\ua208\ua209\ua20a\ua20b\ua20c\ua20d\ua20e\ua20f\ua210\ua211\ua212\ua213\ua214\ua215\ua216\ua217\ua218\ua219\ua21a\ua21b\ua21c\ua21d\ua21e\ua21f\ua220\ua221\ua222\ua223\ua224\ua225\ua226\ua227\ua228\ua229\ua22a\ua22b\ua22c\ua22d\ua22e\ua22f\ua230\ua231\ua232\ua233\ua234\ua235\ua236\ua237\ua238\ua239\ua23a\ua23b\ua23c\ua23d\ua23e\ua23f\ua240\ua241\ua242\ua243\ua244\ua245\ua246\ua247\ua248\ua249\ua24a\ua24b\ua24c\ua24d\ua24e\ua24f\ua250\ua251\ua252\ua253\ua254\ua255\ua256\ua257\ua258\ua259\ua25a\ua25b\ua25c\ua25d\ua25e\ua25f\ua260\ua261\ua262\ua263\ua264\ua265\ua266\ua267\ua268\ua269\ua26a\ua26b\ua26c\ua26d\ua26e\ua26f\ua270\ua271\ua272\ua273\ua274\ua275\ua276\ua277\ua278\ua279\ua27a\ua27b\ua27c\ua27d\ua27e\ua27f\ua280\ua281\ua282\ua283\ua284\ua285\ua286\ua287\ua288\ua289\ua28a\ua28b\ua28c\ua28d\ua28e\ua28f\ua290\ua291\ua292\ua293\ua294\ua295\ua296\ua297\ua298\ua299\ua29a\ua29b\ua29c\ua29d\ua29e\ua29f\ua2a0\ua2a1\ua2a2\ua2a3\ua2a4\ua2a5\ua2a6\ua2a7\ua2a8\ua2a9\ua2aa\ua2ab\ua2ac\ua2ad\ua2ae\ua2af\ua2b0\ua2b1\ua2b2\ua2b3\ua2b4\ua2b5\ua2b6\ua2b7\ua2b8\ua2b9\ua2ba\ua2bb\ua2bc\ua2bd\ua2be\ua2bf\ua2c0\ua2c1\ua2c2\ua2c3\ua2c4\ua2c5\ua2c6\ua2c7\ua2c8\ua2c9\ua2ca\ua2cb\ua2cc\ua2cd\ua2ce\ua2cf\ua2d0\ua2d1\ua2d2\ua2d3\ua2d4\ua2d5\ua2d6\ua2d7\ua2d8\ua2d9\ua2da\ua2db\ua2dc\ua2dd\ua2de\ua2df\ua2e0\ua2e1\ua2e2\ua2e3\ua2e4\ua2e5\ua2e6\ua2e7\ua2e8\ua2e9\ua2ea\ua2eb\ua2ec\ua2ed\ua2ee\ua2ef\ua2f0\ua2f1\ua2f2\ua2f3\ua2f4\ua2f5\ua2f6\ua2f7\ua2f8\ua2f9\ua2fa\ua2fb\ua2fc\ua2fd\ua2fe\ua2ff\ua300\ua301\ua302\ua303\ua304\ua305\ua306\ua307\ua308\ua309\ua30a\ua30b\ua30c\ua30d\ua30e\ua30f\ua310\ua311\ua312\ua313\ua314\ua315\ua316\ua317\ua318\ua319\ua31a\ua31b\ua31c\ua31d\ua31e\ua31f\ua320\ua321\ua322\ua323\ua324\ua325\ua326\ua327\ua328\ua329\ua32a\ua32b\ua32c\ua32d\ua32e\ua32f\ua330\ua331\ua332\ua333\ua334\ua335\ua336\ua337\ua338\ua339\ua33a\ua33b\ua33c\ua33d\ua33e\ua33f\ua340\ua341\ua342\ua343\ua344\ua345\ua346\ua347\ua348\ua349\ua34a\ua34b\ua34c\ua34d\ua34e\ua34f\ua350\ua351\ua352\ua353\ua354\ua355\ua356\ua357\ua358\ua359\ua35a\ua35b\ua35c\ua35d\ua35e\ua35f\ua360\ua361\ua362\ua363\ua364\ua365\ua366\ua367\ua368\ua369\ua36a\ua36b\ua36c\ua36d\ua36e\ua36f\ua370\ua371\ua372\ua373\ua374\ua375\ua376\ua377\ua378\ua379\ua37a\ua37b\ua37c\ua37d\ua37e\ua37f\ua380\ua381\ua382\ua383\ua384\ua385\ua386\ua387\ua388\ua389\ua38a\ua38b\ua38c\ua38d\ua38e\ua38f\ua390\ua391\ua392\ua393\ua394\ua395\ua396\ua397\ua398\ua399\ua39a\ua39b\ua39c\ua39d\ua39e\ua39f\ua3a0\ua3a1\ua3a2\ua3a3\ua3a4\ua3a5\ua3a6\ua3a7\ua3a8\ua3a9\ua3aa\ua3ab\ua3ac\ua3ad\ua3ae\ua3af\ua3b0\ua3b1\ua3b2\ua3b3\ua3b4\ua3b5\ua3b6\ua3b7\ua3b8\ua3b9\ua3ba\ua3bb\ua3bc\ua3bd\ua3be\ua3bf\ua3c0\ua3c1\ua3c2\ua3c3\ua3c4\ua3c5\ua3c6\ua3c7\ua3c8\ua3c9\ua3ca\ua3cb\ua3cc\ua3cd\ua3ce\ua3cf\ua3d0\ua3d1\ua3d2\ua3d3\ua3d4\ua3d5\ua3d6\ua3d7\ua3d8\ua3d9\ua3da\ua3db\ua3dc\ua3dd\ua3de\ua3df\ua3e0\ua3e1\ua3e2\ua3e3\ua3e4\ua3e5\ua3e6\ua3e7\ua3e8\ua3e9\ua3ea\ua3eb\ua3ec\ua3ed\ua3ee\ua3ef\ua3f0\ua3f1\ua3f2\ua3f3\ua3f4\ua3f5\ua3f6\ua3f7\ua3f8\ua3f9\ua3fa\ua3fb\ua3fc\ua3fd\ua3fe\ua3ff\ua400\ua401\ua402\ua403\ua404\ua405\ua406\ua407\ua408\ua409\ua40a\ua40b\ua40c\ua40d\ua40e\ua40f\ua410\ua411\ua412\ua413\ua414\ua415\ua416\ua417\ua418\ua419\ua41a\ua41b\ua41c\ua41d\ua41e\ua41f\ua420\ua421\ua422\ua423\ua424\ua425\ua426\ua427\ua428\ua429\ua42a\ua42b\ua42c\ua42d\ua42e\ua42f\ua430\ua431\ua432\ua433\ua434\ua435\ua436\ua437\ua438\ua439\ua43a\ua43b\ua43c\ua43d\ua43e\ua43f\ua440\ua441\ua442\ua443\ua444\ua445\ua446\ua447\ua448\ua449\ua44a\ua44b\ua44c\ua44d\ua44e\ua44f\ua450\ua451\ua452\ua453\ua454\ua455\ua456\ua457\ua458\ua459\ua45a\ua45b\ua45c\ua45d\ua45e\ua45f\ua460\ua461\ua462\ua463\ua464\ua465\ua466\ua467\ua468\ua469\ua46a\ua46b\ua46c\ua46d\ua46e\ua46f\ua470\ua471\ua472\ua473\ua474\ua475\ua476\ua477\ua478\ua479\ua47a\ua47b\ua47c\ua47d\ua47e\ua47f\ua480\ua481\ua482\ua483\ua484\ua485\ua486\ua487\ua488\ua489\ua48a\ua48b\ua48c\ua800\ua801\ua803\ua804\ua805\ua807\ua808\ua809\ua80a\ua80c\ua80d\ua80e\ua80f\ua810\ua811\ua812\ua813\ua814\ua815\ua816\ua817\ua818\ua819\ua81a\ua81b\ua81c\ua81d\ua81e\ua81f\ua820\ua821\ua822\uac00\uac01\uac02\uac03\uac04\uac05\uac06\uac07\uac08\uac09\uac0a\uac0b\uac0c\uac0d\uac0e\uac0f\uac10\uac11\uac12\uac13\uac14\uac15\uac16\uac17\uac18\uac19\uac1a\uac1b\uac1c\uac1d\uac1e\uac1f\uac20\uac21\uac22\uac23\uac24\uac25\uac26\uac27\uac28\uac29\uac2a\uac2b\uac2c\uac2d\uac2e\uac2f\uac30\uac31\uac32\uac33\uac34\uac35\uac36\uac37\uac38\uac39\uac3a\uac3b\uac3c\uac3d\uac3e\uac3f\uac40\uac41\uac42\uac43\uac44\uac45\uac46\uac47\uac48\uac49\uac4a\uac4b\uac4c\uac4d\uac4e\uac4f\uac50\uac51\uac52\uac53\uac54\uac55\uac56\uac57\uac58\uac59\uac5a\uac5b\uac5c\uac5d\uac5e\uac5f\uac60\uac61\uac62\uac63\uac64\uac65\uac66\uac67\uac68\uac69\uac6a\uac6b\uac6c\uac6d\uac6e\uac6f\uac70\uac71\uac72\uac73\uac74\uac75\uac76\uac77\uac78\uac79\uac7a\uac7b\uac7c\uac7d\uac7e\uac7f\uac80\uac81\uac82\uac83\uac84\uac85\uac86\uac87\uac88\uac89\uac8a\uac8b\uac8c\uac8d\uac8e\uac8f\uac90\uac91\uac92\uac93\uac94\uac95\uac96\uac97\uac98\uac99\uac9a\uac9b\uac9c\uac9d\uac9e\uac9f\uaca0\uaca1\uaca2\uaca3\uaca4\uaca5\uaca6\uaca7\uaca8\uaca9\uacaa\uacab\uacac\uacad\uacae\uacaf\uacb0\uacb1\uacb2\uacb3\uacb4\uacb5\uacb6\uacb7\uacb8\uacb9\uacba\uacbb\uacbc\uacbd\uacbe\uacbf\uacc0\uacc1\uacc2\uacc3\uacc4\uacc5\uacc6\uacc7\uacc8\uacc9\uacca\uaccb\uaccc\uaccd\uacce\uaccf\uacd0\uacd1\uacd2\uacd3\uacd4\uacd5\uacd6\uacd7\uacd8\uacd9\uacda\uacdb\uacdc\uacdd\uacde\uacdf\uace0\uace1\uace2\uace3\uace4\uace5\uace6\uace7\uace8\uace9\uacea\uaceb\uacec\uaced\uacee\uacef\uacf0\uacf1\uacf2\uacf3\uacf4\uacf5\uacf6\uacf7\uacf8\uacf9\uacfa\uacfb\uacfc\uacfd\uacfe\uacff\uad00\uad01\uad02\uad03\uad04\uad05\uad06\uad07\uad08\uad09\uad0a\uad0b\uad0c\uad0d\uad0e\uad0f\uad10\uad11\uad12\uad13\uad14\uad15\uad16\uad17\uad18\uad19\uad1a\uad1b\uad1c\uad1d\uad1e\uad1f\uad20\uad21\uad22\uad23\uad24\uad25\uad26\uad27\uad28\uad29\uad2a\uad2b\uad2c\uad2d\uad2e\uad2f\uad30\uad31\uad32\uad33\uad34\uad35\uad36\uad37\uad38\uad39\uad3a\uad3b\uad3c\uad3d\uad3e\uad3f\uad40\uad41\uad42\uad43\uad44\uad45\uad46\uad47\uad48\uad49\uad4a\uad4b\uad4c\uad4d\uad4e\uad4f\uad50\uad51\uad52\uad53\uad54\uad55\uad56\uad57\uad58\uad59\uad5a\uad5b\uad5c\uad5d\uad5e\uad5f\uad60\uad61\uad62\uad63\uad64\uad65\uad66\uad67\uad68\uad69\uad6a\uad6b\uad6c\uad6d\uad6e\uad6f\uad70\uad71\uad72\uad73\uad74\uad75\uad76\uad77\uad78\uad79\uad7a\uad7b\uad7c\uad7d\uad7e\uad7f\uad80\uad81\uad82\uad83\uad84\uad85\uad86\uad87\uad88\uad89\uad8a\uad8b\uad8c\uad8d\uad8e\uad8f\uad90\uad91\uad92\uad93\uad94\uad95\uad96\uad97\uad98\uad99\uad9a\uad9b\uad9c\uad9d\uad9e\uad9f\uada0\uada1\uada2\uada3\uada4\uada5\uada6\uada7\uada8\uada9\uadaa\uadab\uadac\uadad\uadae\uadaf\uadb0\uadb1\uadb2\uadb3\uadb4\uadb5\uadb6\uadb7\uadb8\uadb9\uadba\uadbb\uadbc\uadbd\uadbe\uadbf\uadc0\uadc1\uadc2\uadc3\uadc4\uadc5\uadc6\uadc7\uadc8\uadc9\uadca\uadcb\uadcc\uadcd\uadce\uadcf\uadd0\uadd1\uadd2\uadd3\uadd4\uadd5\uadd6\uadd7\uadd8\uadd9\uadda\uaddb\uaddc\uaddd\uadde\uaddf\uade0\uade1\uade2\uade3\uade4\uade5\uade6\uade7\uade8\uade9\uadea\uadeb\uadec\uaded\uadee\uadef\uadf0\uadf1\uadf2\uadf3\uadf4\uadf5\uadf6\uadf7\uadf8\uadf9\uadfa\uadfb\uadfc\uadfd\uadfe\uadff\uae00\uae01\uae02\uae03\uae04\uae05\uae06\uae07\uae08\uae09\uae0a\uae0b\uae0c\uae0d\uae0e\uae0f\uae10\uae11\uae12\uae13\uae14\uae15\uae16\uae17\uae18\uae19\uae1a\uae1b\uae1c\uae1d\uae1e\uae1f\uae20\uae21\uae22\uae23\uae24\uae25\uae26\uae27\uae28\uae29\uae2a\uae2b\uae2c\uae2d\uae2e\uae2f\uae30\uae31\uae32\uae33\uae34\uae35\uae36\uae37\uae38\uae39\uae3a\uae3b\uae3c\uae3d\uae3e\uae3f\uae40\uae41\uae42\uae43\uae44\uae45\uae46\uae47\uae48\uae49\uae4a\uae4b\uae4c\uae4d\uae4e\uae4f\uae50\uae51\uae52\uae53\uae54\uae55\uae56\uae57\uae58\uae59\uae5a\uae5b\uae5c\uae5d\uae5e\uae5f\uae60\uae61\uae62\uae63\uae64\uae65\uae66\uae67\uae68\uae69\uae6a\uae6b\uae6c\uae6d\uae6e\uae6f\uae70\uae71\uae72\uae73\uae74\uae75\uae76\uae77\uae78\uae79\uae7a\uae7b\uae7c\uae7d\uae7e\uae7f\uae80\uae81\uae82\uae83\uae84\uae85\uae86\uae87\uae88\uae89\uae8a\uae8b\uae8c\uae8d\uae8e\uae8f\uae90\uae91\uae92\uae93\uae94\uae95\uae96\uae97\uae98\uae99\uae9a\uae9b\uae9c\uae9d\uae9e\uae9f\uaea0\uaea1\uaea2\uaea3\uaea4\uaea5\uaea6\uaea7\uaea8\uaea9\uaeaa\uaeab\uaeac\uaead\uaeae\uaeaf\uaeb0\uaeb1\uaeb2\uaeb3\uaeb4\uaeb5\uaeb6\uaeb7\uaeb8\uaeb9\uaeba\uaebb\uaebc\uaebd\uaebe\uaebf\uaec0\uaec1\uaec2\uaec3\uaec4\uaec5\uaec6\uaec7\uaec8\uaec9\uaeca\uaecb\uaecc\uaecd\uaece\uaecf\uaed0\uaed1\uaed2\uaed3\uaed4\uaed5\uaed6\uaed7\uaed8\uaed9\uaeda\uaedb\uaedc\uaedd\uaede\uaedf\uaee0\uaee1\uaee2\uaee3\uaee4\uaee5\uaee6\uaee7\uaee8\uaee9\uaeea\uaeeb\uaeec\uaeed\uaeee\uaeef\uaef0\uaef1\uaef2\uaef3\uaef4\uaef5\uaef6\uaef7\uaef8\uaef9\uaefa\uaefb\uaefc\uaefd\uaefe\uaeff\uaf00\uaf01\uaf02\uaf03\uaf04\uaf05\uaf06\uaf07\uaf08\uaf09\uaf0a\uaf0b\uaf0c\uaf0d\uaf0e\uaf0f\uaf10\uaf11\uaf12\uaf13\uaf14\uaf15\uaf16\uaf17\uaf18\uaf19\uaf1a\uaf1b\uaf1c\uaf1d\uaf1e\uaf1f\uaf20\uaf21\uaf22\uaf23\uaf24\uaf25\uaf26\uaf27\uaf28\uaf29\uaf2a\uaf2b\uaf2c\uaf2d\uaf2e\uaf2f\uaf30\uaf31\uaf32\uaf33\uaf34\uaf35\uaf36\uaf37\uaf38\uaf39\uaf3a\uaf3b\uaf3c\uaf3d\uaf3e\uaf3f\uaf40\uaf41\uaf42\uaf43\uaf44\uaf45\uaf46\uaf47\uaf48\uaf49\uaf4a\uaf4b\uaf4c\uaf4d\uaf4e\uaf4f\uaf50\uaf51\uaf52\uaf53\uaf54\uaf55\uaf56\uaf57\uaf58\uaf59\uaf5a\uaf5b\uaf5c\uaf5d\uaf5e\uaf5f\uaf60\uaf61\uaf62\uaf63\uaf64\uaf65\uaf66\uaf67\uaf68\uaf69\uaf6a\uaf6b\uaf6c\uaf6d\uaf6e\uaf6f\uaf70\uaf71\uaf72\uaf73\uaf74\uaf75\uaf76\uaf77\uaf78\uaf79\uaf7a\uaf7b\uaf7c\uaf7d\uaf7e\uaf7f\uaf80\uaf81\uaf82\uaf83\uaf84\uaf85\uaf86\uaf87\uaf88\uaf89\uaf8a\uaf8b\uaf8c\uaf8d\uaf8e\uaf8f\uaf90\uaf91\uaf92\uaf93\uaf94\uaf95\uaf96\uaf97\uaf98\uaf99\uaf9a\uaf9b\uaf9c\uaf9d\uaf9e\uaf9f\uafa0\uafa1\uafa2\uafa3\uafa4\uafa5\uafa6\uafa7\uafa8\uafa9\uafaa\uafab\uafac\uafad\uafae\uafaf\uafb0\uafb1\uafb2\uafb3\uafb4\uafb5\uafb6\uafb7\uafb8\uafb9\uafba\uafbb\uafbc\uafbd\uafbe\uafbf\uafc0\uafc1\uafc2\uafc3\uafc4\uafc5\uafc6\uafc7\uafc8\uafc9\uafca\uafcb\uafcc\uafcd\uafce\uafcf\uafd0\uafd1\uafd2\uafd3\uafd4\uafd5\uafd6\uafd7\uafd8\uafd9\uafda\uafdb\uafdc\uafdd\uafde\uafdf\uafe0\uafe1\uafe2\uafe3\uafe4\uafe5\uafe6\uafe7\uafe8\uafe9\uafea\uafeb\uafec\uafed\uafee\uafef\uaff0\uaff1\uaff2\uaff3\uaff4\uaff5\uaff6\uaff7\uaff8\uaff9\uaffa\uaffb\uaffc\uaffd\uaffe\uafff\ub000\ub001\ub002\ub003\ub004\ub005\ub006\ub007\ub008\ub009\ub00a\ub00b\ub00c\ub00d\ub00e\ub00f\ub010\ub011\ub012\ub013\ub014\ub015\ub016\ub017\ub018\ub019\ub01a\ub01b\ub01c\ub01d\ub01e\ub01f\ub020\ub021\ub022\ub023\ub024\ub025\ub026\ub027\ub028\ub029\ub02a\ub02b\ub02c\ub02d\ub02e\ub02f\ub030\ub031\ub032\ub033\ub034\ub035\ub036\ub037\ub038\ub039\ub03a\ub03b\ub03c\ub03d\ub03e\ub03f\ub040\ub041\ub042\ub043\ub044\ub045\ub046\ub047\ub048\ub049\ub04a\ub04b\ub04c\ub04d\ub04e\ub04f\ub050\ub051\ub052\ub053\ub054\ub055\ub056\ub057\ub058\ub059\ub05a\ub05b\ub05c\ub05d\ub05e\ub05f\ub060\ub061\ub062\ub063\ub064\ub065\ub066\ub067\ub068\ub069\ub06a\ub06b\ub06c\ub06d\ub06e\ub06f\ub070\ub071\ub072\ub073\ub074\ub075\ub076\ub077\ub078\ub079\ub07a\ub07b\ub07c\ub07d\ub07e\ub07f\ub080\ub081\ub082\ub083\ub084\ub085\ub086\ub087\ub088\ub089\ub08a\ub08b\ub08c\ub08d\ub08e\ub08f\ub090\ub091\ub092\ub093\ub094\ub095\ub096\ub097\ub098\ub099\ub09a\ub09b\ub09c\ub09d\ub09e\ub09f\ub0a0\ub0a1\ub0a2\ub0a3\ub0a4\ub0a5\ub0a6\ub0a7\ub0a8\ub0a9\ub0aa\ub0ab\ub0ac\ub0ad\ub0ae\ub0af\ub0b0\ub0b1\ub0b2\ub0b3\ub0b4\ub0b5\ub0b6\ub0b7\ub0b8\ub0b9\ub0ba\ub0bb\ub0bc\ub0bd\ub0be\ub0bf\ub0c0\ub0c1\ub0c2\ub0c3\ub0c4\ub0c5\ub0c6\ub0c7\ub0c8\ub0c9\ub0ca\ub0cb\ub0cc\ub0cd\ub0ce\ub0cf\ub0d0\ub0d1\ub0d2\ub0d3\ub0d4\ub0d5\ub0d6\ub0d7\ub0d8\ub0d9\ub0da\ub0db\ub0dc\ub0dd\ub0de\ub0df\ub0e0\ub0e1\ub0e2\ub0e3\ub0e4\ub0e5\ub0e6\ub0e7\ub0e8\ub0e9\ub0ea\ub0eb\ub0ec\ub0ed\ub0ee\ub0ef\ub0f0\ub0f1\ub0f2\ub0f3\ub0f4\ub0f5\ub0f6\ub0f7\ub0f8\ub0f9\ub0fa\ub0fb\ub0fc\ub0fd\ub0fe\ub0ff\ub100\ub101\ub102\ub103\ub104\ub105\ub106\ub107\ub108\ub109\ub10a\ub10b\ub10c\ub10d\ub10e\ub10f\ub110\ub111\ub112\ub113\ub114\ub115\ub116\ub117\ub118\ub119\ub11a\ub11b\ub11c\ub11d\ub11e\ub11f\ub120\ub121\ub122\ub123\ub124\ub125\ub126\ub127\ub128\ub129\ub12a\ub12b\ub12c\ub12d\ub12e\ub12f\ub130\ub131\ub132\ub133\ub134\ub135\ub136\ub137\ub138\ub139\ub13a\ub13b\ub13c\ub13d\ub13e\ub13f\ub140\ub141\ub142\ub143\ub144\ub145\ub146\ub147\ub148\ub149\ub14a\ub14b\ub14c\ub14d\ub14e\ub14f\ub150\ub151\ub152\ub153\ub154\ub155\ub156\ub157\ub158\ub159\ub15a\ub15b\ub15c\ub15d\ub15e\ub15f\ub160\ub161\ub162\ub163\ub164\ub165\ub166\ub167\ub168\ub169\ub16a\ub16b\ub16c\ub16d\ub16e\ub16f\ub170\ub171\ub172\ub173\ub174\ub175\ub176\ub177\ub178\ub179\ub17a\ub17b\ub17c\ub17d\ub17e\ub17f\ub180\ub181\ub182\ub183\ub184\ub185\ub186\ub187\ub188\ub189\ub18a\ub18b\ub18c\ub18d\ub18e\ub18f\ub190\ub191\ub192\ub193\ub194\ub195\ub196\ub197\ub198\ub199\ub19a\ub19b\ub19c\ub19d\ub19e\ub19f\ub1a0\ub1a1\ub1a2\ub1a3\ub1a4\ub1a5\ub1a6\ub1a7\ub1a8\ub1a9\ub1aa\ub1ab\ub1ac\ub1ad\ub1ae\ub1af\ub1b0\ub1b1\ub1b2\ub1b3\ub1b4\ub1b5\ub1b6\ub1b7\ub1b8\ub1b9\ub1ba\ub1bb\ub1bc\ub1bd\ub1be\ub1bf\ub1c0\ub1c1\ub1c2\ub1c3\ub1c4\ub1c5\ub1c6\ub1c7\ub1c8\ub1c9\ub1ca\ub1cb\ub1cc\ub1cd\ub1ce\ub1cf\ub1d0\ub1d1\ub1d2\ub1d3\ub1d4\ub1d5\ub1d6\ub1d7\ub1d8\ub1d9\ub1da\ub1db\ub1dc\ub1dd\ub1de\ub1df\ub1e0\ub1e1\ub1e2\ub1e3\ub1e4\ub1e5\ub1e6\ub1e7\ub1e8\ub1e9\ub1ea\ub1eb\ub1ec\ub1ed\ub1ee\ub1ef\ub1f0\ub1f1\ub1f2\ub1f3\ub1f4\ub1f5\ub1f6\ub1f7\ub1f8\ub1f9\ub1fa\ub1fb\ub1fc\ub1fd\ub1fe\ub1ff\ub200\ub201\ub202\ub203\ub204\ub205\ub206\ub207\ub208\ub209\ub20a\ub20b\ub20c\ub20d\ub20e\ub20f\ub210\ub211\ub212\ub213\ub214\ub215\ub216\ub217\ub218\ub219\ub21a\ub21b\ub21c\ub21d\ub21e\ub21f\ub220\ub221\ub222\ub223\ub224\ub225\ub226\ub227\ub228\ub229\ub22a\ub22b\ub22c\ub22d\ub22e\ub22f\ub230\ub231\ub232\ub233\ub234\ub235\ub236\ub237\ub238\ub239\ub23a\ub23b\ub23c\ub23d\ub23e\ub23f\ub240\ub241\ub242\ub243\ub244\ub245\ub246\ub247\ub248\ub249\ub24a\ub24b\ub24c\ub24d\ub24e\ub24f\ub250\ub251\ub252\ub253\ub254\ub255\ub256\ub257\ub258\ub259\ub25a\ub25b\ub25c\ub25d\ub25e\ub25f\ub260\ub261\ub262\ub263\ub264\ub265\ub266\ub267\ub268\ub269\ub26a\ub26b\ub26c\ub26d\ub26e\ub26f\ub270\ub271\ub272\ub273\ub274\ub275\ub276\ub277\ub278\ub279\ub27a\ub27b\ub27c\ub27d\ub27e\ub27f\ub280\ub281\ub282\ub283\ub284\ub285\ub286\ub287\ub288\ub289\ub28a\ub28b\ub28c\ub28d\ub28e\ub28f\ub290\ub291\ub292\ub293\ub294\ub295\ub296\ub297\ub298\ub299\ub29a\ub29b\ub29c\ub29d\ub29e\ub29f\ub2a0\ub2a1\ub2a2\ub2a3\ub2a4\ub2a5\ub2a6\ub2a7\ub2a8\ub2a9\ub2aa\ub2ab\ub2ac\ub2ad\ub2ae\ub2af\ub2b0\ub2b1\ub2b2\ub2b3\ub2b4\ub2b5\ub2b6\ub2b7\ub2b8\ub2b9\ub2ba\ub2bb\ub2bc\ub2bd\ub2be\ub2bf\ub2c0\ub2c1\ub2c2\ub2c3\ub2c4\ub2c5\ub2c6\ub2c7\ub2c8\ub2c9\ub2ca\ub2cb\ub2cc\ub2cd\ub2ce\ub2cf\ub2d0\ub2d1\ub2d2\ub2d3\ub2d4\ub2d5\ub2d6\ub2d7\ub2d8\ub2d9\ub2da\ub2db\ub2dc\ub2dd\ub2de\ub2df\ub2e0\ub2e1\ub2e2\ub2e3\ub2e4\ub2e5\ub2e6\ub2e7\ub2e8\ub2e9\ub2ea\ub2eb\ub2ec\ub2ed\ub2ee\ub2ef\ub2f0\ub2f1\ub2f2\ub2f3\ub2f4\ub2f5\ub2f6\ub2f7\ub2f8\ub2f9\ub2fa\ub2fb\ub2fc\ub2fd\ub2fe\ub2ff\ub300\ub301\ub302\ub303\ub304\ub305\ub306\ub307\ub308\ub309\ub30a\ub30b\ub30c\ub30d\ub30e\ub30f\ub310\ub311\ub312\ub313\ub314\ub315\ub316\ub317\ub318\ub319\ub31a\ub31b\ub31c\ub31d\ub31e\ub31f\ub320\ub321\ub322\ub323\ub324\ub325\ub326\ub327\ub328\ub329\ub32a\ub32b\ub32c\ub32d\ub32e\ub32f\ub330\ub331\ub332\ub333\ub334\ub335\ub336\ub337\ub338\ub339\ub33a\ub33b\ub33c\ub33d\ub33e\ub33f\ub340\ub341\ub342\ub343\ub344\ub345\ub346\ub347\ub348\ub349\ub34a\ub34b\ub34c\ub34d\ub34e\ub34f\ub350\ub351\ub352\ub353\ub354\ub355\ub356\ub357\ub358\ub359\ub35a\ub35b\ub35c\ub35d\ub35e\ub35f\ub360\ub361\ub362\ub363\ub364\ub365\ub366\ub367\ub368\ub369\ub36a\ub36b\ub36c\ub36d\ub36e\ub36f\ub370\ub371\ub372\ub373\ub374\ub375\ub376\ub377\ub378\ub379\ub37a\ub37b\ub37c\ub37d\ub37e\ub37f\ub380\ub381\ub382\ub383\ub384\ub385\ub386\ub387\ub388\ub389\ub38a\ub38b\ub38c\ub38d\ub38e\ub38f\ub390\ub391\ub392\ub393\ub394\ub395\ub396\ub397\ub398\ub399\ub39a\ub39b\ub39c\ub39d\ub39e\ub39f\ub3a0\ub3a1\ub3a2\ub3a3\ub3a4\ub3a5\ub3a6\ub3a7\ub3a8\ub3a9\ub3aa\ub3ab\ub3ac\ub3ad\ub3ae\ub3af\ub3b0\ub3b1\ub3b2\ub3b3\ub3b4\ub3b5\ub3b6\ub3b7\ub3b8\ub3b9\ub3ba\ub3bb\ub3bc\ub3bd\ub3be\ub3bf\ub3c0\ub3c1\ub3c2\ub3c3\ub3c4\ub3c5\ub3c6\ub3c7\ub3c8\ub3c9\ub3ca\ub3cb\ub3cc\ub3cd\ub3ce\ub3cf\ub3d0\ub3d1\ub3d2\ub3d3\ub3d4\ub3d5\ub3d6\ub3d7\ub3d8\ub3d9\ub3da\ub3db\ub3dc\ub3dd\ub3de\ub3df\ub3e0\ub3e1\ub3e2\ub3e3\ub3e4\ub3e5\ub3e6\ub3e7\ub3e8\ub3e9\ub3ea\ub3eb\ub3ec\ub3ed\ub3ee\ub3ef\ub3f0\ub3f1\ub3f2\ub3f3\ub3f4\ub3f5\ub3f6\ub3f7\ub3f8\ub3f9\ub3fa\ub3fb\ub3fc\ub3fd\ub3fe\ub3ff\ub400\ub401\ub402\ub403\ub404\ub405\ub406\ub407\ub408\ub409\ub40a\ub40b\ub40c\ub40d\ub40e\ub40f\ub410\ub411\ub412\ub413\ub414\ub415\ub416\ub417\ub418\ub419\ub41a\ub41b\ub41c\ub41d\ub41e\ub41f\ub420\ub421\ub422\ub423\ub424\ub425\ub426\ub427\ub428\ub429\ub42a\ub42b\ub42c\ub42d\ub42e\ub42f\ub430\ub431\ub432\ub433\ub434\ub435\ub436\ub437\ub438\ub439\ub43a\ub43b\ub43c\ub43d\ub43e\ub43f\ub440\ub441\ub442\ub443\ub444\ub445\ub446\ub447\ub448\ub449\ub44a\ub44b\ub44c\ub44d\ub44e\ub44f\ub450\ub451\ub452\ub453\ub454\ub455\ub456\ub457\ub458\ub459\ub45a\ub45b\ub45c\ub45d\ub45e\ub45f\ub460\ub461\ub462\ub463\ub464\ub465\ub466\ub467\ub468\ub469\ub46a\ub46b\ub46c\ub46d\ub46e\ub46f\ub470\ub471\ub472\ub473\ub474\ub475\ub476\ub477\ub478\ub479\ub47a\ub47b\ub47c\ub47d\ub47e\ub47f\ub480\ub481\ub482\ub483\ub484\ub485\ub486\ub487\ub488\ub489\ub48a\ub48b\ub48c\ub48d\ub48e\ub48f\ub490\ub491\ub492\ub493\ub494\ub495\ub496\ub497\ub498\ub499\ub49a\ub49b\ub49c\ub49d\ub49e\ub49f\ub4a0\ub4a1\ub4a2\ub4a3\ub4a4\ub4a5\ub4a6\ub4a7\ub4a8\ub4a9\ub4aa\ub4ab\ub4ac\ub4ad\ub4ae\ub4af\ub4b0\ub4b1\ub4b2\ub4b3\ub4b4\ub4b5\ub4b6\ub4b7\ub4b8\ub4b9\ub4ba\ub4bb\ub4bc\ub4bd\ub4be\ub4bf\ub4c0\ub4c1\ub4c2\ub4c3\ub4c4\ub4c5\ub4c6\ub4c7\ub4c8\ub4c9\ub4ca\ub4cb\ub4cc\ub4cd\ub4ce\ub4cf\ub4d0\ub4d1\ub4d2\ub4d3\ub4d4\ub4d5\ub4d6\ub4d7\ub4d8\ub4d9\ub4da\ub4db\ub4dc\ub4dd\ub4de\ub4df\ub4e0\ub4e1\ub4e2\ub4e3\ub4e4\ub4e5\ub4e6\ub4e7\ub4e8\ub4e9\ub4ea\ub4eb\ub4ec\ub4ed\ub4ee\ub4ef\ub4f0\ub4f1\ub4f2\ub4f3\ub4f4\ub4f5\ub4f6\ub4f7\ub4f8\ub4f9\ub4fa\ub4fb\ub4fc\ub4fd\ub4fe\ub4ff\ub500\ub501\ub502\ub503\ub504\ub505\ub506\ub507\ub508\ub509\ub50a\ub50b\ub50c\ub50d\ub50e\ub50f\ub510\ub511\ub512\ub513\ub514\ub515\ub516\ub517\ub518\ub519\ub51a\ub51b\ub51c\ub51d\ub51e\ub51f\ub520\ub521\ub522\ub523\ub524\ub525\ub526\ub527\ub528\ub529\ub52a\ub52b\ub52c\ub52d\ub52e\ub52f\ub530\ub531\ub532\ub533\ub534\ub535\ub536\ub537\ub538\ub539\ub53a\ub53b\ub53c\ub53d\ub53e\ub53f\ub540\ub541\ub542\ub543\ub544\ub545\ub546\ub547\ub548\ub549\ub54a\ub54b\ub54c\ub54d\ub54e\ub54f\ub550\ub551\ub552\ub553\ub554\ub555\ub556\ub557\ub558\ub559\ub55a\ub55b\ub55c\ub55d\ub55e\ub55f\ub560\ub561\ub562\ub563\ub564\ub565\ub566\ub567\ub568\ub569\ub56a\ub56b\ub56c\ub56d\ub56e\ub56f\ub570\ub571\ub572\ub573\ub574\ub575\ub576\ub577\ub578\ub579\ub57a\ub57b\ub57c\ub57d\ub57e\ub57f\ub580\ub581\ub582\ub583\ub584\ub585\ub586\ub587\ub588\ub589\ub58a\ub58b\ub58c\ub58d\ub58e\ub58f\ub590\ub591\ub592\ub593\ub594\ub595\ub596\ub597\ub598\ub599\ub59a\ub59b\ub59c\ub59d\ub59e\ub59f\ub5a0\ub5a1\ub5a2\ub5a3\ub5a4\ub5a5\ub5a6\ub5a7\ub5a8\ub5a9\ub5aa\ub5ab\ub5ac\ub5ad\ub5ae\ub5af\ub5b0\ub5b1\ub5b2\ub5b3\ub5b4\ub5b5\ub5b6\ub5b7\ub5b8\ub5b9\ub5ba\ub5bb\ub5bc\ub5bd\ub5be\ub5bf\ub5c0\ub5c1\ub5c2\ub5c3\ub5c4\ub5c5\ub5c6\ub5c7\ub5c8\ub5c9\ub5ca\ub5cb\ub5cc\ub5cd\ub5ce\ub5cf\ub5d0\ub5d1\ub5d2\ub5d3\ub5d4\ub5d5\ub5d6\ub5d7\ub5d8\ub5d9\ub5da\ub5db\ub5dc\ub5dd\ub5de\ub5df\ub5e0\ub5e1\ub5e2\ub5e3\ub5e4\ub5e5\ub5e6\ub5e7\ub5e8\ub5e9\ub5ea\ub5eb\ub5ec\ub5ed\ub5ee\ub5ef\ub5f0\ub5f1\ub5f2\ub5f3\ub5f4\ub5f5\ub5f6\ub5f7\ub5f8\ub5f9\ub5fa\ub5fb\ub5fc\ub5fd\ub5fe\ub5ff\ub600\ub601\ub602\ub603\ub604\ub605\ub606\ub607\ub608\ub609\ub60a\ub60b\ub60c\ub60d\ub60e\ub60f\ub610\ub611\ub612\ub613\ub614\ub615\ub616\ub617\ub618\ub619\ub61a\ub61b\ub61c\ub61d\ub61e\ub61f\ub620\ub621\ub622\ub623\ub624\ub625\ub626\ub627\ub628\ub629\ub62a\ub62b\ub62c\ub62d\ub62e\ub62f\ub630\ub631\ub632\ub633\ub634\ub635\ub636\ub637\ub638\ub639\ub63a\ub63b\ub63c\ub63d\ub63e\ub63f\ub640\ub641\ub642\ub643\ub644\ub645\ub646\ub647\ub648\ub649\ub64a\ub64b\ub64c\ub64d\ub64e\ub64f\ub650\ub651\ub652\ub653\ub654\ub655\ub656\ub657\ub658\ub659\ub65a\ub65b\ub65c\ub65d\ub65e\ub65f\ub660\ub661\ub662\ub663\ub664\ub665\ub666\ub667\ub668\ub669\ub66a\ub66b\ub66c\ub66d\ub66e\ub66f\ub670\ub671\ub672\ub673\ub674\ub675\ub676\ub677\ub678\ub679\ub67a\ub67b\ub67c\ub67d\ub67e\ub67f\ub680\ub681\ub682\ub683\ub684\ub685\ub686\ub687\ub688\ub689\ub68a\ub68b\ub68c\ub68d\ub68e\ub68f\ub690\ub691\ub692\ub693\ub694\ub695\ub696\ub697\ub698\ub699\ub69a\ub69b\ub69c\ub69d\ub69e\ub69f\ub6a0\ub6a1\ub6a2\ub6a3\ub6a4\ub6a5\ub6a6\ub6a7\ub6a8\ub6a9\ub6aa\ub6ab\ub6ac\ub6ad\ub6ae\ub6af\ub6b0\ub6b1\ub6b2\ub6b3\ub6b4\ub6b5\ub6b6\ub6b7\ub6b8\ub6b9\ub6ba\ub6bb\ub6bc\ub6bd\ub6be\ub6bf\ub6c0\ub6c1\ub6c2\ub6c3\ub6c4\ub6c5\ub6c6\ub6c7\ub6c8\ub6c9\ub6ca\ub6cb\ub6cc\ub6cd\ub6ce\ub6cf\ub6d0\ub6d1\ub6d2\ub6d3\ub6d4\ub6d5\ub6d6\ub6d7\ub6d8\ub6d9\ub6da\ub6db\ub6dc\ub6dd\ub6de\ub6df\ub6e0\ub6e1\ub6e2\ub6e3\ub6e4\ub6e5\ub6e6\ub6e7\ub6e8\ub6e9\ub6ea\ub6eb\ub6ec\ub6ed\ub6ee\ub6ef\ub6f0\ub6f1\ub6f2\ub6f3\ub6f4\ub6f5\ub6f6\ub6f7\ub6f8\ub6f9\ub6fa\ub6fb\ub6fc\ub6fd\ub6fe\ub6ff\ub700\ub701\ub702\ub703\ub704\ub705\ub706\ub707\ub708\ub709\ub70a\ub70b\ub70c\ub70d\ub70e\ub70f\ub710\ub711\ub712\ub713\ub714\ub715\ub716\ub717\ub718\ub719\ub71a\ub71b\ub71c\ub71d\ub71e\ub71f\ub720\ub721\ub722\ub723\ub724\ub725\ub726\ub727\ub728\ub729\ub72a\ub72b\ub72c\ub72d\ub72e\ub72f\ub730\ub731\ub732\ub733\ub734\ub735\ub736\ub737\ub738\ub739\ub73a\ub73b\ub73c\ub73d\ub73e\ub73f\ub740\ub741\ub742\ub743\ub744\ub745\ub746\ub747\ub748\ub749\ub74a\ub74b\ub74c\ub74d\ub74e\ub74f\ub750\ub751\ub752\ub753\ub754\ub755\ub756\ub757\ub758\ub759\ub75a\ub75b\ub75c\ub75d\ub75e\ub75f\ub760\ub761\ub762\ub763\ub764\ub765\ub766\ub767\ub768\ub769\ub76a\ub76b\ub76c\ub76d\ub76e\ub76f\ub770\ub771\ub772\ub773\ub774\ub775\ub776\ub777\ub778\ub779\ub77a\ub77b\ub77c\ub77d\ub77e\ub77f\ub780\ub781\ub782\ub783\ub784\ub785\ub786\ub787\ub788\ub789\ub78a\ub78b\ub78c\ub78d\ub78e\ub78f\ub790\ub791\ub792\ub793\ub794\ub795\ub796\ub797\ub798\ub799\ub79a\ub79b\ub79c\ub79d\ub79e\ub79f\ub7a0\ub7a1\ub7a2\ub7a3\ub7a4\ub7a5\ub7a6\ub7a7\ub7a8\ub7a9\ub7aa\ub7ab\ub7ac\ub7ad\ub7ae\ub7af\ub7b0\ub7b1\ub7b2\ub7b3\ub7b4\ub7b5\ub7b6\ub7b7\ub7b8\ub7b9\ub7ba\ub7bb\ub7bc\ub7bd\ub7be\ub7bf\ub7c0\ub7c1\ub7c2\ub7c3\ub7c4\ub7c5\ub7c6\ub7c7\ub7c8\ub7c9\ub7ca\ub7cb\ub7cc\ub7cd\ub7ce\ub7cf\ub7d0\ub7d1\ub7d2\ub7d3\ub7d4\ub7d5\ub7d6\ub7d7\ub7d8\ub7d9\ub7da\ub7db\ub7dc\ub7dd\ub7de\ub7df\ub7e0\ub7e1\ub7e2\ub7e3\ub7e4\ub7e5\ub7e6\ub7e7\ub7e8\ub7e9\ub7ea\ub7eb\ub7ec\ub7ed\ub7ee\ub7ef\ub7f0\ub7f1\ub7f2\ub7f3\ub7f4\ub7f5\ub7f6\ub7f7\ub7f8\ub7f9\ub7fa\ub7fb\ub7fc\ub7fd\ub7fe\ub7ff\ub800\ub801\ub802\ub803\ub804\ub805\ub806\ub807\ub808\ub809\ub80a\ub80b\ub80c\ub80d\ub80e\ub80f\ub810\ub811\ub812\ub813\ub814\ub815\ub816\ub817\ub818\ub819\ub81a\ub81b\ub81c\ub81d\ub81e\ub81f\ub820\ub821\ub822\ub823\ub824\ub825\ub826\ub827\ub828\ub829\ub82a\ub82b\ub82c\ub82d\ub82e\ub82f\ub830\ub831\ub832\ub833\ub834\ub835\ub836\ub837\ub838\ub839\ub83a\ub83b\ub83c\ub83d\ub83e\ub83f\ub840\ub841\ub842\ub843\ub844\ub845\ub846\ub847\ub848\ub849\ub84a\ub84b\ub84c\ub84d\ub84e\ub84f\ub850\ub851\ub852\ub853\ub854\ub855\ub856\ub857\ub858\ub859\ub85a\ub85b\ub85c\ub85d\ub85e\ub85f\ub860\ub861\ub862\ub863\ub864\ub865\ub866\ub867\ub868\ub869\ub86a\ub86b\ub86c\ub86d\ub86e\ub86f\ub870\ub871\ub872\ub873\ub874\ub875\ub876\ub877\ub878\ub879\ub87a\ub87b\ub87c\ub87d\ub87e\ub87f\ub880\ub881\ub882\ub883\ub884\ub885\ub886\ub887\ub888\ub889\ub88a\ub88b\ub88c\ub88d\ub88e\ub88f\ub890\ub891\ub892\ub893\ub894\ub895\ub896\ub897\ub898\ub899\ub89a\ub89b\ub89c\ub89d\ub89e\ub89f\ub8a0\ub8a1\ub8a2\ub8a3\ub8a4\ub8a5\ub8a6\ub8a7\ub8a8\ub8a9\ub8aa\ub8ab\ub8ac\ub8ad\ub8ae\ub8af\ub8b0\ub8b1\ub8b2\ub8b3\ub8b4\ub8b5\ub8b6\ub8b7\ub8b8\ub8b9\ub8ba\ub8bb\ub8bc\ub8bd\ub8be\ub8bf\ub8c0\ub8c1\ub8c2\ub8c3\ub8c4\ub8c5\ub8c6\ub8c7\ub8c8\ub8c9\ub8ca\ub8cb\ub8cc\ub8cd\ub8ce\ub8cf\ub8d0\ub8d1\ub8d2\ub8d3\ub8d4\ub8d5\ub8d6\ub8d7\ub8d8\ub8d9\ub8da\ub8db\ub8dc\ub8dd\ub8de\ub8df\ub8e0\ub8e1\ub8e2\ub8e3\ub8e4\ub8e5\ub8e6\ub8e7\ub8e8\ub8e9\ub8ea\ub8eb\ub8ec\ub8ed\ub8ee\ub8ef\ub8f0\ub8f1\ub8f2\ub8f3\ub8f4\ub8f5\ub8f6\ub8f7\ub8f8\ub8f9\ub8fa\ub8fb\ub8fc\ub8fd\ub8fe\ub8ff\ub900\ub901\ub902\ub903\ub904\ub905\ub906\ub907\ub908\ub909\ub90a\ub90b\ub90c\ub90d\ub90e\ub90f\ub910\ub911\ub912\ub913\ub914\ub915\ub916\ub917\ub918\ub919\ub91a\ub91b\ub91c\ub91d\ub91e\ub91f\ub920\ub921\ub922\ub923\ub924\ub925\ub926\ub927\ub928\ub929\ub92a\ub92b\ub92c\ub92d\ub92e\ub92f\ub930\ub931\ub932\ub933\ub934\ub935\ub936\ub937\ub938\ub939\ub93a\ub93b\ub93c\ub93d\ub93e\ub93f\ub940\ub941\ub942\ub943\ub944\ub945\ub946\ub947\ub948\ub949\ub94a\ub94b\ub94c\ub94d\ub94e\ub94f\ub950\ub951\ub952\ub953\ub954\ub955\ub956\ub957\ub958\ub959\ub95a\ub95b\ub95c\ub95d\ub95e\ub95f\ub960\ub961\ub962\ub963\ub964\ub965\ub966\ub967\ub968\ub969\ub96a\ub96b\ub96c\ub96d\ub96e\ub96f\ub970\ub971\ub972\ub973\ub974\ub975\ub976\ub977\ub978\ub979\ub97a\ub97b\ub97c\ub97d\ub97e\ub97f\ub980\ub981\ub982\ub983\ub984\ub985\ub986\ub987\ub988\ub989\ub98a\ub98b\ub98c\ub98d\ub98e\ub98f\ub990\ub991\ub992\ub993\ub994\ub995\ub996\ub997\ub998\ub999\ub99a\ub99b\ub99c\ub99d\ub99e\ub99f\ub9a0\ub9a1\ub9a2\ub9a3\ub9a4\ub9a5\ub9a6\ub9a7\ub9a8\ub9a9\ub9aa\ub9ab\ub9ac\ub9ad\ub9ae\ub9af\ub9b0\ub9b1\ub9b2\ub9b3\ub9b4\ub9b5\ub9b6\ub9b7\ub9b8\ub9b9\ub9ba\ub9bb\ub9bc\ub9bd\ub9be\ub9bf\ub9c0\ub9c1\ub9c2\ub9c3\ub9c4\ub9c5\ub9c6\ub9c7\ub9c8\ub9c9\ub9ca\ub9cb\ub9cc\ub9cd\ub9ce\ub9cf\ub9d0\ub9d1\ub9d2\ub9d3\ub9d4\ub9d5\ub9d6\ub9d7\ub9d8\ub9d9\ub9da\ub9db\ub9dc\ub9dd\ub9de\ub9df\ub9e0\ub9e1\ub9e2\ub9e3\ub9e4\ub9e5\ub9e6\ub9e7\ub9e8\ub9e9\ub9ea\ub9eb\ub9ec\ub9ed\ub9ee\ub9ef\ub9f0\ub9f1\ub9f2\ub9f3\ub9f4\ub9f5\ub9f6\ub9f7\ub9f8\ub9f9\ub9fa\ub9fb\ub9fc\ub9fd\ub9fe\ub9ff\uba00\uba01\uba02\uba03\uba04\uba05\uba06\uba07\uba08\uba09\uba0a\uba0b\uba0c\uba0d\uba0e\uba0f\uba10\uba11\uba12\uba13\uba14\uba15\uba16\uba17\uba18\uba19\uba1a\uba1b\uba1c\uba1d\uba1e\uba1f\uba20\uba21\uba22\uba23\uba24\uba25\uba26\uba27\uba28\uba29\uba2a\uba2b\uba2c\uba2d\uba2e\uba2f\uba30\uba31\uba32\uba33\uba34\uba35\uba36\uba37\uba38\uba39\uba3a\uba3b\uba3c\uba3d\uba3e\uba3f\uba40\uba41\uba42\uba43\uba44\uba45\uba46\uba47\uba48\uba49\uba4a\uba4b\uba4c\uba4d\uba4e\uba4f\uba50\uba51\uba52\uba53\uba54\uba55\uba56\uba57\uba58\uba59\uba5a\uba5b\uba5c\uba5d\uba5e\uba5f\uba60\uba61\uba62\uba63\uba64\uba65\uba66\uba67\uba68\uba69\uba6a\uba6b\uba6c\uba6d\uba6e\uba6f\uba70\uba71\uba72\uba73\uba74\uba75\uba76\uba77\uba78\uba79\uba7a\uba7b\uba7c\uba7d\uba7e\uba7f\uba80\uba81\uba82\uba83\uba84\uba85\uba86\uba87\uba88\uba89\uba8a\uba8b\uba8c\uba8d\uba8e\uba8f\uba90\uba91\uba92\uba93\uba94\uba95\uba96\uba97\uba98\uba99\uba9a\uba9b\uba9c\uba9d\uba9e\uba9f\ubaa0\ubaa1\ubaa2\ubaa3\ubaa4\ubaa5\ubaa6\ubaa7\ubaa8\ubaa9\ubaaa\ubaab\ubaac\ubaad\ubaae\ubaaf\ubab0\ubab1\ubab2\ubab3\ubab4\ubab5\ubab6\ubab7\ubab8\ubab9\ubaba\ubabb\ubabc\ubabd\ubabe\ubabf\ubac0\ubac1\ubac2\ubac3\ubac4\ubac5\ubac6\ubac7\ubac8\ubac9\ubaca\ubacb\ubacc\ubacd\ubace\ubacf\ubad0\ubad1\ubad2\ubad3\ubad4\ubad5\ubad6\ubad7\ubad8\ubad9\ubada\ubadb\ubadc\ubadd\ubade\ubadf\ubae0\ubae1\ubae2\ubae3\ubae4\ubae5\ubae6\ubae7\ubae8\ubae9\ubaea\ubaeb\ubaec\ubaed\ubaee\ubaef\ubaf0\ubaf1\ubaf2\ubaf3\ubaf4\ubaf5\ubaf6\ubaf7\ubaf8\ubaf9\ubafa\ubafb\ubafc\ubafd\ubafe\ubaff\ubb00\ubb01\ubb02\ubb03\ubb04\ubb05\ubb06\ubb07\ubb08\ubb09\ubb0a\ubb0b\ubb0c\ubb0d\ubb0e\ubb0f\ubb10\ubb11\ubb12\ubb13\ubb14\ubb15\ubb16\ubb17\ubb18\ubb19\ubb1a\ubb1b\ubb1c\ubb1d\ubb1e\ubb1f\ubb20\ubb21\ubb22\ubb23\ubb24\ubb25\ubb26\ubb27\ubb28\ubb29\ubb2a\ubb2b\ubb2c\ubb2d\ubb2e\ubb2f\ubb30\ubb31\ubb32\ubb33\ubb34\ubb35\ubb36\ubb37\ubb38\ubb39\ubb3a\ubb3b\ubb3c\ubb3d\ubb3e\ubb3f\ubb40\ubb41\ubb42\ubb43\ubb44\ubb45\ubb46\ubb47\ubb48\ubb49\ubb4a\ubb4b\ubb4c\ubb4d\ubb4e\ubb4f\ubb50\ubb51\ubb52\ubb53\ubb54\ubb55\ubb56\ubb57\ubb58\ubb59\ubb5a\ubb5b\ubb5c\ubb5d\ubb5e\ubb5f\ubb60\ubb61\ubb62\ubb63\ubb64\ubb65\ubb66\ubb67\ubb68\ubb69\ubb6a\ubb6b\ubb6c\ubb6d\ubb6e\ubb6f\ubb70\ubb71\ubb72\ubb73\ubb74\ubb75\ubb76\ubb77\ubb78\ubb79\ubb7a\ubb7b\ubb7c\ubb7d\ubb7e\ubb7f\ubb80\ubb81\ubb82\ubb83\ubb84\ubb85\ubb86\ubb87\ubb88\ubb89\ubb8a\ubb8b\ubb8c\ubb8d\ubb8e\ubb8f\ubb90\ubb91\ubb92\ubb93\ubb94\ubb95\ubb96\ubb97\ubb98\ubb99\ubb9a\ubb9b\ubb9c\ubb9d\ubb9e\ubb9f\ubba0\ubba1\ubba2\ubba3\ubba4\ubba5\ubba6\ubba7\ubba8\ubba9\ubbaa\ubbab\ubbac\ubbad\ubbae\ubbaf\ubbb0\ubbb1\ubbb2\ubbb3\ubbb4\ubbb5\ubbb6\ubbb7\ubbb8\ubbb9\ubbba\ubbbb\ubbbc\ubbbd\ubbbe\ubbbf\ubbc0\ubbc1\ubbc2\ubbc3\ubbc4\ubbc5\ubbc6\ubbc7\ubbc8\ubbc9\ubbca\ubbcb\ubbcc\ubbcd\ubbce\ubbcf\ubbd0\ubbd1\ubbd2\ubbd3\ubbd4\ubbd5\ubbd6\ubbd7\ubbd8\ubbd9\ubbda\ubbdb\ubbdc\ubbdd\ubbde\ubbdf\ubbe0\ubbe1\ubbe2\ubbe3\ubbe4\ubbe5\ubbe6\ubbe7\ubbe8\ubbe9\ubbea\ubbeb\ubbec\ubbed\ubbee\ubbef\ubbf0\ubbf1\ubbf2\ubbf3\ubbf4\ubbf5\ubbf6\ubbf7\ubbf8\ubbf9\ubbfa\ubbfb\ubbfc\ubbfd\ubbfe\ubbff\ubc00\ubc01\ubc02\ubc03\ubc04\ubc05\ubc06\ubc07\ubc08\ubc09\ubc0a\ubc0b\ubc0c\ubc0d\ubc0e\ubc0f\ubc10\ubc11\ubc12\ubc13\ubc14\ubc15\ubc16\ubc17\ubc18\ubc19\ubc1a\ubc1b\ubc1c\ubc1d\ubc1e\ubc1f\ubc20\ubc21\ubc22\ubc23\ubc24\ubc25\ubc26\ubc27\ubc28\ubc29\ubc2a\ubc2b\ubc2c\ubc2d\ubc2e\ubc2f\ubc30\ubc31\ubc32\ubc33\ubc34\ubc35\ubc36\ubc37\ubc38\ubc39\ubc3a\ubc3b\ubc3c\ubc3d\ubc3e\ubc3f\ubc40\ubc41\ubc42\ubc43\ubc44\ubc45\ubc46\ubc47\ubc48\ubc49\ubc4a\ubc4b\ubc4c\ubc4d\ubc4e\ubc4f\ubc50\ubc51\ubc52\ubc53\ubc54\ubc55\ubc56\ubc57\ubc58\ubc59\ubc5a\ubc5b\ubc5c\ubc5d\ubc5e\ubc5f\ubc60\ubc61\ubc62\ubc63\ubc64\ubc65\ubc66\ubc67\ubc68\ubc69\ubc6a\ubc6b\ubc6c\ubc6d\ubc6e\ubc6f\ubc70\ubc71\ubc72\ubc73\ubc74\ubc75\ubc76\ubc77\ubc78\ubc79\ubc7a\ubc7b\ubc7c\ubc7d\ubc7e\ubc7f\ubc80\ubc81\ubc82\ubc83\ubc84\ubc85\ubc86\ubc87\ubc88\ubc89\ubc8a\ubc8b\ubc8c\ubc8d\ubc8e\ubc8f\ubc90\ubc91\ubc92\ubc93\ubc94\ubc95\ubc96\ubc97\ubc98\ubc99\ubc9a\ubc9b\ubc9c\ubc9d\ubc9e\ubc9f\ubca0\ubca1\ubca2\ubca3\ubca4\ubca5\ubca6\ubca7\ubca8\ubca9\ubcaa\ubcab\ubcac\ubcad\ubcae\ubcaf\ubcb0\ubcb1\ubcb2\ubcb3\ubcb4\ubcb5\ubcb6\ubcb7\ubcb8\ubcb9\ubcba\ubcbb\ubcbc\ubcbd\ubcbe\ubcbf\ubcc0\ubcc1\ubcc2\ubcc3\ubcc4\ubcc5\ubcc6\ubcc7\ubcc8\ubcc9\ubcca\ubccb\ubccc\ubccd\ubcce\ubccf\ubcd0\ubcd1\ubcd2\ubcd3\ubcd4\ubcd5\ubcd6\ubcd7\ubcd8\ubcd9\ubcda\ubcdb\ubcdc\ubcdd\ubcde\ubcdf\ubce0\ubce1\ubce2\ubce3\ubce4\ubce5\ubce6\ubce7\ubce8\ubce9\ubcea\ubceb\ubcec\ubced\ubcee\ubcef\ubcf0\ubcf1\ubcf2\ubcf3\ubcf4\ubcf5\ubcf6\ubcf7\ubcf8\ubcf9\ubcfa\ubcfb\ubcfc\ubcfd\ubcfe\ubcff\ubd00\ubd01\ubd02\ubd03\ubd04\ubd05\ubd06\ubd07\ubd08\ubd09\ubd0a\ubd0b\ubd0c\ubd0d\ubd0e\ubd0f\ubd10\ubd11\ubd12\ubd13\ubd14\ubd15\ubd16\ubd17\ubd18\ubd19\ubd1a\ubd1b\ubd1c\ubd1d\ubd1e\ubd1f\ubd20\ubd21\ubd22\ubd23\ubd24\ubd25\ubd26\ubd27\ubd28\ubd29\ubd2a\ubd2b\ubd2c\ubd2d\ubd2e\ubd2f\ubd30\ubd31\ubd32\ubd33\ubd34\ubd35\ubd36\ubd37\ubd38\ubd39\ubd3a\ubd3b\ubd3c\ubd3d\ubd3e\ubd3f\ubd40\ubd41\ubd42\ubd43\ubd44\ubd45\ubd46\ubd47\ubd48\ubd49\ubd4a\ubd4b\ubd4c\ubd4d\ubd4e\ubd4f\ubd50\ubd51\ubd52\ubd53\ubd54\ubd55\ubd56\ubd57\ubd58\ubd59\ubd5a\ubd5b\ubd5c\ubd5d\ubd5e\ubd5f\ubd60\ubd61\ubd62\ubd63\ubd64\ubd65\ubd66\ubd67\ubd68\ubd69\ubd6a\ubd6b\ubd6c\ubd6d\ubd6e\ubd6f\ubd70\ubd71\ubd72\ubd73\ubd74\ubd75\ubd76\ubd77\ubd78\ubd79\ubd7a\ubd7b\ubd7c\ubd7d\ubd7e\ubd7f\ubd80\ubd81\ubd82\ubd83\ubd84\ubd85\ubd86\ubd87\ubd88\ubd89\ubd8a\ubd8b\ubd8c\ubd8d\ubd8e\ubd8f\ubd90\ubd91\ubd92\ubd93\ubd94\ubd95\ubd96\ubd97\ubd98\ubd99\ubd9a\ubd9b\ubd9c\ubd9d\ubd9e\ubd9f\ubda0\ubda1\ubda2\ubda3\ubda4\ubda5\ubda6\ubda7\ubda8\ubda9\ubdaa\ubdab\ubdac\ubdad\ubdae\ubdaf\ubdb0\ubdb1\ubdb2\ubdb3\ubdb4\ubdb5\ubdb6\ubdb7\ubdb8\ubdb9\ubdba\ubdbb\ubdbc\ubdbd\ubdbe\ubdbf\ubdc0\ubdc1\ubdc2\ubdc3\ubdc4\ubdc5\ubdc6\ubdc7\ubdc8\ubdc9\ubdca\ubdcb\ubdcc\ubdcd\ubdce\ubdcf\ubdd0\ubdd1\ubdd2\ubdd3\ubdd4\ubdd5\ubdd6\ubdd7\ubdd8\ubdd9\ubdda\ubddb\ubddc\ubddd\ubdde\ubddf\ubde0\ubde1\ubde2\ubde3\ubde4\ubde5\ubde6\ubde7\ubde8\ubde9\ubdea\ubdeb\ubdec\ubded\ubdee\ubdef\ubdf0\ubdf1\ubdf2\ubdf3\ubdf4\ubdf5\ubdf6\ubdf7\ubdf8\ubdf9\ubdfa\ubdfb\ubdfc\ubdfd\ubdfe\ubdff\ube00\ube01\ube02\ube03\ube04\ube05\ube06\ube07\ube08\ube09\ube0a\ube0b\ube0c\ube0d\ube0e\ube0f\ube10\ube11\ube12\ube13\ube14\ube15\ube16\ube17\ube18\ube19\ube1a\ube1b\ube1c\ube1d\ube1e\ube1f\ube20\ube21\ube22\ube23\ube24\ube25\ube26\ube27\ube28\ube29\ube2a\ube2b\ube2c\ube2d\ube2e\ube2f\ube30\ube31\ube32\ube33\ube34\ube35\ube36\ube37\ube38\ube39\ube3a\ube3b\ube3c\ube3d\ube3e\ube3f\ube40\ube41\ube42\ube43\ube44\ube45\ube46\ube47\ube48\ube49\ube4a\ube4b\ube4c\ube4d\ube4e\ube4f\ube50\ube51\ube52\ube53\ube54\ube55\ube56\ube57\ube58\ube59\ube5a\ube5b\ube5c\ube5d\ube5e\ube5f\ube60\ube61\ube62\ube63\ube64\ube65\ube66\ube67\ube68\ube69\ube6a\ube6b\ube6c\ube6d\ube6e\ube6f\ube70\ube71\ube72\ube73\ube74\ube75\ube76\ube77\ube78\ube79\ube7a\ube7b\ube7c\ube7d\ube7e\ube7f\ube80\ube81\ube82\ube83\ube84\ube85\ube86\ube87\ube88\ube89\ube8a\ube8b\ube8c\ube8d\ube8e\ube8f\ube90\ube91\ube92\ube93\ube94\ube95\ube96\ube97\ube98\ube99\ube9a\ube9b\ube9c\ube9d\ube9e\ube9f\ubea0\ubea1\ubea2\ubea3\ubea4\ubea5\ubea6\ubea7\ubea8\ubea9\ubeaa\ubeab\ubeac\ubead\ubeae\ubeaf\ubeb0\ubeb1\ubeb2\ubeb3\ubeb4\ubeb5\ubeb6\ubeb7\ubeb8\ubeb9\ubeba\ubebb\ubebc\ubebd\ubebe\ubebf\ubec0\ubec1\ubec2\ubec3\ubec4\ubec5\ubec6\ubec7\ubec8\ubec9\ubeca\ubecb\ubecc\ubecd\ubece\ubecf\ubed0\ubed1\ubed2\ubed3\ubed4\ubed5\ubed6\ubed7\ubed8\ubed9\ubeda\ubedb\ubedc\ubedd\ubede\ubedf\ubee0\ubee1\ubee2\ubee3\ubee4\ubee5\ubee6\ubee7\ubee8\ubee9\ubeea\ubeeb\ubeec\ubeed\ubeee\ubeef\ubef0\ubef1\ubef2\ubef3\ubef4\ubef5\ubef6\ubef7\ubef8\ubef9\ubefa\ubefb\ubefc\ubefd\ubefe\ubeff\ubf00\ubf01\ubf02\ubf03\ubf04\ubf05\ubf06\ubf07\ubf08\ubf09\ubf0a\ubf0b\ubf0c\ubf0d\ubf0e\ubf0f\ubf10\ubf11\ubf12\ubf13\ubf14\ubf15\ubf16\ubf17\ubf18\ubf19\ubf1a\ubf1b\ubf1c\ubf1d\ubf1e\ubf1f\ubf20\ubf21\ubf22\ubf23\ubf24\ubf25\ubf26\ubf27\ubf28\ubf29\ubf2a\ubf2b\ubf2c\ubf2d\ubf2e\ubf2f\ubf30\ubf31\ubf32\ubf33\ubf34\ubf35\ubf36\ubf37\ubf38\ubf39\ubf3a\ubf3b\ubf3c\ubf3d\ubf3e\ubf3f\ubf40\ubf41\ubf42\ubf43\ubf44\ubf45\ubf46\ubf47\ubf48\ubf49\ubf4a\ubf4b\ubf4c\ubf4d\ubf4e\ubf4f\ubf50\ubf51\ubf52\ubf53\ubf54\ubf55\ubf56\ubf57\ubf58\ubf59\ubf5a\ubf5b\ubf5c\ubf5d\ubf5e\ubf5f\ubf60\ubf61\ubf62\ubf63\ubf64\ubf65\ubf66\ubf67\ubf68\ubf69\ubf6a\ubf6b\ubf6c\ubf6d\ubf6e\ubf6f\ubf70\ubf71\ubf72\ubf73\ubf74\ubf75\ubf76\ubf77\ubf78\ubf79\ubf7a\ubf7b\ubf7c\ubf7d\ubf7e\ubf7f\ubf80\ubf81\ubf82\ubf83\ubf84\ubf85\ubf86\ubf87\ubf88\ubf89\ubf8a\ubf8b\ubf8c\ubf8d\ubf8e\ubf8f\ubf90\ubf91\ubf92\ubf93\ubf94\ubf95\ubf96\ubf97\ubf98\ubf99\ubf9a\ubf9b\ubf9c\ubf9d\ubf9e\ubf9f\ubfa0\ubfa1\ubfa2\ubfa3\ubfa4\ubfa5\ubfa6\ubfa7\ubfa8\ubfa9\ubfaa\ubfab\ubfac\ubfad\ubfae\ubfaf\ubfb0\ubfb1\ubfb2\ubfb3\ubfb4\ubfb5\ubfb6\ubfb7\ubfb8\ubfb9\ubfba\ubfbb\ubfbc\ubfbd\ubfbe\ubfbf\ubfc0\ubfc1\ubfc2\ubfc3\ubfc4\ubfc5\ubfc6\ubfc7\ubfc8\ubfc9\ubfca\ubfcb\ubfcc\ubfcd\ubfce\ubfcf\ubfd0\ubfd1\ubfd2\ubfd3\ubfd4\ubfd5\ubfd6\ubfd7\ubfd8\ubfd9\ubfda\ubfdb\ubfdc\ubfdd\ubfde\ubfdf\ubfe0\ubfe1\ubfe2\ubfe3\ubfe4\ubfe5\ubfe6\ubfe7\ubfe8\ubfe9\ubfea\ubfeb\ubfec\ubfed\ubfee\ubfef\ubff0\ubff1\ubff2\ubff3\ubff4\ubff5\ubff6\ubff7\ubff8\ubff9\ubffa\ubffb\ubffc\ubffd\ubffe\ubfff\uc000\uc001\uc002\uc003\uc004\uc005\uc006\uc007\uc008\uc009\uc00a\uc00b\uc00c\uc00d\uc00e\uc00f\uc010\uc011\uc012\uc013\uc014\uc015\uc016\uc017\uc018\uc019\uc01a\uc01b\uc01c\uc01d\uc01e\uc01f\uc020\uc021\uc022\uc023\uc024\uc025\uc026\uc027\uc028\uc029\uc02a\uc02b\uc02c\uc02d\uc02e\uc02f\uc030\uc031\uc032\uc033\uc034\uc035\uc036\uc037\uc038\uc039\uc03a\uc03b\uc03c\uc03d\uc03e\uc03f\uc040\uc041\uc042\uc043\uc044\uc045\uc046\uc047\uc048\uc049\uc04a\uc04b\uc04c\uc04d\uc04e\uc04f\uc050\uc051\uc052\uc053\uc054\uc055\uc056\uc057\uc058\uc059\uc05a\uc05b\uc05c\uc05d\uc05e\uc05f\uc060\uc061\uc062\uc063\uc064\uc065\uc066\uc067\uc068\uc069\uc06a\uc06b\uc06c\uc06d\uc06e\uc06f\uc070\uc071\uc072\uc073\uc074\uc075\uc076\uc077\uc078\uc079\uc07a\uc07b\uc07c\uc07d\uc07e\uc07f\uc080\uc081\uc082\uc083\uc084\uc085\uc086\uc087\uc088\uc089\uc08a\uc08b\uc08c\uc08d\uc08e\uc08f\uc090\uc091\uc092\uc093\uc094\uc095\uc096\uc097\uc098\uc099\uc09a\uc09b\uc09c\uc09d\uc09e\uc09f\uc0a0\uc0a1\uc0a2\uc0a3\uc0a4\uc0a5\uc0a6\uc0a7\uc0a8\uc0a9\uc0aa\uc0ab\uc0ac\uc0ad\uc0ae\uc0af\uc0b0\uc0b1\uc0b2\uc0b3\uc0b4\uc0b5\uc0b6\uc0b7\uc0b8\uc0b9\uc0ba\uc0bb\uc0bc\uc0bd\uc0be\uc0bf\uc0c0\uc0c1\uc0c2\uc0c3\uc0c4\uc0c5\uc0c6\uc0c7\uc0c8\uc0c9\uc0ca\uc0cb\uc0cc\uc0cd\uc0ce\uc0cf\uc0d0\uc0d1\uc0d2\uc0d3\uc0d4\uc0d5\uc0d6\uc0d7\uc0d8\uc0d9\uc0da\uc0db\uc0dc\uc0dd\uc0de\uc0df\uc0e0\uc0e1\uc0e2\uc0e3\uc0e4\uc0e5\uc0e6\uc0e7\uc0e8\uc0e9\uc0ea\uc0eb\uc0ec\uc0ed\uc0ee\uc0ef\uc0f0\uc0f1\uc0f2\uc0f3\uc0f4\uc0f5\uc0f6\uc0f7\uc0f8\uc0f9\uc0fa\uc0fb\uc0fc\uc0fd\uc0fe\uc0ff\uc100\uc101\uc102\uc103\uc104\uc105\uc106\uc107\uc108\uc109\uc10a\uc10b\uc10c\uc10d\uc10e\uc10f\uc110\uc111\uc112\uc113\uc114\uc115\uc116\uc117\uc118\uc119\uc11a\uc11b\uc11c\uc11d\uc11e\uc11f\uc120\uc121\uc122\uc123\uc124\uc125\uc126\uc127\uc128\uc129\uc12a\uc12b\uc12c\uc12d\uc12e\uc12f\uc130\uc131\uc132\uc133\uc134\uc135\uc136\uc137\uc138\uc139\uc13a\uc13b\uc13c\uc13d\uc13e\uc13f\uc140\uc141\uc142\uc143\uc144\uc145\uc146\uc147\uc148\uc149\uc14a\uc14b\uc14c\uc14d\uc14e\uc14f\uc150\uc151\uc152\uc153\uc154\uc155\uc156\uc157\uc158\uc159\uc15a\uc15b\uc15c\uc15d\uc15e\uc15f\uc160\uc161\uc162\uc163\uc164\uc165\uc166\uc167\uc168\uc169\uc16a\uc16b\uc16c\uc16d\uc16e\uc16f\uc170\uc171\uc172\uc173\uc174\uc175\uc176\uc177\uc178\uc179\uc17a\uc17b\uc17c\uc17d\uc17e\uc17f\uc180\uc181\uc182\uc183\uc184\uc185\uc186\uc187\uc188\uc189\uc18a\uc18b\uc18c\uc18d\uc18e\uc18f\uc190\uc191\uc192\uc193\uc194\uc195\uc196\uc197\uc198\uc199\uc19a\uc19b\uc19c\uc19d\uc19e\uc19f\uc1a0\uc1a1\uc1a2\uc1a3\uc1a4\uc1a5\uc1a6\uc1a7\uc1a8\uc1a9\uc1aa\uc1ab\uc1ac\uc1ad\uc1ae\uc1af\uc1b0\uc1b1\uc1b2\uc1b3\uc1b4\uc1b5\uc1b6\uc1b7\uc1b8\uc1b9\uc1ba\uc1bb\uc1bc\uc1bd\uc1be\uc1bf\uc1c0\uc1c1\uc1c2\uc1c3\uc1c4\uc1c5\uc1c6\uc1c7\uc1c8\uc1c9\uc1ca\uc1cb\uc1cc\uc1cd\uc1ce\uc1cf\uc1d0\uc1d1\uc1d2\uc1d3\uc1d4\uc1d5\uc1d6\uc1d7\uc1d8\uc1d9\uc1da\uc1db\uc1dc\uc1dd\uc1de\uc1df\uc1e0\uc1e1\uc1e2\uc1e3\uc1e4\uc1e5\uc1e6\uc1e7\uc1e8\uc1e9\uc1ea\uc1eb\uc1ec\uc1ed\uc1ee\uc1ef\uc1f0\uc1f1\uc1f2\uc1f3\uc1f4\uc1f5\uc1f6\uc1f7\uc1f8\uc1f9\uc1fa\uc1fb\uc1fc\uc1fd\uc1fe\uc1ff\uc200\uc201\uc202\uc203\uc204\uc205\uc206\uc207\uc208\uc209\uc20a\uc20b\uc20c\uc20d\uc20e\uc20f\uc210\uc211\uc212\uc213\uc214\uc215\uc216\uc217\uc218\uc219\uc21a\uc21b\uc21c\uc21d\uc21e\uc21f\uc220\uc221\uc222\uc223\uc224\uc225\uc226\uc227\uc228\uc229\uc22a\uc22b\uc22c\uc22d\uc22e\uc22f\uc230\uc231\uc232\uc233\uc234\uc235\uc236\uc237\uc238\uc239\uc23a\uc23b\uc23c\uc23d\uc23e\uc23f\uc240\uc241\uc242\uc243\uc244\uc245\uc246\uc247\uc248\uc249\uc24a\uc24b\uc24c\uc24d\uc24e\uc24f\uc250\uc251\uc252\uc253\uc254\uc255\uc256\uc257\uc258\uc259\uc25a\uc25b\uc25c\uc25d\uc25e\uc25f\uc260\uc261\uc262\uc263\uc264\uc265\uc266\uc267\uc268\uc269\uc26a\uc26b\uc26c\uc26d\uc26e\uc26f\uc270\uc271\uc272\uc273\uc274\uc275\uc276\uc277\uc278\uc279\uc27a\uc27b\uc27c\uc27d\uc27e\uc27f\uc280\uc281\uc282\uc283\uc284\uc285\uc286\uc287\uc288\uc289\uc28a\uc28b\uc28c\uc28d\uc28e\uc28f\uc290\uc291\uc292\uc293\uc294\uc295\uc296\uc297\uc298\uc299\uc29a\uc29b\uc29c\uc29d\uc29e\uc29f\uc2a0\uc2a1\uc2a2\uc2a3\uc2a4\uc2a5\uc2a6\uc2a7\uc2a8\uc2a9\uc2aa\uc2ab\uc2ac\uc2ad\uc2ae\uc2af\uc2b0\uc2b1\uc2b2\uc2b3\uc2b4\uc2b5\uc2b6\uc2b7\uc2b8\uc2b9\uc2ba\uc2bb\uc2bc\uc2bd\uc2be\uc2bf\uc2c0\uc2c1\uc2c2\uc2c3\uc2c4\uc2c5\uc2c6\uc2c7\uc2c8\uc2c9\uc2ca\uc2cb\uc2cc\uc2cd\uc2ce\uc2cf\uc2d0\uc2d1\uc2d2\uc2d3\uc2d4\uc2d5\uc2d6\uc2d7\uc2d8\uc2d9\uc2da\uc2db\uc2dc\uc2dd\uc2de\uc2df\uc2e0\uc2e1\uc2e2\uc2e3\uc2e4\uc2e5\uc2e6\uc2e7\uc2e8\uc2e9\uc2ea\uc2eb\uc2ec\uc2ed\uc2ee\uc2ef\uc2f0\uc2f1\uc2f2\uc2f3\uc2f4\uc2f5\uc2f6\uc2f7\uc2f8\uc2f9\uc2fa\uc2fb\uc2fc\uc2fd\uc2fe\uc2ff\uc300\uc301\uc302\uc303\uc304\uc305\uc306\uc307\uc308\uc309\uc30a\uc30b\uc30c\uc30d\uc30e\uc30f\uc310\uc311\uc312\uc313\uc314\uc315\uc316\uc317\uc318\uc319\uc31a\uc31b\uc31c\uc31d\uc31e\uc31f\uc320\uc321\uc322\uc323\uc324\uc325\uc326\uc327\uc328\uc329\uc32a\uc32b\uc32c\uc32d\uc32e\uc32f\uc330\uc331\uc332\uc333\uc334\uc335\uc336\uc337\uc338\uc339\uc33a\uc33b\uc33c\uc33d\uc33e\uc33f\uc340\uc341\uc342\uc343\uc344\uc345\uc346\uc347\uc348\uc349\uc34a\uc34b\uc34c\uc34d\uc34e\uc34f\uc350\uc351\uc352\uc353\uc354\uc355\uc356\uc357\uc358\uc359\uc35a\uc35b\uc35c\uc35d\uc35e\uc35f\uc360\uc361\uc362\uc363\uc364\uc365\uc366\uc367\uc368\uc369\uc36a\uc36b\uc36c\uc36d\uc36e\uc36f\uc370\uc371\uc372\uc373\uc374\uc375\uc376\uc377\uc378\uc379\uc37a\uc37b\uc37c\uc37d\uc37e\uc37f\uc380\uc381\uc382\uc383\uc384\uc385\uc386\uc387\uc388\uc389\uc38a\uc38b\uc38c\uc38d\uc38e\uc38f\uc390\uc391\uc392\uc393\uc394\uc395\uc396\uc397\uc398\uc399\uc39a\uc39b\uc39c\uc39d\uc39e\uc39f\uc3a0\uc3a1\uc3a2\uc3a3\uc3a4\uc3a5\uc3a6\uc3a7\uc3a8\uc3a9\uc3aa\uc3ab\uc3ac\uc3ad\uc3ae\uc3af\uc3b0\uc3b1\uc3b2\uc3b3\uc3b4\uc3b5\uc3b6\uc3b7\uc3b8\uc3b9\uc3ba\uc3bb\uc3bc\uc3bd\uc3be\uc3bf\uc3c0\uc3c1\uc3c2\uc3c3\uc3c4\uc3c5\uc3c6\uc3c7\uc3c8\uc3c9\uc3ca\uc3cb\uc3cc\uc3cd\uc3ce\uc3cf\uc3d0\uc3d1\uc3d2\uc3d3\uc3d4\uc3d5\uc3d6\uc3d7\uc3d8\uc3d9\uc3da\uc3db\uc3dc\uc3dd\uc3de\uc3df\uc3e0\uc3e1\uc3e2\uc3e3\uc3e4\uc3e5\uc3e6\uc3e7\uc3e8\uc3e9\uc3ea\uc3eb\uc3ec\uc3ed\uc3ee\uc3ef\uc3f0\uc3f1\uc3f2\uc3f3\uc3f4\uc3f5\uc3f6\uc3f7\uc3f8\uc3f9\uc3fa\uc3fb\uc3fc\uc3fd\uc3fe\uc3ff\uc400\uc401\uc402\uc403\uc404\uc405\uc406\uc407\uc408\uc409\uc40a\uc40b\uc40c\uc40d\uc40e\uc40f\uc410\uc411\uc412\uc413\uc414\uc415\uc416\uc417\uc418\uc419\uc41a\uc41b\uc41c\uc41d\uc41e\uc41f\uc420\uc421\uc422\uc423\uc424\uc425\uc426\uc427\uc428\uc429\uc42a\uc42b\uc42c\uc42d\uc42e\uc42f\uc430\uc431\uc432\uc433\uc434\uc435\uc436\uc437\uc438\uc439\uc43a\uc43b\uc43c\uc43d\uc43e\uc43f\uc440\uc441\uc442\uc443\uc444\uc445\uc446\uc447\uc448\uc449\uc44a\uc44b\uc44c\uc44d\uc44e\uc44f\uc450\uc451\uc452\uc453\uc454\uc455\uc456\uc457\uc458\uc459\uc45a\uc45b\uc45c\uc45d\uc45e\uc45f\uc460\uc461\uc462\uc463\uc464\uc465\uc466\uc467\uc468\uc469\uc46a\uc46b\uc46c\uc46d\uc46e\uc46f\uc470\uc471\uc472\uc473\uc474\uc475\uc476\uc477\uc478\uc479\uc47a\uc47b\uc47c\uc47d\uc47e\uc47f\uc480\uc481\uc482\uc483\uc484\uc485\uc486\uc487\uc488\uc489\uc48a\uc48b\uc48c\uc48d\uc48e\uc48f\uc490\uc491\uc492\uc493\uc494\uc495\uc496\uc497\uc498\uc499\uc49a\uc49b\uc49c\uc49d\uc49e\uc49f\uc4a0\uc4a1\uc4a2\uc4a3\uc4a4\uc4a5\uc4a6\uc4a7\uc4a8\uc4a9\uc4aa\uc4ab\uc4ac\uc4ad\uc4ae\uc4af\uc4b0\uc4b1\uc4b2\uc4b3\uc4b4\uc4b5\uc4b6\uc4b7\uc4b8\uc4b9\uc4ba\uc4bb\uc4bc\uc4bd\uc4be\uc4bf\uc4c0\uc4c1\uc4c2\uc4c3\uc4c4\uc4c5\uc4c6\uc4c7\uc4c8\uc4c9\uc4ca\uc4cb\uc4cc\uc4cd\uc4ce\uc4cf\uc4d0\uc4d1\uc4d2\uc4d3\uc4d4\uc4d5\uc4d6\uc4d7\uc4d8\uc4d9\uc4da\uc4db\uc4dc\uc4dd\uc4de\uc4df\uc4e0\uc4e1\uc4e2\uc4e3\uc4e4\uc4e5\uc4e6\uc4e7\uc4e8\uc4e9\uc4ea\uc4eb\uc4ec\uc4ed\uc4ee\uc4ef\uc4f0\uc4f1\uc4f2\uc4f3\uc4f4\uc4f5\uc4f6\uc4f7\uc4f8\uc4f9\uc4fa\uc4fb\uc4fc\uc4fd\uc4fe\uc4ff\uc500\uc501\uc502\uc503\uc504\uc505\uc506\uc507\uc508\uc509\uc50a\uc50b\uc50c\uc50d\uc50e\uc50f\uc510\uc511\uc512\uc513\uc514\uc515\uc516\uc517\uc518\uc519\uc51a\uc51b\uc51c\uc51d\uc51e\uc51f\uc520\uc521\uc522\uc523\uc524\uc525\uc526\uc527\uc528\uc529\uc52a\uc52b\uc52c\uc52d\uc52e\uc52f\uc530\uc531\uc532\uc533\uc534\uc535\uc536\uc537\uc538\uc539\uc53a\uc53b\uc53c\uc53d\uc53e\uc53f\uc540\uc541\uc542\uc543\uc544\uc545\uc546\uc547\uc548\uc549\uc54a\uc54b\uc54c\uc54d\uc54e\uc54f\uc550\uc551\uc552\uc553\uc554\uc555\uc556\uc557\uc558\uc559\uc55a\uc55b\uc55c\uc55d\uc55e\uc55f\uc560\uc561\uc562\uc563\uc564\uc565\uc566\uc567\uc568\uc569\uc56a\uc56b\uc56c\uc56d\uc56e\uc56f\uc570\uc571\uc572\uc573\uc574\uc575\uc576\uc577\uc578\uc579\uc57a\uc57b\uc57c\uc57d\uc57e\uc57f\uc580\uc581\uc582\uc583\uc584\uc585\uc586\uc587\uc588\uc589\uc58a\uc58b\uc58c\uc58d\uc58e\uc58f\uc590\uc591\uc592\uc593\uc594\uc595\uc596\uc597\uc598\uc599\uc59a\uc59b\uc59c\uc59d\uc59e\uc59f\uc5a0\uc5a1\uc5a2\uc5a3\uc5a4\uc5a5\uc5a6\uc5a7\uc5a8\uc5a9\uc5aa\uc5ab\uc5ac\uc5ad\uc5ae\uc5af\uc5b0\uc5b1\uc5b2\uc5b3\uc5b4\uc5b5\uc5b6\uc5b7\uc5b8\uc5b9\uc5ba\uc5bb\uc5bc\uc5bd\uc5be\uc5bf\uc5c0\uc5c1\uc5c2\uc5c3\uc5c4\uc5c5\uc5c6\uc5c7\uc5c8\uc5c9\uc5ca\uc5cb\uc5cc\uc5cd\uc5ce\uc5cf\uc5d0\uc5d1\uc5d2\uc5d3\uc5d4\uc5d5\uc5d6\uc5d7\uc5d8\uc5d9\uc5da\uc5db\uc5dc\uc5dd\uc5de\uc5df\uc5e0\uc5e1\uc5e2\uc5e3\uc5e4\uc5e5\uc5e6\uc5e7\uc5e8\uc5e9\uc5ea\uc5eb\uc5ec\uc5ed\uc5ee\uc5ef\uc5f0\uc5f1\uc5f2\uc5f3\uc5f4\uc5f5\uc5f6\uc5f7\uc5f8\uc5f9\uc5fa\uc5fb\uc5fc\uc5fd\uc5fe\uc5ff\uc600\uc601\uc602\uc603\uc604\uc605\uc606\uc607\uc608\uc609\uc60a\uc60b\uc60c\uc60d\uc60e\uc60f\uc610\uc611\uc612\uc613\uc614\uc615\uc616\uc617\uc618\uc619\uc61a\uc61b\uc61c\uc61d\uc61e\uc61f\uc620\uc621\uc622\uc623\uc624\uc625\uc626\uc627\uc628\uc629\uc62a\uc62b\uc62c\uc62d\uc62e\uc62f\uc630\uc631\uc632\uc633\uc634\uc635\uc636\uc637\uc638\uc639\uc63a\uc63b\uc63c\uc63d\uc63e\uc63f\uc640\uc641\uc642\uc643\uc644\uc645\uc646\uc647\uc648\uc649\uc64a\uc64b\uc64c\uc64d\uc64e\uc64f\uc650\uc651\uc652\uc653\uc654\uc655\uc656\uc657\uc658\uc659\uc65a\uc65b\uc65c\uc65d\uc65e\uc65f\uc660\uc661\uc662\uc663\uc664\uc665\uc666\uc667\uc668\uc669\uc66a\uc66b\uc66c\uc66d\uc66e\uc66f\uc670\uc671\uc672\uc673\uc674\uc675\uc676\uc677\uc678\uc679\uc67a\uc67b\uc67c\uc67d\uc67e\uc67f\uc680\uc681\uc682\uc683\uc684\uc685\uc686\uc687\uc688\uc689\uc68a\uc68b\uc68c\uc68d\uc68e\uc68f\uc690\uc691\uc692\uc693\uc694\uc695\uc696\uc697\uc698\uc699\uc69a\uc69b\uc69c\uc69d\uc69e\uc69f\uc6a0\uc6a1\uc6a2\uc6a3\uc6a4\uc6a5\uc6a6\uc6a7\uc6a8\uc6a9\uc6aa\uc6ab\uc6ac\uc6ad\uc6ae\uc6af\uc6b0\uc6b1\uc6b2\uc6b3\uc6b4\uc6b5\uc6b6\uc6b7\uc6b8\uc6b9\uc6ba\uc6bb\uc6bc\uc6bd\uc6be\uc6bf\uc6c0\uc6c1\uc6c2\uc6c3\uc6c4\uc6c5\uc6c6\uc6c7\uc6c8\uc6c9\uc6ca\uc6cb\uc6cc\uc6cd\uc6ce\uc6cf\uc6d0\uc6d1\uc6d2\uc6d3\uc6d4\uc6d5\uc6d6\uc6d7\uc6d8\uc6d9\uc6da\uc6db\uc6dc\uc6dd\uc6de\uc6df\uc6e0\uc6e1\uc6e2\uc6e3\uc6e4\uc6e5\uc6e6\uc6e7\uc6e8\uc6e9\uc6ea\uc6eb\uc6ec\uc6ed\uc6ee\uc6ef\uc6f0\uc6f1\uc6f2\uc6f3\uc6f4\uc6f5\uc6f6\uc6f7\uc6f8\uc6f9\uc6fa\uc6fb\uc6fc\uc6fd\uc6fe\uc6ff\uc700\uc701\uc702\uc703\uc704\uc705\uc706\uc707\uc708\uc709\uc70a\uc70b\uc70c\uc70d\uc70e\uc70f\uc710\uc711\uc712\uc713\uc714\uc715\uc716\uc717\uc718\uc719\uc71a\uc71b\uc71c\uc71d\uc71e\uc71f\uc720\uc721\uc722\uc723\uc724\uc725\uc726\uc727\uc728\uc729\uc72a\uc72b\uc72c\uc72d\uc72e\uc72f\uc730\uc731\uc732\uc733\uc734\uc735\uc736\uc737\uc738\uc739\uc73a\uc73b\uc73c\uc73d\uc73e\uc73f\uc740\uc741\uc742\uc743\uc744\uc745\uc746\uc747\uc748\uc749\uc74a\uc74b\uc74c\uc74d\uc74e\uc74f\uc750\uc751\uc752\uc753\uc754\uc755\uc756\uc757\uc758\uc759\uc75a\uc75b\uc75c\uc75d\uc75e\uc75f\uc760\uc761\uc762\uc763\uc764\uc765\uc766\uc767\uc768\uc769\uc76a\uc76b\uc76c\uc76d\uc76e\uc76f\uc770\uc771\uc772\uc773\uc774\uc775\uc776\uc777\uc778\uc779\uc77a\uc77b\uc77c\uc77d\uc77e\uc77f\uc780\uc781\uc782\uc783\uc784\uc785\uc786\uc787\uc788\uc789\uc78a\uc78b\uc78c\uc78d\uc78e\uc78f\uc790\uc791\uc792\uc793\uc794\uc795\uc796\uc797\uc798\uc799\uc79a\uc79b\uc79c\uc79d\uc79e\uc79f\uc7a0\uc7a1\uc7a2\uc7a3\uc7a4\uc7a5\uc7a6\uc7a7\uc7a8\uc7a9\uc7aa\uc7ab\uc7ac\uc7ad\uc7ae\uc7af\uc7b0\uc7b1\uc7b2\uc7b3\uc7b4\uc7b5\uc7b6\uc7b7\uc7b8\uc7b9\uc7ba\uc7bb\uc7bc\uc7bd\uc7be\uc7bf\uc7c0\uc7c1\uc7c2\uc7c3\uc7c4\uc7c5\uc7c6\uc7c7\uc7c8\uc7c9\uc7ca\uc7cb\uc7cc\uc7cd\uc7ce\uc7cf\uc7d0\uc7d1\uc7d2\uc7d3\uc7d4\uc7d5\uc7d6\uc7d7\uc7d8\uc7d9\uc7da\uc7db\uc7dc\uc7dd\uc7de\uc7df\uc7e0\uc7e1\uc7e2\uc7e3\uc7e4\uc7e5\uc7e6\uc7e7\uc7e8\uc7e9\uc7ea\uc7eb\uc7ec\uc7ed\uc7ee\uc7ef\uc7f0\uc7f1\uc7f2\uc7f3\uc7f4\uc7f5\uc7f6\uc7f7\uc7f8\uc7f9\uc7fa\uc7fb\uc7fc\uc7fd\uc7fe\uc7ff\uc800\uc801\uc802\uc803\uc804\uc805\uc806\uc807\uc808\uc809\uc80a\uc80b\uc80c\uc80d\uc80e\uc80f\uc810\uc811\uc812\uc813\uc814\uc815\uc816\uc817\uc818\uc819\uc81a\uc81b\uc81c\uc81d\uc81e\uc81f\uc820\uc821\uc822\uc823\uc824\uc825\uc826\uc827\uc828\uc829\uc82a\uc82b\uc82c\uc82d\uc82e\uc82f\uc830\uc831\uc832\uc833\uc834\uc835\uc836\uc837\uc838\uc839\uc83a\uc83b\uc83c\uc83d\uc83e\uc83f\uc840\uc841\uc842\uc843\uc844\uc845\uc846\uc847\uc848\uc849\uc84a\uc84b\uc84c\uc84d\uc84e\uc84f\uc850\uc851\uc852\uc853\uc854\uc855\uc856\uc857\uc858\uc859\uc85a\uc85b\uc85c\uc85d\uc85e\uc85f\uc860\uc861\uc862\uc863\uc864\uc865\uc866\uc867\uc868\uc869\uc86a\uc86b\uc86c\uc86d\uc86e\uc86f\uc870\uc871\uc872\uc873\uc874\uc875\uc876\uc877\uc878\uc879\uc87a\uc87b\uc87c\uc87d\uc87e\uc87f\uc880\uc881\uc882\uc883\uc884\uc885\uc886\uc887\uc888\uc889\uc88a\uc88b\uc88c\uc88d\uc88e\uc88f\uc890\uc891\uc892\uc893\uc894\uc895\uc896\uc897\uc898\uc899\uc89a\uc89b\uc89c\uc89d\uc89e\uc89f\uc8a0\uc8a1\uc8a2\uc8a3\uc8a4\uc8a5\uc8a6\uc8a7\uc8a8\uc8a9\uc8aa\uc8ab\uc8ac\uc8ad\uc8ae\uc8af\uc8b0\uc8b1\uc8b2\uc8b3\uc8b4\uc8b5\uc8b6\uc8b7\uc8b8\uc8b9\uc8ba\uc8bb\uc8bc\uc8bd\uc8be\uc8bf\uc8c0\uc8c1\uc8c2\uc8c3\uc8c4\uc8c5\uc8c6\uc8c7\uc8c8\uc8c9\uc8ca\uc8cb\uc8cc\uc8cd\uc8ce\uc8cf\uc8d0\uc8d1\uc8d2\uc8d3\uc8d4\uc8d5\uc8d6\uc8d7\uc8d8\uc8d9\uc8da\uc8db\uc8dc\uc8dd\uc8de\uc8df\uc8e0\uc8e1\uc8e2\uc8e3\uc8e4\uc8e5\uc8e6\uc8e7\uc8e8\uc8e9\uc8ea\uc8eb\uc8ec\uc8ed\uc8ee\uc8ef\uc8f0\uc8f1\uc8f2\uc8f3\uc8f4\uc8f5\uc8f6\uc8f7\uc8f8\uc8f9\uc8fa\uc8fb\uc8fc\uc8fd\uc8fe\uc8ff\uc900\uc901\uc902\uc903\uc904\uc905\uc906\uc907\uc908\uc909\uc90a\uc90b\uc90c\uc90d\uc90e\uc90f\uc910\uc911\uc912\uc913\uc914\uc915\uc916\uc917\uc918\uc919\uc91a\uc91b\uc91c\uc91d\uc91e\uc91f\uc920\uc921\uc922\uc923\uc924\uc925\uc926\uc927\uc928\uc929\uc92a\uc92b\uc92c\uc92d\uc92e\uc92f\uc930\uc931\uc932\uc933\uc934\uc935\uc936\uc937\uc938\uc939\uc93a\uc93b\uc93c\uc93d\uc93e\uc93f\uc940\uc941\uc942\uc943\uc944\uc945\uc946\uc947\uc948\uc949\uc94a\uc94b\uc94c\uc94d\uc94e\uc94f\uc950\uc951\uc952\uc953\uc954\uc955\uc956\uc957\uc958\uc959\uc95a\uc95b\uc95c\uc95d\uc95e\uc95f\uc960\uc961\uc962\uc963\uc964\uc965\uc966\uc967\uc968\uc969\uc96a\uc96b\uc96c\uc96d\uc96e\uc96f\uc970\uc971\uc972\uc973\uc974\uc975\uc976\uc977\uc978\uc979\uc97a\uc97b\uc97c\uc97d\uc97e\uc97f\uc980\uc981\uc982\uc983\uc984\uc985\uc986\uc987\uc988\uc989\uc98a\uc98b\uc98c\uc98d\uc98e\uc98f\uc990\uc991\uc992\uc993\uc994\uc995\uc996\uc997\uc998\uc999\uc99a\uc99b\uc99c\uc99d\uc99e\uc99f\uc9a0\uc9a1\uc9a2\uc9a3\uc9a4\uc9a5\uc9a6\uc9a7\uc9a8\uc9a9\uc9aa\uc9ab\uc9ac\uc9ad\uc9ae\uc9af\uc9b0\uc9b1\uc9b2\uc9b3\uc9b4\uc9b5\uc9b6\uc9b7\uc9b8\uc9b9\uc9ba\uc9bb\uc9bc\uc9bd\uc9be\uc9bf\uc9c0\uc9c1\uc9c2\uc9c3\uc9c4\uc9c5\uc9c6\uc9c7\uc9c8\uc9c9\uc9ca\uc9cb\uc9cc\uc9cd\uc9ce\uc9cf\uc9d0\uc9d1\uc9d2\uc9d3\uc9d4\uc9d5\uc9d6\uc9d7\uc9d8\uc9d9\uc9da\uc9db\uc9dc\uc9dd\uc9de\uc9df\uc9e0\uc9e1\uc9e2\uc9e3\uc9e4\uc9e5\uc9e6\uc9e7\uc9e8\uc9e9\uc9ea\uc9eb\uc9ec\uc9ed\uc9ee\uc9ef\uc9f0\uc9f1\uc9f2\uc9f3\uc9f4\uc9f5\uc9f6\uc9f7\uc9f8\uc9f9\uc9fa\uc9fb\uc9fc\uc9fd\uc9fe\uc9ff\uca00\uca01\uca02\uca03\uca04\uca05\uca06\uca07\uca08\uca09\uca0a\uca0b\uca0c\uca0d\uca0e\uca0f\uca10\uca11\uca12\uca13\uca14\uca15\uca16\uca17\uca18\uca19\uca1a\uca1b\uca1c\uca1d\uca1e\uca1f\uca20\uca21\uca22\uca23\uca24\uca25\uca26\uca27\uca28\uca29\uca2a\uca2b\uca2c\uca2d\uca2e\uca2f\uca30\uca31\uca32\uca33\uca34\uca35\uca36\uca37\uca38\uca39\uca3a\uca3b\uca3c\uca3d\uca3e\uca3f\uca40\uca41\uca42\uca43\uca44\uca45\uca46\uca47\uca48\uca49\uca4a\uca4b\uca4c\uca4d\uca4e\uca4f\uca50\uca51\uca52\uca53\uca54\uca55\uca56\uca57\uca58\uca59\uca5a\uca5b\uca5c\uca5d\uca5e\uca5f\uca60\uca61\uca62\uca63\uca64\uca65\uca66\uca67\uca68\uca69\uca6a\uca6b\uca6c\uca6d\uca6e\uca6f\uca70\uca71\uca72\uca73\uca74\uca75\uca76\uca77\uca78\uca79\uca7a\uca7b\uca7c\uca7d\uca7e\uca7f\uca80\uca81\uca82\uca83\uca84\uca85\uca86\uca87\uca88\uca89\uca8a\uca8b\uca8c\uca8d\uca8e\uca8f\uca90\uca91\uca92\uca93\uca94\uca95\uca96\uca97\uca98\uca99\uca9a\uca9b\uca9c\uca9d\uca9e\uca9f\ucaa0\ucaa1\ucaa2\ucaa3\ucaa4\ucaa5\ucaa6\ucaa7\ucaa8\ucaa9\ucaaa\ucaab\ucaac\ucaad\ucaae\ucaaf\ucab0\ucab1\ucab2\ucab3\ucab4\ucab5\ucab6\ucab7\ucab8\ucab9\ucaba\ucabb\ucabc\ucabd\ucabe\ucabf\ucac0\ucac1\ucac2\ucac3\ucac4\ucac5\ucac6\ucac7\ucac8\ucac9\ucaca\ucacb\ucacc\ucacd\ucace\ucacf\ucad0\ucad1\ucad2\ucad3\ucad4\ucad5\ucad6\ucad7\ucad8\ucad9\ucada\ucadb\ucadc\ucadd\ucade\ucadf\ucae0\ucae1\ucae2\ucae3\ucae4\ucae5\ucae6\ucae7\ucae8\ucae9\ucaea\ucaeb\ucaec\ucaed\ucaee\ucaef\ucaf0\ucaf1\ucaf2\ucaf3\ucaf4\ucaf5\ucaf6\ucaf7\ucaf8\ucaf9\ucafa\ucafb\ucafc\ucafd\ucafe\ucaff\ucb00\ucb01\ucb02\ucb03\ucb04\ucb05\ucb06\ucb07\ucb08\ucb09\ucb0a\ucb0b\ucb0c\ucb0d\ucb0e\ucb0f\ucb10\ucb11\ucb12\ucb13\ucb14\ucb15\ucb16\ucb17\ucb18\ucb19\ucb1a\ucb1b\ucb1c\ucb1d\ucb1e\ucb1f\ucb20\ucb21\ucb22\ucb23\ucb24\ucb25\ucb26\ucb27\ucb28\ucb29\ucb2a\ucb2b\ucb2c\ucb2d\ucb2e\ucb2f\ucb30\ucb31\ucb32\ucb33\ucb34\ucb35\ucb36\ucb37\ucb38\ucb39\ucb3a\ucb3b\ucb3c\ucb3d\ucb3e\ucb3f\ucb40\ucb41\ucb42\ucb43\ucb44\ucb45\ucb46\ucb47\ucb48\ucb49\ucb4a\ucb4b\ucb4c\ucb4d\ucb4e\ucb4f\ucb50\ucb51\ucb52\ucb53\ucb54\ucb55\ucb56\ucb57\ucb58\ucb59\ucb5a\ucb5b\ucb5c\ucb5d\ucb5e\ucb5f\ucb60\ucb61\ucb62\ucb63\ucb64\ucb65\ucb66\ucb67\ucb68\ucb69\ucb6a\ucb6b\ucb6c\ucb6d\ucb6e\ucb6f\ucb70\ucb71\ucb72\ucb73\ucb74\ucb75\ucb76\ucb77\ucb78\ucb79\ucb7a\ucb7b\ucb7c\ucb7d\ucb7e\ucb7f\ucb80\ucb81\ucb82\ucb83\ucb84\ucb85\ucb86\ucb87\ucb88\ucb89\ucb8a\ucb8b\ucb8c\ucb8d\ucb8e\ucb8f\ucb90\ucb91\ucb92\ucb93\ucb94\ucb95\ucb96\ucb97\ucb98\ucb99\ucb9a\ucb9b\ucb9c\ucb9d\ucb9e\ucb9f\ucba0\ucba1\ucba2\ucba3\ucba4\ucba5\ucba6\ucba7\ucba8\ucba9\ucbaa\ucbab\ucbac\ucbad\ucbae\ucbaf\ucbb0\ucbb1\ucbb2\ucbb3\ucbb4\ucbb5\ucbb6\ucbb7\ucbb8\ucbb9\ucbba\ucbbb\ucbbc\ucbbd\ucbbe\ucbbf\ucbc0\ucbc1\ucbc2\ucbc3\ucbc4\ucbc5\ucbc6\ucbc7\ucbc8\ucbc9\ucbca\ucbcb\ucbcc\ucbcd\ucbce\ucbcf\ucbd0\ucbd1\ucbd2\ucbd3\ucbd4\ucbd5\ucbd6\ucbd7\ucbd8\ucbd9\ucbda\ucbdb\ucbdc\ucbdd\ucbde\ucbdf\ucbe0\ucbe1\ucbe2\ucbe3\ucbe4\ucbe5\ucbe6\ucbe7\ucbe8\ucbe9\ucbea\ucbeb\ucbec\ucbed\ucbee\ucbef\ucbf0\ucbf1\ucbf2\ucbf3\ucbf4\ucbf5\ucbf6\ucbf7\ucbf8\ucbf9\ucbfa\ucbfb\ucbfc\ucbfd\ucbfe\ucbff\ucc00\ucc01\ucc02\ucc03\ucc04\ucc05\ucc06\ucc07\ucc08\ucc09\ucc0a\ucc0b\ucc0c\ucc0d\ucc0e\ucc0f\ucc10\ucc11\ucc12\ucc13\ucc14\ucc15\ucc16\ucc17\ucc18\ucc19\ucc1a\ucc1b\ucc1c\ucc1d\ucc1e\ucc1f\ucc20\ucc21\ucc22\ucc23\ucc24\ucc25\ucc26\ucc27\ucc28\ucc29\ucc2a\ucc2b\ucc2c\ucc2d\ucc2e\ucc2f\ucc30\ucc31\ucc32\ucc33\ucc34\ucc35\ucc36\ucc37\ucc38\ucc39\ucc3a\ucc3b\ucc3c\ucc3d\ucc3e\ucc3f\ucc40\ucc41\ucc42\ucc43\ucc44\ucc45\ucc46\ucc47\ucc48\ucc49\ucc4a\ucc4b\ucc4c\ucc4d\ucc4e\ucc4f\ucc50\ucc51\ucc52\ucc53\ucc54\ucc55\ucc56\ucc57\ucc58\ucc59\ucc5a\ucc5b\ucc5c\ucc5d\ucc5e\ucc5f\ucc60\ucc61\ucc62\ucc63\ucc64\ucc65\ucc66\ucc67\ucc68\ucc69\ucc6a\ucc6b\ucc6c\ucc6d\ucc6e\ucc6f\ucc70\ucc71\ucc72\ucc73\ucc74\ucc75\ucc76\ucc77\ucc78\ucc79\ucc7a\ucc7b\ucc7c\ucc7d\ucc7e\ucc7f\ucc80\ucc81\ucc82\ucc83\ucc84\ucc85\ucc86\ucc87\ucc88\ucc89\ucc8a\ucc8b\ucc8c\ucc8d\ucc8e\ucc8f\ucc90\ucc91\ucc92\ucc93\ucc94\ucc95\ucc96\ucc97\ucc98\ucc99\ucc9a\ucc9b\ucc9c\ucc9d\ucc9e\ucc9f\ucca0\ucca1\ucca2\ucca3\ucca4\ucca5\ucca6\ucca7\ucca8\ucca9\uccaa\uccab\uccac\uccad\uccae\uccaf\uccb0\uccb1\uccb2\uccb3\uccb4\uccb5\uccb6\uccb7\uccb8\uccb9\uccba\uccbb\uccbc\uccbd\uccbe\uccbf\uccc0\uccc1\uccc2\uccc3\uccc4\uccc5\uccc6\uccc7\uccc8\uccc9\uccca\ucccb\ucccc\ucccd\uccce\ucccf\uccd0\uccd1\uccd2\uccd3\uccd4\uccd5\uccd6\uccd7\uccd8\uccd9\uccda\uccdb\uccdc\uccdd\uccde\uccdf\ucce0\ucce1\ucce2\ucce3\ucce4\ucce5\ucce6\ucce7\ucce8\ucce9\uccea\ucceb\uccec\ucced\uccee\uccef\uccf0\uccf1\uccf2\uccf3\uccf4\uccf5\uccf6\uccf7\uccf8\uccf9\uccfa\uccfb\uccfc\uccfd\uccfe\uccff\ucd00\ucd01\ucd02\ucd03\ucd04\ucd05\ucd06\ucd07\ucd08\ucd09\ucd0a\ucd0b\ucd0c\ucd0d\ucd0e\ucd0f\ucd10\ucd11\ucd12\ucd13\ucd14\ucd15\ucd16\ucd17\ucd18\ucd19\ucd1a\ucd1b\ucd1c\ucd1d\ucd1e\ucd1f\ucd20\ucd21\ucd22\ucd23\ucd24\ucd25\ucd26\ucd27\ucd28\ucd29\ucd2a\ucd2b\ucd2c\ucd2d\ucd2e\ucd2f\ucd30\ucd31\ucd32\ucd33\ucd34\ucd35\ucd36\ucd37\ucd38\ucd39\ucd3a\ucd3b\ucd3c\ucd3d\ucd3e\ucd3f\ucd40\ucd41\ucd42\ucd43\ucd44\ucd45\ucd46\ucd47\ucd48\ucd49\ucd4a\ucd4b\ucd4c\ucd4d\ucd4e\ucd4f\ucd50\ucd51\ucd52\ucd53\ucd54\ucd55\ucd56\ucd57\ucd58\ucd59\ucd5a\ucd5b\ucd5c\ucd5d\ucd5e\ucd5f\ucd60\ucd61\ucd62\ucd63\ucd64\ucd65\ucd66\ucd67\ucd68\ucd69\ucd6a\ucd6b\ucd6c\ucd6d\ucd6e\ucd6f\ucd70\ucd71\ucd72\ucd73\ucd74\ucd75\ucd76\ucd77\ucd78\ucd79\ucd7a\ucd7b\ucd7c\ucd7d\ucd7e\ucd7f\ucd80\ucd81\ucd82\ucd83\ucd84\ucd85\ucd86\ucd87\ucd88\ucd89\ucd8a\ucd8b\ucd8c\ucd8d\ucd8e\ucd8f\ucd90\ucd91\ucd92\ucd93\ucd94\ucd95\ucd96\ucd97\ucd98\ucd99\ucd9a\ucd9b\ucd9c\ucd9d\ucd9e\ucd9f\ucda0\ucda1\ucda2\ucda3\ucda4\ucda5\ucda6\ucda7\ucda8\ucda9\ucdaa\ucdab\ucdac\ucdad\ucdae\ucdaf\ucdb0\ucdb1\ucdb2\ucdb3\ucdb4\ucdb5\ucdb6\ucdb7\ucdb8\ucdb9\ucdba\ucdbb\ucdbc\ucdbd\ucdbe\ucdbf\ucdc0\ucdc1\ucdc2\ucdc3\ucdc4\ucdc5\ucdc6\ucdc7\ucdc8\ucdc9\ucdca\ucdcb\ucdcc\ucdcd\ucdce\ucdcf\ucdd0\ucdd1\ucdd2\ucdd3\ucdd4\ucdd5\ucdd6\ucdd7\ucdd8\ucdd9\ucdda\ucddb\ucddc\ucddd\ucdde\ucddf\ucde0\ucde1\ucde2\ucde3\ucde4\ucde5\ucde6\ucde7\ucde8\ucde9\ucdea\ucdeb\ucdec\ucded\ucdee\ucdef\ucdf0\ucdf1\ucdf2\ucdf3\ucdf4\ucdf5\ucdf6\ucdf7\ucdf8\ucdf9\ucdfa\ucdfb\ucdfc\ucdfd\ucdfe\ucdff\uce00\uce01\uce02\uce03\uce04\uce05\uce06\uce07\uce08\uce09\uce0a\uce0b\uce0c\uce0d\uce0e\uce0f\uce10\uce11\uce12\uce13\uce14\uce15\uce16\uce17\uce18\uce19\uce1a\uce1b\uce1c\uce1d\uce1e\uce1f\uce20\uce21\uce22\uce23\uce24\uce25\uce26\uce27\uce28\uce29\uce2a\uce2b\uce2c\uce2d\uce2e\uce2f\uce30\uce31\uce32\uce33\uce34\uce35\uce36\uce37\uce38\uce39\uce3a\uce3b\uce3c\uce3d\uce3e\uce3f\uce40\uce41\uce42\uce43\uce44\uce45\uce46\uce47\uce48\uce49\uce4a\uce4b\uce4c\uce4d\uce4e\uce4f\uce50\uce51\uce52\uce53\uce54\uce55\uce56\uce57\uce58\uce59\uce5a\uce5b\uce5c\uce5d\uce5e\uce5f\uce60\uce61\uce62\uce63\uce64\uce65\uce66\uce67\uce68\uce69\uce6a\uce6b\uce6c\uce6d\uce6e\uce6f\uce70\uce71\uce72\uce73\uce74\uce75\uce76\uce77\uce78\uce79\uce7a\uce7b\uce7c\uce7d\uce7e\uce7f\uce80\uce81\uce82\uce83\uce84\uce85\uce86\uce87\uce88\uce89\uce8a\uce8b\uce8c\uce8d\uce8e\uce8f\uce90\uce91\uce92\uce93\uce94\uce95\uce96\uce97\uce98\uce99\uce9a\uce9b\uce9c\uce9d\uce9e\uce9f\ucea0\ucea1\ucea2\ucea3\ucea4\ucea5\ucea6\ucea7\ucea8\ucea9\uceaa\uceab\uceac\ucead\uceae\uceaf\uceb0\uceb1\uceb2\uceb3\uceb4\uceb5\uceb6\uceb7\uceb8\uceb9\uceba\ucebb\ucebc\ucebd\ucebe\ucebf\ucec0\ucec1\ucec2\ucec3\ucec4\ucec5\ucec6\ucec7\ucec8\ucec9\uceca\ucecb\ucecc\ucecd\ucece\ucecf\uced0\uced1\uced2\uced3\uced4\uced5\uced6\uced7\uced8\uced9\uceda\ucedb\ucedc\ucedd\ucede\ucedf\ucee0\ucee1\ucee2\ucee3\ucee4\ucee5\ucee6\ucee7\ucee8\ucee9\uceea\uceeb\uceec\uceed\uceee\uceef\ucef0\ucef1\ucef2\ucef3\ucef4\ucef5\ucef6\ucef7\ucef8\ucef9\ucefa\ucefb\ucefc\ucefd\ucefe\uceff\ucf00\ucf01\ucf02\ucf03\ucf04\ucf05\ucf06\ucf07\ucf08\ucf09\ucf0a\ucf0b\ucf0c\ucf0d\ucf0e\ucf0f\ucf10\ucf11\ucf12\ucf13\ucf14\ucf15\ucf16\ucf17\ucf18\ucf19\ucf1a\ucf1b\ucf1c\ucf1d\ucf1e\ucf1f\ucf20\ucf21\ucf22\ucf23\ucf24\ucf25\ucf26\ucf27\ucf28\ucf29\ucf2a\ucf2b\ucf2c\ucf2d\ucf2e\ucf2f\ucf30\ucf31\ucf32\ucf33\ucf34\ucf35\ucf36\ucf37\ucf38\ucf39\ucf3a\ucf3b\ucf3c\ucf3d\ucf3e\ucf3f\ucf40\ucf41\ucf42\ucf43\ucf44\ucf45\ucf46\ucf47\ucf48\ucf49\ucf4a\ucf4b\ucf4c\ucf4d\ucf4e\ucf4f\ucf50\ucf51\ucf52\ucf53\ucf54\ucf55\ucf56\ucf57\ucf58\ucf59\ucf5a\ucf5b\ucf5c\ucf5d\ucf5e\ucf5f\ucf60\ucf61\ucf62\ucf63\ucf64\ucf65\ucf66\ucf67\ucf68\ucf69\ucf6a\ucf6b\ucf6c\ucf6d\ucf6e\ucf6f\ucf70\ucf71\ucf72\ucf73\ucf74\ucf75\ucf76\ucf77\ucf78\ucf79\ucf7a\ucf7b\ucf7c\ucf7d\ucf7e\ucf7f\ucf80\ucf81\ucf82\ucf83\ucf84\ucf85\ucf86\ucf87\ucf88\ucf89\ucf8a\ucf8b\ucf8c\ucf8d\ucf8e\ucf8f\ucf90\ucf91\ucf92\ucf93\ucf94\ucf95\ucf96\ucf97\ucf98\ucf99\ucf9a\ucf9b\ucf9c\ucf9d\ucf9e\ucf9f\ucfa0\ucfa1\ucfa2\ucfa3\ucfa4\ucfa5\ucfa6\ucfa7\ucfa8\ucfa9\ucfaa\ucfab\ucfac\ucfad\ucfae\ucfaf\ucfb0\ucfb1\ucfb2\ucfb3\ucfb4\ucfb5\ucfb6\ucfb7\ucfb8\ucfb9\ucfba\ucfbb\ucfbc\ucfbd\ucfbe\ucfbf\ucfc0\ucfc1\ucfc2\ucfc3\ucfc4\ucfc5\ucfc6\ucfc7\ucfc8\ucfc9\ucfca\ucfcb\ucfcc\ucfcd\ucfce\ucfcf\ucfd0\ucfd1\ucfd2\ucfd3\ucfd4\ucfd5\ucfd6\ucfd7\ucfd8\ucfd9\ucfda\ucfdb\ucfdc\ucfdd\ucfde\ucfdf\ucfe0\ucfe1\ucfe2\ucfe3\ucfe4\ucfe5\ucfe6\ucfe7\ucfe8\ucfe9\ucfea\ucfeb\ucfec\ucfed\ucfee\ucfef\ucff0\ucff1\ucff2\ucff3\ucff4\ucff5\ucff6\ucff7\ucff8\ucff9\ucffa\ucffb\ucffc\ucffd\ucffe\ucfff\ud000\ud001\ud002\ud003\ud004\ud005\ud006\ud007\ud008\ud009\ud00a\ud00b\ud00c\ud00d\ud00e\ud00f\ud010\ud011\ud012\ud013\ud014\ud015\ud016\ud017\ud018\ud019\ud01a\ud01b\ud01c\ud01d\ud01e\ud01f\ud020\ud021\ud022\ud023\ud024\ud025\ud026\ud027\ud028\ud029\ud02a\ud02b\ud02c\ud02d\ud02e\ud02f\ud030\ud031\ud032\ud033\ud034\ud035\ud036\ud037\ud038\ud039\ud03a\ud03b\ud03c\ud03d\ud03e\ud03f\ud040\ud041\ud042\ud043\ud044\ud045\ud046\ud047\ud048\ud049\ud04a\ud04b\ud04c\ud04d\ud04e\ud04f\ud050\ud051\ud052\ud053\ud054\ud055\ud056\ud057\ud058\ud059\ud05a\ud05b\ud05c\ud05d\ud05e\ud05f\ud060\ud061\ud062\ud063\ud064\ud065\ud066\ud067\ud068\ud069\ud06a\ud06b\ud06c\ud06d\ud06e\ud06f\ud070\ud071\ud072\ud073\ud074\ud075\ud076\ud077\ud078\ud079\ud07a\ud07b\ud07c\ud07d\ud07e\ud07f\ud080\ud081\ud082\ud083\ud084\ud085\ud086\ud087\ud088\ud089\ud08a\ud08b\ud08c\ud08d\ud08e\ud08f\ud090\ud091\ud092\ud093\ud094\ud095\ud096\ud097\ud098\ud099\ud09a\ud09b\ud09c\ud09d\ud09e\ud09f\ud0a0\ud0a1\ud0a2\ud0a3\ud0a4\ud0a5\ud0a6\ud0a7\ud0a8\ud0a9\ud0aa\ud0ab\ud0ac\ud0ad\ud0ae\ud0af\ud0b0\ud0b1\ud0b2\ud0b3\ud0b4\ud0b5\ud0b6\ud0b7\ud0b8\ud0b9\ud0ba\ud0bb\ud0bc\ud0bd\ud0be\ud0bf\ud0c0\ud0c1\ud0c2\ud0c3\ud0c4\ud0c5\ud0c6\ud0c7\ud0c8\ud0c9\ud0ca\ud0cb\ud0cc\ud0cd\ud0ce\ud0cf\ud0d0\ud0d1\ud0d2\ud0d3\ud0d4\ud0d5\ud0d6\ud0d7\ud0d8\ud0d9\ud0da\ud0db\ud0dc\ud0dd\ud0de\ud0df\ud0e0\ud0e1\ud0e2\ud0e3\ud0e4\ud0e5\ud0e6\ud0e7\ud0e8\ud0e9\ud0ea\ud0eb\ud0ec\ud0ed\ud0ee\ud0ef\ud0f0\ud0f1\ud0f2\ud0f3\ud0f4\ud0f5\ud0f6\ud0f7\ud0f8\ud0f9\ud0fa\ud0fb\ud0fc\ud0fd\ud0fe\ud0ff\ud100\ud101\ud102\ud103\ud104\ud105\ud106\ud107\ud108\ud109\ud10a\ud10b\ud10c\ud10d\ud10e\ud10f\ud110\ud111\ud112\ud113\ud114\ud115\ud116\ud117\ud118\ud119\ud11a\ud11b\ud11c\ud11d\ud11e\ud11f\ud120\ud121\ud122\ud123\ud124\ud125\ud126\ud127\ud128\ud129\ud12a\ud12b\ud12c\ud12d\ud12e\ud12f\ud130\ud131\ud132\ud133\ud134\ud135\ud136\ud137\ud138\ud139\ud13a\ud13b\ud13c\ud13d\ud13e\ud13f\ud140\ud141\ud142\ud143\ud144\ud145\ud146\ud147\ud148\ud149\ud14a\ud14b\ud14c\ud14d\ud14e\ud14f\ud150\ud151\ud152\ud153\ud154\ud155\ud156\ud157\ud158\ud159\ud15a\ud15b\ud15c\ud15d\ud15e\ud15f\ud160\ud161\ud162\ud163\ud164\ud165\ud166\ud167\ud168\ud169\ud16a\ud16b\ud16c\ud16d\ud16e\ud16f\ud170\ud171\ud172\ud173\ud174\ud175\ud176\ud177\ud178\ud179\ud17a\ud17b\ud17c\ud17d\ud17e\ud17f\ud180\ud181\ud182\ud183\ud184\ud185\ud186\ud187\ud188\ud189\ud18a\ud18b\ud18c\ud18d\ud18e\ud18f\ud190\ud191\ud192\ud193\ud194\ud195\ud196\ud197\ud198\ud199\ud19a\ud19b\ud19c\ud19d\ud19e\ud19f\ud1a0\ud1a1\ud1a2\ud1a3\ud1a4\ud1a5\ud1a6\ud1a7\ud1a8\ud1a9\ud1aa\ud1ab\ud1ac\ud1ad\ud1ae\ud1af\ud1b0\ud1b1\ud1b2\ud1b3\ud1b4\ud1b5\ud1b6\ud1b7\ud1b8\ud1b9\ud1ba\ud1bb\ud1bc\ud1bd\ud1be\ud1bf\ud1c0\ud1c1\ud1c2\ud1c3\ud1c4\ud1c5\ud1c6\ud1c7\ud1c8\ud1c9\ud1ca\ud1cb\ud1cc\ud1cd\ud1ce\ud1cf\ud1d0\ud1d1\ud1d2\ud1d3\ud1d4\ud1d5\ud1d6\ud1d7\ud1d8\ud1d9\ud1da\ud1db\ud1dc\ud1dd\ud1de\ud1df\ud1e0\ud1e1\ud1e2\ud1e3\ud1e4\ud1e5\ud1e6\ud1e7\ud1e8\ud1e9\ud1ea\ud1eb\ud1ec\ud1ed\ud1ee\ud1ef\ud1f0\ud1f1\ud1f2\ud1f3\ud1f4\ud1f5\ud1f6\ud1f7\ud1f8\ud1f9\ud1fa\ud1fb\ud1fc\ud1fd\ud1fe\ud1ff\ud200\ud201\ud202\ud203\ud204\ud205\ud206\ud207\ud208\ud209\ud20a\ud20b\ud20c\ud20d\ud20e\ud20f\ud210\ud211\ud212\ud213\ud214\ud215\ud216\ud217\ud218\ud219\ud21a\ud21b\ud21c\ud21d\ud21e\ud21f\ud220\ud221\ud222\ud223\ud224\ud225\ud226\ud227\ud228\ud229\ud22a\ud22b\ud22c\ud22d\ud22e\ud22f\ud230\ud231\ud232\ud233\ud234\ud235\ud236\ud237\ud238\ud239\ud23a\ud23b\ud23c\ud23d\ud23e\ud23f\ud240\ud241\ud242\ud243\ud244\ud245\ud246\ud247\ud248\ud249\ud24a\ud24b\ud24c\ud24d\ud24e\ud24f\ud250\ud251\ud252\ud253\ud254\ud255\ud256\ud257\ud258\ud259\ud25a\ud25b\ud25c\ud25d\ud25e\ud25f\ud260\ud261\ud262\ud263\ud264\ud265\ud266\ud267\ud268\ud269\ud26a\ud26b\ud26c\ud26d\ud26e\ud26f\ud270\ud271\ud272\ud273\ud274\ud275\ud276\ud277\ud278\ud279\ud27a\ud27b\ud27c\ud27d\ud27e\ud27f\ud280\ud281\ud282\ud283\ud284\ud285\ud286\ud287\ud288\ud289\ud28a\ud28b\ud28c\ud28d\ud28e\ud28f\ud290\ud291\ud292\ud293\ud294\ud295\ud296\ud297\ud298\ud299\ud29a\ud29b\ud29c\ud29d\ud29e\ud29f\ud2a0\ud2a1\ud2a2\ud2a3\ud2a4\ud2a5\ud2a6\ud2a7\ud2a8\ud2a9\ud2aa\ud2ab\ud2ac\ud2ad\ud2ae\ud2af\ud2b0\ud2b1\ud2b2\ud2b3\ud2b4\ud2b5\ud2b6\ud2b7\ud2b8\ud2b9\ud2ba\ud2bb\ud2bc\ud2bd\ud2be\ud2bf\ud2c0\ud2c1\ud2c2\ud2c3\ud2c4\ud2c5\ud2c6\ud2c7\ud2c8\ud2c9\ud2ca\ud2cb\ud2cc\ud2cd\ud2ce\ud2cf\ud2d0\ud2d1\ud2d2\ud2d3\ud2d4\ud2d5\ud2d6\ud2d7\ud2d8\ud2d9\ud2da\ud2db\ud2dc\ud2dd\ud2de\ud2df\ud2e0\ud2e1\ud2e2\ud2e3\ud2e4\ud2e5\ud2e6\ud2e7\ud2e8\ud2e9\ud2ea\ud2eb\ud2ec\ud2ed\ud2ee\ud2ef\ud2f0\ud2f1\ud2f2\ud2f3\ud2f4\ud2f5\ud2f6\ud2f7\ud2f8\ud2f9\ud2fa\ud2fb\ud2fc\ud2fd\ud2fe\ud2ff\ud300\ud301\ud302\ud303\ud304\ud305\ud306\ud307\ud308\ud309\ud30a\ud30b\ud30c\ud30d\ud30e\ud30f\ud310\ud311\ud312\ud313\ud314\ud315\ud316\ud317\ud318\ud319\ud31a\ud31b\ud31c\ud31d\ud31e\ud31f\ud320\ud321\ud322\ud323\ud324\ud325\ud326\ud327\ud328\ud329\ud32a\ud32b\ud32c\ud32d\ud32e\ud32f\ud330\ud331\ud332\ud333\ud334\ud335\ud336\ud337\ud338\ud339\ud33a\ud33b\ud33c\ud33d\ud33e\ud33f\ud340\ud341\ud342\ud343\ud344\ud345\ud346\ud347\ud348\ud349\ud34a\ud34b\ud34c\ud34d\ud34e\ud34f\ud350\ud351\ud352\ud353\ud354\ud355\ud356\ud357\ud358\ud359\ud35a\ud35b\ud35c\ud35d\ud35e\ud35f\ud360\ud361\ud362\ud363\ud364\ud365\ud366\ud367\ud368\ud369\ud36a\ud36b\ud36c\ud36d\ud36e\ud36f\ud370\ud371\ud372\ud373\ud374\ud375\ud376\ud377\ud378\ud379\ud37a\ud37b\ud37c\ud37d\ud37e\ud37f\ud380\ud381\ud382\ud383\ud384\ud385\ud386\ud387\ud388\ud389\ud38a\ud38b\ud38c\ud38d\ud38e\ud38f\ud390\ud391\ud392\ud393\ud394\ud395\ud396\ud397\ud398\ud399\ud39a\ud39b\ud39c\ud39d\ud39e\ud39f\ud3a0\ud3a1\ud3a2\ud3a3\ud3a4\ud3a5\ud3a6\ud3a7\ud3a8\ud3a9\ud3aa\ud3ab\ud3ac\ud3ad\ud3ae\ud3af\ud3b0\ud3b1\ud3b2\ud3b3\ud3b4\ud3b5\ud3b6\ud3b7\ud3b8\ud3b9\ud3ba\ud3bb\ud3bc\ud3bd\ud3be\ud3bf\ud3c0\ud3c1\ud3c2\ud3c3\ud3c4\ud3c5\ud3c6\ud3c7\ud3c8\ud3c9\ud3ca\ud3cb\ud3cc\ud3cd\ud3ce\ud3cf\ud3d0\ud3d1\ud3d2\ud3d3\ud3d4\ud3d5\ud3d6\ud3d7\ud3d8\ud3d9\ud3da\ud3db\ud3dc\ud3dd\ud3de\ud3df\ud3e0\ud3e1\ud3e2\ud3e3\ud3e4\ud3e5\ud3e6\ud3e7\ud3e8\ud3e9\ud3ea\ud3eb\ud3ec\ud3ed\ud3ee\ud3ef\ud3f0\ud3f1\ud3f2\ud3f3\ud3f4\ud3f5\ud3f6\ud3f7\ud3f8\ud3f9\ud3fa\ud3fb\ud3fc\ud3fd\ud3fe\ud3ff\ud400\ud401\ud402\ud403\ud404\ud405\ud406\ud407\ud408\ud409\ud40a\ud40b\ud40c\ud40d\ud40e\ud40f\ud410\ud411\ud412\ud413\ud414\ud415\ud416\ud417\ud418\ud419\ud41a\ud41b\ud41c\ud41d\ud41e\ud41f\ud420\ud421\ud422\ud423\ud424\ud425\ud426\ud427\ud428\ud429\ud42a\ud42b\ud42c\ud42d\ud42e\ud42f\ud430\ud431\ud432\ud433\ud434\ud435\ud436\ud437\ud438\ud439\ud43a\ud43b\ud43c\ud43d\ud43e\ud43f\ud440\ud441\ud442\ud443\ud444\ud445\ud446\ud447\ud448\ud449\ud44a\ud44b\ud44c\ud44d\ud44e\ud44f\ud450\ud451\ud452\ud453\ud454\ud455\ud456\ud457\ud458\ud459\ud45a\ud45b\ud45c\ud45d\ud45e\ud45f\ud460\ud461\ud462\ud463\ud464\ud465\ud466\ud467\ud468\ud469\ud46a\ud46b\ud46c\ud46d\ud46e\ud46f\ud470\ud471\ud472\ud473\ud474\ud475\ud476\ud477\ud478\ud479\ud47a\ud47b\ud47c\ud47d\ud47e\ud47f\ud480\ud481\ud482\ud483\ud484\ud485\ud486\ud487\ud488\ud489\ud48a\ud48b\ud48c\ud48d\ud48e\ud48f\ud490\ud491\ud492\ud493\ud494\ud495\ud496\ud497\ud498\ud499\ud49a\ud49b\ud49c\ud49d\ud49e\ud49f\ud4a0\ud4a1\ud4a2\ud4a3\ud4a4\ud4a5\ud4a6\ud4a7\ud4a8\ud4a9\ud4aa\ud4ab\ud4ac\ud4ad\ud4ae\ud4af\ud4b0\ud4b1\ud4b2\ud4b3\ud4b4\ud4b5\ud4b6\ud4b7\ud4b8\ud4b9\ud4ba\ud4bb\ud4bc\ud4bd\ud4be\ud4bf\ud4c0\ud4c1\ud4c2\ud4c3\ud4c4\ud4c5\ud4c6\ud4c7\ud4c8\ud4c9\ud4ca\ud4cb\ud4cc\ud4cd\ud4ce\ud4cf\ud4d0\ud4d1\ud4d2\ud4d3\ud4d4\ud4d5\ud4d6\ud4d7\ud4d8\ud4d9\ud4da\ud4db\ud4dc\ud4dd\ud4de\ud4df\ud4e0\ud4e1\ud4e2\ud4e3\ud4e4\ud4e5\ud4e6\ud4e7\ud4e8\ud4e9\ud4ea\ud4eb\ud4ec\ud4ed\ud4ee\ud4ef\ud4f0\ud4f1\ud4f2\ud4f3\ud4f4\ud4f5\ud4f6\ud4f7\ud4f8\ud4f9\ud4fa\ud4fb\ud4fc\ud4fd\ud4fe\ud4ff\ud500\ud501\ud502\ud503\ud504\ud505\ud506\ud507\ud508\ud509\ud50a\ud50b\ud50c\ud50d\ud50e\ud50f\ud510\ud511\ud512\ud513\ud514\ud515\ud516\ud517\ud518\ud519\ud51a\ud51b\ud51c\ud51d\ud51e\ud51f\ud520\ud521\ud522\ud523\ud524\ud525\ud526\ud527\ud528\ud529\ud52a\ud52b\ud52c\ud52d\ud52e\ud52f\ud530\ud531\ud532\ud533\ud534\ud535\ud536\ud537\ud538\ud539\ud53a\ud53b\ud53c\ud53d\ud53e\ud53f\ud540\ud541\ud542\ud543\ud544\ud545\ud546\ud547\ud548\ud549\ud54a\ud54b\ud54c\ud54d\ud54e\ud54f\ud550\ud551\ud552\ud553\ud554\ud555\ud556\ud557\ud558\ud559\ud55a\ud55b\ud55c\ud55d\ud55e\ud55f\ud560\ud561\ud562\ud563\ud564\ud565\ud566\ud567\ud568\ud569\ud56a\ud56b\ud56c\ud56d\ud56e\ud56f\ud570\ud571\ud572\ud573\ud574\ud575\ud576\ud577\ud578\ud579\ud57a\ud57b\ud57c\ud57d\ud57e\ud57f\ud580\ud581\ud582\ud583\ud584\ud585\ud586\ud587\ud588\ud589\ud58a\ud58b\ud58c\ud58d\ud58e\ud58f\ud590\ud591\ud592\ud593\ud594\ud595\ud596\ud597\ud598\ud599\ud59a\ud59b\ud59c\ud59d\ud59e\ud59f\ud5a0\ud5a1\ud5a2\ud5a3\ud5a4\ud5a5\ud5a6\ud5a7\ud5a8\ud5a9\ud5aa\ud5ab\ud5ac\ud5ad\ud5ae\ud5af\ud5b0\ud5b1\ud5b2\ud5b3\ud5b4\ud5b5\ud5b6\ud5b7\ud5b8\ud5b9\ud5ba\ud5bb\ud5bc\ud5bd\ud5be\ud5bf\ud5c0\ud5c1\ud5c2\ud5c3\ud5c4\ud5c5\ud5c6\ud5c7\ud5c8\ud5c9\ud5ca\ud5cb\ud5cc\ud5cd\ud5ce\ud5cf\ud5d0\ud5d1\ud5d2\ud5d3\ud5d4\ud5d5\ud5d6\ud5d7\ud5d8\ud5d9\ud5da\ud5db\ud5dc\ud5dd\ud5de\ud5df\ud5e0\ud5e1\ud5e2\ud5e3\ud5e4\ud5e5\ud5e6\ud5e7\ud5e8\ud5e9\ud5ea\ud5eb\ud5ec\ud5ed\ud5ee\ud5ef\ud5f0\ud5f1\ud5f2\ud5f3\ud5f4\ud5f5\ud5f6\ud5f7\ud5f8\ud5f9\ud5fa\ud5fb\ud5fc\ud5fd\ud5fe\ud5ff\ud600\ud601\ud602\ud603\ud604\ud605\ud606\ud607\ud608\ud609\ud60a\ud60b\ud60c\ud60d\ud60e\ud60f\ud610\ud611\ud612\ud613\ud614\ud615\ud616\ud617\ud618\ud619\ud61a\ud61b\ud61c\ud61d\ud61e\ud61f\ud620\ud621\ud622\ud623\ud624\ud625\ud626\ud627\ud628\ud629\ud62a\ud62b\ud62c\ud62d\ud62e\ud62f\ud630\ud631\ud632\ud633\ud634\ud635\ud636\ud637\ud638\ud639\ud63a\ud63b\ud63c\ud63d\ud63e\ud63f\ud640\ud641\ud642\ud643\ud644\ud645\ud646\ud647\ud648\ud649\ud64a\ud64b\ud64c\ud64d\ud64e\ud64f\ud650\ud651\ud652\ud653\ud654\ud655\ud656\ud657\ud658\ud659\ud65a\ud65b\ud65c\ud65d\ud65e\ud65f\ud660\ud661\ud662\ud663\ud664\ud665\ud666\ud667\ud668\ud669\ud66a\ud66b\ud66c\ud66d\ud66e\ud66f\ud670\ud671\ud672\ud673\ud674\ud675\ud676\ud677\ud678\ud679\ud67a\ud67b\ud67c\ud67d\ud67e\ud67f\ud680\ud681\ud682\ud683\ud684\ud685\ud686\ud687\ud688\ud689\ud68a\ud68b\ud68c\ud68d\ud68e\ud68f\ud690\ud691\ud692\ud693\ud694\ud695\ud696\ud697\ud698\ud699\ud69a\ud69b\ud69c\ud69d\ud69e\ud69f\ud6a0\ud6a1\ud6a2\ud6a3\ud6a4\ud6a5\ud6a6\ud6a7\ud6a8\ud6a9\ud6aa\ud6ab\ud6ac\ud6ad\ud6ae\ud6af\ud6b0\ud6b1\ud6b2\ud6b3\ud6b4\ud6b5\ud6b6\ud6b7\ud6b8\ud6b9\ud6ba\ud6bb\ud6bc\ud6bd\ud6be\ud6bf\ud6c0\ud6c1\ud6c2\ud6c3\ud6c4\ud6c5\ud6c6\ud6c7\ud6c8\ud6c9\ud6ca\ud6cb\ud6cc\ud6cd\ud6ce\ud6cf\ud6d0\ud6d1\ud6d2\ud6d3\ud6d4\ud6d5\ud6d6\ud6d7\ud6d8\ud6d9\ud6da\ud6db\ud6dc\ud6dd\ud6de\ud6df\ud6e0\ud6e1\ud6e2\ud6e3\ud6e4\ud6e5\ud6e6\ud6e7\ud6e8\ud6e9\ud6ea\ud6eb\ud6ec\ud6ed\ud6ee\ud6ef\ud6f0\ud6f1\ud6f2\ud6f3\ud6f4\ud6f5\ud6f6\ud6f7\ud6f8\ud6f9\ud6fa\ud6fb\ud6fc\ud6fd\ud6fe\ud6ff\ud700\ud701\ud702\ud703\ud704\ud705\ud706\ud707\ud708\ud709\ud70a\ud70b\ud70c\ud70d\ud70e\ud70f\ud710\ud711\ud712\ud713\ud714\ud715\ud716\ud717\ud718\ud719\ud71a\ud71b\ud71c\ud71d\ud71e\ud71f\ud720\ud721\ud722\ud723\ud724\ud725\ud726\ud727\ud728\ud729\ud72a\ud72b\ud72c\ud72d\ud72e\ud72f\ud730\ud731\ud732\ud733\ud734\ud735\ud736\ud737\ud738\ud739\ud73a\ud73b\ud73c\ud73d\ud73e\ud73f\ud740\ud741\ud742\ud743\ud744\ud745\ud746\ud747\ud748\ud749\ud74a\ud74b\ud74c\ud74d\ud74e\ud74f\ud750\ud751\ud752\ud753\ud754\ud755\ud756\ud757\ud758\ud759\ud75a\ud75b\ud75c\ud75d\ud75e\ud75f\ud760\ud761\ud762\ud763\ud764\ud765\ud766\ud767\ud768\ud769\ud76a\ud76b\ud76c\ud76d\ud76e\ud76f\ud770\ud771\ud772\ud773\ud774\ud775\ud776\ud777\ud778\ud779\ud77a\ud77b\ud77c\ud77d\ud77e\ud77f\ud780\ud781\ud782\ud783\ud784\ud785\ud786\ud787\ud788\ud789\ud78a\ud78b\ud78c\ud78d\ud78e\ud78f\ud790\ud791\ud792\ud793\ud794\ud795\ud796\ud797\ud798\ud799\ud79a\ud79b\ud79c\ud79d\ud79e\ud79f\ud7a0\ud7a1\ud7a2\ud7a3\uf900\uf901\uf902\uf903\uf904\uf905\uf906\uf907\uf908\uf909\uf90a\uf90b\uf90c\uf90d\uf90e\uf90f\uf910\uf911\uf912\uf913\uf914\uf915\uf916\uf917\uf918\uf919\uf91a\uf91b\uf91c\uf91d\uf91e\uf91f\uf920\uf921\uf922\uf923\uf924\uf925\uf926\uf927\uf928\uf929\uf92a\uf92b\uf92c\uf92d\uf92e\uf92f\uf930\uf931\uf932\uf933\uf934\uf935\uf936\uf937\uf938\uf939\uf93a\uf93b\uf93c\uf93d\uf93e\uf93f\uf940\uf941\uf942\uf943\uf944\uf945\uf946\uf947\uf948\uf949\uf94a\uf94b\uf94c\uf94d\uf94e\uf94f\uf950\uf951\uf952\uf953\uf954\uf955\uf956\uf957\uf958\uf959\uf95a\uf95b\uf95c\uf95d\uf95e\uf95f\uf960\uf961\uf962\uf963\uf964\uf965\uf966\uf967\uf968\uf969\uf96a\uf96b\uf96c\uf96d\uf96e\uf96f\uf970\uf971\uf972\uf973\uf974\uf975\uf976\uf977\uf978\uf979\uf97a\uf97b\uf97c\uf97d\uf97e\uf97f\uf980\uf981\uf982\uf983\uf984\uf985\uf986\uf987\uf988\uf989\uf98a\uf98b\uf98c\uf98d\uf98e\uf98f\uf990\uf991\uf992\uf993\uf994\uf995\uf996\uf997\uf998\uf999\uf99a\uf99b\uf99c\uf99d\uf99e\uf99f\uf9a0\uf9a1\uf9a2\uf9a3\uf9a4\uf9a5\uf9a6\uf9a7\uf9a8\uf9a9\uf9aa\uf9ab\uf9ac\uf9ad\uf9ae\uf9af\uf9b0\uf9b1\uf9b2\uf9b3\uf9b4\uf9b5\uf9b6\uf9b7\uf9b8\uf9b9\uf9ba\uf9bb\uf9bc\uf9bd\uf9be\uf9bf\uf9c0\uf9c1\uf9c2\uf9c3\uf9c4\uf9c5\uf9c6\uf9c7\uf9c8\uf9c9\uf9ca\uf9cb\uf9cc\uf9cd\uf9ce\uf9cf\uf9d0\uf9d1\uf9d2\uf9d3\uf9d4\uf9d5\uf9d6\uf9d7\uf9d8\uf9d9\uf9da\uf9db\uf9dc\uf9dd\uf9de\uf9df\uf9e0\uf9e1\uf9e2\uf9e3\uf9e4\uf9e5\uf9e6\uf9e7\uf9e8\uf9e9\uf9ea\uf9eb\uf9ec\uf9ed\uf9ee\uf9ef\uf9f0\uf9f1\uf9f2\uf9f3\uf9f4\uf9f5\uf9f6\uf9f7\uf9f8\uf9f9\uf9fa\uf9fb\uf9fc\uf9fd\uf9fe\uf9ff\ufa00\ufa01\ufa02\ufa03\ufa04\ufa05\ufa06\ufa07\ufa08\ufa09\ufa0a\ufa0b\ufa0c\ufa0d\ufa0e\ufa0f\ufa10\ufa11\ufa12\ufa13\ufa14\ufa15\ufa16\ufa17\ufa18\ufa19\ufa1a\ufa1b\ufa1c\ufa1d\ufa1e\ufa1f\ufa20\ufa21\ufa22\ufa23\ufa24\ufa25\ufa26\ufa27\ufa28\ufa29\ufa2a\ufa2b\ufa2c\ufa2d\ufa30\ufa31\ufa32\ufa33\ufa34\ufa35\ufa36\ufa37\ufa38\ufa39\ufa3a\ufa3b\ufa3c\ufa3d\ufa3e\ufa3f\ufa40\ufa41\ufa42\ufa43\ufa44\ufa45\ufa46\ufa47\ufa48\ufa49\ufa4a\ufa4b\ufa4c\ufa4d\ufa4e\ufa4f\ufa50\ufa51\ufa52\ufa53\ufa54\ufa55\ufa56\ufa57\ufa58\ufa59\ufa5a\ufa5b\ufa5c\ufa5d\ufa5e\ufa5f\ufa60\ufa61\ufa62\ufa63\ufa64\ufa65\ufa66\ufa67\ufa68\ufa69\ufa6a\ufa70\ufa71\ufa72\ufa73\ufa74\ufa75\ufa76\ufa77\ufa78\ufa79\ufa7a\ufa7b\ufa7c\ufa7d\ufa7e\ufa7f\ufa80\ufa81\ufa82\ufa83\ufa84\ufa85\ufa86\ufa87\ufa88\ufa89\ufa8a\ufa8b\ufa8c\ufa8d\ufa8e\ufa8f\ufa90\ufa91\ufa92\ufa93\ufa94\ufa95\ufa96\ufa97\ufa98\ufa99\ufa9a\ufa9b\ufa9c\ufa9d\ufa9e\ufa9f\ufaa0\ufaa1\ufaa2\ufaa3\ufaa4\ufaa5\ufaa6\ufaa7\ufaa8\ufaa9\ufaaa\ufaab\ufaac\ufaad\ufaae\ufaaf\ufab0\ufab1\ufab2\ufab3\ufab4\ufab5\ufab6\ufab7\ufab8\ufab9\ufaba\ufabb\ufabc\ufabd\ufabe\ufabf\ufac0\ufac1\ufac2\ufac3\ufac4\ufac5\ufac6\ufac7\ufac8\ufac9\ufaca\ufacb\ufacc\ufacd\uface\ufacf\ufad0\ufad1\ufad2\ufad3\ufad4\ufad5\ufad6\ufad7\ufad8\ufad9\ufb1d\ufb1f\ufb20\ufb21\ufb22\ufb23\ufb24\ufb25\ufb26\ufb27\ufb28\ufb2a\ufb2b\ufb2c\ufb2d\ufb2e\ufb2f\ufb30\ufb31\ufb32\ufb33\ufb34\ufb35\ufb36\ufb38\ufb39\ufb3a\ufb3b\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46\ufb47\ufb48\ufb49\ufb4a\ufb4b\ufb4c\ufb4d\ufb4e\ufb4f\ufb50\ufb51\ufb52\ufb53\ufb54\ufb55\ufb56\ufb57\ufb58\ufb59\ufb5a\ufb5b\ufb5c\ufb5d\ufb5e\ufb5f\ufb60\ufb61\ufb62\ufb63\ufb64\ufb65\ufb66\ufb67\ufb68\ufb69\ufb6a\ufb6b\ufb6c\ufb6d\ufb6e\ufb6f\ufb70\ufb71\ufb72\ufb73\ufb74\ufb75\ufb76\ufb77\ufb78\ufb79\ufb7a\ufb7b\ufb7c\ufb7d\ufb7e\ufb7f\ufb80\ufb81\ufb82\ufb83\ufb84\ufb85\ufb86\ufb87\ufb88\ufb89\ufb8a\ufb8b\ufb8c\ufb8d\ufb8e\ufb8f\ufb90\ufb91\ufb92\ufb93\ufb94\ufb95\ufb96\ufb97\ufb98\ufb99\ufb9a\ufb9b\ufb9c\ufb9d\ufb9e\ufb9f\ufba0\ufba1\ufba2\ufba3\ufba4\ufba5\ufba6\ufba7\ufba8\ufba9\ufbaa\ufbab\ufbac\ufbad\ufbae\ufbaf\ufbb0\ufbb1\ufbd3\ufbd4\ufbd5\ufbd6\ufbd7\ufbd8\ufbd9\ufbda\ufbdb\ufbdc\ufbdd\ufbde\ufbdf\ufbe0\ufbe1\ufbe2\ufbe3\ufbe4\ufbe5\ufbe6\ufbe7\ufbe8\ufbe9\ufbea\ufbeb\ufbec\ufbed\ufbee\ufbef\ufbf0\ufbf1\ufbf2\ufbf3\ufbf4\ufbf5\ufbf6\ufbf7\ufbf8\ufbf9\ufbfa\ufbfb\ufbfc\ufbfd\ufbfe\ufbff\ufc00\ufc01\ufc02\ufc03\ufc04\ufc05\ufc06\ufc07\ufc08\ufc09\ufc0a\ufc0b\ufc0c\ufc0d\ufc0e\ufc0f\ufc10\ufc11\ufc12\ufc13\ufc14\ufc15\ufc16\ufc17\ufc18\ufc19\ufc1a\ufc1b\ufc1c\ufc1d\ufc1e\ufc1f\ufc20\ufc21\ufc22\ufc23\ufc24\ufc25\ufc26\ufc27\ufc28\ufc29\ufc2a\ufc2b\ufc2c\ufc2d\ufc2e\ufc2f\ufc30\ufc31\ufc32\ufc33\ufc34\ufc35\ufc36\ufc37\ufc38\ufc39\ufc3a\ufc3b\ufc3c\ufc3d\ufc3e\ufc3f\ufc40\ufc41\ufc42\ufc43\ufc44\ufc45\ufc46\ufc47\ufc48\ufc49\ufc4a\ufc4b\ufc4c\ufc4d\ufc4e\ufc4f\ufc50\ufc51\ufc52\ufc53\ufc54\ufc55\ufc56\ufc57\ufc58\ufc59\ufc5a\ufc5b\ufc5c\ufc5d\ufc5e\ufc5f\ufc60\ufc61\ufc62\ufc63\ufc64\ufc65\ufc66\ufc67\ufc68\ufc69\ufc6a\ufc6b\ufc6c\ufc6d\ufc6e\ufc6f\ufc70\ufc71\ufc72\ufc73\ufc74\ufc75\ufc76\ufc77\ufc78\ufc79\ufc7a\ufc7b\ufc7c\ufc7d\ufc7e\ufc7f\ufc80\ufc81\ufc82\ufc83\ufc84\ufc85\ufc86\ufc87\ufc88\ufc89\ufc8a\ufc8b\ufc8c\ufc8d\ufc8e\ufc8f\ufc90\ufc91\ufc92\ufc93\ufc94\ufc95\ufc96\ufc97\ufc98\ufc99\ufc9a\ufc9b\ufc9c\ufc9d\ufc9e\ufc9f\ufca0\ufca1\ufca2\ufca3\ufca4\ufca5\ufca6\ufca7\ufca8\ufca9\ufcaa\ufcab\ufcac\ufcad\ufcae\ufcaf\ufcb0\ufcb1\ufcb2\ufcb3\ufcb4\ufcb5\ufcb6\ufcb7\ufcb8\ufcb9\ufcba\ufcbb\ufcbc\ufcbd\ufcbe\ufcbf\ufcc0\ufcc1\ufcc2\ufcc3\ufcc4\ufcc5\ufcc6\ufcc7\ufcc8\ufcc9\ufcca\ufccb\ufccc\ufccd\ufcce\ufccf\ufcd0\ufcd1\ufcd2\ufcd3\ufcd4\ufcd5\ufcd6\ufcd7\ufcd8\ufcd9\ufcda\ufcdb\ufcdc\ufcdd\ufcde\ufcdf\ufce0\ufce1\ufce2\ufce3\ufce4\ufce5\ufce6\ufce7\ufce8\ufce9\ufcea\ufceb\ufcec\ufced\ufcee\ufcef\ufcf0\ufcf1\ufcf2\ufcf3\ufcf4\ufcf5\ufcf6\ufcf7\ufcf8\ufcf9\ufcfa\ufcfb\ufcfc\ufcfd\ufcfe\ufcff\ufd00\ufd01\ufd02\ufd03\ufd04\ufd05\ufd06\ufd07\ufd08\ufd09\ufd0a\ufd0b\ufd0c\ufd0d\ufd0e\ufd0f\ufd10\ufd11\ufd12\ufd13\ufd14\ufd15\ufd16\ufd17\ufd18\ufd19\ufd1a\ufd1b\ufd1c\ufd1d\ufd1e\ufd1f\ufd20\ufd21\ufd22\ufd23\ufd24\ufd25\ufd26\ufd27\ufd28\ufd29\ufd2a\ufd2b\ufd2c\ufd2d\ufd2e\ufd2f\ufd30\ufd31\ufd32\ufd33\ufd34\ufd35\ufd36\ufd37\ufd38\ufd39\ufd3a\ufd3b\ufd3c\ufd3d\ufd50\ufd51\ufd52\ufd53\ufd54\ufd55\ufd56\ufd57\ufd58\ufd59\ufd5a\ufd5b\ufd5c\ufd5d\ufd5e\ufd5f\ufd60\ufd61\ufd62\ufd63\ufd64\ufd65\ufd66\ufd67\ufd68\ufd69\ufd6a\ufd6b\ufd6c\ufd6d\ufd6e\ufd6f\ufd70\ufd71\ufd72\ufd73\ufd74\ufd75\ufd76\ufd77\ufd78\ufd79\ufd7a\ufd7b\ufd7c\ufd7d\ufd7e\ufd7f\ufd80\ufd81\ufd82\ufd83\ufd84\ufd85\ufd86\ufd87\ufd88\ufd89\ufd8a\ufd8b\ufd8c\ufd8d\ufd8e\ufd8f\ufd92\ufd93\ufd94\ufd95\ufd96\ufd97\ufd98\ufd99\ufd9a\ufd9b\ufd9c\ufd9d\ufd9e\ufd9f\ufda0\ufda1\ufda2\ufda3\ufda4\ufda5\ufda6\ufda7\ufda8\ufda9\ufdaa\ufdab\ufdac\ufdad\ufdae\ufdaf\ufdb0\ufdb1\ufdb2\ufdb3\ufdb4\ufdb5\ufdb6\ufdb7\ufdb8\ufdb9\ufdba\ufdbb\ufdbc\ufdbd\ufdbe\ufdbf\ufdc0\ufdc1\ufdc2\ufdc3\ufdc4\ufdc5\ufdc6\ufdc7\ufdf0\ufdf1\ufdf2\ufdf3\ufdf4\ufdf5\ufdf6\ufdf7\ufdf8\ufdf9\ufdfa\ufdfb\ufe70\ufe71\ufe72\ufe73\ufe74\ufe76\ufe77\ufe78\ufe79\ufe7a\ufe7b\ufe7c\ufe7d\ufe7e\ufe7f\ufe80\ufe81\ufe82\ufe83\ufe84\ufe85\ufe86\ufe87\ufe88\ufe89\ufe8a\ufe8b\ufe8c\ufe8d\ufe8e\ufe8f\ufe90\ufe91\ufe92\ufe93\ufe94\ufe95\ufe96\ufe97\ufe98\ufe99\ufe9a\ufe9b\ufe9c\ufe9d\ufe9e\ufe9f\ufea0\ufea1\ufea2\ufea3\ufea4\ufea5\ufea6\ufea7\ufea8\ufea9\ufeaa\ufeab\ufeac\ufead\ufeae\ufeaf\ufeb0\ufeb1\ufeb2\ufeb3\ufeb4\ufeb5\ufeb6\ufeb7\ufeb8\ufeb9\ufeba\ufebb\ufebc\ufebd\ufebe\ufebf\ufec0\ufec1\ufec2\ufec3\ufec4\ufec5\ufec6\ufec7\ufec8\ufec9\ufeca\ufecb\ufecc\ufecd\ufece\ufecf\ufed0\ufed1\ufed2\ufed3\ufed4\ufed5\ufed6\ufed7\ufed8\ufed9\ufeda\ufedb\ufedc\ufedd\ufede\ufedf\ufee0\ufee1\ufee2\ufee3\ufee4\ufee5\ufee6\ufee7\ufee8\ufee9\ufeea\ufeeb\ufeec\ufeed\ufeee\ufeef\ufef0\ufef1\ufef2\ufef3\ufef4\ufef5\ufef6\ufef7\ufef8\ufef9\ufefa\ufefb\ufefc\uff66\uff67\uff68\uff69\uff6a\uff6b\uff6c\uff6d\uff6e\uff6f\uff71\uff72\uff73\uff74\uff75\uff76\uff77\uff78\uff79\uff7a\uff7b\uff7c\uff7d\uff7e\uff7f\uff80\uff81\uff82\uff83\uff84\uff85\uff86\uff87\uff88\uff89\uff8a\uff8b\uff8c\uff8d\uff8e\uff8f\uff90\uff91\uff92\uff93\uff94\uff95\uff96\uff97\uff98\uff99\uff9a\uff9b\uff9c\uff9d\uffa0\uffa1\uffa2\uffa3\uffa4\uffa5\uffa6\uffa7\uffa8\uffa9\uffaa\uffab\uffac\uffad\uffae\uffaf\uffb0\uffb1\uffb2\uffb3\uffb4\uffb5\uffb6\uffb7\uffb8\uffb9\uffba\uffbb\uffbc\uffbd\uffbe\uffc2\uffc3\uffc4\uffc5\uffc6\uffc7\uffca\uffcb\uffcc\uffcd\uffce\uffcf\uffd2\uffd3\uffd4\uffd5\uffd6\uffd7\uffda\uffdb\uffdc' +Lo = '\u01bb\u01c0\u01c1\u01c2\u01c3\u05d0\u05d1\u05d2\u05d3\u05d4\u05d5\u05d6\u05d7\u05d8\u05d9\u05da\u05db\u05dc\u05dd\u05de\u05df\u05e0\u05e1\u05e2\u05e3\u05e4\u05e5\u05e6\u05e7\u05e8\u05e9\u05ea\u05f0\u05f1\u05f2\u0621\u0622\u0623\u0624\u0625\u0626\u0627\u0628\u0629\u062a\u062b\u062c\u062d\u062e\u062f\u0630\u0631\u0632\u0633\u0634\u0635\u0636\u0637\u0638\u0639\u063a\u0641\u0642\u0643\u0644\u0645\u0646\u0647\u0648\u0649\u064a\u066e\u066f\u0671\u0672\u0673\u0674\u0675\u0676\u0677\u0678\u0679\u067a\u067b\u067c\u067d\u067e\u067f\u0680\u0681\u0682\u0683\u0684\u0685\u0686\u0687\u0688\u0689\u068a\u068b\u068c\u068d\u068e\u068f\u0690\u0691\u0692\u0693\u0694\u0695\u0696\u0697\u0698\u0699\u069a\u069b\u069c\u069d\u069e\u069f\u06a0\u06a1\u06a2\u06a3\u06a4\u06a5\u06a6\u06a7\u06a8\u06a9\u06aa\u06ab\u06ac\u06ad\u06ae\u06af\u06b0\u06b1\u06b2\u06b3\u06b4\u06b5\u06b6\u06b7\u06b8\u06b9\u06ba\u06bb\u06bc\u06bd\u06be\u06bf\u06c0\u06c1\u06c2\u06c3\u06c4\u06c5\u06c6\u06c7\u06c8\u06c9\u06ca\u06cb\u06cc\u06cd\u06ce\u06cf\u06d0\u06d1\u06d2\u06d3\u06d5\u06ee\u06ef\u06fa\u06fb\u06fc\u06ff\u0710\u0712\u0713\u0714\u0715\u0716\u0717\u0718\u0719\u071a\u071b\u071c\u071d\u071e\u071f\u0720\u0721\u0722\u0723\u0724\u0725\u0726\u0727\u0728\u0729\u072a\u072b\u072c\u072d\u072e\u072f\u074d\u074e\u074f\u0750\u0751\u0752\u0753\u0754\u0755\u0756\u0757\u0758\u0759\u075a\u075b\u075c\u075d\u075e\u075f\u0760\u0761\u0762\u0763\u0764\u0765\u0766\u0767\u0768\u0769\u076a\u076b\u076c\u076d\u0780\u0781\u0782\u0783\u0784\u0785\u0786\u0787\u0788\u0789\u078a\u078b\u078c\u078d\u078e\u078f\u0790\u0791\u0792\u0793\u0794\u0795\u0796\u0797\u0798\u0799\u079a\u079b\u079c\u079d\u079e\u079f\u07a0\u07a1\u07a2\u07a3\u07a4\u07a5\u07b1\u0904\u0905\u0906\u0907\u0908\u0909\u090a\u090b\u090c\u090d\u090e\u090f\u0910\u0911\u0912\u0913\u0914\u0915\u0916\u0917\u0918\u0919\u091a\u091b\u091c\u091d\u091e\u091f\u0920\u0921\u0922\u0923\u0924\u0925\u0926\u0927\u0928\u0929\u092a\u092b\u092c\u092d\u092e\u092f\u0930\u0931\u0932\u0933\u0934\u0935\u0936\u0937\u0938\u0939\u093d\u0950\u0958\u0959\u095a\u095b\u095c\u095d\u095e\u095f\u0960\u0961\u097d\u0985\u0986\u0987\u0988\u0989\u098a\u098b\u098c\u098f\u0990\u0993\u0994\u0995\u0996\u0997\u0998\u0999\u099a\u099b\u099c\u099d\u099e\u099f\u09a0\u09a1\u09a2\u09a3\u09a4\u09a5\u09a6\u09a7\u09a8\u09aa\u09ab\u09ac\u09ad\u09ae\u09af\u09b0\u09b2\u09b6\u09b7\u09b8\u09b9\u09bd\u09ce\u09dc\u09dd\u09df\u09e0\u09e1\u09f0\u09f1\u0a05\u0a06\u0a07\u0a08\u0a09\u0a0a\u0a0f\u0a10\u0a13\u0a14\u0a15\u0a16\u0a17\u0a18\u0a19\u0a1a\u0a1b\u0a1c\u0a1d\u0a1e\u0a1f\u0a20\u0a21\u0a22\u0a23\u0a24\u0a25\u0a26\u0a27\u0a28\u0a2a\u0a2b\u0a2c\u0a2d\u0a2e\u0a2f\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59\u0a5a\u0a5b\u0a5c\u0a5e\u0a72\u0a73\u0a74\u0a85\u0a86\u0a87\u0a88\u0a89\u0a8a\u0a8b\u0a8c\u0a8d\u0a8f\u0a90\u0a91\u0a93\u0a94\u0a95\u0a96\u0a97\u0a98\u0a99\u0a9a\u0a9b\u0a9c\u0a9d\u0a9e\u0a9f\u0aa0\u0aa1\u0aa2\u0aa3\u0aa4\u0aa5\u0aa6\u0aa7\u0aa8\u0aaa\u0aab\u0aac\u0aad\u0aae\u0aaf\u0ab0\u0ab2\u0ab3\u0ab5\u0ab6\u0ab7\u0ab8\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0b05\u0b06\u0b07\u0b08\u0b09\u0b0a\u0b0b\u0b0c\u0b0f\u0b10\u0b13\u0b14\u0b15\u0b16\u0b17\u0b18\u0b19\u0b1a\u0b1b\u0b1c\u0b1d\u0b1e\u0b1f\u0b20\u0b21\u0b22\u0b23\u0b24\u0b25\u0b26\u0b27\u0b28\u0b2a\u0b2b\u0b2c\u0b2d\u0b2e\u0b2f\u0b30\u0b32\u0b33\u0b35\u0b36\u0b37\u0b38\u0b39\u0b3d\u0b5c\u0b5d\u0b5f\u0b60\u0b61\u0b71\u0b83\u0b85\u0b86\u0b87\u0b88\u0b89\u0b8a\u0b8e\u0b8f\u0b90\u0b92\u0b93\u0b94\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8\u0ba9\u0baa\u0bae\u0baf\u0bb0\u0bb1\u0bb2\u0bb3\u0bb4\u0bb5\u0bb6\u0bb7\u0bb8\u0bb9\u0c05\u0c06\u0c07\u0c08\u0c09\u0c0a\u0c0b\u0c0c\u0c0e\u0c0f\u0c10\u0c12\u0c13\u0c14\u0c15\u0c16\u0c17\u0c18\u0c19\u0c1a\u0c1b\u0c1c\u0c1d\u0c1e\u0c1f\u0c20\u0c21\u0c22\u0c23\u0c24\u0c25\u0c26\u0c27\u0c28\u0c2a\u0c2b\u0c2c\u0c2d\u0c2e\u0c2f\u0c30\u0c31\u0c32\u0c33\u0c35\u0c36\u0c37\u0c38\u0c39\u0c60\u0c61\u0c85\u0c86\u0c87\u0c88\u0c89\u0c8a\u0c8b\u0c8c\u0c8e\u0c8f\u0c90\u0c92\u0c93\u0c94\u0c95\u0c96\u0c97\u0c98\u0c99\u0c9a\u0c9b\u0c9c\u0c9d\u0c9e\u0c9f\u0ca0\u0ca1\u0ca2\u0ca3\u0ca4\u0ca5\u0ca6\u0ca7\u0ca8\u0caa\u0cab\u0cac\u0cad\u0cae\u0caf\u0cb0\u0cb1\u0cb2\u0cb3\u0cb5\u0cb6\u0cb7\u0cb8\u0cb9\u0cbd\u0cde\u0ce0\u0ce1\u0d05\u0d06\u0d07\u0d08\u0d09\u0d0a\u0d0b\u0d0c\u0d0e\u0d0f\u0d10\u0d12\u0d13\u0d14\u0d15\u0d16\u0d17\u0d18\u0d19\u0d1a\u0d1b\u0d1c\u0d1d\u0d1e\u0d1f\u0d20\u0d21\u0d22\u0d23\u0d24\u0d25\u0d26\u0d27\u0d28\u0d2a\u0d2b\u0d2c\u0d2d\u0d2e\u0d2f\u0d30\u0d31\u0d32\u0d33\u0d34\u0d35\u0d36\u0d37\u0d38\u0d39\u0d60\u0d61\u0d85\u0d86\u0d87\u0d88\u0d89\u0d8a\u0d8b\u0d8c\u0d8d\u0d8e\u0d8f\u0d90\u0d91\u0d92\u0d93\u0d94\u0d95\u0d96\u0d9a\u0d9b\u0d9c\u0d9d\u0d9e\u0d9f\u0da0\u0da1\u0da2\u0da3\u0da4\u0da5\u0da6\u0da7\u0da8\u0da9\u0daa\u0dab\u0dac\u0dad\u0dae\u0daf\u0db0\u0db1\u0db3\u0db4\u0db5\u0db6\u0db7\u0db8\u0db9\u0dba\u0dbb\u0dbd\u0dc0\u0dc1\u0dc2\u0dc3\u0dc4\u0dc5\u0dc6\u0e01\u0e02\u0e03\u0e04\u0e05\u0e06\u0e07\u0e08\u0e09\u0e0a\u0e0b\u0e0c\u0e0d\u0e0e\u0e0f\u0e10\u0e11\u0e12\u0e13\u0e14\u0e15\u0e16\u0e17\u0e18\u0e19\u0e1a\u0e1b\u0e1c\u0e1d\u0e1e\u0e1f\u0e20\u0e21\u0e22\u0e23\u0e24\u0e25\u0e26\u0e27\u0e28\u0e29\u0e2a\u0e2b\u0e2c\u0e2d\u0e2e\u0e2f\u0e30\u0e32\u0e33\u0e40\u0e41\u0e42\u0e43\u0e44\u0e45\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94\u0e95\u0e96\u0e97\u0e99\u0e9a\u0e9b\u0e9c\u0e9d\u0e9e\u0e9f\u0ea1\u0ea2\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead\u0eae\u0eaf\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0\u0ec1\u0ec2\u0ec3\u0ec4\u0edc\u0edd\u0f00\u0f40\u0f41\u0f42\u0f43\u0f44\u0f45\u0f46\u0f47\u0f49\u0f4a\u0f4b\u0f4c\u0f4d\u0f4e\u0f4f\u0f50\u0f51\u0f52\u0f53\u0f54\u0f55\u0f56\u0f57\u0f58\u0f59\u0f5a\u0f5b\u0f5c\u0f5d\u0f5e\u0f5f\u0f60\u0f61\u0f62\u0f63\u0f64\u0f65\u0f66\u0f67\u0f68\u0f69\u0f6a\u0f88\u0f89\u0f8a\u0f8b\u1000\u1001\u1002\u1003\u1004\u1005\u1006\u1007\u1008\u1009\u100a\u100b\u100c\u100d\u100e\u100f\u1010\u1011\u1012\u1013\u1014\u1015\u1016\u1017\u1018\u1019\u101a\u101b\u101c\u101d\u101e\u101f\u1020\u1021\u1023\u1024\u1025\u1026\u1027\u1029\u102a\u1050\u1051\u1052\u1053\u1054\u1055\u10d0\u10d1\u10d2\u10d3\u10d4\u10d5\u10d6\u10d7\u10d8\u10d9\u10da\u10db\u10dc\u10dd\u10de\u10df\u10e0\u10e1\u10e2\u10e3\u10e4\u10e5\u10e6\u10e7\u10e8\u10e9\u10ea\u10eb\u10ec\u10ed\u10ee\u10ef\u10f0\u10f1\u10f2\u10f3\u10f4\u10f5\u10f6\u10f7\u10f8\u10f9\u10fa\u1100\u1101\u1102\u1103\u1104\u1105\u1106\u1107\u1108\u1109\u110a\u110b\u110c\u110d\u110e\u110f\u1110\u1111\u1112\u1113\u1114\u1115\u1116\u1117\u1118\u1119\u111a\u111b\u111c\u111d\u111e\u111f\u1120\u1121\u1122\u1123\u1124\u1125\u1126\u1127\u1128\u1129\u112a\u112b\u112c\u112d\u112e\u112f\u1130\u1131\u1132\u1133\u1134\u1135\u1136\u1137\u1138\u1139\u113a\u113b\u113c\u113d\u113e\u113f\u1140\u1141\u1142\u1143\u1144\u1145\u1146\u1147\u1148\u1149\u114a\u114b\u114c\u114d\u114e\u114f\u1150\u1151\u1152\u1153\u1154\u1155\u1156\u1157\u1158\u1159\u115f\u1160\u1161\u1162\u1163\u1164\u1165\u1166\u1167\u1168\u1169\u116a\u116b\u116c\u116d\u116e\u116f\u1170\u1171\u1172\u1173\u1174\u1175\u1176\u1177\u1178\u1179\u117a\u117b\u117c\u117d\u117e\u117f\u1180\u1181\u1182\u1183\u1184\u1185\u1186\u1187\u1188\u1189\u118a\u118b\u118c\u118d\u118e\u118f\u1190\u1191\u1192\u1193\u1194\u1195\u1196\u1197\u1198\u1199\u119a\u119b\u119c\u119d\u119e\u119f\u11a0\u11a1\u11a2\u11a8\u11a9\u11aa\u11ab\u11ac\u11ad\u11ae\u11af\u11b0\u11b1\u11b2\u11b3\u11b4\u11b5\u11b6\u11b7\u11b8\u11b9\u11ba\u11bb\u11bc\u11bd\u11be\u11bf\u11c0\u11c1\u11c2\u11c3\u11c4\u11c5\u11c6\u11c7\u11c8\u11c9\u11ca\u11cb\u11cc\u11cd\u11ce\u11cf\u11d0\u11d1\u11d2\u11d3\u11d4\u11d5\u11d6\u11d7\u11d8\u11d9\u11da\u11db\u11dc\u11dd\u11de\u11df\u11e0\u11e1\u11e2\u11e3\u11e4\u11e5\u11e6\u11e7\u11e8\u11e9\u11ea\u11eb\u11ec\u11ed\u11ee\u11ef\u11f0\u11f1\u11f2\u11f3\u11f4\u11f5\u11f6\u11f7\u11f8\u11f9\u1200\u1201\u1202\u1203\u1204\u1205\u1206\u1207\u1208\u1209\u120a\u120b\u120c\u120d\u120e\u120f\u1210\u1211\u1212\u1213\u1214\u1215\u1216\u1217\u1218\u1219\u121a\u121b\u121c\u121d\u121e\u121f\u1220\u1221\u1222\u1223\u1224\u1225\u1226\u1227\u1228\u1229\u122a\u122b\u122c\u122d\u122e\u122f\u1230\u1231\u1232\u1233\u1234\u1235\u1236\u1237\u1238\u1239\u123a\u123b\u123c\u123d\u123e\u123f\u1240\u1241\u1242\u1243\u1244\u1245\u1246\u1247\u1248\u124a\u124b\u124c\u124d\u1250\u1251\u1252\u1253\u1254\u1255\u1256\u1258\u125a\u125b\u125c\u125d\u1260\u1261\u1262\u1263\u1264\u1265\u1266\u1267\u1268\u1269\u126a\u126b\u126c\u126d\u126e\u126f\u1270\u1271\u1272\u1273\u1274\u1275\u1276\u1277\u1278\u1279\u127a\u127b\u127c\u127d\u127e\u127f\u1280\u1281\u1282\u1283\u1284\u1285\u1286\u1287\u1288\u128a\u128b\u128c\u128d\u1290\u1291\u1292\u1293\u1294\u1295\u1296\u1297\u1298\u1299\u129a\u129b\u129c\u129d\u129e\u129f\u12a0\u12a1\u12a2\u12a3\u12a4\u12a5\u12a6\u12a7\u12a8\u12a9\u12aa\u12ab\u12ac\u12ad\u12ae\u12af\u12b0\u12b2\u12b3\u12b4\u12b5\u12b8\u12b9\u12ba\u12bb\u12bc\u12bd\u12be\u12c0\u12c2\u12c3\u12c4\u12c5\u12c8\u12c9\u12ca\u12cb\u12cc\u12cd\u12ce\u12cf\u12d0\u12d1\u12d2\u12d3\u12d4\u12d5\u12d6\u12d8\u12d9\u12da\u12db\u12dc\u12dd\u12de\u12df\u12e0\u12e1\u12e2\u12e3\u12e4\u12e5\u12e6\u12e7\u12e8\u12e9\u12ea\u12eb\u12ec\u12ed\u12ee\u12ef\u12f0\u12f1\u12f2\u12f3\u12f4\u12f5\u12f6\u12f7\u12f8\u12f9\u12fa\u12fb\u12fc\u12fd\u12fe\u12ff\u1300\u1301\u1302\u1303\u1304\u1305\u1306\u1307\u1308\u1309\u130a\u130b\u130c\u130d\u130e\u130f\u1310\u1312\u1313\u1314\u1315\u1318\u1319\u131a\u131b\u131c\u131d\u131e\u131f\u1320\u1321\u1322\u1323\u1324\u1325\u1326\u1327\u1328\u1329\u132a\u132b\u132c\u132d\u132e\u132f\u1330\u1331\u1332\u1333\u1334\u1335\u1336\u1337\u1338\u1339\u133a\u133b\u133c\u133d\u133e\u133f\u1340\u1341\u1342\u1343\u1344\u1345\u1346\u1347\u1348\u1349\u134a\u134b\u134c\u134d\u134e\u134f\u1350\u1351\u1352\u1353\u1354\u1355\u1356\u1357\u1358\u1359\u135a\u1380\u1381\u1382\u1383\u1384\u1385\u1386\u1387\u1388\u1389\u138a\u138b\u138c\u138d\u138e\u138f\u13a0\u13a1\u13a2\u13a3\u13a4\u13a5\u13a6\u13a7\u13a8\u13a9\u13aa\u13ab\u13ac\u13ad\u13ae\u13af\u13b0\u13b1\u13b2\u13b3\u13b4\u13b5\u13b6\u13b7\u13b8\u13b9\u13ba\u13bb\u13bc\u13bd\u13be\u13bf\u13c0\u13c1\u13c2\u13c3\u13c4\u13c5\u13c6\u13c7\u13c8\u13c9\u13ca\u13cb\u13cc\u13cd\u13ce\u13cf\u13d0\u13d1\u13d2\u13d3\u13d4\u13d5\u13d6\u13d7\u13d8\u13d9\u13da\u13db\u13dc\u13dd\u13de\u13df\u13e0\u13e1\u13e2\u13e3\u13e4\u13e5\u13e6\u13e7\u13e8\u13e9\u13ea\u13eb\u13ec\u13ed\u13ee\u13ef\u13f0\u13f1\u13f2\u13f3\u13f4\u1401\u1402\u1403\u1404\u1405\u1406\u1407\u1408\u1409\u140a\u140b\u140c\u140d\u140e\u140f\u1410\u1411\u1412\u1413\u1414\u1415\u1416\u1417\u1418\u1419\u141a\u141b\u141c\u141d\u141e\u141f\u1420\u1421\u1422\u1423\u1424\u1425\u1426\u1427\u1428\u1429\u142a\u142b\u142c\u142d\u142e\u142f\u1430\u1431\u1432\u1433\u1434\u1435\u1436\u1437\u1438\u1439\u143a\u143b\u143c\u143d\u143e\u143f\u1440\u1441\u1442\u1443\u1444\u1445\u1446\u1447\u1448\u1449\u144a\u144b\u144c\u144d\u144e\u144f\u1450\u1451\u1452\u1453\u1454\u1455\u1456\u1457\u1458\u1459\u145a\u145b\u145c\u145d\u145e\u145f\u1460\u1461\u1462\u1463\u1464\u1465\u1466\u1467\u1468\u1469\u146a\u146b\u146c\u146d\u146e\u146f\u1470\u1471\u1472\u1473\u1474\u1475\u1476\u1477\u1478\u1479\u147a\u147b\u147c\u147d\u147e\u147f\u1480\u1481\u1482\u1483\u1484\u1485\u1486\u1487\u1488\u1489\u148a\u148b\u148c\u148d\u148e\u148f\u1490\u1491\u1492\u1493\u1494\u1495\u1496\u1497\u1498\u1499\u149a\u149b\u149c\u149d\u149e\u149f\u14a0\u14a1\u14a2\u14a3\u14a4\u14a5\u14a6\u14a7\u14a8\u14a9\u14aa\u14ab\u14ac\u14ad\u14ae\u14af\u14b0\u14b1\u14b2\u14b3\u14b4\u14b5\u14b6\u14b7\u14b8\u14b9\u14ba\u14bb\u14bc\u14bd\u14be\u14bf\u14c0\u14c1\u14c2\u14c3\u14c4\u14c5\u14c6\u14c7\u14c8\u14c9\u14ca\u14cb\u14cc\u14cd\u14ce\u14cf\u14d0\u14d1\u14d2\u14d3\u14d4\u14d5\u14d6\u14d7\u14d8\u14d9\u14da\u14db\u14dc\u14dd\u14de\u14df\u14e0\u14e1\u14e2\u14e3\u14e4\u14e5\u14e6\u14e7\u14e8\u14e9\u14ea\u14eb\u14ec\u14ed\u14ee\u14ef\u14f0\u14f1\u14f2\u14f3\u14f4\u14f5\u14f6\u14f7\u14f8\u14f9\u14fa\u14fb\u14fc\u14fd\u14fe\u14ff\u1500\u1501\u1502\u1503\u1504\u1505\u1506\u1507\u1508\u1509\u150a\u150b\u150c\u150d\u150e\u150f\u1510\u1511\u1512\u1513\u1514\u1515\u1516\u1517\u1518\u1519\u151a\u151b\u151c\u151d\u151e\u151f\u1520\u1521\u1522\u1523\u1524\u1525\u1526\u1527\u1528\u1529\u152a\u152b\u152c\u152d\u152e\u152f\u1530\u1531\u1532\u1533\u1534\u1535\u1536\u1537\u1538\u1539\u153a\u153b\u153c\u153d\u153e\u153f\u1540\u1541\u1542\u1543\u1544\u1545\u1546\u1547\u1548\u1549\u154a\u154b\u154c\u154d\u154e\u154f\u1550\u1551\u1552\u1553\u1554\u1555\u1556\u1557\u1558\u1559\u155a\u155b\u155c\u155d\u155e\u155f\u1560\u1561\u1562\u1563\u1564\u1565\u1566\u1567\u1568\u1569\u156a\u156b\u156c\u156d\u156e\u156f\u1570\u1571\u1572\u1573\u1574\u1575\u1576\u1577\u1578\u1579\u157a\u157b\u157c\u157d\u157e\u157f\u1580\u1581\u1582\u1583\u1584\u1585\u1586\u1587\u1588\u1589\u158a\u158b\u158c\u158d\u158e\u158f\u1590\u1591\u1592\u1593\u1594\u1595\u1596\u1597\u1598\u1599\u159a\u159b\u159c\u159d\u159e\u159f\u15a0\u15a1\u15a2\u15a3\u15a4\u15a5\u15a6\u15a7\u15a8\u15a9\u15aa\u15ab\u15ac\u15ad\u15ae\u15af\u15b0\u15b1\u15b2\u15b3\u15b4\u15b5\u15b6\u15b7\u15b8\u15b9\u15ba\u15bb\u15bc\u15bd\u15be\u15bf\u15c0\u15c1\u15c2\u15c3\u15c4\u15c5\u15c6\u15c7\u15c8\u15c9\u15ca\u15cb\u15cc\u15cd\u15ce\u15cf\u15d0\u15d1\u15d2\u15d3\u15d4\u15d5\u15d6\u15d7\u15d8\u15d9\u15da\u15db\u15dc\u15dd\u15de\u15df\u15e0\u15e1\u15e2\u15e3\u15e4\u15e5\u15e6\u15e7\u15e8\u15e9\u15ea\u15eb\u15ec\u15ed\u15ee\u15ef\u15f0\u15f1\u15f2\u15f3\u15f4\u15f5\u15f6\u15f7\u15f8\u15f9\u15fa\u15fb\u15fc\u15fd\u15fe\u15ff\u1600\u1601\u1602\u1603\u1604\u1605\u1606\u1607\u1608\u1609\u160a\u160b\u160c\u160d\u160e\u160f\u1610\u1611\u1612\u1613\u1614\u1615\u1616\u1617\u1618\u1619\u161a\u161b\u161c\u161d\u161e\u161f\u1620\u1621\u1622\u1623\u1624\u1625\u1626\u1627\u1628\u1629\u162a\u162b\u162c\u162d\u162e\u162f\u1630\u1631\u1632\u1633\u1634\u1635\u1636\u1637\u1638\u1639\u163a\u163b\u163c\u163d\u163e\u163f\u1640\u1641\u1642\u1643\u1644\u1645\u1646\u1647\u1648\u1649\u164a\u164b\u164c\u164d\u164e\u164f\u1650\u1651\u1652\u1653\u1654\u1655\u1656\u1657\u1658\u1659\u165a\u165b\u165c\u165d\u165e\u165f\u1660\u1661\u1662\u1663\u1664\u1665\u1666\u1667\u1668\u1669\u166a\u166b\u166c\u166f\u1670\u1671\u1672\u1673\u1674\u1675\u1676\u1681\u1682\u1683\u1684\u1685\u1686\u1687\u1688\u1689\u168a\u168b\u168c\u168d\u168e\u168f\u1690\u1691\u1692\u1693\u1694\u1695\u1696\u1697\u1698\u1699\u169a\u16a0\u16a1\u16a2\u16a3\u16a4\u16a5\u16a6\u16a7\u16a8\u16a9\u16aa\u16ab\u16ac\u16ad\u16ae\u16af\u16b0\u16b1\u16b2\u16b3\u16b4\u16b5\u16b6\u16b7\u16b8\u16b9\u16ba\u16bb\u16bc\u16bd\u16be\u16bf\u16c0\u16c1\u16c2\u16c3\u16c4\u16c5\u16c6\u16c7\u16c8\u16c9\u16ca\u16cb\u16cc\u16cd\u16ce\u16cf\u16d0\u16d1\u16d2\u16d3\u16d4\u16d5\u16d6\u16d7\u16d8\u16d9\u16da\u16db\u16dc\u16dd\u16de\u16df\u16e0\u16e1\u16e2\u16e3\u16e4\u16e5\u16e6\u16e7\u16e8\u16e9\u16ea\u1700\u1701\u1702\u1703\u1704\u1705\u1706\u1707\u1708\u1709\u170a\u170b\u170c\u170e\u170f\u1710\u1711\u1720\u1721\u1722\u1723\u1724\u1725\u1726\u1727\u1728\u1729\u172a\u172b\u172c\u172d\u172e\u172f\u1730\u1731\u1740\u1741\u1742\u1743\u1744\u1745\u1746\u1747\u1748\u1749\u174a\u174b\u174c\u174d\u174e\u174f\u1750\u1751\u1760\u1761\u1762\u1763\u1764\u1765\u1766\u1767\u1768\u1769\u176a\u176b\u176c\u176e\u176f\u1770\u1780\u1781\u1782\u1783\u1784\u1785\u1786\u1787\u1788\u1789\u178a\u178b\u178c\u178d\u178e\u178f\u1790\u1791\u1792\u1793\u1794\u1795\u1796\u1797\u1798\u1799\u179a\u179b\u179c\u179d\u179e\u179f\u17a0\u17a1\u17a2\u17a3\u17a4\u17a5\u17a6\u17a7\u17a8\u17a9\u17aa\u17ab\u17ac\u17ad\u17ae\u17af\u17b0\u17b1\u17b2\u17b3\u17dc\u1820\u1821\u1822\u1823\u1824\u1825\u1826\u1827\u1828\u1829\u182a\u182b\u182c\u182d\u182e\u182f\u1830\u1831\u1832\u1833\u1834\u1835\u1836\u1837\u1838\u1839\u183a\u183b\u183c\u183d\u183e\u183f\u1840\u1841\u1842\u1844\u1845\u1846\u1847\u1848\u1849\u184a\u184b\u184c\u184d\u184e\u184f\u1850\u1851\u1852\u1853\u1854\u1855\u1856\u1857\u1858\u1859\u185a\u185b\u185c\u185d\u185e\u185f\u1860\u1861\u1862\u1863\u1864\u1865\u1866\u1867\u1868\u1869\u186a\u186b\u186c\u186d\u186e\u186f\u1870\u1871\u1872\u1873\u1874\u1875\u1876\u1877\u1880\u1881\u1882\u1883\u1884\u1885\u1886\u1887\u1888\u1889\u188a\u188b\u188c\u188d\u188e\u188f\u1890\u1891\u1892\u1893\u1894\u1895\u1896\u1897\u1898\u1899\u189a\u189b\u189c\u189d\u189e\u189f\u18a0\u18a1\u18a2\u18a3\u18a4\u18a5\u18a6\u18a7\u18a8\u1900\u1901\u1902\u1903\u1904\u1905\u1906\u1907\u1908\u1909\u190a\u190b\u190c\u190d\u190e\u190f\u1910\u1911\u1912\u1913\u1914\u1915\u1916\u1917\u1918\u1919\u191a\u191b\u191c\u1950\u1951\u1952\u1953\u1954\u1955\u1956\u1957\u1958\u1959\u195a\u195b\u195c\u195d\u195e\u195f\u1960\u1961\u1962\u1963\u1964\u1965\u1966\u1967\u1968\u1969\u196a\u196b\u196c\u196d\u1970\u1971\u1972\u1973\u1974\u1980\u1981\u1982\u1983\u1984\u1985\u1986\u1987\u1988\u1989\u198a\u198b\u198c\u198d\u198e\u198f\u1990\u1991\u1992\u1993\u1994\u1995\u1996\u1997\u1998\u1999\u199a\u199b\u199c\u199d\u199e\u199f\u19a0\u19a1\u19a2\u19a3\u19a4\u19a5\u19a6\u19a7\u19a8\u19a9\u19c1\u19c2\u19c3\u19c4\u19c5\u19c6\u19c7\u1a00\u1a01\u1a02\u1a03\u1a04\u1a05\u1a06\u1a07\u1a08\u1a09\u1a0a\u1a0b\u1a0c\u1a0d\u1a0e\u1a0f\u1a10\u1a11\u1a12\u1a13\u1a14\u1a15\u1a16\u2135\u2136\u2137\u2138\u2d30\u2d31\u2d32\u2d33\u2d34\u2d35\u2d36\u2d37\u2d38\u2d39\u2d3a\u2d3b\u2d3c\u2d3d\u2d3e\u2d3f\u2d40\u2d41\u2d42\u2d43\u2d44\u2d45\u2d46\u2d47\u2d48\u2d49\u2d4a\u2d4b\u2d4c\u2d4d\u2d4e\u2d4f\u2d50\u2d51\u2d52\u2d53\u2d54\u2d55\u2d56\u2d57\u2d58\u2d59\u2d5a\u2d5b\u2d5c\u2d5d\u2d5e\u2d5f\u2d60\u2d61\u2d62\u2d63\u2d64\u2d65\u2d80\u2d81\u2d82\u2d83\u2d84\u2d85\u2d86\u2d87\u2d88\u2d89\u2d8a\u2d8b\u2d8c\u2d8d\u2d8e\u2d8f\u2d90\u2d91\u2d92\u2d93\u2d94\u2d95\u2d96\u2da0\u2da1\u2da2\u2da3\u2da4\u2da5\u2da6\u2da8\u2da9\u2daa\u2dab\u2dac\u2dad\u2dae\u2db0\u2db1\u2db2\u2db3\u2db4\u2db5\u2db6\u2db8\u2db9\u2dba\u2dbb\u2dbc\u2dbd\u2dbe\u2dc0\u2dc1\u2dc2\u2dc3\u2dc4\u2dc5\u2dc6\u2dc8\u2dc9\u2dca\u2dcb\u2dcc\u2dcd\u2dce\u2dd0\u2dd1\u2dd2\u2dd3\u2dd4\u2dd5\u2dd6\u2dd8\u2dd9\u2dda\u2ddb\u2ddc\u2ddd\u2dde\u3006\u303c\u3041\u3042\u3043\u3044\u3045\u3046\u3047\u3048\u3049\u304a\u304b\u304c\u304d\u304e\u304f\u3050\u3051\u3052\u3053\u3054\u3055\u3056\u3057\u3058\u3059\u305a\u305b\u305c\u305d\u305e\u305f\u3060\u3061\u3062\u3063\u3064\u3065\u3066\u3067\u3068\u3069\u306a\u306b\u306c\u306d\u306e\u306f\u3070\u3071\u3072\u3073\u3074\u3075\u3076\u3077\u3078\u3079\u307a\u307b\u307c\u307d\u307e\u307f\u3080\u3081\u3082\u3083\u3084\u3085\u3086\u3087\u3088\u3089\u308a\u308b\u308c\u308d\u308e\u308f\u3090\u3091\u3092\u3093\u3094\u3095\u3096\u309f\u30a1\u30a2\u30a3\u30a4\u30a5\u30a6\u30a7\u30a8\u30a9\u30aa\u30ab\u30ac\u30ad\u30ae\u30af\u30b0\u30b1\u30b2\u30b3\u30b4\u30b5\u30b6\u30b7\u30b8\u30b9\u30ba\u30bb\u30bc\u30bd\u30be\u30bf\u30c0\u30c1\u30c2\u30c3\u30c4\u30c5\u30c6\u30c7\u30c8\u30c9\u30ca\u30cb\u30cc\u30cd\u30ce\u30cf\u30d0\u30d1\u30d2\u30d3\u30d4\u30d5\u30d6\u30d7\u30d8\u30d9\u30da\u30db\u30dc\u30dd\u30de\u30df\u30e0\u30e1\u30e2\u30e3\u30e4\u30e5\u30e6\u30e7\u30e8\u30e9\u30ea\u30eb\u30ec\u30ed\u30ee\u30ef\u30f0\u30f1\u30f2\u30f3\u30f4\u30f5\u30f6\u30f7\u30f8\u30f9\u30fa\u30ff\u3105\u3106\u3107\u3108\u3109\u310a\u310b\u310c\u310d\u310e\u310f\u3110\u3111\u3112\u3113\u3114\u3115\u3116\u3117\u3118\u3119\u311a\u311b\u311c\u311d\u311e\u311f\u3120\u3121\u3122\u3123\u3124\u3125\u3126\u3127\u3128\u3129\u312a\u312b\u312c\u3131\u3132\u3133\u3134\u3135\u3136\u3137\u3138\u3139\u313a\u313b\u313c\u313d\u313e\u313f\u3140\u3141\u3142\u3143\u3144\u3145\u3146\u3147\u3148\u3149\u314a\u314b\u314c\u314d\u314e\u314f\u3150\u3151\u3152\u3153\u3154\u3155\u3156\u3157\u3158\u3159\u315a\u315b\u315c\u315d\u315e\u315f\u3160\u3161\u3162\u3163\u3164\u3165\u3166\u3167\u3168\u3169\u316a\u316b\u316c\u316d\u316e\u316f\u3170\u3171\u3172\u3173\u3174\u3175\u3176\u3177\u3178\u3179\u317a\u317b\u317c\u317d\u317e\u317f\u3180\u3181\u3182\u3183\u3184\u3185\u3186\u3187\u3188\u3189\u318a\u318b\u318c\u318d\u318e\u31a0\u31a1\u31a2\u31a3\u31a4\u31a5\u31a6\u31a7\u31a8\u31a9\u31aa\u31ab\u31ac\u31ad\u31ae\u31af\u31b0\u31b1\u31b2\u31b3\u31b4\u31b5\u31b6\u31b7\u31f0\u31f1\u31f2\u31f3\u31f4\u31f5\u31f6\u31f7\u31f8\u31f9\u31fa\u31fb\u31fc\u31fd\u31fe\u31ff\u3400\u3401\u3402\u3403\u3404\u3405\u3406\u3407\u3408\u3409\u340a\u340b\u340c\u340d\u340e\u340f\u3410\u3411\u3412\u3413\u3414\u3415\u3416\u3417\u3418\u3419\u341a\u341b\u341c\u341d\u341e\u341f\u3420\u3421\u3422\u3423\u3424\u3425\u3426\u3427\u3428\u3429\u342a\u342b\u342c\u342d\u342e\u342f\u3430\u3431\u3432\u3433\u3434\u3435\u3436\u3437\u3438\u3439\u343a\u343b\u343c\u343d\u343e\u343f\u3440\u3441\u3442\u3443\u3444\u3445\u3446\u3447\u3448\u3449\u344a\u344b\u344c\u344d\u344e\u344f\u3450\u3451\u3452\u3453\u3454\u3455\u3456\u3457\u3458\u3459\u345a\u345b\u345c\u345d\u345e\u345f\u3460\u3461\u3462\u3463\u3464\u3465\u3466\u3467\u3468\u3469\u346a\u346b\u346c\u346d\u346e\u346f\u3470\u3471\u3472\u3473\u3474\u3475\u3476\u3477\u3478\u3479\u347a\u347b\u347c\u347d\u347e\u347f\u3480\u3481\u3482\u3483\u3484\u3485\u3486\u3487\u3488\u3489\u348a\u348b\u348c\u348d\u348e\u348f\u3490\u3491\u3492\u3493\u3494\u3495\u3496\u3497\u3498\u3499\u349a\u349b\u349c\u349d\u349e\u349f\u34a0\u34a1\u34a2\u34a3\u34a4\u34a5\u34a6\u34a7\u34a8\u34a9\u34aa\u34ab\u34ac\u34ad\u34ae\u34af\u34b0\u34b1\u34b2\u34b3\u34b4\u34b5\u34b6\u34b7\u34b8\u34b9\u34ba\u34bb\u34bc\u34bd\u34be\u34bf\u34c0\u34c1\u34c2\u34c3\u34c4\u34c5\u34c6\u34c7\u34c8\u34c9\u34ca\u34cb\u34cc\u34cd\u34ce\u34cf\u34d0\u34d1\u34d2\u34d3\u34d4\u34d5\u34d6\u34d7\u34d8\u34d9\u34da\u34db\u34dc\u34dd\u34de\u34df\u34e0\u34e1\u34e2\u34e3\u34e4\u34e5\u34e6\u34e7\u34e8\u34e9\u34ea\u34eb\u34ec\u34ed\u34ee\u34ef\u34f0\u34f1\u34f2\u34f3\u34f4\u34f5\u34f6\u34f7\u34f8\u34f9\u34fa\u34fb\u34fc\u34fd\u34fe\u34ff\u3500\u3501\u3502\u3503\u3504\u3505\u3506\u3507\u3508\u3509\u350a\u350b\u350c\u350d\u350e\u350f\u3510\u3511\u3512\u3513\u3514\u3515\u3516\u3517\u3518\u3519\u351a\u351b\u351c\u351d\u351e\u351f\u3520\u3521\u3522\u3523\u3524\u3525\u3526\u3527\u3528\u3529\u352a\u352b\u352c\u352d\u352e\u352f\u3530\u3531\u3532\u3533\u3534\u3535\u3536\u3537\u3538\u3539\u353a\u353b\u353c\u353d\u353e\u353f\u3540\u3541\u3542\u3543\u3544\u3545\u3546\u3547\u3548\u3549\u354a\u354b\u354c\u354d\u354e\u354f\u3550\u3551\u3552\u3553\u3554\u3555\u3556\u3557\u3558\u3559\u355a\u355b\u355c\u355d\u355e\u355f\u3560\u3561\u3562\u3563\u3564\u3565\u3566\u3567\u3568\u3569\u356a\u356b\u356c\u356d\u356e\u356f\u3570\u3571\u3572\u3573\u3574\u3575\u3576\u3577\u3578\u3579\u357a\u357b\u357c\u357d\u357e\u357f\u3580\u3581\u3582\u3583\u3584\u3585\u3586\u3587\u3588\u3589\u358a\u358b\u358c\u358d\u358e\u358f\u3590\u3591\u3592\u3593\u3594\u3595\u3596\u3597\u3598\u3599\u359a\u359b\u359c\u359d\u359e\u359f\u35a0\u35a1\u35a2\u35a3\u35a4\u35a5\u35a6\u35a7\u35a8\u35a9\u35aa\u35ab\u35ac\u35ad\u35ae\u35af\u35b0\u35b1\u35b2\u35b3\u35b4\u35b5\u35b6\u35b7\u35b8\u35b9\u35ba\u35bb\u35bc\u35bd\u35be\u35bf\u35c0\u35c1\u35c2\u35c3\u35c4\u35c5\u35c6\u35c7\u35c8\u35c9\u35ca\u35cb\u35cc\u35cd\u35ce\u35cf\u35d0\u35d1\u35d2\u35d3\u35d4\u35d5\u35d6\u35d7\u35d8\u35d9\u35da\u35db\u35dc\u35dd\u35de\u35df\u35e0\u35e1\u35e2\u35e3\u35e4\u35e5\u35e6\u35e7\u35e8\u35e9\u35ea\u35eb\u35ec\u35ed\u35ee\u35ef\u35f0\u35f1\u35f2\u35f3\u35f4\u35f5\u35f6\u35f7\u35f8\u35f9\u35fa\u35fb\u35fc\u35fd\u35fe\u35ff\u3600\u3601\u3602\u3603\u3604\u3605\u3606\u3607\u3608\u3609\u360a\u360b\u360c\u360d\u360e\u360f\u3610\u3611\u3612\u3613\u3614\u3615\u3616\u3617\u3618\u3619\u361a\u361b\u361c\u361d\u361e\u361f\u3620\u3621\u3622\u3623\u3624\u3625\u3626\u3627\u3628\u3629\u362a\u362b\u362c\u362d\u362e\u362f\u3630\u3631\u3632\u3633\u3634\u3635\u3636\u3637\u3638\u3639\u363a\u363b\u363c\u363d\u363e\u363f\u3640\u3641\u3642\u3643\u3644\u3645\u3646\u3647\u3648\u3649\u364a\u364b\u364c\u364d\u364e\u364f\u3650\u3651\u3652\u3653\u3654\u3655\u3656\u3657\u3658\u3659\u365a\u365b\u365c\u365d\u365e\u365f\u3660\u3661\u3662\u3663\u3664\u3665\u3666\u3667\u3668\u3669\u366a\u366b\u366c\u366d\u366e\u366f\u3670\u3671\u3672\u3673\u3674\u3675\u3676\u3677\u3678\u3679\u367a\u367b\u367c\u367d\u367e\u367f\u3680\u3681\u3682\u3683\u3684\u3685\u3686\u3687\u3688\u3689\u368a\u368b\u368c\u368d\u368e\u368f\u3690\u3691\u3692\u3693\u3694\u3695\u3696\u3697\u3698\u3699\u369a\u369b\u369c\u369d\u369e\u369f\u36a0\u36a1\u36a2\u36a3\u36a4\u36a5\u36a6\u36a7\u36a8\u36a9\u36aa\u36ab\u36ac\u36ad\u36ae\u36af\u36b0\u36b1\u36b2\u36b3\u36b4\u36b5\u36b6\u36b7\u36b8\u36b9\u36ba\u36bb\u36bc\u36bd\u36be\u36bf\u36c0\u36c1\u36c2\u36c3\u36c4\u36c5\u36c6\u36c7\u36c8\u36c9\u36ca\u36cb\u36cc\u36cd\u36ce\u36cf\u36d0\u36d1\u36d2\u36d3\u36d4\u36d5\u36d6\u36d7\u36d8\u36d9\u36da\u36db\u36dc\u36dd\u36de\u36df\u36e0\u36e1\u36e2\u36e3\u36e4\u36e5\u36e6\u36e7\u36e8\u36e9\u36ea\u36eb\u36ec\u36ed\u36ee\u36ef\u36f0\u36f1\u36f2\u36f3\u36f4\u36f5\u36f6\u36f7\u36f8\u36f9\u36fa\u36fb\u36fc\u36fd\u36fe\u36ff\u3700\u3701\u3702\u3703\u3704\u3705\u3706\u3707\u3708\u3709\u370a\u370b\u370c\u370d\u370e\u370f\u3710\u3711\u3712\u3713\u3714\u3715\u3716\u3717\u3718\u3719\u371a\u371b\u371c\u371d\u371e\u371f\u3720\u3721\u3722\u3723\u3724\u3725\u3726\u3727\u3728\u3729\u372a\u372b\u372c\u372d\u372e\u372f\u3730\u3731\u3732\u3733\u3734\u3735\u3736\u3737\u3738\u3739\u373a\u373b\u373c\u373d\u373e\u373f\u3740\u3741\u3742\u3743\u3744\u3745\u3746\u3747\u3748\u3749\u374a\u374b\u374c\u374d\u374e\u374f\u3750\u3751\u3752\u3753\u3754\u3755\u3756\u3757\u3758\u3759\u375a\u375b\u375c\u375d\u375e\u375f\u3760\u3761\u3762\u3763\u3764\u3765\u3766\u3767\u3768\u3769\u376a\u376b\u376c\u376d\u376e\u376f\u3770\u3771\u3772\u3773\u3774\u3775\u3776\u3777\u3778\u3779\u377a\u377b\u377c\u377d\u377e\u377f\u3780\u3781\u3782\u3783\u3784\u3785\u3786\u3787\u3788\u3789\u378a\u378b\u378c\u378d\u378e\u378f\u3790\u3791\u3792\u3793\u3794\u3795\u3796\u3797\u3798\u3799\u379a\u379b\u379c\u379d\u379e\u379f\u37a0\u37a1\u37a2\u37a3\u37a4\u37a5\u37a6\u37a7\u37a8\u37a9\u37aa\u37ab\u37ac\u37ad\u37ae\u37af\u37b0\u37b1\u37b2\u37b3\u37b4\u37b5\u37b6\u37b7\u37b8\u37b9\u37ba\u37bb\u37bc\u37bd\u37be\u37bf\u37c0\u37c1\u37c2\u37c3\u37c4\u37c5\u37c6\u37c7\u37c8\u37c9\u37ca\u37cb\u37cc\u37cd\u37ce\u37cf\u37d0\u37d1\u37d2\u37d3\u37d4\u37d5\u37d6\u37d7\u37d8\u37d9\u37da\u37db\u37dc\u37dd\u37de\u37df\u37e0\u37e1\u37e2\u37e3\u37e4\u37e5\u37e6\u37e7\u37e8\u37e9\u37ea\u37eb\u37ec\u37ed\u37ee\u37ef\u37f0\u37f1\u37f2\u37f3\u37f4\u37f5\u37f6\u37f7\u37f8\u37f9\u37fa\u37fb\u37fc\u37fd\u37fe\u37ff\u3800\u3801\u3802\u3803\u3804\u3805\u3806\u3807\u3808\u3809\u380a\u380b\u380c\u380d\u380e\u380f\u3810\u3811\u3812\u3813\u3814\u3815\u3816\u3817\u3818\u3819\u381a\u381b\u381c\u381d\u381e\u381f\u3820\u3821\u3822\u3823\u3824\u3825\u3826\u3827\u3828\u3829\u382a\u382b\u382c\u382d\u382e\u382f\u3830\u3831\u3832\u3833\u3834\u3835\u3836\u3837\u3838\u3839\u383a\u383b\u383c\u383d\u383e\u383f\u3840\u3841\u3842\u3843\u3844\u3845\u3846\u3847\u3848\u3849\u384a\u384b\u384c\u384d\u384e\u384f\u3850\u3851\u3852\u3853\u3854\u3855\u3856\u3857\u3858\u3859\u385a\u385b\u385c\u385d\u385e\u385f\u3860\u3861\u3862\u3863\u3864\u3865\u3866\u3867\u3868\u3869\u386a\u386b\u386c\u386d\u386e\u386f\u3870\u3871\u3872\u3873\u3874\u3875\u3876\u3877\u3878\u3879\u387a\u387b\u387c\u387d\u387e\u387f\u3880\u3881\u3882\u3883\u3884\u3885\u3886\u3887\u3888\u3889\u388a\u388b\u388c\u388d\u388e\u388f\u3890\u3891\u3892\u3893\u3894\u3895\u3896\u3897\u3898\u3899\u389a\u389b\u389c\u389d\u389e\u389f\u38a0\u38a1\u38a2\u38a3\u38a4\u38a5\u38a6\u38a7\u38a8\u38a9\u38aa\u38ab\u38ac\u38ad\u38ae\u38af\u38b0\u38b1\u38b2\u38b3\u38b4\u38b5\u38b6\u38b7\u38b8\u38b9\u38ba\u38bb\u38bc\u38bd\u38be\u38bf\u38c0\u38c1\u38c2\u38c3\u38c4\u38c5\u38c6\u38c7\u38c8\u38c9\u38ca\u38cb\u38cc\u38cd\u38ce\u38cf\u38d0\u38d1\u38d2\u38d3\u38d4\u38d5\u38d6\u38d7\u38d8\u38d9\u38da\u38db\u38dc\u38dd\u38de\u38df\u38e0\u38e1\u38e2\u38e3\u38e4\u38e5\u38e6\u38e7\u38e8\u38e9\u38ea\u38eb\u38ec\u38ed\u38ee\u38ef\u38f0\u38f1\u38f2\u38f3\u38f4\u38f5\u38f6\u38f7\u38f8\u38f9\u38fa\u38fb\u38fc\u38fd\u38fe\u38ff\u3900\u3901\u3902\u3903\u3904\u3905\u3906\u3907\u3908\u3909\u390a\u390b\u390c\u390d\u390e\u390f\u3910\u3911\u3912\u3913\u3914\u3915\u3916\u3917\u3918\u3919\u391a\u391b\u391c\u391d\u391e\u391f\u3920\u3921\u3922\u3923\u3924\u3925\u3926\u3927\u3928\u3929\u392a\u392b\u392c\u392d\u392e\u392f\u3930\u3931\u3932\u3933\u3934\u3935\u3936\u3937\u3938\u3939\u393a\u393b\u393c\u393d\u393e\u393f\u3940\u3941\u3942\u3943\u3944\u3945\u3946\u3947\u3948\u3949\u394a\u394b\u394c\u394d\u394e\u394f\u3950\u3951\u3952\u3953\u3954\u3955\u3956\u3957\u3958\u3959\u395a\u395b\u395c\u395d\u395e\u395f\u3960\u3961\u3962\u3963\u3964\u3965\u3966\u3967\u3968\u3969\u396a\u396b\u396c\u396d\u396e\u396f\u3970\u3971\u3972\u3973\u3974\u3975\u3976\u3977\u3978\u3979\u397a\u397b\u397c\u397d\u397e\u397f\u3980\u3981\u3982\u3983\u3984\u3985\u3986\u3987\u3988\u3989\u398a\u398b\u398c\u398d\u398e\u398f\u3990\u3991\u3992\u3993\u3994\u3995\u3996\u3997\u3998\u3999\u399a\u399b\u399c\u399d\u399e\u399f\u39a0\u39a1\u39a2\u39a3\u39a4\u39a5\u39a6\u39a7\u39a8\u39a9\u39aa\u39ab\u39ac\u39ad\u39ae\u39af\u39b0\u39b1\u39b2\u39b3\u39b4\u39b5\u39b6\u39b7\u39b8\u39b9\u39ba\u39bb\u39bc\u39bd\u39be\u39bf\u39c0\u39c1\u39c2\u39c3\u39c4\u39c5\u39c6\u39c7\u39c8\u39c9\u39ca\u39cb\u39cc\u39cd\u39ce\u39cf\u39d0\u39d1\u39d2\u39d3\u39d4\u39d5\u39d6\u39d7\u39d8\u39d9\u39da\u39db\u39dc\u39dd\u39de\u39df\u39e0\u39e1\u39e2\u39e3\u39e4\u39e5\u39e6\u39e7\u39e8\u39e9\u39ea\u39eb\u39ec\u39ed\u39ee\u39ef\u39f0\u39f1\u39f2\u39f3\u39f4\u39f5\u39f6\u39f7\u39f8\u39f9\u39fa\u39fb\u39fc\u39fd\u39fe\u39ff\u3a00\u3a01\u3a02\u3a03\u3a04\u3a05\u3a06\u3a07\u3a08\u3a09\u3a0a\u3a0b\u3a0c\u3a0d\u3a0e\u3a0f\u3a10\u3a11\u3a12\u3a13\u3a14\u3a15\u3a16\u3a17\u3a18\u3a19\u3a1a\u3a1b\u3a1c\u3a1d\u3a1e\u3a1f\u3a20\u3a21\u3a22\u3a23\u3a24\u3a25\u3a26\u3a27\u3a28\u3a29\u3a2a\u3a2b\u3a2c\u3a2d\u3a2e\u3a2f\u3a30\u3a31\u3a32\u3a33\u3a34\u3a35\u3a36\u3a37\u3a38\u3a39\u3a3a\u3a3b\u3a3c\u3a3d\u3a3e\u3a3f\u3a40\u3a41\u3a42\u3a43\u3a44\u3a45\u3a46\u3a47\u3a48\u3a49\u3a4a\u3a4b\u3a4c\u3a4d\u3a4e\u3a4f\u3a50\u3a51\u3a52\u3a53\u3a54\u3a55\u3a56\u3a57\u3a58\u3a59\u3a5a\u3a5b\u3a5c\u3a5d\u3a5e\u3a5f\u3a60\u3a61\u3a62\u3a63\u3a64\u3a65\u3a66\u3a67\u3a68\u3a69\u3a6a\u3a6b\u3a6c\u3a6d\u3a6e\u3a6f\u3a70\u3a71\u3a72\u3a73\u3a74\u3a75\u3a76\u3a77\u3a78\u3a79\u3a7a\u3a7b\u3a7c\u3a7d\u3a7e\u3a7f\u3a80\u3a81\u3a82\u3a83\u3a84\u3a85\u3a86\u3a87\u3a88\u3a89\u3a8a\u3a8b\u3a8c\u3a8d\u3a8e\u3a8f\u3a90\u3a91\u3a92\u3a93\u3a94\u3a95\u3a96\u3a97\u3a98\u3a99\u3a9a\u3a9b\u3a9c\u3a9d\u3a9e\u3a9f\u3aa0\u3aa1\u3aa2\u3aa3\u3aa4\u3aa5\u3aa6\u3aa7\u3aa8\u3aa9\u3aaa\u3aab\u3aac\u3aad\u3aae\u3aaf\u3ab0\u3ab1\u3ab2\u3ab3\u3ab4\u3ab5\u3ab6\u3ab7\u3ab8\u3ab9\u3aba\u3abb\u3abc\u3abd\u3abe\u3abf\u3ac0\u3ac1\u3ac2\u3ac3\u3ac4\u3ac5\u3ac6\u3ac7\u3ac8\u3ac9\u3aca\u3acb\u3acc\u3acd\u3ace\u3acf\u3ad0\u3ad1\u3ad2\u3ad3\u3ad4\u3ad5\u3ad6\u3ad7\u3ad8\u3ad9\u3ada\u3adb\u3adc\u3add\u3ade\u3adf\u3ae0\u3ae1\u3ae2\u3ae3\u3ae4\u3ae5\u3ae6\u3ae7\u3ae8\u3ae9\u3aea\u3aeb\u3aec\u3aed\u3aee\u3aef\u3af0\u3af1\u3af2\u3af3\u3af4\u3af5\u3af6\u3af7\u3af8\u3af9\u3afa\u3afb\u3afc\u3afd\u3afe\u3aff\u3b00\u3b01\u3b02\u3b03\u3b04\u3b05\u3b06\u3b07\u3b08\u3b09\u3b0a\u3b0b\u3b0c\u3b0d\u3b0e\u3b0f\u3b10\u3b11\u3b12\u3b13\u3b14\u3b15\u3b16\u3b17\u3b18\u3b19\u3b1a\u3b1b\u3b1c\u3b1d\u3b1e\u3b1f\u3b20\u3b21\u3b22\u3b23\u3b24\u3b25\u3b26\u3b27\u3b28\u3b29\u3b2a\u3b2b\u3b2c\u3b2d\u3b2e\u3b2f\u3b30\u3b31\u3b32\u3b33\u3b34\u3b35\u3b36\u3b37\u3b38\u3b39\u3b3a\u3b3b\u3b3c\u3b3d\u3b3e\u3b3f\u3b40\u3b41\u3b42\u3b43\u3b44\u3b45\u3b46\u3b47\u3b48\u3b49\u3b4a\u3b4b\u3b4c\u3b4d\u3b4e\u3b4f\u3b50\u3b51\u3b52\u3b53\u3b54\u3b55\u3b56\u3b57\u3b58\u3b59\u3b5a\u3b5b\u3b5c\u3b5d\u3b5e\u3b5f\u3b60\u3b61\u3b62\u3b63\u3b64\u3b65\u3b66\u3b67\u3b68\u3b69\u3b6a\u3b6b\u3b6c\u3b6d\u3b6e\u3b6f\u3b70\u3b71\u3b72\u3b73\u3b74\u3b75\u3b76\u3b77\u3b78\u3b79\u3b7a\u3b7b\u3b7c\u3b7d\u3b7e\u3b7f\u3b80\u3b81\u3b82\u3b83\u3b84\u3b85\u3b86\u3b87\u3b88\u3b89\u3b8a\u3b8b\u3b8c\u3b8d\u3b8e\u3b8f\u3b90\u3b91\u3b92\u3b93\u3b94\u3b95\u3b96\u3b97\u3b98\u3b99\u3b9a\u3b9b\u3b9c\u3b9d\u3b9e\u3b9f\u3ba0\u3ba1\u3ba2\u3ba3\u3ba4\u3ba5\u3ba6\u3ba7\u3ba8\u3ba9\u3baa\u3bab\u3bac\u3bad\u3bae\u3baf\u3bb0\u3bb1\u3bb2\u3bb3\u3bb4\u3bb5\u3bb6\u3bb7\u3bb8\u3bb9\u3bba\u3bbb\u3bbc\u3bbd\u3bbe\u3bbf\u3bc0\u3bc1\u3bc2\u3bc3\u3bc4\u3bc5\u3bc6\u3bc7\u3bc8\u3bc9\u3bca\u3bcb\u3bcc\u3bcd\u3bce\u3bcf\u3bd0\u3bd1\u3bd2\u3bd3\u3bd4\u3bd5\u3bd6\u3bd7\u3bd8\u3bd9\u3bda\u3bdb\u3bdc\u3bdd\u3bde\u3bdf\u3be0\u3be1\u3be2\u3be3\u3be4\u3be5\u3be6\u3be7\u3be8\u3be9\u3bea\u3beb\u3bec\u3bed\u3bee\u3bef\u3bf0\u3bf1\u3bf2\u3bf3\u3bf4\u3bf5\u3bf6\u3bf7\u3bf8\u3bf9\u3bfa\u3bfb\u3bfc\u3bfd\u3bfe\u3bff\u3c00\u3c01\u3c02\u3c03\u3c04\u3c05\u3c06\u3c07\u3c08\u3c09\u3c0a\u3c0b\u3c0c\u3c0d\u3c0e\u3c0f\u3c10\u3c11\u3c12\u3c13\u3c14\u3c15\u3c16\u3c17\u3c18\u3c19\u3c1a\u3c1b\u3c1c\u3c1d\u3c1e\u3c1f\u3c20\u3c21\u3c22\u3c23\u3c24\u3c25\u3c26\u3c27\u3c28\u3c29\u3c2a\u3c2b\u3c2c\u3c2d\u3c2e\u3c2f\u3c30\u3c31\u3c32\u3c33\u3c34\u3c35\u3c36\u3c37\u3c38\u3c39\u3c3a\u3c3b\u3c3c\u3c3d\u3c3e\u3c3f\u3c40\u3c41\u3c42\u3c43\u3c44\u3c45\u3c46\u3c47\u3c48\u3c49\u3c4a\u3c4b\u3c4c\u3c4d\u3c4e\u3c4f\u3c50\u3c51\u3c52\u3c53\u3c54\u3c55\u3c56\u3c57\u3c58\u3c59\u3c5a\u3c5b\u3c5c\u3c5d\u3c5e\u3c5f\u3c60\u3c61\u3c62\u3c63\u3c64\u3c65\u3c66\u3c67\u3c68\u3c69\u3c6a\u3c6b\u3c6c\u3c6d\u3c6e\u3c6f\u3c70\u3c71\u3c72\u3c73\u3c74\u3c75\u3c76\u3c77\u3c78\u3c79\u3c7a\u3c7b\u3c7c\u3c7d\u3c7e\u3c7f\u3c80\u3c81\u3c82\u3c83\u3c84\u3c85\u3c86\u3c87\u3c88\u3c89\u3c8a\u3c8b\u3c8c\u3c8d\u3c8e\u3c8f\u3c90\u3c91\u3c92\u3c93\u3c94\u3c95\u3c96\u3c97\u3c98\u3c99\u3c9a\u3c9b\u3c9c\u3c9d\u3c9e\u3c9f\u3ca0\u3ca1\u3ca2\u3ca3\u3ca4\u3ca5\u3ca6\u3ca7\u3ca8\u3ca9\u3caa\u3cab\u3cac\u3cad\u3cae\u3caf\u3cb0\u3cb1\u3cb2\u3cb3\u3cb4\u3cb5\u3cb6\u3cb7\u3cb8\u3cb9\u3cba\u3cbb\u3cbc\u3cbd\u3cbe\u3cbf\u3cc0\u3cc1\u3cc2\u3cc3\u3cc4\u3cc5\u3cc6\u3cc7\u3cc8\u3cc9\u3cca\u3ccb\u3ccc\u3ccd\u3cce\u3ccf\u3cd0\u3cd1\u3cd2\u3cd3\u3cd4\u3cd5\u3cd6\u3cd7\u3cd8\u3cd9\u3cda\u3cdb\u3cdc\u3cdd\u3cde\u3cdf\u3ce0\u3ce1\u3ce2\u3ce3\u3ce4\u3ce5\u3ce6\u3ce7\u3ce8\u3ce9\u3cea\u3ceb\u3cec\u3ced\u3cee\u3cef\u3cf0\u3cf1\u3cf2\u3cf3\u3cf4\u3cf5\u3cf6\u3cf7\u3cf8\u3cf9\u3cfa\u3cfb\u3cfc\u3cfd\u3cfe\u3cff\u3d00\u3d01\u3d02\u3d03\u3d04\u3d05\u3d06\u3d07\u3d08\u3d09\u3d0a\u3d0b\u3d0c\u3d0d\u3d0e\u3d0f\u3d10\u3d11\u3d12\u3d13\u3d14\u3d15\u3d16\u3d17\u3d18\u3d19\u3d1a\u3d1b\u3d1c\u3d1d\u3d1e\u3d1f\u3d20\u3d21\u3d22\u3d23\u3d24\u3d25\u3d26\u3d27\u3d28\u3d29\u3d2a\u3d2b\u3d2c\u3d2d\u3d2e\u3d2f\u3d30\u3d31\u3d32\u3d33\u3d34\u3d35\u3d36\u3d37\u3d38\u3d39\u3d3a\u3d3b\u3d3c\u3d3d\u3d3e\u3d3f\u3d40\u3d41\u3d42\u3d43\u3d44\u3d45\u3d46\u3d47\u3d48\u3d49\u3d4a\u3d4b\u3d4c\u3d4d\u3d4e\u3d4f\u3d50\u3d51\u3d52\u3d53\u3d54\u3d55\u3d56\u3d57\u3d58\u3d59\u3d5a\u3d5b\u3d5c\u3d5d\u3d5e\u3d5f\u3d60\u3d61\u3d62\u3d63\u3d64\u3d65\u3d66\u3d67\u3d68\u3d69\u3d6a\u3d6b\u3d6c\u3d6d\u3d6e\u3d6f\u3d70\u3d71\u3d72\u3d73\u3d74\u3d75\u3d76\u3d77\u3d78\u3d79\u3d7a\u3d7b\u3d7c\u3d7d\u3d7e\u3d7f\u3d80\u3d81\u3d82\u3d83\u3d84\u3d85\u3d86\u3d87\u3d88\u3d89\u3d8a\u3d8b\u3d8c\u3d8d\u3d8e\u3d8f\u3d90\u3d91\u3d92\u3d93\u3d94\u3d95\u3d96\u3d97\u3d98\u3d99\u3d9a\u3d9b\u3d9c\u3d9d\u3d9e\u3d9f\u3da0\u3da1\u3da2\u3da3\u3da4\u3da5\u3da6\u3da7\u3da8\u3da9\u3daa\u3dab\u3dac\u3dad\u3dae\u3daf\u3db0\u3db1\u3db2\u3db3\u3db4\u3db5\u3db6\u3db7\u3db8\u3db9\u3dba\u3dbb\u3dbc\u3dbd\u3dbe\u3dbf\u3dc0\u3dc1\u3dc2\u3dc3\u3dc4\u3dc5\u3dc6\u3dc7\u3dc8\u3dc9\u3dca\u3dcb\u3dcc\u3dcd\u3dce\u3dcf\u3dd0\u3dd1\u3dd2\u3dd3\u3dd4\u3dd5\u3dd6\u3dd7\u3dd8\u3dd9\u3dda\u3ddb\u3ddc\u3ddd\u3dde\u3ddf\u3de0\u3de1\u3de2\u3de3\u3de4\u3de5\u3de6\u3de7\u3de8\u3de9\u3dea\u3deb\u3dec\u3ded\u3dee\u3def\u3df0\u3df1\u3df2\u3df3\u3df4\u3df5\u3df6\u3df7\u3df8\u3df9\u3dfa\u3dfb\u3dfc\u3dfd\u3dfe\u3dff\u3e00\u3e01\u3e02\u3e03\u3e04\u3e05\u3e06\u3e07\u3e08\u3e09\u3e0a\u3e0b\u3e0c\u3e0d\u3e0e\u3e0f\u3e10\u3e11\u3e12\u3e13\u3e14\u3e15\u3e16\u3e17\u3e18\u3e19\u3e1a\u3e1b\u3e1c\u3e1d\u3e1e\u3e1f\u3e20\u3e21\u3e22\u3e23\u3e24\u3e25\u3e26\u3e27\u3e28\u3e29\u3e2a\u3e2b\u3e2c\u3e2d\u3e2e\u3e2f\u3e30\u3e31\u3e32\u3e33\u3e34\u3e35\u3e36\u3e37\u3e38\u3e39\u3e3a\u3e3b\u3e3c\u3e3d\u3e3e\u3e3f\u3e40\u3e41\u3e42\u3e43\u3e44\u3e45\u3e46\u3e47\u3e48\u3e49\u3e4a\u3e4b\u3e4c\u3e4d\u3e4e\u3e4f\u3e50\u3e51\u3e52\u3e53\u3e54\u3e55\u3e56\u3e57\u3e58\u3e59\u3e5a\u3e5b\u3e5c\u3e5d\u3e5e\u3e5f\u3e60\u3e61\u3e62\u3e63\u3e64\u3e65\u3e66\u3e67\u3e68\u3e69\u3e6a\u3e6b\u3e6c\u3e6d\u3e6e\u3e6f\u3e70\u3e71\u3e72\u3e73\u3e74\u3e75\u3e76\u3e77\u3e78\u3e79\u3e7a\u3e7b\u3e7c\u3e7d\u3e7e\u3e7f\u3e80\u3e81\u3e82\u3e83\u3e84\u3e85\u3e86\u3e87\u3e88\u3e89\u3e8a\u3e8b\u3e8c\u3e8d\u3e8e\u3e8f\u3e90\u3e91\u3e92\u3e93\u3e94\u3e95\u3e96\u3e97\u3e98\u3e99\u3e9a\u3e9b\u3e9c\u3e9d\u3e9e\u3e9f\u3ea0\u3ea1\u3ea2\u3ea3\u3ea4\u3ea5\u3ea6\u3ea7\u3ea8\u3ea9\u3eaa\u3eab\u3eac\u3ead\u3eae\u3eaf\u3eb0\u3eb1\u3eb2\u3eb3\u3eb4\u3eb5\u3eb6\u3eb7\u3eb8\u3eb9\u3eba\u3ebb\u3ebc\u3ebd\u3ebe\u3ebf\u3ec0\u3ec1\u3ec2\u3ec3\u3ec4\u3ec5\u3ec6\u3ec7\u3ec8\u3ec9\u3eca\u3ecb\u3ecc\u3ecd\u3ece\u3ecf\u3ed0\u3ed1\u3ed2\u3ed3\u3ed4\u3ed5\u3ed6\u3ed7\u3ed8\u3ed9\u3eda\u3edb\u3edc\u3edd\u3ede\u3edf\u3ee0\u3ee1\u3ee2\u3ee3\u3ee4\u3ee5\u3ee6\u3ee7\u3ee8\u3ee9\u3eea\u3eeb\u3eec\u3eed\u3eee\u3eef\u3ef0\u3ef1\u3ef2\u3ef3\u3ef4\u3ef5\u3ef6\u3ef7\u3ef8\u3ef9\u3efa\u3efb\u3efc\u3efd\u3efe\u3eff\u3f00\u3f01\u3f02\u3f03\u3f04\u3f05\u3f06\u3f07\u3f08\u3f09\u3f0a\u3f0b\u3f0c\u3f0d\u3f0e\u3f0f\u3f10\u3f11\u3f12\u3f13\u3f14\u3f15\u3f16\u3f17\u3f18\u3f19\u3f1a\u3f1b\u3f1c\u3f1d\u3f1e\u3f1f\u3f20\u3f21\u3f22\u3f23\u3f24\u3f25\u3f26\u3f27\u3f28\u3f29\u3f2a\u3f2b\u3f2c\u3f2d\u3f2e\u3f2f\u3f30\u3f31\u3f32\u3f33\u3f34\u3f35\u3f36\u3f37\u3f38\u3f39\u3f3a\u3f3b\u3f3c\u3f3d\u3f3e\u3f3f\u3f40\u3f41\u3f42\u3f43\u3f44\u3f45\u3f46\u3f47\u3f48\u3f49\u3f4a\u3f4b\u3f4c\u3f4d\u3f4e\u3f4f\u3f50\u3f51\u3f52\u3f53\u3f54\u3f55\u3f56\u3f57\u3f58\u3f59\u3f5a\u3f5b\u3f5c\u3f5d\u3f5e\u3f5f\u3f60\u3f61\u3f62\u3f63\u3f64\u3f65\u3f66\u3f67\u3f68\u3f69\u3f6a\u3f6b\u3f6c\u3f6d\u3f6e\u3f6f\u3f70\u3f71\u3f72\u3f73\u3f74\u3f75\u3f76\u3f77\u3f78\u3f79\u3f7a\u3f7b\u3f7c\u3f7d\u3f7e\u3f7f\u3f80\u3f81\u3f82\u3f83\u3f84\u3f85\u3f86\u3f87\u3f88\u3f89\u3f8a\u3f8b\u3f8c\u3f8d\u3f8e\u3f8f\u3f90\u3f91\u3f92\u3f93\u3f94\u3f95\u3f96\u3f97\u3f98\u3f99\u3f9a\u3f9b\u3f9c\u3f9d\u3f9e\u3f9f\u3fa0\u3fa1\u3fa2\u3fa3\u3fa4\u3fa5\u3fa6\u3fa7\u3fa8\u3fa9\u3faa\u3fab\u3fac\u3fad\u3fae\u3faf\u3fb0\u3fb1\u3fb2\u3fb3\u3fb4\u3fb5\u3fb6\u3fb7\u3fb8\u3fb9\u3fba\u3fbb\u3fbc\u3fbd\u3fbe\u3fbf\u3fc0\u3fc1\u3fc2\u3fc3\u3fc4\u3fc5\u3fc6\u3fc7\u3fc8\u3fc9\u3fca\u3fcb\u3fcc\u3fcd\u3fce\u3fcf\u3fd0\u3fd1\u3fd2\u3fd3\u3fd4\u3fd5\u3fd6\u3fd7\u3fd8\u3fd9\u3fda\u3fdb\u3fdc\u3fdd\u3fde\u3fdf\u3fe0\u3fe1\u3fe2\u3fe3\u3fe4\u3fe5\u3fe6\u3fe7\u3fe8\u3fe9\u3fea\u3feb\u3fec\u3fed\u3fee\u3fef\u3ff0\u3ff1\u3ff2\u3ff3\u3ff4\u3ff5\u3ff6\u3ff7\u3ff8\u3ff9\u3ffa\u3ffb\u3ffc\u3ffd\u3ffe\u3fff\u4000\u4001\u4002\u4003\u4004\u4005\u4006\u4007\u4008\u4009\u400a\u400b\u400c\u400d\u400e\u400f\u4010\u4011\u4012\u4013\u4014\u4015\u4016\u4017\u4018\u4019\u401a\u401b\u401c\u401d\u401e\u401f\u4020\u4021\u4022\u4023\u4024\u4025\u4026\u4027\u4028\u4029\u402a\u402b\u402c\u402d\u402e\u402f\u4030\u4031\u4032\u4033\u4034\u4035\u4036\u4037\u4038\u4039\u403a\u403b\u403c\u403d\u403e\u403f\u4040\u4041\u4042\u4043\u4044\u4045\u4046\u4047\u4048\u4049\u404a\u404b\u404c\u404d\u404e\u404f\u4050\u4051\u4052\u4053\u4054\u4055\u4056\u4057\u4058\u4059\u405a\u405b\u405c\u405d\u405e\u405f\u4060\u4061\u4062\u4063\u4064\u4065\u4066\u4067\u4068\u4069\u406a\u406b\u406c\u406d\u406e\u406f\u4070\u4071\u4072\u4073\u4074\u4075\u4076\u4077\u4078\u4079\u407a\u407b\u407c\u407d\u407e\u407f\u4080\u4081\u4082\u4083\u4084\u4085\u4086\u4087\u4088\u4089\u408a\u408b\u408c\u408d\u408e\u408f\u4090\u4091\u4092\u4093\u4094\u4095\u4096\u4097\u4098\u4099\u409a\u409b\u409c\u409d\u409e\u409f\u40a0\u40a1\u40a2\u40a3\u40a4\u40a5\u40a6\u40a7\u40a8\u40a9\u40aa\u40ab\u40ac\u40ad\u40ae\u40af\u40b0\u40b1\u40b2\u40b3\u40b4\u40b5\u40b6\u40b7\u40b8\u40b9\u40ba\u40bb\u40bc\u40bd\u40be\u40bf\u40c0\u40c1\u40c2\u40c3\u40c4\u40c5\u40c6\u40c7\u40c8\u40c9\u40ca\u40cb\u40cc\u40cd\u40ce\u40cf\u40d0\u40d1\u40d2\u40d3\u40d4\u40d5\u40d6\u40d7\u40d8\u40d9\u40da\u40db\u40dc\u40dd\u40de\u40df\u40e0\u40e1\u40e2\u40e3\u40e4\u40e5\u40e6\u40e7\u40e8\u40e9\u40ea\u40eb\u40ec\u40ed\u40ee\u40ef\u40f0\u40f1\u40f2\u40f3\u40f4\u40f5\u40f6\u40f7\u40f8\u40f9\u40fa\u40fb\u40fc\u40fd\u40fe\u40ff\u4100\u4101\u4102\u4103\u4104\u4105\u4106\u4107\u4108\u4109\u410a\u410b\u410c\u410d\u410e\u410f\u4110\u4111\u4112\u4113\u4114\u4115\u4116\u4117\u4118\u4119\u411a\u411b\u411c\u411d\u411e\u411f\u4120\u4121\u4122\u4123\u4124\u4125\u4126\u4127\u4128\u4129\u412a\u412b\u412c\u412d\u412e\u412f\u4130\u4131\u4132\u4133\u4134\u4135\u4136\u4137\u4138\u4139\u413a\u413b\u413c\u413d\u413e\u413f\u4140\u4141\u4142\u4143\u4144\u4145\u4146\u4147\u4148\u4149\u414a\u414b\u414c\u414d\u414e\u414f\u4150\u4151\u4152\u4153\u4154\u4155\u4156\u4157\u4158\u4159\u415a\u415b\u415c\u415d\u415e\u415f\u4160\u4161\u4162\u4163\u4164\u4165\u4166\u4167\u4168\u4169\u416a\u416b\u416c\u416d\u416e\u416f\u4170\u4171\u4172\u4173\u4174\u4175\u4176\u4177\u4178\u4179\u417a\u417b\u417c\u417d\u417e\u417f\u4180\u4181\u4182\u4183\u4184\u4185\u4186\u4187\u4188\u4189\u418a\u418b\u418c\u418d\u418e\u418f\u4190\u4191\u4192\u4193\u4194\u4195\u4196\u4197\u4198\u4199\u419a\u419b\u419c\u419d\u419e\u419f\u41a0\u41a1\u41a2\u41a3\u41a4\u41a5\u41a6\u41a7\u41a8\u41a9\u41aa\u41ab\u41ac\u41ad\u41ae\u41af\u41b0\u41b1\u41b2\u41b3\u41b4\u41b5\u41b6\u41b7\u41b8\u41b9\u41ba\u41bb\u41bc\u41bd\u41be\u41bf\u41c0\u41c1\u41c2\u41c3\u41c4\u41c5\u41c6\u41c7\u41c8\u41c9\u41ca\u41cb\u41cc\u41cd\u41ce\u41cf\u41d0\u41d1\u41d2\u41d3\u41d4\u41d5\u41d6\u41d7\u41d8\u41d9\u41da\u41db\u41dc\u41dd\u41de\u41df\u41e0\u41e1\u41e2\u41e3\u41e4\u41e5\u41e6\u41e7\u41e8\u41e9\u41ea\u41eb\u41ec\u41ed\u41ee\u41ef\u41f0\u41f1\u41f2\u41f3\u41f4\u41f5\u41f6\u41f7\u41f8\u41f9\u41fa\u41fb\u41fc\u41fd\u41fe\u41ff\u4200\u4201\u4202\u4203\u4204\u4205\u4206\u4207\u4208\u4209\u420a\u420b\u420c\u420d\u420e\u420f\u4210\u4211\u4212\u4213\u4214\u4215\u4216\u4217\u4218\u4219\u421a\u421b\u421c\u421d\u421e\u421f\u4220\u4221\u4222\u4223\u4224\u4225\u4226\u4227\u4228\u4229\u422a\u422b\u422c\u422d\u422e\u422f\u4230\u4231\u4232\u4233\u4234\u4235\u4236\u4237\u4238\u4239\u423a\u423b\u423c\u423d\u423e\u423f\u4240\u4241\u4242\u4243\u4244\u4245\u4246\u4247\u4248\u4249\u424a\u424b\u424c\u424d\u424e\u424f\u4250\u4251\u4252\u4253\u4254\u4255\u4256\u4257\u4258\u4259\u425a\u425b\u425c\u425d\u425e\u425f\u4260\u4261\u4262\u4263\u4264\u4265\u4266\u4267\u4268\u4269\u426a\u426b\u426c\u426d\u426e\u426f\u4270\u4271\u4272\u4273\u4274\u4275\u4276\u4277\u4278\u4279\u427a\u427b\u427c\u427d\u427e\u427f\u4280\u4281\u4282\u4283\u4284\u4285\u4286\u4287\u4288\u4289\u428a\u428b\u428c\u428d\u428e\u428f\u4290\u4291\u4292\u4293\u4294\u4295\u4296\u4297\u4298\u4299\u429a\u429b\u429c\u429d\u429e\u429f\u42a0\u42a1\u42a2\u42a3\u42a4\u42a5\u42a6\u42a7\u42a8\u42a9\u42aa\u42ab\u42ac\u42ad\u42ae\u42af\u42b0\u42b1\u42b2\u42b3\u42b4\u42b5\u42b6\u42b7\u42b8\u42b9\u42ba\u42bb\u42bc\u42bd\u42be\u42bf\u42c0\u42c1\u42c2\u42c3\u42c4\u42c5\u42c6\u42c7\u42c8\u42c9\u42ca\u42cb\u42cc\u42cd\u42ce\u42cf\u42d0\u42d1\u42d2\u42d3\u42d4\u42d5\u42d6\u42d7\u42d8\u42d9\u42da\u42db\u42dc\u42dd\u42de\u42df\u42e0\u42e1\u42e2\u42e3\u42e4\u42e5\u42e6\u42e7\u42e8\u42e9\u42ea\u42eb\u42ec\u42ed\u42ee\u42ef\u42f0\u42f1\u42f2\u42f3\u42f4\u42f5\u42f6\u42f7\u42f8\u42f9\u42fa\u42fb\u42fc\u42fd\u42fe\u42ff\u4300\u4301\u4302\u4303\u4304\u4305\u4306\u4307\u4308\u4309\u430a\u430b\u430c\u430d\u430e\u430f\u4310\u4311\u4312\u4313\u4314\u4315\u4316\u4317\u4318\u4319\u431a\u431b\u431c\u431d\u431e\u431f\u4320\u4321\u4322\u4323\u4324\u4325\u4326\u4327\u4328\u4329\u432a\u432b\u432c\u432d\u432e\u432f\u4330\u4331\u4332\u4333\u4334\u4335\u4336\u4337\u4338\u4339\u433a\u433b\u433c\u433d\u433e\u433f\u4340\u4341\u4342\u4343\u4344\u4345\u4346\u4347\u4348\u4349\u434a\u434b\u434c\u434d\u434e\u434f\u4350\u4351\u4352\u4353\u4354\u4355\u4356\u4357\u4358\u4359\u435a\u435b\u435c\u435d\u435e\u435f\u4360\u4361\u4362\u4363\u4364\u4365\u4366\u4367\u4368\u4369\u436a\u436b\u436c\u436d\u436e\u436f\u4370\u4371\u4372\u4373\u4374\u4375\u4376\u4377\u4378\u4379\u437a\u437b\u437c\u437d\u437e\u437f\u4380\u4381\u4382\u4383\u4384\u4385\u4386\u4387\u4388\u4389\u438a\u438b\u438c\u438d\u438e\u438f\u4390\u4391\u4392\u4393\u4394\u4395\u4396\u4397\u4398\u4399\u439a\u439b\u439c\u439d\u439e\u439f\u43a0\u43a1\u43a2\u43a3\u43a4\u43a5\u43a6\u43a7\u43a8\u43a9\u43aa\u43ab\u43ac\u43ad\u43ae\u43af\u43b0\u43b1\u43b2\u43b3\u43b4\u43b5\u43b6\u43b7\u43b8\u43b9\u43ba\u43bb\u43bc\u43bd\u43be\u43bf\u43c0\u43c1\u43c2\u43c3\u43c4\u43c5\u43c6\u43c7\u43c8\u43c9\u43ca\u43cb\u43cc\u43cd\u43ce\u43cf\u43d0\u43d1\u43d2\u43d3\u43d4\u43d5\u43d6\u43d7\u43d8\u43d9\u43da\u43db\u43dc\u43dd\u43de\u43df\u43e0\u43e1\u43e2\u43e3\u43e4\u43e5\u43e6\u43e7\u43e8\u43e9\u43ea\u43eb\u43ec\u43ed\u43ee\u43ef\u43f0\u43f1\u43f2\u43f3\u43f4\u43f5\u43f6\u43f7\u43f8\u43f9\u43fa\u43fb\u43fc\u43fd\u43fe\u43ff\u4400\u4401\u4402\u4403\u4404\u4405\u4406\u4407\u4408\u4409\u440a\u440b\u440c\u440d\u440e\u440f\u4410\u4411\u4412\u4413\u4414\u4415\u4416\u4417\u4418\u4419\u441a\u441b\u441c\u441d\u441e\u441f\u4420\u4421\u4422\u4423\u4424\u4425\u4426\u4427\u4428\u4429\u442a\u442b\u442c\u442d\u442e\u442f\u4430\u4431\u4432\u4433\u4434\u4435\u4436\u4437\u4438\u4439\u443a\u443b\u443c\u443d\u443e\u443f\u4440\u4441\u4442\u4443\u4444\u4445\u4446\u4447\u4448\u4449\u444a\u444b\u444c\u444d\u444e\u444f\u4450\u4451\u4452\u4453\u4454\u4455\u4456\u4457\u4458\u4459\u445a\u445b\u445c\u445d\u445e\u445f\u4460\u4461\u4462\u4463\u4464\u4465\u4466\u4467\u4468\u4469\u446a\u446b\u446c\u446d\u446e\u446f\u4470\u4471\u4472\u4473\u4474\u4475\u4476\u4477\u4478\u4479\u447a\u447b\u447c\u447d\u447e\u447f\u4480\u4481\u4482\u4483\u4484\u4485\u4486\u4487\u4488\u4489\u448a\u448b\u448c\u448d\u448e\u448f\u4490\u4491\u4492\u4493\u4494\u4495\u4496\u4497\u4498\u4499\u449a\u449b\u449c\u449d\u449e\u449f\u44a0\u44a1\u44a2\u44a3\u44a4\u44a5\u44a6\u44a7\u44a8\u44a9\u44aa\u44ab\u44ac\u44ad\u44ae\u44af\u44b0\u44b1\u44b2\u44b3\u44b4\u44b5\u44b6\u44b7\u44b8\u44b9\u44ba\u44bb\u44bc\u44bd\u44be\u44bf\u44c0\u44c1\u44c2\u44c3\u44c4\u44c5\u44c6\u44c7\u44c8\u44c9\u44ca\u44cb\u44cc\u44cd\u44ce\u44cf\u44d0\u44d1\u44d2\u44d3\u44d4\u44d5\u44d6\u44d7\u44d8\u44d9\u44da\u44db\u44dc\u44dd\u44de\u44df\u44e0\u44e1\u44e2\u44e3\u44e4\u44e5\u44e6\u44e7\u44e8\u44e9\u44ea\u44eb\u44ec\u44ed\u44ee\u44ef\u44f0\u44f1\u44f2\u44f3\u44f4\u44f5\u44f6\u44f7\u44f8\u44f9\u44fa\u44fb\u44fc\u44fd\u44fe\u44ff\u4500\u4501\u4502\u4503\u4504\u4505\u4506\u4507\u4508\u4509\u450a\u450b\u450c\u450d\u450e\u450f\u4510\u4511\u4512\u4513\u4514\u4515\u4516\u4517\u4518\u4519\u451a\u451b\u451c\u451d\u451e\u451f\u4520\u4521\u4522\u4523\u4524\u4525\u4526\u4527\u4528\u4529\u452a\u452b\u452c\u452d\u452e\u452f\u4530\u4531\u4532\u4533\u4534\u4535\u4536\u4537\u4538\u4539\u453a\u453b\u453c\u453d\u453e\u453f\u4540\u4541\u4542\u4543\u4544\u4545\u4546\u4547\u4548\u4549\u454a\u454b\u454c\u454d\u454e\u454f\u4550\u4551\u4552\u4553\u4554\u4555\u4556\u4557\u4558\u4559\u455a\u455b\u455c\u455d\u455e\u455f\u4560\u4561\u4562\u4563\u4564\u4565\u4566\u4567\u4568\u4569\u456a\u456b\u456c\u456d\u456e\u456f\u4570\u4571\u4572\u4573\u4574\u4575\u4576\u4577\u4578\u4579\u457a\u457b\u457c\u457d\u457e\u457f\u4580\u4581\u4582\u4583\u4584\u4585\u4586\u4587\u4588\u4589\u458a\u458b\u458c\u458d\u458e\u458f\u4590\u4591\u4592\u4593\u4594\u4595\u4596\u4597\u4598\u4599\u459a\u459b\u459c\u459d\u459e\u459f\u45a0\u45a1\u45a2\u45a3\u45a4\u45a5\u45a6\u45a7\u45a8\u45a9\u45aa\u45ab\u45ac\u45ad\u45ae\u45af\u45b0\u45b1\u45b2\u45b3\u45b4\u45b5\u45b6\u45b7\u45b8\u45b9\u45ba\u45bb\u45bc\u45bd\u45be\u45bf\u45c0\u45c1\u45c2\u45c3\u45c4\u45c5\u45c6\u45c7\u45c8\u45c9\u45ca\u45cb\u45cc\u45cd\u45ce\u45cf\u45d0\u45d1\u45d2\u45d3\u45d4\u45d5\u45d6\u45d7\u45d8\u45d9\u45da\u45db\u45dc\u45dd\u45de\u45df\u45e0\u45e1\u45e2\u45e3\u45e4\u45e5\u45e6\u45e7\u45e8\u45e9\u45ea\u45eb\u45ec\u45ed\u45ee\u45ef\u45f0\u45f1\u45f2\u45f3\u45f4\u45f5\u45f6\u45f7\u45f8\u45f9\u45fa\u45fb\u45fc\u45fd\u45fe\u45ff\u4600\u4601\u4602\u4603\u4604\u4605\u4606\u4607\u4608\u4609\u460a\u460b\u460c\u460d\u460e\u460f\u4610\u4611\u4612\u4613\u4614\u4615\u4616\u4617\u4618\u4619\u461a\u461b\u461c\u461d\u461e\u461f\u4620\u4621\u4622\u4623\u4624\u4625\u4626\u4627\u4628\u4629\u462a\u462b\u462c\u462d\u462e\u462f\u4630\u4631\u4632\u4633\u4634\u4635\u4636\u4637\u4638\u4639\u463a\u463b\u463c\u463d\u463e\u463f\u4640\u4641\u4642\u4643\u4644\u4645\u4646\u4647\u4648\u4649\u464a\u464b\u464c\u464d\u464e\u464f\u4650\u4651\u4652\u4653\u4654\u4655\u4656\u4657\u4658\u4659\u465a\u465b\u465c\u465d\u465e\u465f\u4660\u4661\u4662\u4663\u4664\u4665\u4666\u4667\u4668\u4669\u466a\u466b\u466c\u466d\u466e\u466f\u4670\u4671\u4672\u4673\u4674\u4675\u4676\u4677\u4678\u4679\u467a\u467b\u467c\u467d\u467e\u467f\u4680\u4681\u4682\u4683\u4684\u4685\u4686\u4687\u4688\u4689\u468a\u468b\u468c\u468d\u468e\u468f\u4690\u4691\u4692\u4693\u4694\u4695\u4696\u4697\u4698\u4699\u469a\u469b\u469c\u469d\u469e\u469f\u46a0\u46a1\u46a2\u46a3\u46a4\u46a5\u46a6\u46a7\u46a8\u46a9\u46aa\u46ab\u46ac\u46ad\u46ae\u46af\u46b0\u46b1\u46b2\u46b3\u46b4\u46b5\u46b6\u46b7\u46b8\u46b9\u46ba\u46bb\u46bc\u46bd\u46be\u46bf\u46c0\u46c1\u46c2\u46c3\u46c4\u46c5\u46c6\u46c7\u46c8\u46c9\u46ca\u46cb\u46cc\u46cd\u46ce\u46cf\u46d0\u46d1\u46d2\u46d3\u46d4\u46d5\u46d6\u46d7\u46d8\u46d9\u46da\u46db\u46dc\u46dd\u46de\u46df\u46e0\u46e1\u46e2\u46e3\u46e4\u46e5\u46e6\u46e7\u46e8\u46e9\u46ea\u46eb\u46ec\u46ed\u46ee\u46ef\u46f0\u46f1\u46f2\u46f3\u46f4\u46f5\u46f6\u46f7\u46f8\u46f9\u46fa\u46fb\u46fc\u46fd\u46fe\u46ff\u4700\u4701\u4702\u4703\u4704\u4705\u4706\u4707\u4708\u4709\u470a\u470b\u470c\u470d\u470e\u470f\u4710\u4711\u4712\u4713\u4714\u4715\u4716\u4717\u4718\u4719\u471a\u471b\u471c\u471d\u471e\u471f\u4720\u4721\u4722\u4723\u4724\u4725\u4726\u4727\u4728\u4729\u472a\u472b\u472c\u472d\u472e\u472f\u4730\u4731\u4732\u4733\u4734\u4735\u4736\u4737\u4738\u4739\u473a\u473b\u473c\u473d\u473e\u473f\u4740\u4741\u4742\u4743\u4744\u4745\u4746\u4747\u4748\u4749\u474a\u474b\u474c\u474d\u474e\u474f\u4750\u4751\u4752\u4753\u4754\u4755\u4756\u4757\u4758\u4759\u475a\u475b\u475c\u475d\u475e\u475f\u4760\u4761\u4762\u4763\u4764\u4765\u4766\u4767\u4768\u4769\u476a\u476b\u476c\u476d\u476e\u476f\u4770\u4771\u4772\u4773\u4774\u4775\u4776\u4777\u4778\u4779\u477a\u477b\u477c\u477d\u477e\u477f\u4780\u4781\u4782\u4783\u4784\u4785\u4786\u4787\u4788\u4789\u478a\u478b\u478c\u478d\u478e\u478f\u4790\u4791\u4792\u4793\u4794\u4795\u4796\u4797\u4798\u4799\u479a\u479b\u479c\u479d\u479e\u479f\u47a0\u47a1\u47a2\u47a3\u47a4\u47a5\u47a6\u47a7\u47a8\u47a9\u47aa\u47ab\u47ac\u47ad\u47ae\u47af\u47b0\u47b1\u47b2\u47b3\u47b4\u47b5\u47b6\u47b7\u47b8\u47b9\u47ba\u47bb\u47bc\u47bd\u47be\u47bf\u47c0\u47c1\u47c2\u47c3\u47c4\u47c5\u47c6\u47c7\u47c8\u47c9\u47ca\u47cb\u47cc\u47cd\u47ce\u47cf\u47d0\u47d1\u47d2\u47d3\u47d4\u47d5\u47d6\u47d7\u47d8\u47d9\u47da\u47db\u47dc\u47dd\u47de\u47df\u47e0\u47e1\u47e2\u47e3\u47e4\u47e5\u47e6\u47e7\u47e8\u47e9\u47ea\u47eb\u47ec\u47ed\u47ee\u47ef\u47f0\u47f1\u47f2\u47f3\u47f4\u47f5\u47f6\u47f7\u47f8\u47f9\u47fa\u47fb\u47fc\u47fd\u47fe\u47ff\u4800\u4801\u4802\u4803\u4804\u4805\u4806\u4807\u4808\u4809\u480a\u480b\u480c\u480d\u480e\u480f\u4810\u4811\u4812\u4813\u4814\u4815\u4816\u4817\u4818\u4819\u481a\u481b\u481c\u481d\u481e\u481f\u4820\u4821\u4822\u4823\u4824\u4825\u4826\u4827\u4828\u4829\u482a\u482b\u482c\u482d\u482e\u482f\u4830\u4831\u4832\u4833\u4834\u4835\u4836\u4837\u4838\u4839\u483a\u483b\u483c\u483d\u483e\u483f\u4840\u4841\u4842\u4843\u4844\u4845\u4846\u4847\u4848\u4849\u484a\u484b\u484c\u484d\u484e\u484f\u4850\u4851\u4852\u4853\u4854\u4855\u4856\u4857\u4858\u4859\u485a\u485b\u485c\u485d\u485e\u485f\u4860\u4861\u4862\u4863\u4864\u4865\u4866\u4867\u4868\u4869\u486a\u486b\u486c\u486d\u486e\u486f\u4870\u4871\u4872\u4873\u4874\u4875\u4876\u4877\u4878\u4879\u487a\u487b\u487c\u487d\u487e\u487f\u4880\u4881\u4882\u4883\u4884\u4885\u4886\u4887\u4888\u4889\u488a\u488b\u488c\u488d\u488e\u488f\u4890\u4891\u4892\u4893\u4894\u4895\u4896\u4897\u4898\u4899\u489a\u489b\u489c\u489d\u489e\u489f\u48a0\u48a1\u48a2\u48a3\u48a4\u48a5\u48a6\u48a7\u48a8\u48a9\u48aa\u48ab\u48ac\u48ad\u48ae\u48af\u48b0\u48b1\u48b2\u48b3\u48b4\u48b5\u48b6\u48b7\u48b8\u48b9\u48ba\u48bb\u48bc\u48bd\u48be\u48bf\u48c0\u48c1\u48c2\u48c3\u48c4\u48c5\u48c6\u48c7\u48c8\u48c9\u48ca\u48cb\u48cc\u48cd\u48ce\u48cf\u48d0\u48d1\u48d2\u48d3\u48d4\u48d5\u48d6\u48d7\u48d8\u48d9\u48da\u48db\u48dc\u48dd\u48de\u48df\u48e0\u48e1\u48e2\u48e3\u48e4\u48e5\u48e6\u48e7\u48e8\u48e9\u48ea\u48eb\u48ec\u48ed\u48ee\u48ef\u48f0\u48f1\u48f2\u48f3\u48f4\u48f5\u48f6\u48f7\u48f8\u48f9\u48fa\u48fb\u48fc\u48fd\u48fe\u48ff\u4900\u4901\u4902\u4903\u4904\u4905\u4906\u4907\u4908\u4909\u490a\u490b\u490c\u490d\u490e\u490f\u4910\u4911\u4912\u4913\u4914\u4915\u4916\u4917\u4918\u4919\u491a\u491b\u491c\u491d\u491e\u491f\u4920\u4921\u4922\u4923\u4924\u4925\u4926\u4927\u4928\u4929\u492a\u492b\u492c\u492d\u492e\u492f\u4930\u4931\u4932\u4933\u4934\u4935\u4936\u4937\u4938\u4939\u493a\u493b\u493c\u493d\u493e\u493f\u4940\u4941\u4942\u4943\u4944\u4945\u4946\u4947\u4948\u4949\u494a\u494b\u494c\u494d\u494e\u494f\u4950\u4951\u4952\u4953\u4954\u4955\u4956\u4957\u4958\u4959\u495a\u495b\u495c\u495d\u495e\u495f\u4960\u4961\u4962\u4963\u4964\u4965\u4966\u4967\u4968\u4969\u496a\u496b\u496c\u496d\u496e\u496f\u4970\u4971\u4972\u4973\u4974\u4975\u4976\u4977\u4978\u4979\u497a\u497b\u497c\u497d\u497e\u497f\u4980\u4981\u4982\u4983\u4984\u4985\u4986\u4987\u4988\u4989\u498a\u498b\u498c\u498d\u498e\u498f\u4990\u4991\u4992\u4993\u4994\u4995\u4996\u4997\u4998\u4999\u499a\u499b\u499c\u499d\u499e\u499f\u49a0\u49a1\u49a2\u49a3\u49a4\u49a5\u49a6\u49a7\u49a8\u49a9\u49aa\u49ab\u49ac\u49ad\u49ae\u49af\u49b0\u49b1\u49b2\u49b3\u49b4\u49b5\u49b6\u49b7\u49b8\u49b9\u49ba\u49bb\u49bc\u49bd\u49be\u49bf\u49c0\u49c1\u49c2\u49c3\u49c4\u49c5\u49c6\u49c7\u49c8\u49c9\u49ca\u49cb\u49cc\u49cd\u49ce\u49cf\u49d0\u49d1\u49d2\u49d3\u49d4\u49d5\u49d6\u49d7\u49d8\u49d9\u49da\u49db\u49dc\u49dd\u49de\u49df\u49e0\u49e1\u49e2\u49e3\u49e4\u49e5\u49e6\u49e7\u49e8\u49e9\u49ea\u49eb\u49ec\u49ed\u49ee\u49ef\u49f0\u49f1\u49f2\u49f3\u49f4\u49f5\u49f6\u49f7\u49f8\u49f9\u49fa\u49fb\u49fc\u49fd\u49fe\u49ff\u4a00\u4a01\u4a02\u4a03\u4a04\u4a05\u4a06\u4a07\u4a08\u4a09\u4a0a\u4a0b\u4a0c\u4a0d\u4a0e\u4a0f\u4a10\u4a11\u4a12\u4a13\u4a14\u4a15\u4a16\u4a17\u4a18\u4a19\u4a1a\u4a1b\u4a1c\u4a1d\u4a1e\u4a1f\u4a20\u4a21\u4a22\u4a23\u4a24\u4a25\u4a26\u4a27\u4a28\u4a29\u4a2a\u4a2b\u4a2c\u4a2d\u4a2e\u4a2f\u4a30\u4a31\u4a32\u4a33\u4a34\u4a35\u4a36\u4a37\u4a38\u4a39\u4a3a\u4a3b\u4a3c\u4a3d\u4a3e\u4a3f\u4a40\u4a41\u4a42\u4a43\u4a44\u4a45\u4a46\u4a47\u4a48\u4a49\u4a4a\u4a4b\u4a4c\u4a4d\u4a4e\u4a4f\u4a50\u4a51\u4a52\u4a53\u4a54\u4a55\u4a56\u4a57\u4a58\u4a59\u4a5a\u4a5b\u4a5c\u4a5d\u4a5e\u4a5f\u4a60\u4a61\u4a62\u4a63\u4a64\u4a65\u4a66\u4a67\u4a68\u4a69\u4a6a\u4a6b\u4a6c\u4a6d\u4a6e\u4a6f\u4a70\u4a71\u4a72\u4a73\u4a74\u4a75\u4a76\u4a77\u4a78\u4a79\u4a7a\u4a7b\u4a7c\u4a7d\u4a7e\u4a7f\u4a80\u4a81\u4a82\u4a83\u4a84\u4a85\u4a86\u4a87\u4a88\u4a89\u4a8a\u4a8b\u4a8c\u4a8d\u4a8e\u4a8f\u4a90\u4a91\u4a92\u4a93\u4a94\u4a95\u4a96\u4a97\u4a98\u4a99\u4a9a\u4a9b\u4a9c\u4a9d\u4a9e\u4a9f\u4aa0\u4aa1\u4aa2\u4aa3\u4aa4\u4aa5\u4aa6\u4aa7\u4aa8\u4aa9\u4aaa\u4aab\u4aac\u4aad\u4aae\u4aaf\u4ab0\u4ab1\u4ab2\u4ab3\u4ab4\u4ab5\u4ab6\u4ab7\u4ab8\u4ab9\u4aba\u4abb\u4abc\u4abd\u4abe\u4abf\u4ac0\u4ac1\u4ac2\u4ac3\u4ac4\u4ac5\u4ac6\u4ac7\u4ac8\u4ac9\u4aca\u4acb\u4acc\u4acd\u4ace\u4acf\u4ad0\u4ad1\u4ad2\u4ad3\u4ad4\u4ad5\u4ad6\u4ad7\u4ad8\u4ad9\u4ada\u4adb\u4adc\u4add\u4ade\u4adf\u4ae0\u4ae1\u4ae2\u4ae3\u4ae4\u4ae5\u4ae6\u4ae7\u4ae8\u4ae9\u4aea\u4aeb\u4aec\u4aed\u4aee\u4aef\u4af0\u4af1\u4af2\u4af3\u4af4\u4af5\u4af6\u4af7\u4af8\u4af9\u4afa\u4afb\u4afc\u4afd\u4afe\u4aff\u4b00\u4b01\u4b02\u4b03\u4b04\u4b05\u4b06\u4b07\u4b08\u4b09\u4b0a\u4b0b\u4b0c\u4b0d\u4b0e\u4b0f\u4b10\u4b11\u4b12\u4b13\u4b14\u4b15\u4b16\u4b17\u4b18\u4b19\u4b1a\u4b1b\u4b1c\u4b1d\u4b1e\u4b1f\u4b20\u4b21\u4b22\u4b23\u4b24\u4b25\u4b26\u4b27\u4b28\u4b29\u4b2a\u4b2b\u4b2c\u4b2d\u4b2e\u4b2f\u4b30\u4b31\u4b32\u4b33\u4b34\u4b35\u4b36\u4b37\u4b38\u4b39\u4b3a\u4b3b\u4b3c\u4b3d\u4b3e\u4b3f\u4b40\u4b41\u4b42\u4b43\u4b44\u4b45\u4b46\u4b47\u4b48\u4b49\u4b4a\u4b4b\u4b4c\u4b4d\u4b4e\u4b4f\u4b50\u4b51\u4b52\u4b53\u4b54\u4b55\u4b56\u4b57\u4b58\u4b59\u4b5a\u4b5b\u4b5c\u4b5d\u4b5e\u4b5f\u4b60\u4b61\u4b62\u4b63\u4b64\u4b65\u4b66\u4b67\u4b68\u4b69\u4b6a\u4b6b\u4b6c\u4b6d\u4b6e\u4b6f\u4b70\u4b71\u4b72\u4b73\u4b74\u4b75\u4b76\u4b77\u4b78\u4b79\u4b7a\u4b7b\u4b7c\u4b7d\u4b7e\u4b7f\u4b80\u4b81\u4b82\u4b83\u4b84\u4b85\u4b86\u4b87\u4b88\u4b89\u4b8a\u4b8b\u4b8c\u4b8d\u4b8e\u4b8f\u4b90\u4b91\u4b92\u4b93\u4b94\u4b95\u4b96\u4b97\u4b98\u4b99\u4b9a\u4b9b\u4b9c\u4b9d\u4b9e\u4b9f\u4ba0\u4ba1\u4ba2\u4ba3\u4ba4\u4ba5\u4ba6\u4ba7\u4ba8\u4ba9\u4baa\u4bab\u4bac\u4bad\u4bae\u4baf\u4bb0\u4bb1\u4bb2\u4bb3\u4bb4\u4bb5\u4bb6\u4bb7\u4bb8\u4bb9\u4bba\u4bbb\u4bbc\u4bbd\u4bbe\u4bbf\u4bc0\u4bc1\u4bc2\u4bc3\u4bc4\u4bc5\u4bc6\u4bc7\u4bc8\u4bc9\u4bca\u4bcb\u4bcc\u4bcd\u4bce\u4bcf\u4bd0\u4bd1\u4bd2\u4bd3\u4bd4\u4bd5\u4bd6\u4bd7\u4bd8\u4bd9\u4bda\u4bdb\u4bdc\u4bdd\u4bde\u4bdf\u4be0\u4be1\u4be2\u4be3\u4be4\u4be5\u4be6\u4be7\u4be8\u4be9\u4bea\u4beb\u4bec\u4bed\u4bee\u4bef\u4bf0\u4bf1\u4bf2\u4bf3\u4bf4\u4bf5\u4bf6\u4bf7\u4bf8\u4bf9\u4bfa\u4bfb\u4bfc\u4bfd\u4bfe\u4bff\u4c00\u4c01\u4c02\u4c03\u4c04\u4c05\u4c06\u4c07\u4c08\u4c09\u4c0a\u4c0b\u4c0c\u4c0d\u4c0e\u4c0f\u4c10\u4c11\u4c12\u4c13\u4c14\u4c15\u4c16\u4c17\u4c18\u4c19\u4c1a\u4c1b\u4c1c\u4c1d\u4c1e\u4c1f\u4c20\u4c21\u4c22\u4c23\u4c24\u4c25\u4c26\u4c27\u4c28\u4c29\u4c2a\u4c2b\u4c2c\u4c2d\u4c2e\u4c2f\u4c30\u4c31\u4c32\u4c33\u4c34\u4c35\u4c36\u4c37\u4c38\u4c39\u4c3a\u4c3b\u4c3c\u4c3d\u4c3e\u4c3f\u4c40\u4c41\u4c42\u4c43\u4c44\u4c45\u4c46\u4c47\u4c48\u4c49\u4c4a\u4c4b\u4c4c\u4c4d\u4c4e\u4c4f\u4c50\u4c51\u4c52\u4c53\u4c54\u4c55\u4c56\u4c57\u4c58\u4c59\u4c5a\u4c5b\u4c5c\u4c5d\u4c5e\u4c5f\u4c60\u4c61\u4c62\u4c63\u4c64\u4c65\u4c66\u4c67\u4c68\u4c69\u4c6a\u4c6b\u4c6c\u4c6d\u4c6e\u4c6f\u4c70\u4c71\u4c72\u4c73\u4c74\u4c75\u4c76\u4c77\u4c78\u4c79\u4c7a\u4c7b\u4c7c\u4c7d\u4c7e\u4c7f\u4c80\u4c81\u4c82\u4c83\u4c84\u4c85\u4c86\u4c87\u4c88\u4c89\u4c8a\u4c8b\u4c8c\u4c8d\u4c8e\u4c8f\u4c90\u4c91\u4c92\u4c93\u4c94\u4c95\u4c96\u4c97\u4c98\u4c99\u4c9a\u4c9b\u4c9c\u4c9d\u4c9e\u4c9f\u4ca0\u4ca1\u4ca2\u4ca3\u4ca4\u4ca5\u4ca6\u4ca7\u4ca8\u4ca9\u4caa\u4cab\u4cac\u4cad\u4cae\u4caf\u4cb0\u4cb1\u4cb2\u4cb3\u4cb4\u4cb5\u4cb6\u4cb7\u4cb8\u4cb9\u4cba\u4cbb\u4cbc\u4cbd\u4cbe\u4cbf\u4cc0\u4cc1\u4cc2\u4cc3\u4cc4\u4cc5\u4cc6\u4cc7\u4cc8\u4cc9\u4cca\u4ccb\u4ccc\u4ccd\u4cce\u4ccf\u4cd0\u4cd1\u4cd2\u4cd3\u4cd4\u4cd5\u4cd6\u4cd7\u4cd8\u4cd9\u4cda\u4cdb\u4cdc\u4cdd\u4cde\u4cdf\u4ce0\u4ce1\u4ce2\u4ce3\u4ce4\u4ce5\u4ce6\u4ce7\u4ce8\u4ce9\u4cea\u4ceb\u4cec\u4ced\u4cee\u4cef\u4cf0\u4cf1\u4cf2\u4cf3\u4cf4\u4cf5\u4cf6\u4cf7\u4cf8\u4cf9\u4cfa\u4cfb\u4cfc\u4cfd\u4cfe\u4cff\u4d00\u4d01\u4d02\u4d03\u4d04\u4d05\u4d06\u4d07\u4d08\u4d09\u4d0a\u4d0b\u4d0c\u4d0d\u4d0e\u4d0f\u4d10\u4d11\u4d12\u4d13\u4d14\u4d15\u4d16\u4d17\u4d18\u4d19\u4d1a\u4d1b\u4d1c\u4d1d\u4d1e\u4d1f\u4d20\u4d21\u4d22\u4d23\u4d24\u4d25\u4d26\u4d27\u4d28\u4d29\u4d2a\u4d2b\u4d2c\u4d2d\u4d2e\u4d2f\u4d30\u4d31\u4d32\u4d33\u4d34\u4d35\u4d36\u4d37\u4d38\u4d39\u4d3a\u4d3b\u4d3c\u4d3d\u4d3e\u4d3f\u4d40\u4d41\u4d42\u4d43\u4d44\u4d45\u4d46\u4d47\u4d48\u4d49\u4d4a\u4d4b\u4d4c\u4d4d\u4d4e\u4d4f\u4d50\u4d51\u4d52\u4d53\u4d54\u4d55\u4d56\u4d57\u4d58\u4d59\u4d5a\u4d5b\u4d5c\u4d5d\u4d5e\u4d5f\u4d60\u4d61\u4d62\u4d63\u4d64\u4d65\u4d66\u4d67\u4d68\u4d69\u4d6a\u4d6b\u4d6c\u4d6d\u4d6e\u4d6f\u4d70\u4d71\u4d72\u4d73\u4d74\u4d75\u4d76\u4d77\u4d78\u4d79\u4d7a\u4d7b\u4d7c\u4d7d\u4d7e\u4d7f\u4d80\u4d81\u4d82\u4d83\u4d84\u4d85\u4d86\u4d87\u4d88\u4d89\u4d8a\u4d8b\u4d8c\u4d8d\u4d8e\u4d8f\u4d90\u4d91\u4d92\u4d93\u4d94\u4d95\u4d96\u4d97\u4d98\u4d99\u4d9a\u4d9b\u4d9c\u4d9d\u4d9e\u4d9f\u4da0\u4da1\u4da2\u4da3\u4da4\u4da5\u4da6\u4da7\u4da8\u4da9\u4daa\u4dab\u4dac\u4dad\u4dae\u4daf\u4db0\u4db1\u4db2\u4db3\u4db4\u4db5\u4e00\u4e01\u4e02\u4e03\u4e04\u4e05\u4e06\u4e07\u4e08\u4e09\u4e0a\u4e0b\u4e0c\u4e0d\u4e0e\u4e0f\u4e10\u4e11\u4e12\u4e13\u4e14\u4e15\u4e16\u4e17\u4e18\u4e19\u4e1a\u4e1b\u4e1c\u4e1d\u4e1e\u4e1f\u4e20\u4e21\u4e22\u4e23\u4e24\u4e25\u4e26\u4e27\u4e28\u4e29\u4e2a\u4e2b\u4e2c\u4e2d\u4e2e\u4e2f\u4e30\u4e31\u4e32\u4e33\u4e34\u4e35\u4e36\u4e37\u4e38\u4e39\u4e3a\u4e3b\u4e3c\u4e3d\u4e3e\u4e3f\u4e40\u4e41\u4e42\u4e43\u4e44\u4e45\u4e46\u4e47\u4e48\u4e49\u4e4a\u4e4b\u4e4c\u4e4d\u4e4e\u4e4f\u4e50\u4e51\u4e52\u4e53\u4e54\u4e55\u4e56\u4e57\u4e58\u4e59\u4e5a\u4e5b\u4e5c\u4e5d\u4e5e\u4e5f\u4e60\u4e61\u4e62\u4e63\u4e64\u4e65\u4e66\u4e67\u4e68\u4e69\u4e6a\u4e6b\u4e6c\u4e6d\u4e6e\u4e6f\u4e70\u4e71\u4e72\u4e73\u4e74\u4e75\u4e76\u4e77\u4e78\u4e79\u4e7a\u4e7b\u4e7c\u4e7d\u4e7e\u4e7f\u4e80\u4e81\u4e82\u4e83\u4e84\u4e85\u4e86\u4e87\u4e88\u4e89\u4e8a\u4e8b\u4e8c\u4e8d\u4e8e\u4e8f\u4e90\u4e91\u4e92\u4e93\u4e94\u4e95\u4e96\u4e97\u4e98\u4e99\u4e9a\u4e9b\u4e9c\u4e9d\u4e9e\u4e9f\u4ea0\u4ea1\u4ea2\u4ea3\u4ea4\u4ea5\u4ea6\u4ea7\u4ea8\u4ea9\u4eaa\u4eab\u4eac\u4ead\u4eae\u4eaf\u4eb0\u4eb1\u4eb2\u4eb3\u4eb4\u4eb5\u4eb6\u4eb7\u4eb8\u4eb9\u4eba\u4ebb\u4ebc\u4ebd\u4ebe\u4ebf\u4ec0\u4ec1\u4ec2\u4ec3\u4ec4\u4ec5\u4ec6\u4ec7\u4ec8\u4ec9\u4eca\u4ecb\u4ecc\u4ecd\u4ece\u4ecf\u4ed0\u4ed1\u4ed2\u4ed3\u4ed4\u4ed5\u4ed6\u4ed7\u4ed8\u4ed9\u4eda\u4edb\u4edc\u4edd\u4ede\u4edf\u4ee0\u4ee1\u4ee2\u4ee3\u4ee4\u4ee5\u4ee6\u4ee7\u4ee8\u4ee9\u4eea\u4eeb\u4eec\u4eed\u4eee\u4eef\u4ef0\u4ef1\u4ef2\u4ef3\u4ef4\u4ef5\u4ef6\u4ef7\u4ef8\u4ef9\u4efa\u4efb\u4efc\u4efd\u4efe\u4eff\u4f00\u4f01\u4f02\u4f03\u4f04\u4f05\u4f06\u4f07\u4f08\u4f09\u4f0a\u4f0b\u4f0c\u4f0d\u4f0e\u4f0f\u4f10\u4f11\u4f12\u4f13\u4f14\u4f15\u4f16\u4f17\u4f18\u4f19\u4f1a\u4f1b\u4f1c\u4f1d\u4f1e\u4f1f\u4f20\u4f21\u4f22\u4f23\u4f24\u4f25\u4f26\u4f27\u4f28\u4f29\u4f2a\u4f2b\u4f2c\u4f2d\u4f2e\u4f2f\u4f30\u4f31\u4f32\u4f33\u4f34\u4f35\u4f36\u4f37\u4f38\u4f39\u4f3a\u4f3b\u4f3c\u4f3d\u4f3e\u4f3f\u4f40\u4f41\u4f42\u4f43\u4f44\u4f45\u4f46\u4f47\u4f48\u4f49\u4f4a\u4f4b\u4f4c\u4f4d\u4f4e\u4f4f\u4f50\u4f51\u4f52\u4f53\u4f54\u4f55\u4f56\u4f57\u4f58\u4f59\u4f5a\u4f5b\u4f5c\u4f5d\u4f5e\u4f5f\u4f60\u4f61\u4f62\u4f63\u4f64\u4f65\u4f66\u4f67\u4f68\u4f69\u4f6a\u4f6b\u4f6c\u4f6d\u4f6e\u4f6f\u4f70\u4f71\u4f72\u4f73\u4f74\u4f75\u4f76\u4f77\u4f78\u4f79\u4f7a\u4f7b\u4f7c\u4f7d\u4f7e\u4f7f\u4f80\u4f81\u4f82\u4f83\u4f84\u4f85\u4f86\u4f87\u4f88\u4f89\u4f8a\u4f8b\u4f8c\u4f8d\u4f8e\u4f8f\u4f90\u4f91\u4f92\u4f93\u4f94\u4f95\u4f96\u4f97\u4f98\u4f99\u4f9a\u4f9b\u4f9c\u4f9d\u4f9e\u4f9f\u4fa0\u4fa1\u4fa2\u4fa3\u4fa4\u4fa5\u4fa6\u4fa7\u4fa8\u4fa9\u4faa\u4fab\u4fac\u4fad\u4fae\u4faf\u4fb0\u4fb1\u4fb2\u4fb3\u4fb4\u4fb5\u4fb6\u4fb7\u4fb8\u4fb9\u4fba\u4fbb\u4fbc\u4fbd\u4fbe\u4fbf\u4fc0\u4fc1\u4fc2\u4fc3\u4fc4\u4fc5\u4fc6\u4fc7\u4fc8\u4fc9\u4fca\u4fcb\u4fcc\u4fcd\u4fce\u4fcf\u4fd0\u4fd1\u4fd2\u4fd3\u4fd4\u4fd5\u4fd6\u4fd7\u4fd8\u4fd9\u4fda\u4fdb\u4fdc\u4fdd\u4fde\u4fdf\u4fe0\u4fe1\u4fe2\u4fe3\u4fe4\u4fe5\u4fe6\u4fe7\u4fe8\u4fe9\u4fea\u4feb\u4fec\u4fed\u4fee\u4fef\u4ff0\u4ff1\u4ff2\u4ff3\u4ff4\u4ff5\u4ff6\u4ff7\u4ff8\u4ff9\u4ffa\u4ffb\u4ffc\u4ffd\u4ffe\u4fff\u5000\u5001\u5002\u5003\u5004\u5005\u5006\u5007\u5008\u5009\u500a\u500b\u500c\u500d\u500e\u500f\u5010\u5011\u5012\u5013\u5014\u5015\u5016\u5017\u5018\u5019\u501a\u501b\u501c\u501d\u501e\u501f\u5020\u5021\u5022\u5023\u5024\u5025\u5026\u5027\u5028\u5029\u502a\u502b\u502c\u502d\u502e\u502f\u5030\u5031\u5032\u5033\u5034\u5035\u5036\u5037\u5038\u5039\u503a\u503b\u503c\u503d\u503e\u503f\u5040\u5041\u5042\u5043\u5044\u5045\u5046\u5047\u5048\u5049\u504a\u504b\u504c\u504d\u504e\u504f\u5050\u5051\u5052\u5053\u5054\u5055\u5056\u5057\u5058\u5059\u505a\u505b\u505c\u505d\u505e\u505f\u5060\u5061\u5062\u5063\u5064\u5065\u5066\u5067\u5068\u5069\u506a\u506b\u506c\u506d\u506e\u506f\u5070\u5071\u5072\u5073\u5074\u5075\u5076\u5077\u5078\u5079\u507a\u507b\u507c\u507d\u507e\u507f\u5080\u5081\u5082\u5083\u5084\u5085\u5086\u5087\u5088\u5089\u508a\u508b\u508c\u508d\u508e\u508f\u5090\u5091\u5092\u5093\u5094\u5095\u5096\u5097\u5098\u5099\u509a\u509b\u509c\u509d\u509e\u509f\u50a0\u50a1\u50a2\u50a3\u50a4\u50a5\u50a6\u50a7\u50a8\u50a9\u50aa\u50ab\u50ac\u50ad\u50ae\u50af\u50b0\u50b1\u50b2\u50b3\u50b4\u50b5\u50b6\u50b7\u50b8\u50b9\u50ba\u50bb\u50bc\u50bd\u50be\u50bf\u50c0\u50c1\u50c2\u50c3\u50c4\u50c5\u50c6\u50c7\u50c8\u50c9\u50ca\u50cb\u50cc\u50cd\u50ce\u50cf\u50d0\u50d1\u50d2\u50d3\u50d4\u50d5\u50d6\u50d7\u50d8\u50d9\u50da\u50db\u50dc\u50dd\u50de\u50df\u50e0\u50e1\u50e2\u50e3\u50e4\u50e5\u50e6\u50e7\u50e8\u50e9\u50ea\u50eb\u50ec\u50ed\u50ee\u50ef\u50f0\u50f1\u50f2\u50f3\u50f4\u50f5\u50f6\u50f7\u50f8\u50f9\u50fa\u50fb\u50fc\u50fd\u50fe\u50ff\u5100\u5101\u5102\u5103\u5104\u5105\u5106\u5107\u5108\u5109\u510a\u510b\u510c\u510d\u510e\u510f\u5110\u5111\u5112\u5113\u5114\u5115\u5116\u5117\u5118\u5119\u511a\u511b\u511c\u511d\u511e\u511f\u5120\u5121\u5122\u5123\u5124\u5125\u5126\u5127\u5128\u5129\u512a\u512b\u512c\u512d\u512e\u512f\u5130\u5131\u5132\u5133\u5134\u5135\u5136\u5137\u5138\u5139\u513a\u513b\u513c\u513d\u513e\u513f\u5140\u5141\u5142\u5143\u5144\u5145\u5146\u5147\u5148\u5149\u514a\u514b\u514c\u514d\u514e\u514f\u5150\u5151\u5152\u5153\u5154\u5155\u5156\u5157\u5158\u5159\u515a\u515b\u515c\u515d\u515e\u515f\u5160\u5161\u5162\u5163\u5164\u5165\u5166\u5167\u5168\u5169\u516a\u516b\u516c\u516d\u516e\u516f\u5170\u5171\u5172\u5173\u5174\u5175\u5176\u5177\u5178\u5179\u517a\u517b\u517c\u517d\u517e\u517f\u5180\u5181\u5182\u5183\u5184\u5185\u5186\u5187\u5188\u5189\u518a\u518b\u518c\u518d\u518e\u518f\u5190\u5191\u5192\u5193\u5194\u5195\u5196\u5197\u5198\u5199\u519a\u519b\u519c\u519d\u519e\u519f\u51a0\u51a1\u51a2\u51a3\u51a4\u51a5\u51a6\u51a7\u51a8\u51a9\u51aa\u51ab\u51ac\u51ad\u51ae\u51af\u51b0\u51b1\u51b2\u51b3\u51b4\u51b5\u51b6\u51b7\u51b8\u51b9\u51ba\u51bb\u51bc\u51bd\u51be\u51bf\u51c0\u51c1\u51c2\u51c3\u51c4\u51c5\u51c6\u51c7\u51c8\u51c9\u51ca\u51cb\u51cc\u51cd\u51ce\u51cf\u51d0\u51d1\u51d2\u51d3\u51d4\u51d5\u51d6\u51d7\u51d8\u51d9\u51da\u51db\u51dc\u51dd\u51de\u51df\u51e0\u51e1\u51e2\u51e3\u51e4\u51e5\u51e6\u51e7\u51e8\u51e9\u51ea\u51eb\u51ec\u51ed\u51ee\u51ef\u51f0\u51f1\u51f2\u51f3\u51f4\u51f5\u51f6\u51f7\u51f8\u51f9\u51fa\u51fb\u51fc\u51fd\u51fe\u51ff\u5200\u5201\u5202\u5203\u5204\u5205\u5206\u5207\u5208\u5209\u520a\u520b\u520c\u520d\u520e\u520f\u5210\u5211\u5212\u5213\u5214\u5215\u5216\u5217\u5218\u5219\u521a\u521b\u521c\u521d\u521e\u521f\u5220\u5221\u5222\u5223\u5224\u5225\u5226\u5227\u5228\u5229\u522a\u522b\u522c\u522d\u522e\u522f\u5230\u5231\u5232\u5233\u5234\u5235\u5236\u5237\u5238\u5239\u523a\u523b\u523c\u523d\u523e\u523f\u5240\u5241\u5242\u5243\u5244\u5245\u5246\u5247\u5248\u5249\u524a\u524b\u524c\u524d\u524e\u524f\u5250\u5251\u5252\u5253\u5254\u5255\u5256\u5257\u5258\u5259\u525a\u525b\u525c\u525d\u525e\u525f\u5260\u5261\u5262\u5263\u5264\u5265\u5266\u5267\u5268\u5269\u526a\u526b\u526c\u526d\u526e\u526f\u5270\u5271\u5272\u5273\u5274\u5275\u5276\u5277\u5278\u5279\u527a\u527b\u527c\u527d\u527e\u527f\u5280\u5281\u5282\u5283\u5284\u5285\u5286\u5287\u5288\u5289\u528a\u528b\u528c\u528d\u528e\u528f\u5290\u5291\u5292\u5293\u5294\u5295\u5296\u5297\u5298\u5299\u529a\u529b\u529c\u529d\u529e\u529f\u52a0\u52a1\u52a2\u52a3\u52a4\u52a5\u52a6\u52a7\u52a8\u52a9\u52aa\u52ab\u52ac\u52ad\u52ae\u52af\u52b0\u52b1\u52b2\u52b3\u52b4\u52b5\u52b6\u52b7\u52b8\u52b9\u52ba\u52bb\u52bc\u52bd\u52be\u52bf\u52c0\u52c1\u52c2\u52c3\u52c4\u52c5\u52c6\u52c7\u52c8\u52c9\u52ca\u52cb\u52cc\u52cd\u52ce\u52cf\u52d0\u52d1\u52d2\u52d3\u52d4\u52d5\u52d6\u52d7\u52d8\u52d9\u52da\u52db\u52dc\u52dd\u52de\u52df\u52e0\u52e1\u52e2\u52e3\u52e4\u52e5\u52e6\u52e7\u52e8\u52e9\u52ea\u52eb\u52ec\u52ed\u52ee\u52ef\u52f0\u52f1\u52f2\u52f3\u52f4\u52f5\u52f6\u52f7\u52f8\u52f9\u52fa\u52fb\u52fc\u52fd\u52fe\u52ff\u5300\u5301\u5302\u5303\u5304\u5305\u5306\u5307\u5308\u5309\u530a\u530b\u530c\u530d\u530e\u530f\u5310\u5311\u5312\u5313\u5314\u5315\u5316\u5317\u5318\u5319\u531a\u531b\u531c\u531d\u531e\u531f\u5320\u5321\u5322\u5323\u5324\u5325\u5326\u5327\u5328\u5329\u532a\u532b\u532c\u532d\u532e\u532f\u5330\u5331\u5332\u5333\u5334\u5335\u5336\u5337\u5338\u5339\u533a\u533b\u533c\u533d\u533e\u533f\u5340\u5341\u5342\u5343\u5344\u5345\u5346\u5347\u5348\u5349\u534a\u534b\u534c\u534d\u534e\u534f\u5350\u5351\u5352\u5353\u5354\u5355\u5356\u5357\u5358\u5359\u535a\u535b\u535c\u535d\u535e\u535f\u5360\u5361\u5362\u5363\u5364\u5365\u5366\u5367\u5368\u5369\u536a\u536b\u536c\u536d\u536e\u536f\u5370\u5371\u5372\u5373\u5374\u5375\u5376\u5377\u5378\u5379\u537a\u537b\u537c\u537d\u537e\u537f\u5380\u5381\u5382\u5383\u5384\u5385\u5386\u5387\u5388\u5389\u538a\u538b\u538c\u538d\u538e\u538f\u5390\u5391\u5392\u5393\u5394\u5395\u5396\u5397\u5398\u5399\u539a\u539b\u539c\u539d\u539e\u539f\u53a0\u53a1\u53a2\u53a3\u53a4\u53a5\u53a6\u53a7\u53a8\u53a9\u53aa\u53ab\u53ac\u53ad\u53ae\u53af\u53b0\u53b1\u53b2\u53b3\u53b4\u53b5\u53b6\u53b7\u53b8\u53b9\u53ba\u53bb\u53bc\u53bd\u53be\u53bf\u53c0\u53c1\u53c2\u53c3\u53c4\u53c5\u53c6\u53c7\u53c8\u53c9\u53ca\u53cb\u53cc\u53cd\u53ce\u53cf\u53d0\u53d1\u53d2\u53d3\u53d4\u53d5\u53d6\u53d7\u53d8\u53d9\u53da\u53db\u53dc\u53dd\u53de\u53df\u53e0\u53e1\u53e2\u53e3\u53e4\u53e5\u53e6\u53e7\u53e8\u53e9\u53ea\u53eb\u53ec\u53ed\u53ee\u53ef\u53f0\u53f1\u53f2\u53f3\u53f4\u53f5\u53f6\u53f7\u53f8\u53f9\u53fa\u53fb\u53fc\u53fd\u53fe\u53ff\u5400\u5401\u5402\u5403\u5404\u5405\u5406\u5407\u5408\u5409\u540a\u540b\u540c\u540d\u540e\u540f\u5410\u5411\u5412\u5413\u5414\u5415\u5416\u5417\u5418\u5419\u541a\u541b\u541c\u541d\u541e\u541f\u5420\u5421\u5422\u5423\u5424\u5425\u5426\u5427\u5428\u5429\u542a\u542b\u542c\u542d\u542e\u542f\u5430\u5431\u5432\u5433\u5434\u5435\u5436\u5437\u5438\u5439\u543a\u543b\u543c\u543d\u543e\u543f\u5440\u5441\u5442\u5443\u5444\u5445\u5446\u5447\u5448\u5449\u544a\u544b\u544c\u544d\u544e\u544f\u5450\u5451\u5452\u5453\u5454\u5455\u5456\u5457\u5458\u5459\u545a\u545b\u545c\u545d\u545e\u545f\u5460\u5461\u5462\u5463\u5464\u5465\u5466\u5467\u5468\u5469\u546a\u546b\u546c\u546d\u546e\u546f\u5470\u5471\u5472\u5473\u5474\u5475\u5476\u5477\u5478\u5479\u547a\u547b\u547c\u547d\u547e\u547f\u5480\u5481\u5482\u5483\u5484\u5485\u5486\u5487\u5488\u5489\u548a\u548b\u548c\u548d\u548e\u548f\u5490\u5491\u5492\u5493\u5494\u5495\u5496\u5497\u5498\u5499\u549a\u549b\u549c\u549d\u549e\u549f\u54a0\u54a1\u54a2\u54a3\u54a4\u54a5\u54a6\u54a7\u54a8\u54a9\u54aa\u54ab\u54ac\u54ad\u54ae\u54af\u54b0\u54b1\u54b2\u54b3\u54b4\u54b5\u54b6\u54b7\u54b8\u54b9\u54ba\u54bb\u54bc\u54bd\u54be\u54bf\u54c0\u54c1\u54c2\u54c3\u54c4\u54c5\u54c6\u54c7\u54c8\u54c9\u54ca\u54cb\u54cc\u54cd\u54ce\u54cf\u54d0\u54d1\u54d2\u54d3\u54d4\u54d5\u54d6\u54d7\u54d8\u54d9\u54da\u54db\u54dc\u54dd\u54de\u54df\u54e0\u54e1\u54e2\u54e3\u54e4\u54e5\u54e6\u54e7\u54e8\u54e9\u54ea\u54eb\u54ec\u54ed\u54ee\u54ef\u54f0\u54f1\u54f2\u54f3\u54f4\u54f5\u54f6\u54f7\u54f8\u54f9\u54fa\u54fb\u54fc\u54fd\u54fe\u54ff\u5500\u5501\u5502\u5503\u5504\u5505\u5506\u5507\u5508\u5509\u550a\u550b\u550c\u550d\u550e\u550f\u5510\u5511\u5512\u5513\u5514\u5515\u5516\u5517\u5518\u5519\u551a\u551b\u551c\u551d\u551e\u551f\u5520\u5521\u5522\u5523\u5524\u5525\u5526\u5527\u5528\u5529\u552a\u552b\u552c\u552d\u552e\u552f\u5530\u5531\u5532\u5533\u5534\u5535\u5536\u5537\u5538\u5539\u553a\u553b\u553c\u553d\u553e\u553f\u5540\u5541\u5542\u5543\u5544\u5545\u5546\u5547\u5548\u5549\u554a\u554b\u554c\u554d\u554e\u554f\u5550\u5551\u5552\u5553\u5554\u5555\u5556\u5557\u5558\u5559\u555a\u555b\u555c\u555d\u555e\u555f\u5560\u5561\u5562\u5563\u5564\u5565\u5566\u5567\u5568\u5569\u556a\u556b\u556c\u556d\u556e\u556f\u5570\u5571\u5572\u5573\u5574\u5575\u5576\u5577\u5578\u5579\u557a\u557b\u557c\u557d\u557e\u557f\u5580\u5581\u5582\u5583\u5584\u5585\u5586\u5587\u5588\u5589\u558a\u558b\u558c\u558d\u558e\u558f\u5590\u5591\u5592\u5593\u5594\u5595\u5596\u5597\u5598\u5599\u559a\u559b\u559c\u559d\u559e\u559f\u55a0\u55a1\u55a2\u55a3\u55a4\u55a5\u55a6\u55a7\u55a8\u55a9\u55aa\u55ab\u55ac\u55ad\u55ae\u55af\u55b0\u55b1\u55b2\u55b3\u55b4\u55b5\u55b6\u55b7\u55b8\u55b9\u55ba\u55bb\u55bc\u55bd\u55be\u55bf\u55c0\u55c1\u55c2\u55c3\u55c4\u55c5\u55c6\u55c7\u55c8\u55c9\u55ca\u55cb\u55cc\u55cd\u55ce\u55cf\u55d0\u55d1\u55d2\u55d3\u55d4\u55d5\u55d6\u55d7\u55d8\u55d9\u55da\u55db\u55dc\u55dd\u55de\u55df\u55e0\u55e1\u55e2\u55e3\u55e4\u55e5\u55e6\u55e7\u55e8\u55e9\u55ea\u55eb\u55ec\u55ed\u55ee\u55ef\u55f0\u55f1\u55f2\u55f3\u55f4\u55f5\u55f6\u55f7\u55f8\u55f9\u55fa\u55fb\u55fc\u55fd\u55fe\u55ff\u5600\u5601\u5602\u5603\u5604\u5605\u5606\u5607\u5608\u5609\u560a\u560b\u560c\u560d\u560e\u560f\u5610\u5611\u5612\u5613\u5614\u5615\u5616\u5617\u5618\u5619\u561a\u561b\u561c\u561d\u561e\u561f\u5620\u5621\u5622\u5623\u5624\u5625\u5626\u5627\u5628\u5629\u562a\u562b\u562c\u562d\u562e\u562f\u5630\u5631\u5632\u5633\u5634\u5635\u5636\u5637\u5638\u5639\u563a\u563b\u563c\u563d\u563e\u563f\u5640\u5641\u5642\u5643\u5644\u5645\u5646\u5647\u5648\u5649\u564a\u564b\u564c\u564d\u564e\u564f\u5650\u5651\u5652\u5653\u5654\u5655\u5656\u5657\u5658\u5659\u565a\u565b\u565c\u565d\u565e\u565f\u5660\u5661\u5662\u5663\u5664\u5665\u5666\u5667\u5668\u5669\u566a\u566b\u566c\u566d\u566e\u566f\u5670\u5671\u5672\u5673\u5674\u5675\u5676\u5677\u5678\u5679\u567a\u567b\u567c\u567d\u567e\u567f\u5680\u5681\u5682\u5683\u5684\u5685\u5686\u5687\u5688\u5689\u568a\u568b\u568c\u568d\u568e\u568f\u5690\u5691\u5692\u5693\u5694\u5695\u5696\u5697\u5698\u5699\u569a\u569b\u569c\u569d\u569e\u569f\u56a0\u56a1\u56a2\u56a3\u56a4\u56a5\u56a6\u56a7\u56a8\u56a9\u56aa\u56ab\u56ac\u56ad\u56ae\u56af\u56b0\u56b1\u56b2\u56b3\u56b4\u56b5\u56b6\u56b7\u56b8\u56b9\u56ba\u56bb\u56bc\u56bd\u56be\u56bf\u56c0\u56c1\u56c2\u56c3\u56c4\u56c5\u56c6\u56c7\u56c8\u56c9\u56ca\u56cb\u56cc\u56cd\u56ce\u56cf\u56d0\u56d1\u56d2\u56d3\u56d4\u56d5\u56d6\u56d7\u56d8\u56d9\u56da\u56db\u56dc\u56dd\u56de\u56df\u56e0\u56e1\u56e2\u56e3\u56e4\u56e5\u56e6\u56e7\u56e8\u56e9\u56ea\u56eb\u56ec\u56ed\u56ee\u56ef\u56f0\u56f1\u56f2\u56f3\u56f4\u56f5\u56f6\u56f7\u56f8\u56f9\u56fa\u56fb\u56fc\u56fd\u56fe\u56ff\u5700\u5701\u5702\u5703\u5704\u5705\u5706\u5707\u5708\u5709\u570a\u570b\u570c\u570d\u570e\u570f\u5710\u5711\u5712\u5713\u5714\u5715\u5716\u5717\u5718\u5719\u571a\u571b\u571c\u571d\u571e\u571f\u5720\u5721\u5722\u5723\u5724\u5725\u5726\u5727\u5728\u5729\u572a\u572b\u572c\u572d\u572e\u572f\u5730\u5731\u5732\u5733\u5734\u5735\u5736\u5737\u5738\u5739\u573a\u573b\u573c\u573d\u573e\u573f\u5740\u5741\u5742\u5743\u5744\u5745\u5746\u5747\u5748\u5749\u574a\u574b\u574c\u574d\u574e\u574f\u5750\u5751\u5752\u5753\u5754\u5755\u5756\u5757\u5758\u5759\u575a\u575b\u575c\u575d\u575e\u575f\u5760\u5761\u5762\u5763\u5764\u5765\u5766\u5767\u5768\u5769\u576a\u576b\u576c\u576d\u576e\u576f\u5770\u5771\u5772\u5773\u5774\u5775\u5776\u5777\u5778\u5779\u577a\u577b\u577c\u577d\u577e\u577f\u5780\u5781\u5782\u5783\u5784\u5785\u5786\u5787\u5788\u5789\u578a\u578b\u578c\u578d\u578e\u578f\u5790\u5791\u5792\u5793\u5794\u5795\u5796\u5797\u5798\u5799\u579a\u579b\u579c\u579d\u579e\u579f\u57a0\u57a1\u57a2\u57a3\u57a4\u57a5\u57a6\u57a7\u57a8\u57a9\u57aa\u57ab\u57ac\u57ad\u57ae\u57af\u57b0\u57b1\u57b2\u57b3\u57b4\u57b5\u57b6\u57b7\u57b8\u57b9\u57ba\u57bb\u57bc\u57bd\u57be\u57bf\u57c0\u57c1\u57c2\u57c3\u57c4\u57c5\u57c6\u57c7\u57c8\u57c9\u57ca\u57cb\u57cc\u57cd\u57ce\u57cf\u57d0\u57d1\u57d2\u57d3\u57d4\u57d5\u57d6\u57d7\u57d8\u57d9\u57da\u57db\u57dc\u57dd\u57de\u57df\u57e0\u57e1\u57e2\u57e3\u57e4\u57e5\u57e6\u57e7\u57e8\u57e9\u57ea\u57eb\u57ec\u57ed\u57ee\u57ef\u57f0\u57f1\u57f2\u57f3\u57f4\u57f5\u57f6\u57f7\u57f8\u57f9\u57fa\u57fb\u57fc\u57fd\u57fe\u57ff\u5800\u5801\u5802\u5803\u5804\u5805\u5806\u5807\u5808\u5809\u580a\u580b\u580c\u580d\u580e\u580f\u5810\u5811\u5812\u5813\u5814\u5815\u5816\u5817\u5818\u5819\u581a\u581b\u581c\u581d\u581e\u581f\u5820\u5821\u5822\u5823\u5824\u5825\u5826\u5827\u5828\u5829\u582a\u582b\u582c\u582d\u582e\u582f\u5830\u5831\u5832\u5833\u5834\u5835\u5836\u5837\u5838\u5839\u583a\u583b\u583c\u583d\u583e\u583f\u5840\u5841\u5842\u5843\u5844\u5845\u5846\u5847\u5848\u5849\u584a\u584b\u584c\u584d\u584e\u584f\u5850\u5851\u5852\u5853\u5854\u5855\u5856\u5857\u5858\u5859\u585a\u585b\u585c\u585d\u585e\u585f\u5860\u5861\u5862\u5863\u5864\u5865\u5866\u5867\u5868\u5869\u586a\u586b\u586c\u586d\u586e\u586f\u5870\u5871\u5872\u5873\u5874\u5875\u5876\u5877\u5878\u5879\u587a\u587b\u587c\u587d\u587e\u587f\u5880\u5881\u5882\u5883\u5884\u5885\u5886\u5887\u5888\u5889\u588a\u588b\u588c\u588d\u588e\u588f\u5890\u5891\u5892\u5893\u5894\u5895\u5896\u5897\u5898\u5899\u589a\u589b\u589c\u589d\u589e\u589f\u58a0\u58a1\u58a2\u58a3\u58a4\u58a5\u58a6\u58a7\u58a8\u58a9\u58aa\u58ab\u58ac\u58ad\u58ae\u58af\u58b0\u58b1\u58b2\u58b3\u58b4\u58b5\u58b6\u58b7\u58b8\u58b9\u58ba\u58bb\u58bc\u58bd\u58be\u58bf\u58c0\u58c1\u58c2\u58c3\u58c4\u58c5\u58c6\u58c7\u58c8\u58c9\u58ca\u58cb\u58cc\u58cd\u58ce\u58cf\u58d0\u58d1\u58d2\u58d3\u58d4\u58d5\u58d6\u58d7\u58d8\u58d9\u58da\u58db\u58dc\u58dd\u58de\u58df\u58e0\u58e1\u58e2\u58e3\u58e4\u58e5\u58e6\u58e7\u58e8\u58e9\u58ea\u58eb\u58ec\u58ed\u58ee\u58ef\u58f0\u58f1\u58f2\u58f3\u58f4\u58f5\u58f6\u58f7\u58f8\u58f9\u58fa\u58fb\u58fc\u58fd\u58fe\u58ff\u5900\u5901\u5902\u5903\u5904\u5905\u5906\u5907\u5908\u5909\u590a\u590b\u590c\u590d\u590e\u590f\u5910\u5911\u5912\u5913\u5914\u5915\u5916\u5917\u5918\u5919\u591a\u591b\u591c\u591d\u591e\u591f\u5920\u5921\u5922\u5923\u5924\u5925\u5926\u5927\u5928\u5929\u592a\u592b\u592c\u592d\u592e\u592f\u5930\u5931\u5932\u5933\u5934\u5935\u5936\u5937\u5938\u5939\u593a\u593b\u593c\u593d\u593e\u593f\u5940\u5941\u5942\u5943\u5944\u5945\u5946\u5947\u5948\u5949\u594a\u594b\u594c\u594d\u594e\u594f\u5950\u5951\u5952\u5953\u5954\u5955\u5956\u5957\u5958\u5959\u595a\u595b\u595c\u595d\u595e\u595f\u5960\u5961\u5962\u5963\u5964\u5965\u5966\u5967\u5968\u5969\u596a\u596b\u596c\u596d\u596e\u596f\u5970\u5971\u5972\u5973\u5974\u5975\u5976\u5977\u5978\u5979\u597a\u597b\u597c\u597d\u597e\u597f\u5980\u5981\u5982\u5983\u5984\u5985\u5986\u5987\u5988\u5989\u598a\u598b\u598c\u598d\u598e\u598f\u5990\u5991\u5992\u5993\u5994\u5995\u5996\u5997\u5998\u5999\u599a\u599b\u599c\u599d\u599e\u599f\u59a0\u59a1\u59a2\u59a3\u59a4\u59a5\u59a6\u59a7\u59a8\u59a9\u59aa\u59ab\u59ac\u59ad\u59ae\u59af\u59b0\u59b1\u59b2\u59b3\u59b4\u59b5\u59b6\u59b7\u59b8\u59b9\u59ba\u59bb\u59bc\u59bd\u59be\u59bf\u59c0\u59c1\u59c2\u59c3\u59c4\u59c5\u59c6\u59c7\u59c8\u59c9\u59ca\u59cb\u59cc\u59cd\u59ce\u59cf\u59d0\u59d1\u59d2\u59d3\u59d4\u59d5\u59d6\u59d7\u59d8\u59d9\u59da\u59db\u59dc\u59dd\u59de\u59df\u59e0\u59e1\u59e2\u59e3\u59e4\u59e5\u59e6\u59e7\u59e8\u59e9\u59ea\u59eb\u59ec\u59ed\u59ee\u59ef\u59f0\u59f1\u59f2\u59f3\u59f4\u59f5\u59f6\u59f7\u59f8\u59f9\u59fa\u59fb\u59fc\u59fd\u59fe\u59ff\u5a00\u5a01\u5a02\u5a03\u5a04\u5a05\u5a06\u5a07\u5a08\u5a09\u5a0a\u5a0b\u5a0c\u5a0d\u5a0e\u5a0f\u5a10\u5a11\u5a12\u5a13\u5a14\u5a15\u5a16\u5a17\u5a18\u5a19\u5a1a\u5a1b\u5a1c\u5a1d\u5a1e\u5a1f\u5a20\u5a21\u5a22\u5a23\u5a24\u5a25\u5a26\u5a27\u5a28\u5a29\u5a2a\u5a2b\u5a2c\u5a2d\u5a2e\u5a2f\u5a30\u5a31\u5a32\u5a33\u5a34\u5a35\u5a36\u5a37\u5a38\u5a39\u5a3a\u5a3b\u5a3c\u5a3d\u5a3e\u5a3f\u5a40\u5a41\u5a42\u5a43\u5a44\u5a45\u5a46\u5a47\u5a48\u5a49\u5a4a\u5a4b\u5a4c\u5a4d\u5a4e\u5a4f\u5a50\u5a51\u5a52\u5a53\u5a54\u5a55\u5a56\u5a57\u5a58\u5a59\u5a5a\u5a5b\u5a5c\u5a5d\u5a5e\u5a5f\u5a60\u5a61\u5a62\u5a63\u5a64\u5a65\u5a66\u5a67\u5a68\u5a69\u5a6a\u5a6b\u5a6c\u5a6d\u5a6e\u5a6f\u5a70\u5a71\u5a72\u5a73\u5a74\u5a75\u5a76\u5a77\u5a78\u5a79\u5a7a\u5a7b\u5a7c\u5a7d\u5a7e\u5a7f\u5a80\u5a81\u5a82\u5a83\u5a84\u5a85\u5a86\u5a87\u5a88\u5a89\u5a8a\u5a8b\u5a8c\u5a8d\u5a8e\u5a8f\u5a90\u5a91\u5a92\u5a93\u5a94\u5a95\u5a96\u5a97\u5a98\u5a99\u5a9a\u5a9b\u5a9c\u5a9d\u5a9e\u5a9f\u5aa0\u5aa1\u5aa2\u5aa3\u5aa4\u5aa5\u5aa6\u5aa7\u5aa8\u5aa9\u5aaa\u5aab\u5aac\u5aad\u5aae\u5aaf\u5ab0\u5ab1\u5ab2\u5ab3\u5ab4\u5ab5\u5ab6\u5ab7\u5ab8\u5ab9\u5aba\u5abb\u5abc\u5abd\u5abe\u5abf\u5ac0\u5ac1\u5ac2\u5ac3\u5ac4\u5ac5\u5ac6\u5ac7\u5ac8\u5ac9\u5aca\u5acb\u5acc\u5acd\u5ace\u5acf\u5ad0\u5ad1\u5ad2\u5ad3\u5ad4\u5ad5\u5ad6\u5ad7\u5ad8\u5ad9\u5ada\u5adb\u5adc\u5add\u5ade\u5adf\u5ae0\u5ae1\u5ae2\u5ae3\u5ae4\u5ae5\u5ae6\u5ae7\u5ae8\u5ae9\u5aea\u5aeb\u5aec\u5aed\u5aee\u5aef\u5af0\u5af1\u5af2\u5af3\u5af4\u5af5\u5af6\u5af7\u5af8\u5af9\u5afa\u5afb\u5afc\u5afd\u5afe\u5aff\u5b00\u5b01\u5b02\u5b03\u5b04\u5b05\u5b06\u5b07\u5b08\u5b09\u5b0a\u5b0b\u5b0c\u5b0d\u5b0e\u5b0f\u5b10\u5b11\u5b12\u5b13\u5b14\u5b15\u5b16\u5b17\u5b18\u5b19\u5b1a\u5b1b\u5b1c\u5b1d\u5b1e\u5b1f\u5b20\u5b21\u5b22\u5b23\u5b24\u5b25\u5b26\u5b27\u5b28\u5b29\u5b2a\u5b2b\u5b2c\u5b2d\u5b2e\u5b2f\u5b30\u5b31\u5b32\u5b33\u5b34\u5b35\u5b36\u5b37\u5b38\u5b39\u5b3a\u5b3b\u5b3c\u5b3d\u5b3e\u5b3f\u5b40\u5b41\u5b42\u5b43\u5b44\u5b45\u5b46\u5b47\u5b48\u5b49\u5b4a\u5b4b\u5b4c\u5b4d\u5b4e\u5b4f\u5b50\u5b51\u5b52\u5b53\u5b54\u5b55\u5b56\u5b57\u5b58\u5b59\u5b5a\u5b5b\u5b5c\u5b5d\u5b5e\u5b5f\u5b60\u5b61\u5b62\u5b63\u5b64\u5b65\u5b66\u5b67\u5b68\u5b69\u5b6a\u5b6b\u5b6c\u5b6d\u5b6e\u5b6f\u5b70\u5b71\u5b72\u5b73\u5b74\u5b75\u5b76\u5b77\u5b78\u5b79\u5b7a\u5b7b\u5b7c\u5b7d\u5b7e\u5b7f\u5b80\u5b81\u5b82\u5b83\u5b84\u5b85\u5b86\u5b87\u5b88\u5b89\u5b8a\u5b8b\u5b8c\u5b8d\u5b8e\u5b8f\u5b90\u5b91\u5b92\u5b93\u5b94\u5b95\u5b96\u5b97\u5b98\u5b99\u5b9a\u5b9b\u5b9c\u5b9d\u5b9e\u5b9f\u5ba0\u5ba1\u5ba2\u5ba3\u5ba4\u5ba5\u5ba6\u5ba7\u5ba8\u5ba9\u5baa\u5bab\u5bac\u5bad\u5bae\u5baf\u5bb0\u5bb1\u5bb2\u5bb3\u5bb4\u5bb5\u5bb6\u5bb7\u5bb8\u5bb9\u5bba\u5bbb\u5bbc\u5bbd\u5bbe\u5bbf\u5bc0\u5bc1\u5bc2\u5bc3\u5bc4\u5bc5\u5bc6\u5bc7\u5bc8\u5bc9\u5bca\u5bcb\u5bcc\u5bcd\u5bce\u5bcf\u5bd0\u5bd1\u5bd2\u5bd3\u5bd4\u5bd5\u5bd6\u5bd7\u5bd8\u5bd9\u5bda\u5bdb\u5bdc\u5bdd\u5bde\u5bdf\u5be0\u5be1\u5be2\u5be3\u5be4\u5be5\u5be6\u5be7\u5be8\u5be9\u5bea\u5beb\u5bec\u5bed\u5bee\u5bef\u5bf0\u5bf1\u5bf2\u5bf3\u5bf4\u5bf5\u5bf6\u5bf7\u5bf8\u5bf9\u5bfa\u5bfb\u5bfc\u5bfd\u5bfe\u5bff\u5c00\u5c01\u5c02\u5c03\u5c04\u5c05\u5c06\u5c07\u5c08\u5c09\u5c0a\u5c0b\u5c0c\u5c0d\u5c0e\u5c0f\u5c10\u5c11\u5c12\u5c13\u5c14\u5c15\u5c16\u5c17\u5c18\u5c19\u5c1a\u5c1b\u5c1c\u5c1d\u5c1e\u5c1f\u5c20\u5c21\u5c22\u5c23\u5c24\u5c25\u5c26\u5c27\u5c28\u5c29\u5c2a\u5c2b\u5c2c\u5c2d\u5c2e\u5c2f\u5c30\u5c31\u5c32\u5c33\u5c34\u5c35\u5c36\u5c37\u5c38\u5c39\u5c3a\u5c3b\u5c3c\u5c3d\u5c3e\u5c3f\u5c40\u5c41\u5c42\u5c43\u5c44\u5c45\u5c46\u5c47\u5c48\u5c49\u5c4a\u5c4b\u5c4c\u5c4d\u5c4e\u5c4f\u5c50\u5c51\u5c52\u5c53\u5c54\u5c55\u5c56\u5c57\u5c58\u5c59\u5c5a\u5c5b\u5c5c\u5c5d\u5c5e\u5c5f\u5c60\u5c61\u5c62\u5c63\u5c64\u5c65\u5c66\u5c67\u5c68\u5c69\u5c6a\u5c6b\u5c6c\u5c6d\u5c6e\u5c6f\u5c70\u5c71\u5c72\u5c73\u5c74\u5c75\u5c76\u5c77\u5c78\u5c79\u5c7a\u5c7b\u5c7c\u5c7d\u5c7e\u5c7f\u5c80\u5c81\u5c82\u5c83\u5c84\u5c85\u5c86\u5c87\u5c88\u5c89\u5c8a\u5c8b\u5c8c\u5c8d\u5c8e\u5c8f\u5c90\u5c91\u5c92\u5c93\u5c94\u5c95\u5c96\u5c97\u5c98\u5c99\u5c9a\u5c9b\u5c9c\u5c9d\u5c9e\u5c9f\u5ca0\u5ca1\u5ca2\u5ca3\u5ca4\u5ca5\u5ca6\u5ca7\u5ca8\u5ca9\u5caa\u5cab\u5cac\u5cad\u5cae\u5caf\u5cb0\u5cb1\u5cb2\u5cb3\u5cb4\u5cb5\u5cb6\u5cb7\u5cb8\u5cb9\u5cba\u5cbb\u5cbc\u5cbd\u5cbe\u5cbf\u5cc0\u5cc1\u5cc2\u5cc3\u5cc4\u5cc5\u5cc6\u5cc7\u5cc8\u5cc9\u5cca\u5ccb\u5ccc\u5ccd\u5cce\u5ccf\u5cd0\u5cd1\u5cd2\u5cd3\u5cd4\u5cd5\u5cd6\u5cd7\u5cd8\u5cd9\u5cda\u5cdb\u5cdc\u5cdd\u5cde\u5cdf\u5ce0\u5ce1\u5ce2\u5ce3\u5ce4\u5ce5\u5ce6\u5ce7\u5ce8\u5ce9\u5cea\u5ceb\u5cec\u5ced\u5cee\u5cef\u5cf0\u5cf1\u5cf2\u5cf3\u5cf4\u5cf5\u5cf6\u5cf7\u5cf8\u5cf9\u5cfa\u5cfb\u5cfc\u5cfd\u5cfe\u5cff\u5d00\u5d01\u5d02\u5d03\u5d04\u5d05\u5d06\u5d07\u5d08\u5d09\u5d0a\u5d0b\u5d0c\u5d0d\u5d0e\u5d0f\u5d10\u5d11\u5d12\u5d13\u5d14\u5d15\u5d16\u5d17\u5d18\u5d19\u5d1a\u5d1b\u5d1c\u5d1d\u5d1e\u5d1f\u5d20\u5d21\u5d22\u5d23\u5d24\u5d25\u5d26\u5d27\u5d28\u5d29\u5d2a\u5d2b\u5d2c\u5d2d\u5d2e\u5d2f\u5d30\u5d31\u5d32\u5d33\u5d34\u5d35\u5d36\u5d37\u5d38\u5d39\u5d3a\u5d3b\u5d3c\u5d3d\u5d3e\u5d3f\u5d40\u5d41\u5d42\u5d43\u5d44\u5d45\u5d46\u5d47\u5d48\u5d49\u5d4a\u5d4b\u5d4c\u5d4d\u5d4e\u5d4f\u5d50\u5d51\u5d52\u5d53\u5d54\u5d55\u5d56\u5d57\u5d58\u5d59\u5d5a\u5d5b\u5d5c\u5d5d\u5d5e\u5d5f\u5d60\u5d61\u5d62\u5d63\u5d64\u5d65\u5d66\u5d67\u5d68\u5d69\u5d6a\u5d6b\u5d6c\u5d6d\u5d6e\u5d6f\u5d70\u5d71\u5d72\u5d73\u5d74\u5d75\u5d76\u5d77\u5d78\u5d79\u5d7a\u5d7b\u5d7c\u5d7d\u5d7e\u5d7f\u5d80\u5d81\u5d82\u5d83\u5d84\u5d85\u5d86\u5d87\u5d88\u5d89\u5d8a\u5d8b\u5d8c\u5d8d\u5d8e\u5d8f\u5d90\u5d91\u5d92\u5d93\u5d94\u5d95\u5d96\u5d97\u5d98\u5d99\u5d9a\u5d9b\u5d9c\u5d9d\u5d9e\u5d9f\u5da0\u5da1\u5da2\u5da3\u5da4\u5da5\u5da6\u5da7\u5da8\u5da9\u5daa\u5dab\u5dac\u5dad\u5dae\u5daf\u5db0\u5db1\u5db2\u5db3\u5db4\u5db5\u5db6\u5db7\u5db8\u5db9\u5dba\u5dbb\u5dbc\u5dbd\u5dbe\u5dbf\u5dc0\u5dc1\u5dc2\u5dc3\u5dc4\u5dc5\u5dc6\u5dc7\u5dc8\u5dc9\u5dca\u5dcb\u5dcc\u5dcd\u5dce\u5dcf\u5dd0\u5dd1\u5dd2\u5dd3\u5dd4\u5dd5\u5dd6\u5dd7\u5dd8\u5dd9\u5dda\u5ddb\u5ddc\u5ddd\u5dde\u5ddf\u5de0\u5de1\u5de2\u5de3\u5de4\u5de5\u5de6\u5de7\u5de8\u5de9\u5dea\u5deb\u5dec\u5ded\u5dee\u5def\u5df0\u5df1\u5df2\u5df3\u5df4\u5df5\u5df6\u5df7\u5df8\u5df9\u5dfa\u5dfb\u5dfc\u5dfd\u5dfe\u5dff\u5e00\u5e01\u5e02\u5e03\u5e04\u5e05\u5e06\u5e07\u5e08\u5e09\u5e0a\u5e0b\u5e0c\u5e0d\u5e0e\u5e0f\u5e10\u5e11\u5e12\u5e13\u5e14\u5e15\u5e16\u5e17\u5e18\u5e19\u5e1a\u5e1b\u5e1c\u5e1d\u5e1e\u5e1f\u5e20\u5e21\u5e22\u5e23\u5e24\u5e25\u5e26\u5e27\u5e28\u5e29\u5e2a\u5e2b\u5e2c\u5e2d\u5e2e\u5e2f\u5e30\u5e31\u5e32\u5e33\u5e34\u5e35\u5e36\u5e37\u5e38\u5e39\u5e3a\u5e3b\u5e3c\u5e3d\u5e3e\u5e3f\u5e40\u5e41\u5e42\u5e43\u5e44\u5e45\u5e46\u5e47\u5e48\u5e49\u5e4a\u5e4b\u5e4c\u5e4d\u5e4e\u5e4f\u5e50\u5e51\u5e52\u5e53\u5e54\u5e55\u5e56\u5e57\u5e58\u5e59\u5e5a\u5e5b\u5e5c\u5e5d\u5e5e\u5e5f\u5e60\u5e61\u5e62\u5e63\u5e64\u5e65\u5e66\u5e67\u5e68\u5e69\u5e6a\u5e6b\u5e6c\u5e6d\u5e6e\u5e6f\u5e70\u5e71\u5e72\u5e73\u5e74\u5e75\u5e76\u5e77\u5e78\u5e79\u5e7a\u5e7b\u5e7c\u5e7d\u5e7e\u5e7f\u5e80\u5e81\u5e82\u5e83\u5e84\u5e85\u5e86\u5e87\u5e88\u5e89\u5e8a\u5e8b\u5e8c\u5e8d\u5e8e\u5e8f\u5e90\u5e91\u5e92\u5e93\u5e94\u5e95\u5e96\u5e97\u5e98\u5e99\u5e9a\u5e9b\u5e9c\u5e9d\u5e9e\u5e9f\u5ea0\u5ea1\u5ea2\u5ea3\u5ea4\u5ea5\u5ea6\u5ea7\u5ea8\u5ea9\u5eaa\u5eab\u5eac\u5ead\u5eae\u5eaf\u5eb0\u5eb1\u5eb2\u5eb3\u5eb4\u5eb5\u5eb6\u5eb7\u5eb8\u5eb9\u5eba\u5ebb\u5ebc\u5ebd\u5ebe\u5ebf\u5ec0\u5ec1\u5ec2\u5ec3\u5ec4\u5ec5\u5ec6\u5ec7\u5ec8\u5ec9\u5eca\u5ecb\u5ecc\u5ecd\u5ece\u5ecf\u5ed0\u5ed1\u5ed2\u5ed3\u5ed4\u5ed5\u5ed6\u5ed7\u5ed8\u5ed9\u5eda\u5edb\u5edc\u5edd\u5ede\u5edf\u5ee0\u5ee1\u5ee2\u5ee3\u5ee4\u5ee5\u5ee6\u5ee7\u5ee8\u5ee9\u5eea\u5eeb\u5eec\u5eed\u5eee\u5eef\u5ef0\u5ef1\u5ef2\u5ef3\u5ef4\u5ef5\u5ef6\u5ef7\u5ef8\u5ef9\u5efa\u5efb\u5efc\u5efd\u5efe\u5eff\u5f00\u5f01\u5f02\u5f03\u5f04\u5f05\u5f06\u5f07\u5f08\u5f09\u5f0a\u5f0b\u5f0c\u5f0d\u5f0e\u5f0f\u5f10\u5f11\u5f12\u5f13\u5f14\u5f15\u5f16\u5f17\u5f18\u5f19\u5f1a\u5f1b\u5f1c\u5f1d\u5f1e\u5f1f\u5f20\u5f21\u5f22\u5f23\u5f24\u5f25\u5f26\u5f27\u5f28\u5f29\u5f2a\u5f2b\u5f2c\u5f2d\u5f2e\u5f2f\u5f30\u5f31\u5f32\u5f33\u5f34\u5f35\u5f36\u5f37\u5f38\u5f39\u5f3a\u5f3b\u5f3c\u5f3d\u5f3e\u5f3f\u5f40\u5f41\u5f42\u5f43\u5f44\u5f45\u5f46\u5f47\u5f48\u5f49\u5f4a\u5f4b\u5f4c\u5f4d\u5f4e\u5f4f\u5f50\u5f51\u5f52\u5f53\u5f54\u5f55\u5f56\u5f57\u5f58\u5f59\u5f5a\u5f5b\u5f5c\u5f5d\u5f5e\u5f5f\u5f60\u5f61\u5f62\u5f63\u5f64\u5f65\u5f66\u5f67\u5f68\u5f69\u5f6a\u5f6b\u5f6c\u5f6d\u5f6e\u5f6f\u5f70\u5f71\u5f72\u5f73\u5f74\u5f75\u5f76\u5f77\u5f78\u5f79\u5f7a\u5f7b\u5f7c\u5f7d\u5f7e\u5f7f\u5f80\u5f81\u5f82\u5f83\u5f84\u5f85\u5f86\u5f87\u5f88\u5f89\u5f8a\u5f8b\u5f8c\u5f8d\u5f8e\u5f8f\u5f90\u5f91\u5f92\u5f93\u5f94\u5f95\u5f96\u5f97\u5f98\u5f99\u5f9a\u5f9b\u5f9c\u5f9d\u5f9e\u5f9f\u5fa0\u5fa1\u5fa2\u5fa3\u5fa4\u5fa5\u5fa6\u5fa7\u5fa8\u5fa9\u5faa\u5fab\u5fac\u5fad\u5fae\u5faf\u5fb0\u5fb1\u5fb2\u5fb3\u5fb4\u5fb5\u5fb6\u5fb7\u5fb8\u5fb9\u5fba\u5fbb\u5fbc\u5fbd\u5fbe\u5fbf\u5fc0\u5fc1\u5fc2\u5fc3\u5fc4\u5fc5\u5fc6\u5fc7\u5fc8\u5fc9\u5fca\u5fcb\u5fcc\u5fcd\u5fce\u5fcf\u5fd0\u5fd1\u5fd2\u5fd3\u5fd4\u5fd5\u5fd6\u5fd7\u5fd8\u5fd9\u5fda\u5fdb\u5fdc\u5fdd\u5fde\u5fdf\u5fe0\u5fe1\u5fe2\u5fe3\u5fe4\u5fe5\u5fe6\u5fe7\u5fe8\u5fe9\u5fea\u5feb\u5fec\u5fed\u5fee\u5fef\u5ff0\u5ff1\u5ff2\u5ff3\u5ff4\u5ff5\u5ff6\u5ff7\u5ff8\u5ff9\u5ffa\u5ffb\u5ffc\u5ffd\u5ffe\u5fff\u6000\u6001\u6002\u6003\u6004\u6005\u6006\u6007\u6008\u6009\u600a\u600b\u600c\u600d\u600e\u600f\u6010\u6011\u6012\u6013\u6014\u6015\u6016\u6017\u6018\u6019\u601a\u601b\u601c\u601d\u601e\u601f\u6020\u6021\u6022\u6023\u6024\u6025\u6026\u6027\u6028\u6029\u602a\u602b\u602c\u602d\u602e\u602f\u6030\u6031\u6032\u6033\u6034\u6035\u6036\u6037\u6038\u6039\u603a\u603b\u603c\u603d\u603e\u603f\u6040\u6041\u6042\u6043\u6044\u6045\u6046\u6047\u6048\u6049\u604a\u604b\u604c\u604d\u604e\u604f\u6050\u6051\u6052\u6053\u6054\u6055\u6056\u6057\u6058\u6059\u605a\u605b\u605c\u605d\u605e\u605f\u6060\u6061\u6062\u6063\u6064\u6065\u6066\u6067\u6068\u6069\u606a\u606b\u606c\u606d\u606e\u606f\u6070\u6071\u6072\u6073\u6074\u6075\u6076\u6077\u6078\u6079\u607a\u607b\u607c\u607d\u607e\u607f\u6080\u6081\u6082\u6083\u6084\u6085\u6086\u6087\u6088\u6089\u608a\u608b\u608c\u608d\u608e\u608f\u6090\u6091\u6092\u6093\u6094\u6095\u6096\u6097\u6098\u6099\u609a\u609b\u609c\u609d\u609e\u609f\u60a0\u60a1\u60a2\u60a3\u60a4\u60a5\u60a6\u60a7\u60a8\u60a9\u60aa\u60ab\u60ac\u60ad\u60ae\u60af\u60b0\u60b1\u60b2\u60b3\u60b4\u60b5\u60b6\u60b7\u60b8\u60b9\u60ba\u60bb\u60bc\u60bd\u60be\u60bf\u60c0\u60c1\u60c2\u60c3\u60c4\u60c5\u60c6\u60c7\u60c8\u60c9\u60ca\u60cb\u60cc\u60cd\u60ce\u60cf\u60d0\u60d1\u60d2\u60d3\u60d4\u60d5\u60d6\u60d7\u60d8\u60d9\u60da\u60db\u60dc\u60dd\u60de\u60df\u60e0\u60e1\u60e2\u60e3\u60e4\u60e5\u60e6\u60e7\u60e8\u60e9\u60ea\u60eb\u60ec\u60ed\u60ee\u60ef\u60f0\u60f1\u60f2\u60f3\u60f4\u60f5\u60f6\u60f7\u60f8\u60f9\u60fa\u60fb\u60fc\u60fd\u60fe\u60ff\u6100\u6101\u6102\u6103\u6104\u6105\u6106\u6107\u6108\u6109\u610a\u610b\u610c\u610d\u610e\u610f\u6110\u6111\u6112\u6113\u6114\u6115\u6116\u6117\u6118\u6119\u611a\u611b\u611c\u611d\u611e\u611f\u6120\u6121\u6122\u6123\u6124\u6125\u6126\u6127\u6128\u6129\u612a\u612b\u612c\u612d\u612e\u612f\u6130\u6131\u6132\u6133\u6134\u6135\u6136\u6137\u6138\u6139\u613a\u613b\u613c\u613d\u613e\u613f\u6140\u6141\u6142\u6143\u6144\u6145\u6146\u6147\u6148\u6149\u614a\u614b\u614c\u614d\u614e\u614f\u6150\u6151\u6152\u6153\u6154\u6155\u6156\u6157\u6158\u6159\u615a\u615b\u615c\u615d\u615e\u615f\u6160\u6161\u6162\u6163\u6164\u6165\u6166\u6167\u6168\u6169\u616a\u616b\u616c\u616d\u616e\u616f\u6170\u6171\u6172\u6173\u6174\u6175\u6176\u6177\u6178\u6179\u617a\u617b\u617c\u617d\u617e\u617f\u6180\u6181\u6182\u6183\u6184\u6185\u6186\u6187\u6188\u6189\u618a\u618b\u618c\u618d\u618e\u618f\u6190\u6191\u6192\u6193\u6194\u6195\u6196\u6197\u6198\u6199\u619a\u619b\u619c\u619d\u619e\u619f\u61a0\u61a1\u61a2\u61a3\u61a4\u61a5\u61a6\u61a7\u61a8\u61a9\u61aa\u61ab\u61ac\u61ad\u61ae\u61af\u61b0\u61b1\u61b2\u61b3\u61b4\u61b5\u61b6\u61b7\u61b8\u61b9\u61ba\u61bb\u61bc\u61bd\u61be\u61bf\u61c0\u61c1\u61c2\u61c3\u61c4\u61c5\u61c6\u61c7\u61c8\u61c9\u61ca\u61cb\u61cc\u61cd\u61ce\u61cf\u61d0\u61d1\u61d2\u61d3\u61d4\u61d5\u61d6\u61d7\u61d8\u61d9\u61da\u61db\u61dc\u61dd\u61de\u61df\u61e0\u61e1\u61e2\u61e3\u61e4\u61e5\u61e6\u61e7\u61e8\u61e9\u61ea\u61eb\u61ec\u61ed\u61ee\u61ef\u61f0\u61f1\u61f2\u61f3\u61f4\u61f5\u61f6\u61f7\u61f8\u61f9\u61fa\u61fb\u61fc\u61fd\u61fe\u61ff\u6200\u6201\u6202\u6203\u6204\u6205\u6206\u6207\u6208\u6209\u620a\u620b\u620c\u620d\u620e\u620f\u6210\u6211\u6212\u6213\u6214\u6215\u6216\u6217\u6218\u6219\u621a\u621b\u621c\u621d\u621e\u621f\u6220\u6221\u6222\u6223\u6224\u6225\u6226\u6227\u6228\u6229\u622a\u622b\u622c\u622d\u622e\u622f\u6230\u6231\u6232\u6233\u6234\u6235\u6236\u6237\u6238\u6239\u623a\u623b\u623c\u623d\u623e\u623f\u6240\u6241\u6242\u6243\u6244\u6245\u6246\u6247\u6248\u6249\u624a\u624b\u624c\u624d\u624e\u624f\u6250\u6251\u6252\u6253\u6254\u6255\u6256\u6257\u6258\u6259\u625a\u625b\u625c\u625d\u625e\u625f\u6260\u6261\u6262\u6263\u6264\u6265\u6266\u6267\u6268\u6269\u626a\u626b\u626c\u626d\u626e\u626f\u6270\u6271\u6272\u6273\u6274\u6275\u6276\u6277\u6278\u6279\u627a\u627b\u627c\u627d\u627e\u627f\u6280\u6281\u6282\u6283\u6284\u6285\u6286\u6287\u6288\u6289\u628a\u628b\u628c\u628d\u628e\u628f\u6290\u6291\u6292\u6293\u6294\u6295\u6296\u6297\u6298\u6299\u629a\u629b\u629c\u629d\u629e\u629f\u62a0\u62a1\u62a2\u62a3\u62a4\u62a5\u62a6\u62a7\u62a8\u62a9\u62aa\u62ab\u62ac\u62ad\u62ae\u62af\u62b0\u62b1\u62b2\u62b3\u62b4\u62b5\u62b6\u62b7\u62b8\u62b9\u62ba\u62bb\u62bc\u62bd\u62be\u62bf\u62c0\u62c1\u62c2\u62c3\u62c4\u62c5\u62c6\u62c7\u62c8\u62c9\u62ca\u62cb\u62cc\u62cd\u62ce\u62cf\u62d0\u62d1\u62d2\u62d3\u62d4\u62d5\u62d6\u62d7\u62d8\u62d9\u62da\u62db\u62dc\u62dd\u62de\u62df\u62e0\u62e1\u62e2\u62e3\u62e4\u62e5\u62e6\u62e7\u62e8\u62e9\u62ea\u62eb\u62ec\u62ed\u62ee\u62ef\u62f0\u62f1\u62f2\u62f3\u62f4\u62f5\u62f6\u62f7\u62f8\u62f9\u62fa\u62fb\u62fc\u62fd\u62fe\u62ff\u6300\u6301\u6302\u6303\u6304\u6305\u6306\u6307\u6308\u6309\u630a\u630b\u630c\u630d\u630e\u630f\u6310\u6311\u6312\u6313\u6314\u6315\u6316\u6317\u6318\u6319\u631a\u631b\u631c\u631d\u631e\u631f\u6320\u6321\u6322\u6323\u6324\u6325\u6326\u6327\u6328\u6329\u632a\u632b\u632c\u632d\u632e\u632f\u6330\u6331\u6332\u6333\u6334\u6335\u6336\u6337\u6338\u6339\u633a\u633b\u633c\u633d\u633e\u633f\u6340\u6341\u6342\u6343\u6344\u6345\u6346\u6347\u6348\u6349\u634a\u634b\u634c\u634d\u634e\u634f\u6350\u6351\u6352\u6353\u6354\u6355\u6356\u6357\u6358\u6359\u635a\u635b\u635c\u635d\u635e\u635f\u6360\u6361\u6362\u6363\u6364\u6365\u6366\u6367\u6368\u6369\u636a\u636b\u636c\u636d\u636e\u636f\u6370\u6371\u6372\u6373\u6374\u6375\u6376\u6377\u6378\u6379\u637a\u637b\u637c\u637d\u637e\u637f\u6380\u6381\u6382\u6383\u6384\u6385\u6386\u6387\u6388\u6389\u638a\u638b\u638c\u638d\u638e\u638f\u6390\u6391\u6392\u6393\u6394\u6395\u6396\u6397\u6398\u6399\u639a\u639b\u639c\u639d\u639e\u639f\u63a0\u63a1\u63a2\u63a3\u63a4\u63a5\u63a6\u63a7\u63a8\u63a9\u63aa\u63ab\u63ac\u63ad\u63ae\u63af\u63b0\u63b1\u63b2\u63b3\u63b4\u63b5\u63b6\u63b7\u63b8\u63b9\u63ba\u63bb\u63bc\u63bd\u63be\u63bf\u63c0\u63c1\u63c2\u63c3\u63c4\u63c5\u63c6\u63c7\u63c8\u63c9\u63ca\u63cb\u63cc\u63cd\u63ce\u63cf\u63d0\u63d1\u63d2\u63d3\u63d4\u63d5\u63d6\u63d7\u63d8\u63d9\u63da\u63db\u63dc\u63dd\u63de\u63df\u63e0\u63e1\u63e2\u63e3\u63e4\u63e5\u63e6\u63e7\u63e8\u63e9\u63ea\u63eb\u63ec\u63ed\u63ee\u63ef\u63f0\u63f1\u63f2\u63f3\u63f4\u63f5\u63f6\u63f7\u63f8\u63f9\u63fa\u63fb\u63fc\u63fd\u63fe\u63ff\u6400\u6401\u6402\u6403\u6404\u6405\u6406\u6407\u6408\u6409\u640a\u640b\u640c\u640d\u640e\u640f\u6410\u6411\u6412\u6413\u6414\u6415\u6416\u6417\u6418\u6419\u641a\u641b\u641c\u641d\u641e\u641f\u6420\u6421\u6422\u6423\u6424\u6425\u6426\u6427\u6428\u6429\u642a\u642b\u642c\u642d\u642e\u642f\u6430\u6431\u6432\u6433\u6434\u6435\u6436\u6437\u6438\u6439\u643a\u643b\u643c\u643d\u643e\u643f\u6440\u6441\u6442\u6443\u6444\u6445\u6446\u6447\u6448\u6449\u644a\u644b\u644c\u644d\u644e\u644f\u6450\u6451\u6452\u6453\u6454\u6455\u6456\u6457\u6458\u6459\u645a\u645b\u645c\u645d\u645e\u645f\u6460\u6461\u6462\u6463\u6464\u6465\u6466\u6467\u6468\u6469\u646a\u646b\u646c\u646d\u646e\u646f\u6470\u6471\u6472\u6473\u6474\u6475\u6476\u6477\u6478\u6479\u647a\u647b\u647c\u647d\u647e\u647f\u6480\u6481\u6482\u6483\u6484\u6485\u6486\u6487\u6488\u6489\u648a\u648b\u648c\u648d\u648e\u648f\u6490\u6491\u6492\u6493\u6494\u6495\u6496\u6497\u6498\u6499\u649a\u649b\u649c\u649d\u649e\u649f\u64a0\u64a1\u64a2\u64a3\u64a4\u64a5\u64a6\u64a7\u64a8\u64a9\u64aa\u64ab\u64ac\u64ad\u64ae\u64af\u64b0\u64b1\u64b2\u64b3\u64b4\u64b5\u64b6\u64b7\u64b8\u64b9\u64ba\u64bb\u64bc\u64bd\u64be\u64bf\u64c0\u64c1\u64c2\u64c3\u64c4\u64c5\u64c6\u64c7\u64c8\u64c9\u64ca\u64cb\u64cc\u64cd\u64ce\u64cf\u64d0\u64d1\u64d2\u64d3\u64d4\u64d5\u64d6\u64d7\u64d8\u64d9\u64da\u64db\u64dc\u64dd\u64de\u64df\u64e0\u64e1\u64e2\u64e3\u64e4\u64e5\u64e6\u64e7\u64e8\u64e9\u64ea\u64eb\u64ec\u64ed\u64ee\u64ef\u64f0\u64f1\u64f2\u64f3\u64f4\u64f5\u64f6\u64f7\u64f8\u64f9\u64fa\u64fb\u64fc\u64fd\u64fe\u64ff\u6500\u6501\u6502\u6503\u6504\u6505\u6506\u6507\u6508\u6509\u650a\u650b\u650c\u650d\u650e\u650f\u6510\u6511\u6512\u6513\u6514\u6515\u6516\u6517\u6518\u6519\u651a\u651b\u651c\u651d\u651e\u651f\u6520\u6521\u6522\u6523\u6524\u6525\u6526\u6527\u6528\u6529\u652a\u652b\u652c\u652d\u652e\u652f\u6530\u6531\u6532\u6533\u6534\u6535\u6536\u6537\u6538\u6539\u653a\u653b\u653c\u653d\u653e\u653f\u6540\u6541\u6542\u6543\u6544\u6545\u6546\u6547\u6548\u6549\u654a\u654b\u654c\u654d\u654e\u654f\u6550\u6551\u6552\u6553\u6554\u6555\u6556\u6557\u6558\u6559\u655a\u655b\u655c\u655d\u655e\u655f\u6560\u6561\u6562\u6563\u6564\u6565\u6566\u6567\u6568\u6569\u656a\u656b\u656c\u656d\u656e\u656f\u6570\u6571\u6572\u6573\u6574\u6575\u6576\u6577\u6578\u6579\u657a\u657b\u657c\u657d\u657e\u657f\u6580\u6581\u6582\u6583\u6584\u6585\u6586\u6587\u6588\u6589\u658a\u658b\u658c\u658d\u658e\u658f\u6590\u6591\u6592\u6593\u6594\u6595\u6596\u6597\u6598\u6599\u659a\u659b\u659c\u659d\u659e\u659f\u65a0\u65a1\u65a2\u65a3\u65a4\u65a5\u65a6\u65a7\u65a8\u65a9\u65aa\u65ab\u65ac\u65ad\u65ae\u65af\u65b0\u65b1\u65b2\u65b3\u65b4\u65b5\u65b6\u65b7\u65b8\u65b9\u65ba\u65bb\u65bc\u65bd\u65be\u65bf\u65c0\u65c1\u65c2\u65c3\u65c4\u65c5\u65c6\u65c7\u65c8\u65c9\u65ca\u65cb\u65cc\u65cd\u65ce\u65cf\u65d0\u65d1\u65d2\u65d3\u65d4\u65d5\u65d6\u65d7\u65d8\u65d9\u65da\u65db\u65dc\u65dd\u65de\u65df\u65e0\u65e1\u65e2\u65e3\u65e4\u65e5\u65e6\u65e7\u65e8\u65e9\u65ea\u65eb\u65ec\u65ed\u65ee\u65ef\u65f0\u65f1\u65f2\u65f3\u65f4\u65f5\u65f6\u65f7\u65f8\u65f9\u65fa\u65fb\u65fc\u65fd\u65fe\u65ff\u6600\u6601\u6602\u6603\u6604\u6605\u6606\u6607\u6608\u6609\u660a\u660b\u660c\u660d\u660e\u660f\u6610\u6611\u6612\u6613\u6614\u6615\u6616\u6617\u6618\u6619\u661a\u661b\u661c\u661d\u661e\u661f\u6620\u6621\u6622\u6623\u6624\u6625\u6626\u6627\u6628\u6629\u662a\u662b\u662c\u662d\u662e\u662f\u6630\u6631\u6632\u6633\u6634\u6635\u6636\u6637\u6638\u6639\u663a\u663b\u663c\u663d\u663e\u663f\u6640\u6641\u6642\u6643\u6644\u6645\u6646\u6647\u6648\u6649\u664a\u664b\u664c\u664d\u664e\u664f\u6650\u6651\u6652\u6653\u6654\u6655\u6656\u6657\u6658\u6659\u665a\u665b\u665c\u665d\u665e\u665f\u6660\u6661\u6662\u6663\u6664\u6665\u6666\u6667\u6668\u6669\u666a\u666b\u666c\u666d\u666e\u666f\u6670\u6671\u6672\u6673\u6674\u6675\u6676\u6677\u6678\u6679\u667a\u667b\u667c\u667d\u667e\u667f\u6680\u6681\u6682\u6683\u6684\u6685\u6686\u6687\u6688\u6689\u668a\u668b\u668c\u668d\u668e\u668f\u6690\u6691\u6692\u6693\u6694\u6695\u6696\u6697\u6698\u6699\u669a\u669b\u669c\u669d\u669e\u669f\u66a0\u66a1\u66a2\u66a3\u66a4\u66a5\u66a6\u66a7\u66a8\u66a9\u66aa\u66ab\u66ac\u66ad\u66ae\u66af\u66b0\u66b1\u66b2\u66b3\u66b4\u66b5\u66b6\u66b7\u66b8\u66b9\u66ba\u66bb\u66bc\u66bd\u66be\u66bf\u66c0\u66c1\u66c2\u66c3\u66c4\u66c5\u66c6\u66c7\u66c8\u66c9\u66ca\u66cb\u66cc\u66cd\u66ce\u66cf\u66d0\u66d1\u66d2\u66d3\u66d4\u66d5\u66d6\u66d7\u66d8\u66d9\u66da\u66db\u66dc\u66dd\u66de\u66df\u66e0\u66e1\u66e2\u66e3\u66e4\u66e5\u66e6\u66e7\u66e8\u66e9\u66ea\u66eb\u66ec\u66ed\u66ee\u66ef\u66f0\u66f1\u66f2\u66f3\u66f4\u66f5\u66f6\u66f7\u66f8\u66f9\u66fa\u66fb\u66fc\u66fd\u66fe\u66ff\u6700\u6701\u6702\u6703\u6704\u6705\u6706\u6707\u6708\u6709\u670a\u670b\u670c\u670d\u670e\u670f\u6710\u6711\u6712\u6713\u6714\u6715\u6716\u6717\u6718\u6719\u671a\u671b\u671c\u671d\u671e\u671f\u6720\u6721\u6722\u6723\u6724\u6725\u6726\u6727\u6728\u6729\u672a\u672b\u672c\u672d\u672e\u672f\u6730\u6731\u6732\u6733\u6734\u6735\u6736\u6737\u6738\u6739\u673a\u673b\u673c\u673d\u673e\u673f\u6740\u6741\u6742\u6743\u6744\u6745\u6746\u6747\u6748\u6749\u674a\u674b\u674c\u674d\u674e\u674f\u6750\u6751\u6752\u6753\u6754\u6755\u6756\u6757\u6758\u6759\u675a\u675b\u675c\u675d\u675e\u675f\u6760\u6761\u6762\u6763\u6764\u6765\u6766\u6767\u6768\u6769\u676a\u676b\u676c\u676d\u676e\u676f\u6770\u6771\u6772\u6773\u6774\u6775\u6776\u6777\u6778\u6779\u677a\u677b\u677c\u677d\u677e\u677f\u6780\u6781\u6782\u6783\u6784\u6785\u6786\u6787\u6788\u6789\u678a\u678b\u678c\u678d\u678e\u678f\u6790\u6791\u6792\u6793\u6794\u6795\u6796\u6797\u6798\u6799\u679a\u679b\u679c\u679d\u679e\u679f\u67a0\u67a1\u67a2\u67a3\u67a4\u67a5\u67a6\u67a7\u67a8\u67a9\u67aa\u67ab\u67ac\u67ad\u67ae\u67af\u67b0\u67b1\u67b2\u67b3\u67b4\u67b5\u67b6\u67b7\u67b8\u67b9\u67ba\u67bb\u67bc\u67bd\u67be\u67bf\u67c0\u67c1\u67c2\u67c3\u67c4\u67c5\u67c6\u67c7\u67c8\u67c9\u67ca\u67cb\u67cc\u67cd\u67ce\u67cf\u67d0\u67d1\u67d2\u67d3\u67d4\u67d5\u67d6\u67d7\u67d8\u67d9\u67da\u67db\u67dc\u67dd\u67de\u67df\u67e0\u67e1\u67e2\u67e3\u67e4\u67e5\u67e6\u67e7\u67e8\u67e9\u67ea\u67eb\u67ec\u67ed\u67ee\u67ef\u67f0\u67f1\u67f2\u67f3\u67f4\u67f5\u67f6\u67f7\u67f8\u67f9\u67fa\u67fb\u67fc\u67fd\u67fe\u67ff\u6800\u6801\u6802\u6803\u6804\u6805\u6806\u6807\u6808\u6809\u680a\u680b\u680c\u680d\u680e\u680f\u6810\u6811\u6812\u6813\u6814\u6815\u6816\u6817\u6818\u6819\u681a\u681b\u681c\u681d\u681e\u681f\u6820\u6821\u6822\u6823\u6824\u6825\u6826\u6827\u6828\u6829\u682a\u682b\u682c\u682d\u682e\u682f\u6830\u6831\u6832\u6833\u6834\u6835\u6836\u6837\u6838\u6839\u683a\u683b\u683c\u683d\u683e\u683f\u6840\u6841\u6842\u6843\u6844\u6845\u6846\u6847\u6848\u6849\u684a\u684b\u684c\u684d\u684e\u684f\u6850\u6851\u6852\u6853\u6854\u6855\u6856\u6857\u6858\u6859\u685a\u685b\u685c\u685d\u685e\u685f\u6860\u6861\u6862\u6863\u6864\u6865\u6866\u6867\u6868\u6869\u686a\u686b\u686c\u686d\u686e\u686f\u6870\u6871\u6872\u6873\u6874\u6875\u6876\u6877\u6878\u6879\u687a\u687b\u687c\u687d\u687e\u687f\u6880\u6881\u6882\u6883\u6884\u6885\u6886\u6887\u6888\u6889\u688a\u688b\u688c\u688d\u688e\u688f\u6890\u6891\u6892\u6893\u6894\u6895\u6896\u6897\u6898\u6899\u689a\u689b\u689c\u689d\u689e\u689f\u68a0\u68a1\u68a2\u68a3\u68a4\u68a5\u68a6\u68a7\u68a8\u68a9\u68aa\u68ab\u68ac\u68ad\u68ae\u68af\u68b0\u68b1\u68b2\u68b3\u68b4\u68b5\u68b6\u68b7\u68b8\u68b9\u68ba\u68bb\u68bc\u68bd\u68be\u68bf\u68c0\u68c1\u68c2\u68c3\u68c4\u68c5\u68c6\u68c7\u68c8\u68c9\u68ca\u68cb\u68cc\u68cd\u68ce\u68cf\u68d0\u68d1\u68d2\u68d3\u68d4\u68d5\u68d6\u68d7\u68d8\u68d9\u68da\u68db\u68dc\u68dd\u68de\u68df\u68e0\u68e1\u68e2\u68e3\u68e4\u68e5\u68e6\u68e7\u68e8\u68e9\u68ea\u68eb\u68ec\u68ed\u68ee\u68ef\u68f0\u68f1\u68f2\u68f3\u68f4\u68f5\u68f6\u68f7\u68f8\u68f9\u68fa\u68fb\u68fc\u68fd\u68fe\u68ff\u6900\u6901\u6902\u6903\u6904\u6905\u6906\u6907\u6908\u6909\u690a\u690b\u690c\u690d\u690e\u690f\u6910\u6911\u6912\u6913\u6914\u6915\u6916\u6917\u6918\u6919\u691a\u691b\u691c\u691d\u691e\u691f\u6920\u6921\u6922\u6923\u6924\u6925\u6926\u6927\u6928\u6929\u692a\u692b\u692c\u692d\u692e\u692f\u6930\u6931\u6932\u6933\u6934\u6935\u6936\u6937\u6938\u6939\u693a\u693b\u693c\u693d\u693e\u693f\u6940\u6941\u6942\u6943\u6944\u6945\u6946\u6947\u6948\u6949\u694a\u694b\u694c\u694d\u694e\u694f\u6950\u6951\u6952\u6953\u6954\u6955\u6956\u6957\u6958\u6959\u695a\u695b\u695c\u695d\u695e\u695f\u6960\u6961\u6962\u6963\u6964\u6965\u6966\u6967\u6968\u6969\u696a\u696b\u696c\u696d\u696e\u696f\u6970\u6971\u6972\u6973\u6974\u6975\u6976\u6977\u6978\u6979\u697a\u697b\u697c\u697d\u697e\u697f\u6980\u6981\u6982\u6983\u6984\u6985\u6986\u6987\u6988\u6989\u698a\u698b\u698c\u698d\u698e\u698f\u6990\u6991\u6992\u6993\u6994\u6995\u6996\u6997\u6998\u6999\u699a\u699b\u699c\u699d\u699e\u699f\u69a0\u69a1\u69a2\u69a3\u69a4\u69a5\u69a6\u69a7\u69a8\u69a9\u69aa\u69ab\u69ac\u69ad\u69ae\u69af\u69b0\u69b1\u69b2\u69b3\u69b4\u69b5\u69b6\u69b7\u69b8\u69b9\u69ba\u69bb\u69bc\u69bd\u69be\u69bf\u69c0\u69c1\u69c2\u69c3\u69c4\u69c5\u69c6\u69c7\u69c8\u69c9\u69ca\u69cb\u69cc\u69cd\u69ce\u69cf\u69d0\u69d1\u69d2\u69d3\u69d4\u69d5\u69d6\u69d7\u69d8\u69d9\u69da\u69db\u69dc\u69dd\u69de\u69df\u69e0\u69e1\u69e2\u69e3\u69e4\u69e5\u69e6\u69e7\u69e8\u69e9\u69ea\u69eb\u69ec\u69ed\u69ee\u69ef\u69f0\u69f1\u69f2\u69f3\u69f4\u69f5\u69f6\u69f7\u69f8\u69f9\u69fa\u69fb\u69fc\u69fd\u69fe\u69ff\u6a00\u6a01\u6a02\u6a03\u6a04\u6a05\u6a06\u6a07\u6a08\u6a09\u6a0a\u6a0b\u6a0c\u6a0d\u6a0e\u6a0f\u6a10\u6a11\u6a12\u6a13\u6a14\u6a15\u6a16\u6a17\u6a18\u6a19\u6a1a\u6a1b\u6a1c\u6a1d\u6a1e\u6a1f\u6a20\u6a21\u6a22\u6a23\u6a24\u6a25\u6a26\u6a27\u6a28\u6a29\u6a2a\u6a2b\u6a2c\u6a2d\u6a2e\u6a2f\u6a30\u6a31\u6a32\u6a33\u6a34\u6a35\u6a36\u6a37\u6a38\u6a39\u6a3a\u6a3b\u6a3c\u6a3d\u6a3e\u6a3f\u6a40\u6a41\u6a42\u6a43\u6a44\u6a45\u6a46\u6a47\u6a48\u6a49\u6a4a\u6a4b\u6a4c\u6a4d\u6a4e\u6a4f\u6a50\u6a51\u6a52\u6a53\u6a54\u6a55\u6a56\u6a57\u6a58\u6a59\u6a5a\u6a5b\u6a5c\u6a5d\u6a5e\u6a5f\u6a60\u6a61\u6a62\u6a63\u6a64\u6a65\u6a66\u6a67\u6a68\u6a69\u6a6a\u6a6b\u6a6c\u6a6d\u6a6e\u6a6f\u6a70\u6a71\u6a72\u6a73\u6a74\u6a75\u6a76\u6a77\u6a78\u6a79\u6a7a\u6a7b\u6a7c\u6a7d\u6a7e\u6a7f\u6a80\u6a81\u6a82\u6a83\u6a84\u6a85\u6a86\u6a87\u6a88\u6a89\u6a8a\u6a8b\u6a8c\u6a8d\u6a8e\u6a8f\u6a90\u6a91\u6a92\u6a93\u6a94\u6a95\u6a96\u6a97\u6a98\u6a99\u6a9a\u6a9b\u6a9c\u6a9d\u6a9e\u6a9f\u6aa0\u6aa1\u6aa2\u6aa3\u6aa4\u6aa5\u6aa6\u6aa7\u6aa8\u6aa9\u6aaa\u6aab\u6aac\u6aad\u6aae\u6aaf\u6ab0\u6ab1\u6ab2\u6ab3\u6ab4\u6ab5\u6ab6\u6ab7\u6ab8\u6ab9\u6aba\u6abb\u6abc\u6abd\u6abe\u6abf\u6ac0\u6ac1\u6ac2\u6ac3\u6ac4\u6ac5\u6ac6\u6ac7\u6ac8\u6ac9\u6aca\u6acb\u6acc\u6acd\u6ace\u6acf\u6ad0\u6ad1\u6ad2\u6ad3\u6ad4\u6ad5\u6ad6\u6ad7\u6ad8\u6ad9\u6ada\u6adb\u6adc\u6add\u6ade\u6adf\u6ae0\u6ae1\u6ae2\u6ae3\u6ae4\u6ae5\u6ae6\u6ae7\u6ae8\u6ae9\u6aea\u6aeb\u6aec\u6aed\u6aee\u6aef\u6af0\u6af1\u6af2\u6af3\u6af4\u6af5\u6af6\u6af7\u6af8\u6af9\u6afa\u6afb\u6afc\u6afd\u6afe\u6aff\u6b00\u6b01\u6b02\u6b03\u6b04\u6b05\u6b06\u6b07\u6b08\u6b09\u6b0a\u6b0b\u6b0c\u6b0d\u6b0e\u6b0f\u6b10\u6b11\u6b12\u6b13\u6b14\u6b15\u6b16\u6b17\u6b18\u6b19\u6b1a\u6b1b\u6b1c\u6b1d\u6b1e\u6b1f\u6b20\u6b21\u6b22\u6b23\u6b24\u6b25\u6b26\u6b27\u6b28\u6b29\u6b2a\u6b2b\u6b2c\u6b2d\u6b2e\u6b2f\u6b30\u6b31\u6b32\u6b33\u6b34\u6b35\u6b36\u6b37\u6b38\u6b39\u6b3a\u6b3b\u6b3c\u6b3d\u6b3e\u6b3f\u6b40\u6b41\u6b42\u6b43\u6b44\u6b45\u6b46\u6b47\u6b48\u6b49\u6b4a\u6b4b\u6b4c\u6b4d\u6b4e\u6b4f\u6b50\u6b51\u6b52\u6b53\u6b54\u6b55\u6b56\u6b57\u6b58\u6b59\u6b5a\u6b5b\u6b5c\u6b5d\u6b5e\u6b5f\u6b60\u6b61\u6b62\u6b63\u6b64\u6b65\u6b66\u6b67\u6b68\u6b69\u6b6a\u6b6b\u6b6c\u6b6d\u6b6e\u6b6f\u6b70\u6b71\u6b72\u6b73\u6b74\u6b75\u6b76\u6b77\u6b78\u6b79\u6b7a\u6b7b\u6b7c\u6b7d\u6b7e\u6b7f\u6b80\u6b81\u6b82\u6b83\u6b84\u6b85\u6b86\u6b87\u6b88\u6b89\u6b8a\u6b8b\u6b8c\u6b8d\u6b8e\u6b8f\u6b90\u6b91\u6b92\u6b93\u6b94\u6b95\u6b96\u6b97\u6b98\u6b99\u6b9a\u6b9b\u6b9c\u6b9d\u6b9e\u6b9f\u6ba0\u6ba1\u6ba2\u6ba3\u6ba4\u6ba5\u6ba6\u6ba7\u6ba8\u6ba9\u6baa\u6bab\u6bac\u6bad\u6bae\u6baf\u6bb0\u6bb1\u6bb2\u6bb3\u6bb4\u6bb5\u6bb6\u6bb7\u6bb8\u6bb9\u6bba\u6bbb\u6bbc\u6bbd\u6bbe\u6bbf\u6bc0\u6bc1\u6bc2\u6bc3\u6bc4\u6bc5\u6bc6\u6bc7\u6bc8\u6bc9\u6bca\u6bcb\u6bcc\u6bcd\u6bce\u6bcf\u6bd0\u6bd1\u6bd2\u6bd3\u6bd4\u6bd5\u6bd6\u6bd7\u6bd8\u6bd9\u6bda\u6bdb\u6bdc\u6bdd\u6bde\u6bdf\u6be0\u6be1\u6be2\u6be3\u6be4\u6be5\u6be6\u6be7\u6be8\u6be9\u6bea\u6beb\u6bec\u6bed\u6bee\u6bef\u6bf0\u6bf1\u6bf2\u6bf3\u6bf4\u6bf5\u6bf6\u6bf7\u6bf8\u6bf9\u6bfa\u6bfb\u6bfc\u6bfd\u6bfe\u6bff\u6c00\u6c01\u6c02\u6c03\u6c04\u6c05\u6c06\u6c07\u6c08\u6c09\u6c0a\u6c0b\u6c0c\u6c0d\u6c0e\u6c0f\u6c10\u6c11\u6c12\u6c13\u6c14\u6c15\u6c16\u6c17\u6c18\u6c19\u6c1a\u6c1b\u6c1c\u6c1d\u6c1e\u6c1f\u6c20\u6c21\u6c22\u6c23\u6c24\u6c25\u6c26\u6c27\u6c28\u6c29\u6c2a\u6c2b\u6c2c\u6c2d\u6c2e\u6c2f\u6c30\u6c31\u6c32\u6c33\u6c34\u6c35\u6c36\u6c37\u6c38\u6c39\u6c3a\u6c3b\u6c3c\u6c3d\u6c3e\u6c3f\u6c40\u6c41\u6c42\u6c43\u6c44\u6c45\u6c46\u6c47\u6c48\u6c49\u6c4a\u6c4b\u6c4c\u6c4d\u6c4e\u6c4f\u6c50\u6c51\u6c52\u6c53\u6c54\u6c55\u6c56\u6c57\u6c58\u6c59\u6c5a\u6c5b\u6c5c\u6c5d\u6c5e\u6c5f\u6c60\u6c61\u6c62\u6c63\u6c64\u6c65\u6c66\u6c67\u6c68\u6c69\u6c6a\u6c6b\u6c6c\u6c6d\u6c6e\u6c6f\u6c70\u6c71\u6c72\u6c73\u6c74\u6c75\u6c76\u6c77\u6c78\u6c79\u6c7a\u6c7b\u6c7c\u6c7d\u6c7e\u6c7f\u6c80\u6c81\u6c82\u6c83\u6c84\u6c85\u6c86\u6c87\u6c88\u6c89\u6c8a\u6c8b\u6c8c\u6c8d\u6c8e\u6c8f\u6c90\u6c91\u6c92\u6c93\u6c94\u6c95\u6c96\u6c97\u6c98\u6c99\u6c9a\u6c9b\u6c9c\u6c9d\u6c9e\u6c9f\u6ca0\u6ca1\u6ca2\u6ca3\u6ca4\u6ca5\u6ca6\u6ca7\u6ca8\u6ca9\u6caa\u6cab\u6cac\u6cad\u6cae\u6caf\u6cb0\u6cb1\u6cb2\u6cb3\u6cb4\u6cb5\u6cb6\u6cb7\u6cb8\u6cb9\u6cba\u6cbb\u6cbc\u6cbd\u6cbe\u6cbf\u6cc0\u6cc1\u6cc2\u6cc3\u6cc4\u6cc5\u6cc6\u6cc7\u6cc8\u6cc9\u6cca\u6ccb\u6ccc\u6ccd\u6cce\u6ccf\u6cd0\u6cd1\u6cd2\u6cd3\u6cd4\u6cd5\u6cd6\u6cd7\u6cd8\u6cd9\u6cda\u6cdb\u6cdc\u6cdd\u6cde\u6cdf\u6ce0\u6ce1\u6ce2\u6ce3\u6ce4\u6ce5\u6ce6\u6ce7\u6ce8\u6ce9\u6cea\u6ceb\u6cec\u6ced\u6cee\u6cef\u6cf0\u6cf1\u6cf2\u6cf3\u6cf4\u6cf5\u6cf6\u6cf7\u6cf8\u6cf9\u6cfa\u6cfb\u6cfc\u6cfd\u6cfe\u6cff\u6d00\u6d01\u6d02\u6d03\u6d04\u6d05\u6d06\u6d07\u6d08\u6d09\u6d0a\u6d0b\u6d0c\u6d0d\u6d0e\u6d0f\u6d10\u6d11\u6d12\u6d13\u6d14\u6d15\u6d16\u6d17\u6d18\u6d19\u6d1a\u6d1b\u6d1c\u6d1d\u6d1e\u6d1f\u6d20\u6d21\u6d22\u6d23\u6d24\u6d25\u6d26\u6d27\u6d28\u6d29\u6d2a\u6d2b\u6d2c\u6d2d\u6d2e\u6d2f\u6d30\u6d31\u6d32\u6d33\u6d34\u6d35\u6d36\u6d37\u6d38\u6d39\u6d3a\u6d3b\u6d3c\u6d3d\u6d3e\u6d3f\u6d40\u6d41\u6d42\u6d43\u6d44\u6d45\u6d46\u6d47\u6d48\u6d49\u6d4a\u6d4b\u6d4c\u6d4d\u6d4e\u6d4f\u6d50\u6d51\u6d52\u6d53\u6d54\u6d55\u6d56\u6d57\u6d58\u6d59\u6d5a\u6d5b\u6d5c\u6d5d\u6d5e\u6d5f\u6d60\u6d61\u6d62\u6d63\u6d64\u6d65\u6d66\u6d67\u6d68\u6d69\u6d6a\u6d6b\u6d6c\u6d6d\u6d6e\u6d6f\u6d70\u6d71\u6d72\u6d73\u6d74\u6d75\u6d76\u6d77\u6d78\u6d79\u6d7a\u6d7b\u6d7c\u6d7d\u6d7e\u6d7f\u6d80\u6d81\u6d82\u6d83\u6d84\u6d85\u6d86\u6d87\u6d88\u6d89\u6d8a\u6d8b\u6d8c\u6d8d\u6d8e\u6d8f\u6d90\u6d91\u6d92\u6d93\u6d94\u6d95\u6d96\u6d97\u6d98\u6d99\u6d9a\u6d9b\u6d9c\u6d9d\u6d9e\u6d9f\u6da0\u6da1\u6da2\u6da3\u6da4\u6da5\u6da6\u6da7\u6da8\u6da9\u6daa\u6dab\u6dac\u6dad\u6dae\u6daf\u6db0\u6db1\u6db2\u6db3\u6db4\u6db5\u6db6\u6db7\u6db8\u6db9\u6dba\u6dbb\u6dbc\u6dbd\u6dbe\u6dbf\u6dc0\u6dc1\u6dc2\u6dc3\u6dc4\u6dc5\u6dc6\u6dc7\u6dc8\u6dc9\u6dca\u6dcb\u6dcc\u6dcd\u6dce\u6dcf\u6dd0\u6dd1\u6dd2\u6dd3\u6dd4\u6dd5\u6dd6\u6dd7\u6dd8\u6dd9\u6dda\u6ddb\u6ddc\u6ddd\u6dde\u6ddf\u6de0\u6de1\u6de2\u6de3\u6de4\u6de5\u6de6\u6de7\u6de8\u6de9\u6dea\u6deb\u6dec\u6ded\u6dee\u6def\u6df0\u6df1\u6df2\u6df3\u6df4\u6df5\u6df6\u6df7\u6df8\u6df9\u6dfa\u6dfb\u6dfc\u6dfd\u6dfe\u6dff\u6e00\u6e01\u6e02\u6e03\u6e04\u6e05\u6e06\u6e07\u6e08\u6e09\u6e0a\u6e0b\u6e0c\u6e0d\u6e0e\u6e0f\u6e10\u6e11\u6e12\u6e13\u6e14\u6e15\u6e16\u6e17\u6e18\u6e19\u6e1a\u6e1b\u6e1c\u6e1d\u6e1e\u6e1f\u6e20\u6e21\u6e22\u6e23\u6e24\u6e25\u6e26\u6e27\u6e28\u6e29\u6e2a\u6e2b\u6e2c\u6e2d\u6e2e\u6e2f\u6e30\u6e31\u6e32\u6e33\u6e34\u6e35\u6e36\u6e37\u6e38\u6e39\u6e3a\u6e3b\u6e3c\u6e3d\u6e3e\u6e3f\u6e40\u6e41\u6e42\u6e43\u6e44\u6e45\u6e46\u6e47\u6e48\u6e49\u6e4a\u6e4b\u6e4c\u6e4d\u6e4e\u6e4f\u6e50\u6e51\u6e52\u6e53\u6e54\u6e55\u6e56\u6e57\u6e58\u6e59\u6e5a\u6e5b\u6e5c\u6e5d\u6e5e\u6e5f\u6e60\u6e61\u6e62\u6e63\u6e64\u6e65\u6e66\u6e67\u6e68\u6e69\u6e6a\u6e6b\u6e6c\u6e6d\u6e6e\u6e6f\u6e70\u6e71\u6e72\u6e73\u6e74\u6e75\u6e76\u6e77\u6e78\u6e79\u6e7a\u6e7b\u6e7c\u6e7d\u6e7e\u6e7f\u6e80\u6e81\u6e82\u6e83\u6e84\u6e85\u6e86\u6e87\u6e88\u6e89\u6e8a\u6e8b\u6e8c\u6e8d\u6e8e\u6e8f\u6e90\u6e91\u6e92\u6e93\u6e94\u6e95\u6e96\u6e97\u6e98\u6e99\u6e9a\u6e9b\u6e9c\u6e9d\u6e9e\u6e9f\u6ea0\u6ea1\u6ea2\u6ea3\u6ea4\u6ea5\u6ea6\u6ea7\u6ea8\u6ea9\u6eaa\u6eab\u6eac\u6ead\u6eae\u6eaf\u6eb0\u6eb1\u6eb2\u6eb3\u6eb4\u6eb5\u6eb6\u6eb7\u6eb8\u6eb9\u6eba\u6ebb\u6ebc\u6ebd\u6ebe\u6ebf\u6ec0\u6ec1\u6ec2\u6ec3\u6ec4\u6ec5\u6ec6\u6ec7\u6ec8\u6ec9\u6eca\u6ecb\u6ecc\u6ecd\u6ece\u6ecf\u6ed0\u6ed1\u6ed2\u6ed3\u6ed4\u6ed5\u6ed6\u6ed7\u6ed8\u6ed9\u6eda\u6edb\u6edc\u6edd\u6ede\u6edf\u6ee0\u6ee1\u6ee2\u6ee3\u6ee4\u6ee5\u6ee6\u6ee7\u6ee8\u6ee9\u6eea\u6eeb\u6eec\u6eed\u6eee\u6eef\u6ef0\u6ef1\u6ef2\u6ef3\u6ef4\u6ef5\u6ef6\u6ef7\u6ef8\u6ef9\u6efa\u6efb\u6efc\u6efd\u6efe\u6eff\u6f00\u6f01\u6f02\u6f03\u6f04\u6f05\u6f06\u6f07\u6f08\u6f09\u6f0a\u6f0b\u6f0c\u6f0d\u6f0e\u6f0f\u6f10\u6f11\u6f12\u6f13\u6f14\u6f15\u6f16\u6f17\u6f18\u6f19\u6f1a\u6f1b\u6f1c\u6f1d\u6f1e\u6f1f\u6f20\u6f21\u6f22\u6f23\u6f24\u6f25\u6f26\u6f27\u6f28\u6f29\u6f2a\u6f2b\u6f2c\u6f2d\u6f2e\u6f2f\u6f30\u6f31\u6f32\u6f33\u6f34\u6f35\u6f36\u6f37\u6f38\u6f39\u6f3a\u6f3b\u6f3c\u6f3d\u6f3e\u6f3f\u6f40\u6f41\u6f42\u6f43\u6f44\u6f45\u6f46\u6f47\u6f48\u6f49\u6f4a\u6f4b\u6f4c\u6f4d\u6f4e\u6f4f\u6f50\u6f51\u6f52\u6f53\u6f54\u6f55\u6f56\u6f57\u6f58\u6f59\u6f5a\u6f5b\u6f5c\u6f5d\u6f5e\u6f5f\u6f60\u6f61\u6f62\u6f63\u6f64\u6f65\u6f66\u6f67\u6f68\u6f69\u6f6a\u6f6b\u6f6c\u6f6d\u6f6e\u6f6f\u6f70\u6f71\u6f72\u6f73\u6f74\u6f75\u6f76\u6f77\u6f78\u6f79\u6f7a\u6f7b\u6f7c\u6f7d\u6f7e\u6f7f\u6f80\u6f81\u6f82\u6f83\u6f84\u6f85\u6f86\u6f87\u6f88\u6f89\u6f8a\u6f8b\u6f8c\u6f8d\u6f8e\u6f8f\u6f90\u6f91\u6f92\u6f93\u6f94\u6f95\u6f96\u6f97\u6f98\u6f99\u6f9a\u6f9b\u6f9c\u6f9d\u6f9e\u6f9f\u6fa0\u6fa1\u6fa2\u6fa3\u6fa4\u6fa5\u6fa6\u6fa7\u6fa8\u6fa9\u6faa\u6fab\u6fac\u6fad\u6fae\u6faf\u6fb0\u6fb1\u6fb2\u6fb3\u6fb4\u6fb5\u6fb6\u6fb7\u6fb8\u6fb9\u6fba\u6fbb\u6fbc\u6fbd\u6fbe\u6fbf\u6fc0\u6fc1\u6fc2\u6fc3\u6fc4\u6fc5\u6fc6\u6fc7\u6fc8\u6fc9\u6fca\u6fcb\u6fcc\u6fcd\u6fce\u6fcf\u6fd0\u6fd1\u6fd2\u6fd3\u6fd4\u6fd5\u6fd6\u6fd7\u6fd8\u6fd9\u6fda\u6fdb\u6fdc\u6fdd\u6fde\u6fdf\u6fe0\u6fe1\u6fe2\u6fe3\u6fe4\u6fe5\u6fe6\u6fe7\u6fe8\u6fe9\u6fea\u6feb\u6fec\u6fed\u6fee\u6fef\u6ff0\u6ff1\u6ff2\u6ff3\u6ff4\u6ff5\u6ff6\u6ff7\u6ff8\u6ff9\u6ffa\u6ffb\u6ffc\u6ffd\u6ffe\u6fff\u7000\u7001\u7002\u7003\u7004\u7005\u7006\u7007\u7008\u7009\u700a\u700b\u700c\u700d\u700e\u700f\u7010\u7011\u7012\u7013\u7014\u7015\u7016\u7017\u7018\u7019\u701a\u701b\u701c\u701d\u701e\u701f\u7020\u7021\u7022\u7023\u7024\u7025\u7026\u7027\u7028\u7029\u702a\u702b\u702c\u702d\u702e\u702f\u7030\u7031\u7032\u7033\u7034\u7035\u7036\u7037\u7038\u7039\u703a\u703b\u703c\u703d\u703e\u703f\u7040\u7041\u7042\u7043\u7044\u7045\u7046\u7047\u7048\u7049\u704a\u704b\u704c\u704d\u704e\u704f\u7050\u7051\u7052\u7053\u7054\u7055\u7056\u7057\u7058\u7059\u705a\u705b\u705c\u705d\u705e\u705f\u7060\u7061\u7062\u7063\u7064\u7065\u7066\u7067\u7068\u7069\u706a\u706b\u706c\u706d\u706e\u706f\u7070\u7071\u7072\u7073\u7074\u7075\u7076\u7077\u7078\u7079\u707a\u707b\u707c\u707d\u707e\u707f\u7080\u7081\u7082\u7083\u7084\u7085\u7086\u7087\u7088\u7089\u708a\u708b\u708c\u708d\u708e\u708f\u7090\u7091\u7092\u7093\u7094\u7095\u7096\u7097\u7098\u7099\u709a\u709b\u709c\u709d\u709e\u709f\u70a0\u70a1\u70a2\u70a3\u70a4\u70a5\u70a6\u70a7\u70a8\u70a9\u70aa\u70ab\u70ac\u70ad\u70ae\u70af\u70b0\u70b1\u70b2\u70b3\u70b4\u70b5\u70b6\u70b7\u70b8\u70b9\u70ba\u70bb\u70bc\u70bd\u70be\u70bf\u70c0\u70c1\u70c2\u70c3\u70c4\u70c5\u70c6\u70c7\u70c8\u70c9\u70ca\u70cb\u70cc\u70cd\u70ce\u70cf\u70d0\u70d1\u70d2\u70d3\u70d4\u70d5\u70d6\u70d7\u70d8\u70d9\u70da\u70db\u70dc\u70dd\u70de\u70df\u70e0\u70e1\u70e2\u70e3\u70e4\u70e5\u70e6\u70e7\u70e8\u70e9\u70ea\u70eb\u70ec\u70ed\u70ee\u70ef\u70f0\u70f1\u70f2\u70f3\u70f4\u70f5\u70f6\u70f7\u70f8\u70f9\u70fa\u70fb\u70fc\u70fd\u70fe\u70ff\u7100\u7101\u7102\u7103\u7104\u7105\u7106\u7107\u7108\u7109\u710a\u710b\u710c\u710d\u710e\u710f\u7110\u7111\u7112\u7113\u7114\u7115\u7116\u7117\u7118\u7119\u711a\u711b\u711c\u711d\u711e\u711f\u7120\u7121\u7122\u7123\u7124\u7125\u7126\u7127\u7128\u7129\u712a\u712b\u712c\u712d\u712e\u712f\u7130\u7131\u7132\u7133\u7134\u7135\u7136\u7137\u7138\u7139\u713a\u713b\u713c\u713d\u713e\u713f\u7140\u7141\u7142\u7143\u7144\u7145\u7146\u7147\u7148\u7149\u714a\u714b\u714c\u714d\u714e\u714f\u7150\u7151\u7152\u7153\u7154\u7155\u7156\u7157\u7158\u7159\u715a\u715b\u715c\u715d\u715e\u715f\u7160\u7161\u7162\u7163\u7164\u7165\u7166\u7167\u7168\u7169\u716a\u716b\u716c\u716d\u716e\u716f\u7170\u7171\u7172\u7173\u7174\u7175\u7176\u7177\u7178\u7179\u717a\u717b\u717c\u717d\u717e\u717f\u7180\u7181\u7182\u7183\u7184\u7185\u7186\u7187\u7188\u7189\u718a\u718b\u718c\u718d\u718e\u718f\u7190\u7191\u7192\u7193\u7194\u7195\u7196\u7197\u7198\u7199\u719a\u719b\u719c\u719d\u719e\u719f\u71a0\u71a1\u71a2\u71a3\u71a4\u71a5\u71a6\u71a7\u71a8\u71a9\u71aa\u71ab\u71ac\u71ad\u71ae\u71af\u71b0\u71b1\u71b2\u71b3\u71b4\u71b5\u71b6\u71b7\u71b8\u71b9\u71ba\u71bb\u71bc\u71bd\u71be\u71bf\u71c0\u71c1\u71c2\u71c3\u71c4\u71c5\u71c6\u71c7\u71c8\u71c9\u71ca\u71cb\u71cc\u71cd\u71ce\u71cf\u71d0\u71d1\u71d2\u71d3\u71d4\u71d5\u71d6\u71d7\u71d8\u71d9\u71da\u71db\u71dc\u71dd\u71de\u71df\u71e0\u71e1\u71e2\u71e3\u71e4\u71e5\u71e6\u71e7\u71e8\u71e9\u71ea\u71eb\u71ec\u71ed\u71ee\u71ef\u71f0\u71f1\u71f2\u71f3\u71f4\u71f5\u71f6\u71f7\u71f8\u71f9\u71fa\u71fb\u71fc\u71fd\u71fe\u71ff\u7200\u7201\u7202\u7203\u7204\u7205\u7206\u7207\u7208\u7209\u720a\u720b\u720c\u720d\u720e\u720f\u7210\u7211\u7212\u7213\u7214\u7215\u7216\u7217\u7218\u7219\u721a\u721b\u721c\u721d\u721e\u721f\u7220\u7221\u7222\u7223\u7224\u7225\u7226\u7227\u7228\u7229\u722a\u722b\u722c\u722d\u722e\u722f\u7230\u7231\u7232\u7233\u7234\u7235\u7236\u7237\u7238\u7239\u723a\u723b\u723c\u723d\u723e\u723f\u7240\u7241\u7242\u7243\u7244\u7245\u7246\u7247\u7248\u7249\u724a\u724b\u724c\u724d\u724e\u724f\u7250\u7251\u7252\u7253\u7254\u7255\u7256\u7257\u7258\u7259\u725a\u725b\u725c\u725d\u725e\u725f\u7260\u7261\u7262\u7263\u7264\u7265\u7266\u7267\u7268\u7269\u726a\u726b\u726c\u726d\u726e\u726f\u7270\u7271\u7272\u7273\u7274\u7275\u7276\u7277\u7278\u7279\u727a\u727b\u727c\u727d\u727e\u727f\u7280\u7281\u7282\u7283\u7284\u7285\u7286\u7287\u7288\u7289\u728a\u728b\u728c\u728d\u728e\u728f\u7290\u7291\u7292\u7293\u7294\u7295\u7296\u7297\u7298\u7299\u729a\u729b\u729c\u729d\u729e\u729f\u72a0\u72a1\u72a2\u72a3\u72a4\u72a5\u72a6\u72a7\u72a8\u72a9\u72aa\u72ab\u72ac\u72ad\u72ae\u72af\u72b0\u72b1\u72b2\u72b3\u72b4\u72b5\u72b6\u72b7\u72b8\u72b9\u72ba\u72bb\u72bc\u72bd\u72be\u72bf\u72c0\u72c1\u72c2\u72c3\u72c4\u72c5\u72c6\u72c7\u72c8\u72c9\u72ca\u72cb\u72cc\u72cd\u72ce\u72cf\u72d0\u72d1\u72d2\u72d3\u72d4\u72d5\u72d6\u72d7\u72d8\u72d9\u72da\u72db\u72dc\u72dd\u72de\u72df\u72e0\u72e1\u72e2\u72e3\u72e4\u72e5\u72e6\u72e7\u72e8\u72e9\u72ea\u72eb\u72ec\u72ed\u72ee\u72ef\u72f0\u72f1\u72f2\u72f3\u72f4\u72f5\u72f6\u72f7\u72f8\u72f9\u72fa\u72fb\u72fc\u72fd\u72fe\u72ff\u7300\u7301\u7302\u7303\u7304\u7305\u7306\u7307\u7308\u7309\u730a\u730b\u730c\u730d\u730e\u730f\u7310\u7311\u7312\u7313\u7314\u7315\u7316\u7317\u7318\u7319\u731a\u731b\u731c\u731d\u731e\u731f\u7320\u7321\u7322\u7323\u7324\u7325\u7326\u7327\u7328\u7329\u732a\u732b\u732c\u732d\u732e\u732f\u7330\u7331\u7332\u7333\u7334\u7335\u7336\u7337\u7338\u7339\u733a\u733b\u733c\u733d\u733e\u733f\u7340\u7341\u7342\u7343\u7344\u7345\u7346\u7347\u7348\u7349\u734a\u734b\u734c\u734d\u734e\u734f\u7350\u7351\u7352\u7353\u7354\u7355\u7356\u7357\u7358\u7359\u735a\u735b\u735c\u735d\u735e\u735f\u7360\u7361\u7362\u7363\u7364\u7365\u7366\u7367\u7368\u7369\u736a\u736b\u736c\u736d\u736e\u736f\u7370\u7371\u7372\u7373\u7374\u7375\u7376\u7377\u7378\u7379\u737a\u737b\u737c\u737d\u737e\u737f\u7380\u7381\u7382\u7383\u7384\u7385\u7386\u7387\u7388\u7389\u738a\u738b\u738c\u738d\u738e\u738f\u7390\u7391\u7392\u7393\u7394\u7395\u7396\u7397\u7398\u7399\u739a\u739b\u739c\u739d\u739e\u739f\u73a0\u73a1\u73a2\u73a3\u73a4\u73a5\u73a6\u73a7\u73a8\u73a9\u73aa\u73ab\u73ac\u73ad\u73ae\u73af\u73b0\u73b1\u73b2\u73b3\u73b4\u73b5\u73b6\u73b7\u73b8\u73b9\u73ba\u73bb\u73bc\u73bd\u73be\u73bf\u73c0\u73c1\u73c2\u73c3\u73c4\u73c5\u73c6\u73c7\u73c8\u73c9\u73ca\u73cb\u73cc\u73cd\u73ce\u73cf\u73d0\u73d1\u73d2\u73d3\u73d4\u73d5\u73d6\u73d7\u73d8\u73d9\u73da\u73db\u73dc\u73dd\u73de\u73df\u73e0\u73e1\u73e2\u73e3\u73e4\u73e5\u73e6\u73e7\u73e8\u73e9\u73ea\u73eb\u73ec\u73ed\u73ee\u73ef\u73f0\u73f1\u73f2\u73f3\u73f4\u73f5\u73f6\u73f7\u73f8\u73f9\u73fa\u73fb\u73fc\u73fd\u73fe\u73ff\u7400\u7401\u7402\u7403\u7404\u7405\u7406\u7407\u7408\u7409\u740a\u740b\u740c\u740d\u740e\u740f\u7410\u7411\u7412\u7413\u7414\u7415\u7416\u7417\u7418\u7419\u741a\u741b\u741c\u741d\u741e\u741f\u7420\u7421\u7422\u7423\u7424\u7425\u7426\u7427\u7428\u7429\u742a\u742b\u742c\u742d\u742e\u742f\u7430\u7431\u7432\u7433\u7434\u7435\u7436\u7437\u7438\u7439\u743a\u743b\u743c\u743d\u743e\u743f\u7440\u7441\u7442\u7443\u7444\u7445\u7446\u7447\u7448\u7449\u744a\u744b\u744c\u744d\u744e\u744f\u7450\u7451\u7452\u7453\u7454\u7455\u7456\u7457\u7458\u7459\u745a\u745b\u745c\u745d\u745e\u745f\u7460\u7461\u7462\u7463\u7464\u7465\u7466\u7467\u7468\u7469\u746a\u746b\u746c\u746d\u746e\u746f\u7470\u7471\u7472\u7473\u7474\u7475\u7476\u7477\u7478\u7479\u747a\u747b\u747c\u747d\u747e\u747f\u7480\u7481\u7482\u7483\u7484\u7485\u7486\u7487\u7488\u7489\u748a\u748b\u748c\u748d\u748e\u748f\u7490\u7491\u7492\u7493\u7494\u7495\u7496\u7497\u7498\u7499\u749a\u749b\u749c\u749d\u749e\u749f\u74a0\u74a1\u74a2\u74a3\u74a4\u74a5\u74a6\u74a7\u74a8\u74a9\u74aa\u74ab\u74ac\u74ad\u74ae\u74af\u74b0\u74b1\u74b2\u74b3\u74b4\u74b5\u74b6\u74b7\u74b8\u74b9\u74ba\u74bb\u74bc\u74bd\u74be\u74bf\u74c0\u74c1\u74c2\u74c3\u74c4\u74c5\u74c6\u74c7\u74c8\u74c9\u74ca\u74cb\u74cc\u74cd\u74ce\u74cf\u74d0\u74d1\u74d2\u74d3\u74d4\u74d5\u74d6\u74d7\u74d8\u74d9\u74da\u74db\u74dc\u74dd\u74de\u74df\u74e0\u74e1\u74e2\u74e3\u74e4\u74e5\u74e6\u74e7\u74e8\u74e9\u74ea\u74eb\u74ec\u74ed\u74ee\u74ef\u74f0\u74f1\u74f2\u74f3\u74f4\u74f5\u74f6\u74f7\u74f8\u74f9\u74fa\u74fb\u74fc\u74fd\u74fe\u74ff\u7500\u7501\u7502\u7503\u7504\u7505\u7506\u7507\u7508\u7509\u750a\u750b\u750c\u750d\u750e\u750f\u7510\u7511\u7512\u7513\u7514\u7515\u7516\u7517\u7518\u7519\u751a\u751b\u751c\u751d\u751e\u751f\u7520\u7521\u7522\u7523\u7524\u7525\u7526\u7527\u7528\u7529\u752a\u752b\u752c\u752d\u752e\u752f\u7530\u7531\u7532\u7533\u7534\u7535\u7536\u7537\u7538\u7539\u753a\u753b\u753c\u753d\u753e\u753f\u7540\u7541\u7542\u7543\u7544\u7545\u7546\u7547\u7548\u7549\u754a\u754b\u754c\u754d\u754e\u754f\u7550\u7551\u7552\u7553\u7554\u7555\u7556\u7557\u7558\u7559\u755a\u755b\u755c\u755d\u755e\u755f\u7560\u7561\u7562\u7563\u7564\u7565\u7566\u7567\u7568\u7569\u756a\u756b\u756c\u756d\u756e\u756f\u7570\u7571\u7572\u7573\u7574\u7575\u7576\u7577\u7578\u7579\u757a\u757b\u757c\u757d\u757e\u757f\u7580\u7581\u7582\u7583\u7584\u7585\u7586\u7587\u7588\u7589\u758a\u758b\u758c\u758d\u758e\u758f\u7590\u7591\u7592\u7593\u7594\u7595\u7596\u7597\u7598\u7599\u759a\u759b\u759c\u759d\u759e\u759f\u75a0\u75a1\u75a2\u75a3\u75a4\u75a5\u75a6\u75a7\u75a8\u75a9\u75aa\u75ab\u75ac\u75ad\u75ae\u75af\u75b0\u75b1\u75b2\u75b3\u75b4\u75b5\u75b6\u75b7\u75b8\u75b9\u75ba\u75bb\u75bc\u75bd\u75be\u75bf\u75c0\u75c1\u75c2\u75c3\u75c4\u75c5\u75c6\u75c7\u75c8\u75c9\u75ca\u75cb\u75cc\u75cd\u75ce\u75cf\u75d0\u75d1\u75d2\u75d3\u75d4\u75d5\u75d6\u75d7\u75d8\u75d9\u75da\u75db\u75dc\u75dd\u75de\u75df\u75e0\u75e1\u75e2\u75e3\u75e4\u75e5\u75e6\u75e7\u75e8\u75e9\u75ea\u75eb\u75ec\u75ed\u75ee\u75ef\u75f0\u75f1\u75f2\u75f3\u75f4\u75f5\u75f6\u75f7\u75f8\u75f9\u75fa\u75fb\u75fc\u75fd\u75fe\u75ff\u7600\u7601\u7602\u7603\u7604\u7605\u7606\u7607\u7608\u7609\u760a\u760b\u760c\u760d\u760e\u760f\u7610\u7611\u7612\u7613\u7614\u7615\u7616\u7617\u7618\u7619\u761a\u761b\u761c\u761d\u761e\u761f\u7620\u7621\u7622\u7623\u7624\u7625\u7626\u7627\u7628\u7629\u762a\u762b\u762c\u762d\u762e\u762f\u7630\u7631\u7632\u7633\u7634\u7635\u7636\u7637\u7638\u7639\u763a\u763b\u763c\u763d\u763e\u763f\u7640\u7641\u7642\u7643\u7644\u7645\u7646\u7647\u7648\u7649\u764a\u764b\u764c\u764d\u764e\u764f\u7650\u7651\u7652\u7653\u7654\u7655\u7656\u7657\u7658\u7659\u765a\u765b\u765c\u765d\u765e\u765f\u7660\u7661\u7662\u7663\u7664\u7665\u7666\u7667\u7668\u7669\u766a\u766b\u766c\u766d\u766e\u766f\u7670\u7671\u7672\u7673\u7674\u7675\u7676\u7677\u7678\u7679\u767a\u767b\u767c\u767d\u767e\u767f\u7680\u7681\u7682\u7683\u7684\u7685\u7686\u7687\u7688\u7689\u768a\u768b\u768c\u768d\u768e\u768f\u7690\u7691\u7692\u7693\u7694\u7695\u7696\u7697\u7698\u7699\u769a\u769b\u769c\u769d\u769e\u769f\u76a0\u76a1\u76a2\u76a3\u76a4\u76a5\u76a6\u76a7\u76a8\u76a9\u76aa\u76ab\u76ac\u76ad\u76ae\u76af\u76b0\u76b1\u76b2\u76b3\u76b4\u76b5\u76b6\u76b7\u76b8\u76b9\u76ba\u76bb\u76bc\u76bd\u76be\u76bf\u76c0\u76c1\u76c2\u76c3\u76c4\u76c5\u76c6\u76c7\u76c8\u76c9\u76ca\u76cb\u76cc\u76cd\u76ce\u76cf\u76d0\u76d1\u76d2\u76d3\u76d4\u76d5\u76d6\u76d7\u76d8\u76d9\u76da\u76db\u76dc\u76dd\u76de\u76df\u76e0\u76e1\u76e2\u76e3\u76e4\u76e5\u76e6\u76e7\u76e8\u76e9\u76ea\u76eb\u76ec\u76ed\u76ee\u76ef\u76f0\u76f1\u76f2\u76f3\u76f4\u76f5\u76f6\u76f7\u76f8\u76f9\u76fa\u76fb\u76fc\u76fd\u76fe\u76ff\u7700\u7701\u7702\u7703\u7704\u7705\u7706\u7707\u7708\u7709\u770a\u770b\u770c\u770d\u770e\u770f\u7710\u7711\u7712\u7713\u7714\u7715\u7716\u7717\u7718\u7719\u771a\u771b\u771c\u771d\u771e\u771f\u7720\u7721\u7722\u7723\u7724\u7725\u7726\u7727\u7728\u7729\u772a\u772b\u772c\u772d\u772e\u772f\u7730\u7731\u7732\u7733\u7734\u7735\u7736\u7737\u7738\u7739\u773a\u773b\u773c\u773d\u773e\u773f\u7740\u7741\u7742\u7743\u7744\u7745\u7746\u7747\u7748\u7749\u774a\u774b\u774c\u774d\u774e\u774f\u7750\u7751\u7752\u7753\u7754\u7755\u7756\u7757\u7758\u7759\u775a\u775b\u775c\u775d\u775e\u775f\u7760\u7761\u7762\u7763\u7764\u7765\u7766\u7767\u7768\u7769\u776a\u776b\u776c\u776d\u776e\u776f\u7770\u7771\u7772\u7773\u7774\u7775\u7776\u7777\u7778\u7779\u777a\u777b\u777c\u777d\u777e\u777f\u7780\u7781\u7782\u7783\u7784\u7785\u7786\u7787\u7788\u7789\u778a\u778b\u778c\u778d\u778e\u778f\u7790\u7791\u7792\u7793\u7794\u7795\u7796\u7797\u7798\u7799\u779a\u779b\u779c\u779d\u779e\u779f\u77a0\u77a1\u77a2\u77a3\u77a4\u77a5\u77a6\u77a7\u77a8\u77a9\u77aa\u77ab\u77ac\u77ad\u77ae\u77af\u77b0\u77b1\u77b2\u77b3\u77b4\u77b5\u77b6\u77b7\u77b8\u77b9\u77ba\u77bb\u77bc\u77bd\u77be\u77bf\u77c0\u77c1\u77c2\u77c3\u77c4\u77c5\u77c6\u77c7\u77c8\u77c9\u77ca\u77cb\u77cc\u77cd\u77ce\u77cf\u77d0\u77d1\u77d2\u77d3\u77d4\u77d5\u77d6\u77d7\u77d8\u77d9\u77da\u77db\u77dc\u77dd\u77de\u77df\u77e0\u77e1\u77e2\u77e3\u77e4\u77e5\u77e6\u77e7\u77e8\u77e9\u77ea\u77eb\u77ec\u77ed\u77ee\u77ef\u77f0\u77f1\u77f2\u77f3\u77f4\u77f5\u77f6\u77f7\u77f8\u77f9\u77fa\u77fb\u77fc\u77fd\u77fe\u77ff\u7800\u7801\u7802\u7803\u7804\u7805\u7806\u7807\u7808\u7809\u780a\u780b\u780c\u780d\u780e\u780f\u7810\u7811\u7812\u7813\u7814\u7815\u7816\u7817\u7818\u7819\u781a\u781b\u781c\u781d\u781e\u781f\u7820\u7821\u7822\u7823\u7824\u7825\u7826\u7827\u7828\u7829\u782a\u782b\u782c\u782d\u782e\u782f\u7830\u7831\u7832\u7833\u7834\u7835\u7836\u7837\u7838\u7839\u783a\u783b\u783c\u783d\u783e\u783f\u7840\u7841\u7842\u7843\u7844\u7845\u7846\u7847\u7848\u7849\u784a\u784b\u784c\u784d\u784e\u784f\u7850\u7851\u7852\u7853\u7854\u7855\u7856\u7857\u7858\u7859\u785a\u785b\u785c\u785d\u785e\u785f\u7860\u7861\u7862\u7863\u7864\u7865\u7866\u7867\u7868\u7869\u786a\u786b\u786c\u786d\u786e\u786f\u7870\u7871\u7872\u7873\u7874\u7875\u7876\u7877\u7878\u7879\u787a\u787b\u787c\u787d\u787e\u787f\u7880\u7881\u7882\u7883\u7884\u7885\u7886\u7887\u7888\u7889\u788a\u788b\u788c\u788d\u788e\u788f\u7890\u7891\u7892\u7893\u7894\u7895\u7896\u7897\u7898\u7899\u789a\u789b\u789c\u789d\u789e\u789f\u78a0\u78a1\u78a2\u78a3\u78a4\u78a5\u78a6\u78a7\u78a8\u78a9\u78aa\u78ab\u78ac\u78ad\u78ae\u78af\u78b0\u78b1\u78b2\u78b3\u78b4\u78b5\u78b6\u78b7\u78b8\u78b9\u78ba\u78bb\u78bc\u78bd\u78be\u78bf\u78c0\u78c1\u78c2\u78c3\u78c4\u78c5\u78c6\u78c7\u78c8\u78c9\u78ca\u78cb\u78cc\u78cd\u78ce\u78cf\u78d0\u78d1\u78d2\u78d3\u78d4\u78d5\u78d6\u78d7\u78d8\u78d9\u78da\u78db\u78dc\u78dd\u78de\u78df\u78e0\u78e1\u78e2\u78e3\u78e4\u78e5\u78e6\u78e7\u78e8\u78e9\u78ea\u78eb\u78ec\u78ed\u78ee\u78ef\u78f0\u78f1\u78f2\u78f3\u78f4\u78f5\u78f6\u78f7\u78f8\u78f9\u78fa\u78fb\u78fc\u78fd\u78fe\u78ff\u7900\u7901\u7902\u7903\u7904\u7905\u7906\u7907\u7908\u7909\u790a\u790b\u790c\u790d\u790e\u790f\u7910\u7911\u7912\u7913\u7914\u7915\u7916\u7917\u7918\u7919\u791a\u791b\u791c\u791d\u791e\u791f\u7920\u7921\u7922\u7923\u7924\u7925\u7926\u7927\u7928\u7929\u792a\u792b\u792c\u792d\u792e\u792f\u7930\u7931\u7932\u7933\u7934\u7935\u7936\u7937\u7938\u7939\u793a\u793b\u793c\u793d\u793e\u793f\u7940\u7941\u7942\u7943\u7944\u7945\u7946\u7947\u7948\u7949\u794a\u794b\u794c\u794d\u794e\u794f\u7950\u7951\u7952\u7953\u7954\u7955\u7956\u7957\u7958\u7959\u795a\u795b\u795c\u795d\u795e\u795f\u7960\u7961\u7962\u7963\u7964\u7965\u7966\u7967\u7968\u7969\u796a\u796b\u796c\u796d\u796e\u796f\u7970\u7971\u7972\u7973\u7974\u7975\u7976\u7977\u7978\u7979\u797a\u797b\u797c\u797d\u797e\u797f\u7980\u7981\u7982\u7983\u7984\u7985\u7986\u7987\u7988\u7989\u798a\u798b\u798c\u798d\u798e\u798f\u7990\u7991\u7992\u7993\u7994\u7995\u7996\u7997\u7998\u7999\u799a\u799b\u799c\u799d\u799e\u799f\u79a0\u79a1\u79a2\u79a3\u79a4\u79a5\u79a6\u79a7\u79a8\u79a9\u79aa\u79ab\u79ac\u79ad\u79ae\u79af\u79b0\u79b1\u79b2\u79b3\u79b4\u79b5\u79b6\u79b7\u79b8\u79b9\u79ba\u79bb\u79bc\u79bd\u79be\u79bf\u79c0\u79c1\u79c2\u79c3\u79c4\u79c5\u79c6\u79c7\u79c8\u79c9\u79ca\u79cb\u79cc\u79cd\u79ce\u79cf\u79d0\u79d1\u79d2\u79d3\u79d4\u79d5\u79d6\u79d7\u79d8\u79d9\u79da\u79db\u79dc\u79dd\u79de\u79df\u79e0\u79e1\u79e2\u79e3\u79e4\u79e5\u79e6\u79e7\u79e8\u79e9\u79ea\u79eb\u79ec\u79ed\u79ee\u79ef\u79f0\u79f1\u79f2\u79f3\u79f4\u79f5\u79f6\u79f7\u79f8\u79f9\u79fa\u79fb\u79fc\u79fd\u79fe\u79ff\u7a00\u7a01\u7a02\u7a03\u7a04\u7a05\u7a06\u7a07\u7a08\u7a09\u7a0a\u7a0b\u7a0c\u7a0d\u7a0e\u7a0f\u7a10\u7a11\u7a12\u7a13\u7a14\u7a15\u7a16\u7a17\u7a18\u7a19\u7a1a\u7a1b\u7a1c\u7a1d\u7a1e\u7a1f\u7a20\u7a21\u7a22\u7a23\u7a24\u7a25\u7a26\u7a27\u7a28\u7a29\u7a2a\u7a2b\u7a2c\u7a2d\u7a2e\u7a2f\u7a30\u7a31\u7a32\u7a33\u7a34\u7a35\u7a36\u7a37\u7a38\u7a39\u7a3a\u7a3b\u7a3c\u7a3d\u7a3e\u7a3f\u7a40\u7a41\u7a42\u7a43\u7a44\u7a45\u7a46\u7a47\u7a48\u7a49\u7a4a\u7a4b\u7a4c\u7a4d\u7a4e\u7a4f\u7a50\u7a51\u7a52\u7a53\u7a54\u7a55\u7a56\u7a57\u7a58\u7a59\u7a5a\u7a5b\u7a5c\u7a5d\u7a5e\u7a5f\u7a60\u7a61\u7a62\u7a63\u7a64\u7a65\u7a66\u7a67\u7a68\u7a69\u7a6a\u7a6b\u7a6c\u7a6d\u7a6e\u7a6f\u7a70\u7a71\u7a72\u7a73\u7a74\u7a75\u7a76\u7a77\u7a78\u7a79\u7a7a\u7a7b\u7a7c\u7a7d\u7a7e\u7a7f\u7a80\u7a81\u7a82\u7a83\u7a84\u7a85\u7a86\u7a87\u7a88\u7a89\u7a8a\u7a8b\u7a8c\u7a8d\u7a8e\u7a8f\u7a90\u7a91\u7a92\u7a93\u7a94\u7a95\u7a96\u7a97\u7a98\u7a99\u7a9a\u7a9b\u7a9c\u7a9d\u7a9e\u7a9f\u7aa0\u7aa1\u7aa2\u7aa3\u7aa4\u7aa5\u7aa6\u7aa7\u7aa8\u7aa9\u7aaa\u7aab\u7aac\u7aad\u7aae\u7aaf\u7ab0\u7ab1\u7ab2\u7ab3\u7ab4\u7ab5\u7ab6\u7ab7\u7ab8\u7ab9\u7aba\u7abb\u7abc\u7abd\u7abe\u7abf\u7ac0\u7ac1\u7ac2\u7ac3\u7ac4\u7ac5\u7ac6\u7ac7\u7ac8\u7ac9\u7aca\u7acb\u7acc\u7acd\u7ace\u7acf\u7ad0\u7ad1\u7ad2\u7ad3\u7ad4\u7ad5\u7ad6\u7ad7\u7ad8\u7ad9\u7ada\u7adb\u7adc\u7add\u7ade\u7adf\u7ae0\u7ae1\u7ae2\u7ae3\u7ae4\u7ae5\u7ae6\u7ae7\u7ae8\u7ae9\u7aea\u7aeb\u7aec\u7aed\u7aee\u7aef\u7af0\u7af1\u7af2\u7af3\u7af4\u7af5\u7af6\u7af7\u7af8\u7af9\u7afa\u7afb\u7afc\u7afd\u7afe\u7aff\u7b00\u7b01\u7b02\u7b03\u7b04\u7b05\u7b06\u7b07\u7b08\u7b09\u7b0a\u7b0b\u7b0c\u7b0d\u7b0e\u7b0f\u7b10\u7b11\u7b12\u7b13\u7b14\u7b15\u7b16\u7b17\u7b18\u7b19\u7b1a\u7b1b\u7b1c\u7b1d\u7b1e\u7b1f\u7b20\u7b21\u7b22\u7b23\u7b24\u7b25\u7b26\u7b27\u7b28\u7b29\u7b2a\u7b2b\u7b2c\u7b2d\u7b2e\u7b2f\u7b30\u7b31\u7b32\u7b33\u7b34\u7b35\u7b36\u7b37\u7b38\u7b39\u7b3a\u7b3b\u7b3c\u7b3d\u7b3e\u7b3f\u7b40\u7b41\u7b42\u7b43\u7b44\u7b45\u7b46\u7b47\u7b48\u7b49\u7b4a\u7b4b\u7b4c\u7b4d\u7b4e\u7b4f\u7b50\u7b51\u7b52\u7b53\u7b54\u7b55\u7b56\u7b57\u7b58\u7b59\u7b5a\u7b5b\u7b5c\u7b5d\u7b5e\u7b5f\u7b60\u7b61\u7b62\u7b63\u7b64\u7b65\u7b66\u7b67\u7b68\u7b69\u7b6a\u7b6b\u7b6c\u7b6d\u7b6e\u7b6f\u7b70\u7b71\u7b72\u7b73\u7b74\u7b75\u7b76\u7b77\u7b78\u7b79\u7b7a\u7b7b\u7b7c\u7b7d\u7b7e\u7b7f\u7b80\u7b81\u7b82\u7b83\u7b84\u7b85\u7b86\u7b87\u7b88\u7b89\u7b8a\u7b8b\u7b8c\u7b8d\u7b8e\u7b8f\u7b90\u7b91\u7b92\u7b93\u7b94\u7b95\u7b96\u7b97\u7b98\u7b99\u7b9a\u7b9b\u7b9c\u7b9d\u7b9e\u7b9f\u7ba0\u7ba1\u7ba2\u7ba3\u7ba4\u7ba5\u7ba6\u7ba7\u7ba8\u7ba9\u7baa\u7bab\u7bac\u7bad\u7bae\u7baf\u7bb0\u7bb1\u7bb2\u7bb3\u7bb4\u7bb5\u7bb6\u7bb7\u7bb8\u7bb9\u7bba\u7bbb\u7bbc\u7bbd\u7bbe\u7bbf\u7bc0\u7bc1\u7bc2\u7bc3\u7bc4\u7bc5\u7bc6\u7bc7\u7bc8\u7bc9\u7bca\u7bcb\u7bcc\u7bcd\u7bce\u7bcf\u7bd0\u7bd1\u7bd2\u7bd3\u7bd4\u7bd5\u7bd6\u7bd7\u7bd8\u7bd9\u7bda\u7bdb\u7bdc\u7bdd\u7bde\u7bdf\u7be0\u7be1\u7be2\u7be3\u7be4\u7be5\u7be6\u7be7\u7be8\u7be9\u7bea\u7beb\u7bec\u7bed\u7bee\u7bef\u7bf0\u7bf1\u7bf2\u7bf3\u7bf4\u7bf5\u7bf6\u7bf7\u7bf8\u7bf9\u7bfa\u7bfb\u7bfc\u7bfd\u7bfe\u7bff\u7c00\u7c01\u7c02\u7c03\u7c04\u7c05\u7c06\u7c07\u7c08\u7c09\u7c0a\u7c0b\u7c0c\u7c0d\u7c0e\u7c0f\u7c10\u7c11\u7c12\u7c13\u7c14\u7c15\u7c16\u7c17\u7c18\u7c19\u7c1a\u7c1b\u7c1c\u7c1d\u7c1e\u7c1f\u7c20\u7c21\u7c22\u7c23\u7c24\u7c25\u7c26\u7c27\u7c28\u7c29\u7c2a\u7c2b\u7c2c\u7c2d\u7c2e\u7c2f\u7c30\u7c31\u7c32\u7c33\u7c34\u7c35\u7c36\u7c37\u7c38\u7c39\u7c3a\u7c3b\u7c3c\u7c3d\u7c3e\u7c3f\u7c40\u7c41\u7c42\u7c43\u7c44\u7c45\u7c46\u7c47\u7c48\u7c49\u7c4a\u7c4b\u7c4c\u7c4d\u7c4e\u7c4f\u7c50\u7c51\u7c52\u7c53\u7c54\u7c55\u7c56\u7c57\u7c58\u7c59\u7c5a\u7c5b\u7c5c\u7c5d\u7c5e\u7c5f\u7c60\u7c61\u7c62\u7c63\u7c64\u7c65\u7c66\u7c67\u7c68\u7c69\u7c6a\u7c6b\u7c6c\u7c6d\u7c6e\u7c6f\u7c70\u7c71\u7c72\u7c73\u7c74\u7c75\u7c76\u7c77\u7c78\u7c79\u7c7a\u7c7b\u7c7c\u7c7d\u7c7e\u7c7f\u7c80\u7c81\u7c82\u7c83\u7c84\u7c85\u7c86\u7c87\u7c88\u7c89\u7c8a\u7c8b\u7c8c\u7c8d\u7c8e\u7c8f\u7c90\u7c91\u7c92\u7c93\u7c94\u7c95\u7c96\u7c97\u7c98\u7c99\u7c9a\u7c9b\u7c9c\u7c9d\u7c9e\u7c9f\u7ca0\u7ca1\u7ca2\u7ca3\u7ca4\u7ca5\u7ca6\u7ca7\u7ca8\u7ca9\u7caa\u7cab\u7cac\u7cad\u7cae\u7caf\u7cb0\u7cb1\u7cb2\u7cb3\u7cb4\u7cb5\u7cb6\u7cb7\u7cb8\u7cb9\u7cba\u7cbb\u7cbc\u7cbd\u7cbe\u7cbf\u7cc0\u7cc1\u7cc2\u7cc3\u7cc4\u7cc5\u7cc6\u7cc7\u7cc8\u7cc9\u7cca\u7ccb\u7ccc\u7ccd\u7cce\u7ccf\u7cd0\u7cd1\u7cd2\u7cd3\u7cd4\u7cd5\u7cd6\u7cd7\u7cd8\u7cd9\u7cda\u7cdb\u7cdc\u7cdd\u7cde\u7cdf\u7ce0\u7ce1\u7ce2\u7ce3\u7ce4\u7ce5\u7ce6\u7ce7\u7ce8\u7ce9\u7cea\u7ceb\u7cec\u7ced\u7cee\u7cef\u7cf0\u7cf1\u7cf2\u7cf3\u7cf4\u7cf5\u7cf6\u7cf7\u7cf8\u7cf9\u7cfa\u7cfb\u7cfc\u7cfd\u7cfe\u7cff\u7d00\u7d01\u7d02\u7d03\u7d04\u7d05\u7d06\u7d07\u7d08\u7d09\u7d0a\u7d0b\u7d0c\u7d0d\u7d0e\u7d0f\u7d10\u7d11\u7d12\u7d13\u7d14\u7d15\u7d16\u7d17\u7d18\u7d19\u7d1a\u7d1b\u7d1c\u7d1d\u7d1e\u7d1f\u7d20\u7d21\u7d22\u7d23\u7d24\u7d25\u7d26\u7d27\u7d28\u7d29\u7d2a\u7d2b\u7d2c\u7d2d\u7d2e\u7d2f\u7d30\u7d31\u7d32\u7d33\u7d34\u7d35\u7d36\u7d37\u7d38\u7d39\u7d3a\u7d3b\u7d3c\u7d3d\u7d3e\u7d3f\u7d40\u7d41\u7d42\u7d43\u7d44\u7d45\u7d46\u7d47\u7d48\u7d49\u7d4a\u7d4b\u7d4c\u7d4d\u7d4e\u7d4f\u7d50\u7d51\u7d52\u7d53\u7d54\u7d55\u7d56\u7d57\u7d58\u7d59\u7d5a\u7d5b\u7d5c\u7d5d\u7d5e\u7d5f\u7d60\u7d61\u7d62\u7d63\u7d64\u7d65\u7d66\u7d67\u7d68\u7d69\u7d6a\u7d6b\u7d6c\u7d6d\u7d6e\u7d6f\u7d70\u7d71\u7d72\u7d73\u7d74\u7d75\u7d76\u7d77\u7d78\u7d79\u7d7a\u7d7b\u7d7c\u7d7d\u7d7e\u7d7f\u7d80\u7d81\u7d82\u7d83\u7d84\u7d85\u7d86\u7d87\u7d88\u7d89\u7d8a\u7d8b\u7d8c\u7d8d\u7d8e\u7d8f\u7d90\u7d91\u7d92\u7d93\u7d94\u7d95\u7d96\u7d97\u7d98\u7d99\u7d9a\u7d9b\u7d9c\u7d9d\u7d9e\u7d9f\u7da0\u7da1\u7da2\u7da3\u7da4\u7da5\u7da6\u7da7\u7da8\u7da9\u7daa\u7dab\u7dac\u7dad\u7dae\u7daf\u7db0\u7db1\u7db2\u7db3\u7db4\u7db5\u7db6\u7db7\u7db8\u7db9\u7dba\u7dbb\u7dbc\u7dbd\u7dbe\u7dbf\u7dc0\u7dc1\u7dc2\u7dc3\u7dc4\u7dc5\u7dc6\u7dc7\u7dc8\u7dc9\u7dca\u7dcb\u7dcc\u7dcd\u7dce\u7dcf\u7dd0\u7dd1\u7dd2\u7dd3\u7dd4\u7dd5\u7dd6\u7dd7\u7dd8\u7dd9\u7dda\u7ddb\u7ddc\u7ddd\u7dde\u7ddf\u7de0\u7de1\u7de2\u7de3\u7de4\u7de5\u7de6\u7de7\u7de8\u7de9\u7dea\u7deb\u7dec\u7ded\u7dee\u7def\u7df0\u7df1\u7df2\u7df3\u7df4\u7df5\u7df6\u7df7\u7df8\u7df9\u7dfa\u7dfb\u7dfc\u7dfd\u7dfe\u7dff\u7e00\u7e01\u7e02\u7e03\u7e04\u7e05\u7e06\u7e07\u7e08\u7e09\u7e0a\u7e0b\u7e0c\u7e0d\u7e0e\u7e0f\u7e10\u7e11\u7e12\u7e13\u7e14\u7e15\u7e16\u7e17\u7e18\u7e19\u7e1a\u7e1b\u7e1c\u7e1d\u7e1e\u7e1f\u7e20\u7e21\u7e22\u7e23\u7e24\u7e25\u7e26\u7e27\u7e28\u7e29\u7e2a\u7e2b\u7e2c\u7e2d\u7e2e\u7e2f\u7e30\u7e31\u7e32\u7e33\u7e34\u7e35\u7e36\u7e37\u7e38\u7e39\u7e3a\u7e3b\u7e3c\u7e3d\u7e3e\u7e3f\u7e40\u7e41\u7e42\u7e43\u7e44\u7e45\u7e46\u7e47\u7e48\u7e49\u7e4a\u7e4b\u7e4c\u7e4d\u7e4e\u7e4f\u7e50\u7e51\u7e52\u7e53\u7e54\u7e55\u7e56\u7e57\u7e58\u7e59\u7e5a\u7e5b\u7e5c\u7e5d\u7e5e\u7e5f\u7e60\u7e61\u7e62\u7e63\u7e64\u7e65\u7e66\u7e67\u7e68\u7e69\u7e6a\u7e6b\u7e6c\u7e6d\u7e6e\u7e6f\u7e70\u7e71\u7e72\u7e73\u7e74\u7e75\u7e76\u7e77\u7e78\u7e79\u7e7a\u7e7b\u7e7c\u7e7d\u7e7e\u7e7f\u7e80\u7e81\u7e82\u7e83\u7e84\u7e85\u7e86\u7e87\u7e88\u7e89\u7e8a\u7e8b\u7e8c\u7e8d\u7e8e\u7e8f\u7e90\u7e91\u7e92\u7e93\u7e94\u7e95\u7e96\u7e97\u7e98\u7e99\u7e9a\u7e9b\u7e9c\u7e9d\u7e9e\u7e9f\u7ea0\u7ea1\u7ea2\u7ea3\u7ea4\u7ea5\u7ea6\u7ea7\u7ea8\u7ea9\u7eaa\u7eab\u7eac\u7ead\u7eae\u7eaf\u7eb0\u7eb1\u7eb2\u7eb3\u7eb4\u7eb5\u7eb6\u7eb7\u7eb8\u7eb9\u7eba\u7ebb\u7ebc\u7ebd\u7ebe\u7ebf\u7ec0\u7ec1\u7ec2\u7ec3\u7ec4\u7ec5\u7ec6\u7ec7\u7ec8\u7ec9\u7eca\u7ecb\u7ecc\u7ecd\u7ece\u7ecf\u7ed0\u7ed1\u7ed2\u7ed3\u7ed4\u7ed5\u7ed6\u7ed7\u7ed8\u7ed9\u7eda\u7edb\u7edc\u7edd\u7ede\u7edf\u7ee0\u7ee1\u7ee2\u7ee3\u7ee4\u7ee5\u7ee6\u7ee7\u7ee8\u7ee9\u7eea\u7eeb\u7eec\u7eed\u7eee\u7eef\u7ef0\u7ef1\u7ef2\u7ef3\u7ef4\u7ef5\u7ef6\u7ef7\u7ef8\u7ef9\u7efa\u7efb\u7efc\u7efd\u7efe\u7eff\u7f00\u7f01\u7f02\u7f03\u7f04\u7f05\u7f06\u7f07\u7f08\u7f09\u7f0a\u7f0b\u7f0c\u7f0d\u7f0e\u7f0f\u7f10\u7f11\u7f12\u7f13\u7f14\u7f15\u7f16\u7f17\u7f18\u7f19\u7f1a\u7f1b\u7f1c\u7f1d\u7f1e\u7f1f\u7f20\u7f21\u7f22\u7f23\u7f24\u7f25\u7f26\u7f27\u7f28\u7f29\u7f2a\u7f2b\u7f2c\u7f2d\u7f2e\u7f2f\u7f30\u7f31\u7f32\u7f33\u7f34\u7f35\u7f36\u7f37\u7f38\u7f39\u7f3a\u7f3b\u7f3c\u7f3d\u7f3e\u7f3f\u7f40\u7f41\u7f42\u7f43\u7f44\u7f45\u7f46\u7f47\u7f48\u7f49\u7f4a\u7f4b\u7f4c\u7f4d\u7f4e\u7f4f\u7f50\u7f51\u7f52\u7f53\u7f54\u7f55\u7f56\u7f57\u7f58\u7f59\u7f5a\u7f5b\u7f5c\u7f5d\u7f5e\u7f5f\u7f60\u7f61\u7f62\u7f63\u7f64\u7f65\u7f66\u7f67\u7f68\u7f69\u7f6a\u7f6b\u7f6c\u7f6d\u7f6e\u7f6f\u7f70\u7f71\u7f72\u7f73\u7f74\u7f75\u7f76\u7f77\u7f78\u7f79\u7f7a\u7f7b\u7f7c\u7f7d\u7f7e\u7f7f\u7f80\u7f81\u7f82\u7f83\u7f84\u7f85\u7f86\u7f87\u7f88\u7f89\u7f8a\u7f8b\u7f8c\u7f8d\u7f8e\u7f8f\u7f90\u7f91\u7f92\u7f93\u7f94\u7f95\u7f96\u7f97\u7f98\u7f99\u7f9a\u7f9b\u7f9c\u7f9d\u7f9e\u7f9f\u7fa0\u7fa1\u7fa2\u7fa3\u7fa4\u7fa5\u7fa6\u7fa7\u7fa8\u7fa9\u7faa\u7fab\u7fac\u7fad\u7fae\u7faf\u7fb0\u7fb1\u7fb2\u7fb3\u7fb4\u7fb5\u7fb6\u7fb7\u7fb8\u7fb9\u7fba\u7fbb\u7fbc\u7fbd\u7fbe\u7fbf\u7fc0\u7fc1\u7fc2\u7fc3\u7fc4\u7fc5\u7fc6\u7fc7\u7fc8\u7fc9\u7fca\u7fcb\u7fcc\u7fcd\u7fce\u7fcf\u7fd0\u7fd1\u7fd2\u7fd3\u7fd4\u7fd5\u7fd6\u7fd7\u7fd8\u7fd9\u7fda\u7fdb\u7fdc\u7fdd\u7fde\u7fdf\u7fe0\u7fe1\u7fe2\u7fe3\u7fe4\u7fe5\u7fe6\u7fe7\u7fe8\u7fe9\u7fea\u7feb\u7fec\u7fed\u7fee\u7fef\u7ff0\u7ff1\u7ff2\u7ff3\u7ff4\u7ff5\u7ff6\u7ff7\u7ff8\u7ff9\u7ffa\u7ffb\u7ffc\u7ffd\u7ffe\u7fff\u8000\u8001\u8002\u8003\u8004\u8005\u8006\u8007\u8008\u8009\u800a\u800b\u800c\u800d\u800e\u800f\u8010\u8011\u8012\u8013\u8014\u8015\u8016\u8017\u8018\u8019\u801a\u801b\u801c\u801d\u801e\u801f\u8020\u8021\u8022\u8023\u8024\u8025\u8026\u8027\u8028\u8029\u802a\u802b\u802c\u802d\u802e\u802f\u8030\u8031\u8032\u8033\u8034\u8035\u8036\u8037\u8038\u8039\u803a\u803b\u803c\u803d\u803e\u803f\u8040\u8041\u8042\u8043\u8044\u8045\u8046\u8047\u8048\u8049\u804a\u804b\u804c\u804d\u804e\u804f\u8050\u8051\u8052\u8053\u8054\u8055\u8056\u8057\u8058\u8059\u805a\u805b\u805c\u805d\u805e\u805f\u8060\u8061\u8062\u8063\u8064\u8065\u8066\u8067\u8068\u8069\u806a\u806b\u806c\u806d\u806e\u806f\u8070\u8071\u8072\u8073\u8074\u8075\u8076\u8077\u8078\u8079\u807a\u807b\u807c\u807d\u807e\u807f\u8080\u8081\u8082\u8083\u8084\u8085\u8086\u8087\u8088\u8089\u808a\u808b\u808c\u808d\u808e\u808f\u8090\u8091\u8092\u8093\u8094\u8095\u8096\u8097\u8098\u8099\u809a\u809b\u809c\u809d\u809e\u809f\u80a0\u80a1\u80a2\u80a3\u80a4\u80a5\u80a6\u80a7\u80a8\u80a9\u80aa\u80ab\u80ac\u80ad\u80ae\u80af\u80b0\u80b1\u80b2\u80b3\u80b4\u80b5\u80b6\u80b7\u80b8\u80b9\u80ba\u80bb\u80bc\u80bd\u80be\u80bf\u80c0\u80c1\u80c2\u80c3\u80c4\u80c5\u80c6\u80c7\u80c8\u80c9\u80ca\u80cb\u80cc\u80cd\u80ce\u80cf\u80d0\u80d1\u80d2\u80d3\u80d4\u80d5\u80d6\u80d7\u80d8\u80d9\u80da\u80db\u80dc\u80dd\u80de\u80df\u80e0\u80e1\u80e2\u80e3\u80e4\u80e5\u80e6\u80e7\u80e8\u80e9\u80ea\u80eb\u80ec\u80ed\u80ee\u80ef\u80f0\u80f1\u80f2\u80f3\u80f4\u80f5\u80f6\u80f7\u80f8\u80f9\u80fa\u80fb\u80fc\u80fd\u80fe\u80ff\u8100\u8101\u8102\u8103\u8104\u8105\u8106\u8107\u8108\u8109\u810a\u810b\u810c\u810d\u810e\u810f\u8110\u8111\u8112\u8113\u8114\u8115\u8116\u8117\u8118\u8119\u811a\u811b\u811c\u811d\u811e\u811f\u8120\u8121\u8122\u8123\u8124\u8125\u8126\u8127\u8128\u8129\u812a\u812b\u812c\u812d\u812e\u812f\u8130\u8131\u8132\u8133\u8134\u8135\u8136\u8137\u8138\u8139\u813a\u813b\u813c\u813d\u813e\u813f\u8140\u8141\u8142\u8143\u8144\u8145\u8146\u8147\u8148\u8149\u814a\u814b\u814c\u814d\u814e\u814f\u8150\u8151\u8152\u8153\u8154\u8155\u8156\u8157\u8158\u8159\u815a\u815b\u815c\u815d\u815e\u815f\u8160\u8161\u8162\u8163\u8164\u8165\u8166\u8167\u8168\u8169\u816a\u816b\u816c\u816d\u816e\u816f\u8170\u8171\u8172\u8173\u8174\u8175\u8176\u8177\u8178\u8179\u817a\u817b\u817c\u817d\u817e\u817f\u8180\u8181\u8182\u8183\u8184\u8185\u8186\u8187\u8188\u8189\u818a\u818b\u818c\u818d\u818e\u818f\u8190\u8191\u8192\u8193\u8194\u8195\u8196\u8197\u8198\u8199\u819a\u819b\u819c\u819d\u819e\u819f\u81a0\u81a1\u81a2\u81a3\u81a4\u81a5\u81a6\u81a7\u81a8\u81a9\u81aa\u81ab\u81ac\u81ad\u81ae\u81af\u81b0\u81b1\u81b2\u81b3\u81b4\u81b5\u81b6\u81b7\u81b8\u81b9\u81ba\u81bb\u81bc\u81bd\u81be\u81bf\u81c0\u81c1\u81c2\u81c3\u81c4\u81c5\u81c6\u81c7\u81c8\u81c9\u81ca\u81cb\u81cc\u81cd\u81ce\u81cf\u81d0\u81d1\u81d2\u81d3\u81d4\u81d5\u81d6\u81d7\u81d8\u81d9\u81da\u81db\u81dc\u81dd\u81de\u81df\u81e0\u81e1\u81e2\u81e3\u81e4\u81e5\u81e6\u81e7\u81e8\u81e9\u81ea\u81eb\u81ec\u81ed\u81ee\u81ef\u81f0\u81f1\u81f2\u81f3\u81f4\u81f5\u81f6\u81f7\u81f8\u81f9\u81fa\u81fb\u81fc\u81fd\u81fe\u81ff\u8200\u8201\u8202\u8203\u8204\u8205\u8206\u8207\u8208\u8209\u820a\u820b\u820c\u820d\u820e\u820f\u8210\u8211\u8212\u8213\u8214\u8215\u8216\u8217\u8218\u8219\u821a\u821b\u821c\u821d\u821e\u821f\u8220\u8221\u8222\u8223\u8224\u8225\u8226\u8227\u8228\u8229\u822a\u822b\u822c\u822d\u822e\u822f\u8230\u8231\u8232\u8233\u8234\u8235\u8236\u8237\u8238\u8239\u823a\u823b\u823c\u823d\u823e\u823f\u8240\u8241\u8242\u8243\u8244\u8245\u8246\u8247\u8248\u8249\u824a\u824b\u824c\u824d\u824e\u824f\u8250\u8251\u8252\u8253\u8254\u8255\u8256\u8257\u8258\u8259\u825a\u825b\u825c\u825d\u825e\u825f\u8260\u8261\u8262\u8263\u8264\u8265\u8266\u8267\u8268\u8269\u826a\u826b\u826c\u826d\u826e\u826f\u8270\u8271\u8272\u8273\u8274\u8275\u8276\u8277\u8278\u8279\u827a\u827b\u827c\u827d\u827e\u827f\u8280\u8281\u8282\u8283\u8284\u8285\u8286\u8287\u8288\u8289\u828a\u828b\u828c\u828d\u828e\u828f\u8290\u8291\u8292\u8293\u8294\u8295\u8296\u8297\u8298\u8299\u829a\u829b\u829c\u829d\u829e\u829f\u82a0\u82a1\u82a2\u82a3\u82a4\u82a5\u82a6\u82a7\u82a8\u82a9\u82aa\u82ab\u82ac\u82ad\u82ae\u82af\u82b0\u82b1\u82b2\u82b3\u82b4\u82b5\u82b6\u82b7\u82b8\u82b9\u82ba\u82bb\u82bc\u82bd\u82be\u82bf\u82c0\u82c1\u82c2\u82c3\u82c4\u82c5\u82c6\u82c7\u82c8\u82c9\u82ca\u82cb\u82cc\u82cd\u82ce\u82cf\u82d0\u82d1\u82d2\u82d3\u82d4\u82d5\u82d6\u82d7\u82d8\u82d9\u82da\u82db\u82dc\u82dd\u82de\u82df\u82e0\u82e1\u82e2\u82e3\u82e4\u82e5\u82e6\u82e7\u82e8\u82e9\u82ea\u82eb\u82ec\u82ed\u82ee\u82ef\u82f0\u82f1\u82f2\u82f3\u82f4\u82f5\u82f6\u82f7\u82f8\u82f9\u82fa\u82fb\u82fc\u82fd\u82fe\u82ff\u8300\u8301\u8302\u8303\u8304\u8305\u8306\u8307\u8308\u8309\u830a\u830b\u830c\u830d\u830e\u830f\u8310\u8311\u8312\u8313\u8314\u8315\u8316\u8317\u8318\u8319\u831a\u831b\u831c\u831d\u831e\u831f\u8320\u8321\u8322\u8323\u8324\u8325\u8326\u8327\u8328\u8329\u832a\u832b\u832c\u832d\u832e\u832f\u8330\u8331\u8332\u8333\u8334\u8335\u8336\u8337\u8338\u8339\u833a\u833b\u833c\u833d\u833e\u833f\u8340\u8341\u8342\u8343\u8344\u8345\u8346\u8347\u8348\u8349\u834a\u834b\u834c\u834d\u834e\u834f\u8350\u8351\u8352\u8353\u8354\u8355\u8356\u8357\u8358\u8359\u835a\u835b\u835c\u835d\u835e\u835f\u8360\u8361\u8362\u8363\u8364\u8365\u8366\u8367\u8368\u8369\u836a\u836b\u836c\u836d\u836e\u836f\u8370\u8371\u8372\u8373\u8374\u8375\u8376\u8377\u8378\u8379\u837a\u837b\u837c\u837d\u837e\u837f\u8380\u8381\u8382\u8383\u8384\u8385\u8386\u8387\u8388\u8389\u838a\u838b\u838c\u838d\u838e\u838f\u8390\u8391\u8392\u8393\u8394\u8395\u8396\u8397\u8398\u8399\u839a\u839b\u839c\u839d\u839e\u839f\u83a0\u83a1\u83a2\u83a3\u83a4\u83a5\u83a6\u83a7\u83a8\u83a9\u83aa\u83ab\u83ac\u83ad\u83ae\u83af\u83b0\u83b1\u83b2\u83b3\u83b4\u83b5\u83b6\u83b7\u83b8\u83b9\u83ba\u83bb\u83bc\u83bd\u83be\u83bf\u83c0\u83c1\u83c2\u83c3\u83c4\u83c5\u83c6\u83c7\u83c8\u83c9\u83ca\u83cb\u83cc\u83cd\u83ce\u83cf\u83d0\u83d1\u83d2\u83d3\u83d4\u83d5\u83d6\u83d7\u83d8\u83d9\u83da\u83db\u83dc\u83dd\u83de\u83df\u83e0\u83e1\u83e2\u83e3\u83e4\u83e5\u83e6\u83e7\u83e8\u83e9\u83ea\u83eb\u83ec\u83ed\u83ee\u83ef\u83f0\u83f1\u83f2\u83f3\u83f4\u83f5\u83f6\u83f7\u83f8\u83f9\u83fa\u83fb\u83fc\u83fd\u83fe\u83ff\u8400\u8401\u8402\u8403\u8404\u8405\u8406\u8407\u8408\u8409\u840a\u840b\u840c\u840d\u840e\u840f\u8410\u8411\u8412\u8413\u8414\u8415\u8416\u8417\u8418\u8419\u841a\u841b\u841c\u841d\u841e\u841f\u8420\u8421\u8422\u8423\u8424\u8425\u8426\u8427\u8428\u8429\u842a\u842b\u842c\u842d\u842e\u842f\u8430\u8431\u8432\u8433\u8434\u8435\u8436\u8437\u8438\u8439\u843a\u843b\u843c\u843d\u843e\u843f\u8440\u8441\u8442\u8443\u8444\u8445\u8446\u8447\u8448\u8449\u844a\u844b\u844c\u844d\u844e\u844f\u8450\u8451\u8452\u8453\u8454\u8455\u8456\u8457\u8458\u8459\u845a\u845b\u845c\u845d\u845e\u845f\u8460\u8461\u8462\u8463\u8464\u8465\u8466\u8467\u8468\u8469\u846a\u846b\u846c\u846d\u846e\u846f\u8470\u8471\u8472\u8473\u8474\u8475\u8476\u8477\u8478\u8479\u847a\u847b\u847c\u847d\u847e\u847f\u8480\u8481\u8482\u8483\u8484\u8485\u8486\u8487\u8488\u8489\u848a\u848b\u848c\u848d\u848e\u848f\u8490\u8491\u8492\u8493\u8494\u8495\u8496\u8497\u8498\u8499\u849a\u849b\u849c\u849d\u849e\u849f\u84a0\u84a1\u84a2\u84a3\u84a4\u84a5\u84a6\u84a7\u84a8\u84a9\u84aa\u84ab\u84ac\u84ad\u84ae\u84af\u84b0\u84b1\u84b2\u84b3\u84b4\u84b5\u84b6\u84b7\u84b8\u84b9\u84ba\u84bb\u84bc\u84bd\u84be\u84bf\u84c0\u84c1\u84c2\u84c3\u84c4\u84c5\u84c6\u84c7\u84c8\u84c9\u84ca\u84cb\u84cc\u84cd\u84ce\u84cf\u84d0\u84d1\u84d2\u84d3\u84d4\u84d5\u84d6\u84d7\u84d8\u84d9\u84da\u84db\u84dc\u84dd\u84de\u84df\u84e0\u84e1\u84e2\u84e3\u84e4\u84e5\u84e6\u84e7\u84e8\u84e9\u84ea\u84eb\u84ec\u84ed\u84ee\u84ef\u84f0\u84f1\u84f2\u84f3\u84f4\u84f5\u84f6\u84f7\u84f8\u84f9\u84fa\u84fb\u84fc\u84fd\u84fe\u84ff\u8500\u8501\u8502\u8503\u8504\u8505\u8506\u8507\u8508\u8509\u850a\u850b\u850c\u850d\u850e\u850f\u8510\u8511\u8512\u8513\u8514\u8515\u8516\u8517\u8518\u8519\u851a\u851b\u851c\u851d\u851e\u851f\u8520\u8521\u8522\u8523\u8524\u8525\u8526\u8527\u8528\u8529\u852a\u852b\u852c\u852d\u852e\u852f\u8530\u8531\u8532\u8533\u8534\u8535\u8536\u8537\u8538\u8539\u853a\u853b\u853c\u853d\u853e\u853f\u8540\u8541\u8542\u8543\u8544\u8545\u8546\u8547\u8548\u8549\u854a\u854b\u854c\u854d\u854e\u854f\u8550\u8551\u8552\u8553\u8554\u8555\u8556\u8557\u8558\u8559\u855a\u855b\u855c\u855d\u855e\u855f\u8560\u8561\u8562\u8563\u8564\u8565\u8566\u8567\u8568\u8569\u856a\u856b\u856c\u856d\u856e\u856f\u8570\u8571\u8572\u8573\u8574\u8575\u8576\u8577\u8578\u8579\u857a\u857b\u857c\u857d\u857e\u857f\u8580\u8581\u8582\u8583\u8584\u8585\u8586\u8587\u8588\u8589\u858a\u858b\u858c\u858d\u858e\u858f\u8590\u8591\u8592\u8593\u8594\u8595\u8596\u8597\u8598\u8599\u859a\u859b\u859c\u859d\u859e\u859f\u85a0\u85a1\u85a2\u85a3\u85a4\u85a5\u85a6\u85a7\u85a8\u85a9\u85aa\u85ab\u85ac\u85ad\u85ae\u85af\u85b0\u85b1\u85b2\u85b3\u85b4\u85b5\u85b6\u85b7\u85b8\u85b9\u85ba\u85bb\u85bc\u85bd\u85be\u85bf\u85c0\u85c1\u85c2\u85c3\u85c4\u85c5\u85c6\u85c7\u85c8\u85c9\u85ca\u85cb\u85cc\u85cd\u85ce\u85cf\u85d0\u85d1\u85d2\u85d3\u85d4\u85d5\u85d6\u85d7\u85d8\u85d9\u85da\u85db\u85dc\u85dd\u85de\u85df\u85e0\u85e1\u85e2\u85e3\u85e4\u85e5\u85e6\u85e7\u85e8\u85e9\u85ea\u85eb\u85ec\u85ed\u85ee\u85ef\u85f0\u85f1\u85f2\u85f3\u85f4\u85f5\u85f6\u85f7\u85f8\u85f9\u85fa\u85fb\u85fc\u85fd\u85fe\u85ff\u8600\u8601\u8602\u8603\u8604\u8605\u8606\u8607\u8608\u8609\u860a\u860b\u860c\u860d\u860e\u860f\u8610\u8611\u8612\u8613\u8614\u8615\u8616\u8617\u8618\u8619\u861a\u861b\u861c\u861d\u861e\u861f\u8620\u8621\u8622\u8623\u8624\u8625\u8626\u8627\u8628\u8629\u862a\u862b\u862c\u862d\u862e\u862f\u8630\u8631\u8632\u8633\u8634\u8635\u8636\u8637\u8638\u8639\u863a\u863b\u863c\u863d\u863e\u863f\u8640\u8641\u8642\u8643\u8644\u8645\u8646\u8647\u8648\u8649\u864a\u864b\u864c\u864d\u864e\u864f\u8650\u8651\u8652\u8653\u8654\u8655\u8656\u8657\u8658\u8659\u865a\u865b\u865c\u865d\u865e\u865f\u8660\u8661\u8662\u8663\u8664\u8665\u8666\u8667\u8668\u8669\u866a\u866b\u866c\u866d\u866e\u866f\u8670\u8671\u8672\u8673\u8674\u8675\u8676\u8677\u8678\u8679\u867a\u867b\u867c\u867d\u867e\u867f\u8680\u8681\u8682\u8683\u8684\u8685\u8686\u8687\u8688\u8689\u868a\u868b\u868c\u868d\u868e\u868f\u8690\u8691\u8692\u8693\u8694\u8695\u8696\u8697\u8698\u8699\u869a\u869b\u869c\u869d\u869e\u869f\u86a0\u86a1\u86a2\u86a3\u86a4\u86a5\u86a6\u86a7\u86a8\u86a9\u86aa\u86ab\u86ac\u86ad\u86ae\u86af\u86b0\u86b1\u86b2\u86b3\u86b4\u86b5\u86b6\u86b7\u86b8\u86b9\u86ba\u86bb\u86bc\u86bd\u86be\u86bf\u86c0\u86c1\u86c2\u86c3\u86c4\u86c5\u86c6\u86c7\u86c8\u86c9\u86ca\u86cb\u86cc\u86cd\u86ce\u86cf\u86d0\u86d1\u86d2\u86d3\u86d4\u86d5\u86d6\u86d7\u86d8\u86d9\u86da\u86db\u86dc\u86dd\u86de\u86df\u86e0\u86e1\u86e2\u86e3\u86e4\u86e5\u86e6\u86e7\u86e8\u86e9\u86ea\u86eb\u86ec\u86ed\u86ee\u86ef\u86f0\u86f1\u86f2\u86f3\u86f4\u86f5\u86f6\u86f7\u86f8\u86f9\u86fa\u86fb\u86fc\u86fd\u86fe\u86ff\u8700\u8701\u8702\u8703\u8704\u8705\u8706\u8707\u8708\u8709\u870a\u870b\u870c\u870d\u870e\u870f\u8710\u8711\u8712\u8713\u8714\u8715\u8716\u8717\u8718\u8719\u871a\u871b\u871c\u871d\u871e\u871f\u8720\u8721\u8722\u8723\u8724\u8725\u8726\u8727\u8728\u8729\u872a\u872b\u872c\u872d\u872e\u872f\u8730\u8731\u8732\u8733\u8734\u8735\u8736\u8737\u8738\u8739\u873a\u873b\u873c\u873d\u873e\u873f\u8740\u8741\u8742\u8743\u8744\u8745\u8746\u8747\u8748\u8749\u874a\u874b\u874c\u874d\u874e\u874f\u8750\u8751\u8752\u8753\u8754\u8755\u8756\u8757\u8758\u8759\u875a\u875b\u875c\u875d\u875e\u875f\u8760\u8761\u8762\u8763\u8764\u8765\u8766\u8767\u8768\u8769\u876a\u876b\u876c\u876d\u876e\u876f\u8770\u8771\u8772\u8773\u8774\u8775\u8776\u8777\u8778\u8779\u877a\u877b\u877c\u877d\u877e\u877f\u8780\u8781\u8782\u8783\u8784\u8785\u8786\u8787\u8788\u8789\u878a\u878b\u878c\u878d\u878e\u878f\u8790\u8791\u8792\u8793\u8794\u8795\u8796\u8797\u8798\u8799\u879a\u879b\u879c\u879d\u879e\u879f\u87a0\u87a1\u87a2\u87a3\u87a4\u87a5\u87a6\u87a7\u87a8\u87a9\u87aa\u87ab\u87ac\u87ad\u87ae\u87af\u87b0\u87b1\u87b2\u87b3\u87b4\u87b5\u87b6\u87b7\u87b8\u87b9\u87ba\u87bb\u87bc\u87bd\u87be\u87bf\u87c0\u87c1\u87c2\u87c3\u87c4\u87c5\u87c6\u87c7\u87c8\u87c9\u87ca\u87cb\u87cc\u87cd\u87ce\u87cf\u87d0\u87d1\u87d2\u87d3\u87d4\u87d5\u87d6\u87d7\u87d8\u87d9\u87da\u87db\u87dc\u87dd\u87de\u87df\u87e0\u87e1\u87e2\u87e3\u87e4\u87e5\u87e6\u87e7\u87e8\u87e9\u87ea\u87eb\u87ec\u87ed\u87ee\u87ef\u87f0\u87f1\u87f2\u87f3\u87f4\u87f5\u87f6\u87f7\u87f8\u87f9\u87fa\u87fb\u87fc\u87fd\u87fe\u87ff\u8800\u8801\u8802\u8803\u8804\u8805\u8806\u8807\u8808\u8809\u880a\u880b\u880c\u880d\u880e\u880f\u8810\u8811\u8812\u8813\u8814\u8815\u8816\u8817\u8818\u8819\u881a\u881b\u881c\u881d\u881e\u881f\u8820\u8821\u8822\u8823\u8824\u8825\u8826\u8827\u8828\u8829\u882a\u882b\u882c\u882d\u882e\u882f\u8830\u8831\u8832\u8833\u8834\u8835\u8836\u8837\u8838\u8839\u883a\u883b\u883c\u883d\u883e\u883f\u8840\u8841\u8842\u8843\u8844\u8845\u8846\u8847\u8848\u8849\u884a\u884b\u884c\u884d\u884e\u884f\u8850\u8851\u8852\u8853\u8854\u8855\u8856\u8857\u8858\u8859\u885a\u885b\u885c\u885d\u885e\u885f\u8860\u8861\u8862\u8863\u8864\u8865\u8866\u8867\u8868\u8869\u886a\u886b\u886c\u886d\u886e\u886f\u8870\u8871\u8872\u8873\u8874\u8875\u8876\u8877\u8878\u8879\u887a\u887b\u887c\u887d\u887e\u887f\u8880\u8881\u8882\u8883\u8884\u8885\u8886\u8887\u8888\u8889\u888a\u888b\u888c\u888d\u888e\u888f\u8890\u8891\u8892\u8893\u8894\u8895\u8896\u8897\u8898\u8899\u889a\u889b\u889c\u889d\u889e\u889f\u88a0\u88a1\u88a2\u88a3\u88a4\u88a5\u88a6\u88a7\u88a8\u88a9\u88aa\u88ab\u88ac\u88ad\u88ae\u88af\u88b0\u88b1\u88b2\u88b3\u88b4\u88b5\u88b6\u88b7\u88b8\u88b9\u88ba\u88bb\u88bc\u88bd\u88be\u88bf\u88c0\u88c1\u88c2\u88c3\u88c4\u88c5\u88c6\u88c7\u88c8\u88c9\u88ca\u88cb\u88cc\u88cd\u88ce\u88cf\u88d0\u88d1\u88d2\u88d3\u88d4\u88d5\u88d6\u88d7\u88d8\u88d9\u88da\u88db\u88dc\u88dd\u88de\u88df\u88e0\u88e1\u88e2\u88e3\u88e4\u88e5\u88e6\u88e7\u88e8\u88e9\u88ea\u88eb\u88ec\u88ed\u88ee\u88ef\u88f0\u88f1\u88f2\u88f3\u88f4\u88f5\u88f6\u88f7\u88f8\u88f9\u88fa\u88fb\u88fc\u88fd\u88fe\u88ff\u8900\u8901\u8902\u8903\u8904\u8905\u8906\u8907\u8908\u8909\u890a\u890b\u890c\u890d\u890e\u890f\u8910\u8911\u8912\u8913\u8914\u8915\u8916\u8917\u8918\u8919\u891a\u891b\u891c\u891d\u891e\u891f\u8920\u8921\u8922\u8923\u8924\u8925\u8926\u8927\u8928\u8929\u892a\u892b\u892c\u892d\u892e\u892f\u8930\u8931\u8932\u8933\u8934\u8935\u8936\u8937\u8938\u8939\u893a\u893b\u893c\u893d\u893e\u893f\u8940\u8941\u8942\u8943\u8944\u8945\u8946\u8947\u8948\u8949\u894a\u894b\u894c\u894d\u894e\u894f\u8950\u8951\u8952\u8953\u8954\u8955\u8956\u8957\u8958\u8959\u895a\u895b\u895c\u895d\u895e\u895f\u8960\u8961\u8962\u8963\u8964\u8965\u8966\u8967\u8968\u8969\u896a\u896b\u896c\u896d\u896e\u896f\u8970\u8971\u8972\u8973\u8974\u8975\u8976\u8977\u8978\u8979\u897a\u897b\u897c\u897d\u897e\u897f\u8980\u8981\u8982\u8983\u8984\u8985\u8986\u8987\u8988\u8989\u898a\u898b\u898c\u898d\u898e\u898f\u8990\u8991\u8992\u8993\u8994\u8995\u8996\u8997\u8998\u8999\u899a\u899b\u899c\u899d\u899e\u899f\u89a0\u89a1\u89a2\u89a3\u89a4\u89a5\u89a6\u89a7\u89a8\u89a9\u89aa\u89ab\u89ac\u89ad\u89ae\u89af\u89b0\u89b1\u89b2\u89b3\u89b4\u89b5\u89b6\u89b7\u89b8\u89b9\u89ba\u89bb\u89bc\u89bd\u89be\u89bf\u89c0\u89c1\u89c2\u89c3\u89c4\u89c5\u89c6\u89c7\u89c8\u89c9\u89ca\u89cb\u89cc\u89cd\u89ce\u89cf\u89d0\u89d1\u89d2\u89d3\u89d4\u89d5\u89d6\u89d7\u89d8\u89d9\u89da\u89db\u89dc\u89dd\u89de\u89df\u89e0\u89e1\u89e2\u89e3\u89e4\u89e5\u89e6\u89e7\u89e8\u89e9\u89ea\u89eb\u89ec\u89ed\u89ee\u89ef\u89f0\u89f1\u89f2\u89f3\u89f4\u89f5\u89f6\u89f7\u89f8\u89f9\u89fa\u89fb\u89fc\u89fd\u89fe\u89ff\u8a00\u8a01\u8a02\u8a03\u8a04\u8a05\u8a06\u8a07\u8a08\u8a09\u8a0a\u8a0b\u8a0c\u8a0d\u8a0e\u8a0f\u8a10\u8a11\u8a12\u8a13\u8a14\u8a15\u8a16\u8a17\u8a18\u8a19\u8a1a\u8a1b\u8a1c\u8a1d\u8a1e\u8a1f\u8a20\u8a21\u8a22\u8a23\u8a24\u8a25\u8a26\u8a27\u8a28\u8a29\u8a2a\u8a2b\u8a2c\u8a2d\u8a2e\u8a2f\u8a30\u8a31\u8a32\u8a33\u8a34\u8a35\u8a36\u8a37\u8a38\u8a39\u8a3a\u8a3b\u8a3c\u8a3d\u8a3e\u8a3f\u8a40\u8a41\u8a42\u8a43\u8a44\u8a45\u8a46\u8a47\u8a48\u8a49\u8a4a\u8a4b\u8a4c\u8a4d\u8a4e\u8a4f\u8a50\u8a51\u8a52\u8a53\u8a54\u8a55\u8a56\u8a57\u8a58\u8a59\u8a5a\u8a5b\u8a5c\u8a5d\u8a5e\u8a5f\u8a60\u8a61\u8a62\u8a63\u8a64\u8a65\u8a66\u8a67\u8a68\u8a69\u8a6a\u8a6b\u8a6c\u8a6d\u8a6e\u8a6f\u8a70\u8a71\u8a72\u8a73\u8a74\u8a75\u8a76\u8a77\u8a78\u8a79\u8a7a\u8a7b\u8a7c\u8a7d\u8a7e\u8a7f\u8a80\u8a81\u8a82\u8a83\u8a84\u8a85\u8a86\u8a87\u8a88\u8a89\u8a8a\u8a8b\u8a8c\u8a8d\u8a8e\u8a8f\u8a90\u8a91\u8a92\u8a93\u8a94\u8a95\u8a96\u8a97\u8a98\u8a99\u8a9a\u8a9b\u8a9c\u8a9d\u8a9e\u8a9f\u8aa0\u8aa1\u8aa2\u8aa3\u8aa4\u8aa5\u8aa6\u8aa7\u8aa8\u8aa9\u8aaa\u8aab\u8aac\u8aad\u8aae\u8aaf\u8ab0\u8ab1\u8ab2\u8ab3\u8ab4\u8ab5\u8ab6\u8ab7\u8ab8\u8ab9\u8aba\u8abb\u8abc\u8abd\u8abe\u8abf\u8ac0\u8ac1\u8ac2\u8ac3\u8ac4\u8ac5\u8ac6\u8ac7\u8ac8\u8ac9\u8aca\u8acb\u8acc\u8acd\u8ace\u8acf\u8ad0\u8ad1\u8ad2\u8ad3\u8ad4\u8ad5\u8ad6\u8ad7\u8ad8\u8ad9\u8ada\u8adb\u8adc\u8add\u8ade\u8adf\u8ae0\u8ae1\u8ae2\u8ae3\u8ae4\u8ae5\u8ae6\u8ae7\u8ae8\u8ae9\u8aea\u8aeb\u8aec\u8aed\u8aee\u8aef\u8af0\u8af1\u8af2\u8af3\u8af4\u8af5\u8af6\u8af7\u8af8\u8af9\u8afa\u8afb\u8afc\u8afd\u8afe\u8aff\u8b00\u8b01\u8b02\u8b03\u8b04\u8b05\u8b06\u8b07\u8b08\u8b09\u8b0a\u8b0b\u8b0c\u8b0d\u8b0e\u8b0f\u8b10\u8b11\u8b12\u8b13\u8b14\u8b15\u8b16\u8b17\u8b18\u8b19\u8b1a\u8b1b\u8b1c\u8b1d\u8b1e\u8b1f\u8b20\u8b21\u8b22\u8b23\u8b24\u8b25\u8b26\u8b27\u8b28\u8b29\u8b2a\u8b2b\u8b2c\u8b2d\u8b2e\u8b2f\u8b30\u8b31\u8b32\u8b33\u8b34\u8b35\u8b36\u8b37\u8b38\u8b39\u8b3a\u8b3b\u8b3c\u8b3d\u8b3e\u8b3f\u8b40\u8b41\u8b42\u8b43\u8b44\u8b45\u8b46\u8b47\u8b48\u8b49\u8b4a\u8b4b\u8b4c\u8b4d\u8b4e\u8b4f\u8b50\u8b51\u8b52\u8b53\u8b54\u8b55\u8b56\u8b57\u8b58\u8b59\u8b5a\u8b5b\u8b5c\u8b5d\u8b5e\u8b5f\u8b60\u8b61\u8b62\u8b63\u8b64\u8b65\u8b66\u8b67\u8b68\u8b69\u8b6a\u8b6b\u8b6c\u8b6d\u8b6e\u8b6f\u8b70\u8b71\u8b72\u8b73\u8b74\u8b75\u8b76\u8b77\u8b78\u8b79\u8b7a\u8b7b\u8b7c\u8b7d\u8b7e\u8b7f\u8b80\u8b81\u8b82\u8b83\u8b84\u8b85\u8b86\u8b87\u8b88\u8b89\u8b8a\u8b8b\u8b8c\u8b8d\u8b8e\u8b8f\u8b90\u8b91\u8b92\u8b93\u8b94\u8b95\u8b96\u8b97\u8b98\u8b99\u8b9a\u8b9b\u8b9c\u8b9d\u8b9e\u8b9f\u8ba0\u8ba1\u8ba2\u8ba3\u8ba4\u8ba5\u8ba6\u8ba7\u8ba8\u8ba9\u8baa\u8bab\u8bac\u8bad\u8bae\u8baf\u8bb0\u8bb1\u8bb2\u8bb3\u8bb4\u8bb5\u8bb6\u8bb7\u8bb8\u8bb9\u8bba\u8bbb\u8bbc\u8bbd\u8bbe\u8bbf\u8bc0\u8bc1\u8bc2\u8bc3\u8bc4\u8bc5\u8bc6\u8bc7\u8bc8\u8bc9\u8bca\u8bcb\u8bcc\u8bcd\u8bce\u8bcf\u8bd0\u8bd1\u8bd2\u8bd3\u8bd4\u8bd5\u8bd6\u8bd7\u8bd8\u8bd9\u8bda\u8bdb\u8bdc\u8bdd\u8bde\u8bdf\u8be0\u8be1\u8be2\u8be3\u8be4\u8be5\u8be6\u8be7\u8be8\u8be9\u8bea\u8beb\u8bec\u8bed\u8bee\u8bef\u8bf0\u8bf1\u8bf2\u8bf3\u8bf4\u8bf5\u8bf6\u8bf7\u8bf8\u8bf9\u8bfa\u8bfb\u8bfc\u8bfd\u8bfe\u8bff\u8c00\u8c01\u8c02\u8c03\u8c04\u8c05\u8c06\u8c07\u8c08\u8c09\u8c0a\u8c0b\u8c0c\u8c0d\u8c0e\u8c0f\u8c10\u8c11\u8c12\u8c13\u8c14\u8c15\u8c16\u8c17\u8c18\u8c19\u8c1a\u8c1b\u8c1c\u8c1d\u8c1e\u8c1f\u8c20\u8c21\u8c22\u8c23\u8c24\u8c25\u8c26\u8c27\u8c28\u8c29\u8c2a\u8c2b\u8c2c\u8c2d\u8c2e\u8c2f\u8c30\u8c31\u8c32\u8c33\u8c34\u8c35\u8c36\u8c37\u8c38\u8c39\u8c3a\u8c3b\u8c3c\u8c3d\u8c3e\u8c3f\u8c40\u8c41\u8c42\u8c43\u8c44\u8c45\u8c46\u8c47\u8c48\u8c49\u8c4a\u8c4b\u8c4c\u8c4d\u8c4e\u8c4f\u8c50\u8c51\u8c52\u8c53\u8c54\u8c55\u8c56\u8c57\u8c58\u8c59\u8c5a\u8c5b\u8c5c\u8c5d\u8c5e\u8c5f\u8c60\u8c61\u8c62\u8c63\u8c64\u8c65\u8c66\u8c67\u8c68\u8c69\u8c6a\u8c6b\u8c6c\u8c6d\u8c6e\u8c6f\u8c70\u8c71\u8c72\u8c73\u8c74\u8c75\u8c76\u8c77\u8c78\u8c79\u8c7a\u8c7b\u8c7c\u8c7d\u8c7e\u8c7f\u8c80\u8c81\u8c82\u8c83\u8c84\u8c85\u8c86\u8c87\u8c88\u8c89\u8c8a\u8c8b\u8c8c\u8c8d\u8c8e\u8c8f\u8c90\u8c91\u8c92\u8c93\u8c94\u8c95\u8c96\u8c97\u8c98\u8c99\u8c9a\u8c9b\u8c9c\u8c9d\u8c9e\u8c9f\u8ca0\u8ca1\u8ca2\u8ca3\u8ca4\u8ca5\u8ca6\u8ca7\u8ca8\u8ca9\u8caa\u8cab\u8cac\u8cad\u8cae\u8caf\u8cb0\u8cb1\u8cb2\u8cb3\u8cb4\u8cb5\u8cb6\u8cb7\u8cb8\u8cb9\u8cba\u8cbb\u8cbc\u8cbd\u8cbe\u8cbf\u8cc0\u8cc1\u8cc2\u8cc3\u8cc4\u8cc5\u8cc6\u8cc7\u8cc8\u8cc9\u8cca\u8ccb\u8ccc\u8ccd\u8cce\u8ccf\u8cd0\u8cd1\u8cd2\u8cd3\u8cd4\u8cd5\u8cd6\u8cd7\u8cd8\u8cd9\u8cda\u8cdb\u8cdc\u8cdd\u8cde\u8cdf\u8ce0\u8ce1\u8ce2\u8ce3\u8ce4\u8ce5\u8ce6\u8ce7\u8ce8\u8ce9\u8cea\u8ceb\u8cec\u8ced\u8cee\u8cef\u8cf0\u8cf1\u8cf2\u8cf3\u8cf4\u8cf5\u8cf6\u8cf7\u8cf8\u8cf9\u8cfa\u8cfb\u8cfc\u8cfd\u8cfe\u8cff\u8d00\u8d01\u8d02\u8d03\u8d04\u8d05\u8d06\u8d07\u8d08\u8d09\u8d0a\u8d0b\u8d0c\u8d0d\u8d0e\u8d0f\u8d10\u8d11\u8d12\u8d13\u8d14\u8d15\u8d16\u8d17\u8d18\u8d19\u8d1a\u8d1b\u8d1c\u8d1d\u8d1e\u8d1f\u8d20\u8d21\u8d22\u8d23\u8d24\u8d25\u8d26\u8d27\u8d28\u8d29\u8d2a\u8d2b\u8d2c\u8d2d\u8d2e\u8d2f\u8d30\u8d31\u8d32\u8d33\u8d34\u8d35\u8d36\u8d37\u8d38\u8d39\u8d3a\u8d3b\u8d3c\u8d3d\u8d3e\u8d3f\u8d40\u8d41\u8d42\u8d43\u8d44\u8d45\u8d46\u8d47\u8d48\u8d49\u8d4a\u8d4b\u8d4c\u8d4d\u8d4e\u8d4f\u8d50\u8d51\u8d52\u8d53\u8d54\u8d55\u8d56\u8d57\u8d58\u8d59\u8d5a\u8d5b\u8d5c\u8d5d\u8d5e\u8d5f\u8d60\u8d61\u8d62\u8d63\u8d64\u8d65\u8d66\u8d67\u8d68\u8d69\u8d6a\u8d6b\u8d6c\u8d6d\u8d6e\u8d6f\u8d70\u8d71\u8d72\u8d73\u8d74\u8d75\u8d76\u8d77\u8d78\u8d79\u8d7a\u8d7b\u8d7c\u8d7d\u8d7e\u8d7f\u8d80\u8d81\u8d82\u8d83\u8d84\u8d85\u8d86\u8d87\u8d88\u8d89\u8d8a\u8d8b\u8d8c\u8d8d\u8d8e\u8d8f\u8d90\u8d91\u8d92\u8d93\u8d94\u8d95\u8d96\u8d97\u8d98\u8d99\u8d9a\u8d9b\u8d9c\u8d9d\u8d9e\u8d9f\u8da0\u8da1\u8da2\u8da3\u8da4\u8da5\u8da6\u8da7\u8da8\u8da9\u8daa\u8dab\u8dac\u8dad\u8dae\u8daf\u8db0\u8db1\u8db2\u8db3\u8db4\u8db5\u8db6\u8db7\u8db8\u8db9\u8dba\u8dbb\u8dbc\u8dbd\u8dbe\u8dbf\u8dc0\u8dc1\u8dc2\u8dc3\u8dc4\u8dc5\u8dc6\u8dc7\u8dc8\u8dc9\u8dca\u8dcb\u8dcc\u8dcd\u8dce\u8dcf\u8dd0\u8dd1\u8dd2\u8dd3\u8dd4\u8dd5\u8dd6\u8dd7\u8dd8\u8dd9\u8dda\u8ddb\u8ddc\u8ddd\u8dde\u8ddf\u8de0\u8de1\u8de2\u8de3\u8de4\u8de5\u8de6\u8de7\u8de8\u8de9\u8dea\u8deb\u8dec\u8ded\u8dee\u8def\u8df0\u8df1\u8df2\u8df3\u8df4\u8df5\u8df6\u8df7\u8df8\u8df9\u8dfa\u8dfb\u8dfc\u8dfd\u8dfe\u8dff\u8e00\u8e01\u8e02\u8e03\u8e04\u8e05\u8e06\u8e07\u8e08\u8e09\u8e0a\u8e0b\u8e0c\u8e0d\u8e0e\u8e0f\u8e10\u8e11\u8e12\u8e13\u8e14\u8e15\u8e16\u8e17\u8e18\u8e19\u8e1a\u8e1b\u8e1c\u8e1d\u8e1e\u8e1f\u8e20\u8e21\u8e22\u8e23\u8e24\u8e25\u8e26\u8e27\u8e28\u8e29\u8e2a\u8e2b\u8e2c\u8e2d\u8e2e\u8e2f\u8e30\u8e31\u8e32\u8e33\u8e34\u8e35\u8e36\u8e37\u8e38\u8e39\u8e3a\u8e3b\u8e3c\u8e3d\u8e3e\u8e3f\u8e40\u8e41\u8e42\u8e43\u8e44\u8e45\u8e46\u8e47\u8e48\u8e49\u8e4a\u8e4b\u8e4c\u8e4d\u8e4e\u8e4f\u8e50\u8e51\u8e52\u8e53\u8e54\u8e55\u8e56\u8e57\u8e58\u8e59\u8e5a\u8e5b\u8e5c\u8e5d\u8e5e\u8e5f\u8e60\u8e61\u8e62\u8e63\u8e64\u8e65\u8e66\u8e67\u8e68\u8e69\u8e6a\u8e6b\u8e6c\u8e6d\u8e6e\u8e6f\u8e70\u8e71\u8e72\u8e73\u8e74\u8e75\u8e76\u8e77\u8e78\u8e79\u8e7a\u8e7b\u8e7c\u8e7d\u8e7e\u8e7f\u8e80\u8e81\u8e82\u8e83\u8e84\u8e85\u8e86\u8e87\u8e88\u8e89\u8e8a\u8e8b\u8e8c\u8e8d\u8e8e\u8e8f\u8e90\u8e91\u8e92\u8e93\u8e94\u8e95\u8e96\u8e97\u8e98\u8e99\u8e9a\u8e9b\u8e9c\u8e9d\u8e9e\u8e9f\u8ea0\u8ea1\u8ea2\u8ea3\u8ea4\u8ea5\u8ea6\u8ea7\u8ea8\u8ea9\u8eaa\u8eab\u8eac\u8ead\u8eae\u8eaf\u8eb0\u8eb1\u8eb2\u8eb3\u8eb4\u8eb5\u8eb6\u8eb7\u8eb8\u8eb9\u8eba\u8ebb\u8ebc\u8ebd\u8ebe\u8ebf\u8ec0\u8ec1\u8ec2\u8ec3\u8ec4\u8ec5\u8ec6\u8ec7\u8ec8\u8ec9\u8eca\u8ecb\u8ecc\u8ecd\u8ece\u8ecf\u8ed0\u8ed1\u8ed2\u8ed3\u8ed4\u8ed5\u8ed6\u8ed7\u8ed8\u8ed9\u8eda\u8edb\u8edc\u8edd\u8ede\u8edf\u8ee0\u8ee1\u8ee2\u8ee3\u8ee4\u8ee5\u8ee6\u8ee7\u8ee8\u8ee9\u8eea\u8eeb\u8eec\u8eed\u8eee\u8eef\u8ef0\u8ef1\u8ef2\u8ef3\u8ef4\u8ef5\u8ef6\u8ef7\u8ef8\u8ef9\u8efa\u8efb\u8efc\u8efd\u8efe\u8eff\u8f00\u8f01\u8f02\u8f03\u8f04\u8f05\u8f06\u8f07\u8f08\u8f09\u8f0a\u8f0b\u8f0c\u8f0d\u8f0e\u8f0f\u8f10\u8f11\u8f12\u8f13\u8f14\u8f15\u8f16\u8f17\u8f18\u8f19\u8f1a\u8f1b\u8f1c\u8f1d\u8f1e\u8f1f\u8f20\u8f21\u8f22\u8f23\u8f24\u8f25\u8f26\u8f27\u8f28\u8f29\u8f2a\u8f2b\u8f2c\u8f2d\u8f2e\u8f2f\u8f30\u8f31\u8f32\u8f33\u8f34\u8f35\u8f36\u8f37\u8f38\u8f39\u8f3a\u8f3b\u8f3c\u8f3d\u8f3e\u8f3f\u8f40\u8f41\u8f42\u8f43\u8f44\u8f45\u8f46\u8f47\u8f48\u8f49\u8f4a\u8f4b\u8f4c\u8f4d\u8f4e\u8f4f\u8f50\u8f51\u8f52\u8f53\u8f54\u8f55\u8f56\u8f57\u8f58\u8f59\u8f5a\u8f5b\u8f5c\u8f5d\u8f5e\u8f5f\u8f60\u8f61\u8f62\u8f63\u8f64\u8f65\u8f66\u8f67\u8f68\u8f69\u8f6a\u8f6b\u8f6c\u8f6d\u8f6e\u8f6f\u8f70\u8f71\u8f72\u8f73\u8f74\u8f75\u8f76\u8f77\u8f78\u8f79\u8f7a\u8f7b\u8f7c\u8f7d\u8f7e\u8f7f\u8f80\u8f81\u8f82\u8f83\u8f84\u8f85\u8f86\u8f87\u8f88\u8f89\u8f8a\u8f8b\u8f8c\u8f8d\u8f8e\u8f8f\u8f90\u8f91\u8f92\u8f93\u8f94\u8f95\u8f96\u8f97\u8f98\u8f99\u8f9a\u8f9b\u8f9c\u8f9d\u8f9e\u8f9f\u8fa0\u8fa1\u8fa2\u8fa3\u8fa4\u8fa5\u8fa6\u8fa7\u8fa8\u8fa9\u8faa\u8fab\u8fac\u8fad\u8fae\u8faf\u8fb0\u8fb1\u8fb2\u8fb3\u8fb4\u8fb5\u8fb6\u8fb7\u8fb8\u8fb9\u8fba\u8fbb\u8fbc\u8fbd\u8fbe\u8fbf\u8fc0\u8fc1\u8fc2\u8fc3\u8fc4\u8fc5\u8fc6\u8fc7\u8fc8\u8fc9\u8fca\u8fcb\u8fcc\u8fcd\u8fce\u8fcf\u8fd0\u8fd1\u8fd2\u8fd3\u8fd4\u8fd5\u8fd6\u8fd7\u8fd8\u8fd9\u8fda\u8fdb\u8fdc\u8fdd\u8fde\u8fdf\u8fe0\u8fe1\u8fe2\u8fe3\u8fe4\u8fe5\u8fe6\u8fe7\u8fe8\u8fe9\u8fea\u8feb\u8fec\u8fed\u8fee\u8fef\u8ff0\u8ff1\u8ff2\u8ff3\u8ff4\u8ff5\u8ff6\u8ff7\u8ff8\u8ff9\u8ffa\u8ffb\u8ffc\u8ffd\u8ffe\u8fff\u9000\u9001\u9002\u9003\u9004\u9005\u9006\u9007\u9008\u9009\u900a\u900b\u900c\u900d\u900e\u900f\u9010\u9011\u9012\u9013\u9014\u9015\u9016\u9017\u9018\u9019\u901a\u901b\u901c\u901d\u901e\u901f\u9020\u9021\u9022\u9023\u9024\u9025\u9026\u9027\u9028\u9029\u902a\u902b\u902c\u902d\u902e\u902f\u9030\u9031\u9032\u9033\u9034\u9035\u9036\u9037\u9038\u9039\u903a\u903b\u903c\u903d\u903e\u903f\u9040\u9041\u9042\u9043\u9044\u9045\u9046\u9047\u9048\u9049\u904a\u904b\u904c\u904d\u904e\u904f\u9050\u9051\u9052\u9053\u9054\u9055\u9056\u9057\u9058\u9059\u905a\u905b\u905c\u905d\u905e\u905f\u9060\u9061\u9062\u9063\u9064\u9065\u9066\u9067\u9068\u9069\u906a\u906b\u906c\u906d\u906e\u906f\u9070\u9071\u9072\u9073\u9074\u9075\u9076\u9077\u9078\u9079\u907a\u907b\u907c\u907d\u907e\u907f\u9080\u9081\u9082\u9083\u9084\u9085\u9086\u9087\u9088\u9089\u908a\u908b\u908c\u908d\u908e\u908f\u9090\u9091\u9092\u9093\u9094\u9095\u9096\u9097\u9098\u9099\u909a\u909b\u909c\u909d\u909e\u909f\u90a0\u90a1\u90a2\u90a3\u90a4\u90a5\u90a6\u90a7\u90a8\u90a9\u90aa\u90ab\u90ac\u90ad\u90ae\u90af\u90b0\u90b1\u90b2\u90b3\u90b4\u90b5\u90b6\u90b7\u90b8\u90b9\u90ba\u90bb\u90bc\u90bd\u90be\u90bf\u90c0\u90c1\u90c2\u90c3\u90c4\u90c5\u90c6\u90c7\u90c8\u90c9\u90ca\u90cb\u90cc\u90cd\u90ce\u90cf\u90d0\u90d1\u90d2\u90d3\u90d4\u90d5\u90d6\u90d7\u90d8\u90d9\u90da\u90db\u90dc\u90dd\u90de\u90df\u90e0\u90e1\u90e2\u90e3\u90e4\u90e5\u90e6\u90e7\u90e8\u90e9\u90ea\u90eb\u90ec\u90ed\u90ee\u90ef\u90f0\u90f1\u90f2\u90f3\u90f4\u90f5\u90f6\u90f7\u90f8\u90f9\u90fa\u90fb\u90fc\u90fd\u90fe\u90ff\u9100\u9101\u9102\u9103\u9104\u9105\u9106\u9107\u9108\u9109\u910a\u910b\u910c\u910d\u910e\u910f\u9110\u9111\u9112\u9113\u9114\u9115\u9116\u9117\u9118\u9119\u911a\u911b\u911c\u911d\u911e\u911f\u9120\u9121\u9122\u9123\u9124\u9125\u9126\u9127\u9128\u9129\u912a\u912b\u912c\u912d\u912e\u912f\u9130\u9131\u9132\u9133\u9134\u9135\u9136\u9137\u9138\u9139\u913a\u913b\u913c\u913d\u913e\u913f\u9140\u9141\u9142\u9143\u9144\u9145\u9146\u9147\u9148\u9149\u914a\u914b\u914c\u914d\u914e\u914f\u9150\u9151\u9152\u9153\u9154\u9155\u9156\u9157\u9158\u9159\u915a\u915b\u915c\u915d\u915e\u915f\u9160\u9161\u9162\u9163\u9164\u9165\u9166\u9167\u9168\u9169\u916a\u916b\u916c\u916d\u916e\u916f\u9170\u9171\u9172\u9173\u9174\u9175\u9176\u9177\u9178\u9179\u917a\u917b\u917c\u917d\u917e\u917f\u9180\u9181\u9182\u9183\u9184\u9185\u9186\u9187\u9188\u9189\u918a\u918b\u918c\u918d\u918e\u918f\u9190\u9191\u9192\u9193\u9194\u9195\u9196\u9197\u9198\u9199\u919a\u919b\u919c\u919d\u919e\u919f\u91a0\u91a1\u91a2\u91a3\u91a4\u91a5\u91a6\u91a7\u91a8\u91a9\u91aa\u91ab\u91ac\u91ad\u91ae\u91af\u91b0\u91b1\u91b2\u91b3\u91b4\u91b5\u91b6\u91b7\u91b8\u91b9\u91ba\u91bb\u91bc\u91bd\u91be\u91bf\u91c0\u91c1\u91c2\u91c3\u91c4\u91c5\u91c6\u91c7\u91c8\u91c9\u91ca\u91cb\u91cc\u91cd\u91ce\u91cf\u91d0\u91d1\u91d2\u91d3\u91d4\u91d5\u91d6\u91d7\u91d8\u91d9\u91da\u91db\u91dc\u91dd\u91de\u91df\u91e0\u91e1\u91e2\u91e3\u91e4\u91e5\u91e6\u91e7\u91e8\u91e9\u91ea\u91eb\u91ec\u91ed\u91ee\u91ef\u91f0\u91f1\u91f2\u91f3\u91f4\u91f5\u91f6\u91f7\u91f8\u91f9\u91fa\u91fb\u91fc\u91fd\u91fe\u91ff\u9200\u9201\u9202\u9203\u9204\u9205\u9206\u9207\u9208\u9209\u920a\u920b\u920c\u920d\u920e\u920f\u9210\u9211\u9212\u9213\u9214\u9215\u9216\u9217\u9218\u9219\u921a\u921b\u921c\u921d\u921e\u921f\u9220\u9221\u9222\u9223\u9224\u9225\u9226\u9227\u9228\u9229\u922a\u922b\u922c\u922d\u922e\u922f\u9230\u9231\u9232\u9233\u9234\u9235\u9236\u9237\u9238\u9239\u923a\u923b\u923c\u923d\u923e\u923f\u9240\u9241\u9242\u9243\u9244\u9245\u9246\u9247\u9248\u9249\u924a\u924b\u924c\u924d\u924e\u924f\u9250\u9251\u9252\u9253\u9254\u9255\u9256\u9257\u9258\u9259\u925a\u925b\u925c\u925d\u925e\u925f\u9260\u9261\u9262\u9263\u9264\u9265\u9266\u9267\u9268\u9269\u926a\u926b\u926c\u926d\u926e\u926f\u9270\u9271\u9272\u9273\u9274\u9275\u9276\u9277\u9278\u9279\u927a\u927b\u927c\u927d\u927e\u927f\u9280\u9281\u9282\u9283\u9284\u9285\u9286\u9287\u9288\u9289\u928a\u928b\u928c\u928d\u928e\u928f\u9290\u9291\u9292\u9293\u9294\u9295\u9296\u9297\u9298\u9299\u929a\u929b\u929c\u929d\u929e\u929f\u92a0\u92a1\u92a2\u92a3\u92a4\u92a5\u92a6\u92a7\u92a8\u92a9\u92aa\u92ab\u92ac\u92ad\u92ae\u92af\u92b0\u92b1\u92b2\u92b3\u92b4\u92b5\u92b6\u92b7\u92b8\u92b9\u92ba\u92bb\u92bc\u92bd\u92be\u92bf\u92c0\u92c1\u92c2\u92c3\u92c4\u92c5\u92c6\u92c7\u92c8\u92c9\u92ca\u92cb\u92cc\u92cd\u92ce\u92cf\u92d0\u92d1\u92d2\u92d3\u92d4\u92d5\u92d6\u92d7\u92d8\u92d9\u92da\u92db\u92dc\u92dd\u92de\u92df\u92e0\u92e1\u92e2\u92e3\u92e4\u92e5\u92e6\u92e7\u92e8\u92e9\u92ea\u92eb\u92ec\u92ed\u92ee\u92ef\u92f0\u92f1\u92f2\u92f3\u92f4\u92f5\u92f6\u92f7\u92f8\u92f9\u92fa\u92fb\u92fc\u92fd\u92fe\u92ff\u9300\u9301\u9302\u9303\u9304\u9305\u9306\u9307\u9308\u9309\u930a\u930b\u930c\u930d\u930e\u930f\u9310\u9311\u9312\u9313\u9314\u9315\u9316\u9317\u9318\u9319\u931a\u931b\u931c\u931d\u931e\u931f\u9320\u9321\u9322\u9323\u9324\u9325\u9326\u9327\u9328\u9329\u932a\u932b\u932c\u932d\u932e\u932f\u9330\u9331\u9332\u9333\u9334\u9335\u9336\u9337\u9338\u9339\u933a\u933b\u933c\u933d\u933e\u933f\u9340\u9341\u9342\u9343\u9344\u9345\u9346\u9347\u9348\u9349\u934a\u934b\u934c\u934d\u934e\u934f\u9350\u9351\u9352\u9353\u9354\u9355\u9356\u9357\u9358\u9359\u935a\u935b\u935c\u935d\u935e\u935f\u9360\u9361\u9362\u9363\u9364\u9365\u9366\u9367\u9368\u9369\u936a\u936b\u936c\u936d\u936e\u936f\u9370\u9371\u9372\u9373\u9374\u9375\u9376\u9377\u9378\u9379\u937a\u937b\u937c\u937d\u937e\u937f\u9380\u9381\u9382\u9383\u9384\u9385\u9386\u9387\u9388\u9389\u938a\u938b\u938c\u938d\u938e\u938f\u9390\u9391\u9392\u9393\u9394\u9395\u9396\u9397\u9398\u9399\u939a\u939b\u939c\u939d\u939e\u939f\u93a0\u93a1\u93a2\u93a3\u93a4\u93a5\u93a6\u93a7\u93a8\u93a9\u93aa\u93ab\u93ac\u93ad\u93ae\u93af\u93b0\u93b1\u93b2\u93b3\u93b4\u93b5\u93b6\u93b7\u93b8\u93b9\u93ba\u93bb\u93bc\u93bd\u93be\u93bf\u93c0\u93c1\u93c2\u93c3\u93c4\u93c5\u93c6\u93c7\u93c8\u93c9\u93ca\u93cb\u93cc\u93cd\u93ce\u93cf\u93d0\u93d1\u93d2\u93d3\u93d4\u93d5\u93d6\u93d7\u93d8\u93d9\u93da\u93db\u93dc\u93dd\u93de\u93df\u93e0\u93e1\u93e2\u93e3\u93e4\u93e5\u93e6\u93e7\u93e8\u93e9\u93ea\u93eb\u93ec\u93ed\u93ee\u93ef\u93f0\u93f1\u93f2\u93f3\u93f4\u93f5\u93f6\u93f7\u93f8\u93f9\u93fa\u93fb\u93fc\u93fd\u93fe\u93ff\u9400\u9401\u9402\u9403\u9404\u9405\u9406\u9407\u9408\u9409\u940a\u940b\u940c\u940d\u940e\u940f\u9410\u9411\u9412\u9413\u9414\u9415\u9416\u9417\u9418\u9419\u941a\u941b\u941c\u941d\u941e\u941f\u9420\u9421\u9422\u9423\u9424\u9425\u9426\u9427\u9428\u9429\u942a\u942b\u942c\u942d\u942e\u942f\u9430\u9431\u9432\u9433\u9434\u9435\u9436\u9437\u9438\u9439\u943a\u943b\u943c\u943d\u943e\u943f\u9440\u9441\u9442\u9443\u9444\u9445\u9446\u9447\u9448\u9449\u944a\u944b\u944c\u944d\u944e\u944f\u9450\u9451\u9452\u9453\u9454\u9455\u9456\u9457\u9458\u9459\u945a\u945b\u945c\u945d\u945e\u945f\u9460\u9461\u9462\u9463\u9464\u9465\u9466\u9467\u9468\u9469\u946a\u946b\u946c\u946d\u946e\u946f\u9470\u9471\u9472\u9473\u9474\u9475\u9476\u9477\u9478\u9479\u947a\u947b\u947c\u947d\u947e\u947f\u9480\u9481\u9482\u9483\u9484\u9485\u9486\u9487\u9488\u9489\u948a\u948b\u948c\u948d\u948e\u948f\u9490\u9491\u9492\u9493\u9494\u9495\u9496\u9497\u9498\u9499\u949a\u949b\u949c\u949d\u949e\u949f\u94a0\u94a1\u94a2\u94a3\u94a4\u94a5\u94a6\u94a7\u94a8\u94a9\u94aa\u94ab\u94ac\u94ad\u94ae\u94af\u94b0\u94b1\u94b2\u94b3\u94b4\u94b5\u94b6\u94b7\u94b8\u94b9\u94ba\u94bb\u94bc\u94bd\u94be\u94bf\u94c0\u94c1\u94c2\u94c3\u94c4\u94c5\u94c6\u94c7\u94c8\u94c9\u94ca\u94cb\u94cc\u94cd\u94ce\u94cf\u94d0\u94d1\u94d2\u94d3\u94d4\u94d5\u94d6\u94d7\u94d8\u94d9\u94da\u94db\u94dc\u94dd\u94de\u94df\u94e0\u94e1\u94e2\u94e3\u94e4\u94e5\u94e6\u94e7\u94e8\u94e9\u94ea\u94eb\u94ec\u94ed\u94ee\u94ef\u94f0\u94f1\u94f2\u94f3\u94f4\u94f5\u94f6\u94f7\u94f8\u94f9\u94fa\u94fb\u94fc\u94fd\u94fe\u94ff\u9500\u9501\u9502\u9503\u9504\u9505\u9506\u9507\u9508\u9509\u950a\u950b\u950c\u950d\u950e\u950f\u9510\u9511\u9512\u9513\u9514\u9515\u9516\u9517\u9518\u9519\u951a\u951b\u951c\u951d\u951e\u951f\u9520\u9521\u9522\u9523\u9524\u9525\u9526\u9527\u9528\u9529\u952a\u952b\u952c\u952d\u952e\u952f\u9530\u9531\u9532\u9533\u9534\u9535\u9536\u9537\u9538\u9539\u953a\u953b\u953c\u953d\u953e\u953f\u9540\u9541\u9542\u9543\u9544\u9545\u9546\u9547\u9548\u9549\u954a\u954b\u954c\u954d\u954e\u954f\u9550\u9551\u9552\u9553\u9554\u9555\u9556\u9557\u9558\u9559\u955a\u955b\u955c\u955d\u955e\u955f\u9560\u9561\u9562\u9563\u9564\u9565\u9566\u9567\u9568\u9569\u956a\u956b\u956c\u956d\u956e\u956f\u9570\u9571\u9572\u9573\u9574\u9575\u9576\u9577\u9578\u9579\u957a\u957b\u957c\u957d\u957e\u957f\u9580\u9581\u9582\u9583\u9584\u9585\u9586\u9587\u9588\u9589\u958a\u958b\u958c\u958d\u958e\u958f\u9590\u9591\u9592\u9593\u9594\u9595\u9596\u9597\u9598\u9599\u959a\u959b\u959c\u959d\u959e\u959f\u95a0\u95a1\u95a2\u95a3\u95a4\u95a5\u95a6\u95a7\u95a8\u95a9\u95aa\u95ab\u95ac\u95ad\u95ae\u95af\u95b0\u95b1\u95b2\u95b3\u95b4\u95b5\u95b6\u95b7\u95b8\u95b9\u95ba\u95bb\u95bc\u95bd\u95be\u95bf\u95c0\u95c1\u95c2\u95c3\u95c4\u95c5\u95c6\u95c7\u95c8\u95c9\u95ca\u95cb\u95cc\u95cd\u95ce\u95cf\u95d0\u95d1\u95d2\u95d3\u95d4\u95d5\u95d6\u95d7\u95d8\u95d9\u95da\u95db\u95dc\u95dd\u95de\u95df\u95e0\u95e1\u95e2\u95e3\u95e4\u95e5\u95e6\u95e7\u95e8\u95e9\u95ea\u95eb\u95ec\u95ed\u95ee\u95ef\u95f0\u95f1\u95f2\u95f3\u95f4\u95f5\u95f6\u95f7\u95f8\u95f9\u95fa\u95fb\u95fc\u95fd\u95fe\u95ff\u9600\u9601\u9602\u9603\u9604\u9605\u9606\u9607\u9608\u9609\u960a\u960b\u960c\u960d\u960e\u960f\u9610\u9611\u9612\u9613\u9614\u9615\u9616\u9617\u9618\u9619\u961a\u961b\u961c\u961d\u961e\u961f\u9620\u9621\u9622\u9623\u9624\u9625\u9626\u9627\u9628\u9629\u962a\u962b\u962c\u962d\u962e\u962f\u9630\u9631\u9632\u9633\u9634\u9635\u9636\u9637\u9638\u9639\u963a\u963b\u963c\u963d\u963e\u963f\u9640\u9641\u9642\u9643\u9644\u9645\u9646\u9647\u9648\u9649\u964a\u964b\u964c\u964d\u964e\u964f\u9650\u9651\u9652\u9653\u9654\u9655\u9656\u9657\u9658\u9659\u965a\u965b\u965c\u965d\u965e\u965f\u9660\u9661\u9662\u9663\u9664\u9665\u9666\u9667\u9668\u9669\u966a\u966b\u966c\u966d\u966e\u966f\u9670\u9671\u9672\u9673\u9674\u9675\u9676\u9677\u9678\u9679\u967a\u967b\u967c\u967d\u967e\u967f\u9680\u9681\u9682\u9683\u9684\u9685\u9686\u9687\u9688\u9689\u968a\u968b\u968c\u968d\u968e\u968f\u9690\u9691\u9692\u9693\u9694\u9695\u9696\u9697\u9698\u9699\u969a\u969b\u969c\u969d\u969e\u969f\u96a0\u96a1\u96a2\u96a3\u96a4\u96a5\u96a6\u96a7\u96a8\u96a9\u96aa\u96ab\u96ac\u96ad\u96ae\u96af\u96b0\u96b1\u96b2\u96b3\u96b4\u96b5\u96b6\u96b7\u96b8\u96b9\u96ba\u96bb\u96bc\u96bd\u96be\u96bf\u96c0\u96c1\u96c2\u96c3\u96c4\u96c5\u96c6\u96c7\u96c8\u96c9\u96ca\u96cb\u96cc\u96cd\u96ce\u96cf\u96d0\u96d1\u96d2\u96d3\u96d4\u96d5\u96d6\u96d7\u96d8\u96d9\u96da\u96db\u96dc\u96dd\u96de\u96df\u96e0\u96e1\u96e2\u96e3\u96e4\u96e5\u96e6\u96e7\u96e8\u96e9\u96ea\u96eb\u96ec\u96ed\u96ee\u96ef\u96f0\u96f1\u96f2\u96f3\u96f4\u96f5\u96f6\u96f7\u96f8\u96f9\u96fa\u96fb\u96fc\u96fd\u96fe\u96ff\u9700\u9701\u9702\u9703\u9704\u9705\u9706\u9707\u9708\u9709\u970a\u970b\u970c\u970d\u970e\u970f\u9710\u9711\u9712\u9713\u9714\u9715\u9716\u9717\u9718\u9719\u971a\u971b\u971c\u971d\u971e\u971f\u9720\u9721\u9722\u9723\u9724\u9725\u9726\u9727\u9728\u9729\u972a\u972b\u972c\u972d\u972e\u972f\u9730\u9731\u9732\u9733\u9734\u9735\u9736\u9737\u9738\u9739\u973a\u973b\u973c\u973d\u973e\u973f\u9740\u9741\u9742\u9743\u9744\u9745\u9746\u9747\u9748\u9749\u974a\u974b\u974c\u974d\u974e\u974f\u9750\u9751\u9752\u9753\u9754\u9755\u9756\u9757\u9758\u9759\u975a\u975b\u975c\u975d\u975e\u975f\u9760\u9761\u9762\u9763\u9764\u9765\u9766\u9767\u9768\u9769\u976a\u976b\u976c\u976d\u976e\u976f\u9770\u9771\u9772\u9773\u9774\u9775\u9776\u9777\u9778\u9779\u977a\u977b\u977c\u977d\u977e\u977f\u9780\u9781\u9782\u9783\u9784\u9785\u9786\u9787\u9788\u9789\u978a\u978b\u978c\u978d\u978e\u978f\u9790\u9791\u9792\u9793\u9794\u9795\u9796\u9797\u9798\u9799\u979a\u979b\u979c\u979d\u979e\u979f\u97a0\u97a1\u97a2\u97a3\u97a4\u97a5\u97a6\u97a7\u97a8\u97a9\u97aa\u97ab\u97ac\u97ad\u97ae\u97af\u97b0\u97b1\u97b2\u97b3\u97b4\u97b5\u97b6\u97b7\u97b8\u97b9\u97ba\u97bb\u97bc\u97bd\u97be\u97bf\u97c0\u97c1\u97c2\u97c3\u97c4\u97c5\u97c6\u97c7\u97c8\u97c9\u97ca\u97cb\u97cc\u97cd\u97ce\u97cf\u97d0\u97d1\u97d2\u97d3\u97d4\u97d5\u97d6\u97d7\u97d8\u97d9\u97da\u97db\u97dc\u97dd\u97de\u97df\u97e0\u97e1\u97e2\u97e3\u97e4\u97e5\u97e6\u97e7\u97e8\u97e9\u97ea\u97eb\u97ec\u97ed\u97ee\u97ef\u97f0\u97f1\u97f2\u97f3\u97f4\u97f5\u97f6\u97f7\u97f8\u97f9\u97fa\u97fb\u97fc\u97fd\u97fe\u97ff\u9800\u9801\u9802\u9803\u9804\u9805\u9806\u9807\u9808\u9809\u980a\u980b\u980c\u980d\u980e\u980f\u9810\u9811\u9812\u9813\u9814\u9815\u9816\u9817\u9818\u9819\u981a\u981b\u981c\u981d\u981e\u981f\u9820\u9821\u9822\u9823\u9824\u9825\u9826\u9827\u9828\u9829\u982a\u982b\u982c\u982d\u982e\u982f\u9830\u9831\u9832\u9833\u9834\u9835\u9836\u9837\u9838\u9839\u983a\u983b\u983c\u983d\u983e\u983f\u9840\u9841\u9842\u9843\u9844\u9845\u9846\u9847\u9848\u9849\u984a\u984b\u984c\u984d\u984e\u984f\u9850\u9851\u9852\u9853\u9854\u9855\u9856\u9857\u9858\u9859\u985a\u985b\u985c\u985d\u985e\u985f\u9860\u9861\u9862\u9863\u9864\u9865\u9866\u9867\u9868\u9869\u986a\u986b\u986c\u986d\u986e\u986f\u9870\u9871\u9872\u9873\u9874\u9875\u9876\u9877\u9878\u9879\u987a\u987b\u987c\u987d\u987e\u987f\u9880\u9881\u9882\u9883\u9884\u9885\u9886\u9887\u9888\u9889\u988a\u988b\u988c\u988d\u988e\u988f\u9890\u9891\u9892\u9893\u9894\u9895\u9896\u9897\u9898\u9899\u989a\u989b\u989c\u989d\u989e\u989f\u98a0\u98a1\u98a2\u98a3\u98a4\u98a5\u98a6\u98a7\u98a8\u98a9\u98aa\u98ab\u98ac\u98ad\u98ae\u98af\u98b0\u98b1\u98b2\u98b3\u98b4\u98b5\u98b6\u98b7\u98b8\u98b9\u98ba\u98bb\u98bc\u98bd\u98be\u98bf\u98c0\u98c1\u98c2\u98c3\u98c4\u98c5\u98c6\u98c7\u98c8\u98c9\u98ca\u98cb\u98cc\u98cd\u98ce\u98cf\u98d0\u98d1\u98d2\u98d3\u98d4\u98d5\u98d6\u98d7\u98d8\u98d9\u98da\u98db\u98dc\u98dd\u98de\u98df\u98e0\u98e1\u98e2\u98e3\u98e4\u98e5\u98e6\u98e7\u98e8\u98e9\u98ea\u98eb\u98ec\u98ed\u98ee\u98ef\u98f0\u98f1\u98f2\u98f3\u98f4\u98f5\u98f6\u98f7\u98f8\u98f9\u98fa\u98fb\u98fc\u98fd\u98fe\u98ff\u9900\u9901\u9902\u9903\u9904\u9905\u9906\u9907\u9908\u9909\u990a\u990b\u990c\u990d\u990e\u990f\u9910\u9911\u9912\u9913\u9914\u9915\u9916\u9917\u9918\u9919\u991a\u991b\u991c\u991d\u991e\u991f\u9920\u9921\u9922\u9923\u9924\u9925\u9926\u9927\u9928\u9929\u992a\u992b\u992c\u992d\u992e\u992f\u9930\u9931\u9932\u9933\u9934\u9935\u9936\u9937\u9938\u9939\u993a\u993b\u993c\u993d\u993e\u993f\u9940\u9941\u9942\u9943\u9944\u9945\u9946\u9947\u9948\u9949\u994a\u994b\u994c\u994d\u994e\u994f\u9950\u9951\u9952\u9953\u9954\u9955\u9956\u9957\u9958\u9959\u995a\u995b\u995c\u995d\u995e\u995f\u9960\u9961\u9962\u9963\u9964\u9965\u9966\u9967\u9968\u9969\u996a\u996b\u996c\u996d\u996e\u996f\u9970\u9971\u9972\u9973\u9974\u9975\u9976\u9977\u9978\u9979\u997a\u997b\u997c\u997d\u997e\u997f\u9980\u9981\u9982\u9983\u9984\u9985\u9986\u9987\u9988\u9989\u998a\u998b\u998c\u998d\u998e\u998f\u9990\u9991\u9992\u9993\u9994\u9995\u9996\u9997\u9998\u9999\u999a\u999b\u999c\u999d\u999e\u999f\u99a0\u99a1\u99a2\u99a3\u99a4\u99a5\u99a6\u99a7\u99a8\u99a9\u99aa\u99ab\u99ac\u99ad\u99ae\u99af\u99b0\u99b1\u99b2\u99b3\u99b4\u99b5\u99b6\u99b7\u99b8\u99b9\u99ba\u99bb\u99bc\u99bd\u99be\u99bf\u99c0\u99c1\u99c2\u99c3\u99c4\u99c5\u99c6\u99c7\u99c8\u99c9\u99ca\u99cb\u99cc\u99cd\u99ce\u99cf\u99d0\u99d1\u99d2\u99d3\u99d4\u99d5\u99d6\u99d7\u99d8\u99d9\u99da\u99db\u99dc\u99dd\u99de\u99df\u99e0\u99e1\u99e2\u99e3\u99e4\u99e5\u99e6\u99e7\u99e8\u99e9\u99ea\u99eb\u99ec\u99ed\u99ee\u99ef\u99f0\u99f1\u99f2\u99f3\u99f4\u99f5\u99f6\u99f7\u99f8\u99f9\u99fa\u99fb\u99fc\u99fd\u99fe\u99ff\u9a00\u9a01\u9a02\u9a03\u9a04\u9a05\u9a06\u9a07\u9a08\u9a09\u9a0a\u9a0b\u9a0c\u9a0d\u9a0e\u9a0f\u9a10\u9a11\u9a12\u9a13\u9a14\u9a15\u9a16\u9a17\u9a18\u9a19\u9a1a\u9a1b\u9a1c\u9a1d\u9a1e\u9a1f\u9a20\u9a21\u9a22\u9a23\u9a24\u9a25\u9a26\u9a27\u9a28\u9a29\u9a2a\u9a2b\u9a2c\u9a2d\u9a2e\u9a2f\u9a30\u9a31\u9a32\u9a33\u9a34\u9a35\u9a36\u9a37\u9a38\u9a39\u9a3a\u9a3b\u9a3c\u9a3d\u9a3e\u9a3f\u9a40\u9a41\u9a42\u9a43\u9a44\u9a45\u9a46\u9a47\u9a48\u9a49\u9a4a\u9a4b\u9a4c\u9a4d\u9a4e\u9a4f\u9a50\u9a51\u9a52\u9a53\u9a54\u9a55\u9a56\u9a57\u9a58\u9a59\u9a5a\u9a5b\u9a5c\u9a5d\u9a5e\u9a5f\u9a60\u9a61\u9a62\u9a63\u9a64\u9a65\u9a66\u9a67\u9a68\u9a69\u9a6a\u9a6b\u9a6c\u9a6d\u9a6e\u9a6f\u9a70\u9a71\u9a72\u9a73\u9a74\u9a75\u9a76\u9a77\u9a78\u9a79\u9a7a\u9a7b\u9a7c\u9a7d\u9a7e\u9a7f\u9a80\u9a81\u9a82\u9a83\u9a84\u9a85\u9a86\u9a87\u9a88\u9a89\u9a8a\u9a8b\u9a8c\u9a8d\u9a8e\u9a8f\u9a90\u9a91\u9a92\u9a93\u9a94\u9a95\u9a96\u9a97\u9a98\u9a99\u9a9a\u9a9b\u9a9c\u9a9d\u9a9e\u9a9f\u9aa0\u9aa1\u9aa2\u9aa3\u9aa4\u9aa5\u9aa6\u9aa7\u9aa8\u9aa9\u9aaa\u9aab\u9aac\u9aad\u9aae\u9aaf\u9ab0\u9ab1\u9ab2\u9ab3\u9ab4\u9ab5\u9ab6\u9ab7\u9ab8\u9ab9\u9aba\u9abb\u9abc\u9abd\u9abe\u9abf\u9ac0\u9ac1\u9ac2\u9ac3\u9ac4\u9ac5\u9ac6\u9ac7\u9ac8\u9ac9\u9aca\u9acb\u9acc\u9acd\u9ace\u9acf\u9ad0\u9ad1\u9ad2\u9ad3\u9ad4\u9ad5\u9ad6\u9ad7\u9ad8\u9ad9\u9ada\u9adb\u9adc\u9add\u9ade\u9adf\u9ae0\u9ae1\u9ae2\u9ae3\u9ae4\u9ae5\u9ae6\u9ae7\u9ae8\u9ae9\u9aea\u9aeb\u9aec\u9aed\u9aee\u9aef\u9af0\u9af1\u9af2\u9af3\u9af4\u9af5\u9af6\u9af7\u9af8\u9af9\u9afa\u9afb\u9afc\u9afd\u9afe\u9aff\u9b00\u9b01\u9b02\u9b03\u9b04\u9b05\u9b06\u9b07\u9b08\u9b09\u9b0a\u9b0b\u9b0c\u9b0d\u9b0e\u9b0f\u9b10\u9b11\u9b12\u9b13\u9b14\u9b15\u9b16\u9b17\u9b18\u9b19\u9b1a\u9b1b\u9b1c\u9b1d\u9b1e\u9b1f\u9b20\u9b21\u9b22\u9b23\u9b24\u9b25\u9b26\u9b27\u9b28\u9b29\u9b2a\u9b2b\u9b2c\u9b2d\u9b2e\u9b2f\u9b30\u9b31\u9b32\u9b33\u9b34\u9b35\u9b36\u9b37\u9b38\u9b39\u9b3a\u9b3b\u9b3c\u9b3d\u9b3e\u9b3f\u9b40\u9b41\u9b42\u9b43\u9b44\u9b45\u9b46\u9b47\u9b48\u9b49\u9b4a\u9b4b\u9b4c\u9b4d\u9b4e\u9b4f\u9b50\u9b51\u9b52\u9b53\u9b54\u9b55\u9b56\u9b57\u9b58\u9b59\u9b5a\u9b5b\u9b5c\u9b5d\u9b5e\u9b5f\u9b60\u9b61\u9b62\u9b63\u9b64\u9b65\u9b66\u9b67\u9b68\u9b69\u9b6a\u9b6b\u9b6c\u9b6d\u9b6e\u9b6f\u9b70\u9b71\u9b72\u9b73\u9b74\u9b75\u9b76\u9b77\u9b78\u9b79\u9b7a\u9b7b\u9b7c\u9b7d\u9b7e\u9b7f\u9b80\u9b81\u9b82\u9b83\u9b84\u9b85\u9b86\u9b87\u9b88\u9b89\u9b8a\u9b8b\u9b8c\u9b8d\u9b8e\u9b8f\u9b90\u9b91\u9b92\u9b93\u9b94\u9b95\u9b96\u9b97\u9b98\u9b99\u9b9a\u9b9b\u9b9c\u9b9d\u9b9e\u9b9f\u9ba0\u9ba1\u9ba2\u9ba3\u9ba4\u9ba5\u9ba6\u9ba7\u9ba8\u9ba9\u9baa\u9bab\u9bac\u9bad\u9bae\u9baf\u9bb0\u9bb1\u9bb2\u9bb3\u9bb4\u9bb5\u9bb6\u9bb7\u9bb8\u9bb9\u9bba\u9bbb\u9bbc\u9bbd\u9bbe\u9bbf\u9bc0\u9bc1\u9bc2\u9bc3\u9bc4\u9bc5\u9bc6\u9bc7\u9bc8\u9bc9\u9bca\u9bcb\u9bcc\u9bcd\u9bce\u9bcf\u9bd0\u9bd1\u9bd2\u9bd3\u9bd4\u9bd5\u9bd6\u9bd7\u9bd8\u9bd9\u9bda\u9bdb\u9bdc\u9bdd\u9bde\u9bdf\u9be0\u9be1\u9be2\u9be3\u9be4\u9be5\u9be6\u9be7\u9be8\u9be9\u9bea\u9beb\u9bec\u9bed\u9bee\u9bef\u9bf0\u9bf1\u9bf2\u9bf3\u9bf4\u9bf5\u9bf6\u9bf7\u9bf8\u9bf9\u9bfa\u9bfb\u9bfc\u9bfd\u9bfe\u9bff\u9c00\u9c01\u9c02\u9c03\u9c04\u9c05\u9c06\u9c07\u9c08\u9c09\u9c0a\u9c0b\u9c0c\u9c0d\u9c0e\u9c0f\u9c10\u9c11\u9c12\u9c13\u9c14\u9c15\u9c16\u9c17\u9c18\u9c19\u9c1a\u9c1b\u9c1c\u9c1d\u9c1e\u9c1f\u9c20\u9c21\u9c22\u9c23\u9c24\u9c25\u9c26\u9c27\u9c28\u9c29\u9c2a\u9c2b\u9c2c\u9c2d\u9c2e\u9c2f\u9c30\u9c31\u9c32\u9c33\u9c34\u9c35\u9c36\u9c37\u9c38\u9c39\u9c3a\u9c3b\u9c3c\u9c3d\u9c3e\u9c3f\u9c40\u9c41\u9c42\u9c43\u9c44\u9c45\u9c46\u9c47\u9c48\u9c49\u9c4a\u9c4b\u9c4c\u9c4d\u9c4e\u9c4f\u9c50\u9c51\u9c52\u9c53\u9c54\u9c55\u9c56\u9c57\u9c58\u9c59\u9c5a\u9c5b\u9c5c\u9c5d\u9c5e\u9c5f\u9c60\u9c61\u9c62\u9c63\u9c64\u9c65\u9c66\u9c67\u9c68\u9c69\u9c6a\u9c6b\u9c6c\u9c6d\u9c6e\u9c6f\u9c70\u9c71\u9c72\u9c73\u9c74\u9c75\u9c76\u9c77\u9c78\u9c79\u9c7a\u9c7b\u9c7c\u9c7d\u9c7e\u9c7f\u9c80\u9c81\u9c82\u9c83\u9c84\u9c85\u9c86\u9c87\u9c88\u9c89\u9c8a\u9c8b\u9c8c\u9c8d\u9c8e\u9c8f\u9c90\u9c91\u9c92\u9c93\u9c94\u9c95\u9c96\u9c97\u9c98\u9c99\u9c9a\u9c9b\u9c9c\u9c9d\u9c9e\u9c9f\u9ca0\u9ca1\u9ca2\u9ca3\u9ca4\u9ca5\u9ca6\u9ca7\u9ca8\u9ca9\u9caa\u9cab\u9cac\u9cad\u9cae\u9caf\u9cb0\u9cb1\u9cb2\u9cb3\u9cb4\u9cb5\u9cb6\u9cb7\u9cb8\u9cb9\u9cba\u9cbb\u9cbc\u9cbd\u9cbe\u9cbf\u9cc0\u9cc1\u9cc2\u9cc3\u9cc4\u9cc5\u9cc6\u9cc7\u9cc8\u9cc9\u9cca\u9ccb\u9ccc\u9ccd\u9cce\u9ccf\u9cd0\u9cd1\u9cd2\u9cd3\u9cd4\u9cd5\u9cd6\u9cd7\u9cd8\u9cd9\u9cda\u9cdb\u9cdc\u9cdd\u9cde\u9cdf\u9ce0\u9ce1\u9ce2\u9ce3\u9ce4\u9ce5\u9ce6\u9ce7\u9ce8\u9ce9\u9cea\u9ceb\u9cec\u9ced\u9cee\u9cef\u9cf0\u9cf1\u9cf2\u9cf3\u9cf4\u9cf5\u9cf6\u9cf7\u9cf8\u9cf9\u9cfa\u9cfb\u9cfc\u9cfd\u9cfe\u9cff\u9d00\u9d01\u9d02\u9d03\u9d04\u9d05\u9d06\u9d07\u9d08\u9d09\u9d0a\u9d0b\u9d0c\u9d0d\u9d0e\u9d0f\u9d10\u9d11\u9d12\u9d13\u9d14\u9d15\u9d16\u9d17\u9d18\u9d19\u9d1a\u9d1b\u9d1c\u9d1d\u9d1e\u9d1f\u9d20\u9d21\u9d22\u9d23\u9d24\u9d25\u9d26\u9d27\u9d28\u9d29\u9d2a\u9d2b\u9d2c\u9d2d\u9d2e\u9d2f\u9d30\u9d31\u9d32\u9d33\u9d34\u9d35\u9d36\u9d37\u9d38\u9d39\u9d3a\u9d3b\u9d3c\u9d3d\u9d3e\u9d3f\u9d40\u9d41\u9d42\u9d43\u9d44\u9d45\u9d46\u9d47\u9d48\u9d49\u9d4a\u9d4b\u9d4c\u9d4d\u9d4e\u9d4f\u9d50\u9d51\u9d52\u9d53\u9d54\u9d55\u9d56\u9d57\u9d58\u9d59\u9d5a\u9d5b\u9d5c\u9d5d\u9d5e\u9d5f\u9d60\u9d61\u9d62\u9d63\u9d64\u9d65\u9d66\u9d67\u9d68\u9d69\u9d6a\u9d6b\u9d6c\u9d6d\u9d6e\u9d6f\u9d70\u9d71\u9d72\u9d73\u9d74\u9d75\u9d76\u9d77\u9d78\u9d79\u9d7a\u9d7b\u9d7c\u9d7d\u9d7e\u9d7f\u9d80\u9d81\u9d82\u9d83\u9d84\u9d85\u9d86\u9d87\u9d88\u9d89\u9d8a\u9d8b\u9d8c\u9d8d\u9d8e\u9d8f\u9d90\u9d91\u9d92\u9d93\u9d94\u9d95\u9d96\u9d97\u9d98\u9d99\u9d9a\u9d9b\u9d9c\u9d9d\u9d9e\u9d9f\u9da0\u9da1\u9da2\u9da3\u9da4\u9da5\u9da6\u9da7\u9da8\u9da9\u9daa\u9dab\u9dac\u9dad\u9dae\u9daf\u9db0\u9db1\u9db2\u9db3\u9db4\u9db5\u9db6\u9db7\u9db8\u9db9\u9dba\u9dbb\u9dbc\u9dbd\u9dbe\u9dbf\u9dc0\u9dc1\u9dc2\u9dc3\u9dc4\u9dc5\u9dc6\u9dc7\u9dc8\u9dc9\u9dca\u9dcb\u9dcc\u9dcd\u9dce\u9dcf\u9dd0\u9dd1\u9dd2\u9dd3\u9dd4\u9dd5\u9dd6\u9dd7\u9dd8\u9dd9\u9dda\u9ddb\u9ddc\u9ddd\u9dde\u9ddf\u9de0\u9de1\u9de2\u9de3\u9de4\u9de5\u9de6\u9de7\u9de8\u9de9\u9dea\u9deb\u9dec\u9ded\u9dee\u9def\u9df0\u9df1\u9df2\u9df3\u9df4\u9df5\u9df6\u9df7\u9df8\u9df9\u9dfa\u9dfb\u9dfc\u9dfd\u9dfe\u9dff\u9e00\u9e01\u9e02\u9e03\u9e04\u9e05\u9e06\u9e07\u9e08\u9e09\u9e0a\u9e0b\u9e0c\u9e0d\u9e0e\u9e0f\u9e10\u9e11\u9e12\u9e13\u9e14\u9e15\u9e16\u9e17\u9e18\u9e19\u9e1a\u9e1b\u9e1c\u9e1d\u9e1e\u9e1f\u9e20\u9e21\u9e22\u9e23\u9e24\u9e25\u9e26\u9e27\u9e28\u9e29\u9e2a\u9e2b\u9e2c\u9e2d\u9e2e\u9e2f\u9e30\u9e31\u9e32\u9e33\u9e34\u9e35\u9e36\u9e37\u9e38\u9e39\u9e3a\u9e3b\u9e3c\u9e3d\u9e3e\u9e3f\u9e40\u9e41\u9e42\u9e43\u9e44\u9e45\u9e46\u9e47\u9e48\u9e49\u9e4a\u9e4b\u9e4c\u9e4d\u9e4e\u9e4f\u9e50\u9e51\u9e52\u9e53\u9e54\u9e55\u9e56\u9e57\u9e58\u9e59\u9e5a\u9e5b\u9e5c\u9e5d\u9e5e\u9e5f\u9e60\u9e61\u9e62\u9e63\u9e64\u9e65\u9e66\u9e67\u9e68\u9e69\u9e6a\u9e6b\u9e6c\u9e6d\u9e6e\u9e6f\u9e70\u9e71\u9e72\u9e73\u9e74\u9e75\u9e76\u9e77\u9e78\u9e79\u9e7a\u9e7b\u9e7c\u9e7d\u9e7e\u9e7f\u9e80\u9e81\u9e82\u9e83\u9e84\u9e85\u9e86\u9e87\u9e88\u9e89\u9e8a\u9e8b\u9e8c\u9e8d\u9e8e\u9e8f\u9e90\u9e91\u9e92\u9e93\u9e94\u9e95\u9e96\u9e97\u9e98\u9e99\u9e9a\u9e9b\u9e9c\u9e9d\u9e9e\u9e9f\u9ea0\u9ea1\u9ea2\u9ea3\u9ea4\u9ea5\u9ea6\u9ea7\u9ea8\u9ea9\u9eaa\u9eab\u9eac\u9ead\u9eae\u9eaf\u9eb0\u9eb1\u9eb2\u9eb3\u9eb4\u9eb5\u9eb6\u9eb7\u9eb8\u9eb9\u9eba\u9ebb\u9ebc\u9ebd\u9ebe\u9ebf\u9ec0\u9ec1\u9ec2\u9ec3\u9ec4\u9ec5\u9ec6\u9ec7\u9ec8\u9ec9\u9eca\u9ecb\u9ecc\u9ecd\u9ece\u9ecf\u9ed0\u9ed1\u9ed2\u9ed3\u9ed4\u9ed5\u9ed6\u9ed7\u9ed8\u9ed9\u9eda\u9edb\u9edc\u9edd\u9ede\u9edf\u9ee0\u9ee1\u9ee2\u9ee3\u9ee4\u9ee5\u9ee6\u9ee7\u9ee8\u9ee9\u9eea\u9eeb\u9eec\u9eed\u9eee\u9eef\u9ef0\u9ef1\u9ef2\u9ef3\u9ef4\u9ef5\u9ef6\u9ef7\u9ef8\u9ef9\u9efa\u9efb\u9efc\u9efd\u9efe\u9eff\u9f00\u9f01\u9f02\u9f03\u9f04\u9f05\u9f06\u9f07\u9f08\u9f09\u9f0a\u9f0b\u9f0c\u9f0d\u9f0e\u9f0f\u9f10\u9f11\u9f12\u9f13\u9f14\u9f15\u9f16\u9f17\u9f18\u9f19\u9f1a\u9f1b\u9f1c\u9f1d\u9f1e\u9f1f\u9f20\u9f21\u9f22\u9f23\u9f24\u9f25\u9f26\u9f27\u9f28\u9f29\u9f2a\u9f2b\u9f2c\u9f2d\u9f2e\u9f2f\u9f30\u9f31\u9f32\u9f33\u9f34\u9f35\u9f36\u9f37\u9f38\u9f39\u9f3a\u9f3b\u9f3c\u9f3d\u9f3e\u9f3f\u9f40\u9f41\u9f42\u9f43\u9f44\u9f45\u9f46\u9f47\u9f48\u9f49\u9f4a\u9f4b\u9f4c\u9f4d\u9f4e\u9f4f\u9f50\u9f51\u9f52\u9f53\u9f54\u9f55\u9f56\u9f57\u9f58\u9f59\u9f5a\u9f5b\u9f5c\u9f5d\u9f5e\u9f5f\u9f60\u9f61\u9f62\u9f63\u9f64\u9f65\u9f66\u9f67\u9f68\u9f69\u9f6a\u9f6b\u9f6c\u9f6d\u9f6e\u9f6f\u9f70\u9f71\u9f72\u9f73\u9f74\u9f75\u9f76\u9f77\u9f78\u9f79\u9f7a\u9f7b\u9f7c\u9f7d\u9f7e\u9f7f\u9f80\u9f81\u9f82\u9f83\u9f84\u9f85\u9f86\u9f87\u9f88\u9f89\u9f8a\u9f8b\u9f8c\u9f8d\u9f8e\u9f8f\u9f90\u9f91\u9f92\u9f93\u9f94\u9f95\u9f96\u9f97\u9f98\u9f99\u9f9a\u9f9b\u9f9c\u9f9d\u9f9e\u9f9f\u9fa0\u9fa1\u9fa2\u9fa3\u9fa4\u9fa5\u9fa6\u9fa7\u9fa8\u9fa9\u9faa\u9fab\u9fac\u9fad\u9fae\u9faf\u9fb0\u9fb1\u9fb2\u9fb3\u9fb4\u9fb5\u9fb6\u9fb7\u9fb8\u9fb9\u9fba\u9fbb\ua000\ua001\ua002\ua003\ua004\ua005\ua006\ua007\ua008\ua009\ua00a\ua00b\ua00c\ua00d\ua00e\ua00f\ua010\ua011\ua012\ua013\ua014\ua016\ua017\ua018\ua019\ua01a\ua01b\ua01c\ua01d\ua01e\ua01f\ua020\ua021\ua022\ua023\ua024\ua025\ua026\ua027\ua028\ua029\ua02a\ua02b\ua02c\ua02d\ua02e\ua02f\ua030\ua031\ua032\ua033\ua034\ua035\ua036\ua037\ua038\ua039\ua03a\ua03b\ua03c\ua03d\ua03e\ua03f\ua040\ua041\ua042\ua043\ua044\ua045\ua046\ua047\ua048\ua049\ua04a\ua04b\ua04c\ua04d\ua04e\ua04f\ua050\ua051\ua052\ua053\ua054\ua055\ua056\ua057\ua058\ua059\ua05a\ua05b\ua05c\ua05d\ua05e\ua05f\ua060\ua061\ua062\ua063\ua064\ua065\ua066\ua067\ua068\ua069\ua06a\ua06b\ua06c\ua06d\ua06e\ua06f\ua070\ua071\ua072\ua073\ua074\ua075\ua076\ua077\ua078\ua079\ua07a\ua07b\ua07c\ua07d\ua07e\ua07f\ua080\ua081\ua082\ua083\ua084\ua085\ua086\ua087\ua088\ua089\ua08a\ua08b\ua08c\ua08d\ua08e\ua08f\ua090\ua091\ua092\ua093\ua094\ua095\ua096\ua097\ua098\ua099\ua09a\ua09b\ua09c\ua09d\ua09e\ua09f\ua0a0\ua0a1\ua0a2\ua0a3\ua0a4\ua0a5\ua0a6\ua0a7\ua0a8\ua0a9\ua0aa\ua0ab\ua0ac\ua0ad\ua0ae\ua0af\ua0b0\ua0b1\ua0b2\ua0b3\ua0b4\ua0b5\ua0b6\ua0b7\ua0b8\ua0b9\ua0ba\ua0bb\ua0bc\ua0bd\ua0be\ua0bf\ua0c0\ua0c1\ua0c2\ua0c3\ua0c4\ua0c5\ua0c6\ua0c7\ua0c8\ua0c9\ua0ca\ua0cb\ua0cc\ua0cd\ua0ce\ua0cf\ua0d0\ua0d1\ua0d2\ua0d3\ua0d4\ua0d5\ua0d6\ua0d7\ua0d8\ua0d9\ua0da\ua0db\ua0dc\ua0dd\ua0de\ua0df\ua0e0\ua0e1\ua0e2\ua0e3\ua0e4\ua0e5\ua0e6\ua0e7\ua0e8\ua0e9\ua0ea\ua0eb\ua0ec\ua0ed\ua0ee\ua0ef\ua0f0\ua0f1\ua0f2\ua0f3\ua0f4\ua0f5\ua0f6\ua0f7\ua0f8\ua0f9\ua0fa\ua0fb\ua0fc\ua0fd\ua0fe\ua0ff\ua100\ua101\ua102\ua103\ua104\ua105\ua106\ua107\ua108\ua109\ua10a\ua10b\ua10c\ua10d\ua10e\ua10f\ua110\ua111\ua112\ua113\ua114\ua115\ua116\ua117\ua118\ua119\ua11a\ua11b\ua11c\ua11d\ua11e\ua11f\ua120\ua121\ua122\ua123\ua124\ua125\ua126\ua127\ua128\ua129\ua12a\ua12b\ua12c\ua12d\ua12e\ua12f\ua130\ua131\ua132\ua133\ua134\ua135\ua136\ua137\ua138\ua139\ua13a\ua13b\ua13c\ua13d\ua13e\ua13f\ua140\ua141\ua142\ua143\ua144\ua145\ua146\ua147\ua148\ua149\ua14a\ua14b\ua14c\ua14d\ua14e\ua14f\ua150\ua151\ua152\ua153\ua154\ua155\ua156\ua157\ua158\ua159\ua15a\ua15b\ua15c\ua15d\ua15e\ua15f\ua160\ua161\ua162\ua163\ua164\ua165\ua166\ua167\ua168\ua169\ua16a\ua16b\ua16c\ua16d\ua16e\ua16f\ua170\ua171\ua172\ua173\ua174\ua175\ua176\ua177\ua178\ua179\ua17a\ua17b\ua17c\ua17d\ua17e\ua17f\ua180\ua181\ua182\ua183\ua184\ua185\ua186\ua187\ua188\ua189\ua18a\ua18b\ua18c\ua18d\ua18e\ua18f\ua190\ua191\ua192\ua193\ua194\ua195\ua196\ua197\ua198\ua199\ua19a\ua19b\ua19c\ua19d\ua19e\ua19f\ua1a0\ua1a1\ua1a2\ua1a3\ua1a4\ua1a5\ua1a6\ua1a7\ua1a8\ua1a9\ua1aa\ua1ab\ua1ac\ua1ad\ua1ae\ua1af\ua1b0\ua1b1\ua1b2\ua1b3\ua1b4\ua1b5\ua1b6\ua1b7\ua1b8\ua1b9\ua1ba\ua1bb\ua1bc\ua1bd\ua1be\ua1bf\ua1c0\ua1c1\ua1c2\ua1c3\ua1c4\ua1c5\ua1c6\ua1c7\ua1c8\ua1c9\ua1ca\ua1cb\ua1cc\ua1cd\ua1ce\ua1cf\ua1d0\ua1d1\ua1d2\ua1d3\ua1d4\ua1d5\ua1d6\ua1d7\ua1d8\ua1d9\ua1da\ua1db\ua1dc\ua1dd\ua1de\ua1df\ua1e0\ua1e1\ua1e2\ua1e3\ua1e4\ua1e5\ua1e6\ua1e7\ua1e8\ua1e9\ua1ea\ua1eb\ua1ec\ua1ed\ua1ee\ua1ef\ua1f0\ua1f1\ua1f2\ua1f3\ua1f4\ua1f5\ua1f6\ua1f7\ua1f8\ua1f9\ua1fa\ua1fb\ua1fc\ua1fd\ua1fe\ua1ff\ua200\ua201\ua202\ua203\ua204\ua205\ua206\ua207\ua208\ua209\ua20a\ua20b\ua20c\ua20d\ua20e\ua20f\ua210\ua211\ua212\ua213\ua214\ua215\ua216\ua217\ua218\ua219\ua21a\ua21b\ua21c\ua21d\ua21e\ua21f\ua220\ua221\ua222\ua223\ua224\ua225\ua226\ua227\ua228\ua229\ua22a\ua22b\ua22c\ua22d\ua22e\ua22f\ua230\ua231\ua232\ua233\ua234\ua235\ua236\ua237\ua238\ua239\ua23a\ua23b\ua23c\ua23d\ua23e\ua23f\ua240\ua241\ua242\ua243\ua244\ua245\ua246\ua247\ua248\ua249\ua24a\ua24b\ua24c\ua24d\ua24e\ua24f\ua250\ua251\ua252\ua253\ua254\ua255\ua256\ua257\ua258\ua259\ua25a\ua25b\ua25c\ua25d\ua25e\ua25f\ua260\ua261\ua262\ua263\ua264\ua265\ua266\ua267\ua268\ua269\ua26a\ua26b\ua26c\ua26d\ua26e\ua26f\ua270\ua271\ua272\ua273\ua274\ua275\ua276\ua277\ua278\ua279\ua27a\ua27b\ua27c\ua27d\ua27e\ua27f\ua280\ua281\ua282\ua283\ua284\ua285\ua286\ua287\ua288\ua289\ua28a\ua28b\ua28c\ua28d\ua28e\ua28f\ua290\ua291\ua292\ua293\ua294\ua295\ua296\ua297\ua298\ua299\ua29a\ua29b\ua29c\ua29d\ua29e\ua29f\ua2a0\ua2a1\ua2a2\ua2a3\ua2a4\ua2a5\ua2a6\ua2a7\ua2a8\ua2a9\ua2aa\ua2ab\ua2ac\ua2ad\ua2ae\ua2af\ua2b0\ua2b1\ua2b2\ua2b3\ua2b4\ua2b5\ua2b6\ua2b7\ua2b8\ua2b9\ua2ba\ua2bb\ua2bc\ua2bd\ua2be\ua2bf\ua2c0\ua2c1\ua2c2\ua2c3\ua2c4\ua2c5\ua2c6\ua2c7\ua2c8\ua2c9\ua2ca\ua2cb\ua2cc\ua2cd\ua2ce\ua2cf\ua2d0\ua2d1\ua2d2\ua2d3\ua2d4\ua2d5\ua2d6\ua2d7\ua2d8\ua2d9\ua2da\ua2db\ua2dc\ua2dd\ua2de\ua2df\ua2e0\ua2e1\ua2e2\ua2e3\ua2e4\ua2e5\ua2e6\ua2e7\ua2e8\ua2e9\ua2ea\ua2eb\ua2ec\ua2ed\ua2ee\ua2ef\ua2f0\ua2f1\ua2f2\ua2f3\ua2f4\ua2f5\ua2f6\ua2f7\ua2f8\ua2f9\ua2fa\ua2fb\ua2fc\ua2fd\ua2fe\ua2ff\ua300\ua301\ua302\ua303\ua304\ua305\ua306\ua307\ua308\ua309\ua30a\ua30b\ua30c\ua30d\ua30e\ua30f\ua310\ua311\ua312\ua313\ua314\ua315\ua316\ua317\ua318\ua319\ua31a\ua31b\ua31c\ua31d\ua31e\ua31f\ua320\ua321\ua322\ua323\ua324\ua325\ua326\ua327\ua328\ua329\ua32a\ua32b\ua32c\ua32d\ua32e\ua32f\ua330\ua331\ua332\ua333\ua334\ua335\ua336\ua337\ua338\ua339\ua33a\ua33b\ua33c\ua33d\ua33e\ua33f\ua340\ua341\ua342\ua343\ua344\ua345\ua346\ua347\ua348\ua349\ua34a\ua34b\ua34c\ua34d\ua34e\ua34f\ua350\ua351\ua352\ua353\ua354\ua355\ua356\ua357\ua358\ua359\ua35a\ua35b\ua35c\ua35d\ua35e\ua35f\ua360\ua361\ua362\ua363\ua364\ua365\ua366\ua367\ua368\ua369\ua36a\ua36b\ua36c\ua36d\ua36e\ua36f\ua370\ua371\ua372\ua373\ua374\ua375\ua376\ua377\ua378\ua379\ua37a\ua37b\ua37c\ua37d\ua37e\ua37f\ua380\ua381\ua382\ua383\ua384\ua385\ua386\ua387\ua388\ua389\ua38a\ua38b\ua38c\ua38d\ua38e\ua38f\ua390\ua391\ua392\ua393\ua394\ua395\ua396\ua397\ua398\ua399\ua39a\ua39b\ua39c\ua39d\ua39e\ua39f\ua3a0\ua3a1\ua3a2\ua3a3\ua3a4\ua3a5\ua3a6\ua3a7\ua3a8\ua3a9\ua3aa\ua3ab\ua3ac\ua3ad\ua3ae\ua3af\ua3b0\ua3b1\ua3b2\ua3b3\ua3b4\ua3b5\ua3b6\ua3b7\ua3b8\ua3b9\ua3ba\ua3bb\ua3bc\ua3bd\ua3be\ua3bf\ua3c0\ua3c1\ua3c2\ua3c3\ua3c4\ua3c5\ua3c6\ua3c7\ua3c8\ua3c9\ua3ca\ua3cb\ua3cc\ua3cd\ua3ce\ua3cf\ua3d0\ua3d1\ua3d2\ua3d3\ua3d4\ua3d5\ua3d6\ua3d7\ua3d8\ua3d9\ua3da\ua3db\ua3dc\ua3dd\ua3de\ua3df\ua3e0\ua3e1\ua3e2\ua3e3\ua3e4\ua3e5\ua3e6\ua3e7\ua3e8\ua3e9\ua3ea\ua3eb\ua3ec\ua3ed\ua3ee\ua3ef\ua3f0\ua3f1\ua3f2\ua3f3\ua3f4\ua3f5\ua3f6\ua3f7\ua3f8\ua3f9\ua3fa\ua3fb\ua3fc\ua3fd\ua3fe\ua3ff\ua400\ua401\ua402\ua403\ua404\ua405\ua406\ua407\ua408\ua409\ua40a\ua40b\ua40c\ua40d\ua40e\ua40f\ua410\ua411\ua412\ua413\ua414\ua415\ua416\ua417\ua418\ua419\ua41a\ua41b\ua41c\ua41d\ua41e\ua41f\ua420\ua421\ua422\ua423\ua424\ua425\ua426\ua427\ua428\ua429\ua42a\ua42b\ua42c\ua42d\ua42e\ua42f\ua430\ua431\ua432\ua433\ua434\ua435\ua436\ua437\ua438\ua439\ua43a\ua43b\ua43c\ua43d\ua43e\ua43f\ua440\ua441\ua442\ua443\ua444\ua445\ua446\ua447\ua448\ua449\ua44a\ua44b\ua44c\ua44d\ua44e\ua44f\ua450\ua451\ua452\ua453\ua454\ua455\ua456\ua457\ua458\ua459\ua45a\ua45b\ua45c\ua45d\ua45e\ua45f\ua460\ua461\ua462\ua463\ua464\ua465\ua466\ua467\ua468\ua469\ua46a\ua46b\ua46c\ua46d\ua46e\ua46f\ua470\ua471\ua472\ua473\ua474\ua475\ua476\ua477\ua478\ua479\ua47a\ua47b\ua47c\ua47d\ua47e\ua47f\ua480\ua481\ua482\ua483\ua484\ua485\ua486\ua487\ua488\ua489\ua48a\ua48b\ua48c\ua800\ua801\ua803\ua804\ua805\ua807\ua808\ua809\ua80a\ua80c\ua80d\ua80e\ua80f\ua810\ua811\ua812\ua813\ua814\ua815\ua816\ua817\ua818\ua819\ua81a\ua81b\ua81c\ua81d\ua81e\ua81f\ua820\ua821\ua822\uac00\uac01\uac02\uac03\uac04\uac05\uac06\uac07\uac08\uac09\uac0a\uac0b\uac0c\uac0d\uac0e\uac0f\uac10\uac11\uac12\uac13\uac14\uac15\uac16\uac17\uac18\uac19\uac1a\uac1b\uac1c\uac1d\uac1e\uac1f\uac20\uac21\uac22\uac23\uac24\uac25\uac26\uac27\uac28\uac29\uac2a\uac2b\uac2c\uac2d\uac2e\uac2f\uac30\uac31\uac32\uac33\uac34\uac35\uac36\uac37\uac38\uac39\uac3a\uac3b\uac3c\uac3d\uac3e\uac3f\uac40\uac41\uac42\uac43\uac44\uac45\uac46\uac47\uac48\uac49\uac4a\uac4b\uac4c\uac4d\uac4e\uac4f\uac50\uac51\uac52\uac53\uac54\uac55\uac56\uac57\uac58\uac59\uac5a\uac5b\uac5c\uac5d\uac5e\uac5f\uac60\uac61\uac62\uac63\uac64\uac65\uac66\uac67\uac68\uac69\uac6a\uac6b\uac6c\uac6d\uac6e\uac6f\uac70\uac71\uac72\uac73\uac74\uac75\uac76\uac77\uac78\uac79\uac7a\uac7b\uac7c\uac7d\uac7e\uac7f\uac80\uac81\uac82\uac83\uac84\uac85\uac86\uac87\uac88\uac89\uac8a\uac8b\uac8c\uac8d\uac8e\uac8f\uac90\uac91\uac92\uac93\uac94\uac95\uac96\uac97\uac98\uac99\uac9a\uac9b\uac9c\uac9d\uac9e\uac9f\uaca0\uaca1\uaca2\uaca3\uaca4\uaca5\uaca6\uaca7\uaca8\uaca9\uacaa\uacab\uacac\uacad\uacae\uacaf\uacb0\uacb1\uacb2\uacb3\uacb4\uacb5\uacb6\uacb7\uacb8\uacb9\uacba\uacbb\uacbc\uacbd\uacbe\uacbf\uacc0\uacc1\uacc2\uacc3\uacc4\uacc5\uacc6\uacc7\uacc8\uacc9\uacca\uaccb\uaccc\uaccd\uacce\uaccf\uacd0\uacd1\uacd2\uacd3\uacd4\uacd5\uacd6\uacd7\uacd8\uacd9\uacda\uacdb\uacdc\uacdd\uacde\uacdf\uace0\uace1\uace2\uace3\uace4\uace5\uace6\uace7\uace8\uace9\uacea\uaceb\uacec\uaced\uacee\uacef\uacf0\uacf1\uacf2\uacf3\uacf4\uacf5\uacf6\uacf7\uacf8\uacf9\uacfa\uacfb\uacfc\uacfd\uacfe\uacff\uad00\uad01\uad02\uad03\uad04\uad05\uad06\uad07\uad08\uad09\uad0a\uad0b\uad0c\uad0d\uad0e\uad0f\uad10\uad11\uad12\uad13\uad14\uad15\uad16\uad17\uad18\uad19\uad1a\uad1b\uad1c\uad1d\uad1e\uad1f\uad20\uad21\uad22\uad23\uad24\uad25\uad26\uad27\uad28\uad29\uad2a\uad2b\uad2c\uad2d\uad2e\uad2f\uad30\uad31\uad32\uad33\uad34\uad35\uad36\uad37\uad38\uad39\uad3a\uad3b\uad3c\uad3d\uad3e\uad3f\uad40\uad41\uad42\uad43\uad44\uad45\uad46\uad47\uad48\uad49\uad4a\uad4b\uad4c\uad4d\uad4e\uad4f\uad50\uad51\uad52\uad53\uad54\uad55\uad56\uad57\uad58\uad59\uad5a\uad5b\uad5c\uad5d\uad5e\uad5f\uad60\uad61\uad62\uad63\uad64\uad65\uad66\uad67\uad68\uad69\uad6a\uad6b\uad6c\uad6d\uad6e\uad6f\uad70\uad71\uad72\uad73\uad74\uad75\uad76\uad77\uad78\uad79\uad7a\uad7b\uad7c\uad7d\uad7e\uad7f\uad80\uad81\uad82\uad83\uad84\uad85\uad86\uad87\uad88\uad89\uad8a\uad8b\uad8c\uad8d\uad8e\uad8f\uad90\uad91\uad92\uad93\uad94\uad95\uad96\uad97\uad98\uad99\uad9a\uad9b\uad9c\uad9d\uad9e\uad9f\uada0\uada1\uada2\uada3\uada4\uada5\uada6\uada7\uada8\uada9\uadaa\uadab\uadac\uadad\uadae\uadaf\uadb0\uadb1\uadb2\uadb3\uadb4\uadb5\uadb6\uadb7\uadb8\uadb9\uadba\uadbb\uadbc\uadbd\uadbe\uadbf\uadc0\uadc1\uadc2\uadc3\uadc4\uadc5\uadc6\uadc7\uadc8\uadc9\uadca\uadcb\uadcc\uadcd\uadce\uadcf\uadd0\uadd1\uadd2\uadd3\uadd4\uadd5\uadd6\uadd7\uadd8\uadd9\uadda\uaddb\uaddc\uaddd\uadde\uaddf\uade0\uade1\uade2\uade3\uade4\uade5\uade6\uade7\uade8\uade9\uadea\uadeb\uadec\uaded\uadee\uadef\uadf0\uadf1\uadf2\uadf3\uadf4\uadf5\uadf6\uadf7\uadf8\uadf9\uadfa\uadfb\uadfc\uadfd\uadfe\uadff\uae00\uae01\uae02\uae03\uae04\uae05\uae06\uae07\uae08\uae09\uae0a\uae0b\uae0c\uae0d\uae0e\uae0f\uae10\uae11\uae12\uae13\uae14\uae15\uae16\uae17\uae18\uae19\uae1a\uae1b\uae1c\uae1d\uae1e\uae1f\uae20\uae21\uae22\uae23\uae24\uae25\uae26\uae27\uae28\uae29\uae2a\uae2b\uae2c\uae2d\uae2e\uae2f\uae30\uae31\uae32\uae33\uae34\uae35\uae36\uae37\uae38\uae39\uae3a\uae3b\uae3c\uae3d\uae3e\uae3f\uae40\uae41\uae42\uae43\uae44\uae45\uae46\uae47\uae48\uae49\uae4a\uae4b\uae4c\uae4d\uae4e\uae4f\uae50\uae51\uae52\uae53\uae54\uae55\uae56\uae57\uae58\uae59\uae5a\uae5b\uae5c\uae5d\uae5e\uae5f\uae60\uae61\uae62\uae63\uae64\uae65\uae66\uae67\uae68\uae69\uae6a\uae6b\uae6c\uae6d\uae6e\uae6f\uae70\uae71\uae72\uae73\uae74\uae75\uae76\uae77\uae78\uae79\uae7a\uae7b\uae7c\uae7d\uae7e\uae7f\uae80\uae81\uae82\uae83\uae84\uae85\uae86\uae87\uae88\uae89\uae8a\uae8b\uae8c\uae8d\uae8e\uae8f\uae90\uae91\uae92\uae93\uae94\uae95\uae96\uae97\uae98\uae99\uae9a\uae9b\uae9c\uae9d\uae9e\uae9f\uaea0\uaea1\uaea2\uaea3\uaea4\uaea5\uaea6\uaea7\uaea8\uaea9\uaeaa\uaeab\uaeac\uaead\uaeae\uaeaf\uaeb0\uaeb1\uaeb2\uaeb3\uaeb4\uaeb5\uaeb6\uaeb7\uaeb8\uaeb9\uaeba\uaebb\uaebc\uaebd\uaebe\uaebf\uaec0\uaec1\uaec2\uaec3\uaec4\uaec5\uaec6\uaec7\uaec8\uaec9\uaeca\uaecb\uaecc\uaecd\uaece\uaecf\uaed0\uaed1\uaed2\uaed3\uaed4\uaed5\uaed6\uaed7\uaed8\uaed9\uaeda\uaedb\uaedc\uaedd\uaede\uaedf\uaee0\uaee1\uaee2\uaee3\uaee4\uaee5\uaee6\uaee7\uaee8\uaee9\uaeea\uaeeb\uaeec\uaeed\uaeee\uaeef\uaef0\uaef1\uaef2\uaef3\uaef4\uaef5\uaef6\uaef7\uaef8\uaef9\uaefa\uaefb\uaefc\uaefd\uaefe\uaeff\uaf00\uaf01\uaf02\uaf03\uaf04\uaf05\uaf06\uaf07\uaf08\uaf09\uaf0a\uaf0b\uaf0c\uaf0d\uaf0e\uaf0f\uaf10\uaf11\uaf12\uaf13\uaf14\uaf15\uaf16\uaf17\uaf18\uaf19\uaf1a\uaf1b\uaf1c\uaf1d\uaf1e\uaf1f\uaf20\uaf21\uaf22\uaf23\uaf24\uaf25\uaf26\uaf27\uaf28\uaf29\uaf2a\uaf2b\uaf2c\uaf2d\uaf2e\uaf2f\uaf30\uaf31\uaf32\uaf33\uaf34\uaf35\uaf36\uaf37\uaf38\uaf39\uaf3a\uaf3b\uaf3c\uaf3d\uaf3e\uaf3f\uaf40\uaf41\uaf42\uaf43\uaf44\uaf45\uaf46\uaf47\uaf48\uaf49\uaf4a\uaf4b\uaf4c\uaf4d\uaf4e\uaf4f\uaf50\uaf51\uaf52\uaf53\uaf54\uaf55\uaf56\uaf57\uaf58\uaf59\uaf5a\uaf5b\uaf5c\uaf5d\uaf5e\uaf5f\uaf60\uaf61\uaf62\uaf63\uaf64\uaf65\uaf66\uaf67\uaf68\uaf69\uaf6a\uaf6b\uaf6c\uaf6d\uaf6e\uaf6f\uaf70\uaf71\uaf72\uaf73\uaf74\uaf75\uaf76\uaf77\uaf78\uaf79\uaf7a\uaf7b\uaf7c\uaf7d\uaf7e\uaf7f\uaf80\uaf81\uaf82\uaf83\uaf84\uaf85\uaf86\uaf87\uaf88\uaf89\uaf8a\uaf8b\uaf8c\uaf8d\uaf8e\uaf8f\uaf90\uaf91\uaf92\uaf93\uaf94\uaf95\uaf96\uaf97\uaf98\uaf99\uaf9a\uaf9b\uaf9c\uaf9d\uaf9e\uaf9f\uafa0\uafa1\uafa2\uafa3\uafa4\uafa5\uafa6\uafa7\uafa8\uafa9\uafaa\uafab\uafac\uafad\uafae\uafaf\uafb0\uafb1\uafb2\uafb3\uafb4\uafb5\uafb6\uafb7\uafb8\uafb9\uafba\uafbb\uafbc\uafbd\uafbe\uafbf\uafc0\uafc1\uafc2\uafc3\uafc4\uafc5\uafc6\uafc7\uafc8\uafc9\uafca\uafcb\uafcc\uafcd\uafce\uafcf\uafd0\uafd1\uafd2\uafd3\uafd4\uafd5\uafd6\uafd7\uafd8\uafd9\uafda\uafdb\uafdc\uafdd\uafde\uafdf\uafe0\uafe1\uafe2\uafe3\uafe4\uafe5\uafe6\uafe7\uafe8\uafe9\uafea\uafeb\uafec\uafed\uafee\uafef\uaff0\uaff1\uaff2\uaff3\uaff4\uaff5\uaff6\uaff7\uaff8\uaff9\uaffa\uaffb\uaffc\uaffd\uaffe\uafff\ub000\ub001\ub002\ub003\ub004\ub005\ub006\ub007\ub008\ub009\ub00a\ub00b\ub00c\ub00d\ub00e\ub00f\ub010\ub011\ub012\ub013\ub014\ub015\ub016\ub017\ub018\ub019\ub01a\ub01b\ub01c\ub01d\ub01e\ub01f\ub020\ub021\ub022\ub023\ub024\ub025\ub026\ub027\ub028\ub029\ub02a\ub02b\ub02c\ub02d\ub02e\ub02f\ub030\ub031\ub032\ub033\ub034\ub035\ub036\ub037\ub038\ub039\ub03a\ub03b\ub03c\ub03d\ub03e\ub03f\ub040\ub041\ub042\ub043\ub044\ub045\ub046\ub047\ub048\ub049\ub04a\ub04b\ub04c\ub04d\ub04e\ub04f\ub050\ub051\ub052\ub053\ub054\ub055\ub056\ub057\ub058\ub059\ub05a\ub05b\ub05c\ub05d\ub05e\ub05f\ub060\ub061\ub062\ub063\ub064\ub065\ub066\ub067\ub068\ub069\ub06a\ub06b\ub06c\ub06d\ub06e\ub06f\ub070\ub071\ub072\ub073\ub074\ub075\ub076\ub077\ub078\ub079\ub07a\ub07b\ub07c\ub07d\ub07e\ub07f\ub080\ub081\ub082\ub083\ub084\ub085\ub086\ub087\ub088\ub089\ub08a\ub08b\ub08c\ub08d\ub08e\ub08f\ub090\ub091\ub092\ub093\ub094\ub095\ub096\ub097\ub098\ub099\ub09a\ub09b\ub09c\ub09d\ub09e\ub09f\ub0a0\ub0a1\ub0a2\ub0a3\ub0a4\ub0a5\ub0a6\ub0a7\ub0a8\ub0a9\ub0aa\ub0ab\ub0ac\ub0ad\ub0ae\ub0af\ub0b0\ub0b1\ub0b2\ub0b3\ub0b4\ub0b5\ub0b6\ub0b7\ub0b8\ub0b9\ub0ba\ub0bb\ub0bc\ub0bd\ub0be\ub0bf\ub0c0\ub0c1\ub0c2\ub0c3\ub0c4\ub0c5\ub0c6\ub0c7\ub0c8\ub0c9\ub0ca\ub0cb\ub0cc\ub0cd\ub0ce\ub0cf\ub0d0\ub0d1\ub0d2\ub0d3\ub0d4\ub0d5\ub0d6\ub0d7\ub0d8\ub0d9\ub0da\ub0db\ub0dc\ub0dd\ub0de\ub0df\ub0e0\ub0e1\ub0e2\ub0e3\ub0e4\ub0e5\ub0e6\ub0e7\ub0e8\ub0e9\ub0ea\ub0eb\ub0ec\ub0ed\ub0ee\ub0ef\ub0f0\ub0f1\ub0f2\ub0f3\ub0f4\ub0f5\ub0f6\ub0f7\ub0f8\ub0f9\ub0fa\ub0fb\ub0fc\ub0fd\ub0fe\ub0ff\ub100\ub101\ub102\ub103\ub104\ub105\ub106\ub107\ub108\ub109\ub10a\ub10b\ub10c\ub10d\ub10e\ub10f\ub110\ub111\ub112\ub113\ub114\ub115\ub116\ub117\ub118\ub119\ub11a\ub11b\ub11c\ub11d\ub11e\ub11f\ub120\ub121\ub122\ub123\ub124\ub125\ub126\ub127\ub128\ub129\ub12a\ub12b\ub12c\ub12d\ub12e\ub12f\ub130\ub131\ub132\ub133\ub134\ub135\ub136\ub137\ub138\ub139\ub13a\ub13b\ub13c\ub13d\ub13e\ub13f\ub140\ub141\ub142\ub143\ub144\ub145\ub146\ub147\ub148\ub149\ub14a\ub14b\ub14c\ub14d\ub14e\ub14f\ub150\ub151\ub152\ub153\ub154\ub155\ub156\ub157\ub158\ub159\ub15a\ub15b\ub15c\ub15d\ub15e\ub15f\ub160\ub161\ub162\ub163\ub164\ub165\ub166\ub167\ub168\ub169\ub16a\ub16b\ub16c\ub16d\ub16e\ub16f\ub170\ub171\ub172\ub173\ub174\ub175\ub176\ub177\ub178\ub179\ub17a\ub17b\ub17c\ub17d\ub17e\ub17f\ub180\ub181\ub182\ub183\ub184\ub185\ub186\ub187\ub188\ub189\ub18a\ub18b\ub18c\ub18d\ub18e\ub18f\ub190\ub191\ub192\ub193\ub194\ub195\ub196\ub197\ub198\ub199\ub19a\ub19b\ub19c\ub19d\ub19e\ub19f\ub1a0\ub1a1\ub1a2\ub1a3\ub1a4\ub1a5\ub1a6\ub1a7\ub1a8\ub1a9\ub1aa\ub1ab\ub1ac\ub1ad\ub1ae\ub1af\ub1b0\ub1b1\ub1b2\ub1b3\ub1b4\ub1b5\ub1b6\ub1b7\ub1b8\ub1b9\ub1ba\ub1bb\ub1bc\ub1bd\ub1be\ub1bf\ub1c0\ub1c1\ub1c2\ub1c3\ub1c4\ub1c5\ub1c6\ub1c7\ub1c8\ub1c9\ub1ca\ub1cb\ub1cc\ub1cd\ub1ce\ub1cf\ub1d0\ub1d1\ub1d2\ub1d3\ub1d4\ub1d5\ub1d6\ub1d7\ub1d8\ub1d9\ub1da\ub1db\ub1dc\ub1dd\ub1de\ub1df\ub1e0\ub1e1\ub1e2\ub1e3\ub1e4\ub1e5\ub1e6\ub1e7\ub1e8\ub1e9\ub1ea\ub1eb\ub1ec\ub1ed\ub1ee\ub1ef\ub1f0\ub1f1\ub1f2\ub1f3\ub1f4\ub1f5\ub1f6\ub1f7\ub1f8\ub1f9\ub1fa\ub1fb\ub1fc\ub1fd\ub1fe\ub1ff\ub200\ub201\ub202\ub203\ub204\ub205\ub206\ub207\ub208\ub209\ub20a\ub20b\ub20c\ub20d\ub20e\ub20f\ub210\ub211\ub212\ub213\ub214\ub215\ub216\ub217\ub218\ub219\ub21a\ub21b\ub21c\ub21d\ub21e\ub21f\ub220\ub221\ub222\ub223\ub224\ub225\ub226\ub227\ub228\ub229\ub22a\ub22b\ub22c\ub22d\ub22e\ub22f\ub230\ub231\ub232\ub233\ub234\ub235\ub236\ub237\ub238\ub239\ub23a\ub23b\ub23c\ub23d\ub23e\ub23f\ub240\ub241\ub242\ub243\ub244\ub245\ub246\ub247\ub248\ub249\ub24a\ub24b\ub24c\ub24d\ub24e\ub24f\ub250\ub251\ub252\ub253\ub254\ub255\ub256\ub257\ub258\ub259\ub25a\ub25b\ub25c\ub25d\ub25e\ub25f\ub260\ub261\ub262\ub263\ub264\ub265\ub266\ub267\ub268\ub269\ub26a\ub26b\ub26c\ub26d\ub26e\ub26f\ub270\ub271\ub272\ub273\ub274\ub275\ub276\ub277\ub278\ub279\ub27a\ub27b\ub27c\ub27d\ub27e\ub27f\ub280\ub281\ub282\ub283\ub284\ub285\ub286\ub287\ub288\ub289\ub28a\ub28b\ub28c\ub28d\ub28e\ub28f\ub290\ub291\ub292\ub293\ub294\ub295\ub296\ub297\ub298\ub299\ub29a\ub29b\ub29c\ub29d\ub29e\ub29f\ub2a0\ub2a1\ub2a2\ub2a3\ub2a4\ub2a5\ub2a6\ub2a7\ub2a8\ub2a9\ub2aa\ub2ab\ub2ac\ub2ad\ub2ae\ub2af\ub2b0\ub2b1\ub2b2\ub2b3\ub2b4\ub2b5\ub2b6\ub2b7\ub2b8\ub2b9\ub2ba\ub2bb\ub2bc\ub2bd\ub2be\ub2bf\ub2c0\ub2c1\ub2c2\ub2c3\ub2c4\ub2c5\ub2c6\ub2c7\ub2c8\ub2c9\ub2ca\ub2cb\ub2cc\ub2cd\ub2ce\ub2cf\ub2d0\ub2d1\ub2d2\ub2d3\ub2d4\ub2d5\ub2d6\ub2d7\ub2d8\ub2d9\ub2da\ub2db\ub2dc\ub2dd\ub2de\ub2df\ub2e0\ub2e1\ub2e2\ub2e3\ub2e4\ub2e5\ub2e6\ub2e7\ub2e8\ub2e9\ub2ea\ub2eb\ub2ec\ub2ed\ub2ee\ub2ef\ub2f0\ub2f1\ub2f2\ub2f3\ub2f4\ub2f5\ub2f6\ub2f7\ub2f8\ub2f9\ub2fa\ub2fb\ub2fc\ub2fd\ub2fe\ub2ff\ub300\ub301\ub302\ub303\ub304\ub305\ub306\ub307\ub308\ub309\ub30a\ub30b\ub30c\ub30d\ub30e\ub30f\ub310\ub311\ub312\ub313\ub314\ub315\ub316\ub317\ub318\ub319\ub31a\ub31b\ub31c\ub31d\ub31e\ub31f\ub320\ub321\ub322\ub323\ub324\ub325\ub326\ub327\ub328\ub329\ub32a\ub32b\ub32c\ub32d\ub32e\ub32f\ub330\ub331\ub332\ub333\ub334\ub335\ub336\ub337\ub338\ub339\ub33a\ub33b\ub33c\ub33d\ub33e\ub33f\ub340\ub341\ub342\ub343\ub344\ub345\ub346\ub347\ub348\ub349\ub34a\ub34b\ub34c\ub34d\ub34e\ub34f\ub350\ub351\ub352\ub353\ub354\ub355\ub356\ub357\ub358\ub359\ub35a\ub35b\ub35c\ub35d\ub35e\ub35f\ub360\ub361\ub362\ub363\ub364\ub365\ub366\ub367\ub368\ub369\ub36a\ub36b\ub36c\ub36d\ub36e\ub36f\ub370\ub371\ub372\ub373\ub374\ub375\ub376\ub377\ub378\ub379\ub37a\ub37b\ub37c\ub37d\ub37e\ub37f\ub380\ub381\ub382\ub383\ub384\ub385\ub386\ub387\ub388\ub389\ub38a\ub38b\ub38c\ub38d\ub38e\ub38f\ub390\ub391\ub392\ub393\ub394\ub395\ub396\ub397\ub398\ub399\ub39a\ub39b\ub39c\ub39d\ub39e\ub39f\ub3a0\ub3a1\ub3a2\ub3a3\ub3a4\ub3a5\ub3a6\ub3a7\ub3a8\ub3a9\ub3aa\ub3ab\ub3ac\ub3ad\ub3ae\ub3af\ub3b0\ub3b1\ub3b2\ub3b3\ub3b4\ub3b5\ub3b6\ub3b7\ub3b8\ub3b9\ub3ba\ub3bb\ub3bc\ub3bd\ub3be\ub3bf\ub3c0\ub3c1\ub3c2\ub3c3\ub3c4\ub3c5\ub3c6\ub3c7\ub3c8\ub3c9\ub3ca\ub3cb\ub3cc\ub3cd\ub3ce\ub3cf\ub3d0\ub3d1\ub3d2\ub3d3\ub3d4\ub3d5\ub3d6\ub3d7\ub3d8\ub3d9\ub3da\ub3db\ub3dc\ub3dd\ub3de\ub3df\ub3e0\ub3e1\ub3e2\ub3e3\ub3e4\ub3e5\ub3e6\ub3e7\ub3e8\ub3e9\ub3ea\ub3eb\ub3ec\ub3ed\ub3ee\ub3ef\ub3f0\ub3f1\ub3f2\ub3f3\ub3f4\ub3f5\ub3f6\ub3f7\ub3f8\ub3f9\ub3fa\ub3fb\ub3fc\ub3fd\ub3fe\ub3ff\ub400\ub401\ub402\ub403\ub404\ub405\ub406\ub407\ub408\ub409\ub40a\ub40b\ub40c\ub40d\ub40e\ub40f\ub410\ub411\ub412\ub413\ub414\ub415\ub416\ub417\ub418\ub419\ub41a\ub41b\ub41c\ub41d\ub41e\ub41f\ub420\ub421\ub422\ub423\ub424\ub425\ub426\ub427\ub428\ub429\ub42a\ub42b\ub42c\ub42d\ub42e\ub42f\ub430\ub431\ub432\ub433\ub434\ub435\ub436\ub437\ub438\ub439\ub43a\ub43b\ub43c\ub43d\ub43e\ub43f\ub440\ub441\ub442\ub443\ub444\ub445\ub446\ub447\ub448\ub449\ub44a\ub44b\ub44c\ub44d\ub44e\ub44f\ub450\ub451\ub452\ub453\ub454\ub455\ub456\ub457\ub458\ub459\ub45a\ub45b\ub45c\ub45d\ub45e\ub45f\ub460\ub461\ub462\ub463\ub464\ub465\ub466\ub467\ub468\ub469\ub46a\ub46b\ub46c\ub46d\ub46e\ub46f\ub470\ub471\ub472\ub473\ub474\ub475\ub476\ub477\ub478\ub479\ub47a\ub47b\ub47c\ub47d\ub47e\ub47f\ub480\ub481\ub482\ub483\ub484\ub485\ub486\ub487\ub488\ub489\ub48a\ub48b\ub48c\ub48d\ub48e\ub48f\ub490\ub491\ub492\ub493\ub494\ub495\ub496\ub497\ub498\ub499\ub49a\ub49b\ub49c\ub49d\ub49e\ub49f\ub4a0\ub4a1\ub4a2\ub4a3\ub4a4\ub4a5\ub4a6\ub4a7\ub4a8\ub4a9\ub4aa\ub4ab\ub4ac\ub4ad\ub4ae\ub4af\ub4b0\ub4b1\ub4b2\ub4b3\ub4b4\ub4b5\ub4b6\ub4b7\ub4b8\ub4b9\ub4ba\ub4bb\ub4bc\ub4bd\ub4be\ub4bf\ub4c0\ub4c1\ub4c2\ub4c3\ub4c4\ub4c5\ub4c6\ub4c7\ub4c8\ub4c9\ub4ca\ub4cb\ub4cc\ub4cd\ub4ce\ub4cf\ub4d0\ub4d1\ub4d2\ub4d3\ub4d4\ub4d5\ub4d6\ub4d7\ub4d8\ub4d9\ub4da\ub4db\ub4dc\ub4dd\ub4de\ub4df\ub4e0\ub4e1\ub4e2\ub4e3\ub4e4\ub4e5\ub4e6\ub4e7\ub4e8\ub4e9\ub4ea\ub4eb\ub4ec\ub4ed\ub4ee\ub4ef\ub4f0\ub4f1\ub4f2\ub4f3\ub4f4\ub4f5\ub4f6\ub4f7\ub4f8\ub4f9\ub4fa\ub4fb\ub4fc\ub4fd\ub4fe\ub4ff\ub500\ub501\ub502\ub503\ub504\ub505\ub506\ub507\ub508\ub509\ub50a\ub50b\ub50c\ub50d\ub50e\ub50f\ub510\ub511\ub512\ub513\ub514\ub515\ub516\ub517\ub518\ub519\ub51a\ub51b\ub51c\ub51d\ub51e\ub51f\ub520\ub521\ub522\ub523\ub524\ub525\ub526\ub527\ub528\ub529\ub52a\ub52b\ub52c\ub52d\ub52e\ub52f\ub530\ub531\ub532\ub533\ub534\ub535\ub536\ub537\ub538\ub539\ub53a\ub53b\ub53c\ub53d\ub53e\ub53f\ub540\ub541\ub542\ub543\ub544\ub545\ub546\ub547\ub548\ub549\ub54a\ub54b\ub54c\ub54d\ub54e\ub54f\ub550\ub551\ub552\ub553\ub554\ub555\ub556\ub557\ub558\ub559\ub55a\ub55b\ub55c\ub55d\ub55e\ub55f\ub560\ub561\ub562\ub563\ub564\ub565\ub566\ub567\ub568\ub569\ub56a\ub56b\ub56c\ub56d\ub56e\ub56f\ub570\ub571\ub572\ub573\ub574\ub575\ub576\ub577\ub578\ub579\ub57a\ub57b\ub57c\ub57d\ub57e\ub57f\ub580\ub581\ub582\ub583\ub584\ub585\ub586\ub587\ub588\ub589\ub58a\ub58b\ub58c\ub58d\ub58e\ub58f\ub590\ub591\ub592\ub593\ub594\ub595\ub596\ub597\ub598\ub599\ub59a\ub59b\ub59c\ub59d\ub59e\ub59f\ub5a0\ub5a1\ub5a2\ub5a3\ub5a4\ub5a5\ub5a6\ub5a7\ub5a8\ub5a9\ub5aa\ub5ab\ub5ac\ub5ad\ub5ae\ub5af\ub5b0\ub5b1\ub5b2\ub5b3\ub5b4\ub5b5\ub5b6\ub5b7\ub5b8\ub5b9\ub5ba\ub5bb\ub5bc\ub5bd\ub5be\ub5bf\ub5c0\ub5c1\ub5c2\ub5c3\ub5c4\ub5c5\ub5c6\ub5c7\ub5c8\ub5c9\ub5ca\ub5cb\ub5cc\ub5cd\ub5ce\ub5cf\ub5d0\ub5d1\ub5d2\ub5d3\ub5d4\ub5d5\ub5d6\ub5d7\ub5d8\ub5d9\ub5da\ub5db\ub5dc\ub5dd\ub5de\ub5df\ub5e0\ub5e1\ub5e2\ub5e3\ub5e4\ub5e5\ub5e6\ub5e7\ub5e8\ub5e9\ub5ea\ub5eb\ub5ec\ub5ed\ub5ee\ub5ef\ub5f0\ub5f1\ub5f2\ub5f3\ub5f4\ub5f5\ub5f6\ub5f7\ub5f8\ub5f9\ub5fa\ub5fb\ub5fc\ub5fd\ub5fe\ub5ff\ub600\ub601\ub602\ub603\ub604\ub605\ub606\ub607\ub608\ub609\ub60a\ub60b\ub60c\ub60d\ub60e\ub60f\ub610\ub611\ub612\ub613\ub614\ub615\ub616\ub617\ub618\ub619\ub61a\ub61b\ub61c\ub61d\ub61e\ub61f\ub620\ub621\ub622\ub623\ub624\ub625\ub626\ub627\ub628\ub629\ub62a\ub62b\ub62c\ub62d\ub62e\ub62f\ub630\ub631\ub632\ub633\ub634\ub635\ub636\ub637\ub638\ub639\ub63a\ub63b\ub63c\ub63d\ub63e\ub63f\ub640\ub641\ub642\ub643\ub644\ub645\ub646\ub647\ub648\ub649\ub64a\ub64b\ub64c\ub64d\ub64e\ub64f\ub650\ub651\ub652\ub653\ub654\ub655\ub656\ub657\ub658\ub659\ub65a\ub65b\ub65c\ub65d\ub65e\ub65f\ub660\ub661\ub662\ub663\ub664\ub665\ub666\ub667\ub668\ub669\ub66a\ub66b\ub66c\ub66d\ub66e\ub66f\ub670\ub671\ub672\ub673\ub674\ub675\ub676\ub677\ub678\ub679\ub67a\ub67b\ub67c\ub67d\ub67e\ub67f\ub680\ub681\ub682\ub683\ub684\ub685\ub686\ub687\ub688\ub689\ub68a\ub68b\ub68c\ub68d\ub68e\ub68f\ub690\ub691\ub692\ub693\ub694\ub695\ub696\ub697\ub698\ub699\ub69a\ub69b\ub69c\ub69d\ub69e\ub69f\ub6a0\ub6a1\ub6a2\ub6a3\ub6a4\ub6a5\ub6a6\ub6a7\ub6a8\ub6a9\ub6aa\ub6ab\ub6ac\ub6ad\ub6ae\ub6af\ub6b0\ub6b1\ub6b2\ub6b3\ub6b4\ub6b5\ub6b6\ub6b7\ub6b8\ub6b9\ub6ba\ub6bb\ub6bc\ub6bd\ub6be\ub6bf\ub6c0\ub6c1\ub6c2\ub6c3\ub6c4\ub6c5\ub6c6\ub6c7\ub6c8\ub6c9\ub6ca\ub6cb\ub6cc\ub6cd\ub6ce\ub6cf\ub6d0\ub6d1\ub6d2\ub6d3\ub6d4\ub6d5\ub6d6\ub6d7\ub6d8\ub6d9\ub6da\ub6db\ub6dc\ub6dd\ub6de\ub6df\ub6e0\ub6e1\ub6e2\ub6e3\ub6e4\ub6e5\ub6e6\ub6e7\ub6e8\ub6e9\ub6ea\ub6eb\ub6ec\ub6ed\ub6ee\ub6ef\ub6f0\ub6f1\ub6f2\ub6f3\ub6f4\ub6f5\ub6f6\ub6f7\ub6f8\ub6f9\ub6fa\ub6fb\ub6fc\ub6fd\ub6fe\ub6ff\ub700\ub701\ub702\ub703\ub704\ub705\ub706\ub707\ub708\ub709\ub70a\ub70b\ub70c\ub70d\ub70e\ub70f\ub710\ub711\ub712\ub713\ub714\ub715\ub716\ub717\ub718\ub719\ub71a\ub71b\ub71c\ub71d\ub71e\ub71f\ub720\ub721\ub722\ub723\ub724\ub725\ub726\ub727\ub728\ub729\ub72a\ub72b\ub72c\ub72d\ub72e\ub72f\ub730\ub731\ub732\ub733\ub734\ub735\ub736\ub737\ub738\ub739\ub73a\ub73b\ub73c\ub73d\ub73e\ub73f\ub740\ub741\ub742\ub743\ub744\ub745\ub746\ub747\ub748\ub749\ub74a\ub74b\ub74c\ub74d\ub74e\ub74f\ub750\ub751\ub752\ub753\ub754\ub755\ub756\ub757\ub758\ub759\ub75a\ub75b\ub75c\ub75d\ub75e\ub75f\ub760\ub761\ub762\ub763\ub764\ub765\ub766\ub767\ub768\ub769\ub76a\ub76b\ub76c\ub76d\ub76e\ub76f\ub770\ub771\ub772\ub773\ub774\ub775\ub776\ub777\ub778\ub779\ub77a\ub77b\ub77c\ub77d\ub77e\ub77f\ub780\ub781\ub782\ub783\ub784\ub785\ub786\ub787\ub788\ub789\ub78a\ub78b\ub78c\ub78d\ub78e\ub78f\ub790\ub791\ub792\ub793\ub794\ub795\ub796\ub797\ub798\ub799\ub79a\ub79b\ub79c\ub79d\ub79e\ub79f\ub7a0\ub7a1\ub7a2\ub7a3\ub7a4\ub7a5\ub7a6\ub7a7\ub7a8\ub7a9\ub7aa\ub7ab\ub7ac\ub7ad\ub7ae\ub7af\ub7b0\ub7b1\ub7b2\ub7b3\ub7b4\ub7b5\ub7b6\ub7b7\ub7b8\ub7b9\ub7ba\ub7bb\ub7bc\ub7bd\ub7be\ub7bf\ub7c0\ub7c1\ub7c2\ub7c3\ub7c4\ub7c5\ub7c6\ub7c7\ub7c8\ub7c9\ub7ca\ub7cb\ub7cc\ub7cd\ub7ce\ub7cf\ub7d0\ub7d1\ub7d2\ub7d3\ub7d4\ub7d5\ub7d6\ub7d7\ub7d8\ub7d9\ub7da\ub7db\ub7dc\ub7dd\ub7de\ub7df\ub7e0\ub7e1\ub7e2\ub7e3\ub7e4\ub7e5\ub7e6\ub7e7\ub7e8\ub7e9\ub7ea\ub7eb\ub7ec\ub7ed\ub7ee\ub7ef\ub7f0\ub7f1\ub7f2\ub7f3\ub7f4\ub7f5\ub7f6\ub7f7\ub7f8\ub7f9\ub7fa\ub7fb\ub7fc\ub7fd\ub7fe\ub7ff\ub800\ub801\ub802\ub803\ub804\ub805\ub806\ub807\ub808\ub809\ub80a\ub80b\ub80c\ub80d\ub80e\ub80f\ub810\ub811\ub812\ub813\ub814\ub815\ub816\ub817\ub818\ub819\ub81a\ub81b\ub81c\ub81d\ub81e\ub81f\ub820\ub821\ub822\ub823\ub824\ub825\ub826\ub827\ub828\ub829\ub82a\ub82b\ub82c\ub82d\ub82e\ub82f\ub830\ub831\ub832\ub833\ub834\ub835\ub836\ub837\ub838\ub839\ub83a\ub83b\ub83c\ub83d\ub83e\ub83f\ub840\ub841\ub842\ub843\ub844\ub845\ub846\ub847\ub848\ub849\ub84a\ub84b\ub84c\ub84d\ub84e\ub84f\ub850\ub851\ub852\ub853\ub854\ub855\ub856\ub857\ub858\ub859\ub85a\ub85b\ub85c\ub85d\ub85e\ub85f\ub860\ub861\ub862\ub863\ub864\ub865\ub866\ub867\ub868\ub869\ub86a\ub86b\ub86c\ub86d\ub86e\ub86f\ub870\ub871\ub872\ub873\ub874\ub875\ub876\ub877\ub878\ub879\ub87a\ub87b\ub87c\ub87d\ub87e\ub87f\ub880\ub881\ub882\ub883\ub884\ub885\ub886\ub887\ub888\ub889\ub88a\ub88b\ub88c\ub88d\ub88e\ub88f\ub890\ub891\ub892\ub893\ub894\ub895\ub896\ub897\ub898\ub899\ub89a\ub89b\ub89c\ub89d\ub89e\ub89f\ub8a0\ub8a1\ub8a2\ub8a3\ub8a4\ub8a5\ub8a6\ub8a7\ub8a8\ub8a9\ub8aa\ub8ab\ub8ac\ub8ad\ub8ae\ub8af\ub8b0\ub8b1\ub8b2\ub8b3\ub8b4\ub8b5\ub8b6\ub8b7\ub8b8\ub8b9\ub8ba\ub8bb\ub8bc\ub8bd\ub8be\ub8bf\ub8c0\ub8c1\ub8c2\ub8c3\ub8c4\ub8c5\ub8c6\ub8c7\ub8c8\ub8c9\ub8ca\ub8cb\ub8cc\ub8cd\ub8ce\ub8cf\ub8d0\ub8d1\ub8d2\ub8d3\ub8d4\ub8d5\ub8d6\ub8d7\ub8d8\ub8d9\ub8da\ub8db\ub8dc\ub8dd\ub8de\ub8df\ub8e0\ub8e1\ub8e2\ub8e3\ub8e4\ub8e5\ub8e6\ub8e7\ub8e8\ub8e9\ub8ea\ub8eb\ub8ec\ub8ed\ub8ee\ub8ef\ub8f0\ub8f1\ub8f2\ub8f3\ub8f4\ub8f5\ub8f6\ub8f7\ub8f8\ub8f9\ub8fa\ub8fb\ub8fc\ub8fd\ub8fe\ub8ff\ub900\ub901\ub902\ub903\ub904\ub905\ub906\ub907\ub908\ub909\ub90a\ub90b\ub90c\ub90d\ub90e\ub90f\ub910\ub911\ub912\ub913\ub914\ub915\ub916\ub917\ub918\ub919\ub91a\ub91b\ub91c\ub91d\ub91e\ub91f\ub920\ub921\ub922\ub923\ub924\ub925\ub926\ub927\ub928\ub929\ub92a\ub92b\ub92c\ub92d\ub92e\ub92f\ub930\ub931\ub932\ub933\ub934\ub935\ub936\ub937\ub938\ub939\ub93a\ub93b\ub93c\ub93d\ub93e\ub93f\ub940\ub941\ub942\ub943\ub944\ub945\ub946\ub947\ub948\ub949\ub94a\ub94b\ub94c\ub94d\ub94e\ub94f\ub950\ub951\ub952\ub953\ub954\ub955\ub956\ub957\ub958\ub959\ub95a\ub95b\ub95c\ub95d\ub95e\ub95f\ub960\ub961\ub962\ub963\ub964\ub965\ub966\ub967\ub968\ub969\ub96a\ub96b\ub96c\ub96d\ub96e\ub96f\ub970\ub971\ub972\ub973\ub974\ub975\ub976\ub977\ub978\ub979\ub97a\ub97b\ub97c\ub97d\ub97e\ub97f\ub980\ub981\ub982\ub983\ub984\ub985\ub986\ub987\ub988\ub989\ub98a\ub98b\ub98c\ub98d\ub98e\ub98f\ub990\ub991\ub992\ub993\ub994\ub995\ub996\ub997\ub998\ub999\ub99a\ub99b\ub99c\ub99d\ub99e\ub99f\ub9a0\ub9a1\ub9a2\ub9a3\ub9a4\ub9a5\ub9a6\ub9a7\ub9a8\ub9a9\ub9aa\ub9ab\ub9ac\ub9ad\ub9ae\ub9af\ub9b0\ub9b1\ub9b2\ub9b3\ub9b4\ub9b5\ub9b6\ub9b7\ub9b8\ub9b9\ub9ba\ub9bb\ub9bc\ub9bd\ub9be\ub9bf\ub9c0\ub9c1\ub9c2\ub9c3\ub9c4\ub9c5\ub9c6\ub9c7\ub9c8\ub9c9\ub9ca\ub9cb\ub9cc\ub9cd\ub9ce\ub9cf\ub9d0\ub9d1\ub9d2\ub9d3\ub9d4\ub9d5\ub9d6\ub9d7\ub9d8\ub9d9\ub9da\ub9db\ub9dc\ub9dd\ub9de\ub9df\ub9e0\ub9e1\ub9e2\ub9e3\ub9e4\ub9e5\ub9e6\ub9e7\ub9e8\ub9e9\ub9ea\ub9eb\ub9ec\ub9ed\ub9ee\ub9ef\ub9f0\ub9f1\ub9f2\ub9f3\ub9f4\ub9f5\ub9f6\ub9f7\ub9f8\ub9f9\ub9fa\ub9fb\ub9fc\ub9fd\ub9fe\ub9ff\uba00\uba01\uba02\uba03\uba04\uba05\uba06\uba07\uba08\uba09\uba0a\uba0b\uba0c\uba0d\uba0e\uba0f\uba10\uba11\uba12\uba13\uba14\uba15\uba16\uba17\uba18\uba19\uba1a\uba1b\uba1c\uba1d\uba1e\uba1f\uba20\uba21\uba22\uba23\uba24\uba25\uba26\uba27\uba28\uba29\uba2a\uba2b\uba2c\uba2d\uba2e\uba2f\uba30\uba31\uba32\uba33\uba34\uba35\uba36\uba37\uba38\uba39\uba3a\uba3b\uba3c\uba3d\uba3e\uba3f\uba40\uba41\uba42\uba43\uba44\uba45\uba46\uba47\uba48\uba49\uba4a\uba4b\uba4c\uba4d\uba4e\uba4f\uba50\uba51\uba52\uba53\uba54\uba55\uba56\uba57\uba58\uba59\uba5a\uba5b\uba5c\uba5d\uba5e\uba5f\uba60\uba61\uba62\uba63\uba64\uba65\uba66\uba67\uba68\uba69\uba6a\uba6b\uba6c\uba6d\uba6e\uba6f\uba70\uba71\uba72\uba73\uba74\uba75\uba76\uba77\uba78\uba79\uba7a\uba7b\uba7c\uba7d\uba7e\uba7f\uba80\uba81\uba82\uba83\uba84\uba85\uba86\uba87\uba88\uba89\uba8a\uba8b\uba8c\uba8d\uba8e\uba8f\uba90\uba91\uba92\uba93\uba94\uba95\uba96\uba97\uba98\uba99\uba9a\uba9b\uba9c\uba9d\uba9e\uba9f\ubaa0\ubaa1\ubaa2\ubaa3\ubaa4\ubaa5\ubaa6\ubaa7\ubaa8\ubaa9\ubaaa\ubaab\ubaac\ubaad\ubaae\ubaaf\ubab0\ubab1\ubab2\ubab3\ubab4\ubab5\ubab6\ubab7\ubab8\ubab9\ubaba\ubabb\ubabc\ubabd\ubabe\ubabf\ubac0\ubac1\ubac2\ubac3\ubac4\ubac5\ubac6\ubac7\ubac8\ubac9\ubaca\ubacb\ubacc\ubacd\ubace\ubacf\ubad0\ubad1\ubad2\ubad3\ubad4\ubad5\ubad6\ubad7\ubad8\ubad9\ubada\ubadb\ubadc\ubadd\ubade\ubadf\ubae0\ubae1\ubae2\ubae3\ubae4\ubae5\ubae6\ubae7\ubae8\ubae9\ubaea\ubaeb\ubaec\ubaed\ubaee\ubaef\ubaf0\ubaf1\ubaf2\ubaf3\ubaf4\ubaf5\ubaf6\ubaf7\ubaf8\ubaf9\ubafa\ubafb\ubafc\ubafd\ubafe\ubaff\ubb00\ubb01\ubb02\ubb03\ubb04\ubb05\ubb06\ubb07\ubb08\ubb09\ubb0a\ubb0b\ubb0c\ubb0d\ubb0e\ubb0f\ubb10\ubb11\ubb12\ubb13\ubb14\ubb15\ubb16\ubb17\ubb18\ubb19\ubb1a\ubb1b\ubb1c\ubb1d\ubb1e\ubb1f\ubb20\ubb21\ubb22\ubb23\ubb24\ubb25\ubb26\ubb27\ubb28\ubb29\ubb2a\ubb2b\ubb2c\ubb2d\ubb2e\ubb2f\ubb30\ubb31\ubb32\ubb33\ubb34\ubb35\ubb36\ubb37\ubb38\ubb39\ubb3a\ubb3b\ubb3c\ubb3d\ubb3e\ubb3f\ubb40\ubb41\ubb42\ubb43\ubb44\ubb45\ubb46\ubb47\ubb48\ubb49\ubb4a\ubb4b\ubb4c\ubb4d\ubb4e\ubb4f\ubb50\ubb51\ubb52\ubb53\ubb54\ubb55\ubb56\ubb57\ubb58\ubb59\ubb5a\ubb5b\ubb5c\ubb5d\ubb5e\ubb5f\ubb60\ubb61\ubb62\ubb63\ubb64\ubb65\ubb66\ubb67\ubb68\ubb69\ubb6a\ubb6b\ubb6c\ubb6d\ubb6e\ubb6f\ubb70\ubb71\ubb72\ubb73\ubb74\ubb75\ubb76\ubb77\ubb78\ubb79\ubb7a\ubb7b\ubb7c\ubb7d\ubb7e\ubb7f\ubb80\ubb81\ubb82\ubb83\ubb84\ubb85\ubb86\ubb87\ubb88\ubb89\ubb8a\ubb8b\ubb8c\ubb8d\ubb8e\ubb8f\ubb90\ubb91\ubb92\ubb93\ubb94\ubb95\ubb96\ubb97\ubb98\ubb99\ubb9a\ubb9b\ubb9c\ubb9d\ubb9e\ubb9f\ubba0\ubba1\ubba2\ubba3\ubba4\ubba5\ubba6\ubba7\ubba8\ubba9\ubbaa\ubbab\ubbac\ubbad\ubbae\ubbaf\ubbb0\ubbb1\ubbb2\ubbb3\ubbb4\ubbb5\ubbb6\ubbb7\ubbb8\ubbb9\ubbba\ubbbb\ubbbc\ubbbd\ubbbe\ubbbf\ubbc0\ubbc1\ubbc2\ubbc3\ubbc4\ubbc5\ubbc6\ubbc7\ubbc8\ubbc9\ubbca\ubbcb\ubbcc\ubbcd\ubbce\ubbcf\ubbd0\ubbd1\ubbd2\ubbd3\ubbd4\ubbd5\ubbd6\ubbd7\ubbd8\ubbd9\ubbda\ubbdb\ubbdc\ubbdd\ubbde\ubbdf\ubbe0\ubbe1\ubbe2\ubbe3\ubbe4\ubbe5\ubbe6\ubbe7\ubbe8\ubbe9\ubbea\ubbeb\ubbec\ubbed\ubbee\ubbef\ubbf0\ubbf1\ubbf2\ubbf3\ubbf4\ubbf5\ubbf6\ubbf7\ubbf8\ubbf9\ubbfa\ubbfb\ubbfc\ubbfd\ubbfe\ubbff\ubc00\ubc01\ubc02\ubc03\ubc04\ubc05\ubc06\ubc07\ubc08\ubc09\ubc0a\ubc0b\ubc0c\ubc0d\ubc0e\ubc0f\ubc10\ubc11\ubc12\ubc13\ubc14\ubc15\ubc16\ubc17\ubc18\ubc19\ubc1a\ubc1b\ubc1c\ubc1d\ubc1e\ubc1f\ubc20\ubc21\ubc22\ubc23\ubc24\ubc25\ubc26\ubc27\ubc28\ubc29\ubc2a\ubc2b\ubc2c\ubc2d\ubc2e\ubc2f\ubc30\ubc31\ubc32\ubc33\ubc34\ubc35\ubc36\ubc37\ubc38\ubc39\ubc3a\ubc3b\ubc3c\ubc3d\ubc3e\ubc3f\ubc40\ubc41\ubc42\ubc43\ubc44\ubc45\ubc46\ubc47\ubc48\ubc49\ubc4a\ubc4b\ubc4c\ubc4d\ubc4e\ubc4f\ubc50\ubc51\ubc52\ubc53\ubc54\ubc55\ubc56\ubc57\ubc58\ubc59\ubc5a\ubc5b\ubc5c\ubc5d\ubc5e\ubc5f\ubc60\ubc61\ubc62\ubc63\ubc64\ubc65\ubc66\ubc67\ubc68\ubc69\ubc6a\ubc6b\ubc6c\ubc6d\ubc6e\ubc6f\ubc70\ubc71\ubc72\ubc73\ubc74\ubc75\ubc76\ubc77\ubc78\ubc79\ubc7a\ubc7b\ubc7c\ubc7d\ubc7e\ubc7f\ubc80\ubc81\ubc82\ubc83\ubc84\ubc85\ubc86\ubc87\ubc88\ubc89\ubc8a\ubc8b\ubc8c\ubc8d\ubc8e\ubc8f\ubc90\ubc91\ubc92\ubc93\ubc94\ubc95\ubc96\ubc97\ubc98\ubc99\ubc9a\ubc9b\ubc9c\ubc9d\ubc9e\ubc9f\ubca0\ubca1\ubca2\ubca3\ubca4\ubca5\ubca6\ubca7\ubca8\ubca9\ubcaa\ubcab\ubcac\ubcad\ubcae\ubcaf\ubcb0\ubcb1\ubcb2\ubcb3\ubcb4\ubcb5\ubcb6\ubcb7\ubcb8\ubcb9\ubcba\ubcbb\ubcbc\ubcbd\ubcbe\ubcbf\ubcc0\ubcc1\ubcc2\ubcc3\ubcc4\ubcc5\ubcc6\ubcc7\ubcc8\ubcc9\ubcca\ubccb\ubccc\ubccd\ubcce\ubccf\ubcd0\ubcd1\ubcd2\ubcd3\ubcd4\ubcd5\ubcd6\ubcd7\ubcd8\ubcd9\ubcda\ubcdb\ubcdc\ubcdd\ubcde\ubcdf\ubce0\ubce1\ubce2\ubce3\ubce4\ubce5\ubce6\ubce7\ubce8\ubce9\ubcea\ubceb\ubcec\ubced\ubcee\ubcef\ubcf0\ubcf1\ubcf2\ubcf3\ubcf4\ubcf5\ubcf6\ubcf7\ubcf8\ubcf9\ubcfa\ubcfb\ubcfc\ubcfd\ubcfe\ubcff\ubd00\ubd01\ubd02\ubd03\ubd04\ubd05\ubd06\ubd07\ubd08\ubd09\ubd0a\ubd0b\ubd0c\ubd0d\ubd0e\ubd0f\ubd10\ubd11\ubd12\ubd13\ubd14\ubd15\ubd16\ubd17\ubd18\ubd19\ubd1a\ubd1b\ubd1c\ubd1d\ubd1e\ubd1f\ubd20\ubd21\ubd22\ubd23\ubd24\ubd25\ubd26\ubd27\ubd28\ubd29\ubd2a\ubd2b\ubd2c\ubd2d\ubd2e\ubd2f\ubd30\ubd31\ubd32\ubd33\ubd34\ubd35\ubd36\ubd37\ubd38\ubd39\ubd3a\ubd3b\ubd3c\ubd3d\ubd3e\ubd3f\ubd40\ubd41\ubd42\ubd43\ubd44\ubd45\ubd46\ubd47\ubd48\ubd49\ubd4a\ubd4b\ubd4c\ubd4d\ubd4e\ubd4f\ubd50\ubd51\ubd52\ubd53\ubd54\ubd55\ubd56\ubd57\ubd58\ubd59\ubd5a\ubd5b\ubd5c\ubd5d\ubd5e\ubd5f\ubd60\ubd61\ubd62\ubd63\ubd64\ubd65\ubd66\ubd67\ubd68\ubd69\ubd6a\ubd6b\ubd6c\ubd6d\ubd6e\ubd6f\ubd70\ubd71\ubd72\ubd73\ubd74\ubd75\ubd76\ubd77\ubd78\ubd79\ubd7a\ubd7b\ubd7c\ubd7d\ubd7e\ubd7f\ubd80\ubd81\ubd82\ubd83\ubd84\ubd85\ubd86\ubd87\ubd88\ubd89\ubd8a\ubd8b\ubd8c\ubd8d\ubd8e\ubd8f\ubd90\ubd91\ubd92\ubd93\ubd94\ubd95\ubd96\ubd97\ubd98\ubd99\ubd9a\ubd9b\ubd9c\ubd9d\ubd9e\ubd9f\ubda0\ubda1\ubda2\ubda3\ubda4\ubda5\ubda6\ubda7\ubda8\ubda9\ubdaa\ubdab\ubdac\ubdad\ubdae\ubdaf\ubdb0\ubdb1\ubdb2\ubdb3\ubdb4\ubdb5\ubdb6\ubdb7\ubdb8\ubdb9\ubdba\ubdbb\ubdbc\ubdbd\ubdbe\ubdbf\ubdc0\ubdc1\ubdc2\ubdc3\ubdc4\ubdc5\ubdc6\ubdc7\ubdc8\ubdc9\ubdca\ubdcb\ubdcc\ubdcd\ubdce\ubdcf\ubdd0\ubdd1\ubdd2\ubdd3\ubdd4\ubdd5\ubdd6\ubdd7\ubdd8\ubdd9\ubdda\ubddb\ubddc\ubddd\ubdde\ubddf\ubde0\ubde1\ubde2\ubde3\ubde4\ubde5\ubde6\ubde7\ubde8\ubde9\ubdea\ubdeb\ubdec\ubded\ubdee\ubdef\ubdf0\ubdf1\ubdf2\ubdf3\ubdf4\ubdf5\ubdf6\ubdf7\ubdf8\ubdf9\ubdfa\ubdfb\ubdfc\ubdfd\ubdfe\ubdff\ube00\ube01\ube02\ube03\ube04\ube05\ube06\ube07\ube08\ube09\ube0a\ube0b\ube0c\ube0d\ube0e\ube0f\ube10\ube11\ube12\ube13\ube14\ube15\ube16\ube17\ube18\ube19\ube1a\ube1b\ube1c\ube1d\ube1e\ube1f\ube20\ube21\ube22\ube23\ube24\ube25\ube26\ube27\ube28\ube29\ube2a\ube2b\ube2c\ube2d\ube2e\ube2f\ube30\ube31\ube32\ube33\ube34\ube35\ube36\ube37\ube38\ube39\ube3a\ube3b\ube3c\ube3d\ube3e\ube3f\ube40\ube41\ube42\ube43\ube44\ube45\ube46\ube47\ube48\ube49\ube4a\ube4b\ube4c\ube4d\ube4e\ube4f\ube50\ube51\ube52\ube53\ube54\ube55\ube56\ube57\ube58\ube59\ube5a\ube5b\ube5c\ube5d\ube5e\ube5f\ube60\ube61\ube62\ube63\ube64\ube65\ube66\ube67\ube68\ube69\ube6a\ube6b\ube6c\ube6d\ube6e\ube6f\ube70\ube71\ube72\ube73\ube74\ube75\ube76\ube77\ube78\ube79\ube7a\ube7b\ube7c\ube7d\ube7e\ube7f\ube80\ube81\ube82\ube83\ube84\ube85\ube86\ube87\ube88\ube89\ube8a\ube8b\ube8c\ube8d\ube8e\ube8f\ube90\ube91\ube92\ube93\ube94\ube95\ube96\ube97\ube98\ube99\ube9a\ube9b\ube9c\ube9d\ube9e\ube9f\ubea0\ubea1\ubea2\ubea3\ubea4\ubea5\ubea6\ubea7\ubea8\ubea9\ubeaa\ubeab\ubeac\ubead\ubeae\ubeaf\ubeb0\ubeb1\ubeb2\ubeb3\ubeb4\ubeb5\ubeb6\ubeb7\ubeb8\ubeb9\ubeba\ubebb\ubebc\ubebd\ubebe\ubebf\ubec0\ubec1\ubec2\ubec3\ubec4\ubec5\ubec6\ubec7\ubec8\ubec9\ubeca\ubecb\ubecc\ubecd\ubece\ubecf\ubed0\ubed1\ubed2\ubed3\ubed4\ubed5\ubed6\ubed7\ubed8\ubed9\ubeda\ubedb\ubedc\ubedd\ubede\ubedf\ubee0\ubee1\ubee2\ubee3\ubee4\ubee5\ubee6\ubee7\ubee8\ubee9\ubeea\ubeeb\ubeec\ubeed\ubeee\ubeef\ubef0\ubef1\ubef2\ubef3\ubef4\ubef5\ubef6\ubef7\ubef8\ubef9\ubefa\ubefb\ubefc\ubefd\ubefe\ubeff\ubf00\ubf01\ubf02\ubf03\ubf04\ubf05\ubf06\ubf07\ubf08\ubf09\ubf0a\ubf0b\ubf0c\ubf0d\ubf0e\ubf0f\ubf10\ubf11\ubf12\ubf13\ubf14\ubf15\ubf16\ubf17\ubf18\ubf19\ubf1a\ubf1b\ubf1c\ubf1d\ubf1e\ubf1f\ubf20\ubf21\ubf22\ubf23\ubf24\ubf25\ubf26\ubf27\ubf28\ubf29\ubf2a\ubf2b\ubf2c\ubf2d\ubf2e\ubf2f\ubf30\ubf31\ubf32\ubf33\ubf34\ubf35\ubf36\ubf37\ubf38\ubf39\ubf3a\ubf3b\ubf3c\ubf3d\ubf3e\ubf3f\ubf40\ubf41\ubf42\ubf43\ubf44\ubf45\ubf46\ubf47\ubf48\ubf49\ubf4a\ubf4b\ubf4c\ubf4d\ubf4e\ubf4f\ubf50\ubf51\ubf52\ubf53\ubf54\ubf55\ubf56\ubf57\ubf58\ubf59\ubf5a\ubf5b\ubf5c\ubf5d\ubf5e\ubf5f\ubf60\ubf61\ubf62\ubf63\ubf64\ubf65\ubf66\ubf67\ubf68\ubf69\ubf6a\ubf6b\ubf6c\ubf6d\ubf6e\ubf6f\ubf70\ubf71\ubf72\ubf73\ubf74\ubf75\ubf76\ubf77\ubf78\ubf79\ubf7a\ubf7b\ubf7c\ubf7d\ubf7e\ubf7f\ubf80\ubf81\ubf82\ubf83\ubf84\ubf85\ubf86\ubf87\ubf88\ubf89\ubf8a\ubf8b\ubf8c\ubf8d\ubf8e\ubf8f\ubf90\ubf91\ubf92\ubf93\ubf94\ubf95\ubf96\ubf97\ubf98\ubf99\ubf9a\ubf9b\ubf9c\ubf9d\ubf9e\ubf9f\ubfa0\ubfa1\ubfa2\ubfa3\ubfa4\ubfa5\ubfa6\ubfa7\ubfa8\ubfa9\ubfaa\ubfab\ubfac\ubfad\ubfae\ubfaf\ubfb0\ubfb1\ubfb2\ubfb3\ubfb4\ubfb5\ubfb6\ubfb7\ubfb8\ubfb9\ubfba\ubfbb\ubfbc\ubfbd\ubfbe\ubfbf\ubfc0\ubfc1\ubfc2\ubfc3\ubfc4\ubfc5\ubfc6\ubfc7\ubfc8\ubfc9\ubfca\ubfcb\ubfcc\ubfcd\ubfce\ubfcf\ubfd0\ubfd1\ubfd2\ubfd3\ubfd4\ubfd5\ubfd6\ubfd7\ubfd8\ubfd9\ubfda\ubfdb\ubfdc\ubfdd\ubfde\ubfdf\ubfe0\ubfe1\ubfe2\ubfe3\ubfe4\ubfe5\ubfe6\ubfe7\ubfe8\ubfe9\ubfea\ubfeb\ubfec\ubfed\ubfee\ubfef\ubff0\ubff1\ubff2\ubff3\ubff4\ubff5\ubff6\ubff7\ubff8\ubff9\ubffa\ubffb\ubffc\ubffd\ubffe\ubfff\uc000\uc001\uc002\uc003\uc004\uc005\uc006\uc007\uc008\uc009\uc00a\uc00b\uc00c\uc00d\uc00e\uc00f\uc010\uc011\uc012\uc013\uc014\uc015\uc016\uc017\uc018\uc019\uc01a\uc01b\uc01c\uc01d\uc01e\uc01f\uc020\uc021\uc022\uc023\uc024\uc025\uc026\uc027\uc028\uc029\uc02a\uc02b\uc02c\uc02d\uc02e\uc02f\uc030\uc031\uc032\uc033\uc034\uc035\uc036\uc037\uc038\uc039\uc03a\uc03b\uc03c\uc03d\uc03e\uc03f\uc040\uc041\uc042\uc043\uc044\uc045\uc046\uc047\uc048\uc049\uc04a\uc04b\uc04c\uc04d\uc04e\uc04f\uc050\uc051\uc052\uc053\uc054\uc055\uc056\uc057\uc058\uc059\uc05a\uc05b\uc05c\uc05d\uc05e\uc05f\uc060\uc061\uc062\uc063\uc064\uc065\uc066\uc067\uc068\uc069\uc06a\uc06b\uc06c\uc06d\uc06e\uc06f\uc070\uc071\uc072\uc073\uc074\uc075\uc076\uc077\uc078\uc079\uc07a\uc07b\uc07c\uc07d\uc07e\uc07f\uc080\uc081\uc082\uc083\uc084\uc085\uc086\uc087\uc088\uc089\uc08a\uc08b\uc08c\uc08d\uc08e\uc08f\uc090\uc091\uc092\uc093\uc094\uc095\uc096\uc097\uc098\uc099\uc09a\uc09b\uc09c\uc09d\uc09e\uc09f\uc0a0\uc0a1\uc0a2\uc0a3\uc0a4\uc0a5\uc0a6\uc0a7\uc0a8\uc0a9\uc0aa\uc0ab\uc0ac\uc0ad\uc0ae\uc0af\uc0b0\uc0b1\uc0b2\uc0b3\uc0b4\uc0b5\uc0b6\uc0b7\uc0b8\uc0b9\uc0ba\uc0bb\uc0bc\uc0bd\uc0be\uc0bf\uc0c0\uc0c1\uc0c2\uc0c3\uc0c4\uc0c5\uc0c6\uc0c7\uc0c8\uc0c9\uc0ca\uc0cb\uc0cc\uc0cd\uc0ce\uc0cf\uc0d0\uc0d1\uc0d2\uc0d3\uc0d4\uc0d5\uc0d6\uc0d7\uc0d8\uc0d9\uc0da\uc0db\uc0dc\uc0dd\uc0de\uc0df\uc0e0\uc0e1\uc0e2\uc0e3\uc0e4\uc0e5\uc0e6\uc0e7\uc0e8\uc0e9\uc0ea\uc0eb\uc0ec\uc0ed\uc0ee\uc0ef\uc0f0\uc0f1\uc0f2\uc0f3\uc0f4\uc0f5\uc0f6\uc0f7\uc0f8\uc0f9\uc0fa\uc0fb\uc0fc\uc0fd\uc0fe\uc0ff\uc100\uc101\uc102\uc103\uc104\uc105\uc106\uc107\uc108\uc109\uc10a\uc10b\uc10c\uc10d\uc10e\uc10f\uc110\uc111\uc112\uc113\uc114\uc115\uc116\uc117\uc118\uc119\uc11a\uc11b\uc11c\uc11d\uc11e\uc11f\uc120\uc121\uc122\uc123\uc124\uc125\uc126\uc127\uc128\uc129\uc12a\uc12b\uc12c\uc12d\uc12e\uc12f\uc130\uc131\uc132\uc133\uc134\uc135\uc136\uc137\uc138\uc139\uc13a\uc13b\uc13c\uc13d\uc13e\uc13f\uc140\uc141\uc142\uc143\uc144\uc145\uc146\uc147\uc148\uc149\uc14a\uc14b\uc14c\uc14d\uc14e\uc14f\uc150\uc151\uc152\uc153\uc154\uc155\uc156\uc157\uc158\uc159\uc15a\uc15b\uc15c\uc15d\uc15e\uc15f\uc160\uc161\uc162\uc163\uc164\uc165\uc166\uc167\uc168\uc169\uc16a\uc16b\uc16c\uc16d\uc16e\uc16f\uc170\uc171\uc172\uc173\uc174\uc175\uc176\uc177\uc178\uc179\uc17a\uc17b\uc17c\uc17d\uc17e\uc17f\uc180\uc181\uc182\uc183\uc184\uc185\uc186\uc187\uc188\uc189\uc18a\uc18b\uc18c\uc18d\uc18e\uc18f\uc190\uc191\uc192\uc193\uc194\uc195\uc196\uc197\uc198\uc199\uc19a\uc19b\uc19c\uc19d\uc19e\uc19f\uc1a0\uc1a1\uc1a2\uc1a3\uc1a4\uc1a5\uc1a6\uc1a7\uc1a8\uc1a9\uc1aa\uc1ab\uc1ac\uc1ad\uc1ae\uc1af\uc1b0\uc1b1\uc1b2\uc1b3\uc1b4\uc1b5\uc1b6\uc1b7\uc1b8\uc1b9\uc1ba\uc1bb\uc1bc\uc1bd\uc1be\uc1bf\uc1c0\uc1c1\uc1c2\uc1c3\uc1c4\uc1c5\uc1c6\uc1c7\uc1c8\uc1c9\uc1ca\uc1cb\uc1cc\uc1cd\uc1ce\uc1cf\uc1d0\uc1d1\uc1d2\uc1d3\uc1d4\uc1d5\uc1d6\uc1d7\uc1d8\uc1d9\uc1da\uc1db\uc1dc\uc1dd\uc1de\uc1df\uc1e0\uc1e1\uc1e2\uc1e3\uc1e4\uc1e5\uc1e6\uc1e7\uc1e8\uc1e9\uc1ea\uc1eb\uc1ec\uc1ed\uc1ee\uc1ef\uc1f0\uc1f1\uc1f2\uc1f3\uc1f4\uc1f5\uc1f6\uc1f7\uc1f8\uc1f9\uc1fa\uc1fb\uc1fc\uc1fd\uc1fe\uc1ff\uc200\uc201\uc202\uc203\uc204\uc205\uc206\uc207\uc208\uc209\uc20a\uc20b\uc20c\uc20d\uc20e\uc20f\uc210\uc211\uc212\uc213\uc214\uc215\uc216\uc217\uc218\uc219\uc21a\uc21b\uc21c\uc21d\uc21e\uc21f\uc220\uc221\uc222\uc223\uc224\uc225\uc226\uc227\uc228\uc229\uc22a\uc22b\uc22c\uc22d\uc22e\uc22f\uc230\uc231\uc232\uc233\uc234\uc235\uc236\uc237\uc238\uc239\uc23a\uc23b\uc23c\uc23d\uc23e\uc23f\uc240\uc241\uc242\uc243\uc244\uc245\uc246\uc247\uc248\uc249\uc24a\uc24b\uc24c\uc24d\uc24e\uc24f\uc250\uc251\uc252\uc253\uc254\uc255\uc256\uc257\uc258\uc259\uc25a\uc25b\uc25c\uc25d\uc25e\uc25f\uc260\uc261\uc262\uc263\uc264\uc265\uc266\uc267\uc268\uc269\uc26a\uc26b\uc26c\uc26d\uc26e\uc26f\uc270\uc271\uc272\uc273\uc274\uc275\uc276\uc277\uc278\uc279\uc27a\uc27b\uc27c\uc27d\uc27e\uc27f\uc280\uc281\uc282\uc283\uc284\uc285\uc286\uc287\uc288\uc289\uc28a\uc28b\uc28c\uc28d\uc28e\uc28f\uc290\uc291\uc292\uc293\uc294\uc295\uc296\uc297\uc298\uc299\uc29a\uc29b\uc29c\uc29d\uc29e\uc29f\uc2a0\uc2a1\uc2a2\uc2a3\uc2a4\uc2a5\uc2a6\uc2a7\uc2a8\uc2a9\uc2aa\uc2ab\uc2ac\uc2ad\uc2ae\uc2af\uc2b0\uc2b1\uc2b2\uc2b3\uc2b4\uc2b5\uc2b6\uc2b7\uc2b8\uc2b9\uc2ba\uc2bb\uc2bc\uc2bd\uc2be\uc2bf\uc2c0\uc2c1\uc2c2\uc2c3\uc2c4\uc2c5\uc2c6\uc2c7\uc2c8\uc2c9\uc2ca\uc2cb\uc2cc\uc2cd\uc2ce\uc2cf\uc2d0\uc2d1\uc2d2\uc2d3\uc2d4\uc2d5\uc2d6\uc2d7\uc2d8\uc2d9\uc2da\uc2db\uc2dc\uc2dd\uc2de\uc2df\uc2e0\uc2e1\uc2e2\uc2e3\uc2e4\uc2e5\uc2e6\uc2e7\uc2e8\uc2e9\uc2ea\uc2eb\uc2ec\uc2ed\uc2ee\uc2ef\uc2f0\uc2f1\uc2f2\uc2f3\uc2f4\uc2f5\uc2f6\uc2f7\uc2f8\uc2f9\uc2fa\uc2fb\uc2fc\uc2fd\uc2fe\uc2ff\uc300\uc301\uc302\uc303\uc304\uc305\uc306\uc307\uc308\uc309\uc30a\uc30b\uc30c\uc30d\uc30e\uc30f\uc310\uc311\uc312\uc313\uc314\uc315\uc316\uc317\uc318\uc319\uc31a\uc31b\uc31c\uc31d\uc31e\uc31f\uc320\uc321\uc322\uc323\uc324\uc325\uc326\uc327\uc328\uc329\uc32a\uc32b\uc32c\uc32d\uc32e\uc32f\uc330\uc331\uc332\uc333\uc334\uc335\uc336\uc337\uc338\uc339\uc33a\uc33b\uc33c\uc33d\uc33e\uc33f\uc340\uc341\uc342\uc343\uc344\uc345\uc346\uc347\uc348\uc349\uc34a\uc34b\uc34c\uc34d\uc34e\uc34f\uc350\uc351\uc352\uc353\uc354\uc355\uc356\uc357\uc358\uc359\uc35a\uc35b\uc35c\uc35d\uc35e\uc35f\uc360\uc361\uc362\uc363\uc364\uc365\uc366\uc367\uc368\uc369\uc36a\uc36b\uc36c\uc36d\uc36e\uc36f\uc370\uc371\uc372\uc373\uc374\uc375\uc376\uc377\uc378\uc379\uc37a\uc37b\uc37c\uc37d\uc37e\uc37f\uc380\uc381\uc382\uc383\uc384\uc385\uc386\uc387\uc388\uc389\uc38a\uc38b\uc38c\uc38d\uc38e\uc38f\uc390\uc391\uc392\uc393\uc394\uc395\uc396\uc397\uc398\uc399\uc39a\uc39b\uc39c\uc39d\uc39e\uc39f\uc3a0\uc3a1\uc3a2\uc3a3\uc3a4\uc3a5\uc3a6\uc3a7\uc3a8\uc3a9\uc3aa\uc3ab\uc3ac\uc3ad\uc3ae\uc3af\uc3b0\uc3b1\uc3b2\uc3b3\uc3b4\uc3b5\uc3b6\uc3b7\uc3b8\uc3b9\uc3ba\uc3bb\uc3bc\uc3bd\uc3be\uc3bf\uc3c0\uc3c1\uc3c2\uc3c3\uc3c4\uc3c5\uc3c6\uc3c7\uc3c8\uc3c9\uc3ca\uc3cb\uc3cc\uc3cd\uc3ce\uc3cf\uc3d0\uc3d1\uc3d2\uc3d3\uc3d4\uc3d5\uc3d6\uc3d7\uc3d8\uc3d9\uc3da\uc3db\uc3dc\uc3dd\uc3de\uc3df\uc3e0\uc3e1\uc3e2\uc3e3\uc3e4\uc3e5\uc3e6\uc3e7\uc3e8\uc3e9\uc3ea\uc3eb\uc3ec\uc3ed\uc3ee\uc3ef\uc3f0\uc3f1\uc3f2\uc3f3\uc3f4\uc3f5\uc3f6\uc3f7\uc3f8\uc3f9\uc3fa\uc3fb\uc3fc\uc3fd\uc3fe\uc3ff\uc400\uc401\uc402\uc403\uc404\uc405\uc406\uc407\uc408\uc409\uc40a\uc40b\uc40c\uc40d\uc40e\uc40f\uc410\uc411\uc412\uc413\uc414\uc415\uc416\uc417\uc418\uc419\uc41a\uc41b\uc41c\uc41d\uc41e\uc41f\uc420\uc421\uc422\uc423\uc424\uc425\uc426\uc427\uc428\uc429\uc42a\uc42b\uc42c\uc42d\uc42e\uc42f\uc430\uc431\uc432\uc433\uc434\uc435\uc436\uc437\uc438\uc439\uc43a\uc43b\uc43c\uc43d\uc43e\uc43f\uc440\uc441\uc442\uc443\uc444\uc445\uc446\uc447\uc448\uc449\uc44a\uc44b\uc44c\uc44d\uc44e\uc44f\uc450\uc451\uc452\uc453\uc454\uc455\uc456\uc457\uc458\uc459\uc45a\uc45b\uc45c\uc45d\uc45e\uc45f\uc460\uc461\uc462\uc463\uc464\uc465\uc466\uc467\uc468\uc469\uc46a\uc46b\uc46c\uc46d\uc46e\uc46f\uc470\uc471\uc472\uc473\uc474\uc475\uc476\uc477\uc478\uc479\uc47a\uc47b\uc47c\uc47d\uc47e\uc47f\uc480\uc481\uc482\uc483\uc484\uc485\uc486\uc487\uc488\uc489\uc48a\uc48b\uc48c\uc48d\uc48e\uc48f\uc490\uc491\uc492\uc493\uc494\uc495\uc496\uc497\uc498\uc499\uc49a\uc49b\uc49c\uc49d\uc49e\uc49f\uc4a0\uc4a1\uc4a2\uc4a3\uc4a4\uc4a5\uc4a6\uc4a7\uc4a8\uc4a9\uc4aa\uc4ab\uc4ac\uc4ad\uc4ae\uc4af\uc4b0\uc4b1\uc4b2\uc4b3\uc4b4\uc4b5\uc4b6\uc4b7\uc4b8\uc4b9\uc4ba\uc4bb\uc4bc\uc4bd\uc4be\uc4bf\uc4c0\uc4c1\uc4c2\uc4c3\uc4c4\uc4c5\uc4c6\uc4c7\uc4c8\uc4c9\uc4ca\uc4cb\uc4cc\uc4cd\uc4ce\uc4cf\uc4d0\uc4d1\uc4d2\uc4d3\uc4d4\uc4d5\uc4d6\uc4d7\uc4d8\uc4d9\uc4da\uc4db\uc4dc\uc4dd\uc4de\uc4df\uc4e0\uc4e1\uc4e2\uc4e3\uc4e4\uc4e5\uc4e6\uc4e7\uc4e8\uc4e9\uc4ea\uc4eb\uc4ec\uc4ed\uc4ee\uc4ef\uc4f0\uc4f1\uc4f2\uc4f3\uc4f4\uc4f5\uc4f6\uc4f7\uc4f8\uc4f9\uc4fa\uc4fb\uc4fc\uc4fd\uc4fe\uc4ff\uc500\uc501\uc502\uc503\uc504\uc505\uc506\uc507\uc508\uc509\uc50a\uc50b\uc50c\uc50d\uc50e\uc50f\uc510\uc511\uc512\uc513\uc514\uc515\uc516\uc517\uc518\uc519\uc51a\uc51b\uc51c\uc51d\uc51e\uc51f\uc520\uc521\uc522\uc523\uc524\uc525\uc526\uc527\uc528\uc529\uc52a\uc52b\uc52c\uc52d\uc52e\uc52f\uc530\uc531\uc532\uc533\uc534\uc535\uc536\uc537\uc538\uc539\uc53a\uc53b\uc53c\uc53d\uc53e\uc53f\uc540\uc541\uc542\uc543\uc544\uc545\uc546\uc547\uc548\uc549\uc54a\uc54b\uc54c\uc54d\uc54e\uc54f\uc550\uc551\uc552\uc553\uc554\uc555\uc556\uc557\uc558\uc559\uc55a\uc55b\uc55c\uc55d\uc55e\uc55f\uc560\uc561\uc562\uc563\uc564\uc565\uc566\uc567\uc568\uc569\uc56a\uc56b\uc56c\uc56d\uc56e\uc56f\uc570\uc571\uc572\uc573\uc574\uc575\uc576\uc577\uc578\uc579\uc57a\uc57b\uc57c\uc57d\uc57e\uc57f\uc580\uc581\uc582\uc583\uc584\uc585\uc586\uc587\uc588\uc589\uc58a\uc58b\uc58c\uc58d\uc58e\uc58f\uc590\uc591\uc592\uc593\uc594\uc595\uc596\uc597\uc598\uc599\uc59a\uc59b\uc59c\uc59d\uc59e\uc59f\uc5a0\uc5a1\uc5a2\uc5a3\uc5a4\uc5a5\uc5a6\uc5a7\uc5a8\uc5a9\uc5aa\uc5ab\uc5ac\uc5ad\uc5ae\uc5af\uc5b0\uc5b1\uc5b2\uc5b3\uc5b4\uc5b5\uc5b6\uc5b7\uc5b8\uc5b9\uc5ba\uc5bb\uc5bc\uc5bd\uc5be\uc5bf\uc5c0\uc5c1\uc5c2\uc5c3\uc5c4\uc5c5\uc5c6\uc5c7\uc5c8\uc5c9\uc5ca\uc5cb\uc5cc\uc5cd\uc5ce\uc5cf\uc5d0\uc5d1\uc5d2\uc5d3\uc5d4\uc5d5\uc5d6\uc5d7\uc5d8\uc5d9\uc5da\uc5db\uc5dc\uc5dd\uc5de\uc5df\uc5e0\uc5e1\uc5e2\uc5e3\uc5e4\uc5e5\uc5e6\uc5e7\uc5e8\uc5e9\uc5ea\uc5eb\uc5ec\uc5ed\uc5ee\uc5ef\uc5f0\uc5f1\uc5f2\uc5f3\uc5f4\uc5f5\uc5f6\uc5f7\uc5f8\uc5f9\uc5fa\uc5fb\uc5fc\uc5fd\uc5fe\uc5ff\uc600\uc601\uc602\uc603\uc604\uc605\uc606\uc607\uc608\uc609\uc60a\uc60b\uc60c\uc60d\uc60e\uc60f\uc610\uc611\uc612\uc613\uc614\uc615\uc616\uc617\uc618\uc619\uc61a\uc61b\uc61c\uc61d\uc61e\uc61f\uc620\uc621\uc622\uc623\uc624\uc625\uc626\uc627\uc628\uc629\uc62a\uc62b\uc62c\uc62d\uc62e\uc62f\uc630\uc631\uc632\uc633\uc634\uc635\uc636\uc637\uc638\uc639\uc63a\uc63b\uc63c\uc63d\uc63e\uc63f\uc640\uc641\uc642\uc643\uc644\uc645\uc646\uc647\uc648\uc649\uc64a\uc64b\uc64c\uc64d\uc64e\uc64f\uc650\uc651\uc652\uc653\uc654\uc655\uc656\uc657\uc658\uc659\uc65a\uc65b\uc65c\uc65d\uc65e\uc65f\uc660\uc661\uc662\uc663\uc664\uc665\uc666\uc667\uc668\uc669\uc66a\uc66b\uc66c\uc66d\uc66e\uc66f\uc670\uc671\uc672\uc673\uc674\uc675\uc676\uc677\uc678\uc679\uc67a\uc67b\uc67c\uc67d\uc67e\uc67f\uc680\uc681\uc682\uc683\uc684\uc685\uc686\uc687\uc688\uc689\uc68a\uc68b\uc68c\uc68d\uc68e\uc68f\uc690\uc691\uc692\uc693\uc694\uc695\uc696\uc697\uc698\uc699\uc69a\uc69b\uc69c\uc69d\uc69e\uc69f\uc6a0\uc6a1\uc6a2\uc6a3\uc6a4\uc6a5\uc6a6\uc6a7\uc6a8\uc6a9\uc6aa\uc6ab\uc6ac\uc6ad\uc6ae\uc6af\uc6b0\uc6b1\uc6b2\uc6b3\uc6b4\uc6b5\uc6b6\uc6b7\uc6b8\uc6b9\uc6ba\uc6bb\uc6bc\uc6bd\uc6be\uc6bf\uc6c0\uc6c1\uc6c2\uc6c3\uc6c4\uc6c5\uc6c6\uc6c7\uc6c8\uc6c9\uc6ca\uc6cb\uc6cc\uc6cd\uc6ce\uc6cf\uc6d0\uc6d1\uc6d2\uc6d3\uc6d4\uc6d5\uc6d6\uc6d7\uc6d8\uc6d9\uc6da\uc6db\uc6dc\uc6dd\uc6de\uc6df\uc6e0\uc6e1\uc6e2\uc6e3\uc6e4\uc6e5\uc6e6\uc6e7\uc6e8\uc6e9\uc6ea\uc6eb\uc6ec\uc6ed\uc6ee\uc6ef\uc6f0\uc6f1\uc6f2\uc6f3\uc6f4\uc6f5\uc6f6\uc6f7\uc6f8\uc6f9\uc6fa\uc6fb\uc6fc\uc6fd\uc6fe\uc6ff\uc700\uc701\uc702\uc703\uc704\uc705\uc706\uc707\uc708\uc709\uc70a\uc70b\uc70c\uc70d\uc70e\uc70f\uc710\uc711\uc712\uc713\uc714\uc715\uc716\uc717\uc718\uc719\uc71a\uc71b\uc71c\uc71d\uc71e\uc71f\uc720\uc721\uc722\uc723\uc724\uc725\uc726\uc727\uc728\uc729\uc72a\uc72b\uc72c\uc72d\uc72e\uc72f\uc730\uc731\uc732\uc733\uc734\uc735\uc736\uc737\uc738\uc739\uc73a\uc73b\uc73c\uc73d\uc73e\uc73f\uc740\uc741\uc742\uc743\uc744\uc745\uc746\uc747\uc748\uc749\uc74a\uc74b\uc74c\uc74d\uc74e\uc74f\uc750\uc751\uc752\uc753\uc754\uc755\uc756\uc757\uc758\uc759\uc75a\uc75b\uc75c\uc75d\uc75e\uc75f\uc760\uc761\uc762\uc763\uc764\uc765\uc766\uc767\uc768\uc769\uc76a\uc76b\uc76c\uc76d\uc76e\uc76f\uc770\uc771\uc772\uc773\uc774\uc775\uc776\uc777\uc778\uc779\uc77a\uc77b\uc77c\uc77d\uc77e\uc77f\uc780\uc781\uc782\uc783\uc784\uc785\uc786\uc787\uc788\uc789\uc78a\uc78b\uc78c\uc78d\uc78e\uc78f\uc790\uc791\uc792\uc793\uc794\uc795\uc796\uc797\uc798\uc799\uc79a\uc79b\uc79c\uc79d\uc79e\uc79f\uc7a0\uc7a1\uc7a2\uc7a3\uc7a4\uc7a5\uc7a6\uc7a7\uc7a8\uc7a9\uc7aa\uc7ab\uc7ac\uc7ad\uc7ae\uc7af\uc7b0\uc7b1\uc7b2\uc7b3\uc7b4\uc7b5\uc7b6\uc7b7\uc7b8\uc7b9\uc7ba\uc7bb\uc7bc\uc7bd\uc7be\uc7bf\uc7c0\uc7c1\uc7c2\uc7c3\uc7c4\uc7c5\uc7c6\uc7c7\uc7c8\uc7c9\uc7ca\uc7cb\uc7cc\uc7cd\uc7ce\uc7cf\uc7d0\uc7d1\uc7d2\uc7d3\uc7d4\uc7d5\uc7d6\uc7d7\uc7d8\uc7d9\uc7da\uc7db\uc7dc\uc7dd\uc7de\uc7df\uc7e0\uc7e1\uc7e2\uc7e3\uc7e4\uc7e5\uc7e6\uc7e7\uc7e8\uc7e9\uc7ea\uc7eb\uc7ec\uc7ed\uc7ee\uc7ef\uc7f0\uc7f1\uc7f2\uc7f3\uc7f4\uc7f5\uc7f6\uc7f7\uc7f8\uc7f9\uc7fa\uc7fb\uc7fc\uc7fd\uc7fe\uc7ff\uc800\uc801\uc802\uc803\uc804\uc805\uc806\uc807\uc808\uc809\uc80a\uc80b\uc80c\uc80d\uc80e\uc80f\uc810\uc811\uc812\uc813\uc814\uc815\uc816\uc817\uc818\uc819\uc81a\uc81b\uc81c\uc81d\uc81e\uc81f\uc820\uc821\uc822\uc823\uc824\uc825\uc826\uc827\uc828\uc829\uc82a\uc82b\uc82c\uc82d\uc82e\uc82f\uc830\uc831\uc832\uc833\uc834\uc835\uc836\uc837\uc838\uc839\uc83a\uc83b\uc83c\uc83d\uc83e\uc83f\uc840\uc841\uc842\uc843\uc844\uc845\uc846\uc847\uc848\uc849\uc84a\uc84b\uc84c\uc84d\uc84e\uc84f\uc850\uc851\uc852\uc853\uc854\uc855\uc856\uc857\uc858\uc859\uc85a\uc85b\uc85c\uc85d\uc85e\uc85f\uc860\uc861\uc862\uc863\uc864\uc865\uc866\uc867\uc868\uc869\uc86a\uc86b\uc86c\uc86d\uc86e\uc86f\uc870\uc871\uc872\uc873\uc874\uc875\uc876\uc877\uc878\uc879\uc87a\uc87b\uc87c\uc87d\uc87e\uc87f\uc880\uc881\uc882\uc883\uc884\uc885\uc886\uc887\uc888\uc889\uc88a\uc88b\uc88c\uc88d\uc88e\uc88f\uc890\uc891\uc892\uc893\uc894\uc895\uc896\uc897\uc898\uc899\uc89a\uc89b\uc89c\uc89d\uc89e\uc89f\uc8a0\uc8a1\uc8a2\uc8a3\uc8a4\uc8a5\uc8a6\uc8a7\uc8a8\uc8a9\uc8aa\uc8ab\uc8ac\uc8ad\uc8ae\uc8af\uc8b0\uc8b1\uc8b2\uc8b3\uc8b4\uc8b5\uc8b6\uc8b7\uc8b8\uc8b9\uc8ba\uc8bb\uc8bc\uc8bd\uc8be\uc8bf\uc8c0\uc8c1\uc8c2\uc8c3\uc8c4\uc8c5\uc8c6\uc8c7\uc8c8\uc8c9\uc8ca\uc8cb\uc8cc\uc8cd\uc8ce\uc8cf\uc8d0\uc8d1\uc8d2\uc8d3\uc8d4\uc8d5\uc8d6\uc8d7\uc8d8\uc8d9\uc8da\uc8db\uc8dc\uc8dd\uc8de\uc8df\uc8e0\uc8e1\uc8e2\uc8e3\uc8e4\uc8e5\uc8e6\uc8e7\uc8e8\uc8e9\uc8ea\uc8eb\uc8ec\uc8ed\uc8ee\uc8ef\uc8f0\uc8f1\uc8f2\uc8f3\uc8f4\uc8f5\uc8f6\uc8f7\uc8f8\uc8f9\uc8fa\uc8fb\uc8fc\uc8fd\uc8fe\uc8ff\uc900\uc901\uc902\uc903\uc904\uc905\uc906\uc907\uc908\uc909\uc90a\uc90b\uc90c\uc90d\uc90e\uc90f\uc910\uc911\uc912\uc913\uc914\uc915\uc916\uc917\uc918\uc919\uc91a\uc91b\uc91c\uc91d\uc91e\uc91f\uc920\uc921\uc922\uc923\uc924\uc925\uc926\uc927\uc928\uc929\uc92a\uc92b\uc92c\uc92d\uc92e\uc92f\uc930\uc931\uc932\uc933\uc934\uc935\uc936\uc937\uc938\uc939\uc93a\uc93b\uc93c\uc93d\uc93e\uc93f\uc940\uc941\uc942\uc943\uc944\uc945\uc946\uc947\uc948\uc949\uc94a\uc94b\uc94c\uc94d\uc94e\uc94f\uc950\uc951\uc952\uc953\uc954\uc955\uc956\uc957\uc958\uc959\uc95a\uc95b\uc95c\uc95d\uc95e\uc95f\uc960\uc961\uc962\uc963\uc964\uc965\uc966\uc967\uc968\uc969\uc96a\uc96b\uc96c\uc96d\uc96e\uc96f\uc970\uc971\uc972\uc973\uc974\uc975\uc976\uc977\uc978\uc979\uc97a\uc97b\uc97c\uc97d\uc97e\uc97f\uc980\uc981\uc982\uc983\uc984\uc985\uc986\uc987\uc988\uc989\uc98a\uc98b\uc98c\uc98d\uc98e\uc98f\uc990\uc991\uc992\uc993\uc994\uc995\uc996\uc997\uc998\uc999\uc99a\uc99b\uc99c\uc99d\uc99e\uc99f\uc9a0\uc9a1\uc9a2\uc9a3\uc9a4\uc9a5\uc9a6\uc9a7\uc9a8\uc9a9\uc9aa\uc9ab\uc9ac\uc9ad\uc9ae\uc9af\uc9b0\uc9b1\uc9b2\uc9b3\uc9b4\uc9b5\uc9b6\uc9b7\uc9b8\uc9b9\uc9ba\uc9bb\uc9bc\uc9bd\uc9be\uc9bf\uc9c0\uc9c1\uc9c2\uc9c3\uc9c4\uc9c5\uc9c6\uc9c7\uc9c8\uc9c9\uc9ca\uc9cb\uc9cc\uc9cd\uc9ce\uc9cf\uc9d0\uc9d1\uc9d2\uc9d3\uc9d4\uc9d5\uc9d6\uc9d7\uc9d8\uc9d9\uc9da\uc9db\uc9dc\uc9dd\uc9de\uc9df\uc9e0\uc9e1\uc9e2\uc9e3\uc9e4\uc9e5\uc9e6\uc9e7\uc9e8\uc9e9\uc9ea\uc9eb\uc9ec\uc9ed\uc9ee\uc9ef\uc9f0\uc9f1\uc9f2\uc9f3\uc9f4\uc9f5\uc9f6\uc9f7\uc9f8\uc9f9\uc9fa\uc9fb\uc9fc\uc9fd\uc9fe\uc9ff\uca00\uca01\uca02\uca03\uca04\uca05\uca06\uca07\uca08\uca09\uca0a\uca0b\uca0c\uca0d\uca0e\uca0f\uca10\uca11\uca12\uca13\uca14\uca15\uca16\uca17\uca18\uca19\uca1a\uca1b\uca1c\uca1d\uca1e\uca1f\uca20\uca21\uca22\uca23\uca24\uca25\uca26\uca27\uca28\uca29\uca2a\uca2b\uca2c\uca2d\uca2e\uca2f\uca30\uca31\uca32\uca33\uca34\uca35\uca36\uca37\uca38\uca39\uca3a\uca3b\uca3c\uca3d\uca3e\uca3f\uca40\uca41\uca42\uca43\uca44\uca45\uca46\uca47\uca48\uca49\uca4a\uca4b\uca4c\uca4d\uca4e\uca4f\uca50\uca51\uca52\uca53\uca54\uca55\uca56\uca57\uca58\uca59\uca5a\uca5b\uca5c\uca5d\uca5e\uca5f\uca60\uca61\uca62\uca63\uca64\uca65\uca66\uca67\uca68\uca69\uca6a\uca6b\uca6c\uca6d\uca6e\uca6f\uca70\uca71\uca72\uca73\uca74\uca75\uca76\uca77\uca78\uca79\uca7a\uca7b\uca7c\uca7d\uca7e\uca7f\uca80\uca81\uca82\uca83\uca84\uca85\uca86\uca87\uca88\uca89\uca8a\uca8b\uca8c\uca8d\uca8e\uca8f\uca90\uca91\uca92\uca93\uca94\uca95\uca96\uca97\uca98\uca99\uca9a\uca9b\uca9c\uca9d\uca9e\uca9f\ucaa0\ucaa1\ucaa2\ucaa3\ucaa4\ucaa5\ucaa6\ucaa7\ucaa8\ucaa9\ucaaa\ucaab\ucaac\ucaad\ucaae\ucaaf\ucab0\ucab1\ucab2\ucab3\ucab4\ucab5\ucab6\ucab7\ucab8\ucab9\ucaba\ucabb\ucabc\ucabd\ucabe\ucabf\ucac0\ucac1\ucac2\ucac3\ucac4\ucac5\ucac6\ucac7\ucac8\ucac9\ucaca\ucacb\ucacc\ucacd\ucace\ucacf\ucad0\ucad1\ucad2\ucad3\ucad4\ucad5\ucad6\ucad7\ucad8\ucad9\ucada\ucadb\ucadc\ucadd\ucade\ucadf\ucae0\ucae1\ucae2\ucae3\ucae4\ucae5\ucae6\ucae7\ucae8\ucae9\ucaea\ucaeb\ucaec\ucaed\ucaee\ucaef\ucaf0\ucaf1\ucaf2\ucaf3\ucaf4\ucaf5\ucaf6\ucaf7\ucaf8\ucaf9\ucafa\ucafb\ucafc\ucafd\ucafe\ucaff\ucb00\ucb01\ucb02\ucb03\ucb04\ucb05\ucb06\ucb07\ucb08\ucb09\ucb0a\ucb0b\ucb0c\ucb0d\ucb0e\ucb0f\ucb10\ucb11\ucb12\ucb13\ucb14\ucb15\ucb16\ucb17\ucb18\ucb19\ucb1a\ucb1b\ucb1c\ucb1d\ucb1e\ucb1f\ucb20\ucb21\ucb22\ucb23\ucb24\ucb25\ucb26\ucb27\ucb28\ucb29\ucb2a\ucb2b\ucb2c\ucb2d\ucb2e\ucb2f\ucb30\ucb31\ucb32\ucb33\ucb34\ucb35\ucb36\ucb37\ucb38\ucb39\ucb3a\ucb3b\ucb3c\ucb3d\ucb3e\ucb3f\ucb40\ucb41\ucb42\ucb43\ucb44\ucb45\ucb46\ucb47\ucb48\ucb49\ucb4a\ucb4b\ucb4c\ucb4d\ucb4e\ucb4f\ucb50\ucb51\ucb52\ucb53\ucb54\ucb55\ucb56\ucb57\ucb58\ucb59\ucb5a\ucb5b\ucb5c\ucb5d\ucb5e\ucb5f\ucb60\ucb61\ucb62\ucb63\ucb64\ucb65\ucb66\ucb67\ucb68\ucb69\ucb6a\ucb6b\ucb6c\ucb6d\ucb6e\ucb6f\ucb70\ucb71\ucb72\ucb73\ucb74\ucb75\ucb76\ucb77\ucb78\ucb79\ucb7a\ucb7b\ucb7c\ucb7d\ucb7e\ucb7f\ucb80\ucb81\ucb82\ucb83\ucb84\ucb85\ucb86\ucb87\ucb88\ucb89\ucb8a\ucb8b\ucb8c\ucb8d\ucb8e\ucb8f\ucb90\ucb91\ucb92\ucb93\ucb94\ucb95\ucb96\ucb97\ucb98\ucb99\ucb9a\ucb9b\ucb9c\ucb9d\ucb9e\ucb9f\ucba0\ucba1\ucba2\ucba3\ucba4\ucba5\ucba6\ucba7\ucba8\ucba9\ucbaa\ucbab\ucbac\ucbad\ucbae\ucbaf\ucbb0\ucbb1\ucbb2\ucbb3\ucbb4\ucbb5\ucbb6\ucbb7\ucbb8\ucbb9\ucbba\ucbbb\ucbbc\ucbbd\ucbbe\ucbbf\ucbc0\ucbc1\ucbc2\ucbc3\ucbc4\ucbc5\ucbc6\ucbc7\ucbc8\ucbc9\ucbca\ucbcb\ucbcc\ucbcd\ucbce\ucbcf\ucbd0\ucbd1\ucbd2\ucbd3\ucbd4\ucbd5\ucbd6\ucbd7\ucbd8\ucbd9\ucbda\ucbdb\ucbdc\ucbdd\ucbde\ucbdf\ucbe0\ucbe1\ucbe2\ucbe3\ucbe4\ucbe5\ucbe6\ucbe7\ucbe8\ucbe9\ucbea\ucbeb\ucbec\ucbed\ucbee\ucbef\ucbf0\ucbf1\ucbf2\ucbf3\ucbf4\ucbf5\ucbf6\ucbf7\ucbf8\ucbf9\ucbfa\ucbfb\ucbfc\ucbfd\ucbfe\ucbff\ucc00\ucc01\ucc02\ucc03\ucc04\ucc05\ucc06\ucc07\ucc08\ucc09\ucc0a\ucc0b\ucc0c\ucc0d\ucc0e\ucc0f\ucc10\ucc11\ucc12\ucc13\ucc14\ucc15\ucc16\ucc17\ucc18\ucc19\ucc1a\ucc1b\ucc1c\ucc1d\ucc1e\ucc1f\ucc20\ucc21\ucc22\ucc23\ucc24\ucc25\ucc26\ucc27\ucc28\ucc29\ucc2a\ucc2b\ucc2c\ucc2d\ucc2e\ucc2f\ucc30\ucc31\ucc32\ucc33\ucc34\ucc35\ucc36\ucc37\ucc38\ucc39\ucc3a\ucc3b\ucc3c\ucc3d\ucc3e\ucc3f\ucc40\ucc41\ucc42\ucc43\ucc44\ucc45\ucc46\ucc47\ucc48\ucc49\ucc4a\ucc4b\ucc4c\ucc4d\ucc4e\ucc4f\ucc50\ucc51\ucc52\ucc53\ucc54\ucc55\ucc56\ucc57\ucc58\ucc59\ucc5a\ucc5b\ucc5c\ucc5d\ucc5e\ucc5f\ucc60\ucc61\ucc62\ucc63\ucc64\ucc65\ucc66\ucc67\ucc68\ucc69\ucc6a\ucc6b\ucc6c\ucc6d\ucc6e\ucc6f\ucc70\ucc71\ucc72\ucc73\ucc74\ucc75\ucc76\ucc77\ucc78\ucc79\ucc7a\ucc7b\ucc7c\ucc7d\ucc7e\ucc7f\ucc80\ucc81\ucc82\ucc83\ucc84\ucc85\ucc86\ucc87\ucc88\ucc89\ucc8a\ucc8b\ucc8c\ucc8d\ucc8e\ucc8f\ucc90\ucc91\ucc92\ucc93\ucc94\ucc95\ucc96\ucc97\ucc98\ucc99\ucc9a\ucc9b\ucc9c\ucc9d\ucc9e\ucc9f\ucca0\ucca1\ucca2\ucca3\ucca4\ucca5\ucca6\ucca7\ucca8\ucca9\uccaa\uccab\uccac\uccad\uccae\uccaf\uccb0\uccb1\uccb2\uccb3\uccb4\uccb5\uccb6\uccb7\uccb8\uccb9\uccba\uccbb\uccbc\uccbd\uccbe\uccbf\uccc0\uccc1\uccc2\uccc3\uccc4\uccc5\uccc6\uccc7\uccc8\uccc9\uccca\ucccb\ucccc\ucccd\uccce\ucccf\uccd0\uccd1\uccd2\uccd3\uccd4\uccd5\uccd6\uccd7\uccd8\uccd9\uccda\uccdb\uccdc\uccdd\uccde\uccdf\ucce0\ucce1\ucce2\ucce3\ucce4\ucce5\ucce6\ucce7\ucce8\ucce9\uccea\ucceb\uccec\ucced\uccee\uccef\uccf0\uccf1\uccf2\uccf3\uccf4\uccf5\uccf6\uccf7\uccf8\uccf9\uccfa\uccfb\uccfc\uccfd\uccfe\uccff\ucd00\ucd01\ucd02\ucd03\ucd04\ucd05\ucd06\ucd07\ucd08\ucd09\ucd0a\ucd0b\ucd0c\ucd0d\ucd0e\ucd0f\ucd10\ucd11\ucd12\ucd13\ucd14\ucd15\ucd16\ucd17\ucd18\ucd19\ucd1a\ucd1b\ucd1c\ucd1d\ucd1e\ucd1f\ucd20\ucd21\ucd22\ucd23\ucd24\ucd25\ucd26\ucd27\ucd28\ucd29\ucd2a\ucd2b\ucd2c\ucd2d\ucd2e\ucd2f\ucd30\ucd31\ucd32\ucd33\ucd34\ucd35\ucd36\ucd37\ucd38\ucd39\ucd3a\ucd3b\ucd3c\ucd3d\ucd3e\ucd3f\ucd40\ucd41\ucd42\ucd43\ucd44\ucd45\ucd46\ucd47\ucd48\ucd49\ucd4a\ucd4b\ucd4c\ucd4d\ucd4e\ucd4f\ucd50\ucd51\ucd52\ucd53\ucd54\ucd55\ucd56\ucd57\ucd58\ucd59\ucd5a\ucd5b\ucd5c\ucd5d\ucd5e\ucd5f\ucd60\ucd61\ucd62\ucd63\ucd64\ucd65\ucd66\ucd67\ucd68\ucd69\ucd6a\ucd6b\ucd6c\ucd6d\ucd6e\ucd6f\ucd70\ucd71\ucd72\ucd73\ucd74\ucd75\ucd76\ucd77\ucd78\ucd79\ucd7a\ucd7b\ucd7c\ucd7d\ucd7e\ucd7f\ucd80\ucd81\ucd82\ucd83\ucd84\ucd85\ucd86\ucd87\ucd88\ucd89\ucd8a\ucd8b\ucd8c\ucd8d\ucd8e\ucd8f\ucd90\ucd91\ucd92\ucd93\ucd94\ucd95\ucd96\ucd97\ucd98\ucd99\ucd9a\ucd9b\ucd9c\ucd9d\ucd9e\ucd9f\ucda0\ucda1\ucda2\ucda3\ucda4\ucda5\ucda6\ucda7\ucda8\ucda9\ucdaa\ucdab\ucdac\ucdad\ucdae\ucdaf\ucdb0\ucdb1\ucdb2\ucdb3\ucdb4\ucdb5\ucdb6\ucdb7\ucdb8\ucdb9\ucdba\ucdbb\ucdbc\ucdbd\ucdbe\ucdbf\ucdc0\ucdc1\ucdc2\ucdc3\ucdc4\ucdc5\ucdc6\ucdc7\ucdc8\ucdc9\ucdca\ucdcb\ucdcc\ucdcd\ucdce\ucdcf\ucdd0\ucdd1\ucdd2\ucdd3\ucdd4\ucdd5\ucdd6\ucdd7\ucdd8\ucdd9\ucdda\ucddb\ucddc\ucddd\ucdde\ucddf\ucde0\ucde1\ucde2\ucde3\ucde4\ucde5\ucde6\ucde7\ucde8\ucde9\ucdea\ucdeb\ucdec\ucded\ucdee\ucdef\ucdf0\ucdf1\ucdf2\ucdf3\ucdf4\ucdf5\ucdf6\ucdf7\ucdf8\ucdf9\ucdfa\ucdfb\ucdfc\ucdfd\ucdfe\ucdff\uce00\uce01\uce02\uce03\uce04\uce05\uce06\uce07\uce08\uce09\uce0a\uce0b\uce0c\uce0d\uce0e\uce0f\uce10\uce11\uce12\uce13\uce14\uce15\uce16\uce17\uce18\uce19\uce1a\uce1b\uce1c\uce1d\uce1e\uce1f\uce20\uce21\uce22\uce23\uce24\uce25\uce26\uce27\uce28\uce29\uce2a\uce2b\uce2c\uce2d\uce2e\uce2f\uce30\uce31\uce32\uce33\uce34\uce35\uce36\uce37\uce38\uce39\uce3a\uce3b\uce3c\uce3d\uce3e\uce3f\uce40\uce41\uce42\uce43\uce44\uce45\uce46\uce47\uce48\uce49\uce4a\uce4b\uce4c\uce4d\uce4e\uce4f\uce50\uce51\uce52\uce53\uce54\uce55\uce56\uce57\uce58\uce59\uce5a\uce5b\uce5c\uce5d\uce5e\uce5f\uce60\uce61\uce62\uce63\uce64\uce65\uce66\uce67\uce68\uce69\uce6a\uce6b\uce6c\uce6d\uce6e\uce6f\uce70\uce71\uce72\uce73\uce74\uce75\uce76\uce77\uce78\uce79\uce7a\uce7b\uce7c\uce7d\uce7e\uce7f\uce80\uce81\uce82\uce83\uce84\uce85\uce86\uce87\uce88\uce89\uce8a\uce8b\uce8c\uce8d\uce8e\uce8f\uce90\uce91\uce92\uce93\uce94\uce95\uce96\uce97\uce98\uce99\uce9a\uce9b\uce9c\uce9d\uce9e\uce9f\ucea0\ucea1\ucea2\ucea3\ucea4\ucea5\ucea6\ucea7\ucea8\ucea9\uceaa\uceab\uceac\ucead\uceae\uceaf\uceb0\uceb1\uceb2\uceb3\uceb4\uceb5\uceb6\uceb7\uceb8\uceb9\uceba\ucebb\ucebc\ucebd\ucebe\ucebf\ucec0\ucec1\ucec2\ucec3\ucec4\ucec5\ucec6\ucec7\ucec8\ucec9\uceca\ucecb\ucecc\ucecd\ucece\ucecf\uced0\uced1\uced2\uced3\uced4\uced5\uced6\uced7\uced8\uced9\uceda\ucedb\ucedc\ucedd\ucede\ucedf\ucee0\ucee1\ucee2\ucee3\ucee4\ucee5\ucee6\ucee7\ucee8\ucee9\uceea\uceeb\uceec\uceed\uceee\uceef\ucef0\ucef1\ucef2\ucef3\ucef4\ucef5\ucef6\ucef7\ucef8\ucef9\ucefa\ucefb\ucefc\ucefd\ucefe\uceff\ucf00\ucf01\ucf02\ucf03\ucf04\ucf05\ucf06\ucf07\ucf08\ucf09\ucf0a\ucf0b\ucf0c\ucf0d\ucf0e\ucf0f\ucf10\ucf11\ucf12\ucf13\ucf14\ucf15\ucf16\ucf17\ucf18\ucf19\ucf1a\ucf1b\ucf1c\ucf1d\ucf1e\ucf1f\ucf20\ucf21\ucf22\ucf23\ucf24\ucf25\ucf26\ucf27\ucf28\ucf29\ucf2a\ucf2b\ucf2c\ucf2d\ucf2e\ucf2f\ucf30\ucf31\ucf32\ucf33\ucf34\ucf35\ucf36\ucf37\ucf38\ucf39\ucf3a\ucf3b\ucf3c\ucf3d\ucf3e\ucf3f\ucf40\ucf41\ucf42\ucf43\ucf44\ucf45\ucf46\ucf47\ucf48\ucf49\ucf4a\ucf4b\ucf4c\ucf4d\ucf4e\ucf4f\ucf50\ucf51\ucf52\ucf53\ucf54\ucf55\ucf56\ucf57\ucf58\ucf59\ucf5a\ucf5b\ucf5c\ucf5d\ucf5e\ucf5f\ucf60\ucf61\ucf62\ucf63\ucf64\ucf65\ucf66\ucf67\ucf68\ucf69\ucf6a\ucf6b\ucf6c\ucf6d\ucf6e\ucf6f\ucf70\ucf71\ucf72\ucf73\ucf74\ucf75\ucf76\ucf77\ucf78\ucf79\ucf7a\ucf7b\ucf7c\ucf7d\ucf7e\ucf7f\ucf80\ucf81\ucf82\ucf83\ucf84\ucf85\ucf86\ucf87\ucf88\ucf89\ucf8a\ucf8b\ucf8c\ucf8d\ucf8e\ucf8f\ucf90\ucf91\ucf92\ucf93\ucf94\ucf95\ucf96\ucf97\ucf98\ucf99\ucf9a\ucf9b\ucf9c\ucf9d\ucf9e\ucf9f\ucfa0\ucfa1\ucfa2\ucfa3\ucfa4\ucfa5\ucfa6\ucfa7\ucfa8\ucfa9\ucfaa\ucfab\ucfac\ucfad\ucfae\ucfaf\ucfb0\ucfb1\ucfb2\ucfb3\ucfb4\ucfb5\ucfb6\ucfb7\ucfb8\ucfb9\ucfba\ucfbb\ucfbc\ucfbd\ucfbe\ucfbf\ucfc0\ucfc1\ucfc2\ucfc3\ucfc4\ucfc5\ucfc6\ucfc7\ucfc8\ucfc9\ucfca\ucfcb\ucfcc\ucfcd\ucfce\ucfcf\ucfd0\ucfd1\ucfd2\ucfd3\ucfd4\ucfd5\ucfd6\ucfd7\ucfd8\ucfd9\ucfda\ucfdb\ucfdc\ucfdd\ucfde\ucfdf\ucfe0\ucfe1\ucfe2\ucfe3\ucfe4\ucfe5\ucfe6\ucfe7\ucfe8\ucfe9\ucfea\ucfeb\ucfec\ucfed\ucfee\ucfef\ucff0\ucff1\ucff2\ucff3\ucff4\ucff5\ucff6\ucff7\ucff8\ucff9\ucffa\ucffb\ucffc\ucffd\ucffe\ucfff\ud000\ud001\ud002\ud003\ud004\ud005\ud006\ud007\ud008\ud009\ud00a\ud00b\ud00c\ud00d\ud00e\ud00f\ud010\ud011\ud012\ud013\ud014\ud015\ud016\ud017\ud018\ud019\ud01a\ud01b\ud01c\ud01d\ud01e\ud01f\ud020\ud021\ud022\ud023\ud024\ud025\ud026\ud027\ud028\ud029\ud02a\ud02b\ud02c\ud02d\ud02e\ud02f\ud030\ud031\ud032\ud033\ud034\ud035\ud036\ud037\ud038\ud039\ud03a\ud03b\ud03c\ud03d\ud03e\ud03f\ud040\ud041\ud042\ud043\ud044\ud045\ud046\ud047\ud048\ud049\ud04a\ud04b\ud04c\ud04d\ud04e\ud04f\ud050\ud051\ud052\ud053\ud054\ud055\ud056\ud057\ud058\ud059\ud05a\ud05b\ud05c\ud05d\ud05e\ud05f\ud060\ud061\ud062\ud063\ud064\ud065\ud066\ud067\ud068\ud069\ud06a\ud06b\ud06c\ud06d\ud06e\ud06f\ud070\ud071\ud072\ud073\ud074\ud075\ud076\ud077\ud078\ud079\ud07a\ud07b\ud07c\ud07d\ud07e\ud07f\ud080\ud081\ud082\ud083\ud084\ud085\ud086\ud087\ud088\ud089\ud08a\ud08b\ud08c\ud08d\ud08e\ud08f\ud090\ud091\ud092\ud093\ud094\ud095\ud096\ud097\ud098\ud099\ud09a\ud09b\ud09c\ud09d\ud09e\ud09f\ud0a0\ud0a1\ud0a2\ud0a3\ud0a4\ud0a5\ud0a6\ud0a7\ud0a8\ud0a9\ud0aa\ud0ab\ud0ac\ud0ad\ud0ae\ud0af\ud0b0\ud0b1\ud0b2\ud0b3\ud0b4\ud0b5\ud0b6\ud0b7\ud0b8\ud0b9\ud0ba\ud0bb\ud0bc\ud0bd\ud0be\ud0bf\ud0c0\ud0c1\ud0c2\ud0c3\ud0c4\ud0c5\ud0c6\ud0c7\ud0c8\ud0c9\ud0ca\ud0cb\ud0cc\ud0cd\ud0ce\ud0cf\ud0d0\ud0d1\ud0d2\ud0d3\ud0d4\ud0d5\ud0d6\ud0d7\ud0d8\ud0d9\ud0da\ud0db\ud0dc\ud0dd\ud0de\ud0df\ud0e0\ud0e1\ud0e2\ud0e3\ud0e4\ud0e5\ud0e6\ud0e7\ud0e8\ud0e9\ud0ea\ud0eb\ud0ec\ud0ed\ud0ee\ud0ef\ud0f0\ud0f1\ud0f2\ud0f3\ud0f4\ud0f5\ud0f6\ud0f7\ud0f8\ud0f9\ud0fa\ud0fb\ud0fc\ud0fd\ud0fe\ud0ff\ud100\ud101\ud102\ud103\ud104\ud105\ud106\ud107\ud108\ud109\ud10a\ud10b\ud10c\ud10d\ud10e\ud10f\ud110\ud111\ud112\ud113\ud114\ud115\ud116\ud117\ud118\ud119\ud11a\ud11b\ud11c\ud11d\ud11e\ud11f\ud120\ud121\ud122\ud123\ud124\ud125\ud126\ud127\ud128\ud129\ud12a\ud12b\ud12c\ud12d\ud12e\ud12f\ud130\ud131\ud132\ud133\ud134\ud135\ud136\ud137\ud138\ud139\ud13a\ud13b\ud13c\ud13d\ud13e\ud13f\ud140\ud141\ud142\ud143\ud144\ud145\ud146\ud147\ud148\ud149\ud14a\ud14b\ud14c\ud14d\ud14e\ud14f\ud150\ud151\ud152\ud153\ud154\ud155\ud156\ud157\ud158\ud159\ud15a\ud15b\ud15c\ud15d\ud15e\ud15f\ud160\ud161\ud162\ud163\ud164\ud165\ud166\ud167\ud168\ud169\ud16a\ud16b\ud16c\ud16d\ud16e\ud16f\ud170\ud171\ud172\ud173\ud174\ud175\ud176\ud177\ud178\ud179\ud17a\ud17b\ud17c\ud17d\ud17e\ud17f\ud180\ud181\ud182\ud183\ud184\ud185\ud186\ud187\ud188\ud189\ud18a\ud18b\ud18c\ud18d\ud18e\ud18f\ud190\ud191\ud192\ud193\ud194\ud195\ud196\ud197\ud198\ud199\ud19a\ud19b\ud19c\ud19d\ud19e\ud19f\ud1a0\ud1a1\ud1a2\ud1a3\ud1a4\ud1a5\ud1a6\ud1a7\ud1a8\ud1a9\ud1aa\ud1ab\ud1ac\ud1ad\ud1ae\ud1af\ud1b0\ud1b1\ud1b2\ud1b3\ud1b4\ud1b5\ud1b6\ud1b7\ud1b8\ud1b9\ud1ba\ud1bb\ud1bc\ud1bd\ud1be\ud1bf\ud1c0\ud1c1\ud1c2\ud1c3\ud1c4\ud1c5\ud1c6\ud1c7\ud1c8\ud1c9\ud1ca\ud1cb\ud1cc\ud1cd\ud1ce\ud1cf\ud1d0\ud1d1\ud1d2\ud1d3\ud1d4\ud1d5\ud1d6\ud1d7\ud1d8\ud1d9\ud1da\ud1db\ud1dc\ud1dd\ud1de\ud1df\ud1e0\ud1e1\ud1e2\ud1e3\ud1e4\ud1e5\ud1e6\ud1e7\ud1e8\ud1e9\ud1ea\ud1eb\ud1ec\ud1ed\ud1ee\ud1ef\ud1f0\ud1f1\ud1f2\ud1f3\ud1f4\ud1f5\ud1f6\ud1f7\ud1f8\ud1f9\ud1fa\ud1fb\ud1fc\ud1fd\ud1fe\ud1ff\ud200\ud201\ud202\ud203\ud204\ud205\ud206\ud207\ud208\ud209\ud20a\ud20b\ud20c\ud20d\ud20e\ud20f\ud210\ud211\ud212\ud213\ud214\ud215\ud216\ud217\ud218\ud219\ud21a\ud21b\ud21c\ud21d\ud21e\ud21f\ud220\ud221\ud222\ud223\ud224\ud225\ud226\ud227\ud228\ud229\ud22a\ud22b\ud22c\ud22d\ud22e\ud22f\ud230\ud231\ud232\ud233\ud234\ud235\ud236\ud237\ud238\ud239\ud23a\ud23b\ud23c\ud23d\ud23e\ud23f\ud240\ud241\ud242\ud243\ud244\ud245\ud246\ud247\ud248\ud249\ud24a\ud24b\ud24c\ud24d\ud24e\ud24f\ud250\ud251\ud252\ud253\ud254\ud255\ud256\ud257\ud258\ud259\ud25a\ud25b\ud25c\ud25d\ud25e\ud25f\ud260\ud261\ud262\ud263\ud264\ud265\ud266\ud267\ud268\ud269\ud26a\ud26b\ud26c\ud26d\ud26e\ud26f\ud270\ud271\ud272\ud273\ud274\ud275\ud276\ud277\ud278\ud279\ud27a\ud27b\ud27c\ud27d\ud27e\ud27f\ud280\ud281\ud282\ud283\ud284\ud285\ud286\ud287\ud288\ud289\ud28a\ud28b\ud28c\ud28d\ud28e\ud28f\ud290\ud291\ud292\ud293\ud294\ud295\ud296\ud297\ud298\ud299\ud29a\ud29b\ud29c\ud29d\ud29e\ud29f\ud2a0\ud2a1\ud2a2\ud2a3\ud2a4\ud2a5\ud2a6\ud2a7\ud2a8\ud2a9\ud2aa\ud2ab\ud2ac\ud2ad\ud2ae\ud2af\ud2b0\ud2b1\ud2b2\ud2b3\ud2b4\ud2b5\ud2b6\ud2b7\ud2b8\ud2b9\ud2ba\ud2bb\ud2bc\ud2bd\ud2be\ud2bf\ud2c0\ud2c1\ud2c2\ud2c3\ud2c4\ud2c5\ud2c6\ud2c7\ud2c8\ud2c9\ud2ca\ud2cb\ud2cc\ud2cd\ud2ce\ud2cf\ud2d0\ud2d1\ud2d2\ud2d3\ud2d4\ud2d5\ud2d6\ud2d7\ud2d8\ud2d9\ud2da\ud2db\ud2dc\ud2dd\ud2de\ud2df\ud2e0\ud2e1\ud2e2\ud2e3\ud2e4\ud2e5\ud2e6\ud2e7\ud2e8\ud2e9\ud2ea\ud2eb\ud2ec\ud2ed\ud2ee\ud2ef\ud2f0\ud2f1\ud2f2\ud2f3\ud2f4\ud2f5\ud2f6\ud2f7\ud2f8\ud2f9\ud2fa\ud2fb\ud2fc\ud2fd\ud2fe\ud2ff\ud300\ud301\ud302\ud303\ud304\ud305\ud306\ud307\ud308\ud309\ud30a\ud30b\ud30c\ud30d\ud30e\ud30f\ud310\ud311\ud312\ud313\ud314\ud315\ud316\ud317\ud318\ud319\ud31a\ud31b\ud31c\ud31d\ud31e\ud31f\ud320\ud321\ud322\ud323\ud324\ud325\ud326\ud327\ud328\ud329\ud32a\ud32b\ud32c\ud32d\ud32e\ud32f\ud330\ud331\ud332\ud333\ud334\ud335\ud336\ud337\ud338\ud339\ud33a\ud33b\ud33c\ud33d\ud33e\ud33f\ud340\ud341\ud342\ud343\ud344\ud345\ud346\ud347\ud348\ud349\ud34a\ud34b\ud34c\ud34d\ud34e\ud34f\ud350\ud351\ud352\ud353\ud354\ud355\ud356\ud357\ud358\ud359\ud35a\ud35b\ud35c\ud35d\ud35e\ud35f\ud360\ud361\ud362\ud363\ud364\ud365\ud366\ud367\ud368\ud369\ud36a\ud36b\ud36c\ud36d\ud36e\ud36f\ud370\ud371\ud372\ud373\ud374\ud375\ud376\ud377\ud378\ud379\ud37a\ud37b\ud37c\ud37d\ud37e\ud37f\ud380\ud381\ud382\ud383\ud384\ud385\ud386\ud387\ud388\ud389\ud38a\ud38b\ud38c\ud38d\ud38e\ud38f\ud390\ud391\ud392\ud393\ud394\ud395\ud396\ud397\ud398\ud399\ud39a\ud39b\ud39c\ud39d\ud39e\ud39f\ud3a0\ud3a1\ud3a2\ud3a3\ud3a4\ud3a5\ud3a6\ud3a7\ud3a8\ud3a9\ud3aa\ud3ab\ud3ac\ud3ad\ud3ae\ud3af\ud3b0\ud3b1\ud3b2\ud3b3\ud3b4\ud3b5\ud3b6\ud3b7\ud3b8\ud3b9\ud3ba\ud3bb\ud3bc\ud3bd\ud3be\ud3bf\ud3c0\ud3c1\ud3c2\ud3c3\ud3c4\ud3c5\ud3c6\ud3c7\ud3c8\ud3c9\ud3ca\ud3cb\ud3cc\ud3cd\ud3ce\ud3cf\ud3d0\ud3d1\ud3d2\ud3d3\ud3d4\ud3d5\ud3d6\ud3d7\ud3d8\ud3d9\ud3da\ud3db\ud3dc\ud3dd\ud3de\ud3df\ud3e0\ud3e1\ud3e2\ud3e3\ud3e4\ud3e5\ud3e6\ud3e7\ud3e8\ud3e9\ud3ea\ud3eb\ud3ec\ud3ed\ud3ee\ud3ef\ud3f0\ud3f1\ud3f2\ud3f3\ud3f4\ud3f5\ud3f6\ud3f7\ud3f8\ud3f9\ud3fa\ud3fb\ud3fc\ud3fd\ud3fe\ud3ff\ud400\ud401\ud402\ud403\ud404\ud405\ud406\ud407\ud408\ud409\ud40a\ud40b\ud40c\ud40d\ud40e\ud40f\ud410\ud411\ud412\ud413\ud414\ud415\ud416\ud417\ud418\ud419\ud41a\ud41b\ud41c\ud41d\ud41e\ud41f\ud420\ud421\ud422\ud423\ud424\ud425\ud426\ud427\ud428\ud429\ud42a\ud42b\ud42c\ud42d\ud42e\ud42f\ud430\ud431\ud432\ud433\ud434\ud435\ud436\ud437\ud438\ud439\ud43a\ud43b\ud43c\ud43d\ud43e\ud43f\ud440\ud441\ud442\ud443\ud444\ud445\ud446\ud447\ud448\ud449\ud44a\ud44b\ud44c\ud44d\ud44e\ud44f\ud450\ud451\ud452\ud453\ud454\ud455\ud456\ud457\ud458\ud459\ud45a\ud45b\ud45c\ud45d\ud45e\ud45f\ud460\ud461\ud462\ud463\ud464\ud465\ud466\ud467\ud468\ud469\ud46a\ud46b\ud46c\ud46d\ud46e\ud46f\ud470\ud471\ud472\ud473\ud474\ud475\ud476\ud477\ud478\ud479\ud47a\ud47b\ud47c\ud47d\ud47e\ud47f\ud480\ud481\ud482\ud483\ud484\ud485\ud486\ud487\ud488\ud489\ud48a\ud48b\ud48c\ud48d\ud48e\ud48f\ud490\ud491\ud492\ud493\ud494\ud495\ud496\ud497\ud498\ud499\ud49a\ud49b\ud49c\ud49d\ud49e\ud49f\ud4a0\ud4a1\ud4a2\ud4a3\ud4a4\ud4a5\ud4a6\ud4a7\ud4a8\ud4a9\ud4aa\ud4ab\ud4ac\ud4ad\ud4ae\ud4af\ud4b0\ud4b1\ud4b2\ud4b3\ud4b4\ud4b5\ud4b6\ud4b7\ud4b8\ud4b9\ud4ba\ud4bb\ud4bc\ud4bd\ud4be\ud4bf\ud4c0\ud4c1\ud4c2\ud4c3\ud4c4\ud4c5\ud4c6\ud4c7\ud4c8\ud4c9\ud4ca\ud4cb\ud4cc\ud4cd\ud4ce\ud4cf\ud4d0\ud4d1\ud4d2\ud4d3\ud4d4\ud4d5\ud4d6\ud4d7\ud4d8\ud4d9\ud4da\ud4db\ud4dc\ud4dd\ud4de\ud4df\ud4e0\ud4e1\ud4e2\ud4e3\ud4e4\ud4e5\ud4e6\ud4e7\ud4e8\ud4e9\ud4ea\ud4eb\ud4ec\ud4ed\ud4ee\ud4ef\ud4f0\ud4f1\ud4f2\ud4f3\ud4f4\ud4f5\ud4f6\ud4f7\ud4f8\ud4f9\ud4fa\ud4fb\ud4fc\ud4fd\ud4fe\ud4ff\ud500\ud501\ud502\ud503\ud504\ud505\ud506\ud507\ud508\ud509\ud50a\ud50b\ud50c\ud50d\ud50e\ud50f\ud510\ud511\ud512\ud513\ud514\ud515\ud516\ud517\ud518\ud519\ud51a\ud51b\ud51c\ud51d\ud51e\ud51f\ud520\ud521\ud522\ud523\ud524\ud525\ud526\ud527\ud528\ud529\ud52a\ud52b\ud52c\ud52d\ud52e\ud52f\ud530\ud531\ud532\ud533\ud534\ud535\ud536\ud537\ud538\ud539\ud53a\ud53b\ud53c\ud53d\ud53e\ud53f\ud540\ud541\ud542\ud543\ud544\ud545\ud546\ud547\ud548\ud549\ud54a\ud54b\ud54c\ud54d\ud54e\ud54f\ud550\ud551\ud552\ud553\ud554\ud555\ud556\ud557\ud558\ud559\ud55a\ud55b\ud55c\ud55d\ud55e\ud55f\ud560\ud561\ud562\ud563\ud564\ud565\ud566\ud567\ud568\ud569\ud56a\ud56b\ud56c\ud56d\ud56e\ud56f\ud570\ud571\ud572\ud573\ud574\ud575\ud576\ud577\ud578\ud579\ud57a\ud57b\ud57c\ud57d\ud57e\ud57f\ud580\ud581\ud582\ud583\ud584\ud585\ud586\ud587\ud588\ud589\ud58a\ud58b\ud58c\ud58d\ud58e\ud58f\ud590\ud591\ud592\ud593\ud594\ud595\ud596\ud597\ud598\ud599\ud59a\ud59b\ud59c\ud59d\ud59e\ud59f\ud5a0\ud5a1\ud5a2\ud5a3\ud5a4\ud5a5\ud5a6\ud5a7\ud5a8\ud5a9\ud5aa\ud5ab\ud5ac\ud5ad\ud5ae\ud5af\ud5b0\ud5b1\ud5b2\ud5b3\ud5b4\ud5b5\ud5b6\ud5b7\ud5b8\ud5b9\ud5ba\ud5bb\ud5bc\ud5bd\ud5be\ud5bf\ud5c0\ud5c1\ud5c2\ud5c3\ud5c4\ud5c5\ud5c6\ud5c7\ud5c8\ud5c9\ud5ca\ud5cb\ud5cc\ud5cd\ud5ce\ud5cf\ud5d0\ud5d1\ud5d2\ud5d3\ud5d4\ud5d5\ud5d6\ud5d7\ud5d8\ud5d9\ud5da\ud5db\ud5dc\ud5dd\ud5de\ud5df\ud5e0\ud5e1\ud5e2\ud5e3\ud5e4\ud5e5\ud5e6\ud5e7\ud5e8\ud5e9\ud5ea\ud5eb\ud5ec\ud5ed\ud5ee\ud5ef\ud5f0\ud5f1\ud5f2\ud5f3\ud5f4\ud5f5\ud5f6\ud5f7\ud5f8\ud5f9\ud5fa\ud5fb\ud5fc\ud5fd\ud5fe\ud5ff\ud600\ud601\ud602\ud603\ud604\ud605\ud606\ud607\ud608\ud609\ud60a\ud60b\ud60c\ud60d\ud60e\ud60f\ud610\ud611\ud612\ud613\ud614\ud615\ud616\ud617\ud618\ud619\ud61a\ud61b\ud61c\ud61d\ud61e\ud61f\ud620\ud621\ud622\ud623\ud624\ud625\ud626\ud627\ud628\ud629\ud62a\ud62b\ud62c\ud62d\ud62e\ud62f\ud630\ud631\ud632\ud633\ud634\ud635\ud636\ud637\ud638\ud639\ud63a\ud63b\ud63c\ud63d\ud63e\ud63f\ud640\ud641\ud642\ud643\ud644\ud645\ud646\ud647\ud648\ud649\ud64a\ud64b\ud64c\ud64d\ud64e\ud64f\ud650\ud651\ud652\ud653\ud654\ud655\ud656\ud657\ud658\ud659\ud65a\ud65b\ud65c\ud65d\ud65e\ud65f\ud660\ud661\ud662\ud663\ud664\ud665\ud666\ud667\ud668\ud669\ud66a\ud66b\ud66c\ud66d\ud66e\ud66f\ud670\ud671\ud672\ud673\ud674\ud675\ud676\ud677\ud678\ud679\ud67a\ud67b\ud67c\ud67d\ud67e\ud67f\ud680\ud681\ud682\ud683\ud684\ud685\ud686\ud687\ud688\ud689\ud68a\ud68b\ud68c\ud68d\ud68e\ud68f\ud690\ud691\ud692\ud693\ud694\ud695\ud696\ud697\ud698\ud699\ud69a\ud69b\ud69c\ud69d\ud69e\ud69f\ud6a0\ud6a1\ud6a2\ud6a3\ud6a4\ud6a5\ud6a6\ud6a7\ud6a8\ud6a9\ud6aa\ud6ab\ud6ac\ud6ad\ud6ae\ud6af\ud6b0\ud6b1\ud6b2\ud6b3\ud6b4\ud6b5\ud6b6\ud6b7\ud6b8\ud6b9\ud6ba\ud6bb\ud6bc\ud6bd\ud6be\ud6bf\ud6c0\ud6c1\ud6c2\ud6c3\ud6c4\ud6c5\ud6c6\ud6c7\ud6c8\ud6c9\ud6ca\ud6cb\ud6cc\ud6cd\ud6ce\ud6cf\ud6d0\ud6d1\ud6d2\ud6d3\ud6d4\ud6d5\ud6d6\ud6d7\ud6d8\ud6d9\ud6da\ud6db\ud6dc\ud6dd\ud6de\ud6df\ud6e0\ud6e1\ud6e2\ud6e3\ud6e4\ud6e5\ud6e6\ud6e7\ud6e8\ud6e9\ud6ea\ud6eb\ud6ec\ud6ed\ud6ee\ud6ef\ud6f0\ud6f1\ud6f2\ud6f3\ud6f4\ud6f5\ud6f6\ud6f7\ud6f8\ud6f9\ud6fa\ud6fb\ud6fc\ud6fd\ud6fe\ud6ff\ud700\ud701\ud702\ud703\ud704\ud705\ud706\ud707\ud708\ud709\ud70a\ud70b\ud70c\ud70d\ud70e\ud70f\ud710\ud711\ud712\ud713\ud714\ud715\ud716\ud717\ud718\ud719\ud71a\ud71b\ud71c\ud71d\ud71e\ud71f\ud720\ud721\ud722\ud723\ud724\ud725\ud726\ud727\ud728\ud729\ud72a\ud72b\ud72c\ud72d\ud72e\ud72f\ud730\ud731\ud732\ud733\ud734\ud735\ud736\ud737\ud738\ud739\ud73a\ud73b\ud73c\ud73d\ud73e\ud73f\ud740\ud741\ud742\ud743\ud744\ud745\ud746\ud747\ud748\ud749\ud74a\ud74b\ud74c\ud74d\ud74e\ud74f\ud750\ud751\ud752\ud753\ud754\ud755\ud756\ud757\ud758\ud759\ud75a\ud75b\ud75c\ud75d\ud75e\ud75f\ud760\ud761\ud762\ud763\ud764\ud765\ud766\ud767\ud768\ud769\ud76a\ud76b\ud76c\ud76d\ud76e\ud76f\ud770\ud771\ud772\ud773\ud774\ud775\ud776\ud777\ud778\ud779\ud77a\ud77b\ud77c\ud77d\ud77e\ud77f\ud780\ud781\ud782\ud783\ud784\ud785\ud786\ud787\ud788\ud789\ud78a\ud78b\ud78c\ud78d\ud78e\ud78f\ud790\ud791\ud792\ud793\ud794\ud795\ud796\ud797\ud798\ud799\ud79a\ud79b\ud79c\ud79d\ud79e\ud79f\ud7a0\ud7a1\ud7a2\ud7a3\uf900\uf901\uf902\uf903\uf904\uf905\uf906\uf907\uf908\uf909\uf90a\uf90b\uf90c\uf90d\uf90e\uf90f\uf910\uf911\uf912\uf913\uf914\uf915\uf916\uf917\uf918\uf919\uf91a\uf91b\uf91c\uf91d\uf91e\uf91f\uf920\uf921\uf922\uf923\uf924\uf925\uf926\uf927\uf928\uf929\uf92a\uf92b\uf92c\uf92d\uf92e\uf92f\uf930\uf931\uf932\uf933\uf934\uf935\uf936\uf937\uf938\uf939\uf93a\uf93b\uf93c\uf93d\uf93e\uf93f\uf940\uf941\uf942\uf943\uf944\uf945\uf946\uf947\uf948\uf949\uf94a\uf94b\uf94c\uf94d\uf94e\uf94f\uf950\uf951\uf952\uf953\uf954\uf955\uf956\uf957\uf958\uf959\uf95a\uf95b\uf95c\uf95d\uf95e\uf95f\uf960\uf961\uf962\uf963\uf964\uf965\uf966\uf967\uf968\uf969\uf96a\uf96b\uf96c\uf96d\uf96e\uf96f\uf970\uf971\uf972\uf973\uf974\uf975\uf976\uf977\uf978\uf979\uf97a\uf97b\uf97c\uf97d\uf97e\uf97f\uf980\uf981\uf982\uf983\uf984\uf985\uf986\uf987\uf988\uf989\uf98a\uf98b\uf98c\uf98d\uf98e\uf98f\uf990\uf991\uf992\uf993\uf994\uf995\uf996\uf997\uf998\uf999\uf99a\uf99b\uf99c\uf99d\uf99e\uf99f\uf9a0\uf9a1\uf9a2\uf9a3\uf9a4\uf9a5\uf9a6\uf9a7\uf9a8\uf9a9\uf9aa\uf9ab\uf9ac\uf9ad\uf9ae\uf9af\uf9b0\uf9b1\uf9b2\uf9b3\uf9b4\uf9b5\uf9b6\uf9b7\uf9b8\uf9b9\uf9ba\uf9bb\uf9bc\uf9bd\uf9be\uf9bf\uf9c0\uf9c1\uf9c2\uf9c3\uf9c4\uf9c5\uf9c6\uf9c7\uf9c8\uf9c9\uf9ca\uf9cb\uf9cc\uf9cd\uf9ce\uf9cf\uf9d0\uf9d1\uf9d2\uf9d3\uf9d4\uf9d5\uf9d6\uf9d7\uf9d8\uf9d9\uf9da\uf9db\uf9dc\uf9dd\uf9de\uf9df\uf9e0\uf9e1\uf9e2\uf9e3\uf9e4\uf9e5\uf9e6\uf9e7\uf9e8\uf9e9\uf9ea\uf9eb\uf9ec\uf9ed\uf9ee\uf9ef\uf9f0\uf9f1\uf9f2\uf9f3\uf9f4\uf9f5\uf9f6\uf9f7\uf9f8\uf9f9\uf9fa\uf9fb\uf9fc\uf9fd\uf9fe\uf9ff\ufa00\ufa01\ufa02\ufa03\ufa04\ufa05\ufa06\ufa07\ufa08\ufa09\ufa0a\ufa0b\ufa0c\ufa0d\ufa0e\ufa0f\ufa10\ufa11\ufa12\ufa13\ufa14\ufa15\ufa16\ufa17\ufa18\ufa19\ufa1a\ufa1b\ufa1c\ufa1d\ufa1e\ufa1f\ufa20\ufa21\ufa22\ufa23\ufa24\ufa25\ufa26\ufa27\ufa28\ufa29\ufa2a\ufa2b\ufa2c\ufa2d\ufa30\ufa31\ufa32\ufa33\ufa34\ufa35\ufa36\ufa37\ufa38\ufa39\ufa3a\ufa3b\ufa3c\ufa3d\ufa3e\ufa3f\ufa40\ufa41\ufa42\ufa43\ufa44\ufa45\ufa46\ufa47\ufa48\ufa49\ufa4a\ufa4b\ufa4c\ufa4d\ufa4e\ufa4f\ufa50\ufa51\ufa52\ufa53\ufa54\ufa55\ufa56\ufa57\ufa58\ufa59\ufa5a\ufa5b\ufa5c\ufa5d\ufa5e\ufa5f\ufa60\ufa61\ufa62\ufa63\ufa64\ufa65\ufa66\ufa67\ufa68\ufa69\ufa6a\ufa70\ufa71\ufa72\ufa73\ufa74\ufa75\ufa76\ufa77\ufa78\ufa79\ufa7a\ufa7b\ufa7c\ufa7d\ufa7e\ufa7f\ufa80\ufa81\ufa82\ufa83\ufa84\ufa85\ufa86\ufa87\ufa88\ufa89\ufa8a\ufa8b\ufa8c\ufa8d\ufa8e\ufa8f\ufa90\ufa91\ufa92\ufa93\ufa94\ufa95\ufa96\ufa97\ufa98\ufa99\ufa9a\ufa9b\ufa9c\ufa9d\ufa9e\ufa9f\ufaa0\ufaa1\ufaa2\ufaa3\ufaa4\ufaa5\ufaa6\ufaa7\ufaa8\ufaa9\ufaaa\ufaab\ufaac\ufaad\ufaae\ufaaf\ufab0\ufab1\ufab2\ufab3\ufab4\ufab5\ufab6\ufab7\ufab8\ufab9\ufaba\ufabb\ufabc\ufabd\ufabe\ufabf\ufac0\ufac1\ufac2\ufac3\ufac4\ufac5\ufac6\ufac7\ufac8\ufac9\ufaca\ufacb\ufacc\ufacd\uface\ufacf\ufad0\ufad1\ufad2\ufad3\ufad4\ufad5\ufad6\ufad7\ufad8\ufad9\ufb1d\ufb1f\ufb20\ufb21\ufb22\ufb23\ufb24\ufb25\ufb26\ufb27\ufb28\ufb2a\ufb2b\ufb2c\ufb2d\ufb2e\ufb2f\ufb30\ufb31\ufb32\ufb33\ufb34\ufb35\ufb36\ufb38\ufb39\ufb3a\ufb3b\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46\ufb47\ufb48\ufb49\ufb4a\ufb4b\ufb4c\ufb4d\ufb4e\ufb4f\ufb50\ufb51\ufb52\ufb53\ufb54\ufb55\ufb56\ufb57\ufb58\ufb59\ufb5a\ufb5b\ufb5c\ufb5d\ufb5e\ufb5f\ufb60\ufb61\ufb62\ufb63\ufb64\ufb65\ufb66\ufb67\ufb68\ufb69\ufb6a\ufb6b\ufb6c\ufb6d\ufb6e\ufb6f\ufb70\ufb71\ufb72\ufb73\ufb74\ufb75\ufb76\ufb77\ufb78\ufb79\ufb7a\ufb7b\ufb7c\ufb7d\ufb7e\ufb7f\ufb80\ufb81\ufb82\ufb83\ufb84\ufb85\ufb86\ufb87\ufb88\ufb89\ufb8a\ufb8b\ufb8c\ufb8d\ufb8e\ufb8f\ufb90\ufb91\ufb92\ufb93\ufb94\ufb95\ufb96\ufb97\ufb98\ufb99\ufb9a\ufb9b\ufb9c\ufb9d\ufb9e\ufb9f\ufba0\ufba1\ufba2\ufba3\ufba4\ufba5\ufba6\ufba7\ufba8\ufba9\ufbaa\ufbab\ufbac\ufbad\ufbae\ufbaf\ufbb0\ufbb1\ufbd3\ufbd4\ufbd5\ufbd6\ufbd7\ufbd8\ufbd9\ufbda\ufbdb\ufbdc\ufbdd\ufbde\ufbdf\ufbe0\ufbe1\ufbe2\ufbe3\ufbe4\ufbe5\ufbe6\ufbe7\ufbe8\ufbe9\ufbea\ufbeb\ufbec\ufbed\ufbee\ufbef\ufbf0\ufbf1\ufbf2\ufbf3\ufbf4\ufbf5\ufbf6\ufbf7\ufbf8\ufbf9\ufbfa\ufbfb\ufbfc\ufbfd\ufbfe\ufbff\ufc00\ufc01\ufc02\ufc03\ufc04\ufc05\ufc06\ufc07\ufc08\ufc09\ufc0a\ufc0b\ufc0c\ufc0d\ufc0e\ufc0f\ufc10\ufc11\ufc12\ufc13\ufc14\ufc15\ufc16\ufc17\ufc18\ufc19\ufc1a\ufc1b\ufc1c\ufc1d\ufc1e\ufc1f\ufc20\ufc21\ufc22\ufc23\ufc24\ufc25\ufc26\ufc27\ufc28\ufc29\ufc2a\ufc2b\ufc2c\ufc2d\ufc2e\ufc2f\ufc30\ufc31\ufc32\ufc33\ufc34\ufc35\ufc36\ufc37\ufc38\ufc39\ufc3a\ufc3b\ufc3c\ufc3d\ufc3e\ufc3f\ufc40\ufc41\ufc42\ufc43\ufc44\ufc45\ufc46\ufc47\ufc48\ufc49\ufc4a\ufc4b\ufc4c\ufc4d\ufc4e\ufc4f\ufc50\ufc51\ufc52\ufc53\ufc54\ufc55\ufc56\ufc57\ufc58\ufc59\ufc5a\ufc5b\ufc5c\ufc5d\ufc5e\ufc5f\ufc60\ufc61\ufc62\ufc63\ufc64\ufc65\ufc66\ufc67\ufc68\ufc69\ufc6a\ufc6b\ufc6c\ufc6d\ufc6e\ufc6f\ufc70\ufc71\ufc72\ufc73\ufc74\ufc75\ufc76\ufc77\ufc78\ufc79\ufc7a\ufc7b\ufc7c\ufc7d\ufc7e\ufc7f\ufc80\ufc81\ufc82\ufc83\ufc84\ufc85\ufc86\ufc87\ufc88\ufc89\ufc8a\ufc8b\ufc8c\ufc8d\ufc8e\ufc8f\ufc90\ufc91\ufc92\ufc93\ufc94\ufc95\ufc96\ufc97\ufc98\ufc99\ufc9a\ufc9b\ufc9c\ufc9d\ufc9e\ufc9f\ufca0\ufca1\ufca2\ufca3\ufca4\ufca5\ufca6\ufca7\ufca8\ufca9\ufcaa\ufcab\ufcac\ufcad\ufcae\ufcaf\ufcb0\ufcb1\ufcb2\ufcb3\ufcb4\ufcb5\ufcb6\ufcb7\ufcb8\ufcb9\ufcba\ufcbb\ufcbc\ufcbd\ufcbe\ufcbf\ufcc0\ufcc1\ufcc2\ufcc3\ufcc4\ufcc5\ufcc6\ufcc7\ufcc8\ufcc9\ufcca\ufccb\ufccc\ufccd\ufcce\ufccf\ufcd0\ufcd1\ufcd2\ufcd3\ufcd4\ufcd5\ufcd6\ufcd7\ufcd8\ufcd9\ufcda\ufcdb\ufcdc\ufcdd\ufcde\ufcdf\ufce0\ufce1\ufce2\ufce3\ufce4\ufce5\ufce6\ufce7\ufce8\ufce9\ufcea\ufceb\ufcec\ufced\ufcee\ufcef\ufcf0\ufcf1\ufcf2\ufcf3\ufcf4\ufcf5\ufcf6\ufcf7\ufcf8\ufcf9\ufcfa\ufcfb\ufcfc\ufcfd\ufcfe\ufcff\ufd00\ufd01\ufd02\ufd03\ufd04\ufd05\ufd06\ufd07\ufd08\ufd09\ufd0a\ufd0b\ufd0c\ufd0d\ufd0e\ufd0f\ufd10\ufd11\ufd12\ufd13\ufd14\ufd15\ufd16\ufd17\ufd18\ufd19\ufd1a\ufd1b\ufd1c\ufd1d\ufd1e\ufd1f\ufd20\ufd21\ufd22\ufd23\ufd24\ufd25\ufd26\ufd27\ufd28\ufd29\ufd2a\ufd2b\ufd2c\ufd2d\ufd2e\ufd2f\ufd30\ufd31\ufd32\ufd33\ufd34\ufd35\ufd36\ufd37\ufd38\ufd39\ufd3a\ufd3b\ufd3c\ufd3d\ufd50\ufd51\ufd52\ufd53\ufd54\ufd55\ufd56\ufd57\ufd58\ufd59\ufd5a\ufd5b\ufd5c\ufd5d\ufd5e\ufd5f\ufd60\ufd61\ufd62\ufd63\ufd64\ufd65\ufd66\ufd67\ufd68\ufd69\ufd6a\ufd6b\ufd6c\ufd6d\ufd6e\ufd6f\ufd70\ufd71\ufd72\ufd73\ufd74\ufd75\ufd76\ufd77\ufd78\ufd79\ufd7a\ufd7b\ufd7c\ufd7d\ufd7e\ufd7f\ufd80\ufd81\ufd82\ufd83\ufd84\ufd85\ufd86\ufd87\ufd88\ufd89\ufd8a\ufd8b\ufd8c\ufd8d\ufd8e\ufd8f\ufd92\ufd93\ufd94\ufd95\ufd96\ufd97\ufd98\ufd99\ufd9a\ufd9b\ufd9c\ufd9d\ufd9e\ufd9f\ufda0\ufda1\ufda2\ufda3\ufda4\ufda5\ufda6\ufda7\ufda8\ufda9\ufdaa\ufdab\ufdac\ufdad\ufdae\ufdaf\ufdb0\ufdb1\ufdb2\ufdb3\ufdb4\ufdb5\ufdb6\ufdb7\ufdb8\ufdb9\ufdba\ufdbb\ufdbc\ufdbd\ufdbe\ufdbf\ufdc0\ufdc1\ufdc2\ufdc3\ufdc4\ufdc5\ufdc6\ufdc7\ufdf0\ufdf1\ufdf2\ufdf3\ufdf4\ufdf5\ufdf6\ufdf7\ufdf8\ufdf9\ufdfa\ufdfb\ufe70\ufe71\ufe72\ufe73\ufe74\ufe76\ufe77\ufe78\ufe79\ufe7a\ufe7b\ufe7c\ufe7d\ufe7e\ufe7f\ufe80\ufe81\ufe82\ufe83\ufe84\ufe85\ufe86\ufe87\ufe88\ufe89\ufe8a\ufe8b\ufe8c\ufe8d\ufe8e\ufe8f\ufe90\ufe91\ufe92\ufe93\ufe94\ufe95\ufe96\ufe97\ufe98\ufe99\ufe9a\ufe9b\ufe9c\ufe9d\ufe9e\ufe9f\ufea0\ufea1\ufea2\ufea3\ufea4\ufea5\ufea6\ufea7\ufea8\ufea9\ufeaa\ufeab\ufeac\ufead\ufeae\ufeaf\ufeb0\ufeb1\ufeb2\ufeb3\ufeb4\ufeb5\ufeb6\ufeb7\ufeb8\ufeb9\ufeba\ufebb\ufebc\ufebd\ufebe\ufebf\ufec0\ufec1\ufec2\ufec3\ufec4\ufec5\ufec6\ufec7\ufec8\ufec9\ufeca\ufecb\ufecc\ufecd\ufece\ufecf\ufed0\ufed1\ufed2\ufed3\ufed4\ufed5\ufed6\ufed7\ufed8\ufed9\ufeda\ufedb\ufedc\ufedd\ufede\ufedf\ufee0\ufee1\ufee2\ufee3\ufee4\ufee5\ufee6\ufee7\ufee8\ufee9\ufeea\ufeeb\ufeec\ufeed\ufeee\ufeef\ufef0\ufef1\ufef2\ufef3\ufef4\ufef5\ufef6\ufef7\ufef8\ufef9\ufefa\ufefb\ufefc\uff66\uff67\uff68\uff69\uff6a\uff6b\uff6c\uff6d\uff6e\uff6f\uff71\uff72\uff73\uff74\uff75\uff76\uff77\uff78\uff79\uff7a\uff7b\uff7c\uff7d\uff7e\uff7f\uff80\uff81\uff82\uff83\uff84\uff85\uff86\uff87\uff88\uff89\uff8a\uff8b\uff8c\uff8d\uff8e\uff8f\uff90\uff91\uff92\uff93\uff94\uff95\uff96\uff97\uff98\uff99\uff9a\uff9b\uff9c\uff9d\uffa0\uffa1\uffa2\uffa3\uffa4\uffa5\uffa6\uffa7\uffa8\uffa9\uffaa\uffab\uffac\uffad\uffae\uffaf\uffb0\uffb1\uffb2\uffb3\uffb4\uffb5\uffb6\uffb7\uffb8\uffb9\uffba\uffbb\uffbc\uffbd\uffbe\uffc2\uffc3\uffc4\uffc5\uffc6\uffc7\uffca\uffcb\uffcc\uffcd\uffce\uffcf\uffd2\uffd3\uffd4\uffd5\uffd6\uffd7\uffda\uffdb\uffdc' -Lt = u'\u01c5\u01c8\u01cb\u01f2\u1f88\u1f89\u1f8a\u1f8b\u1f8c\u1f8d\u1f8e\u1f8f\u1f98\u1f99\u1f9a\u1f9b\u1f9c\u1f9d\u1f9e\u1f9f\u1fa8\u1fa9\u1faa\u1fab\u1fac\u1fad\u1fae\u1faf\u1fbc\u1fcc\u1ffc' +Lt = '\u01c5\u01c8\u01cb\u01f2\u1f88\u1f89\u1f8a\u1f8b\u1f8c\u1f8d\u1f8e\u1f8f\u1f98\u1f99\u1f9a\u1f9b\u1f9c\u1f9d\u1f9e\u1f9f\u1fa8\u1fa9\u1faa\u1fab\u1fac\u1fad\u1fae\u1faf\u1fbc\u1fcc\u1ffc' -Lu = u'ABCDEFGHIJKLMNOPQRSTUVWXYZ\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd8\xd9\xda\xdb\xdc\xdd\xde\u0100\u0102\u0104\u0106\u0108\u010a\u010c\u010e\u0110\u0112\u0114\u0116\u0118\u011a\u011c\u011e\u0120\u0122\u0124\u0126\u0128\u012a\u012c\u012e\u0130\u0132\u0134\u0136\u0139\u013b\u013d\u013f\u0141\u0143\u0145\u0147\u014a\u014c\u014e\u0150\u0152\u0154\u0156\u0158\u015a\u015c\u015e\u0160\u0162\u0164\u0166\u0168\u016a\u016c\u016e\u0170\u0172\u0174\u0176\u0178\u0179\u017b\u017d\u0181\u0182\u0184\u0186\u0187\u0189\u018a\u018b\u018e\u018f\u0190\u0191\u0193\u0194\u0196\u0197\u0198\u019c\u019d\u019f\u01a0\u01a2\u01a4\u01a6\u01a7\u01a9\u01ac\u01ae\u01af\u01b1\u01b2\u01b3\u01b5\u01b7\u01b8\u01bc\u01c4\u01c7\u01ca\u01cd\u01cf\u01d1\u01d3\u01d5\u01d7\u01d9\u01db\u01de\u01e0\u01e2\u01e4\u01e6\u01e8\u01ea\u01ec\u01ee\u01f1\u01f4\u01f6\u01f7\u01f8\u01fa\u01fc\u01fe\u0200\u0202\u0204\u0206\u0208\u020a\u020c\u020e\u0210\u0212\u0214\u0216\u0218\u021a\u021c\u021e\u0220\u0222\u0224\u0226\u0228\u022a\u022c\u022e\u0230\u0232\u023a\u023b\u023d\u023e\u0241\u0386\u0388\u0389\u038a\u038c\u038e\u038f\u0391\u0392\u0393\u0394\u0395\u0396\u0397\u0398\u0399\u039a\u039b\u039c\u039d\u039e\u039f\u03a0\u03a1\u03a3\u03a4\u03a5\u03a6\u03a7\u03a8\u03a9\u03aa\u03ab\u03d2\u03d3\u03d4\u03d8\u03da\u03dc\u03de\u03e0\u03e2\u03e4\u03e6\u03e8\u03ea\u03ec\u03ee\u03f4\u03f7\u03f9\u03fa\u03fd\u03fe\u03ff\u0400\u0401\u0402\u0403\u0404\u0405\u0406\u0407\u0408\u0409\u040a\u040b\u040c\u040d\u040e\u040f\u0410\u0411\u0412\u0413\u0414\u0415\u0416\u0417\u0418\u0419\u041a\u041b\u041c\u041d\u041e\u041f\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042a\u042b\u042c\u042d\u042e\u042f\u0460\u0462\u0464\u0466\u0468\u046a\u046c\u046e\u0470\u0472\u0474\u0476\u0478\u047a\u047c\u047e\u0480\u048a\u048c\u048e\u0490\u0492\u0494\u0496\u0498\u049a\u049c\u049e\u04a0\u04a2\u04a4\u04a6\u04a8\u04aa\u04ac\u04ae\u04b0\u04b2\u04b4\u04b6\u04b8\u04ba\u04bc\u04be\u04c0\u04c1\u04c3\u04c5\u04c7\u04c9\u04cb\u04cd\u04d0\u04d2\u04d4\u04d6\u04d8\u04da\u04dc\u04de\u04e0\u04e2\u04e4\u04e6\u04e8\u04ea\u04ec\u04ee\u04f0\u04f2\u04f4\u04f6\u04f8\u0500\u0502\u0504\u0506\u0508\u050a\u050c\u050e\u0531\u0532\u0533\u0534\u0535\u0536\u0537\u0538\u0539\u053a\u053b\u053c\u053d\u053e\u053f\u0540\u0541\u0542\u0543\u0544\u0545\u0546\u0547\u0548\u0549\u054a\u054b\u054c\u054d\u054e\u054f\u0550\u0551\u0552\u0553\u0554\u0555\u0556\u10a0\u10a1\u10a2\u10a3\u10a4\u10a5\u10a6\u10a7\u10a8\u10a9\u10aa\u10ab\u10ac\u10ad\u10ae\u10af\u10b0\u10b1\u10b2\u10b3\u10b4\u10b5\u10b6\u10b7\u10b8\u10b9\u10ba\u10bb\u10bc\u10bd\u10be\u10bf\u10c0\u10c1\u10c2\u10c3\u10c4\u10c5\u1e00\u1e02\u1e04\u1e06\u1e08\u1e0a\u1e0c\u1e0e\u1e10\u1e12\u1e14\u1e16\u1e18\u1e1a\u1e1c\u1e1e\u1e20\u1e22\u1e24\u1e26\u1e28\u1e2a\u1e2c\u1e2e\u1e30\u1e32\u1e34\u1e36\u1e38\u1e3a\u1e3c\u1e3e\u1e40\u1e42\u1e44\u1e46\u1e48\u1e4a\u1e4c\u1e4e\u1e50\u1e52\u1e54\u1e56\u1e58\u1e5a\u1e5c\u1e5e\u1e60\u1e62\u1e64\u1e66\u1e68\u1e6a\u1e6c\u1e6e\u1e70\u1e72\u1e74\u1e76\u1e78\u1e7a\u1e7c\u1e7e\u1e80\u1e82\u1e84\u1e86\u1e88\u1e8a\u1e8c\u1e8e\u1e90\u1e92\u1e94\u1ea0\u1ea2\u1ea4\u1ea6\u1ea8\u1eaa\u1eac\u1eae\u1eb0\u1eb2\u1eb4\u1eb6\u1eb8\u1eba\u1ebc\u1ebe\u1ec0\u1ec2\u1ec4\u1ec6\u1ec8\u1eca\u1ecc\u1ece\u1ed0\u1ed2\u1ed4\u1ed6\u1ed8\u1eda\u1edc\u1ede\u1ee0\u1ee2\u1ee4\u1ee6\u1ee8\u1eea\u1eec\u1eee\u1ef0\u1ef2\u1ef4\u1ef6\u1ef8\u1f08\u1f09\u1f0a\u1f0b\u1f0c\u1f0d\u1f0e\u1f0f\u1f18\u1f19\u1f1a\u1f1b\u1f1c\u1f1d\u1f28\u1f29\u1f2a\u1f2b\u1f2c\u1f2d\u1f2e\u1f2f\u1f38\u1f39\u1f3a\u1f3b\u1f3c\u1f3d\u1f3e\u1f3f\u1f48\u1f49\u1f4a\u1f4b\u1f4c\u1f4d\u1f59\u1f5b\u1f5d\u1f5f\u1f68\u1f69\u1f6a\u1f6b\u1f6c\u1f6d\u1f6e\u1f6f\u1fb8\u1fb9\u1fba\u1fbb\u1fc8\u1fc9\u1fca\u1fcb\u1fd8\u1fd9\u1fda\u1fdb\u1fe8\u1fe9\u1fea\u1feb\u1fec\u1ff8\u1ff9\u1ffa\u1ffb\u2102\u2107\u210b\u210c\u210d\u2110\u2111\u2112\u2115\u2119\u211a\u211b\u211c\u211d\u2124\u2126\u2128\u212a\u212b\u212c\u212d\u2130\u2131\u2133\u213e\u213f\u2145\u2c00\u2c01\u2c02\u2c03\u2c04\u2c05\u2c06\u2c07\u2c08\u2c09\u2c0a\u2c0b\u2c0c\u2c0d\u2c0e\u2c0f\u2c10\u2c11\u2c12\u2c13\u2c14\u2c15\u2c16\u2c17\u2c18\u2c19\u2c1a\u2c1b\u2c1c\u2c1d\u2c1e\u2c1f\u2c20\u2c21\u2c22\u2c23\u2c24\u2c25\u2c26\u2c27\u2c28\u2c29\u2c2a\u2c2b\u2c2c\u2c2d\u2c2e\u2c80\u2c82\u2c84\u2c86\u2c88\u2c8a\u2c8c\u2c8e\u2c90\u2c92\u2c94\u2c96\u2c98\u2c9a\u2c9c\u2c9e\u2ca0\u2ca2\u2ca4\u2ca6\u2ca8\u2caa\u2cac\u2cae\u2cb0\u2cb2\u2cb4\u2cb6\u2cb8\u2cba\u2cbc\u2cbe\u2cc0\u2cc2\u2cc4\u2cc6\u2cc8\u2cca\u2ccc\u2cce\u2cd0\u2cd2\u2cd4\u2cd6\u2cd8\u2cda\u2cdc\u2cde\u2ce0\u2ce2\uff21\uff22\uff23\uff24\uff25\uff26\uff27\uff28\uff29\uff2a\uff2b\uff2c\uff2d\uff2e\uff2f\uff30\uff31\uff32\uff33\uff34\uff35\uff36\uff37\uff38\uff39\uff3a' +Lu = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd8\xd9\xda\xdb\xdc\xdd\xde\u0100\u0102\u0104\u0106\u0108\u010a\u010c\u010e\u0110\u0112\u0114\u0116\u0118\u011a\u011c\u011e\u0120\u0122\u0124\u0126\u0128\u012a\u012c\u012e\u0130\u0132\u0134\u0136\u0139\u013b\u013d\u013f\u0141\u0143\u0145\u0147\u014a\u014c\u014e\u0150\u0152\u0154\u0156\u0158\u015a\u015c\u015e\u0160\u0162\u0164\u0166\u0168\u016a\u016c\u016e\u0170\u0172\u0174\u0176\u0178\u0179\u017b\u017d\u0181\u0182\u0184\u0186\u0187\u0189\u018a\u018b\u018e\u018f\u0190\u0191\u0193\u0194\u0196\u0197\u0198\u019c\u019d\u019f\u01a0\u01a2\u01a4\u01a6\u01a7\u01a9\u01ac\u01ae\u01af\u01b1\u01b2\u01b3\u01b5\u01b7\u01b8\u01bc\u01c4\u01c7\u01ca\u01cd\u01cf\u01d1\u01d3\u01d5\u01d7\u01d9\u01db\u01de\u01e0\u01e2\u01e4\u01e6\u01e8\u01ea\u01ec\u01ee\u01f1\u01f4\u01f6\u01f7\u01f8\u01fa\u01fc\u01fe\u0200\u0202\u0204\u0206\u0208\u020a\u020c\u020e\u0210\u0212\u0214\u0216\u0218\u021a\u021c\u021e\u0220\u0222\u0224\u0226\u0228\u022a\u022c\u022e\u0230\u0232\u023a\u023b\u023d\u023e\u0241\u0386\u0388\u0389\u038a\u038c\u038e\u038f\u0391\u0392\u0393\u0394\u0395\u0396\u0397\u0398\u0399\u039a\u039b\u039c\u039d\u039e\u039f\u03a0\u03a1\u03a3\u03a4\u03a5\u03a6\u03a7\u03a8\u03a9\u03aa\u03ab\u03d2\u03d3\u03d4\u03d8\u03da\u03dc\u03de\u03e0\u03e2\u03e4\u03e6\u03e8\u03ea\u03ec\u03ee\u03f4\u03f7\u03f9\u03fa\u03fd\u03fe\u03ff\u0400\u0401\u0402\u0403\u0404\u0405\u0406\u0407\u0408\u0409\u040a\u040b\u040c\u040d\u040e\u040f\u0410\u0411\u0412\u0413\u0414\u0415\u0416\u0417\u0418\u0419\u041a\u041b\u041c\u041d\u041e\u041f\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042a\u042b\u042c\u042d\u042e\u042f\u0460\u0462\u0464\u0466\u0468\u046a\u046c\u046e\u0470\u0472\u0474\u0476\u0478\u047a\u047c\u047e\u0480\u048a\u048c\u048e\u0490\u0492\u0494\u0496\u0498\u049a\u049c\u049e\u04a0\u04a2\u04a4\u04a6\u04a8\u04aa\u04ac\u04ae\u04b0\u04b2\u04b4\u04b6\u04b8\u04ba\u04bc\u04be\u04c0\u04c1\u04c3\u04c5\u04c7\u04c9\u04cb\u04cd\u04d0\u04d2\u04d4\u04d6\u04d8\u04da\u04dc\u04de\u04e0\u04e2\u04e4\u04e6\u04e8\u04ea\u04ec\u04ee\u04f0\u04f2\u04f4\u04f6\u04f8\u0500\u0502\u0504\u0506\u0508\u050a\u050c\u050e\u0531\u0532\u0533\u0534\u0535\u0536\u0537\u0538\u0539\u053a\u053b\u053c\u053d\u053e\u053f\u0540\u0541\u0542\u0543\u0544\u0545\u0546\u0547\u0548\u0549\u054a\u054b\u054c\u054d\u054e\u054f\u0550\u0551\u0552\u0553\u0554\u0555\u0556\u10a0\u10a1\u10a2\u10a3\u10a4\u10a5\u10a6\u10a7\u10a8\u10a9\u10aa\u10ab\u10ac\u10ad\u10ae\u10af\u10b0\u10b1\u10b2\u10b3\u10b4\u10b5\u10b6\u10b7\u10b8\u10b9\u10ba\u10bb\u10bc\u10bd\u10be\u10bf\u10c0\u10c1\u10c2\u10c3\u10c4\u10c5\u1e00\u1e02\u1e04\u1e06\u1e08\u1e0a\u1e0c\u1e0e\u1e10\u1e12\u1e14\u1e16\u1e18\u1e1a\u1e1c\u1e1e\u1e20\u1e22\u1e24\u1e26\u1e28\u1e2a\u1e2c\u1e2e\u1e30\u1e32\u1e34\u1e36\u1e38\u1e3a\u1e3c\u1e3e\u1e40\u1e42\u1e44\u1e46\u1e48\u1e4a\u1e4c\u1e4e\u1e50\u1e52\u1e54\u1e56\u1e58\u1e5a\u1e5c\u1e5e\u1e60\u1e62\u1e64\u1e66\u1e68\u1e6a\u1e6c\u1e6e\u1e70\u1e72\u1e74\u1e76\u1e78\u1e7a\u1e7c\u1e7e\u1e80\u1e82\u1e84\u1e86\u1e88\u1e8a\u1e8c\u1e8e\u1e90\u1e92\u1e94\u1ea0\u1ea2\u1ea4\u1ea6\u1ea8\u1eaa\u1eac\u1eae\u1eb0\u1eb2\u1eb4\u1eb6\u1eb8\u1eba\u1ebc\u1ebe\u1ec0\u1ec2\u1ec4\u1ec6\u1ec8\u1eca\u1ecc\u1ece\u1ed0\u1ed2\u1ed4\u1ed6\u1ed8\u1eda\u1edc\u1ede\u1ee0\u1ee2\u1ee4\u1ee6\u1ee8\u1eea\u1eec\u1eee\u1ef0\u1ef2\u1ef4\u1ef6\u1ef8\u1f08\u1f09\u1f0a\u1f0b\u1f0c\u1f0d\u1f0e\u1f0f\u1f18\u1f19\u1f1a\u1f1b\u1f1c\u1f1d\u1f28\u1f29\u1f2a\u1f2b\u1f2c\u1f2d\u1f2e\u1f2f\u1f38\u1f39\u1f3a\u1f3b\u1f3c\u1f3d\u1f3e\u1f3f\u1f48\u1f49\u1f4a\u1f4b\u1f4c\u1f4d\u1f59\u1f5b\u1f5d\u1f5f\u1f68\u1f69\u1f6a\u1f6b\u1f6c\u1f6d\u1f6e\u1f6f\u1fb8\u1fb9\u1fba\u1fbb\u1fc8\u1fc9\u1fca\u1fcb\u1fd8\u1fd9\u1fda\u1fdb\u1fe8\u1fe9\u1fea\u1feb\u1fec\u1ff8\u1ff9\u1ffa\u1ffb\u2102\u2107\u210b\u210c\u210d\u2110\u2111\u2112\u2115\u2119\u211a\u211b\u211c\u211d\u2124\u2126\u2128\u212a\u212b\u212c\u212d\u2130\u2131\u2133\u213e\u213f\u2145\u2c00\u2c01\u2c02\u2c03\u2c04\u2c05\u2c06\u2c07\u2c08\u2c09\u2c0a\u2c0b\u2c0c\u2c0d\u2c0e\u2c0f\u2c10\u2c11\u2c12\u2c13\u2c14\u2c15\u2c16\u2c17\u2c18\u2c19\u2c1a\u2c1b\u2c1c\u2c1d\u2c1e\u2c1f\u2c20\u2c21\u2c22\u2c23\u2c24\u2c25\u2c26\u2c27\u2c28\u2c29\u2c2a\u2c2b\u2c2c\u2c2d\u2c2e\u2c80\u2c82\u2c84\u2c86\u2c88\u2c8a\u2c8c\u2c8e\u2c90\u2c92\u2c94\u2c96\u2c98\u2c9a\u2c9c\u2c9e\u2ca0\u2ca2\u2ca4\u2ca6\u2ca8\u2caa\u2cac\u2cae\u2cb0\u2cb2\u2cb4\u2cb6\u2cb8\u2cba\u2cbc\u2cbe\u2cc0\u2cc2\u2cc4\u2cc6\u2cc8\u2cca\u2ccc\u2cce\u2cd0\u2cd2\u2cd4\u2cd6\u2cd8\u2cda\u2cdc\u2cde\u2ce0\u2ce2\uff21\uff22\uff23\uff24\uff25\uff26\uff27\uff28\uff29\uff2a\uff2b\uff2c\uff2d\uff2e\uff2f\uff30\uff31\uff32\uff33\uff34\uff35\uff36\uff37\uff38\uff39\uff3a' -Mc = u'\u0903\u093e\u093f\u0940\u0949\u094a\u094b\u094c\u0982\u0983\u09be\u09bf\u09c0\u09c7\u09c8\u09cb\u09cc\u09d7\u0a03\u0a3e\u0a3f\u0a40\u0a83\u0abe\u0abf\u0ac0\u0ac9\u0acb\u0acc\u0b02\u0b03\u0b3e\u0b40\u0b47\u0b48\u0b4b\u0b4c\u0b57\u0bbe\u0bbf\u0bc1\u0bc2\u0bc6\u0bc7\u0bc8\u0bca\u0bcb\u0bcc\u0bd7\u0c01\u0c02\u0c03\u0c41\u0c42\u0c43\u0c44\u0c82\u0c83\u0cbe\u0cc0\u0cc1\u0cc2\u0cc3\u0cc4\u0cc7\u0cc8\u0cca\u0ccb\u0cd5\u0cd6\u0d02\u0d03\u0d3e\u0d3f\u0d40\u0d46\u0d47\u0d48\u0d4a\u0d4b\u0d4c\u0d57\u0d82\u0d83\u0dcf\u0dd0\u0dd1\u0dd8\u0dd9\u0dda\u0ddb\u0ddc\u0ddd\u0dde\u0ddf\u0df2\u0df3\u0f3e\u0f3f\u0f7f\u102c\u1031\u1038\u1056\u1057\u17b6\u17be\u17bf\u17c0\u17c1\u17c2\u17c3\u17c4\u17c5\u17c7\u17c8\u1923\u1924\u1925\u1926\u1929\u192a\u192b\u1930\u1931\u1933\u1934\u1935\u1936\u1937\u1938\u19b0\u19b1\u19b2\u19b3\u19b4\u19b5\u19b6\u19b7\u19b8\u19b9\u19ba\u19bb\u19bc\u19bd\u19be\u19bf\u19c0\u19c8\u19c9\u1a19\u1a1a\u1a1b\ua802\ua823\ua824\ua827' +Mc = '\u0903\u093e\u093f\u0940\u0949\u094a\u094b\u094c\u0982\u0983\u09be\u09bf\u09c0\u09c7\u09c8\u09cb\u09cc\u09d7\u0a03\u0a3e\u0a3f\u0a40\u0a83\u0abe\u0abf\u0ac0\u0ac9\u0acb\u0acc\u0b02\u0b03\u0b3e\u0b40\u0b47\u0b48\u0b4b\u0b4c\u0b57\u0bbe\u0bbf\u0bc1\u0bc2\u0bc6\u0bc7\u0bc8\u0bca\u0bcb\u0bcc\u0bd7\u0c01\u0c02\u0c03\u0c41\u0c42\u0c43\u0c44\u0c82\u0c83\u0cbe\u0cc0\u0cc1\u0cc2\u0cc3\u0cc4\u0cc7\u0cc8\u0cca\u0ccb\u0cd5\u0cd6\u0d02\u0d03\u0d3e\u0d3f\u0d40\u0d46\u0d47\u0d48\u0d4a\u0d4b\u0d4c\u0d57\u0d82\u0d83\u0dcf\u0dd0\u0dd1\u0dd8\u0dd9\u0dda\u0ddb\u0ddc\u0ddd\u0dde\u0ddf\u0df2\u0df3\u0f3e\u0f3f\u0f7f\u102c\u1031\u1038\u1056\u1057\u17b6\u17be\u17bf\u17c0\u17c1\u17c2\u17c3\u17c4\u17c5\u17c7\u17c8\u1923\u1924\u1925\u1926\u1929\u192a\u192b\u1930\u1931\u1933\u1934\u1935\u1936\u1937\u1938\u19b0\u19b1\u19b2\u19b3\u19b4\u19b5\u19b6\u19b7\u19b8\u19b9\u19ba\u19bb\u19bc\u19bd\u19be\u19bf\u19c0\u19c8\u19c9\u1a19\u1a1a\u1a1b\ua802\ua823\ua824\ua827' -Me = u'\u0488\u0489\u06de\u20dd\u20de\u20df\u20e0\u20e2\u20e3\u20e4' +Me = '\u0488\u0489\u06de\u20dd\u20de\u20df\u20e0\u20e2\u20e3\u20e4' -Mn = u'\u0300\u0301\u0302\u0303\u0304\u0305\u0306\u0307\u0308\u0309\u030a\u030b\u030c\u030d\u030e\u030f\u0310\u0311\u0312\u0313\u0314\u0315\u0316\u0317\u0318\u0319\u031a\u031b\u031c\u031d\u031e\u031f\u0320\u0321\u0322\u0323\u0324\u0325\u0326\u0327\u0328\u0329\u032a\u032b\u032c\u032d\u032e\u032f\u0330\u0331\u0332\u0333\u0334\u0335\u0336\u0337\u0338\u0339\u033a\u033b\u033c\u033d\u033e\u033f\u0340\u0341\u0342\u0343\u0344\u0345\u0346\u0347\u0348\u0349\u034a\u034b\u034c\u034d\u034e\u034f\u0350\u0351\u0352\u0353\u0354\u0355\u0356\u0357\u0358\u0359\u035a\u035b\u035c\u035d\u035e\u035f\u0360\u0361\u0362\u0363\u0364\u0365\u0366\u0367\u0368\u0369\u036a\u036b\u036c\u036d\u036e\u036f\u0483\u0484\u0485\u0486\u0591\u0592\u0593\u0594\u0595\u0596\u0597\u0598\u0599\u059a\u059b\u059c\u059d\u059e\u059f\u05a0\u05a1\u05a2\u05a3\u05a4\u05a5\u05a6\u05a7\u05a8\u05a9\u05aa\u05ab\u05ac\u05ad\u05ae\u05af\u05b0\u05b1\u05b2\u05b3\u05b4\u05b5\u05b6\u05b7\u05b8\u05b9\u05bb\u05bc\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610\u0611\u0612\u0613\u0614\u0615\u064b\u064c\u064d\u064e\u064f\u0650\u0651\u0652\u0653\u0654\u0655\u0656\u0657\u0658\u0659\u065a\u065b\u065c\u065d\u065e\u0670\u06d6\u06d7\u06d8\u06d9\u06da\u06db\u06dc\u06df\u06e0\u06e1\u06e2\u06e3\u06e4\u06e7\u06e8\u06ea\u06eb\u06ec\u06ed\u0711\u0730\u0731\u0732\u0733\u0734\u0735\u0736\u0737\u0738\u0739\u073a\u073b\u073c\u073d\u073e\u073f\u0740\u0741\u0742\u0743\u0744\u0745\u0746\u0747\u0748\u0749\u074a\u07a6\u07a7\u07a8\u07a9\u07aa\u07ab\u07ac\u07ad\u07ae\u07af\u07b0\u0901\u0902\u093c\u0941\u0942\u0943\u0944\u0945\u0946\u0947\u0948\u094d\u0951\u0952\u0953\u0954\u0962\u0963\u0981\u09bc\u09c1\u09c2\u09c3\u09c4\u09cd\u09e2\u09e3\u0a01\u0a02\u0a3c\u0a41\u0a42\u0a47\u0a48\u0a4b\u0a4c\u0a4d\u0a70\u0a71\u0a81\u0a82\u0abc\u0ac1\u0ac2\u0ac3\u0ac4\u0ac5\u0ac7\u0ac8\u0acd\u0ae2\u0ae3\u0b01\u0b3c\u0b3f\u0b41\u0b42\u0b43\u0b4d\u0b56\u0b82\u0bc0\u0bcd\u0c3e\u0c3f\u0c40\u0c46\u0c47\u0c48\u0c4a\u0c4b\u0c4c\u0c4d\u0c55\u0c56\u0cbc\u0cbf\u0cc6\u0ccc\u0ccd\u0d41\u0d42\u0d43\u0d4d\u0dca\u0dd2\u0dd3\u0dd4\u0dd6\u0e31\u0e34\u0e35\u0e36\u0e37\u0e38\u0e39\u0e3a\u0e47\u0e48\u0e49\u0e4a\u0e4b\u0e4c\u0e4d\u0e4e\u0eb1\u0eb4\u0eb5\u0eb6\u0eb7\u0eb8\u0eb9\u0ebb\u0ebc\u0ec8\u0ec9\u0eca\u0ecb\u0ecc\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f71\u0f72\u0f73\u0f74\u0f75\u0f76\u0f77\u0f78\u0f79\u0f7a\u0f7b\u0f7c\u0f7d\u0f7e\u0f80\u0f81\u0f82\u0f83\u0f84\u0f86\u0f87\u0f90\u0f91\u0f92\u0f93\u0f94\u0f95\u0f96\u0f97\u0f99\u0f9a\u0f9b\u0f9c\u0f9d\u0f9e\u0f9f\u0fa0\u0fa1\u0fa2\u0fa3\u0fa4\u0fa5\u0fa6\u0fa7\u0fa8\u0fa9\u0faa\u0fab\u0fac\u0fad\u0fae\u0faf\u0fb0\u0fb1\u0fb2\u0fb3\u0fb4\u0fb5\u0fb6\u0fb7\u0fb8\u0fb9\u0fba\u0fbb\u0fbc\u0fc6\u102d\u102e\u102f\u1030\u1032\u1036\u1037\u1039\u1058\u1059\u135f\u1712\u1713\u1714\u1732\u1733\u1734\u1752\u1753\u1772\u1773\u17b7\u17b8\u17b9\u17ba\u17bb\u17bc\u17bd\u17c6\u17c9\u17ca\u17cb\u17cc\u17cd\u17ce\u17cf\u17d0\u17d1\u17d2\u17d3\u17dd\u180b\u180c\u180d\u18a9\u1920\u1921\u1922\u1927\u1928\u1932\u1939\u193a\u193b\u1a17\u1a18\u1dc0\u1dc1\u1dc2\u1dc3\u20d0\u20d1\u20d2\u20d3\u20d4\u20d5\u20d6\u20d7\u20d8\u20d9\u20da\u20db\u20dc\u20e1\u20e5\u20e6\u20e7\u20e8\u20e9\u20ea\u20eb\u302a\u302b\u302c\u302d\u302e\u302f\u3099\u309a\ua806\ua80b\ua825\ua826\ufb1e\ufe00\ufe01\ufe02\ufe03\ufe04\ufe05\ufe06\ufe07\ufe08\ufe09\ufe0a\ufe0b\ufe0c\ufe0d\ufe0e\ufe0f\ufe20\ufe21\ufe22\ufe23' +Mn = '\u0300\u0301\u0302\u0303\u0304\u0305\u0306\u0307\u0308\u0309\u030a\u030b\u030c\u030d\u030e\u030f\u0310\u0311\u0312\u0313\u0314\u0315\u0316\u0317\u0318\u0319\u031a\u031b\u031c\u031d\u031e\u031f\u0320\u0321\u0322\u0323\u0324\u0325\u0326\u0327\u0328\u0329\u032a\u032b\u032c\u032d\u032e\u032f\u0330\u0331\u0332\u0333\u0334\u0335\u0336\u0337\u0338\u0339\u033a\u033b\u033c\u033d\u033e\u033f\u0340\u0341\u0342\u0343\u0344\u0345\u0346\u0347\u0348\u0349\u034a\u034b\u034c\u034d\u034e\u034f\u0350\u0351\u0352\u0353\u0354\u0355\u0356\u0357\u0358\u0359\u035a\u035b\u035c\u035d\u035e\u035f\u0360\u0361\u0362\u0363\u0364\u0365\u0366\u0367\u0368\u0369\u036a\u036b\u036c\u036d\u036e\u036f\u0483\u0484\u0485\u0486\u0591\u0592\u0593\u0594\u0595\u0596\u0597\u0598\u0599\u059a\u059b\u059c\u059d\u059e\u059f\u05a0\u05a1\u05a2\u05a3\u05a4\u05a5\u05a6\u05a7\u05a8\u05a9\u05aa\u05ab\u05ac\u05ad\u05ae\u05af\u05b0\u05b1\u05b2\u05b3\u05b4\u05b5\u05b6\u05b7\u05b8\u05b9\u05bb\u05bc\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610\u0611\u0612\u0613\u0614\u0615\u064b\u064c\u064d\u064e\u064f\u0650\u0651\u0652\u0653\u0654\u0655\u0656\u0657\u0658\u0659\u065a\u065b\u065c\u065d\u065e\u0670\u06d6\u06d7\u06d8\u06d9\u06da\u06db\u06dc\u06df\u06e0\u06e1\u06e2\u06e3\u06e4\u06e7\u06e8\u06ea\u06eb\u06ec\u06ed\u0711\u0730\u0731\u0732\u0733\u0734\u0735\u0736\u0737\u0738\u0739\u073a\u073b\u073c\u073d\u073e\u073f\u0740\u0741\u0742\u0743\u0744\u0745\u0746\u0747\u0748\u0749\u074a\u07a6\u07a7\u07a8\u07a9\u07aa\u07ab\u07ac\u07ad\u07ae\u07af\u07b0\u0901\u0902\u093c\u0941\u0942\u0943\u0944\u0945\u0946\u0947\u0948\u094d\u0951\u0952\u0953\u0954\u0962\u0963\u0981\u09bc\u09c1\u09c2\u09c3\u09c4\u09cd\u09e2\u09e3\u0a01\u0a02\u0a3c\u0a41\u0a42\u0a47\u0a48\u0a4b\u0a4c\u0a4d\u0a70\u0a71\u0a81\u0a82\u0abc\u0ac1\u0ac2\u0ac3\u0ac4\u0ac5\u0ac7\u0ac8\u0acd\u0ae2\u0ae3\u0b01\u0b3c\u0b3f\u0b41\u0b42\u0b43\u0b4d\u0b56\u0b82\u0bc0\u0bcd\u0c3e\u0c3f\u0c40\u0c46\u0c47\u0c48\u0c4a\u0c4b\u0c4c\u0c4d\u0c55\u0c56\u0cbc\u0cbf\u0cc6\u0ccc\u0ccd\u0d41\u0d42\u0d43\u0d4d\u0dca\u0dd2\u0dd3\u0dd4\u0dd6\u0e31\u0e34\u0e35\u0e36\u0e37\u0e38\u0e39\u0e3a\u0e47\u0e48\u0e49\u0e4a\u0e4b\u0e4c\u0e4d\u0e4e\u0eb1\u0eb4\u0eb5\u0eb6\u0eb7\u0eb8\u0eb9\u0ebb\u0ebc\u0ec8\u0ec9\u0eca\u0ecb\u0ecc\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f71\u0f72\u0f73\u0f74\u0f75\u0f76\u0f77\u0f78\u0f79\u0f7a\u0f7b\u0f7c\u0f7d\u0f7e\u0f80\u0f81\u0f82\u0f83\u0f84\u0f86\u0f87\u0f90\u0f91\u0f92\u0f93\u0f94\u0f95\u0f96\u0f97\u0f99\u0f9a\u0f9b\u0f9c\u0f9d\u0f9e\u0f9f\u0fa0\u0fa1\u0fa2\u0fa3\u0fa4\u0fa5\u0fa6\u0fa7\u0fa8\u0fa9\u0faa\u0fab\u0fac\u0fad\u0fae\u0faf\u0fb0\u0fb1\u0fb2\u0fb3\u0fb4\u0fb5\u0fb6\u0fb7\u0fb8\u0fb9\u0fba\u0fbb\u0fbc\u0fc6\u102d\u102e\u102f\u1030\u1032\u1036\u1037\u1039\u1058\u1059\u135f\u1712\u1713\u1714\u1732\u1733\u1734\u1752\u1753\u1772\u1773\u17b7\u17b8\u17b9\u17ba\u17bb\u17bc\u17bd\u17c6\u17c9\u17ca\u17cb\u17cc\u17cd\u17ce\u17cf\u17d0\u17d1\u17d2\u17d3\u17dd\u180b\u180c\u180d\u18a9\u1920\u1921\u1922\u1927\u1928\u1932\u1939\u193a\u193b\u1a17\u1a18\u1dc0\u1dc1\u1dc2\u1dc3\u20d0\u20d1\u20d2\u20d3\u20d4\u20d5\u20d6\u20d7\u20d8\u20d9\u20da\u20db\u20dc\u20e1\u20e5\u20e6\u20e7\u20e8\u20e9\u20ea\u20eb\u302a\u302b\u302c\u302d\u302e\u302f\u3099\u309a\ua806\ua80b\ua825\ua826\ufb1e\ufe00\ufe01\ufe02\ufe03\ufe04\ufe05\ufe06\ufe07\ufe08\ufe09\ufe0a\ufe0b\ufe0c\ufe0d\ufe0e\ufe0f\ufe20\ufe21\ufe22\ufe23' -Nd = u'0123456789\u0660\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669\u06f0\u06f1\u06f2\u06f3\u06f4\u06f5\u06f6\u06f7\u06f8\u06f9\u0966\u0967\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f\u09e6\u09e7\u09e8\u09e9\u09ea\u09eb\u09ec\u09ed\u09ee\u09ef\u0a66\u0a67\u0a68\u0a69\u0a6a\u0a6b\u0a6c\u0a6d\u0a6e\u0a6f\u0ae6\u0ae7\u0ae8\u0ae9\u0aea\u0aeb\u0aec\u0aed\u0aee\u0aef\u0b66\u0b67\u0b68\u0b69\u0b6a\u0b6b\u0b6c\u0b6d\u0b6e\u0b6f\u0be6\u0be7\u0be8\u0be9\u0bea\u0beb\u0bec\u0bed\u0bee\u0bef\u0c66\u0c67\u0c68\u0c69\u0c6a\u0c6b\u0c6c\u0c6d\u0c6e\u0c6f\u0ce6\u0ce7\u0ce8\u0ce9\u0cea\u0ceb\u0cec\u0ced\u0cee\u0cef\u0d66\u0d67\u0d68\u0d69\u0d6a\u0d6b\u0d6c\u0d6d\u0d6e\u0d6f\u0e50\u0e51\u0e52\u0e53\u0e54\u0e55\u0e56\u0e57\u0e58\u0e59\u0ed0\u0ed1\u0ed2\u0ed3\u0ed4\u0ed5\u0ed6\u0ed7\u0ed8\u0ed9\u0f20\u0f21\u0f22\u0f23\u0f24\u0f25\u0f26\u0f27\u0f28\u0f29\u1040\u1041\u1042\u1043\u1044\u1045\u1046\u1047\u1048\u1049\u17e0\u17e1\u17e2\u17e3\u17e4\u17e5\u17e6\u17e7\u17e8\u17e9\u1810\u1811\u1812\u1813\u1814\u1815\u1816\u1817\u1818\u1819\u1946\u1947\u1948\u1949\u194a\u194b\u194c\u194d\u194e\u194f\u19d0\u19d1\u19d2\u19d3\u19d4\u19d5\u19d6\u19d7\u19d8\u19d9\uff10\uff11\uff12\uff13\uff14\uff15\uff16\uff17\uff18\uff19' +Nd = '0123456789\u0660\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669\u06f0\u06f1\u06f2\u06f3\u06f4\u06f5\u06f6\u06f7\u06f8\u06f9\u0966\u0967\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f\u09e6\u09e7\u09e8\u09e9\u09ea\u09eb\u09ec\u09ed\u09ee\u09ef\u0a66\u0a67\u0a68\u0a69\u0a6a\u0a6b\u0a6c\u0a6d\u0a6e\u0a6f\u0ae6\u0ae7\u0ae8\u0ae9\u0aea\u0aeb\u0aec\u0aed\u0aee\u0aef\u0b66\u0b67\u0b68\u0b69\u0b6a\u0b6b\u0b6c\u0b6d\u0b6e\u0b6f\u0be6\u0be7\u0be8\u0be9\u0bea\u0beb\u0bec\u0bed\u0bee\u0bef\u0c66\u0c67\u0c68\u0c69\u0c6a\u0c6b\u0c6c\u0c6d\u0c6e\u0c6f\u0ce6\u0ce7\u0ce8\u0ce9\u0cea\u0ceb\u0cec\u0ced\u0cee\u0cef\u0d66\u0d67\u0d68\u0d69\u0d6a\u0d6b\u0d6c\u0d6d\u0d6e\u0d6f\u0e50\u0e51\u0e52\u0e53\u0e54\u0e55\u0e56\u0e57\u0e58\u0e59\u0ed0\u0ed1\u0ed2\u0ed3\u0ed4\u0ed5\u0ed6\u0ed7\u0ed8\u0ed9\u0f20\u0f21\u0f22\u0f23\u0f24\u0f25\u0f26\u0f27\u0f28\u0f29\u1040\u1041\u1042\u1043\u1044\u1045\u1046\u1047\u1048\u1049\u17e0\u17e1\u17e2\u17e3\u17e4\u17e5\u17e6\u17e7\u17e8\u17e9\u1810\u1811\u1812\u1813\u1814\u1815\u1816\u1817\u1818\u1819\u1946\u1947\u1948\u1949\u194a\u194b\u194c\u194d\u194e\u194f\u19d0\u19d1\u19d2\u19d3\u19d4\u19d5\u19d6\u19d7\u19d8\u19d9\uff10\uff11\uff12\uff13\uff14\uff15\uff16\uff17\uff18\uff19' -Nl = u'\u16ee\u16ef\u16f0\u2160\u2161\u2162\u2163\u2164\u2165\u2166\u2167\u2168\u2169\u216a\u216b\u216c\u216d\u216e\u216f\u2170\u2171\u2172\u2173\u2174\u2175\u2176\u2177\u2178\u2179\u217a\u217b\u217c\u217d\u217e\u217f\u2180\u2181\u2182\u2183\u3007\u3021\u3022\u3023\u3024\u3025\u3026\u3027\u3028\u3029\u3038\u3039\u303a' +Nl = '\u16ee\u16ef\u16f0\u2160\u2161\u2162\u2163\u2164\u2165\u2166\u2167\u2168\u2169\u216a\u216b\u216c\u216d\u216e\u216f\u2170\u2171\u2172\u2173\u2174\u2175\u2176\u2177\u2178\u2179\u217a\u217b\u217c\u217d\u217e\u217f\u2180\u2181\u2182\u2183\u3007\u3021\u3022\u3023\u3024\u3025\u3026\u3027\u3028\u3029\u3038\u3039\u303a' -No = u'\xb2\xb3\xb9\xbc\xbd\xbe\u09f4\u09f5\u09f6\u09f7\u09f8\u09f9\u0bf0\u0bf1\u0bf2\u0f2a\u0f2b\u0f2c\u0f2d\u0f2e\u0f2f\u0f30\u0f31\u0f32\u0f33\u1369\u136a\u136b\u136c\u136d\u136e\u136f\u1370\u1371\u1372\u1373\u1374\u1375\u1376\u1377\u1378\u1379\u137a\u137b\u137c\u17f0\u17f1\u17f2\u17f3\u17f4\u17f5\u17f6\u17f7\u17f8\u17f9\u2070\u2074\u2075\u2076\u2077\u2078\u2079\u2080\u2081\u2082\u2083\u2084\u2085\u2086\u2087\u2088\u2089\u2153\u2154\u2155\u2156\u2157\u2158\u2159\u215a\u215b\u215c\u215d\u215e\u215f\u2460\u2461\u2462\u2463\u2464\u2465\u2466\u2467\u2468\u2469\u246a\u246b\u246c\u246d\u246e\u246f\u2470\u2471\u2472\u2473\u2474\u2475\u2476\u2477\u2478\u2479\u247a\u247b\u247c\u247d\u247e\u247f\u2480\u2481\u2482\u2483\u2484\u2485\u2486\u2487\u2488\u2489\u248a\u248b\u248c\u248d\u248e\u248f\u2490\u2491\u2492\u2493\u2494\u2495\u2496\u2497\u2498\u2499\u249a\u249b\u24ea\u24eb\u24ec\u24ed\u24ee\u24ef\u24f0\u24f1\u24f2\u24f3\u24f4\u24f5\u24f6\u24f7\u24f8\u24f9\u24fa\u24fb\u24fc\u24fd\u24fe\u24ff\u2776\u2777\u2778\u2779\u277a\u277b\u277c\u277d\u277e\u277f\u2780\u2781\u2782\u2783\u2784\u2785\u2786\u2787\u2788\u2789\u278a\u278b\u278c\u278d\u278e\u278f\u2790\u2791\u2792\u2793\u2cfd\u3192\u3193\u3194\u3195\u3220\u3221\u3222\u3223\u3224\u3225\u3226\u3227\u3228\u3229\u3251\u3252\u3253\u3254\u3255\u3256\u3257\u3258\u3259\u325a\u325b\u325c\u325d\u325e\u325f\u3280\u3281\u3282\u3283\u3284\u3285\u3286\u3287\u3288\u3289\u32b1\u32b2\u32b3\u32b4\u32b5\u32b6\u32b7\u32b8\u32b9\u32ba\u32bb\u32bc\u32bd\u32be\u32bf' +No = '\xb2\xb3\xb9\xbc\xbd\xbe\u09f4\u09f5\u09f6\u09f7\u09f8\u09f9\u0bf0\u0bf1\u0bf2\u0f2a\u0f2b\u0f2c\u0f2d\u0f2e\u0f2f\u0f30\u0f31\u0f32\u0f33\u1369\u136a\u136b\u136c\u136d\u136e\u136f\u1370\u1371\u1372\u1373\u1374\u1375\u1376\u1377\u1378\u1379\u137a\u137b\u137c\u17f0\u17f1\u17f2\u17f3\u17f4\u17f5\u17f6\u17f7\u17f8\u17f9\u2070\u2074\u2075\u2076\u2077\u2078\u2079\u2080\u2081\u2082\u2083\u2084\u2085\u2086\u2087\u2088\u2089\u2153\u2154\u2155\u2156\u2157\u2158\u2159\u215a\u215b\u215c\u215d\u215e\u215f\u2460\u2461\u2462\u2463\u2464\u2465\u2466\u2467\u2468\u2469\u246a\u246b\u246c\u246d\u246e\u246f\u2470\u2471\u2472\u2473\u2474\u2475\u2476\u2477\u2478\u2479\u247a\u247b\u247c\u247d\u247e\u247f\u2480\u2481\u2482\u2483\u2484\u2485\u2486\u2487\u2488\u2489\u248a\u248b\u248c\u248d\u248e\u248f\u2490\u2491\u2492\u2493\u2494\u2495\u2496\u2497\u2498\u2499\u249a\u249b\u24ea\u24eb\u24ec\u24ed\u24ee\u24ef\u24f0\u24f1\u24f2\u24f3\u24f4\u24f5\u24f6\u24f7\u24f8\u24f9\u24fa\u24fb\u24fc\u24fd\u24fe\u24ff\u2776\u2777\u2778\u2779\u277a\u277b\u277c\u277d\u277e\u277f\u2780\u2781\u2782\u2783\u2784\u2785\u2786\u2787\u2788\u2789\u278a\u278b\u278c\u278d\u278e\u278f\u2790\u2791\u2792\u2793\u2cfd\u3192\u3193\u3194\u3195\u3220\u3221\u3222\u3223\u3224\u3225\u3226\u3227\u3228\u3229\u3251\u3252\u3253\u3254\u3255\u3256\u3257\u3258\u3259\u325a\u325b\u325c\u325d\u325e\u325f\u3280\u3281\u3282\u3283\u3284\u3285\u3286\u3287\u3288\u3289\u32b1\u32b2\u32b3\u32b4\u32b5\u32b6\u32b7\u32b8\u32b9\u32ba\u32bb\u32bc\u32bd\u32be\u32bf' -Pc = u'_\u203f\u2040\u2054\ufe33\ufe34\ufe4d\ufe4e\ufe4f\uff3f' +Pc = '_\u203f\u2040\u2054\ufe33\ufe34\ufe4d\ufe4e\ufe4f\uff3f' -Pd = u'-\u058a\u1806\u2010\u2011\u2012\u2013\u2014\u2015\u2e17\u301c\u3030\u30a0\ufe31\ufe32\ufe58\ufe63\uff0d' +Pd = '-\u058a\u1806\u2010\u2011\u2012\u2013\u2014\u2015\u2e17\u301c\u3030\u30a0\ufe31\ufe32\ufe58\ufe63\uff0d' -Pe = u')]}\u0f3b\u0f3d\u169c\u2046\u207e\u208e\u232a\u23b5\u2769\u276b\u276d\u276f\u2771\u2773\u2775\u27c6\u27e7\u27e9\u27eb\u2984\u2986\u2988\u298a\u298c\u298e\u2990\u2992\u2994\u2996\u2998\u29d9\u29db\u29fd\u3009\u300b\u300d\u300f\u3011\u3015\u3017\u3019\u301b\u301e\u301f\ufd3f\ufe18\ufe36\ufe38\ufe3a\ufe3c\ufe3e\ufe40\ufe42\ufe44\ufe48\ufe5a\ufe5c\ufe5e\uff09\uff3d\uff5d\uff60\uff63' +Pe = ')]}\u0f3b\u0f3d\u169c\u2046\u207e\u208e\u232a\u23b5\u2769\u276b\u276d\u276f\u2771\u2773\u2775\u27c6\u27e7\u27e9\u27eb\u2984\u2986\u2988\u298a\u298c\u298e\u2990\u2992\u2994\u2996\u2998\u29d9\u29db\u29fd\u3009\u300b\u300d\u300f\u3011\u3015\u3017\u3019\u301b\u301e\u301f\ufd3f\ufe18\ufe36\ufe38\ufe3a\ufe3c\ufe3e\ufe40\ufe42\ufe44\ufe48\ufe5a\ufe5c\ufe5e\uff09\uff3d\uff5d\uff60\uff63' -Pf = u'\xbb\u2019\u201d\u203a\u2e03\u2e05\u2e0a\u2e0d\u2e1d' +Pf = '\xbb\u2019\u201d\u203a\u2e03\u2e05\u2e0a\u2e0d\u2e1d' -Pi = u'\xab\u2018\u201b\u201c\u201f\u2039\u2e02\u2e04\u2e09\u2e0c\u2e1c' +Pi = '\xab\u2018\u201b\u201c\u201f\u2039\u2e02\u2e04\u2e09\u2e0c\u2e1c' -Po = u'!"#%&\'*,./:;?@\\\xa1\xb7\xbf\u037e\u0387\u055a\u055b\u055c\u055d\u055e\u055f\u0589\u05be\u05c0\u05c3\u05c6\u05f3\u05f4\u060c\u060d\u061b\u061e\u061f\u066a\u066b\u066c\u066d\u06d4\u0700\u0701\u0702\u0703\u0704\u0705\u0706\u0707\u0708\u0709\u070a\u070b\u070c\u070d\u0964\u0965\u0970\u0df4\u0e4f\u0e5a\u0e5b\u0f04\u0f05\u0f06\u0f07\u0f08\u0f09\u0f0a\u0f0b\u0f0c\u0f0d\u0f0e\u0f0f\u0f10\u0f11\u0f12\u0f85\u0fd0\u0fd1\u104a\u104b\u104c\u104d\u104e\u104f\u10fb\u1361\u1362\u1363\u1364\u1365\u1366\u1367\u1368\u166d\u166e\u16eb\u16ec\u16ed\u1735\u1736\u17d4\u17d5\u17d6\u17d8\u17d9\u17da\u1800\u1801\u1802\u1803\u1804\u1805\u1807\u1808\u1809\u180a\u1944\u1945\u19de\u19df\u1a1e\u1a1f\u2016\u2017\u2020\u2021\u2022\u2023\u2024\u2025\u2026\u2027\u2030\u2031\u2032\u2033\u2034\u2035\u2036\u2037\u2038\u203b\u203c\u203d\u203e\u2041\u2042\u2043\u2047\u2048\u2049\u204a\u204b\u204c\u204d\u204e\u204f\u2050\u2051\u2053\u2055\u2056\u2057\u2058\u2059\u205a\u205b\u205c\u205d\u205e\u23b6\u2cf9\u2cfa\u2cfb\u2cfc\u2cfe\u2cff\u2e00\u2e01\u2e06\u2e07\u2e08\u2e0b\u2e0e\u2e0f\u2e10\u2e11\u2e12\u2e13\u2e14\u2e15\u2e16\u3001\u3002\u3003\u303d\u30fb\ufe10\ufe11\ufe12\ufe13\ufe14\ufe15\ufe16\ufe19\ufe30\ufe45\ufe46\ufe49\ufe4a\ufe4b\ufe4c\ufe50\ufe51\ufe52\ufe54\ufe55\ufe56\ufe57\ufe5f\ufe60\ufe61\ufe68\ufe6a\ufe6b\uff01\uff02\uff03\uff05\uff06\uff07\uff0a\uff0c\uff0e\uff0f\uff1a\uff1b\uff1f\uff20\uff3c\uff61\uff64\uff65' +Po = '!"#%&\'*,./:;?@\\\xa1\xb7\xbf\u037e\u0387\u055a\u055b\u055c\u055d\u055e\u055f\u0589\u05be\u05c0\u05c3\u05c6\u05f3\u05f4\u060c\u060d\u061b\u061e\u061f\u066a\u066b\u066c\u066d\u06d4\u0700\u0701\u0702\u0703\u0704\u0705\u0706\u0707\u0708\u0709\u070a\u070b\u070c\u070d\u0964\u0965\u0970\u0df4\u0e4f\u0e5a\u0e5b\u0f04\u0f05\u0f06\u0f07\u0f08\u0f09\u0f0a\u0f0b\u0f0c\u0f0d\u0f0e\u0f0f\u0f10\u0f11\u0f12\u0f85\u0fd0\u0fd1\u104a\u104b\u104c\u104d\u104e\u104f\u10fb\u1361\u1362\u1363\u1364\u1365\u1366\u1367\u1368\u166d\u166e\u16eb\u16ec\u16ed\u1735\u1736\u17d4\u17d5\u17d6\u17d8\u17d9\u17da\u1800\u1801\u1802\u1803\u1804\u1805\u1807\u1808\u1809\u180a\u1944\u1945\u19de\u19df\u1a1e\u1a1f\u2016\u2017\u2020\u2021\u2022\u2023\u2024\u2025\u2026\u2027\u2030\u2031\u2032\u2033\u2034\u2035\u2036\u2037\u2038\u203b\u203c\u203d\u203e\u2041\u2042\u2043\u2047\u2048\u2049\u204a\u204b\u204c\u204d\u204e\u204f\u2050\u2051\u2053\u2055\u2056\u2057\u2058\u2059\u205a\u205b\u205c\u205d\u205e\u23b6\u2cf9\u2cfa\u2cfb\u2cfc\u2cfe\u2cff\u2e00\u2e01\u2e06\u2e07\u2e08\u2e0b\u2e0e\u2e0f\u2e10\u2e11\u2e12\u2e13\u2e14\u2e15\u2e16\u3001\u3002\u3003\u303d\u30fb\ufe10\ufe11\ufe12\ufe13\ufe14\ufe15\ufe16\ufe19\ufe30\ufe45\ufe46\ufe49\ufe4a\ufe4b\ufe4c\ufe50\ufe51\ufe52\ufe54\ufe55\ufe56\ufe57\ufe5f\ufe60\ufe61\ufe68\ufe6a\ufe6b\uff01\uff02\uff03\uff05\uff06\uff07\uff0a\uff0c\uff0e\uff0f\uff1a\uff1b\uff1f\uff20\uff3c\uff61\uff64\uff65' -Ps = u'([{\u0f3a\u0f3c\u169b\u201a\u201e\u2045\u207d\u208d\u2329\u23b4\u2768\u276a\u276c\u276e\u2770\u2772\u2774\u27c5\u27e6\u27e8\u27ea\u2983\u2985\u2987\u2989\u298b\u298d\u298f\u2991\u2993\u2995\u2997\u29d8\u29da\u29fc\u3008\u300a\u300c\u300e\u3010\u3014\u3016\u3018\u301a\u301d\ufd3e\ufe17\ufe35\ufe37\ufe39\ufe3b\ufe3d\ufe3f\ufe41\ufe43\ufe47\ufe59\ufe5b\ufe5d\uff08\uff3b\uff5b\uff5f\uff62' +Ps = '([{\u0f3a\u0f3c\u169b\u201a\u201e\u2045\u207d\u208d\u2329\u23b4\u2768\u276a\u276c\u276e\u2770\u2772\u2774\u27c5\u27e6\u27e8\u27ea\u2983\u2985\u2987\u2989\u298b\u298d\u298f\u2991\u2993\u2995\u2997\u29d8\u29da\u29fc\u3008\u300a\u300c\u300e\u3010\u3014\u3016\u3018\u301a\u301d\ufd3e\ufe17\ufe35\ufe37\ufe39\ufe3b\ufe3d\ufe3f\ufe41\ufe43\ufe47\ufe59\ufe5b\ufe5d\uff08\uff3b\uff5b\uff5f\uff62' -Sc = u'$\xa2\xa3\xa4\xa5\u060b\u09f2\u09f3\u0af1\u0bf9\u0e3f\u17db\u20a0\u20a1\u20a2\u20a3\u20a4\u20a5\u20a6\u20a7\u20a8\u20a9\u20aa\u20ab\u20ac\u20ad\u20ae\u20af\u20b0\u20b1\u20b2\u20b3\u20b4\u20b5\ufdfc\ufe69\uff04\uffe0\uffe1\uffe5\uffe6' +Sc = '$\xa2\xa3\xa4\xa5\u060b\u09f2\u09f3\u0af1\u0bf9\u0e3f\u17db\u20a0\u20a1\u20a2\u20a3\u20a4\u20a5\u20a6\u20a7\u20a8\u20a9\u20aa\u20ab\u20ac\u20ad\u20ae\u20af\u20b0\u20b1\u20b2\u20b3\u20b4\u20b5\ufdfc\ufe69\uff04\uffe0\uffe1\uffe5\uffe6' -Sk = u'^`\xa8\xaf\xb4\xb8\u02c2\u02c3\u02c4\u02c5\u02d2\u02d3\u02d4\u02d5\u02d6\u02d7\u02d8\u02d9\u02da\u02db\u02dc\u02dd\u02de\u02df\u02e5\u02e6\u02e7\u02e8\u02e9\u02ea\u02eb\u02ec\u02ed\u02ef\u02f0\u02f1\u02f2\u02f3\u02f4\u02f5\u02f6\u02f7\u02f8\u02f9\u02fa\u02fb\u02fc\u02fd\u02fe\u02ff\u0374\u0375\u0384\u0385\u1fbd\u1fbf\u1fc0\u1fc1\u1fcd\u1fce\u1fcf\u1fdd\u1fde\u1fdf\u1fed\u1fee\u1fef\u1ffd\u1ffe\u309b\u309c\ua700\ua701\ua702\ua703\ua704\ua705\ua706\ua707\ua708\ua709\ua70a\ua70b\ua70c\ua70d\ua70e\ua70f\ua710\ua711\ua712\ua713\ua714\ua715\ua716\uff3e\uff40\uffe3' +Sk = '^`\xa8\xaf\xb4\xb8\u02c2\u02c3\u02c4\u02c5\u02d2\u02d3\u02d4\u02d5\u02d6\u02d7\u02d8\u02d9\u02da\u02db\u02dc\u02dd\u02de\u02df\u02e5\u02e6\u02e7\u02e8\u02e9\u02ea\u02eb\u02ec\u02ed\u02ef\u02f0\u02f1\u02f2\u02f3\u02f4\u02f5\u02f6\u02f7\u02f8\u02f9\u02fa\u02fb\u02fc\u02fd\u02fe\u02ff\u0374\u0375\u0384\u0385\u1fbd\u1fbf\u1fc0\u1fc1\u1fcd\u1fce\u1fcf\u1fdd\u1fde\u1fdf\u1fed\u1fee\u1fef\u1ffd\u1ffe\u309b\u309c\ua700\ua701\ua702\ua703\ua704\ua705\ua706\ua707\ua708\ua709\ua70a\ua70b\ua70c\ua70d\ua70e\ua70f\ua710\ua711\ua712\ua713\ua714\ua715\ua716\uff3e\uff40\uffe3' -Sm = u'+<=>|~\xac\xb1\xd7\xf7\u03f6\u2044\u2052\u207a\u207b\u207c\u208a\u208b\u208c\u2140\u2141\u2142\u2143\u2144\u214b\u2190\u2191\u2192\u2193\u2194\u219a\u219b\u21a0\u21a3\u21a6\u21ae\u21ce\u21cf\u21d2\u21d4\u21f4\u21f5\u21f6\u21f7\u21f8\u21f9\u21fa\u21fb\u21fc\u21fd\u21fe\u21ff\u2200\u2201\u2202\u2203\u2204\u2205\u2206\u2207\u2208\u2209\u220a\u220b\u220c\u220d\u220e\u220f\u2210\u2211\u2212\u2213\u2214\u2215\u2216\u2217\u2218\u2219\u221a\u221b\u221c\u221d\u221e\u221f\u2220\u2221\u2222\u2223\u2224\u2225\u2226\u2227\u2228\u2229\u222a\u222b\u222c\u222d\u222e\u222f\u2230\u2231\u2232\u2233\u2234\u2235\u2236\u2237\u2238\u2239\u223a\u223b\u223c\u223d\u223e\u223f\u2240\u2241\u2242\u2243\u2244\u2245\u2246\u2247\u2248\u2249\u224a\u224b\u224c\u224d\u224e\u224f\u2250\u2251\u2252\u2253\u2254\u2255\u2256\u2257\u2258\u2259\u225a\u225b\u225c\u225d\u225e\u225f\u2260\u2261\u2262\u2263\u2264\u2265\u2266\u2267\u2268\u2269\u226a\u226b\u226c\u226d\u226e\u226f\u2270\u2271\u2272\u2273\u2274\u2275\u2276\u2277\u2278\u2279\u227a\u227b\u227c\u227d\u227e\u227f\u2280\u2281\u2282\u2283\u2284\u2285\u2286\u2287\u2288\u2289\u228a\u228b\u228c\u228d\u228e\u228f\u2290\u2291\u2292\u2293\u2294\u2295\u2296\u2297\u2298\u2299\u229a\u229b\u229c\u229d\u229e\u229f\u22a0\u22a1\u22a2\u22a3\u22a4\u22a5\u22a6\u22a7\u22a8\u22a9\u22aa\u22ab\u22ac\u22ad\u22ae\u22af\u22b0\u22b1\u22b2\u22b3\u22b4\u22b5\u22b6\u22b7\u22b8\u22b9\u22ba\u22bb\u22bc\u22bd\u22be\u22bf\u22c0\u22c1\u22c2\u22c3\u22c4\u22c5\u22c6\u22c7\u22c8\u22c9\u22ca\u22cb\u22cc\u22cd\u22ce\u22cf\u22d0\u22d1\u22d2\u22d3\u22d4\u22d5\u22d6\u22d7\u22d8\u22d9\u22da\u22db\u22dc\u22dd\u22de\u22df\u22e0\u22e1\u22e2\u22e3\u22e4\u22e5\u22e6\u22e7\u22e8\u22e9\u22ea\u22eb\u22ec\u22ed\u22ee\u22ef\u22f0\u22f1\u22f2\u22f3\u22f4\u22f5\u22f6\u22f7\u22f8\u22f9\u22fa\u22fb\u22fc\u22fd\u22fe\u22ff\u2308\u2309\u230a\u230b\u2320\u2321\u237c\u239b\u239c\u239d\u239e\u239f\u23a0\u23a1\u23a2\u23a3\u23a4\u23a5\u23a6\u23a7\u23a8\u23a9\u23aa\u23ab\u23ac\u23ad\u23ae\u23af\u23b0\u23b1\u23b2\u23b3\u25b7\u25c1\u25f8\u25f9\u25fa\u25fb\u25fc\u25fd\u25fe\u25ff\u266f\u27c0\u27c1\u27c2\u27c3\u27c4\u27d0\u27d1\u27d2\u27d3\u27d4\u27d5\u27d6\u27d7\u27d8\u27d9\u27da\u27db\u27dc\u27dd\u27de\u27df\u27e0\u27e1\u27e2\u27e3\u27e4\u27e5\u27f0\u27f1\u27f2\u27f3\u27f4\u27f5\u27f6\u27f7\u27f8\u27f9\u27fa\u27fb\u27fc\u27fd\u27fe\u27ff\u2900\u2901\u2902\u2903\u2904\u2905\u2906\u2907\u2908\u2909\u290a\u290b\u290c\u290d\u290e\u290f\u2910\u2911\u2912\u2913\u2914\u2915\u2916\u2917\u2918\u2919\u291a\u291b\u291c\u291d\u291e\u291f\u2920\u2921\u2922\u2923\u2924\u2925\u2926\u2927\u2928\u2929\u292a\u292b\u292c\u292d\u292e\u292f\u2930\u2931\u2932\u2933\u2934\u2935\u2936\u2937\u2938\u2939\u293a\u293b\u293c\u293d\u293e\u293f\u2940\u2941\u2942\u2943\u2944\u2945\u2946\u2947\u2948\u2949\u294a\u294b\u294c\u294d\u294e\u294f\u2950\u2951\u2952\u2953\u2954\u2955\u2956\u2957\u2958\u2959\u295a\u295b\u295c\u295d\u295e\u295f\u2960\u2961\u2962\u2963\u2964\u2965\u2966\u2967\u2968\u2969\u296a\u296b\u296c\u296d\u296e\u296f\u2970\u2971\u2972\u2973\u2974\u2975\u2976\u2977\u2978\u2979\u297a\u297b\u297c\u297d\u297e\u297f\u2980\u2981\u2982\u2999\u299a\u299b\u299c\u299d\u299e\u299f\u29a0\u29a1\u29a2\u29a3\u29a4\u29a5\u29a6\u29a7\u29a8\u29a9\u29aa\u29ab\u29ac\u29ad\u29ae\u29af\u29b0\u29b1\u29b2\u29b3\u29b4\u29b5\u29b6\u29b7\u29b8\u29b9\u29ba\u29bb\u29bc\u29bd\u29be\u29bf\u29c0\u29c1\u29c2\u29c3\u29c4\u29c5\u29c6\u29c7\u29c8\u29c9\u29ca\u29cb\u29cc\u29cd\u29ce\u29cf\u29d0\u29d1\u29d2\u29d3\u29d4\u29d5\u29d6\u29d7\u29dc\u29dd\u29de\u29df\u29e0\u29e1\u29e2\u29e3\u29e4\u29e5\u29e6\u29e7\u29e8\u29e9\u29ea\u29eb\u29ec\u29ed\u29ee\u29ef\u29f0\u29f1\u29f2\u29f3\u29f4\u29f5\u29f6\u29f7\u29f8\u29f9\u29fa\u29fb\u29fe\u29ff\u2a00\u2a01\u2a02\u2a03\u2a04\u2a05\u2a06\u2a07\u2a08\u2a09\u2a0a\u2a0b\u2a0c\u2a0d\u2a0e\u2a0f\u2a10\u2a11\u2a12\u2a13\u2a14\u2a15\u2a16\u2a17\u2a18\u2a19\u2a1a\u2a1b\u2a1c\u2a1d\u2a1e\u2a1f\u2a20\u2a21\u2a22\u2a23\u2a24\u2a25\u2a26\u2a27\u2a28\u2a29\u2a2a\u2a2b\u2a2c\u2a2d\u2a2e\u2a2f\u2a30\u2a31\u2a32\u2a33\u2a34\u2a35\u2a36\u2a37\u2a38\u2a39\u2a3a\u2a3b\u2a3c\u2a3d\u2a3e\u2a3f\u2a40\u2a41\u2a42\u2a43\u2a44\u2a45\u2a46\u2a47\u2a48\u2a49\u2a4a\u2a4b\u2a4c\u2a4d\u2a4e\u2a4f\u2a50\u2a51\u2a52\u2a53\u2a54\u2a55\u2a56\u2a57\u2a58\u2a59\u2a5a\u2a5b\u2a5c\u2a5d\u2a5e\u2a5f\u2a60\u2a61\u2a62\u2a63\u2a64\u2a65\u2a66\u2a67\u2a68\u2a69\u2a6a\u2a6b\u2a6c\u2a6d\u2a6e\u2a6f\u2a70\u2a71\u2a72\u2a73\u2a74\u2a75\u2a76\u2a77\u2a78\u2a79\u2a7a\u2a7b\u2a7c\u2a7d\u2a7e\u2a7f\u2a80\u2a81\u2a82\u2a83\u2a84\u2a85\u2a86\u2a87\u2a88\u2a89\u2a8a\u2a8b\u2a8c\u2a8d\u2a8e\u2a8f\u2a90\u2a91\u2a92\u2a93\u2a94\u2a95\u2a96\u2a97\u2a98\u2a99\u2a9a\u2a9b\u2a9c\u2a9d\u2a9e\u2a9f\u2aa0\u2aa1\u2aa2\u2aa3\u2aa4\u2aa5\u2aa6\u2aa7\u2aa8\u2aa9\u2aaa\u2aab\u2aac\u2aad\u2aae\u2aaf\u2ab0\u2ab1\u2ab2\u2ab3\u2ab4\u2ab5\u2ab6\u2ab7\u2ab8\u2ab9\u2aba\u2abb\u2abc\u2abd\u2abe\u2abf\u2ac0\u2ac1\u2ac2\u2ac3\u2ac4\u2ac5\u2ac6\u2ac7\u2ac8\u2ac9\u2aca\u2acb\u2acc\u2acd\u2ace\u2acf\u2ad0\u2ad1\u2ad2\u2ad3\u2ad4\u2ad5\u2ad6\u2ad7\u2ad8\u2ad9\u2ada\u2adb\u2adc\u2add\u2ade\u2adf\u2ae0\u2ae1\u2ae2\u2ae3\u2ae4\u2ae5\u2ae6\u2ae7\u2ae8\u2ae9\u2aea\u2aeb\u2aec\u2aed\u2aee\u2aef\u2af0\u2af1\u2af2\u2af3\u2af4\u2af5\u2af6\u2af7\u2af8\u2af9\u2afa\u2afb\u2afc\u2afd\u2afe\u2aff\ufb29\ufe62\ufe64\ufe65\ufe66\uff0b\uff1c\uff1d\uff1e\uff5c\uff5e\uffe2\uffe9\uffea\uffeb\uffec' +Sm = '+<=>|~\xac\xb1\xd7\xf7\u03f6\u2044\u2052\u207a\u207b\u207c\u208a\u208b\u208c\u2140\u2141\u2142\u2143\u2144\u214b\u2190\u2191\u2192\u2193\u2194\u219a\u219b\u21a0\u21a3\u21a6\u21ae\u21ce\u21cf\u21d2\u21d4\u21f4\u21f5\u21f6\u21f7\u21f8\u21f9\u21fa\u21fb\u21fc\u21fd\u21fe\u21ff\u2200\u2201\u2202\u2203\u2204\u2205\u2206\u2207\u2208\u2209\u220a\u220b\u220c\u220d\u220e\u220f\u2210\u2211\u2212\u2213\u2214\u2215\u2216\u2217\u2218\u2219\u221a\u221b\u221c\u221d\u221e\u221f\u2220\u2221\u2222\u2223\u2224\u2225\u2226\u2227\u2228\u2229\u222a\u222b\u222c\u222d\u222e\u222f\u2230\u2231\u2232\u2233\u2234\u2235\u2236\u2237\u2238\u2239\u223a\u223b\u223c\u223d\u223e\u223f\u2240\u2241\u2242\u2243\u2244\u2245\u2246\u2247\u2248\u2249\u224a\u224b\u224c\u224d\u224e\u224f\u2250\u2251\u2252\u2253\u2254\u2255\u2256\u2257\u2258\u2259\u225a\u225b\u225c\u225d\u225e\u225f\u2260\u2261\u2262\u2263\u2264\u2265\u2266\u2267\u2268\u2269\u226a\u226b\u226c\u226d\u226e\u226f\u2270\u2271\u2272\u2273\u2274\u2275\u2276\u2277\u2278\u2279\u227a\u227b\u227c\u227d\u227e\u227f\u2280\u2281\u2282\u2283\u2284\u2285\u2286\u2287\u2288\u2289\u228a\u228b\u228c\u228d\u228e\u228f\u2290\u2291\u2292\u2293\u2294\u2295\u2296\u2297\u2298\u2299\u229a\u229b\u229c\u229d\u229e\u229f\u22a0\u22a1\u22a2\u22a3\u22a4\u22a5\u22a6\u22a7\u22a8\u22a9\u22aa\u22ab\u22ac\u22ad\u22ae\u22af\u22b0\u22b1\u22b2\u22b3\u22b4\u22b5\u22b6\u22b7\u22b8\u22b9\u22ba\u22bb\u22bc\u22bd\u22be\u22bf\u22c0\u22c1\u22c2\u22c3\u22c4\u22c5\u22c6\u22c7\u22c8\u22c9\u22ca\u22cb\u22cc\u22cd\u22ce\u22cf\u22d0\u22d1\u22d2\u22d3\u22d4\u22d5\u22d6\u22d7\u22d8\u22d9\u22da\u22db\u22dc\u22dd\u22de\u22df\u22e0\u22e1\u22e2\u22e3\u22e4\u22e5\u22e6\u22e7\u22e8\u22e9\u22ea\u22eb\u22ec\u22ed\u22ee\u22ef\u22f0\u22f1\u22f2\u22f3\u22f4\u22f5\u22f6\u22f7\u22f8\u22f9\u22fa\u22fb\u22fc\u22fd\u22fe\u22ff\u2308\u2309\u230a\u230b\u2320\u2321\u237c\u239b\u239c\u239d\u239e\u239f\u23a0\u23a1\u23a2\u23a3\u23a4\u23a5\u23a6\u23a7\u23a8\u23a9\u23aa\u23ab\u23ac\u23ad\u23ae\u23af\u23b0\u23b1\u23b2\u23b3\u25b7\u25c1\u25f8\u25f9\u25fa\u25fb\u25fc\u25fd\u25fe\u25ff\u266f\u27c0\u27c1\u27c2\u27c3\u27c4\u27d0\u27d1\u27d2\u27d3\u27d4\u27d5\u27d6\u27d7\u27d8\u27d9\u27da\u27db\u27dc\u27dd\u27de\u27df\u27e0\u27e1\u27e2\u27e3\u27e4\u27e5\u27f0\u27f1\u27f2\u27f3\u27f4\u27f5\u27f6\u27f7\u27f8\u27f9\u27fa\u27fb\u27fc\u27fd\u27fe\u27ff\u2900\u2901\u2902\u2903\u2904\u2905\u2906\u2907\u2908\u2909\u290a\u290b\u290c\u290d\u290e\u290f\u2910\u2911\u2912\u2913\u2914\u2915\u2916\u2917\u2918\u2919\u291a\u291b\u291c\u291d\u291e\u291f\u2920\u2921\u2922\u2923\u2924\u2925\u2926\u2927\u2928\u2929\u292a\u292b\u292c\u292d\u292e\u292f\u2930\u2931\u2932\u2933\u2934\u2935\u2936\u2937\u2938\u2939\u293a\u293b\u293c\u293d\u293e\u293f\u2940\u2941\u2942\u2943\u2944\u2945\u2946\u2947\u2948\u2949\u294a\u294b\u294c\u294d\u294e\u294f\u2950\u2951\u2952\u2953\u2954\u2955\u2956\u2957\u2958\u2959\u295a\u295b\u295c\u295d\u295e\u295f\u2960\u2961\u2962\u2963\u2964\u2965\u2966\u2967\u2968\u2969\u296a\u296b\u296c\u296d\u296e\u296f\u2970\u2971\u2972\u2973\u2974\u2975\u2976\u2977\u2978\u2979\u297a\u297b\u297c\u297d\u297e\u297f\u2980\u2981\u2982\u2999\u299a\u299b\u299c\u299d\u299e\u299f\u29a0\u29a1\u29a2\u29a3\u29a4\u29a5\u29a6\u29a7\u29a8\u29a9\u29aa\u29ab\u29ac\u29ad\u29ae\u29af\u29b0\u29b1\u29b2\u29b3\u29b4\u29b5\u29b6\u29b7\u29b8\u29b9\u29ba\u29bb\u29bc\u29bd\u29be\u29bf\u29c0\u29c1\u29c2\u29c3\u29c4\u29c5\u29c6\u29c7\u29c8\u29c9\u29ca\u29cb\u29cc\u29cd\u29ce\u29cf\u29d0\u29d1\u29d2\u29d3\u29d4\u29d5\u29d6\u29d7\u29dc\u29dd\u29de\u29df\u29e0\u29e1\u29e2\u29e3\u29e4\u29e5\u29e6\u29e7\u29e8\u29e9\u29ea\u29eb\u29ec\u29ed\u29ee\u29ef\u29f0\u29f1\u29f2\u29f3\u29f4\u29f5\u29f6\u29f7\u29f8\u29f9\u29fa\u29fb\u29fe\u29ff\u2a00\u2a01\u2a02\u2a03\u2a04\u2a05\u2a06\u2a07\u2a08\u2a09\u2a0a\u2a0b\u2a0c\u2a0d\u2a0e\u2a0f\u2a10\u2a11\u2a12\u2a13\u2a14\u2a15\u2a16\u2a17\u2a18\u2a19\u2a1a\u2a1b\u2a1c\u2a1d\u2a1e\u2a1f\u2a20\u2a21\u2a22\u2a23\u2a24\u2a25\u2a26\u2a27\u2a28\u2a29\u2a2a\u2a2b\u2a2c\u2a2d\u2a2e\u2a2f\u2a30\u2a31\u2a32\u2a33\u2a34\u2a35\u2a36\u2a37\u2a38\u2a39\u2a3a\u2a3b\u2a3c\u2a3d\u2a3e\u2a3f\u2a40\u2a41\u2a42\u2a43\u2a44\u2a45\u2a46\u2a47\u2a48\u2a49\u2a4a\u2a4b\u2a4c\u2a4d\u2a4e\u2a4f\u2a50\u2a51\u2a52\u2a53\u2a54\u2a55\u2a56\u2a57\u2a58\u2a59\u2a5a\u2a5b\u2a5c\u2a5d\u2a5e\u2a5f\u2a60\u2a61\u2a62\u2a63\u2a64\u2a65\u2a66\u2a67\u2a68\u2a69\u2a6a\u2a6b\u2a6c\u2a6d\u2a6e\u2a6f\u2a70\u2a71\u2a72\u2a73\u2a74\u2a75\u2a76\u2a77\u2a78\u2a79\u2a7a\u2a7b\u2a7c\u2a7d\u2a7e\u2a7f\u2a80\u2a81\u2a82\u2a83\u2a84\u2a85\u2a86\u2a87\u2a88\u2a89\u2a8a\u2a8b\u2a8c\u2a8d\u2a8e\u2a8f\u2a90\u2a91\u2a92\u2a93\u2a94\u2a95\u2a96\u2a97\u2a98\u2a99\u2a9a\u2a9b\u2a9c\u2a9d\u2a9e\u2a9f\u2aa0\u2aa1\u2aa2\u2aa3\u2aa4\u2aa5\u2aa6\u2aa7\u2aa8\u2aa9\u2aaa\u2aab\u2aac\u2aad\u2aae\u2aaf\u2ab0\u2ab1\u2ab2\u2ab3\u2ab4\u2ab5\u2ab6\u2ab7\u2ab8\u2ab9\u2aba\u2abb\u2abc\u2abd\u2abe\u2abf\u2ac0\u2ac1\u2ac2\u2ac3\u2ac4\u2ac5\u2ac6\u2ac7\u2ac8\u2ac9\u2aca\u2acb\u2acc\u2acd\u2ace\u2acf\u2ad0\u2ad1\u2ad2\u2ad3\u2ad4\u2ad5\u2ad6\u2ad7\u2ad8\u2ad9\u2ada\u2adb\u2adc\u2add\u2ade\u2adf\u2ae0\u2ae1\u2ae2\u2ae3\u2ae4\u2ae5\u2ae6\u2ae7\u2ae8\u2ae9\u2aea\u2aeb\u2aec\u2aed\u2aee\u2aef\u2af0\u2af1\u2af2\u2af3\u2af4\u2af5\u2af6\u2af7\u2af8\u2af9\u2afa\u2afb\u2afc\u2afd\u2afe\u2aff\ufb29\ufe62\ufe64\ufe65\ufe66\uff0b\uff1c\uff1d\uff1e\uff5c\uff5e\uffe2\uffe9\uffea\uffeb\uffec' -So = u'\xa6\xa7\xa9\xae\xb0\xb6\u0482\u060e\u060f\u06e9\u06fd\u06fe\u09fa\u0b70\u0bf3\u0bf4\u0bf5\u0bf6\u0bf7\u0bf8\u0bfa\u0f01\u0f02\u0f03\u0f13\u0f14\u0f15\u0f16\u0f17\u0f1a\u0f1b\u0f1c\u0f1d\u0f1e\u0f1f\u0f34\u0f36\u0f38\u0fbe\u0fbf\u0fc0\u0fc1\u0fc2\u0fc3\u0fc4\u0fc5\u0fc7\u0fc8\u0fc9\u0fca\u0fcb\u0fcc\u0fcf\u1360\u1390\u1391\u1392\u1393\u1394\u1395\u1396\u1397\u1398\u1399\u1940\u19e0\u19e1\u19e2\u19e3\u19e4\u19e5\u19e6\u19e7\u19e8\u19e9\u19ea\u19eb\u19ec\u19ed\u19ee\u19ef\u19f0\u19f1\u19f2\u19f3\u19f4\u19f5\u19f6\u19f7\u19f8\u19f9\u19fa\u19fb\u19fc\u19fd\u19fe\u19ff\u2100\u2101\u2103\u2104\u2105\u2106\u2108\u2109\u2114\u2116\u2117\u2118\u211e\u211f\u2120\u2121\u2122\u2123\u2125\u2127\u2129\u212e\u2132\u213a\u213b\u214a\u214c\u2195\u2196\u2197\u2198\u2199\u219c\u219d\u219e\u219f\u21a1\u21a2\u21a4\u21a5\u21a7\u21a8\u21a9\u21aa\u21ab\u21ac\u21ad\u21af\u21b0\u21b1\u21b2\u21b3\u21b4\u21b5\u21b6\u21b7\u21b8\u21b9\u21ba\u21bb\u21bc\u21bd\u21be\u21bf\u21c0\u21c1\u21c2\u21c3\u21c4\u21c5\u21c6\u21c7\u21c8\u21c9\u21ca\u21cb\u21cc\u21cd\u21d0\u21d1\u21d3\u21d5\u21d6\u21d7\u21d8\u21d9\u21da\u21db\u21dc\u21dd\u21de\u21df\u21e0\u21e1\u21e2\u21e3\u21e4\u21e5\u21e6\u21e7\u21e8\u21e9\u21ea\u21eb\u21ec\u21ed\u21ee\u21ef\u21f0\u21f1\u21f2\u21f3\u2300\u2301\u2302\u2303\u2304\u2305\u2306\u2307\u230c\u230d\u230e\u230f\u2310\u2311\u2312\u2313\u2314\u2315\u2316\u2317\u2318\u2319\u231a\u231b\u231c\u231d\u231e\u231f\u2322\u2323\u2324\u2325\u2326\u2327\u2328\u232b\u232c\u232d\u232e\u232f\u2330\u2331\u2332\u2333\u2334\u2335\u2336\u2337\u2338\u2339\u233a\u233b\u233c\u233d\u233e\u233f\u2340\u2341\u2342\u2343\u2344\u2345\u2346\u2347\u2348\u2349\u234a\u234b\u234c\u234d\u234e\u234f\u2350\u2351\u2352\u2353\u2354\u2355\u2356\u2357\u2358\u2359\u235a\u235b\u235c\u235d\u235e\u235f\u2360\u2361\u2362\u2363\u2364\u2365\u2366\u2367\u2368\u2369\u236a\u236b\u236c\u236d\u236e\u236f\u2370\u2371\u2372\u2373\u2374\u2375\u2376\u2377\u2378\u2379\u237a\u237b\u237d\u237e\u237f\u2380\u2381\u2382\u2383\u2384\u2385\u2386\u2387\u2388\u2389\u238a\u238b\u238c\u238d\u238e\u238f\u2390\u2391\u2392\u2393\u2394\u2395\u2396\u2397\u2398\u2399\u239a\u23b7\u23b8\u23b9\u23ba\u23bb\u23bc\u23bd\u23be\u23bf\u23c0\u23c1\u23c2\u23c3\u23c4\u23c5\u23c6\u23c7\u23c8\u23c9\u23ca\u23cb\u23cc\u23cd\u23ce\u23cf\u23d0\u23d1\u23d2\u23d3\u23d4\u23d5\u23d6\u23d7\u23d8\u23d9\u23da\u23db\u2400\u2401\u2402\u2403\u2404\u2405\u2406\u2407\u2408\u2409\u240a\u240b\u240c\u240d\u240e\u240f\u2410\u2411\u2412\u2413\u2414\u2415\u2416\u2417\u2418\u2419\u241a\u241b\u241c\u241d\u241e\u241f\u2420\u2421\u2422\u2423\u2424\u2425\u2426\u2440\u2441\u2442\u2443\u2444\u2445\u2446\u2447\u2448\u2449\u244a\u249c\u249d\u249e\u249f\u24a0\u24a1\u24a2\u24a3\u24a4\u24a5\u24a6\u24a7\u24a8\u24a9\u24aa\u24ab\u24ac\u24ad\u24ae\u24af\u24b0\u24b1\u24b2\u24b3\u24b4\u24b5\u24b6\u24b7\u24b8\u24b9\u24ba\u24bb\u24bc\u24bd\u24be\u24bf\u24c0\u24c1\u24c2\u24c3\u24c4\u24c5\u24c6\u24c7\u24c8\u24c9\u24ca\u24cb\u24cc\u24cd\u24ce\u24cf\u24d0\u24d1\u24d2\u24d3\u24d4\u24d5\u24d6\u24d7\u24d8\u24d9\u24da\u24db\u24dc\u24dd\u24de\u24df\u24e0\u24e1\u24e2\u24e3\u24e4\u24e5\u24e6\u24e7\u24e8\u24e9\u2500\u2501\u2502\u2503\u2504\u2505\u2506\u2507\u2508\u2509\u250a\u250b\u250c\u250d\u250e\u250f\u2510\u2511\u2512\u2513\u2514\u2515\u2516\u2517\u2518\u2519\u251a\u251b\u251c\u251d\u251e\u251f\u2520\u2521\u2522\u2523\u2524\u2525\u2526\u2527\u2528\u2529\u252a\u252b\u252c\u252d\u252e\u252f\u2530\u2531\u2532\u2533\u2534\u2535\u2536\u2537\u2538\u2539\u253a\u253b\u253c\u253d\u253e\u253f\u2540\u2541\u2542\u2543\u2544\u2545\u2546\u2547\u2548\u2549\u254a\u254b\u254c\u254d\u254e\u254f\u2550\u2551\u2552\u2553\u2554\u2555\u2556\u2557\u2558\u2559\u255a\u255b\u255c\u255d\u255e\u255f\u2560\u2561\u2562\u2563\u2564\u2565\u2566\u2567\u2568\u2569\u256a\u256b\u256c\u256d\u256e\u256f\u2570\u2571\u2572\u2573\u2574\u2575\u2576\u2577\u2578\u2579\u257a\u257b\u257c\u257d\u257e\u257f\u2580\u2581\u2582\u2583\u2584\u2585\u2586\u2587\u2588\u2589\u258a\u258b\u258c\u258d\u258e\u258f\u2590\u2591\u2592\u2593\u2594\u2595\u2596\u2597\u2598\u2599\u259a\u259b\u259c\u259d\u259e\u259f\u25a0\u25a1\u25a2\u25a3\u25a4\u25a5\u25a6\u25a7\u25a8\u25a9\u25aa\u25ab\u25ac\u25ad\u25ae\u25af\u25b0\u25b1\u25b2\u25b3\u25b4\u25b5\u25b6\u25b8\u25b9\u25ba\u25bb\u25bc\u25bd\u25be\u25bf\u25c0\u25c2\u25c3\u25c4\u25c5\u25c6\u25c7\u25c8\u25c9\u25ca\u25cb\u25cc\u25cd\u25ce\u25cf\u25d0\u25d1\u25d2\u25d3\u25d4\u25d5\u25d6\u25d7\u25d8\u25d9\u25da\u25db\u25dc\u25dd\u25de\u25df\u25e0\u25e1\u25e2\u25e3\u25e4\u25e5\u25e6\u25e7\u25e8\u25e9\u25ea\u25eb\u25ec\u25ed\u25ee\u25ef\u25f0\u25f1\u25f2\u25f3\u25f4\u25f5\u25f6\u25f7\u2600\u2601\u2602\u2603\u2604\u2605\u2606\u2607\u2608\u2609\u260a\u260b\u260c\u260d\u260e\u260f\u2610\u2611\u2612\u2613\u2614\u2615\u2616\u2617\u2618\u2619\u261a\u261b\u261c\u261d\u261e\u261f\u2620\u2621\u2622\u2623\u2624\u2625\u2626\u2627\u2628\u2629\u262a\u262b\u262c\u262d\u262e\u262f\u2630\u2631\u2632\u2633\u2634\u2635\u2636\u2637\u2638\u2639\u263a\u263b\u263c\u263d\u263e\u263f\u2640\u2641\u2642\u2643\u2644\u2645\u2646\u2647\u2648\u2649\u264a\u264b\u264c\u264d\u264e\u264f\u2650\u2651\u2652\u2653\u2654\u2655\u2656\u2657\u2658\u2659\u265a\u265b\u265c\u265d\u265e\u265f\u2660\u2661\u2662\u2663\u2664\u2665\u2666\u2667\u2668\u2669\u266a\u266b\u266c\u266d\u266e\u2670\u2671\u2672\u2673\u2674\u2675\u2676\u2677\u2678\u2679\u267a\u267b\u267c\u267d\u267e\u267f\u2680\u2681\u2682\u2683\u2684\u2685\u2686\u2687\u2688\u2689\u268a\u268b\u268c\u268d\u268e\u268f\u2690\u2691\u2692\u2693\u2694\u2695\u2696\u2697\u2698\u2699\u269a\u269b\u269c\u26a0\u26a1\u26a2\u26a3\u26a4\u26a5\u26a6\u26a7\u26a8\u26a9\u26aa\u26ab\u26ac\u26ad\u26ae\u26af\u26b0\u26b1\u2701\u2702\u2703\u2704\u2706\u2707\u2708\u2709\u270c\u270d\u270e\u270f\u2710\u2711\u2712\u2713\u2714\u2715\u2716\u2717\u2718\u2719\u271a\u271b\u271c\u271d\u271e\u271f\u2720\u2721\u2722\u2723\u2724\u2725\u2726\u2727\u2729\u272a\u272b\u272c\u272d\u272e\u272f\u2730\u2731\u2732\u2733\u2734\u2735\u2736\u2737\u2738\u2739\u273a\u273b\u273c\u273d\u273e\u273f\u2740\u2741\u2742\u2743\u2744\u2745\u2746\u2747\u2748\u2749\u274a\u274b\u274d\u274f\u2750\u2751\u2752\u2756\u2758\u2759\u275a\u275b\u275c\u275d\u275e\u2761\u2762\u2763\u2764\u2765\u2766\u2767\u2794\u2798\u2799\u279a\u279b\u279c\u279d\u279e\u279f\u27a0\u27a1\u27a2\u27a3\u27a4\u27a5\u27a6\u27a7\u27a8\u27a9\u27aa\u27ab\u27ac\u27ad\u27ae\u27af\u27b1\u27b2\u27b3\u27b4\u27b5\u27b6\u27b7\u27b8\u27b9\u27ba\u27bb\u27bc\u27bd\u27be\u2800\u2801\u2802\u2803\u2804\u2805\u2806\u2807\u2808\u2809\u280a\u280b\u280c\u280d\u280e\u280f\u2810\u2811\u2812\u2813\u2814\u2815\u2816\u2817\u2818\u2819\u281a\u281b\u281c\u281d\u281e\u281f\u2820\u2821\u2822\u2823\u2824\u2825\u2826\u2827\u2828\u2829\u282a\u282b\u282c\u282d\u282e\u282f\u2830\u2831\u2832\u2833\u2834\u2835\u2836\u2837\u2838\u2839\u283a\u283b\u283c\u283d\u283e\u283f\u2840\u2841\u2842\u2843\u2844\u2845\u2846\u2847\u2848\u2849\u284a\u284b\u284c\u284d\u284e\u284f\u2850\u2851\u2852\u2853\u2854\u2855\u2856\u2857\u2858\u2859\u285a\u285b\u285c\u285d\u285e\u285f\u2860\u2861\u2862\u2863\u2864\u2865\u2866\u2867\u2868\u2869\u286a\u286b\u286c\u286d\u286e\u286f\u2870\u2871\u2872\u2873\u2874\u2875\u2876\u2877\u2878\u2879\u287a\u287b\u287c\u287d\u287e\u287f\u2880\u2881\u2882\u2883\u2884\u2885\u2886\u2887\u2888\u2889\u288a\u288b\u288c\u288d\u288e\u288f\u2890\u2891\u2892\u2893\u2894\u2895\u2896\u2897\u2898\u2899\u289a\u289b\u289c\u289d\u289e\u289f\u28a0\u28a1\u28a2\u28a3\u28a4\u28a5\u28a6\u28a7\u28a8\u28a9\u28aa\u28ab\u28ac\u28ad\u28ae\u28af\u28b0\u28b1\u28b2\u28b3\u28b4\u28b5\u28b6\u28b7\u28b8\u28b9\u28ba\u28bb\u28bc\u28bd\u28be\u28bf\u28c0\u28c1\u28c2\u28c3\u28c4\u28c5\u28c6\u28c7\u28c8\u28c9\u28ca\u28cb\u28cc\u28cd\u28ce\u28cf\u28d0\u28d1\u28d2\u28d3\u28d4\u28d5\u28d6\u28d7\u28d8\u28d9\u28da\u28db\u28dc\u28dd\u28de\u28df\u28e0\u28e1\u28e2\u28e3\u28e4\u28e5\u28e6\u28e7\u28e8\u28e9\u28ea\u28eb\u28ec\u28ed\u28ee\u28ef\u28f0\u28f1\u28f2\u28f3\u28f4\u28f5\u28f6\u28f7\u28f8\u28f9\u28fa\u28fb\u28fc\u28fd\u28fe\u28ff\u2b00\u2b01\u2b02\u2b03\u2b04\u2b05\u2b06\u2b07\u2b08\u2b09\u2b0a\u2b0b\u2b0c\u2b0d\u2b0e\u2b0f\u2b10\u2b11\u2b12\u2b13\u2ce5\u2ce6\u2ce7\u2ce8\u2ce9\u2cea\u2e80\u2e81\u2e82\u2e83\u2e84\u2e85\u2e86\u2e87\u2e88\u2e89\u2e8a\u2e8b\u2e8c\u2e8d\u2e8e\u2e8f\u2e90\u2e91\u2e92\u2e93\u2e94\u2e95\u2e96\u2e97\u2e98\u2e99\u2e9b\u2e9c\u2e9d\u2e9e\u2e9f\u2ea0\u2ea1\u2ea2\u2ea3\u2ea4\u2ea5\u2ea6\u2ea7\u2ea8\u2ea9\u2eaa\u2eab\u2eac\u2ead\u2eae\u2eaf\u2eb0\u2eb1\u2eb2\u2eb3\u2eb4\u2eb5\u2eb6\u2eb7\u2eb8\u2eb9\u2eba\u2ebb\u2ebc\u2ebd\u2ebe\u2ebf\u2ec0\u2ec1\u2ec2\u2ec3\u2ec4\u2ec5\u2ec6\u2ec7\u2ec8\u2ec9\u2eca\u2ecb\u2ecc\u2ecd\u2ece\u2ecf\u2ed0\u2ed1\u2ed2\u2ed3\u2ed4\u2ed5\u2ed6\u2ed7\u2ed8\u2ed9\u2eda\u2edb\u2edc\u2edd\u2ede\u2edf\u2ee0\u2ee1\u2ee2\u2ee3\u2ee4\u2ee5\u2ee6\u2ee7\u2ee8\u2ee9\u2eea\u2eeb\u2eec\u2eed\u2eee\u2eef\u2ef0\u2ef1\u2ef2\u2ef3\u2f00\u2f01\u2f02\u2f03\u2f04\u2f05\u2f06\u2f07\u2f08\u2f09\u2f0a\u2f0b\u2f0c\u2f0d\u2f0e\u2f0f\u2f10\u2f11\u2f12\u2f13\u2f14\u2f15\u2f16\u2f17\u2f18\u2f19\u2f1a\u2f1b\u2f1c\u2f1d\u2f1e\u2f1f\u2f20\u2f21\u2f22\u2f23\u2f24\u2f25\u2f26\u2f27\u2f28\u2f29\u2f2a\u2f2b\u2f2c\u2f2d\u2f2e\u2f2f\u2f30\u2f31\u2f32\u2f33\u2f34\u2f35\u2f36\u2f37\u2f38\u2f39\u2f3a\u2f3b\u2f3c\u2f3d\u2f3e\u2f3f\u2f40\u2f41\u2f42\u2f43\u2f44\u2f45\u2f46\u2f47\u2f48\u2f49\u2f4a\u2f4b\u2f4c\u2f4d\u2f4e\u2f4f\u2f50\u2f51\u2f52\u2f53\u2f54\u2f55\u2f56\u2f57\u2f58\u2f59\u2f5a\u2f5b\u2f5c\u2f5d\u2f5e\u2f5f\u2f60\u2f61\u2f62\u2f63\u2f64\u2f65\u2f66\u2f67\u2f68\u2f69\u2f6a\u2f6b\u2f6c\u2f6d\u2f6e\u2f6f\u2f70\u2f71\u2f72\u2f73\u2f74\u2f75\u2f76\u2f77\u2f78\u2f79\u2f7a\u2f7b\u2f7c\u2f7d\u2f7e\u2f7f\u2f80\u2f81\u2f82\u2f83\u2f84\u2f85\u2f86\u2f87\u2f88\u2f89\u2f8a\u2f8b\u2f8c\u2f8d\u2f8e\u2f8f\u2f90\u2f91\u2f92\u2f93\u2f94\u2f95\u2f96\u2f97\u2f98\u2f99\u2f9a\u2f9b\u2f9c\u2f9d\u2f9e\u2f9f\u2fa0\u2fa1\u2fa2\u2fa3\u2fa4\u2fa5\u2fa6\u2fa7\u2fa8\u2fa9\u2faa\u2fab\u2fac\u2fad\u2fae\u2faf\u2fb0\u2fb1\u2fb2\u2fb3\u2fb4\u2fb5\u2fb6\u2fb7\u2fb8\u2fb9\u2fba\u2fbb\u2fbc\u2fbd\u2fbe\u2fbf\u2fc0\u2fc1\u2fc2\u2fc3\u2fc4\u2fc5\u2fc6\u2fc7\u2fc8\u2fc9\u2fca\u2fcb\u2fcc\u2fcd\u2fce\u2fcf\u2fd0\u2fd1\u2fd2\u2fd3\u2fd4\u2fd5\u2ff0\u2ff1\u2ff2\u2ff3\u2ff4\u2ff5\u2ff6\u2ff7\u2ff8\u2ff9\u2ffa\u2ffb\u3004\u3012\u3013\u3020\u3036\u3037\u303e\u303f\u3190\u3191\u3196\u3197\u3198\u3199\u319a\u319b\u319c\u319d\u319e\u319f\u31c0\u31c1\u31c2\u31c3\u31c4\u31c5\u31c6\u31c7\u31c8\u31c9\u31ca\u31cb\u31cc\u31cd\u31ce\u31cf\u3200\u3201\u3202\u3203\u3204\u3205\u3206\u3207\u3208\u3209\u320a\u320b\u320c\u320d\u320e\u320f\u3210\u3211\u3212\u3213\u3214\u3215\u3216\u3217\u3218\u3219\u321a\u321b\u321c\u321d\u321e\u322a\u322b\u322c\u322d\u322e\u322f\u3230\u3231\u3232\u3233\u3234\u3235\u3236\u3237\u3238\u3239\u323a\u323b\u323c\u323d\u323e\u323f\u3240\u3241\u3242\u3243\u3250\u3260\u3261\u3262\u3263\u3264\u3265\u3266\u3267\u3268\u3269\u326a\u326b\u326c\u326d\u326e\u326f\u3270\u3271\u3272\u3273\u3274\u3275\u3276\u3277\u3278\u3279\u327a\u327b\u327c\u327d\u327e\u327f\u328a\u328b\u328c\u328d\u328e\u328f\u3290\u3291\u3292\u3293\u3294\u3295\u3296\u3297\u3298\u3299\u329a\u329b\u329c\u329d\u329e\u329f\u32a0\u32a1\u32a2\u32a3\u32a4\u32a5\u32a6\u32a7\u32a8\u32a9\u32aa\u32ab\u32ac\u32ad\u32ae\u32af\u32b0\u32c0\u32c1\u32c2\u32c3\u32c4\u32c5\u32c6\u32c7\u32c8\u32c9\u32ca\u32cb\u32cc\u32cd\u32ce\u32cf\u32d0\u32d1\u32d2\u32d3\u32d4\u32d5\u32d6\u32d7\u32d8\u32d9\u32da\u32db\u32dc\u32dd\u32de\u32df\u32e0\u32e1\u32e2\u32e3\u32e4\u32e5\u32e6\u32e7\u32e8\u32e9\u32ea\u32eb\u32ec\u32ed\u32ee\u32ef\u32f0\u32f1\u32f2\u32f3\u32f4\u32f5\u32f6\u32f7\u32f8\u32f9\u32fa\u32fb\u32fc\u32fd\u32fe\u3300\u3301\u3302\u3303\u3304\u3305\u3306\u3307\u3308\u3309\u330a\u330b\u330c\u330d\u330e\u330f\u3310\u3311\u3312\u3313\u3314\u3315\u3316\u3317\u3318\u3319\u331a\u331b\u331c\u331d\u331e\u331f\u3320\u3321\u3322\u3323\u3324\u3325\u3326\u3327\u3328\u3329\u332a\u332b\u332c\u332d\u332e\u332f\u3330\u3331\u3332\u3333\u3334\u3335\u3336\u3337\u3338\u3339\u333a\u333b\u333c\u333d\u333e\u333f\u3340\u3341\u3342\u3343\u3344\u3345\u3346\u3347\u3348\u3349\u334a\u334b\u334c\u334d\u334e\u334f\u3350\u3351\u3352\u3353\u3354\u3355\u3356\u3357\u3358\u3359\u335a\u335b\u335c\u335d\u335e\u335f\u3360\u3361\u3362\u3363\u3364\u3365\u3366\u3367\u3368\u3369\u336a\u336b\u336c\u336d\u336e\u336f\u3370\u3371\u3372\u3373\u3374\u3375\u3376\u3377\u3378\u3379\u337a\u337b\u337c\u337d\u337e\u337f\u3380\u3381\u3382\u3383\u3384\u3385\u3386\u3387\u3388\u3389\u338a\u338b\u338c\u338d\u338e\u338f\u3390\u3391\u3392\u3393\u3394\u3395\u3396\u3397\u3398\u3399\u339a\u339b\u339c\u339d\u339e\u339f\u33a0\u33a1\u33a2\u33a3\u33a4\u33a5\u33a6\u33a7\u33a8\u33a9\u33aa\u33ab\u33ac\u33ad\u33ae\u33af\u33b0\u33b1\u33b2\u33b3\u33b4\u33b5\u33b6\u33b7\u33b8\u33b9\u33ba\u33bb\u33bc\u33bd\u33be\u33bf\u33c0\u33c1\u33c2\u33c3\u33c4\u33c5\u33c6\u33c7\u33c8\u33c9\u33ca\u33cb\u33cc\u33cd\u33ce\u33cf\u33d0\u33d1\u33d2\u33d3\u33d4\u33d5\u33d6\u33d7\u33d8\u33d9\u33da\u33db\u33dc\u33dd\u33de\u33df\u33e0\u33e1\u33e2\u33e3\u33e4\u33e5\u33e6\u33e7\u33e8\u33e9\u33ea\u33eb\u33ec\u33ed\u33ee\u33ef\u33f0\u33f1\u33f2\u33f3\u33f4\u33f5\u33f6\u33f7\u33f8\u33f9\u33fa\u33fb\u33fc\u33fd\u33fe\u33ff\u4dc0\u4dc1\u4dc2\u4dc3\u4dc4\u4dc5\u4dc6\u4dc7\u4dc8\u4dc9\u4dca\u4dcb\u4dcc\u4dcd\u4dce\u4dcf\u4dd0\u4dd1\u4dd2\u4dd3\u4dd4\u4dd5\u4dd6\u4dd7\u4dd8\u4dd9\u4dda\u4ddb\u4ddc\u4ddd\u4dde\u4ddf\u4de0\u4de1\u4de2\u4de3\u4de4\u4de5\u4de6\u4de7\u4de8\u4de9\u4dea\u4deb\u4dec\u4ded\u4dee\u4def\u4df0\u4df1\u4df2\u4df3\u4df4\u4df5\u4df6\u4df7\u4df8\u4df9\u4dfa\u4dfb\u4dfc\u4dfd\u4dfe\u4dff\ua490\ua491\ua492\ua493\ua494\ua495\ua496\ua497\ua498\ua499\ua49a\ua49b\ua49c\ua49d\ua49e\ua49f\ua4a0\ua4a1\ua4a2\ua4a3\ua4a4\ua4a5\ua4a6\ua4a7\ua4a8\ua4a9\ua4aa\ua4ab\ua4ac\ua4ad\ua4ae\ua4af\ua4b0\ua4b1\ua4b2\ua4b3\ua4b4\ua4b5\ua4b6\ua4b7\ua4b8\ua4b9\ua4ba\ua4bb\ua4bc\ua4bd\ua4be\ua4bf\ua4c0\ua4c1\ua4c2\ua4c3\ua4c4\ua4c5\ua4c6\ua828\ua829\ua82a\ua82b\ufdfd\uffe4\uffe8\uffed\uffee\ufffc\ufffd' +So = '\xa6\xa7\xa9\xae\xb0\xb6\u0482\u060e\u060f\u06e9\u06fd\u06fe\u09fa\u0b70\u0bf3\u0bf4\u0bf5\u0bf6\u0bf7\u0bf8\u0bfa\u0f01\u0f02\u0f03\u0f13\u0f14\u0f15\u0f16\u0f17\u0f1a\u0f1b\u0f1c\u0f1d\u0f1e\u0f1f\u0f34\u0f36\u0f38\u0fbe\u0fbf\u0fc0\u0fc1\u0fc2\u0fc3\u0fc4\u0fc5\u0fc7\u0fc8\u0fc9\u0fca\u0fcb\u0fcc\u0fcf\u1360\u1390\u1391\u1392\u1393\u1394\u1395\u1396\u1397\u1398\u1399\u1940\u19e0\u19e1\u19e2\u19e3\u19e4\u19e5\u19e6\u19e7\u19e8\u19e9\u19ea\u19eb\u19ec\u19ed\u19ee\u19ef\u19f0\u19f1\u19f2\u19f3\u19f4\u19f5\u19f6\u19f7\u19f8\u19f9\u19fa\u19fb\u19fc\u19fd\u19fe\u19ff\u2100\u2101\u2103\u2104\u2105\u2106\u2108\u2109\u2114\u2116\u2117\u2118\u211e\u211f\u2120\u2121\u2122\u2123\u2125\u2127\u2129\u212e\u2132\u213a\u213b\u214a\u214c\u2195\u2196\u2197\u2198\u2199\u219c\u219d\u219e\u219f\u21a1\u21a2\u21a4\u21a5\u21a7\u21a8\u21a9\u21aa\u21ab\u21ac\u21ad\u21af\u21b0\u21b1\u21b2\u21b3\u21b4\u21b5\u21b6\u21b7\u21b8\u21b9\u21ba\u21bb\u21bc\u21bd\u21be\u21bf\u21c0\u21c1\u21c2\u21c3\u21c4\u21c5\u21c6\u21c7\u21c8\u21c9\u21ca\u21cb\u21cc\u21cd\u21d0\u21d1\u21d3\u21d5\u21d6\u21d7\u21d8\u21d9\u21da\u21db\u21dc\u21dd\u21de\u21df\u21e0\u21e1\u21e2\u21e3\u21e4\u21e5\u21e6\u21e7\u21e8\u21e9\u21ea\u21eb\u21ec\u21ed\u21ee\u21ef\u21f0\u21f1\u21f2\u21f3\u2300\u2301\u2302\u2303\u2304\u2305\u2306\u2307\u230c\u230d\u230e\u230f\u2310\u2311\u2312\u2313\u2314\u2315\u2316\u2317\u2318\u2319\u231a\u231b\u231c\u231d\u231e\u231f\u2322\u2323\u2324\u2325\u2326\u2327\u2328\u232b\u232c\u232d\u232e\u232f\u2330\u2331\u2332\u2333\u2334\u2335\u2336\u2337\u2338\u2339\u233a\u233b\u233c\u233d\u233e\u233f\u2340\u2341\u2342\u2343\u2344\u2345\u2346\u2347\u2348\u2349\u234a\u234b\u234c\u234d\u234e\u234f\u2350\u2351\u2352\u2353\u2354\u2355\u2356\u2357\u2358\u2359\u235a\u235b\u235c\u235d\u235e\u235f\u2360\u2361\u2362\u2363\u2364\u2365\u2366\u2367\u2368\u2369\u236a\u236b\u236c\u236d\u236e\u236f\u2370\u2371\u2372\u2373\u2374\u2375\u2376\u2377\u2378\u2379\u237a\u237b\u237d\u237e\u237f\u2380\u2381\u2382\u2383\u2384\u2385\u2386\u2387\u2388\u2389\u238a\u238b\u238c\u238d\u238e\u238f\u2390\u2391\u2392\u2393\u2394\u2395\u2396\u2397\u2398\u2399\u239a\u23b7\u23b8\u23b9\u23ba\u23bb\u23bc\u23bd\u23be\u23bf\u23c0\u23c1\u23c2\u23c3\u23c4\u23c5\u23c6\u23c7\u23c8\u23c9\u23ca\u23cb\u23cc\u23cd\u23ce\u23cf\u23d0\u23d1\u23d2\u23d3\u23d4\u23d5\u23d6\u23d7\u23d8\u23d9\u23da\u23db\u2400\u2401\u2402\u2403\u2404\u2405\u2406\u2407\u2408\u2409\u240a\u240b\u240c\u240d\u240e\u240f\u2410\u2411\u2412\u2413\u2414\u2415\u2416\u2417\u2418\u2419\u241a\u241b\u241c\u241d\u241e\u241f\u2420\u2421\u2422\u2423\u2424\u2425\u2426\u2440\u2441\u2442\u2443\u2444\u2445\u2446\u2447\u2448\u2449\u244a\u249c\u249d\u249e\u249f\u24a0\u24a1\u24a2\u24a3\u24a4\u24a5\u24a6\u24a7\u24a8\u24a9\u24aa\u24ab\u24ac\u24ad\u24ae\u24af\u24b0\u24b1\u24b2\u24b3\u24b4\u24b5\u24b6\u24b7\u24b8\u24b9\u24ba\u24bb\u24bc\u24bd\u24be\u24bf\u24c0\u24c1\u24c2\u24c3\u24c4\u24c5\u24c6\u24c7\u24c8\u24c9\u24ca\u24cb\u24cc\u24cd\u24ce\u24cf\u24d0\u24d1\u24d2\u24d3\u24d4\u24d5\u24d6\u24d7\u24d8\u24d9\u24da\u24db\u24dc\u24dd\u24de\u24df\u24e0\u24e1\u24e2\u24e3\u24e4\u24e5\u24e6\u24e7\u24e8\u24e9\u2500\u2501\u2502\u2503\u2504\u2505\u2506\u2507\u2508\u2509\u250a\u250b\u250c\u250d\u250e\u250f\u2510\u2511\u2512\u2513\u2514\u2515\u2516\u2517\u2518\u2519\u251a\u251b\u251c\u251d\u251e\u251f\u2520\u2521\u2522\u2523\u2524\u2525\u2526\u2527\u2528\u2529\u252a\u252b\u252c\u252d\u252e\u252f\u2530\u2531\u2532\u2533\u2534\u2535\u2536\u2537\u2538\u2539\u253a\u253b\u253c\u253d\u253e\u253f\u2540\u2541\u2542\u2543\u2544\u2545\u2546\u2547\u2548\u2549\u254a\u254b\u254c\u254d\u254e\u254f\u2550\u2551\u2552\u2553\u2554\u2555\u2556\u2557\u2558\u2559\u255a\u255b\u255c\u255d\u255e\u255f\u2560\u2561\u2562\u2563\u2564\u2565\u2566\u2567\u2568\u2569\u256a\u256b\u256c\u256d\u256e\u256f\u2570\u2571\u2572\u2573\u2574\u2575\u2576\u2577\u2578\u2579\u257a\u257b\u257c\u257d\u257e\u257f\u2580\u2581\u2582\u2583\u2584\u2585\u2586\u2587\u2588\u2589\u258a\u258b\u258c\u258d\u258e\u258f\u2590\u2591\u2592\u2593\u2594\u2595\u2596\u2597\u2598\u2599\u259a\u259b\u259c\u259d\u259e\u259f\u25a0\u25a1\u25a2\u25a3\u25a4\u25a5\u25a6\u25a7\u25a8\u25a9\u25aa\u25ab\u25ac\u25ad\u25ae\u25af\u25b0\u25b1\u25b2\u25b3\u25b4\u25b5\u25b6\u25b8\u25b9\u25ba\u25bb\u25bc\u25bd\u25be\u25bf\u25c0\u25c2\u25c3\u25c4\u25c5\u25c6\u25c7\u25c8\u25c9\u25ca\u25cb\u25cc\u25cd\u25ce\u25cf\u25d0\u25d1\u25d2\u25d3\u25d4\u25d5\u25d6\u25d7\u25d8\u25d9\u25da\u25db\u25dc\u25dd\u25de\u25df\u25e0\u25e1\u25e2\u25e3\u25e4\u25e5\u25e6\u25e7\u25e8\u25e9\u25ea\u25eb\u25ec\u25ed\u25ee\u25ef\u25f0\u25f1\u25f2\u25f3\u25f4\u25f5\u25f6\u25f7\u2600\u2601\u2602\u2603\u2604\u2605\u2606\u2607\u2608\u2609\u260a\u260b\u260c\u260d\u260e\u260f\u2610\u2611\u2612\u2613\u2614\u2615\u2616\u2617\u2618\u2619\u261a\u261b\u261c\u261d\u261e\u261f\u2620\u2621\u2622\u2623\u2624\u2625\u2626\u2627\u2628\u2629\u262a\u262b\u262c\u262d\u262e\u262f\u2630\u2631\u2632\u2633\u2634\u2635\u2636\u2637\u2638\u2639\u263a\u263b\u263c\u263d\u263e\u263f\u2640\u2641\u2642\u2643\u2644\u2645\u2646\u2647\u2648\u2649\u264a\u264b\u264c\u264d\u264e\u264f\u2650\u2651\u2652\u2653\u2654\u2655\u2656\u2657\u2658\u2659\u265a\u265b\u265c\u265d\u265e\u265f\u2660\u2661\u2662\u2663\u2664\u2665\u2666\u2667\u2668\u2669\u266a\u266b\u266c\u266d\u266e\u2670\u2671\u2672\u2673\u2674\u2675\u2676\u2677\u2678\u2679\u267a\u267b\u267c\u267d\u267e\u267f\u2680\u2681\u2682\u2683\u2684\u2685\u2686\u2687\u2688\u2689\u268a\u268b\u268c\u268d\u268e\u268f\u2690\u2691\u2692\u2693\u2694\u2695\u2696\u2697\u2698\u2699\u269a\u269b\u269c\u26a0\u26a1\u26a2\u26a3\u26a4\u26a5\u26a6\u26a7\u26a8\u26a9\u26aa\u26ab\u26ac\u26ad\u26ae\u26af\u26b0\u26b1\u2701\u2702\u2703\u2704\u2706\u2707\u2708\u2709\u270c\u270d\u270e\u270f\u2710\u2711\u2712\u2713\u2714\u2715\u2716\u2717\u2718\u2719\u271a\u271b\u271c\u271d\u271e\u271f\u2720\u2721\u2722\u2723\u2724\u2725\u2726\u2727\u2729\u272a\u272b\u272c\u272d\u272e\u272f\u2730\u2731\u2732\u2733\u2734\u2735\u2736\u2737\u2738\u2739\u273a\u273b\u273c\u273d\u273e\u273f\u2740\u2741\u2742\u2743\u2744\u2745\u2746\u2747\u2748\u2749\u274a\u274b\u274d\u274f\u2750\u2751\u2752\u2756\u2758\u2759\u275a\u275b\u275c\u275d\u275e\u2761\u2762\u2763\u2764\u2765\u2766\u2767\u2794\u2798\u2799\u279a\u279b\u279c\u279d\u279e\u279f\u27a0\u27a1\u27a2\u27a3\u27a4\u27a5\u27a6\u27a7\u27a8\u27a9\u27aa\u27ab\u27ac\u27ad\u27ae\u27af\u27b1\u27b2\u27b3\u27b4\u27b5\u27b6\u27b7\u27b8\u27b9\u27ba\u27bb\u27bc\u27bd\u27be\u2800\u2801\u2802\u2803\u2804\u2805\u2806\u2807\u2808\u2809\u280a\u280b\u280c\u280d\u280e\u280f\u2810\u2811\u2812\u2813\u2814\u2815\u2816\u2817\u2818\u2819\u281a\u281b\u281c\u281d\u281e\u281f\u2820\u2821\u2822\u2823\u2824\u2825\u2826\u2827\u2828\u2829\u282a\u282b\u282c\u282d\u282e\u282f\u2830\u2831\u2832\u2833\u2834\u2835\u2836\u2837\u2838\u2839\u283a\u283b\u283c\u283d\u283e\u283f\u2840\u2841\u2842\u2843\u2844\u2845\u2846\u2847\u2848\u2849\u284a\u284b\u284c\u284d\u284e\u284f\u2850\u2851\u2852\u2853\u2854\u2855\u2856\u2857\u2858\u2859\u285a\u285b\u285c\u285d\u285e\u285f\u2860\u2861\u2862\u2863\u2864\u2865\u2866\u2867\u2868\u2869\u286a\u286b\u286c\u286d\u286e\u286f\u2870\u2871\u2872\u2873\u2874\u2875\u2876\u2877\u2878\u2879\u287a\u287b\u287c\u287d\u287e\u287f\u2880\u2881\u2882\u2883\u2884\u2885\u2886\u2887\u2888\u2889\u288a\u288b\u288c\u288d\u288e\u288f\u2890\u2891\u2892\u2893\u2894\u2895\u2896\u2897\u2898\u2899\u289a\u289b\u289c\u289d\u289e\u289f\u28a0\u28a1\u28a2\u28a3\u28a4\u28a5\u28a6\u28a7\u28a8\u28a9\u28aa\u28ab\u28ac\u28ad\u28ae\u28af\u28b0\u28b1\u28b2\u28b3\u28b4\u28b5\u28b6\u28b7\u28b8\u28b9\u28ba\u28bb\u28bc\u28bd\u28be\u28bf\u28c0\u28c1\u28c2\u28c3\u28c4\u28c5\u28c6\u28c7\u28c8\u28c9\u28ca\u28cb\u28cc\u28cd\u28ce\u28cf\u28d0\u28d1\u28d2\u28d3\u28d4\u28d5\u28d6\u28d7\u28d8\u28d9\u28da\u28db\u28dc\u28dd\u28de\u28df\u28e0\u28e1\u28e2\u28e3\u28e4\u28e5\u28e6\u28e7\u28e8\u28e9\u28ea\u28eb\u28ec\u28ed\u28ee\u28ef\u28f0\u28f1\u28f2\u28f3\u28f4\u28f5\u28f6\u28f7\u28f8\u28f9\u28fa\u28fb\u28fc\u28fd\u28fe\u28ff\u2b00\u2b01\u2b02\u2b03\u2b04\u2b05\u2b06\u2b07\u2b08\u2b09\u2b0a\u2b0b\u2b0c\u2b0d\u2b0e\u2b0f\u2b10\u2b11\u2b12\u2b13\u2ce5\u2ce6\u2ce7\u2ce8\u2ce9\u2cea\u2e80\u2e81\u2e82\u2e83\u2e84\u2e85\u2e86\u2e87\u2e88\u2e89\u2e8a\u2e8b\u2e8c\u2e8d\u2e8e\u2e8f\u2e90\u2e91\u2e92\u2e93\u2e94\u2e95\u2e96\u2e97\u2e98\u2e99\u2e9b\u2e9c\u2e9d\u2e9e\u2e9f\u2ea0\u2ea1\u2ea2\u2ea3\u2ea4\u2ea5\u2ea6\u2ea7\u2ea8\u2ea9\u2eaa\u2eab\u2eac\u2ead\u2eae\u2eaf\u2eb0\u2eb1\u2eb2\u2eb3\u2eb4\u2eb5\u2eb6\u2eb7\u2eb8\u2eb9\u2eba\u2ebb\u2ebc\u2ebd\u2ebe\u2ebf\u2ec0\u2ec1\u2ec2\u2ec3\u2ec4\u2ec5\u2ec6\u2ec7\u2ec8\u2ec9\u2eca\u2ecb\u2ecc\u2ecd\u2ece\u2ecf\u2ed0\u2ed1\u2ed2\u2ed3\u2ed4\u2ed5\u2ed6\u2ed7\u2ed8\u2ed9\u2eda\u2edb\u2edc\u2edd\u2ede\u2edf\u2ee0\u2ee1\u2ee2\u2ee3\u2ee4\u2ee5\u2ee6\u2ee7\u2ee8\u2ee9\u2eea\u2eeb\u2eec\u2eed\u2eee\u2eef\u2ef0\u2ef1\u2ef2\u2ef3\u2f00\u2f01\u2f02\u2f03\u2f04\u2f05\u2f06\u2f07\u2f08\u2f09\u2f0a\u2f0b\u2f0c\u2f0d\u2f0e\u2f0f\u2f10\u2f11\u2f12\u2f13\u2f14\u2f15\u2f16\u2f17\u2f18\u2f19\u2f1a\u2f1b\u2f1c\u2f1d\u2f1e\u2f1f\u2f20\u2f21\u2f22\u2f23\u2f24\u2f25\u2f26\u2f27\u2f28\u2f29\u2f2a\u2f2b\u2f2c\u2f2d\u2f2e\u2f2f\u2f30\u2f31\u2f32\u2f33\u2f34\u2f35\u2f36\u2f37\u2f38\u2f39\u2f3a\u2f3b\u2f3c\u2f3d\u2f3e\u2f3f\u2f40\u2f41\u2f42\u2f43\u2f44\u2f45\u2f46\u2f47\u2f48\u2f49\u2f4a\u2f4b\u2f4c\u2f4d\u2f4e\u2f4f\u2f50\u2f51\u2f52\u2f53\u2f54\u2f55\u2f56\u2f57\u2f58\u2f59\u2f5a\u2f5b\u2f5c\u2f5d\u2f5e\u2f5f\u2f60\u2f61\u2f62\u2f63\u2f64\u2f65\u2f66\u2f67\u2f68\u2f69\u2f6a\u2f6b\u2f6c\u2f6d\u2f6e\u2f6f\u2f70\u2f71\u2f72\u2f73\u2f74\u2f75\u2f76\u2f77\u2f78\u2f79\u2f7a\u2f7b\u2f7c\u2f7d\u2f7e\u2f7f\u2f80\u2f81\u2f82\u2f83\u2f84\u2f85\u2f86\u2f87\u2f88\u2f89\u2f8a\u2f8b\u2f8c\u2f8d\u2f8e\u2f8f\u2f90\u2f91\u2f92\u2f93\u2f94\u2f95\u2f96\u2f97\u2f98\u2f99\u2f9a\u2f9b\u2f9c\u2f9d\u2f9e\u2f9f\u2fa0\u2fa1\u2fa2\u2fa3\u2fa4\u2fa5\u2fa6\u2fa7\u2fa8\u2fa9\u2faa\u2fab\u2fac\u2fad\u2fae\u2faf\u2fb0\u2fb1\u2fb2\u2fb3\u2fb4\u2fb5\u2fb6\u2fb7\u2fb8\u2fb9\u2fba\u2fbb\u2fbc\u2fbd\u2fbe\u2fbf\u2fc0\u2fc1\u2fc2\u2fc3\u2fc4\u2fc5\u2fc6\u2fc7\u2fc8\u2fc9\u2fca\u2fcb\u2fcc\u2fcd\u2fce\u2fcf\u2fd0\u2fd1\u2fd2\u2fd3\u2fd4\u2fd5\u2ff0\u2ff1\u2ff2\u2ff3\u2ff4\u2ff5\u2ff6\u2ff7\u2ff8\u2ff9\u2ffa\u2ffb\u3004\u3012\u3013\u3020\u3036\u3037\u303e\u303f\u3190\u3191\u3196\u3197\u3198\u3199\u319a\u319b\u319c\u319d\u319e\u319f\u31c0\u31c1\u31c2\u31c3\u31c4\u31c5\u31c6\u31c7\u31c8\u31c9\u31ca\u31cb\u31cc\u31cd\u31ce\u31cf\u3200\u3201\u3202\u3203\u3204\u3205\u3206\u3207\u3208\u3209\u320a\u320b\u320c\u320d\u320e\u320f\u3210\u3211\u3212\u3213\u3214\u3215\u3216\u3217\u3218\u3219\u321a\u321b\u321c\u321d\u321e\u322a\u322b\u322c\u322d\u322e\u322f\u3230\u3231\u3232\u3233\u3234\u3235\u3236\u3237\u3238\u3239\u323a\u323b\u323c\u323d\u323e\u323f\u3240\u3241\u3242\u3243\u3250\u3260\u3261\u3262\u3263\u3264\u3265\u3266\u3267\u3268\u3269\u326a\u326b\u326c\u326d\u326e\u326f\u3270\u3271\u3272\u3273\u3274\u3275\u3276\u3277\u3278\u3279\u327a\u327b\u327c\u327d\u327e\u327f\u328a\u328b\u328c\u328d\u328e\u328f\u3290\u3291\u3292\u3293\u3294\u3295\u3296\u3297\u3298\u3299\u329a\u329b\u329c\u329d\u329e\u329f\u32a0\u32a1\u32a2\u32a3\u32a4\u32a5\u32a6\u32a7\u32a8\u32a9\u32aa\u32ab\u32ac\u32ad\u32ae\u32af\u32b0\u32c0\u32c1\u32c2\u32c3\u32c4\u32c5\u32c6\u32c7\u32c8\u32c9\u32ca\u32cb\u32cc\u32cd\u32ce\u32cf\u32d0\u32d1\u32d2\u32d3\u32d4\u32d5\u32d6\u32d7\u32d8\u32d9\u32da\u32db\u32dc\u32dd\u32de\u32df\u32e0\u32e1\u32e2\u32e3\u32e4\u32e5\u32e6\u32e7\u32e8\u32e9\u32ea\u32eb\u32ec\u32ed\u32ee\u32ef\u32f0\u32f1\u32f2\u32f3\u32f4\u32f5\u32f6\u32f7\u32f8\u32f9\u32fa\u32fb\u32fc\u32fd\u32fe\u3300\u3301\u3302\u3303\u3304\u3305\u3306\u3307\u3308\u3309\u330a\u330b\u330c\u330d\u330e\u330f\u3310\u3311\u3312\u3313\u3314\u3315\u3316\u3317\u3318\u3319\u331a\u331b\u331c\u331d\u331e\u331f\u3320\u3321\u3322\u3323\u3324\u3325\u3326\u3327\u3328\u3329\u332a\u332b\u332c\u332d\u332e\u332f\u3330\u3331\u3332\u3333\u3334\u3335\u3336\u3337\u3338\u3339\u333a\u333b\u333c\u333d\u333e\u333f\u3340\u3341\u3342\u3343\u3344\u3345\u3346\u3347\u3348\u3349\u334a\u334b\u334c\u334d\u334e\u334f\u3350\u3351\u3352\u3353\u3354\u3355\u3356\u3357\u3358\u3359\u335a\u335b\u335c\u335d\u335e\u335f\u3360\u3361\u3362\u3363\u3364\u3365\u3366\u3367\u3368\u3369\u336a\u336b\u336c\u336d\u336e\u336f\u3370\u3371\u3372\u3373\u3374\u3375\u3376\u3377\u3378\u3379\u337a\u337b\u337c\u337d\u337e\u337f\u3380\u3381\u3382\u3383\u3384\u3385\u3386\u3387\u3388\u3389\u338a\u338b\u338c\u338d\u338e\u338f\u3390\u3391\u3392\u3393\u3394\u3395\u3396\u3397\u3398\u3399\u339a\u339b\u339c\u339d\u339e\u339f\u33a0\u33a1\u33a2\u33a3\u33a4\u33a5\u33a6\u33a7\u33a8\u33a9\u33aa\u33ab\u33ac\u33ad\u33ae\u33af\u33b0\u33b1\u33b2\u33b3\u33b4\u33b5\u33b6\u33b7\u33b8\u33b9\u33ba\u33bb\u33bc\u33bd\u33be\u33bf\u33c0\u33c1\u33c2\u33c3\u33c4\u33c5\u33c6\u33c7\u33c8\u33c9\u33ca\u33cb\u33cc\u33cd\u33ce\u33cf\u33d0\u33d1\u33d2\u33d3\u33d4\u33d5\u33d6\u33d7\u33d8\u33d9\u33da\u33db\u33dc\u33dd\u33de\u33df\u33e0\u33e1\u33e2\u33e3\u33e4\u33e5\u33e6\u33e7\u33e8\u33e9\u33ea\u33eb\u33ec\u33ed\u33ee\u33ef\u33f0\u33f1\u33f2\u33f3\u33f4\u33f5\u33f6\u33f7\u33f8\u33f9\u33fa\u33fb\u33fc\u33fd\u33fe\u33ff\u4dc0\u4dc1\u4dc2\u4dc3\u4dc4\u4dc5\u4dc6\u4dc7\u4dc8\u4dc9\u4dca\u4dcb\u4dcc\u4dcd\u4dce\u4dcf\u4dd0\u4dd1\u4dd2\u4dd3\u4dd4\u4dd5\u4dd6\u4dd7\u4dd8\u4dd9\u4dda\u4ddb\u4ddc\u4ddd\u4dde\u4ddf\u4de0\u4de1\u4de2\u4de3\u4de4\u4de5\u4de6\u4de7\u4de8\u4de9\u4dea\u4deb\u4dec\u4ded\u4dee\u4def\u4df0\u4df1\u4df2\u4df3\u4df4\u4df5\u4df6\u4df7\u4df8\u4df9\u4dfa\u4dfb\u4dfc\u4dfd\u4dfe\u4dff\ua490\ua491\ua492\ua493\ua494\ua495\ua496\ua497\ua498\ua499\ua49a\ua49b\ua49c\ua49d\ua49e\ua49f\ua4a0\ua4a1\ua4a2\ua4a3\ua4a4\ua4a5\ua4a6\ua4a7\ua4a8\ua4a9\ua4aa\ua4ab\ua4ac\ua4ad\ua4ae\ua4af\ua4b0\ua4b1\ua4b2\ua4b3\ua4b4\ua4b5\ua4b6\ua4b7\ua4b8\ua4b9\ua4ba\ua4bb\ua4bc\ua4bd\ua4be\ua4bf\ua4c0\ua4c1\ua4c2\ua4c3\ua4c4\ua4c5\ua4c6\ua828\ua829\ua82a\ua82b\ufdfd\uffe4\uffe8\uffed\uffee\ufffc\ufffd' -Zl = u'\u2028' +Zl = '\u2028' -Zp = u'\u2029' +Zp = '\u2029' -Zs = u' \xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000' +Zs = ' \xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000' cats = ['Cc', 'Cf', 'Cn', 'Co', 'Cs', 'Ll', 'Lm', 'Lo', 'Lt', 'Lu', 'Mc', 'Me', 'Mn', 'Nd', 'Nl', 'No', 'Pc', 'Pd', 'Pe', 'Pf', 'Pi', 'Po', 'Ps', 'Sc', 'Sk', 'Sm', 'So', 'Zl', 'Zp', 'Zs'] def combine(*args): - return u''.join([globals()[cat] for cat in args]) + return ''.join([globals()[cat] for cat in args]) -xid_start = u'\u0041-\u005A\u005F\u0061-\u007A\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u01BA\u01BB\u01BC-\u01BF\u01C0-\u01C3\u01C4-\u0241\u0250-\u02AF\u02B0-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EE\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03CE\u03D0-\u03F5\u03F7-\u0481\u048A-\u04CE\u04D0-\u04F9\u0500-\u050F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0621-\u063A\u0640\u0641-\u064A\u066E-\u066F\u0671-\u06D3\u06D5\u06E5-\u06E6\u06EE-\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u076D\u0780-\u07A5\u07B1\u0904-\u0939\u093D\u0950\u0958-\u0961\u097D\u0985-\u098C\u098F-\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC-\u09DD\u09DF-\u09E1\u09F0-\u09F1\u0A05-\u0A0A\u0A0F-\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32-\u0A33\u0A35-\u0A36\u0A38-\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2-\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0-\u0AE1\u0B05-\u0B0C\u0B0F-\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32-\u0B33\u0B35-\u0B39\u0B3D\u0B5C-\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99-\u0B9A\u0B9C\u0B9E-\u0B9F\u0BA3-\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C60-\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0-\u0CE1\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D28\u0D2A-\u0D39\u0D60-\u0D61\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E40-\u0E45\u0E46\u0E81-\u0E82\u0E84\u0E87-\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA-\u0EAB\u0EAD-\u0EB0\u0EB2\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDD\u0F00\u0F40-\u0F47\u0F49-\u0F6A\u0F88-\u0F8B\u1000-\u1021\u1023-\u1027\u1029-\u102A\u1050-\u1055\u10A0-\u10C5\u10D0-\u10FA\u10FC\u1100-\u1159\u115F-\u11A2\u11A8-\u11F9\u1200-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C\u166F-\u1676\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F0\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1842\u1843\u1844-\u1877\u1880-\u18A8\u1900-\u191C\u1950-\u196D\u1970-\u1974\u1980-\u19A9\u19C1-\u19C7\u1A00-\u1A16\u1D00-\u1D2B\u1D2C-\u1D61\u1D62-\u1D77\u1D78\u1D79-\u1D9A\u1D9B-\u1DBF\u1E00-\u1E9B\u1EA0-\u1EF9\u1F00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u2094\u2102\u2107\u210A-\u2113\u2115\u2118\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212E\u212F-\u2131\u2133-\u2134\u2135-\u2138\u2139\u213C-\u213F\u2145-\u2149\u2160-\u2183\u2C00-\u2C2E\u2C30-\u2C5E\u2C80-\u2CE4\u2D00-\u2D25\u2D30-\u2D65\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u3005\u3006\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303A\u303B\u303C\u3041-\u3096\u309D-\u309E\u309F\u30A1-\u30FA\u30FC-\u30FE\u30FF\u3105-\u312C\u3131-\u318E\u31A0-\u31B7\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FBB\uA000-\uA014\uA015\uA016-\uA48C\uA800-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uAC00-\uD7A3\uF900-\uFA2D\uFA30-\uFA6A\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40-\uFB41\uFB43-\uFB44\uFB46-\uFBB1\uFBD3-\uFC5D\uFC64-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDF9\uFE71\uFE73\uFE77\uFE79\uFE7B\uFE7D\uFE7F-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFF6F\uFF70\uFF71-\uFF9D\uFFA0-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC' +xid_start = '\u0041-\u005A\u005F\u0061-\u007A\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u01BA\u01BB\u01BC-\u01BF\u01C0-\u01C3\u01C4-\u0241\u0250-\u02AF\u02B0-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EE\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03CE\u03D0-\u03F5\u03F7-\u0481\u048A-\u04CE\u04D0-\u04F9\u0500-\u050F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0621-\u063A\u0640\u0641-\u064A\u066E-\u066F\u0671-\u06D3\u06D5\u06E5-\u06E6\u06EE-\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u076D\u0780-\u07A5\u07B1\u0904-\u0939\u093D\u0950\u0958-\u0961\u097D\u0985-\u098C\u098F-\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC-\u09DD\u09DF-\u09E1\u09F0-\u09F1\u0A05-\u0A0A\u0A0F-\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32-\u0A33\u0A35-\u0A36\u0A38-\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2-\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0-\u0AE1\u0B05-\u0B0C\u0B0F-\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32-\u0B33\u0B35-\u0B39\u0B3D\u0B5C-\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99-\u0B9A\u0B9C\u0B9E-\u0B9F\u0BA3-\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C60-\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0-\u0CE1\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D28\u0D2A-\u0D39\u0D60-\u0D61\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E40-\u0E45\u0E46\u0E81-\u0E82\u0E84\u0E87-\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA-\u0EAB\u0EAD-\u0EB0\u0EB2\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDD\u0F00\u0F40-\u0F47\u0F49-\u0F6A\u0F88-\u0F8B\u1000-\u1021\u1023-\u1027\u1029-\u102A\u1050-\u1055\u10A0-\u10C5\u10D0-\u10FA\u10FC\u1100-\u1159\u115F-\u11A2\u11A8-\u11F9\u1200-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C\u166F-\u1676\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F0\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1842\u1843\u1844-\u1877\u1880-\u18A8\u1900-\u191C\u1950-\u196D\u1970-\u1974\u1980-\u19A9\u19C1-\u19C7\u1A00-\u1A16\u1D00-\u1D2B\u1D2C-\u1D61\u1D62-\u1D77\u1D78\u1D79-\u1D9A\u1D9B-\u1DBF\u1E00-\u1E9B\u1EA0-\u1EF9\u1F00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u2094\u2102\u2107\u210A-\u2113\u2115\u2118\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212E\u212F-\u2131\u2133-\u2134\u2135-\u2138\u2139\u213C-\u213F\u2145-\u2149\u2160-\u2183\u2C00-\u2C2E\u2C30-\u2C5E\u2C80-\u2CE4\u2D00-\u2D25\u2D30-\u2D65\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u3005\u3006\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303A\u303B\u303C\u3041-\u3096\u309D-\u309E\u309F\u30A1-\u30FA\u30FC-\u30FE\u30FF\u3105-\u312C\u3131-\u318E\u31A0-\u31B7\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FBB\uA000-\uA014\uA015\uA016-\uA48C\uA800-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uAC00-\uD7A3\uF900-\uFA2D\uFA30-\uFA6A\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40-\uFB41\uFB43-\uFB44\uFB46-\uFBB1\uFBD3-\uFC5D\uFC64-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDF9\uFE71\uFE73\uFE77\uFE79\uFE7B\uFE7D\uFE7F-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFF6F\uFF70\uFF71-\uFF9D\uFFA0-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC' -xid_continue = u'\u0030-\u0039\u0041-\u005A\u005F\u0061-\u007A\u00AA\u00B5\u00B7\u00BA\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u01BA\u01BB\u01BC-\u01BF\u01C0-\u01C3\u01C4-\u0241\u0250-\u02AF\u02B0-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EE\u0300-\u036F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03CE\u03D0-\u03F5\u03F7-\u0481\u0483-\u0486\u048A-\u04CE\u04D0-\u04F9\u0500-\u050F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05B9\u05BB-\u05BD\u05BF\u05C1-\u05C2\u05C4-\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u0615\u0621-\u063A\u0640\u0641-\u064A\u064B-\u065E\u0660-\u0669\u066E-\u066F\u0670\u0671-\u06D3\u06D5\u06D6-\u06DC\u06DF-\u06E4\u06E5-\u06E6\u06E7-\u06E8\u06EA-\u06ED\u06EE-\u06EF\u06F0-\u06F9\u06FA-\u06FC\u06FF\u0710\u0711\u0712-\u072F\u0730-\u074A\u074D-\u076D\u0780-\u07A5\u07A6-\u07B0\u07B1\u0901-\u0902\u0903\u0904-\u0939\u093C\u093D\u093E-\u0940\u0941-\u0948\u0949-\u094C\u094D\u0950\u0951-\u0954\u0958-\u0961\u0962-\u0963\u0966-\u096F\u097D\u0981\u0982-\u0983\u0985-\u098C\u098F-\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC\u09BD\u09BE-\u09C0\u09C1-\u09C4\u09C7-\u09C8\u09CB-\u09CC\u09CD\u09CE\u09D7\u09DC-\u09DD\u09DF-\u09E1\u09E2-\u09E3\u09E6-\u09EF\u09F0-\u09F1\u0A01-\u0A02\u0A03\u0A05-\u0A0A\u0A0F-\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32-\u0A33\u0A35-\u0A36\u0A38-\u0A39\u0A3C\u0A3E-\u0A40\u0A41-\u0A42\u0A47-\u0A48\u0A4B-\u0A4D\u0A59-\u0A5C\u0A5E\u0A66-\u0A6F\u0A70-\u0A71\u0A72-\u0A74\u0A81-\u0A82\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2-\u0AB3\u0AB5-\u0AB9\u0ABC\u0ABD\u0ABE-\u0AC0\u0AC1-\u0AC5\u0AC7-\u0AC8\u0AC9\u0ACB-\u0ACC\u0ACD\u0AD0\u0AE0-\u0AE1\u0AE2-\u0AE3\u0AE6-\u0AEF\u0B01\u0B02-\u0B03\u0B05-\u0B0C\u0B0F-\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32-\u0B33\u0B35-\u0B39\u0B3C\u0B3D\u0B3E\u0B3F\u0B40\u0B41-\u0B43\u0B47-\u0B48\u0B4B-\u0B4C\u0B4D\u0B56\u0B57\u0B5C-\u0B5D\u0B5F-\u0B61\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99-\u0B9A\u0B9C\u0B9E-\u0B9F\u0BA3-\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BBF\u0BC0\u0BC1-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCC\u0BCD\u0BD7\u0BE6-\u0BEF\u0C01-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3E-\u0C40\u0C41-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55-\u0C56\u0C60-\u0C61\u0C66-\u0C6F\u0C82-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC\u0CBD\u0CBE\u0CBF\u0CC0-\u0CC4\u0CC6\u0CC7-\u0CC8\u0CCA-\u0CCB\u0CCC-\u0CCD\u0CD5-\u0CD6\u0CDE\u0CE0-\u0CE1\u0CE6-\u0CEF\u0D02-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D28\u0D2A-\u0D39\u0D3E-\u0D40\u0D41-\u0D43\u0D46-\u0D48\u0D4A-\u0D4C\u0D4D\u0D57\u0D60-\u0D61\u0D66-\u0D6F\u0D82-\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD1\u0DD2-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DF2-\u0DF3\u0E01-\u0E30\u0E31\u0E32-\u0E33\u0E34-\u0E3A\u0E40-\u0E45\u0E46\u0E47-\u0E4E\u0E50-\u0E59\u0E81-\u0E82\u0E84\u0E87-\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA-\u0EAB\u0EAD-\u0EB0\u0EB1\u0EB2-\u0EB3\u0EB4-\u0EB9\u0EBB-\u0EBC\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDD\u0F00\u0F18-\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F3F\u0F40-\u0F47\u0F49-\u0F6A\u0F71-\u0F7E\u0F7F\u0F80-\u0F84\u0F86-\u0F87\u0F88-\u0F8B\u0F90-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1021\u1023-\u1027\u1029-\u102A\u102C\u102D-\u1030\u1031\u1032\u1036-\u1037\u1038\u1039\u1040-\u1049\u1050-\u1055\u1056-\u1057\u1058-\u1059\u10A0-\u10C5\u10D0-\u10FA\u10FC\u1100-\u1159\u115F-\u11A2\u11A8-\u11F9\u1200-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135F\u1369-\u1371\u1380-\u138F\u13A0-\u13F4\u1401-\u166C\u166F-\u1676\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F0\u1700-\u170C\u170E-\u1711\u1712-\u1714\u1720-\u1731\u1732-\u1734\u1740-\u1751\u1752-\u1753\u1760-\u176C\u176E-\u1770\u1772-\u1773\u1780-\u17B3\u17B6\u17B7-\u17BD\u17BE-\u17C5\u17C6\u17C7-\u17C8\u17C9-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1842\u1843\u1844-\u1877\u1880-\u18A8\u18A9\u1900-\u191C\u1920-\u1922\u1923-\u1926\u1927-\u1928\u1929-\u192B\u1930-\u1931\u1932\u1933-\u1938\u1939-\u193B\u1946-\u194F\u1950-\u196D\u1970-\u1974\u1980-\u19A9\u19B0-\u19C0\u19C1-\u19C7\u19C8-\u19C9\u19D0-\u19D9\u1A00-\u1A16\u1A17-\u1A18\u1A19-\u1A1B\u1D00-\u1D2B\u1D2C-\u1D61\u1D62-\u1D77\u1D78\u1D79-\u1D9A\u1D9B-\u1DBF\u1DC0-\u1DC3\u1E00-\u1E9B\u1EA0-\u1EF9\u1F00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u203F-\u2040\u2054\u2071\u207F\u2090-\u2094\u20D0-\u20DC\u20E1\u20E5-\u20EB\u2102\u2107\u210A-\u2113\u2115\u2118\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212E\u212F-\u2131\u2133-\u2134\u2135-\u2138\u2139\u213C-\u213F\u2145-\u2149\u2160-\u2183\u2C00-\u2C2E\u2C30-\u2C5E\u2C80-\u2CE4\u2D00-\u2D25\u2D30-\u2D65\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u3005\u3006\u3007\u3021-\u3029\u302A-\u302F\u3031-\u3035\u3038-\u303A\u303B\u303C\u3041-\u3096\u3099-\u309A\u309D-\u309E\u309F\u30A1-\u30FA\u30FC-\u30FE\u30FF\u3105-\u312C\u3131-\u318E\u31A0-\u31B7\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FBB\uA000-\uA014\uA015\uA016-\uA48C\uA800-\uA801\uA802\uA803-\uA805\uA806\uA807-\uA80A\uA80B\uA80C-\uA822\uA823-\uA824\uA825-\uA826\uA827\uAC00-\uD7A3\uF900-\uFA2D\uFA30-\uFA6A\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1E\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40-\uFB41\uFB43-\uFB44\uFB46-\uFBB1\uFBD3-\uFC5D\uFC64-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDF9\uFE00-\uFE0F\uFE20-\uFE23\uFE33-\uFE34\uFE4D-\uFE4F\uFE71\uFE73\uFE77\uFE79\uFE7B\uFE7D\uFE7F-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFF6F\uFF70\uFF71-\uFF9D\uFF9E-\uFF9F\uFFA0-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC' +xid_continue = '\u0030-\u0039\u0041-\u005A\u005F\u0061-\u007A\u00AA\u00B5\u00B7\u00BA\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u01BA\u01BB\u01BC-\u01BF\u01C0-\u01C3\u01C4-\u0241\u0250-\u02AF\u02B0-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EE\u0300-\u036F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03CE\u03D0-\u03F5\u03F7-\u0481\u0483-\u0486\u048A-\u04CE\u04D0-\u04F9\u0500-\u050F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05B9\u05BB-\u05BD\u05BF\u05C1-\u05C2\u05C4-\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u0615\u0621-\u063A\u0640\u0641-\u064A\u064B-\u065E\u0660-\u0669\u066E-\u066F\u0670\u0671-\u06D3\u06D5\u06D6-\u06DC\u06DF-\u06E4\u06E5-\u06E6\u06E7-\u06E8\u06EA-\u06ED\u06EE-\u06EF\u06F0-\u06F9\u06FA-\u06FC\u06FF\u0710\u0711\u0712-\u072F\u0730-\u074A\u074D-\u076D\u0780-\u07A5\u07A6-\u07B0\u07B1\u0901-\u0902\u0903\u0904-\u0939\u093C\u093D\u093E-\u0940\u0941-\u0948\u0949-\u094C\u094D\u0950\u0951-\u0954\u0958-\u0961\u0962-\u0963\u0966-\u096F\u097D\u0981\u0982-\u0983\u0985-\u098C\u098F-\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC\u09BD\u09BE-\u09C0\u09C1-\u09C4\u09C7-\u09C8\u09CB-\u09CC\u09CD\u09CE\u09D7\u09DC-\u09DD\u09DF-\u09E1\u09E2-\u09E3\u09E6-\u09EF\u09F0-\u09F1\u0A01-\u0A02\u0A03\u0A05-\u0A0A\u0A0F-\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32-\u0A33\u0A35-\u0A36\u0A38-\u0A39\u0A3C\u0A3E-\u0A40\u0A41-\u0A42\u0A47-\u0A48\u0A4B-\u0A4D\u0A59-\u0A5C\u0A5E\u0A66-\u0A6F\u0A70-\u0A71\u0A72-\u0A74\u0A81-\u0A82\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2-\u0AB3\u0AB5-\u0AB9\u0ABC\u0ABD\u0ABE-\u0AC0\u0AC1-\u0AC5\u0AC7-\u0AC8\u0AC9\u0ACB-\u0ACC\u0ACD\u0AD0\u0AE0-\u0AE1\u0AE2-\u0AE3\u0AE6-\u0AEF\u0B01\u0B02-\u0B03\u0B05-\u0B0C\u0B0F-\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32-\u0B33\u0B35-\u0B39\u0B3C\u0B3D\u0B3E\u0B3F\u0B40\u0B41-\u0B43\u0B47-\u0B48\u0B4B-\u0B4C\u0B4D\u0B56\u0B57\u0B5C-\u0B5D\u0B5F-\u0B61\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99-\u0B9A\u0B9C\u0B9E-\u0B9F\u0BA3-\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BBF\u0BC0\u0BC1-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCC\u0BCD\u0BD7\u0BE6-\u0BEF\u0C01-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3E-\u0C40\u0C41-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55-\u0C56\u0C60-\u0C61\u0C66-\u0C6F\u0C82-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC\u0CBD\u0CBE\u0CBF\u0CC0-\u0CC4\u0CC6\u0CC7-\u0CC8\u0CCA-\u0CCB\u0CCC-\u0CCD\u0CD5-\u0CD6\u0CDE\u0CE0-\u0CE1\u0CE6-\u0CEF\u0D02-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D28\u0D2A-\u0D39\u0D3E-\u0D40\u0D41-\u0D43\u0D46-\u0D48\u0D4A-\u0D4C\u0D4D\u0D57\u0D60-\u0D61\u0D66-\u0D6F\u0D82-\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD1\u0DD2-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DF2-\u0DF3\u0E01-\u0E30\u0E31\u0E32-\u0E33\u0E34-\u0E3A\u0E40-\u0E45\u0E46\u0E47-\u0E4E\u0E50-\u0E59\u0E81-\u0E82\u0E84\u0E87-\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA-\u0EAB\u0EAD-\u0EB0\u0EB1\u0EB2-\u0EB3\u0EB4-\u0EB9\u0EBB-\u0EBC\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDD\u0F00\u0F18-\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F3F\u0F40-\u0F47\u0F49-\u0F6A\u0F71-\u0F7E\u0F7F\u0F80-\u0F84\u0F86-\u0F87\u0F88-\u0F8B\u0F90-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1021\u1023-\u1027\u1029-\u102A\u102C\u102D-\u1030\u1031\u1032\u1036-\u1037\u1038\u1039\u1040-\u1049\u1050-\u1055\u1056-\u1057\u1058-\u1059\u10A0-\u10C5\u10D0-\u10FA\u10FC\u1100-\u1159\u115F-\u11A2\u11A8-\u11F9\u1200-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135F\u1369-\u1371\u1380-\u138F\u13A0-\u13F4\u1401-\u166C\u166F-\u1676\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F0\u1700-\u170C\u170E-\u1711\u1712-\u1714\u1720-\u1731\u1732-\u1734\u1740-\u1751\u1752-\u1753\u1760-\u176C\u176E-\u1770\u1772-\u1773\u1780-\u17B3\u17B6\u17B7-\u17BD\u17BE-\u17C5\u17C6\u17C7-\u17C8\u17C9-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1842\u1843\u1844-\u1877\u1880-\u18A8\u18A9\u1900-\u191C\u1920-\u1922\u1923-\u1926\u1927-\u1928\u1929-\u192B\u1930-\u1931\u1932\u1933-\u1938\u1939-\u193B\u1946-\u194F\u1950-\u196D\u1970-\u1974\u1980-\u19A9\u19B0-\u19C0\u19C1-\u19C7\u19C8-\u19C9\u19D0-\u19D9\u1A00-\u1A16\u1A17-\u1A18\u1A19-\u1A1B\u1D00-\u1D2B\u1D2C-\u1D61\u1D62-\u1D77\u1D78\u1D79-\u1D9A\u1D9B-\u1DBF\u1DC0-\u1DC3\u1E00-\u1E9B\u1EA0-\u1EF9\u1F00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u203F-\u2040\u2054\u2071\u207F\u2090-\u2094\u20D0-\u20DC\u20E1\u20E5-\u20EB\u2102\u2107\u210A-\u2113\u2115\u2118\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212E\u212F-\u2131\u2133-\u2134\u2135-\u2138\u2139\u213C-\u213F\u2145-\u2149\u2160-\u2183\u2C00-\u2C2E\u2C30-\u2C5E\u2C80-\u2CE4\u2D00-\u2D25\u2D30-\u2D65\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u3005\u3006\u3007\u3021-\u3029\u302A-\u302F\u3031-\u3035\u3038-\u303A\u303B\u303C\u3041-\u3096\u3099-\u309A\u309D-\u309E\u309F\u30A1-\u30FA\u30FC-\u30FE\u30FF\u3105-\u312C\u3131-\u318E\u31A0-\u31B7\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FBB\uA000-\uA014\uA015\uA016-\uA48C\uA800-\uA801\uA802\uA803-\uA805\uA806\uA807-\uA80A\uA80B\uA80C-\uA822\uA823-\uA824\uA825-\uA826\uA827\uAC00-\uD7A3\uF900-\uFA2D\uFA30-\uFA6A\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1E\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40-\uFB41\uFB43-\uFB44\uFB46-\uFBB1\uFBD3-\uFC5D\uFC64-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDF9\uFE00-\uFE0F\uFE20-\uFE23\uFE33-\uFE34\uFE4D-\uFE4F\uFE71\uFE73\uFE77\uFE79\uFE7B\uFE7D\uFE7F-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFF6F\uFF70\uFF71-\uFF9D\uFF9E-\uFF9F\uFFA0-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC' def allexcept(*args): newcats = cats[:] for arg in args: newcats.remove(arg) - return u''.join([globals()[cat] for cat in newcats]) + return ''.join([globals()[cat] for cat in newcats]) if __name__ == '__main__': import unicodedata @@ -106,7 +106,7 @@ def allexcept(*args): footer = content[content.find("def combine("):] for code in range(65535): - c = unichr(code) + c = chr(code) cat = unicodedata.category(c) categories.setdefault(cat, []).append(c) @@ -114,7 +114,7 @@ def allexcept(*args): f.write(header) for cat in sorted(categories): - val = u''.join(categories[cat]) + val = ''.join(categories[cat]) if cat == 'Cs': # Jython can't handle isolated surrogates f.write("""\ diff --git a/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/bccache.py b/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/bccache.py index e7282095cd4..e3fb34f6aa1 100644 --- a/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/bccache.py +++ b/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/bccache.py @@ -17,9 +17,9 @@ from os import path, listdir import marshal import tempfile -import cPickle as pickle +import pickle as pickle import fnmatch -from cStringIO import StringIO +from io import StringIO try: from hashlib import sha1 except ImportError: @@ -144,7 +144,7 @@ def get_cache_key(self, name, filename=None): """Returns the unique hash key for this template name.""" hash = sha1(name.encode('utf-8')) if filename is not None: - if isinstance(filename, unicode): + if isinstance(filename, str): filename = filename.encode('utf-8') hash.update('|' + filename) return hash.hexdigest() diff --git a/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/compiler.py b/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/compiler.py index f7a52f46b11..74a897265fb 100644 --- a/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/compiler.py +++ b/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/compiler.py @@ -8,7 +8,7 @@ :copyright: (c) 2010 by the Jinja Team. :license: BSD, see LICENSE for more details. """ -from cStringIO import StringIO +from io import StringIO from itertools import chain from copy import deepcopy from ambari_jinja2 import nodes @@ -30,7 +30,7 @@ } try: - exec '(0 if 0 else 0)' + exec('(0 if 0 else 0)') except SyntaxError: have_condexpr = False else: @@ -51,7 +51,7 @@ def unoptimize_before_dead_code(): def f(): if 0: dummy(x) return f -unoptimize_before_dead_code = bool(unoptimize_before_dead_code().func_closure) +unoptimize_before_dead_code = bool(unoptimize_before_dead_code().__closure__) def generate(node, environment, name, filename, stream=None, @@ -69,8 +69,8 @@ def has_safe_repr(value): """Does the node have a safe representation?""" if value is None or value is NotImplemented or value is Ellipsis: return True - if isinstance(value, (bool, int, long, float, complex, basestring, - xrange, Markup)): + if isinstance(value, (bool, int, float, complex, str, + range, Markup)): return True if isinstance(value, (tuple, list, set, frozenset)): for item in value: @@ -78,7 +78,7 @@ def has_safe_repr(value): return False return True elif isinstance(value, dict): - for key, value in value.iteritems(): + for key, value in value.items(): if not has_safe_repr(key): return False if not has_safe_repr(value): @@ -545,7 +545,7 @@ def signature(self, node, frame, extra_kwargs=None): self.write(', ') self.visit(kwarg, frame) if extra_kwargs is not None: - for key, value in extra_kwargs.iteritems(): + for key, value in extra_kwargs.items(): self.write(', %s=%s' % (key, value)) if node.dyn_args: self.write(', *') @@ -561,7 +561,7 @@ def signature(self, node, frame, extra_kwargs=None): self.visit(kwarg.value, frame) self.write(', ') if extra_kwargs is not None: - for key, value in extra_kwargs.iteritems(): + for key, value in extra_kwargs.items(): self.write('%r: %s, ' % (key, value)) if node.dyn_kwargs is not None: self.write('}, **') @@ -628,7 +628,7 @@ def push_scope(self, frame, extra_vars=()): def pop_scope(self, aliases, frame): """Restore all aliases and delete unused variables.""" - for name, alias in aliases.iteritems(): + for name, alias in aliases.items(): self.writeline('l_%s = %s' % (name, alias)) to_delete = set() for name in frame.identifiers.declared_locally: @@ -830,7 +830,7 @@ def visit_Template(self, node, frame=None): self.outdent(2 + (not self.has_known_extends)) # at this point we now have the blocks collected and can visit them too. - for name, block in self.blocks.iteritems(): + for name, block in self.blocks.items(): block_frame = Frame(eval_ctx) block_frame.inspect(block.body) block_frame.block = name @@ -933,7 +933,7 @@ def visit_Include(self, node, frame): func_name = 'get_or_select_template' if isinstance(node.template, nodes.Const): - if isinstance(node.template.value, basestring): + if isinstance(node.template.value, str): func_name = 'get_template' elif isinstance(node.template.value, (tuple, list)): func_name = 'select_template' @@ -1219,9 +1219,9 @@ def visit_Output(self, node, frame): return if self.environment.finalize: - finalize = lambda x: unicode(self.environment.finalize(x)) + finalize = lambda x: str(self.environment.finalize(x)) else: - finalize = unicode + finalize = str # if we are inside a frame that requires output checking, we do so outdent_later = False diff --git a/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/constants.py b/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/constants.py index cab203cc772..ec0aafd47f2 100644 --- a/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/constants.py +++ b/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/constants.py @@ -11,7 +11,7 @@ #: list of lorem ipsum words used by the lipsum() helper function -LOREM_IPSUM_WORDS = u'''\ +LOREM_IPSUM_WORDS = '''\ a ac accumsan ad adipiscing aenean aliquam aliquet amet ante aptent arcu at auctor augue bibendum blandit class commodo condimentum congue consectetuer consequat conubia convallis cras cubilia cum curabitur curae cursus dapibus diff --git a/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/debug.py b/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/debug.py index d48a95803e5..34788db264a 100644 --- a/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/debug.py +++ b/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/debug.py @@ -18,7 +18,7 @@ # how does the raise helper look like? try: - exec "raise TypeError, 'foo'" + exec("raise TypeError, 'foo'") except SyntaxError: raise_helper = 'raise __jinja_exception__[1]' except TypeError: @@ -77,7 +77,7 @@ def render_as_text(self, limit=None): def render_as_html(self, full=False): """Return a unicode string with the traceback as rendered HTML.""" from ambari_jinja2.debugrenderer import render_traceback - return u'%s\n\n' % ( + return '%s\n\n' % ( render_traceback(self, full=full), self.render_as_text().decode('utf-8', 'replace') ) @@ -128,7 +128,7 @@ def translate_exception(exc_info, initial_skip=0): frames = [] # skip some internal frames if wanted - for x in xrange(initial_skip): + for x in range(initial_skip): if tb is not None: tb = tb.tb_next initial_tb = tb @@ -159,7 +159,7 @@ def translate_exception(exc_info, initial_skip=0): # reraise it unchanged. # XXX: can we backup here? when could this happen? if not frames: - raise exc_info[0], exc_info[1], exc_info[2] + raise exc_info[0](exc_info[1]).with_traceback(exc_info[2]) traceback = ProcessedTraceback(exc_info[0], exc_info[1], frames) if tb_set_next is not None: @@ -179,7 +179,7 @@ def fake_exc_info(exc_info, filename, lineno): locals = ctx.get_all() else: locals = {} - for name, value in real_locals.iteritems(): + for name, value in real_locals.items(): if name.startswith('l_') and value is not missing: locals[name[2:]] = value @@ -227,7 +227,7 @@ def fake_exc_info(exc_info, filename, lineno): # execute the code and catch the new traceback try: - exec code in globals, locals + exec(code, globals, locals) except: exc_info = sys.exc_info() new_tb = exc_info[2].tb_next diff --git a/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/defaults.py b/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/defaults.py index 566ebcaf4d4..f5ad1774891 100644 --- a/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/defaults.py +++ b/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/defaults.py @@ -28,7 +28,7 @@ from ambari_jinja2.filters import FILTERS as DEFAULT_FILTERS from ambari_jinja2.tests import TESTS as DEFAULT_TESTS DEFAULT_NAMESPACE = { - 'range': xrange, + 'range': range, 'dict': lambda **kw: kw, 'lipsum': generate_lorem_ipsum, 'cycler': Cycler, diff --git a/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/environment.py b/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/environment.py index b3d6bc7ceff..63e0a4d085b 100644 --- a/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/environment.py +++ b/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/environment.py @@ -21,6 +21,7 @@ TemplatesNotFound from ambari_jinja2.utils import import_string, LRUCache, Markup, missing, \ concat, consume, internalcode, _encode_filename +from functools import reduce # for direct template usage we have up to ten living environments @@ -71,7 +72,7 @@ def load_extensions(environment, extensions): """ result = {} for extension in extensions: - if isinstance(extension, basestring): + if isinstance(extension, str): extension = import_string(extension) result[extension.identifier] = extension(environment) return result @@ -291,7 +292,7 @@ def extend(self, **attributes): yet. This is used by :ref:`extensions ` to register callbacks and configuration values without breaking inheritance. """ - for key, value in attributes.iteritems(): + for key, value in list(attributes.items()): if not hasattr(self, key): setattr(self, key, value) @@ -322,7 +323,7 @@ def overlay(self, block_start_string=missing, block_end_string=missing, rv.overlayed = True rv.linked_to = self - for key, value in args.iteritems(): + for key, value in args.items(): if value is not missing: setattr(rv, key, value) @@ -332,7 +333,7 @@ def overlay(self, block_start_string=missing, block_end_string=missing, rv.cache = copy_cache(self.cache) rv.extensions = {} - for key, value in self.extensions.iteritems(): + for key, value in self.extensions.items(): rv.extensions[key] = value.bind(rv) if extensions is not missing: rv.extensions.update(load_extensions(rv, extensions)) @@ -351,7 +352,7 @@ def getitem(self, obj, argument): try: return obj[argument] except (TypeError, LookupError): - if isinstance(argument, basestring): + if isinstance(argument, str): try: attr = str(argument) except: @@ -406,7 +407,7 @@ def lex(self, source, name=None, filename=None): of the extensions to be applied you have to filter source through the :meth:`preprocess` method. """ - source = unicode(source) + source = str(source) try: return self.lexer.tokeniter(source, name, filename) except TemplateSyntaxError: @@ -419,7 +420,7 @@ def preprocess(self, source, name=None, filename=None): because there you usually only want the actual source tokenized. """ return reduce(lambda s, e: e.preprocess(s, name, filename), - self.iter_extensions(), unicode(source)) + self.iter_extensions(), str(source)) def _tokenize(self, source, name, filename=None, state=None): """Called by the parser to do the preprocessing and filtering @@ -473,7 +474,7 @@ def compile(self, source, name=None, filename=None, raw=False, """ source_hint = None try: - if isinstance(source, basestring): + if isinstance(source, str): source_hint = source source = self._parse(source, name, filename) if self.optimized: @@ -567,12 +568,12 @@ def compile_templates(self, target, extensions=None, filter_func=None, if py_compile: import imp, struct, marshal py_header = imp.get_magic() + \ - u'\xff\xff\xff\xff'.encode('iso-8859-15') + '\xff\xff\xff\xff'.encode('iso-8859-15') def write_file(filename, data, mode): if zip: info = ZipInfo(filename) - info.external_attr = 0755 << 16L + info.external_attr = 0o755 << 16 zip_file.writestr(info, data) else: f = open(os.path.join(target, filename), mode) @@ -596,7 +597,7 @@ def write_file(filename, data, mode): source, filename, _ = self.loader.get_source(self, name) try: code = self.compile(source, name, filename, True, True) - except TemplateSyntaxError, e: + except TemplateSyntaxError as e: if not ignore_errors: raise log_function('Could not compile "%s": %s' % (name, e)) @@ -664,7 +665,7 @@ def handle_exception(self, exc_info=None, rendered=False, source_hint=None): if self.exception_handler is not None: self.exception_handler(traceback) exc_type, exc_value, tb = traceback.standard_exc_info - raise exc_type, exc_value, tb + raise exc_type(exc_value).with_traceback(tb) def join_path(self, template, parent): """Join a template with the parent. By default all the lookups are @@ -728,8 +729,8 @@ def select_template(self, names, parent=None, globals=None): from the function unchanged. """ if not names: - raise TemplatesNotFound(message=u'Tried to select from an empty list ' - u'of templates.') + raise TemplatesNotFound(message='Tried to select from an empty list ' + 'of templates.') globals = self.make_globals(globals) for name in names: if isinstance(name, Template): @@ -751,7 +752,7 @@ def get_or_select_template(self, template_name_or_list, .. versionadded:: 2.3 """ - if isinstance(template_name_or_list, basestring): + if isinstance(template_name_or_list, str): return self.get_template(template_name_or_list, parent, globals) elif isinstance(template_name_or_list, Template): return template_name_or_list @@ -836,7 +837,7 @@ def from_code(cls, environment, code, globals, uptodate=None): 'environment': environment, '__file__': code.co_filename } - exec code in namespace + exec(code, namespace) rv = cls._from_namespace(environment, namespace, globals) rv._uptodate = uptodate return rv @@ -996,13 +997,6 @@ def __html__(self): return Markup(concat(self._body_stream)) def __str__(self): - return unicode(self).encode('utf-8') - - # unicode goes after __str__ because we configured 2to3 to rename - # __unicode__ to __str__. because the 2to3 tree is not designed to - # remove nodes from it, we leave the above __str__ around and let - # it override at runtime. - def __unicode__(self): return concat(self._body_stream) def __repr__(self): @@ -1057,7 +1051,7 @@ def dump(self, fp, encoding=None, errors='strict'): Template('Hello {{ name }}!').stream(name='foo').dump('hello.html') """ close = False - if isinstance(fp, basestring): + if isinstance(fp, str): fp = file(fp, 'w') close = True try: @@ -1076,7 +1070,7 @@ def dump(self, fp, encoding=None, errors='strict'): def disable_buffering(self): """Disable the output buffering.""" - self._next = self._gen.next + self._next = self._gen.__next__ self.buffered = False def enable_buffering(self, size=5): @@ -1104,12 +1098,12 @@ def generator(next): c_size = 0 self.buffered = True - self._next = generator(self._gen.next).next + self._next = generator(self._gen.__next__).__next__ def __iter__(self): return self - def next(self): + def __next__(self): return self._next() diff --git a/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/exceptions.py b/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/exceptions.py index 346c7068b94..765b834846e 100644 --- a/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/exceptions.py +++ b/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/exceptions.py @@ -15,7 +15,7 @@ class TemplateError(Exception): def __init__(self, message=None): if message is not None: - message = unicode(message).encode('utf-8') + message = str(message).encode('utf-8') Exception.__init__(self, message) @property @@ -62,8 +62,8 @@ class TemplatesNotFound(TemplateNotFound): def __init__(self, names=(), message=None): if message is None: - message = u'non of the templates given were found: ' + \ - u', '.join(map(unicode, names)) + message = 'non of the templates given were found: ' + \ + ', '.join(map(str, names)) TemplateNotFound.__init__(self, names and names[-1] or None, message) self.templates = list(names) @@ -83,13 +83,6 @@ def __init__(self, message, lineno, name=None, filename=None): self.translated = False def __str__(self): - return unicode(self).encode('utf-8') - - # unicode goes after __str__ because we configured 2to3 to rename - # __unicode__ to __str__. because the 2to3 tree is not designed to - # remove nodes from it, we leave the above __str__ around and let - # it override at runtime. - def __unicode__(self): # for translated errors we only return the message if self.translated: return self.message @@ -110,7 +103,7 @@ def __unicode__(self): if line: lines.append(' ' + line.strip()) - return u'\n'.join(lines) + return '\n'.join(lines) class TemplateAssertionError(TemplateSyntaxError): diff --git a/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/ext.py b/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/ext.py index 20149d1cb79..1750c371b50 100644 --- a/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/ext.py +++ b/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/ext.py @@ -34,7 +34,7 @@ def __new__(cls, name, bases, d): return rv -class Extension(object): +class Extension(object, metaclass=ExtensionRegistry): """Extensions can be used to add extra functionality to the Jinja template system at the parser level. Custom extensions are bound to an environment but may not store environment specific data on `self`. The reason for @@ -52,7 +52,6 @@ class Extension(object): is a terrible name, ``fragment_cache_prefix`` on the other hand is a good name as includes the name of the extension (fragment cache). """ - __metaclass__ = ExtensionRegistry #: if this extension parses this is the list of tags it's listening to. tags = set() @@ -203,7 +202,7 @@ def _uninstall(self, translations): self.environment.globals.pop(key, None) def _extract(self, source, gettext_functions=GETTEXT_FUNCTIONS): - if isinstance(source, basestring): + if isinstance(source, str): source = self.environment.parse(source) return extract_from_ast(source, gettext_functions) @@ -352,7 +351,7 @@ def _make_node(self, singular, plural, variables, plural_expr, # enough to handle the variable expansion and autoescape # handling itself if self.environment.newstyle_gettext: - for key, value in variables.iteritems(): + for key, value in variables.items(): # the function adds that later anyways in case num was # called num, so just skip it. if num_called_num and key == 'num': @@ -474,7 +473,7 @@ def extract_from_ast(node, gettext_functions=GETTEXT_FUNCTIONS, strings = [] for arg in node.args: if isinstance(arg, nodes.Const) and \ - isinstance(arg.value, basestring): + isinstance(arg.value, str): strings.append(arg.value) else: strings.append(None) @@ -593,7 +592,7 @@ def getbool(options, key, default=False): try: node = environment.parse(source) tokens = list(environment.lex(environment.preprocess(source))) - except TemplateSyntaxError, e: + except TemplateSyntaxError as e: # skip templates with syntax errors return diff --git a/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/filters.py b/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/filters.py index bdb545e7dc1..23e26f41a04 100644 --- a/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/filters.py +++ b/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/filters.py @@ -12,7 +12,7 @@ import math from random import choice from operator import itemgetter -from itertools import imap, groupby +from itertools import groupby from ambari_jinja2.utils import Markup, escape, pformat, urlize, soft_unicode from ambari_jinja2.runtime import Undefined from ambari_jinja2.exceptions import FilterArgumentError, SecurityError @@ -52,7 +52,7 @@ def do_forceescape(value): """Enforce HTML escaping. This will probably double escape variables.""" if hasattr(value, '__html__'): value = value.__html__() - return escape(unicode(value)) + return escape(str(value)) @evalcontextfilter @@ -74,7 +74,7 @@ def do_replace(eval_ctx, s, old, new, count=None): if count is None: count = -1 if not eval_ctx.autoescape: - return unicode(s).replace(unicode(old), unicode(new), count) + return str(s).replace(str(old), str(new), count) if hasattr(old, '__html__') or hasattr(new, '__html__') and \ not hasattr(s, '__html__'): s = escape(s) @@ -117,13 +117,13 @@ def do_xmlattr(_eval_ctx, d, autospace=True): As you can see it automatically prepends a space in front of the item if the filter returned something unless the second parameter is false. """ - rv = u' '.join( - u'%s="%s"' % (escape(key), escape(value)) - for key, value in d.iteritems() + rv = ' '.join( + '%s="%s"' % (escape(key), escape(value)) + for key, value in d.items() if value is not None and not isinstance(value, Undefined) ) if autospace and rv: - rv = u' ' + rv + rv = ' ' + rv if _eval_ctx.autoescape: rv = Markup(rv) return rv @@ -169,7 +169,7 @@ def do_dictsort(value, case_sensitive=False, by='key'): '"key" or "value"') def sort_func(item): value = item[pos] - if isinstance(value, basestring) and not case_sensitive: + if isinstance(value, str) and not case_sensitive: value = value.lower() return value @@ -192,7 +192,7 @@ def do_sort(value, reverse=False, case_sensitive=False): """ if not case_sensitive: def sort_func(item): - if isinstance(item, basestring): + if isinstance(item, str): item = item.lower() return item else: @@ -200,7 +200,7 @@ def sort_func(item): return sorted(value, key=sort_func, reverse=reverse) -def do_default(value, default_value=u'', boolean=False): +def do_default(value, default_value='', boolean=False): """If the value is undefined it will return the passed default value, otherwise the value of the variable: @@ -223,7 +223,7 @@ def do_default(value, default_value=u'', boolean=False): @evalcontextfilter -def do_join(eval_ctx, value, d=u''): +def do_join(eval_ctx, value, d=''): """Return a string which is the concatenation of the strings in the sequence. The separator between elements is an empty string per default, you can define it with the optional parameter: @@ -238,7 +238,7 @@ def do_join(eval_ctx, value, d=u''): """ # no automatic escaping? joining is a lot eaiser then if not eval_ctx.autoescape: - return unicode(d).join(imap(unicode, value)) + return str(d).join(map(str, value)) # if the delimiter doesn't have an html representation we check # if any of the items has. If yes we do a coercion to Markup @@ -249,27 +249,27 @@ def do_join(eval_ctx, value, d=u''): if hasattr(item, '__html__'): do_escape = True else: - value[idx] = unicode(item) + value[idx] = str(item) if do_escape: d = escape(d) else: - d = unicode(d) + d = str(d) return d.join(value) # no html involved, to normal joining - return soft_unicode(d).join(imap(soft_unicode, value)) + return soft_unicode(d).join(map(soft_unicode, value)) def do_center(value, width=80): """Centers the value in a field of a given width.""" - return unicode(value).center(width) + return str(value).center(width) @environmentfilter def do_first(environment, seq): """Return the first item of a sequence.""" try: - return iter(seq).next() + return next(iter(seq)) except StopIteration: return environment.undefined('No first item, sequence was empty.') @@ -278,7 +278,7 @@ def do_first(environment, seq): def do_last(environment, seq): """Return the last item of a sequence.""" try: - return iter(reversed(seq)).next() + return next(iter(reversed(seq))) except StopIteration: return environment.undefined('No last item, sequence was empty.') @@ -349,8 +349,8 @@ def do_indent(s, width=4, indentfirst=False): {{ mytext|indent(2, true) }} indent by two spaces and indent the first line too. """ - indention = u' ' * width - rv = (u'\n' + indention).join(s.splitlines()) + indention = ' ' * width + rv = ('\n' + indention).join(s.splitlines()) if indentfirst: rv = indention + rv return rv @@ -384,7 +384,7 @@ def do_truncate(s, length=255, killwords=False, end='...'): break result.append(word) result.append(end) - return u' '.join(result) + return ' '.join(result) def do_wordwrap(s, width=79, break_long_words=True): @@ -395,7 +395,7 @@ def do_wordwrap(s, width=79, break_long_words=True): split words apart if they are longer than `width`. """ import textwrap - return u'\n'.join(textwrap.wrap(s, width=width, expand_tabs=False, + return '\n'.join(textwrap.wrap(s, width=width, expand_tabs=False, replace_whitespace=False, break_long_words=break_long_words)) @@ -456,7 +456,7 @@ def do_striptags(value): """ if hasattr(value, '__html__'): value = value.__html__() - return Markup(unicode(value)).striptags() + return Markup(str(value)).striptags() def do_slice(value, slices, fill_with=None): @@ -484,7 +484,7 @@ def do_slice(value, slices, fill_with=None): items_per_slice = length // slices slices_with_extra = length % slices offset = 0 - for slice_number in xrange(slices): + for slice_number in range(slices): start = offset + slice_number * items_per_slice if slice_number < slices_with_extra: offset += 1 @@ -605,7 +605,8 @@ class _GroupTuple(tuple): grouper = property(itemgetter(0)) list = property(itemgetter(1)) - def __new__(cls, (key, value)): + def __new__(cls, key_value): + (key, value) = key_value return tuple.__new__(cls, (key, list(value))) @@ -625,14 +626,14 @@ def do_mark_safe(value): def do_mark_unsafe(value): """Mark a value as unsafe. This is the reverse operation for :func:`safe`.""" - return unicode(value) + return str(value) def do_reverse(value): """Reverse the object or return an iterator the iterates over it the other way round. """ - if isinstance(value, basestring): + if isinstance(value, str): return value[::-1] try: return reversed(value) diff --git a/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/lexer.py b/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/lexer.py index 0c385c1b5fb..e073311dfe7 100644 --- a/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/lexer.py +++ b/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/lexer.py @@ -19,6 +19,7 @@ from collections import deque from ambari_jinja2.exceptions import TemplateSyntaxError from ambari_jinja2.utils import LRUCache, next +import sys # cache for the lexers. Exists in order to be able to have multiple @@ -46,55 +47,55 @@ newline_re = re.compile(r'(\r\n|\r|\n)') # internal the tokens and keep references to them -TOKEN_ADD = intern('add') -TOKEN_ASSIGN = intern('assign') -TOKEN_COLON = intern('colon') -TOKEN_COMMA = intern('comma') -TOKEN_DIV = intern('div') -TOKEN_DOT = intern('dot') -TOKEN_EQ = intern('eq') -TOKEN_FLOORDIV = intern('floordiv') -TOKEN_GT = intern('gt') -TOKEN_GTEQ = intern('gteq') -TOKEN_LBRACE = intern('lbrace') -TOKEN_LBRACKET = intern('lbracket') -TOKEN_LPAREN = intern('lparen') -TOKEN_LT = intern('lt') -TOKEN_LTEQ = intern('lteq') -TOKEN_MOD = intern('mod') -TOKEN_MUL = intern('mul') -TOKEN_NE = intern('ne') -TOKEN_PIPE = intern('pipe') -TOKEN_POW = intern('pow') -TOKEN_RBRACE = intern('rbrace') -TOKEN_RBRACKET = intern('rbracket') -TOKEN_RPAREN = intern('rparen') -TOKEN_SEMICOLON = intern('semicolon') -TOKEN_SUB = intern('sub') -TOKEN_TILDE = intern('tilde') -TOKEN_WHITESPACE = intern('whitespace') -TOKEN_FLOAT = intern('float') -TOKEN_INTEGER = intern('integer') -TOKEN_NAME = intern('name') -TOKEN_STRING = intern('string') -TOKEN_OPERATOR = intern('operator') -TOKEN_BLOCK_BEGIN = intern('block_begin') -TOKEN_BLOCK_END = intern('block_end') -TOKEN_VARIABLE_BEGIN = intern('variable_begin') -TOKEN_VARIABLE_END = intern('variable_end') -TOKEN_RAW_BEGIN = intern('raw_begin') -TOKEN_RAW_END = intern('raw_end') -TOKEN_COMMENT_BEGIN = intern('comment_begin') -TOKEN_COMMENT_END = intern('comment_end') -TOKEN_COMMENT = intern('comment') -TOKEN_LINESTATEMENT_BEGIN = intern('linestatement_begin') -TOKEN_LINESTATEMENT_END = intern('linestatement_end') -TOKEN_LINECOMMENT_BEGIN = intern('linecomment_begin') -TOKEN_LINECOMMENT_END = intern('linecomment_end') -TOKEN_LINECOMMENT = intern('linecomment') -TOKEN_DATA = intern('data') -TOKEN_INITIAL = intern('initial') -TOKEN_EOF = intern('eof') +TOKEN_ADD = sys.intern('add') +TOKEN_ASSIGN = sys.intern('assign') +TOKEN_COLON = sys.intern('colon') +TOKEN_COMMA = sys.intern('comma') +TOKEN_DIV = sys.intern('div') +TOKEN_DOT = sys.intern('dot') +TOKEN_EQ = sys.intern('eq') +TOKEN_FLOORDIV = sys.intern('floordiv') +TOKEN_GT = sys.intern('gt') +TOKEN_GTEQ = sys.intern('gteq') +TOKEN_LBRACE = sys.intern('lbrace') +TOKEN_LBRACKET = sys.intern('lbracket') +TOKEN_LPAREN = sys.intern('lparen') +TOKEN_LT = sys.intern('lt') +TOKEN_LTEQ = sys.intern('lteq') +TOKEN_MOD = sys.intern('mod') +TOKEN_MUL = sys.intern('mul') +TOKEN_NE = sys.intern('ne') +TOKEN_PIPE = sys.intern('pipe') +TOKEN_POW = sys.intern('pow') +TOKEN_RBRACE = sys.intern('rbrace') +TOKEN_RBRACKET = sys.intern('rbracket') +TOKEN_RPAREN = sys.intern('rparen') +TOKEN_SEMICOLON = sys.intern('semicolon') +TOKEN_SUB = sys.intern('sub') +TOKEN_TILDE = sys.intern('tilde') +TOKEN_WHITESPACE = sys.intern('whitespace') +TOKEN_FLOAT = sys.intern('float') +TOKEN_INTEGER = sys.intern('integer') +TOKEN_NAME = sys.intern('name') +TOKEN_STRING = sys.intern('string') +TOKEN_OPERATOR = sys.intern('operator') +TOKEN_BLOCK_BEGIN = sys.intern('block_begin') +TOKEN_BLOCK_END = sys.intern('block_end') +TOKEN_VARIABLE_BEGIN = sys.intern('variable_begin') +TOKEN_VARIABLE_END = sys.intern('variable_end') +TOKEN_RAW_BEGIN = sys.intern('raw_begin') +TOKEN_RAW_END = sys.intern('raw_end') +TOKEN_COMMENT_BEGIN = sys.intern('comment_begin') +TOKEN_COMMENT_END = sys.intern('comment_end') +TOKEN_COMMENT = sys.intern('comment') +TOKEN_LINESTATEMENT_BEGIN = sys.intern('linestatement_begin') +TOKEN_LINESTATEMENT_END = sys.intern('linestatement_end') +TOKEN_LINECOMMENT_BEGIN = sys.intern('linecomment_begin') +TOKEN_LINECOMMENT_END = sys.intern('linecomment_end') +TOKEN_LINECOMMENT = sys.intern('linecomment') +TOKEN_DATA = sys.intern('data') +TOKEN_INITIAL = sys.intern('initial') +TOKEN_EOF = sys.intern('eof') # bind operators to token types operators = { @@ -126,7 +127,7 @@ ';': TOKEN_SEMICOLON } -reverse_operators = dict([(v, k) for k, v in operators.iteritems()]) +reverse_operators = dict([(v, k) for k, v in operators.items()]) assert len(operators) == len(reverse_operators), 'operators dropped' operator_re = re.compile('(%s)' % '|'.join(re.escape(x) for x in sorted(operators, key=lambda x: -len(x)))) @@ -225,7 +226,7 @@ class Token(tuple): lineno, type, value = (property(itemgetter(x)) for x in range(3)) def __new__(cls, lineno, type, value): - return tuple.__new__(cls, (lineno, intern(str(type)), value)) + return tuple.__new__(cls, (lineno, sys.intern(str(type)), value)) def __str__(self): if self.type in reverse_operators: @@ -273,7 +274,7 @@ def __init__(self, stream): def __iter__(self): return self - def next(self): + def __next__(self): token = self.stream.current if token.type is TOKEN_EOF: self.stream.close() @@ -289,7 +290,7 @@ class TokenStream(object): """ def __init__(self, generator, name, filename): - self._next = iter(generator).next + self._next = iter(generator).__next__ self._pushed = deque() self.name = name self.filename = filename @@ -300,7 +301,7 @@ def __init__(self, generator, name, filename): def __iter__(self): return TokenStreamIterator(self) - def __nonzero__(self): + def __bool__(self): return bool(self._pushed) or self.current.type is not TOKEN_EOF eos = property(lambda x: not x, doc="Are we at the end of the stream?") @@ -319,7 +320,7 @@ def look(self): def skip(self, n=1): """Got n tokens ahead.""" - for x in xrange(n): + for x in range(n): next(self) def next_if(self, expr): @@ -333,7 +334,7 @@ def skip_if(self, expr): """Like :meth:`next_if` but only returns `True` or `False`.""" return self.next_if(expr) is not None - def next(self): + def __next__(self): """Go one token ahead and return the old one""" rv = self.current if self._pushed: @@ -526,7 +527,7 @@ def wrap(self, stream, name=None, filename=None): value = self._normalize_newlines(value[1:-1]) \ .encode('ascii', 'backslashreplace') \ .decode('unicode-escape') - except Exception, e: + except Exception as e: msg = str(e).split(':')[-1].strip() raise TemplateSyntaxError(msg, lineno, name, filename) # if we can express it as bytestring (ascii only) @@ -549,7 +550,7 @@ def tokeniter(self, source, name, filename=None, state=None): """This method tokenizes the text and returns the tokens in a generator. Use this method if you just want to tokenize a template. """ - source = '\n'.join(unicode(source).splitlines()) + source = '\n'.join(str(source).splitlines()) pos = 0 lineno = 1 stack = ['root'] @@ -590,7 +591,7 @@ def tokeniter(self, source, name, filename=None, state=None): # yield for the current token the first named # group that matched elif token == '#bygroup': - for key, value in m.groupdict().iteritems(): + for key, value in m.groupdict().items(): if value is not None: yield lineno, key, value lineno += value.count('\n') @@ -647,7 +648,7 @@ def tokeniter(self, source, name, filename=None, state=None): stack.pop() # resolve the new state by group checking elif new_state == '#bygroup': - for key, value in m.groupdict().iteritems(): + for key, value in m.groupdict().items(): if value is not None: stack.append(key) break diff --git a/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/loaders.py b/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/loaders.py index b25be088819..ef9f6cdc459 100644 --- a/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/loaders.py +++ b/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/loaders.py @@ -153,7 +153,7 @@ class FileSystemLoader(BaseLoader): """ def __init__(self, searchpath, encoding='utf-8'): - if isinstance(searchpath, basestring): + if isinstance(searchpath, str): searchpath = [searchpath] self.searchpath = list(searchpath) self.encoding = encoding @@ -307,7 +307,7 @@ def get_source(self, environment, template): rv = self.load_func(template) if rv is None: raise TemplateNotFound(template) - elif isinstance(rv, basestring): + elif isinstance(rv, str): return rv, None, None return rv @@ -346,7 +346,7 @@ def get_source(self, environment, template): def list_templates(self): result = [] - for prefix, loader in self.mapping.iteritems(): + for prefix, loader in self.mapping.items(): for template in loader.list_templates(): result.append(prefix + self.delimiter + template) return result @@ -407,7 +407,7 @@ def __init__(self, path): # create a fake module that looks for the templates in the # path given. mod = _TemplateModule(package_name) - if isinstance(path, basestring): + if isinstance(path, str): path = [path] else: path = list(path) diff --git a/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/meta.py b/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/meta.py index afe7771d586..3067fcb83ff 100644 --- a/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/meta.py +++ b/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/meta.py @@ -77,7 +77,7 @@ def find_referenced_templates(ast): # something const, only yield the strings and ignore # non-string consts that really just make no sense if isinstance(template_name, nodes.Const): - if isinstance(template_name.value, basestring): + if isinstance(template_name.value, str): yield template_name.value # something dynamic in there else: @@ -87,7 +87,7 @@ def find_referenced_templates(ast): yield None continue # constant is a basestring, direct template name - if isinstance(node.template.value, basestring): + if isinstance(node.template.value, str): yield node.template.value # a tuple or list (latter *should* not happen) made of consts, # yield the consts that are strings. We could warn here for @@ -95,7 +95,7 @@ def find_referenced_templates(ast): elif isinstance(node, nodes.Include) and \ isinstance(node.template.value, (tuple, list)): for template_name in node.template.value: - if isinstance(template_name, basestring): + if isinstance(template_name, str): yield template_name # something else we don't care about, we could warn here else: diff --git a/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/nodes.py b/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/nodes.py index 804070cbce0..7bf0393a08a 100644 --- a/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/nodes.py +++ b/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/nodes.py @@ -13,7 +13,7 @@ :license: BSD, see LICENSE for more details. """ import operator -from itertools import chain, izip +from itertools import chain from collections import deque from ambari_jinja2.utils import Markup, MethodType, FunctionType @@ -101,7 +101,7 @@ def get_eval_context(node, ctx): return ctx -class Node(object): +class Node(object, metaclass=NodeType): """Baseclass for all Jinja2 nodes. There are a number of nodes available of different types. There are three major types: @@ -117,7 +117,6 @@ class Node(object): The `environment` attribute is set at the end of the parsing process for all nodes automatically. """ - __metaclass__ = NodeType fields = () attributes = ('lineno', 'environment') abstract = True @@ -135,13 +134,13 @@ def __init__(self, *fields, **attributes): len(self.fields), len(self.fields) != 1 and 's' or '' )) - for name, arg in izip(self.fields, fields): + for name, arg in zip(self.fields, fields): setattr(self, name, arg) for attr in self.attributes: setattr(self, attr, attributes.pop(attr, None)) if attributes: raise TypeError('unknown attribute %r' % - iter(attributes).next()) + next(iter(attributes))) def iter_fields(self, exclude=None, only=None): """This method iterates over all fields that are defined and yields @@ -431,7 +430,7 @@ def from_untrusted(cls, value, lineno=None, environment=None): constant value in the generated code, otherwise it will raise an `Impossible` exception. """ - from compiler import has_safe_repr + from .compiler import has_safe_repr if not has_safe_repr(value): raise Impossible() return cls(value, lineno=lineno, environment=environment) @@ -678,7 +677,7 @@ class Concat(Expr): def as_const(self, eval_ctx=None): eval_ctx = get_eval_context(self, eval_ctx) - return ''.join(unicode(x.as_const(eval_ctx)) for x in self.nodes) + return ''.join(str(x.as_const(eval_ctx)) for x in self.nodes) class Compare(Expr): diff --git a/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/runtime.py b/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/runtime.py index 08301323a7e..1078e23e413 100644 --- a/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/runtime.py +++ b/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/runtime.py @@ -9,7 +9,7 @@ :license: BSD. """ import sys -from itertools import chain, imap +from itertools import chain from ambari_jinja2.nodes import EvalContext, _context_function_types from ambari_jinja2.utils import Markup, partial, soft_unicode, escape, missing, \ concat, internalcode, next, object_type_repr @@ -26,7 +26,7 @@ #: the name of the function that is used to convert something into #: a string. 2to3 will adopt that automatically and the generated #: code can take advantage of it. -to_string = unicode +to_string = str #: the identity function. Useful for certain things in the environment identity = lambda x: x @@ -35,17 +35,17 @@ def markup_join(seq): """Concatenation that escapes if necessary and converts to unicode.""" buf = [] - iterator = imap(soft_unicode, seq) + iterator = map(soft_unicode, seq) for arg in iterator: buf.append(arg) if hasattr(arg, '__html__'): - return Markup(u'').join(chain(buf, iterator)) + return Markup('').join(chain(buf, iterator)) return concat(buf) def unicode_join(seq): """Simple args to unicode conversion and concatenation.""" - return concat(imap(unicode, seq)) + return concat(map(str, seq)) def new_context(environment, template_name, blocks, vars=None, @@ -62,7 +62,7 @@ def new_context(environment, template_name, blocks, vars=None, # we don't want to modify the dict passed if shared: parent = dict(parent) - for key, value in locals.iteritems(): + for key, value in locals.items(): if key[:2] == 'l_' and value is not missing: parent[key[2:]] = value return Context(environment, parent, template_name, blocks) @@ -120,7 +120,7 @@ def __init__(self, environment, parent, name, blocks): # create the initial mapping of blocks. Whenever template inheritance # takes place the runtime will update this mapping with the new blocks # from the template. - self.blocks = dict((k, [v]) for k, v in blocks.iteritems()) + self.blocks = dict((k, [v]) for k, v in blocks.items()) def super(self, name, current): """Render a parent block.""" @@ -191,7 +191,7 @@ def derived(self, locals=None): context = new_context(self.environment, self.name, {}, self.parent, True, None, locals) context.eval_ctx = self.eval_ctx - context.blocks.update((k, list(v)) for k, v in self.blocks.iteritems()) + context.blocks.update((k, list(v)) for k, v in self.blocks.items()) return context def _all(meth): @@ -343,7 +343,7 @@ def __init__(self, context): def __iter__(self): return self - def next(self): + def __next__(self): ctx = self.context ctx.index0 += 1 return next(ctx._iterator), ctx @@ -444,7 +444,7 @@ def _fail_with_undefined_error(self, *args, **kwargs): if self._undefined_hint is None: if self._undefined_obj is missing: hint = '%r is undefined' % self._undefined_name - elif not isinstance(self._undefined_name, basestring): + elif not isinstance(self._undefined_name, str): hint = '%s has no element %r' % ( object_type_repr(self._undefined_obj), self._undefined_name @@ -466,14 +466,7 @@ def _fail_with_undefined_error(self, *args, **kwargs): _fail_with_undefined_error def __str__(self): - return unicode(self).encode('utf-8') - - # unicode goes after __str__ because we configured 2to3 to rename - # __unicode__ to __str__. because the 2to3 tree is not designed to - # remove nodes from it, we leave the above __str__ around and let - # it override at runtime. - def __unicode__(self): - return u'' + return '' def __len__(self): return 0 @@ -482,7 +475,7 @@ def __iter__(self): if 0: yield None - def __nonzero__(self): + def __bool__(self): return False def __repr__(self): @@ -507,12 +500,12 @@ class DebugUndefined(Undefined): def __unicode__(self): if self._undefined_hint is None: if self._undefined_obj is missing: - return u'{{ %s }}' % self._undefined_name + return '{{ %s }}' % self._undefined_name return '{{ no such element: %s[%r] }}' % ( object_type_repr(self._undefined_obj), self._undefined_name ) - return u'{{ undefined value printed: %s }}' % self._undefined_hint + return '{{ undefined value printed: %s }}' % self._undefined_hint class StrictUndefined(Undefined): diff --git a/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/sandbox.py b/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/sandbox.py index 020c82acce2..ccc06377dad 100644 --- a/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/sandbox.py +++ b/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/sandbox.py @@ -47,7 +47,7 @@ # on python 2.x we can register the user collection types try: from UserDict import UserDict, DictMixin - from UserList import UserList + from collections import UserList _mutable_mapping_types += (UserDict, DictMixin) _mutable_set_types += (UserList,) except ImportError: @@ -91,7 +91,7 @@ def safe_range(*args): """A range that can't generate ranges with a length of more than MAX_RANGE items. """ - rng = xrange(*args) + rng = range(*args) if len(rng) > MAX_RANGE: raise OverflowError('range too big, maximum size for range is %d' % MAX_RANGE) @@ -209,7 +209,7 @@ def getitem(self, obj, argument): try: return obj[argument] except (TypeError, LookupError): - if isinstance(argument, basestring): + if isinstance(argument, str): try: attr = str(argument) except: diff --git a/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/tests.py b/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/tests.py index 4cb2bbfec7b..0793e956f6b 100644 --- a/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/tests.py +++ b/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/tests.py @@ -70,22 +70,22 @@ def test_none(value): def test_lower(value): """Return true if the variable is lowercased.""" - return unicode(value).islower() + return str(value).islower() def test_upper(value): """Return true if the variable is uppercased.""" - return unicode(value).isupper() + return str(value).isupper() def test_string(value): """Return true if the object is a string.""" - return isinstance(value, basestring) + return isinstance(value, str) def test_number(value): """Return true if the variable is a number.""" - return isinstance(value, (int, long, float, complex)) + return isinstance(value, (int, float, complex)) def test_sequence(value): diff --git a/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/__init__.py b/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/__init__.py index cd111171012..f125cffc218 100644 --- a/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/__init__.py +++ b/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/__init__.py @@ -59,7 +59,7 @@ def assert_raises(self, *args, **kwargs): def assert_traceback_matches(self, callback, expected_tb): try: callback() - except Exception, e: + except Exception as e: tb = format_exception(*sys.exc_info()) if re.search(expected_tb.strip(), ''.join(tb)) is None: raise self.fail('Traceback did not match:\n\n%s\nexpected:\n%s' diff --git a/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/api.py b/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/api.py index a02fb60fa96..e3c51a22337 100644 --- a/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/api.py +++ b/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/api.py @@ -40,7 +40,7 @@ def test_item_and_attribute(self): def test_finalizer(self): def finalize_none_empty(value): if value is None: - value = u'' + value = '' return value env = Environment(finalize=finalize_none_empty) tmpl = env.from_string('{% for item in seq %}|{{ item }}{% endfor %}') @@ -53,8 +53,8 @@ def test_cycler(self): c = Cycler(*items) for item in items + items: assert c.current == item - assert c.next() == item - c.next() + assert next(c) == item + next(c) assert c.current == 2 c.reset() assert c.current == 1 @@ -110,8 +110,8 @@ def test_find_undeclared_variables(self): def test_find_refererenced_templates(self): ast = env.parse('{% extends "layout.html" %}{% include helper %}') i = meta.find_referenced_templates(ast) - assert i.next() == 'layout.html' - assert i.next() is None + assert next(i) == 'layout.html' + assert next(i) is None assert list(i) == [] ast = env.parse('{% extends "layout.html" %}' @@ -145,20 +145,20 @@ def test_basic_streaming(self): tmpl = env.from_string("
    {% for item in seq %}
  • {{ loop.index " "}} - {{ item }}
  • {%- endfor %}
") stream = tmpl.stream(seq=range(4)) - self.assert_equal(stream.next(), '
    ') - self.assert_equal(stream.next(), '
  • 1 - 0
  • ') - self.assert_equal(stream.next(), '
  • 2 - 1
  • ') - self.assert_equal(stream.next(), '
  • 3 - 2
  • ') - self.assert_equal(stream.next(), '
  • 4 - 3
  • ') - self.assert_equal(stream.next(), '
') + self.assert_equal(next(stream), '
    ') + self.assert_equal(next(stream), '
  • 1 - 0
  • ') + self.assert_equal(next(stream), '
  • 2 - 1
  • ') + self.assert_equal(next(stream), '
  • 3 - 2
  • ') + self.assert_equal(next(stream), '
  • 4 - 3
  • ') + self.assert_equal(next(stream), '
') def test_buffered_streaming(self): tmpl = env.from_string("
    {% for item in seq %}
  • {{ loop.index " "}} - {{ item }}
  • {%- endfor %}
") stream = tmpl.stream(seq=range(4)) stream.enable_buffering(size=3) - self.assert_equal(stream.next(), u'
  • 1 - 0
  • 2 - 1
  • ') - self.assert_equal(stream.next(), u'
  • 3 - 2
  • 4 - 3
') + self.assert_equal(next(stream), '
  • 1 - 0
  • 2 - 1
  • ') + self.assert_equal(next(stream), '
  • 3 - 2
  • 4 - 3
') def test_streaming_behavior(self): tmpl = env.from_string("") @@ -182,7 +182,7 @@ def test(): def test_default_undefined(self): env = Environment(undefined=Undefined) - self.assert_equal(env.from_string('{{ missing }}').render(), u'') + self.assert_equal(env.from_string('{{ missing }}').render(), '') self.assert_raises(UndefinedError, env.from_string('{{ missing.attribute }}').render) self.assert_equal(env.from_string('{{ missing|list }}').render(), '[]') @@ -198,7 +198,7 @@ def test_debug_undefined(self): self.assert_equal(env.from_string('{{ missing|list }}').render(), '[]') self.assert_equal(env.from_string('{{ missing is not defined }}').render(), 'True') self.assert_equal(env.from_string('{{ foo.missing }}').render(foo=42), - u"{{ no such element: int object['missing'] }}") + "{{ no such element: int object['missing'] }}") self.assert_equal(env.from_string('{{ not missing }}').render(), 'True') def test_strict_undefined(self): @@ -217,7 +217,7 @@ def test_indexing_gives_undefined(self): def test_none_gives_proper_error(self): try: Environment().getattr(None, 'split')() - except UndefinedError, e: + except UndefinedError as e: assert e.message == "'None' has no attribute 'split'" else: assert False, 'expected exception' @@ -225,7 +225,7 @@ def test_none_gives_proper_error(self): def test_object_repr(self): try: Undefined(obj=42, name='upper')() - except UndefinedError, e: + except UndefinedError as e: assert e.message == "'int object' has no attribute 'upper'" else: assert False, 'expected exception' diff --git a/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/ext.py b/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/ext.py index 8a9a8d96661..55e9442c36f 100644 --- a/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/ext.py +++ b/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/ext.py @@ -23,7 +23,7 @@ try: from io import BytesIO except ImportError: - from StringIO import StringIO as BytesIO + from io import StringIO as BytesIO importable_object = 23 @@ -63,14 +63,14 @@ languages = { 'de': { - 'missing': u'fehlend', - 'watch out': u'pass auf', - 'One user online': u'Ein Benutzer online', - '%(user_count)s users online': u'%(user_count)s Benutzer online', - 'User: %(num)s': u'Benutzer: %(num)s', - 'User: %(count)s': u'Benutzer: %(count)s', - '%(num)s apple': u'%(num)s Apfel', - '%(num)s apples': u'%(num)s Äpfel' + 'missing': 'fehlend', + 'watch out': 'pass auf', + 'One user online': 'Ein Benutzer online', + '%(user_count)s users online': '%(user_count)s Benutzer online', + 'User: %(num)s': 'Benutzer: %(num)s', + 'User: %(count)s': 'Benutzer: %(count)s', + '%(num)s apple': '%(num)s Apfel', + '%(num)s apples': '%(num)s Äpfel' } } @@ -278,9 +278,9 @@ def test_extract(self): {% trans %}{{ users }} user{% pluralize %}{{ users }} users{% endtrans %} '''.encode('ascii')) # make python 3 happy assert list(babel_extract(source, ('gettext', 'ngettext', '_'), [], {})) == [ - (2, 'gettext', u'Hello World', []), - (3, 'gettext', u'Hello World', []), - (4, 'ngettext', (u'%(users)s user', u'%(users)s users', None), []) + (2, 'gettext', 'Hello World', []), + (3, 'gettext', 'Hello World', []), + (4, 'ngettext', ('%(users)s user', '%(users)s users', None), []) ] def test_comment_extract(self): @@ -293,9 +293,9 @@ def test_comment_extract(self): {% trans %}{{ users }} user{% pluralize %}{{ users }} users{% endtrans %} '''.encode('utf-8')) # make python 3 happy assert list(babel_extract(source, ('gettext', 'ngettext', '_'), ['trans', ':'], {})) == [ - (3, 'gettext', u'Hello World', ['first']), - (4, 'gettext', u'Hello World', ['second']), - (6, 'ngettext', (u'%(users)s user', u'%(users)s users', None), ['third']) + (3, 'gettext', 'Hello World', ['first']), + (4, 'gettext', 'Hello World', ['second']), + (6, 'ngettext', ('%(users)s user', '%(users)s users', None), ['third']) ] @@ -324,12 +324,12 @@ def test_trans_stringformatting(self): def test_newstyle_plural(self): tmpl = newstyle_i18n_env.get_template('ngettext.html') assert tmpl.render(LANGUAGE='de', apples=1) == '1 Apfel' - assert tmpl.render(LANGUAGE='de', apples=5) == u'5 Äpfel' + assert tmpl.render(LANGUAGE='de', apples=5) == '5 Äpfel' def test_autoescape_support(self): env = Environment(extensions=['ambari_jinja2.ext.autoescape', 'ambari_jinja2.ext.i18n']) - env.install_gettext_callables(lambda x: u'Wert: %(name)s', + env.install_gettext_callables(lambda x: 'Wert: %(name)s', lambda s, p, n: s, newstyle=True) t = env.from_string('{% autoescape ae %}{{ gettext("foo", name=' '"") }}{% endautoescape %}') @@ -338,7 +338,7 @@ def test_autoescape_support(self): def test_num_used_twice(self): tmpl = newstyle_i18n_env.get_template('ngettext_long.html') - assert tmpl.render(apples=5, LANGUAGE='de') == u'5 Äpfel' + assert tmpl.render(apples=5, LANGUAGE='de') == '5 Äpfel' def test_num_called_num(self): source = newstyle_i18n_env.compile(''' @@ -382,7 +382,7 @@ def test_scoped_setting(self): {{ "" }} ''') assert tmpl.render().split() == \ - [u'<HelloWorld>', u'', u'<HelloWorld>'] + ['<HelloWorld>', '', '<HelloWorld>'] env = Environment(extensions=['ambari_jinja2.ext.autoescape'], autoescape=False) @@ -394,7 +394,7 @@ def test_scoped_setting(self): {{ "" }} ''') assert tmpl.render().split() == \ - [u'', u'<HelloWorld>', u''] + ['', '<HelloWorld>', ''] def test_nonvolatile(self): env = Environment(extensions=['ambari_jinja2.ext.autoescape'], @@ -432,7 +432,7 @@ def test_volatile_scoping(self): ''' tmpl = env.from_string(tmplsource) assert tmpl.render(val=True).split()[0] == 'Markup' - assert tmpl.render(val=False).split()[0] == unicode.__name__ + assert tmpl.render(val=False).split()[0] == str.__name__ # looking at the source we should see there in raw # (and then escaped as well) diff --git a/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/filters.py b/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/filters.py index 9d0b09891b6..18ff197ac07 100644 --- a/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/filters.py +++ b/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/filters.py @@ -163,7 +163,7 @@ def test_reverse(self): def test_string(self): x = [1, 2, 3, 4, 5] tmpl = env.from_string('''{{ obj|string }}''') - assert tmpl.render(obj=x) == unicode(x) + assert tmpl.render(obj=x) == str(x) def test_title(self): tmpl = env.from_string('''{{ "foo bar"|title }}''') @@ -271,7 +271,7 @@ def test_replace(self): def test_forceescape(self): tmpl = env.from_string('{{ x|forceescape }}') - assert tmpl.render(x=Markup('
')) == u'<div />' + assert tmpl.render(x=Markup('
')) == '<div />' def test_safe(self): env = Environment(autoescape=True) diff --git a/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/imports.py b/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/imports.py index 799daf18647..10d7d587e9d 100644 --- a/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/imports.py +++ b/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/imports.py @@ -86,7 +86,7 @@ def test_choice_includes(self): self.assert_raises(TemplateNotFound, t.render) try: t.render() - except TemplatesNotFound, e: + except TemplatesNotFound as e: assert e.templates == ['missing', 'missing2'] assert e.name == 'missing2' else: diff --git a/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/inheritance.py b/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/inheritance.py index e0666e5af0e..676da825be4 100644 --- a/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/inheritance.py +++ b/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/inheritance.py @@ -198,7 +198,7 @@ def test_fixed_macro_scoping_bug(self): 'standard.html': ''' {% block content %} {% endblock %} ''' - })).get_template("test.html").render().split() == [u'outer_box', u'my_macro'] + })).get_template("test.html").render().split() == ['outer_box', 'my_macro'] def suite(): diff --git a/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/lexnparse.py b/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/lexnparse.py index 69ff4bca56c..6edf31d4bbe 100644 --- a/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/lexnparse.py +++ b/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/lexnparse.py @@ -59,23 +59,23 @@ def test_comments(self): "
  • 1
  • \n
  • 2
  • \n") def test_string_escapes(self): - for char in u'\0', u'\u2668', u'\xe4', u'\t', u'\r', u'\n': + for char in '\0', '\\u2668', '\xe4', '\t', '\r', '\n': tmpl = env.from_string('{{ %s }}' % jinja_string_repr(char)) assert tmpl.render() == char - assert env.from_string('{{ "\N{HOT SPRINGS}" }}').render() == u'\u2668' + assert env.from_string('{{ "\N{HOT SPRINGS}" }}').render() == '\\u2668' def test_bytefallback(self): from pprint import pformat - tmpl = env.from_string(u'''{{ 'foo'|pprint }}|{{ 'bär'|pprint }}''') - assert tmpl.render() == pformat('foo') + '|' + pformat(u'bär') + tmpl = env.from_string('''{{ 'foo'|pprint }}|{{ 'bär'|pprint }}''') + assert tmpl.render() == pformat('foo') + '|' + pformat('bär') def test_operators(self): from ambari_jinja2.lexer import operators - for test, expect in operators.iteritems(): + for test, expect in operators.items(): if test in '([{}])': continue stream = env.lexer.tokenize('{{ %s }}' % test) - stream.next() + next(stream) assert stream.current.type == expect def test_normalizing(self): @@ -95,7 +95,7 @@ def test_php_syntax(self): ''') - assert tmpl.render(seq=range(5)) == '01234' + assert tmpl.render(seq=list(range(5))) == '01234' def test_erb_syntax(self): env = Environment('<%', '%>', '<%=', '%>', '<%#', '%>') @@ -169,7 +169,7 @@ def test_error_messages(self): def assert_error(code, expected): try: Template(code) - except TemplateSyntaxError, e: + except TemplateSyntaxError as e: assert str(e) == expected, 'unexpected error message' else: assert False, 'that was suposed to be an error' @@ -338,16 +338,16 @@ def test_string_concatenation(self): assert tmpl.render() == 'foobarbaz' def test_notin(self): - bar = xrange(100) + bar = range(100) tmpl = env.from_string('''{{ not 42 in bar }}''') - assert tmpl.render(bar=bar) == unicode(not 42 in bar) + assert tmpl.render(bar=bar) == str(not 42 in bar) def test_implicit_subscribed_tuple(self): class Foo(object): def __getitem__(self, x): return x t = env.from_string('{{ foo[1, 2] }}') - assert t.render(foo=Foo()) == u'(1, 2)' + assert t.render(foo=Foo()) == '(1, 2)' def test_raw2(self): tmpl = env.from_string('{% raw %}{{ FOO }} and {% BAR %}{% endraw %}') diff --git a/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/loader.py b/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/loader.py index e133bd40ba4..8f574bff47c 100644 --- a/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/loader.py +++ b/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/loader.py @@ -72,7 +72,7 @@ def test_caching(self): changed = False class TestLoader(loaders.BaseLoader): def get_source(self, environment, template): - return u'foo', None, lambda: not changed + return 'foo', None, lambda: not changed env = Environment(loader=TestLoader(), cache_size=-1) tmpl = env.get_template('template') assert tmpl is env.get_template('template') diff --git a/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/regression.py b/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/regression.py index b457df2c1c1..e18113f33f9 100644 --- a/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/regression.py +++ b/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/regression.py @@ -121,7 +121,7 @@ def test_loop_call_loop(self): ''') - assert tmpl.render().split() == map(unicode, range(1, 11)) * 5 + assert tmpl.render().split() == map(str, list(range(1, 11))) * 5 def test_weird_inline_comment(self): env = Environment(line_statement_prefix='%') @@ -173,7 +173,7 @@ def test_stacked_locals_scoping_bug_twoframe(self): {{ x }} ''') rv = t.render(foo=[1]).strip() - assert rv == u'1' + assert rv == '1' def test_call_with_args(self): t = Template("""{% macro dump_users(users) -%} @@ -198,13 +198,13 @@ def test_call_with_args(self): 'realname':'something else', 'description':'test' }]).splitlines()] == [ - u'
    • apo

      ', - u'
      Realname
      ', - u'
      something else
      ', - u'
      Description
      ', - u'
      test
      ', - u'
      ', - u'
    ' + '
    • apo

      ', + '
      Realname
      ', + '
      something else
      ', + '
      Description
      ', + '
      test
      ', + '
      ', + '
    ' ] def test_empty_if_condition_fails(self): @@ -245,7 +245,7 @@ def test_correct_prefix_loader_name(self): })) try: env.get_template('foo/bar.html') - except TemplateNotFound, e: + except TemplateNotFound as e: assert e.name == 'foo/bar.html' else: assert False, 'expected error here' diff --git a/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/security.py b/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/security.py index 893526dfafc..06ca79209b9 100644 --- a/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/security.py +++ b/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/security.py @@ -77,7 +77,7 @@ def test_markup_operations(self): # adding two strings should escape the unsafe one unsafe = '' safe = Markup('username') - assert unsafe + safe == unicode(escape(unsafe)) + unicode(safe) + assert unsafe + safe == str(escape(unsafe)) + str(safe) # string interpolations are safe to use too assert Markup('%s') % '' == \ @@ -116,7 +116,7 @@ def test_template_data(self): '{{ say_hello("foo") }}') escaped_out = '

    Hello <blink>foo</blink>!

    ' assert t.render() == escaped_out - assert unicode(t.module) == escaped_out + assert str(t.module) == escaped_out assert escape(t.module) == escaped_out assert t.module.say_hello('foo') == escaped_out assert escape(t.module.say_hello('foo')) == escaped_out diff --git a/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/utils.py b/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/utils.py index 297ba6a4168..fd2872e57d2 100644 --- a/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/utils.py +++ b/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/utils.py @@ -63,12 +63,12 @@ class MarkupLeakTestCase(JinjaTestCase): def test_markup_leaks(self): counts = set() - for count in xrange(20): - for item in xrange(1000): + for count in range(20): + for item in range(1000): + escape("foo") + escape("") escape("foo") escape("") - escape(u"foo") - escape(u"") counts.add(len(gc.get_objects())) assert len(counts) == 1, 'ouch, c extension seems to leak objects' diff --git a/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/utils.py b/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/utils.py index bd3c0b4a8ac..984a9154678 100644 --- a/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/utils.py +++ b/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/utils.py @@ -12,18 +12,18 @@ import sys import errno try: - from thread import allocate_lock + from _thread import allocate_lock except ImportError: - from dummy_thread import allocate_lock + from _dummy_thread import allocate_lock from collections import deque -from itertools import imap + _word_split_re = re.compile(r'(\s+)') _punctuation_re = re.compile( '^(?P(?:%s)*)(?P.*?)(?P(?:%s)*)$' % ( - '|'.join(imap(re.escape, ('(', '<', '<'))), - '|'.join(imap(re.escape, ('.', ',', ')', '>', '\n', '>'))) + '|'.join(map(re.escape, ('(', '<', '<'))), + '|'.join(map(re.escape, ('.', ',', ')', '>', '\n', '>'))) ) ) _simple_email_re = re.compile(r'^\S+@[a-zA-Z0-9._-]+\.[a-zA-Z0-9._-]+$') @@ -42,13 +42,13 @@ # concatenate a list of strings and convert them to unicode. # unfortunately there is a bug in python 2.4 and lower that causes # unicode.join trash the traceback. -_concat = u''.join +_concat = ''.join try: def _test_gen_bug(): raise TypeError(_test_gen_bug) yield None _concat(_test_gen_bug()) -except TypeError, _error: +except TypeError as _error: if not _error.args or _error.args[0] is not _test_gen_bug: def concat(gen): try: @@ -57,7 +57,7 @@ def concat(gen): # this hack is needed so that the current frame # does not show up in the traceback. exc_type, exc_value, tb = sys.exc_info() - raise exc_type, exc_value, tb.tb_next + raise exc_type(exc_value).with_traceback(tb.tb_next) else: concat = _concat del _test_gen_bug, _error @@ -69,7 +69,7 @@ def concat(gen): next = next except NameError: def next(x): - return x.next() + return x.__next__() # if this python version is unable to deal with unicode filenames @@ -79,7 +79,7 @@ def next(x): # 3.x because compile cannot handle bytes if sys.version_info < (3, 0): def _encode_filename(filename): - if isinstance(filename, unicode): + if isinstance(filename, str): return filename.encode('utf-8') return filename else: @@ -101,7 +101,7 @@ def _func(): FunctionType = type(_func) GeneratorType = type(_func()) MethodType = type(_C.method) -CodeType = type(_C.method.func_code) +CodeType = type(_C.method.__code__) try: raise TypeError() except TypeError: @@ -152,7 +152,7 @@ def environmentfunction(f): def internalcode(f): """Marks the function as internally used""" - internal_code.add(f.func_code) + internal_code.add(f.__code__) return f @@ -222,7 +222,7 @@ def open_if_exists(filename, mode='rb'): """ try: return open(filename, mode) - except IOError, e: + except IOError as e: if e.errno not in (errno.ENOENT, errno.EISDIR): raise @@ -271,7 +271,7 @@ def urlize(text, trim_url_limit=None, nofollow=False): trim_url = lambda x, limit=trim_url_limit: limit is not None \ and (x[:limit] + (len(x) >=limit and '...' or '')) or x - words = _word_split_re.split(unicode(escape(text))) + words = _word_split_re.split(str(escape(text))) nofollow_attr = nofollow and ' rel="nofollow"' or '' for i, word in enumerate(words): match = _punctuation_re.match(word) @@ -297,7 +297,7 @@ def urlize(text, trim_url_limit=None, nofollow=False): middle = '%s' % (middle, middle) if lead + middle + trail != word: words[i] = lead + middle + trail - return u''.join(words) + return ''.join(words) def generate_lorem_ipsum(n=5, html=True, min=20, max=100): @@ -307,7 +307,7 @@ def generate_lorem_ipsum(n=5, html=True, min=20, max=100): words = LOREM_IPSUM_WORDS.split() result = [] - for _ in xrange(n): + for _ in range(n): next_capitalized = True last_comma = last_fullstop = 0 word = None @@ -315,7 +315,7 @@ def generate_lorem_ipsum(n=5, html=True, min=20, max=100): p = [] # each paragraph contains out of 20 to 100 words. - for idx, _ in enumerate(xrange(randrange(min, max))): + for idx, _ in enumerate(range(randrange(min, max))): while True: word = choice(words) if word != last: @@ -337,7 +337,7 @@ def generate_lorem_ipsum(n=5, html=True, min=20, max=100): p.append(word) # ensure that the paragraph ends with a dot. - p = u' '.join(p) + p = ' '.join(p) if p.endswith(','): p = p[:-1] + '.' elif not p.endswith('.'): @@ -345,8 +345,8 @@ def generate_lorem_ipsum(n=5, html=True, min=20, max=100): result.append(p) if not html: - return u'\n\n'.join(result) - return Markup(u'\n'.join(u'

    %s

    ' % escape(x) for x in result)) + return '\n\n'.join(result) + return Markup('\n'.join('

    %s

    ' % escape(x) for x in result)) class LRUCache(object): @@ -556,7 +556,7 @@ def current(self): """Returns the current item.""" return self.items[self.pos] - def next(self): + def __next__(self): """Goes one item ahead and returns it.""" rv = self.current self.pos = (self.pos + 1) % len(self.items) @@ -566,14 +566,14 @@ def next(self): class Joiner(object): """A joining helper for templates.""" - def __init__(self, sep=u', '): + def __init__(self, sep=', '): self.sep = sep self.used = False def __call__(self): if not self.used: self.used = True - return u'' + return '' return self.sep diff --git a/ambari-common/src/main/python/ambari_jinja2/docs/intro.rst b/ambari-common/src/main/python/ambari_jinja2/docs/intro.rst index 912bd397582..13ce365789e 100644 --- a/ambari-common/src/main/python/ambari_jinja2/docs/intro.rst +++ b/ambari-common/src/main/python/ambari_jinja2/docs/intro.rst @@ -82,7 +82,7 @@ Installing the development version 1. Install `git`_ 2. ``git clone git://github.com/mitsuhiko/ambari_jinja2.git`` 3. ``cd ambari_jinja2`` -4. ``ln -s ambari_jinja2 /usr/lib/python2.X/site-packages`` +4. ``ln -s ambari_jinja2 /usr/lib/python3.X/site-packages`` As an alternative to steps 4 you can also do ``python setup.py develop`` which will install the package via distribute in development mode. This also diff --git a/ambari-common/src/main/python/ambari_jinja2/docs/jinjaext.py b/ambari-common/src/main/python/ambari_jinja2/docs/jinjaext.py index da953542fca..bdc7afd392a 100644 --- a/ambari-common/src/main/python/ambari_jinja2/docs/jinjaext.py +++ b/ambari-common/src/main/python/ambari_jinja2/docs/jinjaext.py @@ -109,10 +109,10 @@ def dump_functions(mapping): def directive(dirname, arguments, options, content, lineno, content_offset, block_text, state, state_machine): reverse_mapping = {} - for name, func in mapping.iteritems(): + for name, func in mapping.items(): reverse_mapping.setdefault(func, []).append(name) filters = [] - for func, names in reverse_mapping.iteritems(): + for func, names in reverse_mapping.items(): aliases = sorted(names, key=lambda x: len(x)) name = aliases.pop() filters.append((name, aliases, func)) @@ -144,7 +144,7 @@ def walk(node, indent): doc.append(p + '.. autoclass:: %s(%s)' % (node.__name__, sig), '') if node.abstract: members = [] - for key, name in node.__dict__.iteritems(): + for key, name in node.__dict__.items(): if not key.startswith('_') and \ not hasattr(node.__base__, key) and callable(name): members.append(key) @@ -168,10 +168,10 @@ def inject_toc(app, doctree, docname): titleiter = iter(doctree.traverse(nodes.title)) try: # skip first title, we are not interested in that one - titleiter.next() - title = titleiter.next() + next(titleiter) + title = next(titleiter) # and check if there is at least another title - titleiter.next() + next(titleiter) except StopIteration: return tocnode = nodes.section('') diff --git a/ambari-common/src/main/python/ambari_jinja2/examples/basic/cycle.py b/ambari-common/src/main/python/ambari_jinja2/examples/basic/cycle.py index 7ca96830677..eaf840dcb49 100644 --- a/ambari-common/src/main/python/ambari_jinja2/examples/basic/cycle.py +++ b/ambari-common/src/main/python/ambari_jinja2/examples/basic/cycle.py @@ -4,10 +4,10 @@ env = Environment(line_statement_prefix="#", variable_start_string="${", variable_end_string="}") -print env.from_string("""\ +print(env.from_string("""\
      # for item in range(10)
    • ${item}
    • # endfor
    \ -""").render() +""").render()) diff --git a/ambari-common/src/main/python/ambari_jinja2/examples/basic/debugger.py b/ambari-common/src/main/python/ambari_jinja2/examples/basic/debugger.py index 96b8f36e266..707fe1e7df3 100644 --- a/ambari-common/src/main/python/ambari_jinja2/examples/basic/debugger.py +++ b/ambari-common/src/main/python/ambari_jinja2/examples/basic/debugger.py @@ -4,4 +4,4 @@ env = Environment(loader=FileSystemLoader('templates')) tmpl = env.get_template('broken.html') -print tmpl.render(seq=[3, 2, 4, 5, 3, 2, 0, 2, 1]) +print(tmpl.render(seq=[3, 2, 4, 5, 3, 2, 0, 2, 1])) diff --git a/ambari-common/src/main/python/ambari_jinja2/examples/basic/inheritance.py b/ambari-common/src/main/python/ambari_jinja2/examples/basic/inheritance.py index 10ea11c3903..6b0b81ea93a 100644 --- a/ambari-common/src/main/python/ambari_jinja2/examples/basic/inheritance.py +++ b/ambari-common/src/main/python/ambari_jinja2/examples/basic/inheritance.py @@ -9,4 +9,4 @@ })) -print env.get_template('c').render() +print(env.get_template('c').render()) diff --git a/ambari-common/src/main/python/ambari_jinja2/examples/basic/test.py b/ambari-common/src/main/python/ambari_jinja2/examples/basic/test.py index 721c9603c4d..5af89d7150c 100644 --- a/ambari-common/src/main/python/ambari_jinja2/examples/basic/test.py +++ b/ambari-common/src/main/python/ambari_jinja2/examples/basic/test.py @@ -2,7 +2,7 @@ from ambari_jinja2.loaders import DictLoader env = Environment(loader=DictLoader({ -'child.html': u'''\ +'child.html': '''\ {% extends master_layout or 'master.html' %} {% include helpers = 'helpers.html' %} {% macro get_the_answer() %}42{% endmacro %} @@ -12,16 +12,16 @@ {{ helpers.conspirate() }} {% endblock %} ''', -'master.html': u'''\ +'master.html': '''\ {{ title }} {% block body %}{% endblock %} ''', -'helpers.html': u'''\ +'helpers.html': '''\ {% macro conspirate() %}23{% endmacro %} ''' })) tmpl = env.get_template("child.html") -print tmpl.render() +print(tmpl.render()) diff --git a/ambari-common/src/main/python/ambari_jinja2/examples/basic/test_filter_and_linestatements.py b/ambari-common/src/main/python/ambari_jinja2/examples/basic/test_filter_and_linestatements.py index 975f74c5f36..52e10c392a3 100644 --- a/ambari-common/src/main/python/ambari_jinja2/examples/basic/test_filter_and_linestatements.py +++ b/ambari-common/src/main/python/ambari_jinja2/examples/basic/test_filter_and_linestatements.py @@ -22,4 +22,4 @@ % endfilter """) -print tmpl.render(seq=range(10)) +print(tmpl.render(seq=range(10))) diff --git a/ambari-common/src/main/python/ambari_jinja2/examples/basic/test_loop_filter.py b/ambari-common/src/main/python/ambari_jinja2/examples/basic/test_loop_filter.py index 051ca42797c..852add9bf8b 100644 --- a/ambari-common/src/main/python/ambari_jinja2/examples/basic/test_loop_filter.py +++ b/ambari-common/src/main/python/ambari_jinja2/examples/basic/test_loop_filter.py @@ -9,4 +9,4 @@ if condition: {{ 1 if foo else 0 }} """) -print tmpl.render(foo=True) +print(tmpl.render(foo=True)) diff --git a/ambari-common/src/main/python/ambari_jinja2/examples/basic/translate.py b/ambari-common/src/main/python/ambari_jinja2/examples/basic/translate.py index 7bada71703d..9ec5b976cae 100644 --- a/ambari-common/src/main/python/ambari_jinja2/examples/basic/translate.py +++ b/ambari-common/src/main/python/ambari_jinja2/examples/basic/translate.py @@ -1,6 +1,6 @@ from ambari_jinja2 import Environment -print Environment(extensions=['ambari_jinja2.i18n.TransExtension']).from_string("""\ +print(Environment(extensions=['ambari_jinja2.i18n.TransExtension']).from_string("""\ {% trans %}Hello {{ user }}!{% endtrans %} {% trans count=users|count %}{{ count }} user{% pluralize %}{{ count }} users{% endtrans %} -""").render(user="someone") +""").render(user="someone")) diff --git a/ambari-common/src/main/python/ambari_jinja2/examples/bench.py b/ambari-common/src/main/python/ambari_jinja2/examples/bench.py index 0f4f982026e..a61074b9eee 100644 --- a/ambari-common/src/main/python/ambari_jinja2/examples/bench.py +++ b/ambari-common/src/main/python/ambari_jinja2/examples/bench.py @@ -248,7 +248,7 @@ def test_genshi(): """, searchList=[dict(context)]) def test_cheetah(): - unicode(cheetah_template) + str(cheetah_template) try: import tenjin diff --git a/ambari-common/src/main/python/ambari_jinja2/examples/profile.py b/ambari-common/src/main/python/ambari_jinja2/examples/profile.py index 33de2a082f4..4b452277817 100644 --- a/ambari-common/src/main/python/ambari_jinja2/examples/profile.py +++ b/ambari-common/src/main/python/ambari_jinja2/examples/profile.py @@ -42,7 +42,7 @@ variable_start_string="${", variable_end_string="}" ).from_string(source) -print jinja_template.environment.compile(source, raw=True) +print(jinja_template.environment.compile(source, raw=True)) p = Profile() diff --git a/ambari-common/src/main/python/ambari_jinja2/examples/rwbench/rwbench.py b/ambari-common/src/main/python/ambari_jinja2/examples/rwbench/rwbench.py index 35c7a1dbb18..1d3854ed169 100644 --- a/ambari-common/src/main/python/ambari_jinja2/examples/rwbench/rwbench.py +++ b/ambari-common/src/main/python/ambari_jinja2/examples/rwbench/rwbench.py @@ -56,7 +56,7 @@ def __init__(self, username): self.username = username -users = map(User, [u'John Doe', u'Jane Doe', u'Peter Somewhat']) +users = map(User, ['John Doe', 'Jane Doe', 'Peter Somewhat']) articles = map(Article, range(20)) navigation = [ ('index', 'Index'), @@ -104,7 +104,7 @@ def test_genshi(): sys.stdout.write('\r %-20s%.4f seconds\n' % (test, t.timeit(number=200) / 200)) if '-p' in sys.argv: - print 'Jinja profile' + print('Jinja profile') p = Profile() p.runcall(test_jinja) stats = Stats(p) diff --git a/ambari-common/src/main/python/ambari_jinja2/ext/django2jinja/django2jinja.py b/ambari-common/src/main/python/ambari_jinja2/ext/django2jinja/django2jinja.py index d2f3b0d6c14..6418b1e2fed 100644 --- a/ambari-common/src/main/python/ambari_jinja2/ext/django2jinja/django2jinja.py +++ b/ambari-common/src/main/python/ambari_jinja2/ext/django2jinja/django2jinja.py @@ -78,7 +78,7 @@ def write_my_node(writer, node): TOKEN_VAR from django.template.debug import DebugVariableNode as VariableNode from django.templatetags import i18n as i18n_tags -from StringIO import StringIO +from io import StringIO _node_handlers = {} @@ -128,7 +128,7 @@ def translate(f, loadname): if callback is None: def callback(template): - print template + print(template) for directory in settings.TEMPLATE_DIRS: for dirname, _, files in os.walk(directory): @@ -308,7 +308,7 @@ def warn(self, message, node=None): if node is not None and hasattr(node, 'source'): filename, lineno = self.get_location(*node.source) message = '[%s:%d] %s' % (filename, lineno, message) - print >> self.error_stream, message + print(message, file=self.error_stream) def translate_variable_name(self, var): """Performs variable name translation.""" @@ -328,13 +328,13 @@ def get_filter_name(self, filter): """ if filter not in _resolved_filters: for library in libraries.values(): - for key, value in library.filters.iteritems(): + for key, value in library.filters.items(): _resolved_filters[value] = key return _resolved_filters.get(filter, None) def node(self, node): """Invokes the node handler for a node.""" - for cls, handler in self.node_handlers.iteritems(): + for cls, handler in self.node_handlers.items(): if type(node) is cls or type(node).__name__ == cls: handler(self, node) break diff --git a/ambari-common/src/main/python/ambari_jinja2/ext/djangojinja2.py b/ambari-common/src/main/python/ambari_jinja2/ext/djangojinja2.py index 90324005e0a..93c364ecf96 100644 --- a/ambari-common/src/main/python/ambari_jinja2/ext/djangojinja2.py +++ b/ambari-common/src/main/python/ambari_jinja2/ext/djangojinja2.py @@ -53,7 +53,7 @@ def get_template(template_name, globals=None): """Load a template.""" try: return get_env().get_template(template_name, globals=globals) - except TemplateNotFound, e: + except TemplateNotFound as e: raise TemplateDoesNotExist(str(e)) diff --git a/ambari-common/src/main/python/ambari_jinja2/jinja2-debug.py b/ambari-common/src/main/python/ambari_jinja2/jinja2-debug.py index f8d55713517..21358726f87 100644 --- a/ambari-common/src/main/python/ambari_jinja2/jinja2-debug.py +++ b/ambari-common/src/main/python/ambari_jinja2/jinja2-debug.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Jinja2 Debug Interface @@ -18,7 +18,7 @@ def shell_init_func(): def _compile(x): - print env.compile(x, raw=True) + print(env.compile(x, raw=True)) result = { 'e': env, 'c': _compile, @@ -31,7 +31,7 @@ def _compile(x): def action_compile(): - print env.compile(sys.stdin.read(), raw=True) + print(env.compile(sys.stdin.read(), raw=True)) action_shell = script.make_shell(shell_init_func) diff --git a/ambari-common/src/main/python/ambari_pbkdf2/pbkdf2.py b/ambari-common/src/main/python/ambari_pbkdf2/pbkdf2.py index 937a99a5cc7..7ca849242f2 100644 --- a/ambari-common/src/main/python/ambari_pbkdf2/pbkdf2.py +++ b/ambari-common/src/main/python/ambari_pbkdf2/pbkdf2.py @@ -1,4 +1,4 @@ -#!/usr/bin/python +#!/usr/bin/python3 # -*- coding: ascii -*- ########################################################################### # pbkdf2 - PKCS#5 v2.0 Password-Based Key Derivation @@ -74,13 +74,13 @@ # if sys.version_info[0] == 2: - _0xffffffffL = long(1) << 32 + _0xffffffffL = int(1) << 32 def isunicode(s): - return isinstance(s, unicode) + return isinstance(s, str) def isbytes(s): return isinstance(s, str) def isinteger(n): - return isinstance(n, (int, long)) + return isinstance(n, int) def b(s): return s def binxor(a, b): @@ -172,7 +172,7 @@ def __f(self, i): assert 1 <= i <= _0xffffffffL U = self.__prf(self.__passphrase, self.__salt + pack("!L", i)) result = U - for j in xrange(2, 1+self.__iterations): + for j in range(2, 1+self.__iterations): U = self.__prf(self.__passphrase, U) result = binxor(result, U) return result diff --git a/ambari-common/src/main/python/ambari_pyaes/aes.py b/ambari-common/src/main/python/ambari_pyaes/aes.py index c6e8bc02a89..4ebb7eddc37 100644 --- a/ambari-common/src/main/python/ambari_pyaes/aes.py +++ b/ambari-common/src/main/python/ambari_pyaes/aes.py @@ -136,19 +136,19 @@ def __init__(self, key): rounds = self.number_of_rounds[len(key)] # Encryption round keys - self._Ke = [[0] * 4 for i in xrange(rounds + 1)] + self._Ke = [[0] * 4 for i in range(rounds + 1)] # Decryption round keys - self._Kd = [[0] * 4 for i in xrange(rounds + 1)] + self._Kd = [[0] * 4 for i in range(rounds + 1)] round_key_count = (rounds + 1) * 4 KC = len(key) // 4 # Convert the key into ints - tk = [ struct.unpack('>i', key[i:i + 4])[0] for i in xrange(0, len(key), 4) ] + tk = [ struct.unpack('>i', key[i:i + 4])[0] for i in range(0, len(key), 4) ] # Copy values into round key arrays - for i in xrange(0, KC): + for i in range(0, KC): self._Ke[i // 4][i % 4] = tk[i] self._Kd[rounds - (i // 4)][i % 4] = tk[i] @@ -166,12 +166,12 @@ def __init__(self, key): rconpointer += 1 if KC != 8: - for i in xrange(1, KC): + for i in range(1, KC): tk[i] ^= tk[i - 1] # Key expansion for 256-bit keys is "slightly different" (fips-197) else: - for i in xrange(1, KC // 2): + for i in range(1, KC // 2): tk[i] ^= tk[i - 1] tt = tk[KC // 2 - 1] @@ -180,7 +180,7 @@ def __init__(self, key): (self.S[(tt >> 16) & 0xFF] << 16) ^ (self.S[(tt >> 24) & 0xFF] << 24)) - for i in xrange(KC // 2 + 1, KC): + for i in range(KC // 2 + 1, KC): tk[i] ^= tk[i - 1] # Copy values into round key arrays @@ -192,8 +192,8 @@ def __init__(self, key): t += 1 # Inverse-Cipher-ify the decryption round key (fips-197 section 5.3) - for r in xrange(1, rounds): - for j in xrange(0, 4): + for r in range(1, rounds): + for j in range(0, 4): tt = self._Kd[r][j] self._Kd[r][j] = (self.U1[(tt >> 24) & 0xFF] ^ self.U2[(tt >> 16) & 0xFF] ^ @@ -211,11 +211,11 @@ def encrypt(self, plaintext): a = [0, 0, 0, 0] # Convert plaintext to (ints ^ key) - t = [(_compact_word(plaintext[4 * i:4 * i + 4]) ^ self._Ke[0][i]) for i in xrange(0, 4)] + t = [(_compact_word(plaintext[4 * i:4 * i + 4]) ^ self._Ke[0][i]) for i in range(0, 4)] # Apply round transforms - for r in xrange(1, rounds): - for i in xrange(0, 4): + for r in range(1, rounds): + for i in range(0, 4): a[i] = (self.T1[(t[ i ] >> 24) & 0xFF] ^ self.T2[(t[(i + s1) % 4] >> 16) & 0xFF] ^ self.T3[(t[(i + s2) % 4] >> 8) & 0xFF] ^ @@ -225,7 +225,7 @@ def encrypt(self, plaintext): # The last round is special result = [ ] - for i in xrange(0, 4): + for i in range(0, 4): tt = self._Ke[rounds][i] result.append((self.S[(t[ i ] >> 24) & 0xFF] ^ (tt >> 24)) & 0xFF) result.append((self.S[(t[(i + s1) % 4] >> 16) & 0xFF] ^ (tt >> 16)) & 0xFF) @@ -245,11 +245,11 @@ def decrypt(self, ciphertext): a = [0, 0, 0, 0] # Convert ciphertext to (ints ^ key) - t = [(_compact_word(ciphertext[4 * i:4 * i + 4]) ^ self._Kd[0][i]) for i in xrange(0, 4)] + t = [(_compact_word(ciphertext[4 * i:4 * i + 4]) ^ self._Kd[0][i]) for i in range(0, 4)] # Apply round transforms - for r in xrange(1, rounds): - for i in xrange(0, 4): + for r in range(1, rounds): + for i in range(0, 4): a[i] = (self.T5[(t[ i ] >> 24) & 0xFF] ^ self.T6[(t[(i + s1) % 4] >> 16) & 0xFF] ^ self.T7[(t[(i + s2) % 4] >> 8) & 0xFF] ^ @@ -259,7 +259,7 @@ def decrypt(self, ciphertext): # The last round is special result = [ ] - for i in xrange(0, 4): + for i in range(0, 4): tt = self._Kd[rounds][i] result.append((self.Si[(t[ i ] >> 24) & 0xFF] ^ (tt >> 24)) & 0xFF) result.append((self.Si[(t[(i + s1) % 4] >> 16) & 0xFF] ^ (tt >> 16)) & 0xFF) @@ -278,14 +278,14 @@ class Counter(object): def __init__(self, initial_value = 1): # Convert the value into an array of bytes long - self._counter = [ ((initial_value >> i) % 256) for i in xrange(128 - 8, -1, -8) ] + self._counter = [ ((initial_value >> i) % 256) for i in range(128 - 8, -1, -8) ] value = property(lambda s: s._counter) def increment(self): '''Increment the counter (overflow rolls back to 0).''' - for i in xrange(len(self._counter) - 1, -1, -1): + for i in range(len(self._counter) - 1, -1, -1): self._counter[i] += 1 if self._counter[i] < 256: break @@ -443,7 +443,7 @@ def encrypt(self, plaintext): # Break block into segments encrypted = [ ] - for i in xrange(0, len(plaintext), self._segment_bytes): + for i in range(0, len(plaintext), self._segment_bytes): plaintext_segment = plaintext[i: i + self._segment_bytes] xor_segment = self._aes.encrypt(self._shift_register)[:len(plaintext_segment)] cipher_segment = [ (p ^ x) for (p, x) in zip(plaintext_segment, xor_segment) ] @@ -463,7 +463,7 @@ def decrypt(self, ciphertext): # Break block into segments decrypted = [ ] - for i in xrange(0, len(ciphertext), self._segment_bytes): + for i in range(0, len(ciphertext), self._segment_bytes): cipher_segment = ciphertext[i: i + self._segment_bytes] xor_segment = self._aes.encrypt(self._shift_register)[:len(cipher_segment)] plaintext_segment = [ (p ^ x) for (p, x) in zip(cipher_segment, xor_segment) ] diff --git a/ambari-common/src/main/python/ambari_simplejson/__init__.py b/ambari-common/src/main/python/ambari_simplejson/__init__.py index 8e024ece157..152ad451ed0 100644 --- a/ambari-common/src/main/python/ambari_simplejson/__init__.py +++ b/ambari-common/src/main/python/ambari_simplejson/__init__.py @@ -117,7 +117,7 @@ '{"count":1}\n{"count":2}\n{"count":3}\n' """ -from __future__ import absolute_import + __version__ = '3.16.1' __all__ = [ 'dump', 'dumps', 'load', 'loads', diff --git a/ambari-common/src/main/python/ambari_simplejson/decoder.py b/ambari-common/src/main/python/ambari_simplejson/decoder.py index cebf5dc91a8..33fcf1cc76a 100644 --- a/ambari-common/src/main/python/ambari_simplejson/decoder.py +++ b/ambari-common/src/main/python/ambari_simplejson/decoder.py @@ -1,11 +1,11 @@ """Implementation of JSONDecoder """ -from __future__ import absolute_import + import re import sys import struct -from .compat import PY3, unichr -from .scanner import make_scanner, JSONDecodeError +from ambari_simplejson.compat import PY3, unichr +from ambari_simplejson.scanner import make_scanner, JSONDecodeError def _import_c_scanstring(): @@ -48,14 +48,14 @@ def _floatconstants(): STRINGCHUNK = re.compile(r'(.*?)(["\\\x00-\x1f])', FLAGS) BACKSLASH = { - '"': u'"', '\\': u'\\', '/': u'/', - 'b': u'\b', 'f': u'\f', 'n': u'\n', 'r': u'\r', 't': u'\t', + '"': '"', '\\': '\\', '/': '/', + 'b': '\b', 'f': '\f', 'n': '\n', 'r': '\r', 't': '\t', } DEFAULT_ENCODING = "utf-8" def py_scanstring(s, end, encoding=None, strict=True, - _b=BACKSLASH, _m=STRINGCHUNK.match, _join=u''.join, + _b=BACKSLASH, _m=STRINGCHUNK.match, _join=''.join, _PY3=PY3, _maxunicode=sys.maxunicode): """Scan the string s for a JSON string. End is the index of the character in s after the quote that started the JSON string. @@ -79,8 +79,8 @@ def py_scanstring(s, end, encoding=None, strict=True, content, terminator = chunk.groups() # Content is contains zero or more unescaped string characters if content: - if not _PY3 and not isinstance(content, unicode): - content = unicode(content, encoding) + if not _PY3 and not isinstance(content, str): + content = str(content, encoding) _append(content) # Terminator is the end of string, a literal control character, # or a backslash denoting that an escape sequence follows @@ -135,7 +135,7 @@ def py_scanstring(s, end, encoding=None, strict=True, uni = 0x10000 + (((uni - 0xd800) << 10) | (uni2 - 0xdc00)) end += 6 - char = unichr(uni) + char = chr(uni) # Append the unescaped character _append(char) return _join(chunks), end diff --git a/ambari-common/src/main/python/ambari_simplejson/encoder.py b/ambari-common/src/main/python/ambari_simplejson/encoder.py index 4c69e73427f..de14a30d637 100644 --- a/ambari-common/src/main/python/ambari_simplejson/encoder.py +++ b/ambari-common/src/main/python/ambari_simplejson/encoder.py @@ -1,15 +1,15 @@ """Implementation of JSONEncoder """ -from __future__ import absolute_import + import re from operator import itemgetter # Do not import Decimal directly to avoid reload issues import decimal -from .compat import unichr, binary_type, text_type, string_types, integer_types, PY3 +from ambari_simplejson.compat import unichr, binary_type, text_type, string_types, integer_types, PY3 def _import_speedups(): - from . import c_extension + from ambari_simplejson import c_extension _speedups = c_extension.get() if _speedups: @@ -23,8 +23,8 @@ def _import_speedups(): c_encode_basestring_ascii, c_make_encoder = _import_speedups() -from .decoder import PosInf -from .raw_json import RawJSON +from ambari_simplejson.decoder import PosInf +from ambari_simplejson.raw_json import RawJSON ESCAPE = re.compile(r'[\x00-\x1f\\"]') ESCAPE_ASCII = re.compile(r'([\\"]|[^\ -~])') @@ -44,7 +44,7 @@ def _import_speedups(): FLOAT_REPR = repr -def encode_basestring(s, _PY3=PY3, _q=u'"'): +def encode_basestring(s, _PY3=PY3, _q='"'): """Return a JSON representation of a Python string """ @@ -305,10 +305,7 @@ def encode(self, o): chunks = self.iterencode(o, _one_shot=True) if not isinstance(chunks, (list, tuple)): chunks = list(chunks) - if self.ensure_ascii: - return ''.join(chunks) - else: - return u''.join(chunks) + return ''.join(chunks) def iterencode(self, o, _one_shot=False): """Encode the given object and yield each string @@ -407,10 +404,7 @@ def encode(self, o): # Override JSONEncoder.encode because it has hacks for # performance that make things more complicated. chunks = self.iterencode(o, True) - if self.ensure_ascii: - return ''.join(chunks) - else: - return u''.join(chunks) + return ''.join(chunks) def iterencode(self, o, _one_shot=False): chunks = super(JSONEncoderForHTML, self).iterencode(o, _one_shot) @@ -420,8 +414,8 @@ def iterencode(self, o, _one_shot=False): chunk = chunk.replace('>', '\\u003e') if not self.ensure_ascii: - chunk = chunk.replace(u'\u2028', '\\u2028') - chunk = chunk.replace(u'\u2029', '\\u2029') + chunk = chunk.replace('\u2028', '\\u2028') + chunk = chunk.replace('\u2029', '\\u2029') yield chunk diff --git a/ambari-common/src/main/python/ambari_simplejson/ordered_dict.py b/ambari-common/src/main/python/ambari_simplejson/ordered_dict.py index d5a55ebd0f7..2c9d213b329 100644 --- a/ambari-common/src/main/python/ambari_simplejson/ordered_dict.py +++ b/ambari-common/src/main/python/ambari_simplejson/ordered_dict.py @@ -52,7 +52,7 @@ def __reversed__(self): def popitem(self, last=True): if not self: raise KeyError('dictionary is empty') - key = reversed(self).next() if last else iter(self).next() + key = next(reversed(self)) if last else next(iter(self)) value = self.pop(key) return key, value diff --git a/ambari-common/src/main/python/ambari_stomp/__main__.py b/ambari-common/src/main/python/ambari_stomp/__main__.py index fb90de5cd95..2fc1c36ec84 100644 --- a/ambari-common/src/main/python/ambari_stomp/__main__.py +++ b/ambari-common/src/main/python/ambari_stomp/__main__.py @@ -27,7 +27,7 @@ try: import uuid except ImportError: - from backward import uuid + from .backward import uuid class SubscriptionInfo(object): diff --git a/ambari-common/src/main/python/ambari_stomp/adapter/websocket.py b/ambari-common/src/main/python/ambari_stomp/adapter/websocket.py index ad61866b0fd..7b9dd29229b 100644 --- a/ambari-common/src/main/python/ambari_stomp/adapter/websocket.py +++ b/ambari-common/src/main/python/ambari_stomp/adapter/websocket.py @@ -19,7 +19,7 @@ import copy import logging -from Queue import Queue +from queue import Queue from ambari_stomp.connect import BaseConnection from ambari_stomp.protocol import Protocol12 @@ -89,7 +89,7 @@ def attempt_connection(self): self.ws.connect() def send(self, encoded_frame): - logger.debug("Outgoing STOMP message:\n>>> " + encoded_frame) + logger.debug("Outgoing STOMP message:\n>>> " + encoded_frame.decode()) if self.ws.terminated: raise ConnectionIsAlreadyClosed("Connection is already closed cannot send data") diff --git a/ambari-common/src/main/python/ambari_stomp/backward2.py b/ambari-common/src/main/python/ambari_stomp/backward2.py index aec5f2eb340..80bf6b886df 100644 --- a/ambari-common/src/main/python/ambari_stomp/backward2.py +++ b/ambari-common/src/main/python/ambari_stomp/backward2.py @@ -11,7 +11,7 @@ def input_prompt(prompt): :rtype: str """ - return raw_input(prompt) + return input(prompt) def decode(byte_data): @@ -33,7 +33,7 @@ def encode(char_data): :rtype: bytes """ - if type(char_data) is unicode: + if type(char_data) is str: return char_data.encode('utf-8') else: return char_data diff --git a/ambari-common/src/main/python/ambari_stomp/backwardsock25.py b/ambari-common/src/main/python/ambari_stomp/backwardsock25.py index 0a9279b4036..8306d756912 100644 --- a/ambari-common/src/main/python/ambari_stomp/backwardsock25.py +++ b/ambari-common/src/main/python/ambari_stomp/backwardsock25.py @@ -25,8 +25,8 @@ def get_socket(host, port, timeout=None): sock.connect(sa) return sock - except error, msg: + except error as msg: if sock is not None: sock.close() - raise error, ERRMSG + raise error(ERRMSG) diff --git a/ambari-common/src/main/python/ambari_stomp/colors.py b/ambari-common/src/main/python/ambari_stomp/colors.py index dc571446c7c..65d24b123f4 100644 --- a/ambari-common/src/main/python/ambari_stomp/colors.py +++ b/ambari-common/src/main/python/ambari_stomp/colors.py @@ -1,7 +1,7 @@ """Color 'constants' used by the command line client. """ -import platform +import distro as platform if platform.system().lower() != 'windows': diff --git a/ambari-common/src/main/python/ambari_stomp/transport.py b/ambari-common/src/main/python/ambari_stomp/transport.py index 0896ef26b0f..d79f0940758 100644 --- a/ambari-common/src/main/python/ambari_stomp/transport.py +++ b/ambari-common/src/main/python/ambari_stomp/transport.py @@ -377,7 +377,7 @@ def __read(self): c = b'' if c is None or len(c) == 0: raise exception.ConnectionClosedException() - if c == b'\x0a' and not self.__recvbuf and not fastbuf.tell(): + if c.encode() == b'\x0a' and not self.__recvbuf and not fastbuf.tell(): # # EOL to an empty receive buffer: treat as heartbeat. # Note that this may misdetect an optional EOL at end of frame as heartbeat in case the @@ -385,9 +385,9 @@ def __read(self): # last byte of that read. But that should be harmless in practice. # fastbuf.close() - return [c] - fastbuf.write(c) - if b'\x00' in c: + return [c.encode()] + fastbuf.write(c.encode()) + if b'\x00' in c.encode(): # # Possible end of frame # diff --git a/ambari-common/src/main/python/ambari_ws4py/compat.py b/ambari-common/src/main/python/ambari_ws4py/compat.py index e986e338a13..5d19699a06d 100644 --- a/ambari-common/src/main/python/ambari_ws4py/compat.py +++ b/ambari-common/src/main/python/ambari_ws4py/compat.py @@ -33,7 +33,7 @@ def ord(c): return _ord(c) else: py3k = False - from urlparse import urlsplit + from urllib.parse import urlsplit range = xrange unicode = unicode basestring = basestring diff --git a/ambari-common/src/main/python/pluggable_stack_definition/GenerateStackDefinition.py b/ambari-common/src/main/python/pluggable_stack_definition/GenerateStackDefinition.py index d068d1fed3d..08fba91cf30 100644 --- a/ambari-common/src/main/python/pluggable_stack_definition/GenerateStackDefinition.py +++ b/ambari-common/src/main/python/pluggable_stack_definition/GenerateStackDefinition.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -49,7 +49,7 @@ def repl_list(_list): return _list dict.__init__(self, _dict) - for key, value in self.iteritems(): + for key, value in self.items(): if isinstance(value, dict): self[key] = _named_dict(value) if isinstance(value, list): @@ -117,18 +117,18 @@ def process_replacements(file_path, config_data, stack_version_changes): # it can be dangerous to replace versions in xml files, because it can be a part of version of some package or service # eg 2.1.2.1 with stack version change 2.1->3.0 will result in 3.0.3.0 if not file_path.endswith(".xml"): - for _from, _to in stack_version_changes.iteritems(): + for _from, _to in stack_version_changes.items(): file_data = file_data.replace(_from, _to) file_data = process_version_replace(file_data, _from, _to) # preform common replacements if 'performCommonReplacements' in config_data and config_data.performCommonReplacements: - for from_version, to_version in stack_version_changes.iteritems(): + for from_version, to_version in stack_version_changes.items(): file_data = file_data.replace('HDP-'+from_version, config_data.stackName+"-"+to_version) file_data = file_data.replace('HDP '+from_version, config_data.stackName+" "+to_version) file_data = file_data.replace('hdp', config_data.stackName.lower()) file_data = file_data.replace('HDP', config_data.stackName) if preserved_map: - for _from, _to in preserved_map.iteritems(): + for _from, _to in preserved_map.items(): file_data = file_data.replace(_from, _to) with open(file_path, "w") as target: target.write(file_data.encode('utf-8')) @@ -237,7 +237,7 @@ def process_metainfo(file_path, config_data, stack_version_changes, common_servi for package in item['packages']: package_tag = ET.SubElement(packages_tag, 'package') name_tag = ET.SubElement(package_tag, 'name') - if isinstance(package, basestring): + if isinstance(package, str): name_tag.text = package else: name_tag.text = package['name'] @@ -315,7 +315,7 @@ def process_repoinfo_xml(file_path, config_data, stack_version_changes, stack): latest_tag = ET.SubElement(root, 'latest') latest_tag.text = stack.repoinfo.latest if 'os' in stack.repoinfo: - for family, repos in stack.repoinfo.os.iteritems(): + for family, repos in stack.repoinfo.os.items(): os_tag = ET.SubElement(root, 'os') os_tag.set('family', family) for repo in repos: @@ -656,11 +656,11 @@ def main(argv): try: opts, args = getopt.getopt(argv, "hc:o:r:", ["config=", "out=", "resources="]) except getopt.GetoptError: - print HELP_STRING + print(HELP_STRING) sys.exit(2) for opt, arg in opts: if opt == '-h': - print HELP_STRING + print(HELP_STRING) sys.exit() elif opt in ("-c", "--config"): config = arg @@ -669,7 +669,7 @@ def main(argv): elif opt in ("-o", "--out"): output_folder = arg if not config or not resources_folder or not output_folder: - print HELP_STRING + print(HELP_STRING) sys.exit(2) config_data = _named_dict(json.load(open(config, "r"))) diff --git a/ambari-common/src/main/python/resource_management/__init__.py b/ambari-common/src/main/python/resource_management/__init__.py index fee91fd3ae2..156d03cd728 100644 --- a/ambari-common/src/main/python/resource_management/__init__.py +++ b/ambari-common/src/main/python/resource_management/__init__.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-common/src/main/python/resource_management/core/__init__.py b/ambari-common/src/main/python/resource_management/core/__init__.py index 3a63dab9f7f..ec9e0d41854 100644 --- a/ambari-common/src/main/python/resource_management/core/__init__.py +++ b/ambari-common/src/main/python/resource_management/core/__init__.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-common/src/main/python/resource_management/core/base.py b/ambari-common/src/main/python/resource_management/core/base.py index b8628538c4a..b7357a278d9 100644 --- a/ambari-common/src/main/python/resource_management/core/base.py +++ b/ambari-common/src/main/python/resource_management/core/base.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -107,9 +107,7 @@ def __init__(mcs, _name, bases, attrs): setattr(mcs, key, Accessor(key)) -class Resource(object): - __metaclass__ = ResourceMetaclass - +class Resource(object, metaclass=ResourceMetaclass): action = ForcedListArgument(default="nothing") ignore_failures = BooleanArgument(default=False) not_if = ResourceArgument() # pass command e.g. not_if = ('ls','/root/jdk') @@ -159,7 +157,7 @@ def __init__(self, name, env=None, provider=None, **kwargs): else: try: self.arguments[key] = arg.validate(value) - except InvalidArgument, exc: + except InvalidArgument as exc: raise InvalidArgument("%s %s" % (self, exc)) if not self.env.test_mode: @@ -169,10 +167,10 @@ def validate(self): pass def __repr__(self): - return unicode(self) + return str(self) - def __unicode__(self): - return u"%s[%s]" % (self.__class__.__name__, Logger._get_resource_name_repr(self.name)) + def __str__(self): + return "%s[%s]" % (self.__class__.__name__, Logger._get_resource_name_repr(self.name)) def __getstate__(self): return dict( diff --git a/ambari-common/src/main/python/resource_management/core/encryption.py b/ambari-common/src/main/python/resource_management/core/encryption.py index 956f0b89b16..1fe6e2ab743 100644 --- a/ambari-common/src/main/python/resource_management/core/encryption.py +++ b/ambari-common/src/main/python/resource_management/core/encryption.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -30,13 +30,13 @@ def ensure_decrypted(value, encryption_key=None): return value def decrypt(encrypted_value, encryption_key): - salt, iv, data = [each.decode('hex') for each in encrypted_value.decode('hex').split('::')] + salt, iv, data = [bytes.fromhex(each) for each in bytes.fromhex(encrypted_value).decode().split('::')] key = PBKDF2(encryption_key, salt, iterations=65536).read(16) aes = ambari_pyaes.AESModeOfOperationCBC(key, iv=iv) return ambari_pyaes.util.strip_PKCS7_padding(aes.decrypt(data)) def is_encrypted(value): - return isinstance(value, basestring) and value.startswith('${enc=aes256_hex, value=') # XXX: ideally it shouldn't be hardcoded but currently only one enc type is supported + return isinstance(value, str) and value.startswith('${enc=aes256_hex, value=') # XXX: ideally it shouldn't be hardcoded but currently only one enc type is supported def encrypted_value(value): return value.split('value=')[1][:-1] diff --git a/ambari-common/src/main/python/resource_management/core/environment.py b/ambari-common/src/main/python/resource_management/core/environment.py index 278b54da19b..02f2e5db52b 100644 --- a/ambari-common/src/main/python/resource_management/core/environment.py +++ b/ambari-common/src/main/python/resource_management/core/environment.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -80,7 +80,7 @@ def reset(self, basedir, test_mode, tmp_dir): def backup_file(self, path): if self.config.backup: if not os.path.exists(self.config.backup.path): - os.makedirs(self.config.backup.path, 0700) + os.makedirs(self.config.backup.path, 0o700) new_name = self.config.backup.prefix + path.replace('/', '-') backup_path = os.path.join(self.config.backup.path, new_name) Logger.info("backing up %s to %s" % (path, backup_path)) @@ -106,13 +106,16 @@ def set_params(self, arg): else: variables = dict((var, getattr(arg, var)) for var in dir(arg)) - for variable, value in variables.iteritems(): + for variable, value in list(variables.items()): # don't include system variables, methods, classes, modules - if not variable.startswith("__") and \ - not hasattr(value, '__call__')and \ - not hasattr(value, '__file__'): - self.config.params[variable] = value - + try: + if not variable.startswith("__") and \ + not hasattr(value, '__call__')and \ + not hasattr(value, '__file__'): + self.config.params[variable] = value + except Exception as e: + Logger.info("Skipping param: {0}, due to {1}".format(variable, e)) + def run_action(self, resource, action): provider_class = find_provider(self, resource.__class__.__name__, resource.provider) @@ -124,13 +127,13 @@ def run_action(self, resource, action): provider_action() def _check_condition(self, cond): - if type(cond) == types.BooleanType: + if type(cond) == bool: return cond if hasattr(cond, '__call__'): return cond() - if isinstance(cond, basestring): + if isinstance(cond, str): ret, out = shell.call(cond) return ret == 0 @@ -162,7 +165,7 @@ def run(self): try: self.run_action(resource, action) except Exception as ex: - Logger.info("Skipping failure of {0} due to ignore_failures. Failure reason: {1}".format(resource, ex.message)) + Logger.info("Skipping failure of {0} due to ignore_failures. Failure reason: {1}".format(resource, ex)) pass # Run delayed actions diff --git a/ambari-common/src/main/python/resource_management/core/exceptions.py b/ambari-common/src/main/python/resource_management/core/exceptions.py index a59611d1339..114c2865ebb 100644 --- a/ambari-common/src/main/python/resource_management/core/exceptions.py +++ b/ambari-common/src/main/python/resource_management/core/exceptions.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-common/src/main/python/resource_management/core/global_lock.py b/ambari-common/src/main/python/resource_management/core/global_lock.py index 72904c89293..6933c55d152 100644 --- a/ambari-common/src/main/python/resource_management/core/global_lock.py +++ b/ambari-common/src/main/python/resource_management/core/global_lock.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-common/src/main/python/resource_management/core/logger.py b/ambari-common/src/main/python/resource_management/core/logger.py index d83e61dbb36..922b587f025 100644 --- a/ambari-common/src/main/python/resource_management/core/logger.py +++ b/ambari-common/src/main/python/resource_management/core/logger.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -101,7 +101,7 @@ def filter_text(text): """ from resource_management.core.shell import PLACEHOLDERS_TO_STR - for unprotected_string, protected_string in Logger.sensitive_strings.iteritems(): + for unprotected_string, protected_string in Logger.sensitive_strings.items(): text = text.replace(unprotected_string, protected_string) for placeholder in PLACEHOLDERS_TO_STR.keys(): @@ -115,7 +115,7 @@ def _get_resource_repr(resource): @staticmethod def _get_resource_name_repr(name): - if isinstance(name, basestring) and not isinstance(name, PasswordString): + if isinstance(name, str) and not isinstance(name, PasswordString): name = "'" + name + "'" # print string cutely not with repr else: name = repr(name) @@ -144,18 +144,18 @@ def format_command_for_output(command): @staticmethod def get_function_repr(name, arguments, resource=None): - logger_level = logging._levelNames[Logger.logger.level] + logger_level = logging._levelToName[Logger.logger.level] arguments_str = "" - for x,y in arguments.iteritems(): + for x,y in arguments.items(): # for arguments which want to override the output if resource and 'log_str' in dir(resource._arguments[x]): val = resource._arguments[x].log_str(x, y) # don't show long arguments - elif isinstance(y, basestring) and len(y) > MESSAGE_MAX_LEN: + elif isinstance(y, str) and len(y) > MESSAGE_MAX_LEN: val = '...' # strip unicode 'u' sign - elif isinstance(y, unicode): + elif isinstance(y, str): val = repr(y).lstrip('u') # don't show dicts of configurations # usually too long @@ -181,4 +181,4 @@ def get_function_repr(name, arguments, resource=None): if arguments_str: arguments_str = arguments_str[:-2] - return unicode("{0} {{{1}}}", 'UTF-8').format(name, arguments_str) + return str("{0} {{{1}}}").format(name, arguments_str) diff --git a/ambari-common/src/main/python/resource_management/core/providers/__init__.py b/ambari-common/src/main/python/resource_management/core/providers/__init__.py index cf8d0a6a484..6c7a256d48d 100644 --- a/ambari-common/src/main/python/resource_management/core/providers/__init__.py +++ b/ambari-common/src/main/python/resource_management/core/providers/__init__.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -35,10 +35,10 @@ def action_nothing(self): pass def __repr__(self): - return self.__unicode__() + return self.__str__() - def __unicode__(self): - return u"%s[%s]" % (self.__class__.__name__, self.resource) + def __str__(self): + return "%s[%s]" % (self.__class__.__name__, self.resource) PROVIDERS = dict( diff --git a/ambari-common/src/main/python/resource_management/core/providers/accounts.py b/ambari-common/src/main/python/resource_management/core/providers/accounts.py index 990169d0326..4995d5c4fdb 100644 --- a/ambari-common/src/main/python/resource_management/core/providers/accounts.py +++ b/ambari-common/src/main/python/resource_management/core/providers/accounts.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -20,7 +20,7 @@ """ -from __future__ import with_statement + import grp import pwd @@ -52,7 +52,7 @@ def action_create(self): creating_user = False command = ['usermod'] - for option_name, attributes in self.options.iteritems(): + for option_name, attributes in self.options.items(): if getattr(self.resource, option_name) != None and getattr(self.resource, option_name) != attributes[0](self): # groups on system contain the one we need if attributes[1] == "-G" and set(getattr(self.resource, option_name)).issubset(set(attributes[0](self))): @@ -66,7 +66,7 @@ def action_create(self): if self.resource.system and not self.user: command.append("--system") - for option_name, attributes in self.options.iteritems(): + for option_name, attributes in self.options.items(): if attributes[1] == "-G": groups = self.resource.groups if self.user and self.user_groups: @@ -145,7 +145,7 @@ def action_create(self): else: command = ['groupmod'] - for option_name, attributes in self.options.iteritems(): + for option_name, attributes in self.options.items(): if getattr(self.resource, option_name) != None and getattr(self.resource, option_name) != attributes[0](self): break else: @@ -153,7 +153,7 @@ def action_create(self): Logger.info("Modifying group %s" % (self.resource.group_name)) - for option_name, attributes in self.options.iteritems(): + for option_name, attributes in self.options.items(): option_value = getattr(self.resource, option_name) if attributes[1] and option_value: command += [attributes[1], str(option_value)] diff --git a/ambari-common/src/main/python/resource_management/core/providers/mount.py b/ambari-common/src/main/python/resource_management/core/providers/mount.py index 1b3358720ac..1f70961b1d3 100644 --- a/ambari-common/src/main/python/resource_management/core/providers/mount.py +++ b/ambari-common/src/main/python/resource_management/core/providers/mount.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -20,11 +20,11 @@ """ -from __future__ import with_statement + import os import re -from ambari_commons.subprocess32 import Popen, PIPE, STDOUT +from subprocess import Popen, PIPE, STDOUT from resource_management.core.base import Fail from resource_management.core.providers import Provider @@ -35,7 +35,7 @@ def get_mounted(): """ :return: Return a list of mount objects (dictionary type) that contain the device, mount point, and other options. """ - p = Popen("mount", stdout=PIPE, stderr=STDOUT, shell=True) + p = Popen("mount", stdout=PIPE, stderr=STDOUT, shell=True, universal_newlines=True) out = p.communicate()[0] if p.wait() != 0: raise Fail("Getting list of mounts (calling mount) failed") diff --git a/ambari-common/src/main/python/resource_management/core/providers/service.py b/ambari-common/src/main/python/resource_management/core/providers/service.py index 66f807602ec..7b521d73497 100644 --- a/ambari-common/src/main/python/resource_management/core/providers/service.py +++ b/ambari-common/src/main/python/resource_management/core/providers/service.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-common/src/main/python/resource_management/core/providers/system.py b/ambari-common/src/main/python/resource_management/core/providers/system.py index e187c07fd9f..6f3ba875d6b 100644 --- a/ambari-common/src/main/python/resource_management/core/providers/system.py +++ b/ambari-common/src/main/python/resource_management/core/providers/system.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -20,7 +20,7 @@ """ -from __future__ import with_statement + import re import os @@ -79,7 +79,7 @@ def _ensure_metadata(path, user, group, mode=None, cd_access=None, recursive_own raise Fail("'recursion_follow_links' value should be a dictionary with 'f' and(or) 'd' key (for file and directory permission flags)") regexp_to_match = "^({0},)*({0})$".format("[ugoa]+[+=-][rwx]+" ) - for key, flags in recursive_mode_flags.iteritems(): + for key, flags in recursive_mode_flags.items(): if key != 'd' and key != 'f': raise Fail("'recursive_mode_flags' with value '%s' has unknown key '%s', only keys 'f' and 'd' are valid" % (str(recursive_mode_flags), str(key))) @@ -160,7 +160,7 @@ def _get_content(self): content = self.resource.content if content is None: return None - elif isinstance(content, basestring): + elif isinstance(content, str) or isinstance(content, bytes): return content elif hasattr(content, "__call__"): return content() @@ -192,18 +192,18 @@ def action_create(self): Logger.info("Following the link {0} to {1} to create the directory".format(self.resource.path, path)) if self.resource.create_parents: - sudo.makedirs(path, self.resource.mode or 0755) + sudo.makedirs(path, self.resource.mode or 0o755) else: dirname = os.path.dirname(path) if not sudo.path_isdir(dirname): raise Fail("Applying %s failed, parent directory %s doesn't exist" % (self.resource, dirname)) try: - sudo.makedir(path, self.resource.mode or 0755) + sudo.makedir(path, self.resource.mode or 0o755) except Exception as ex: # race condition (somebody created the file before us) if "File exists" in str(ex): - sudo.makedirs(path, self.resource.mode or 0755) + sudo.makedirs(path, self.resource.mode or 0o755) else: raise diff --git a/ambari-common/src/main/python/resource_management/core/providers/windows/service.py b/ambari-common/src/main/python/resource_management/core/providers/windows/service.py index 8824ddd3e25..e6de8236e91 100644 --- a/ambari-common/src/main/python/resource_management/core/providers/windows/service.py +++ b/ambari-common/src/main/python/resource_management/core/providers/windows/service.py @@ -34,7 +34,7 @@ def safe_open_scmanager(): try: _schSCManager = win32service.OpenSCManager(None, None, win32service.SC_MANAGER_ALL_ACCESS) - except win32api.error, details: + except win32api.error as details: raise Fail("Error opening Service Control Manager on the local machine: {0}".format(details.winerror)) return _schSCManager @@ -43,7 +43,7 @@ def safe_open_service(hSCM, service_name): try: hSvc = win32serviceutil.SmartOpenService(hSCM, service_name, win32service.SERVICE_ALL_ACCESS) - except win32api.error, details: + except win32api.error as details: if details.winerror == winerror.ERROR_SERVICE_DOES_NOT_EXIST: err_msg = "Invalid service name: {0}".format(service_name) else: @@ -95,7 +95,7 @@ def enable(self): None, None) win32service.CloseServiceHandle(hSvc) - except win32api.error, details: + except win32api.error as details: raise Fail("Error enabling service {0}: {1}".format(self.resource.service_name, details.winerror)) finally: win32service.CloseServiceHandle(hSCM) @@ -145,7 +145,7 @@ def action_install(self): pass ## ChangeServiceConfig2 and description do not exist on NT win32service.CloseServiceHandle(hSvc) - except win32api.error, details: + except win32api.error as details: raise Fail("Error creating service {0}: {1}".format(self.resource.service_name, details.winerror)) finally: win32service.CloseServiceHandle(hSCM) @@ -175,7 +175,7 @@ def action_configure(self): win32service.ChangeServiceConfig2(hSvc, win32service.SERVICE_CONFIG_DESCRIPTION, self.resource.description) except NotImplementedError: pass ## ChangeServiceConfig2 and description do not exist on NT - except win32api.error, details: + except win32api.error as details: raise Fail("Error configuring service {0}: {1}".format(self.resource.service_name, details.winerror)) finally: win32service.CloseServiceHandle(hSvc) @@ -202,7 +202,7 @@ def action_change_user(self): self.resource.username, self.resource.password, None) - except win32api.error, details: + except win32api.error as details: raise Fail("Error changing user for service {0}: {1}".format(self.resource.service_name, details.winerror)) finally: win32service.CloseServiceHandle(hSvc) @@ -216,7 +216,7 @@ def action_uninstall(self): try: hSvc = win32serviceutil.SmartOpenService(hSCM, self.resource.service_name, win32service.SERVICE_ALL_ACCESS) - except win32api.error, details: + except win32api.error as details: if details.winerror == winerror.ERROR_SERVICE_DOES_NOT_EXIST: # Nothing to do return diff --git a/ambari-common/src/main/python/resource_management/core/providers/windows/system.py b/ambari-common/src/main/python/resource_management/core/providers/windows/system.py index b8caa8016c9..ee64250b461 100644 --- a/ambari-common/src/main/python/resource_management/core/providers/windows/system.py +++ b/ambari-common/src/main/python/resource_management/core/providers/windows/system.py @@ -26,7 +26,7 @@ from resource_management.core import ExecuteTimeoutException import time import os -from ambari_commons import subprocess32 +import subprocess import shutil from resource_management.libraries.script import Script import win32con @@ -46,7 +46,7 @@ def _create_tmp_files(env=None): env = os.environ for env_var_name in 'TMPDIR', 'TEMP', 'TMP': - if env.has_key(env_var_name): + if env_var_name in env: dirname = env[env_var_name] if dirname and os.path.exists(dirname): break @@ -103,12 +103,12 @@ def _merge_env(env1, env2, merge_keys=['PYTHONPATH']): """ env1 = dict(env1) # copy to new dict in case env1 is os.environ if env2: - for key, value in env2.iteritems(): + for key, value in env2.items(): if not key in merge_keys: env1[key] = value # strnsform keys and values to str(windows can not accept unicode) result_env = {} - for key, value in env1.iteritems(): + for key, value in env1.items(): if not key in merge_keys: result_env[str(key)] = str(value) #merge keys from merge_keys @@ -210,8 +210,8 @@ def _call_command(command, logoutput=False, cwd=None, env=None, wait_for_finish= cur_token = OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY) current_env = CreateEnvironmentBlock(cur_token, False) current_env = _merge_env(current_env, env) - proc = subprocess32.Popen(command, stdout=subprocess32.PIPE, stderr=subprocess32.STDOUT, - cwd=cwd, env=current_env, shell=False) + proc = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, + cwd=cwd, env=current_env, shell=False, universal_newlines=True) out, err = proc.communicate() code = proc.returncode @@ -285,7 +285,7 @@ def _get_content(self): content = self.resource.content if content is None: return None - elif isinstance(content, basestring): + elif isinstance(content, str): return content elif hasattr(content, "__call__"): return content() diff --git a/ambari-common/src/main/python/resource_management/core/resources/__init__.py b/ambari-common/src/main/python/resource_management/core/resources/__init__.py index d5e903ca34e..89df44e0e3a 100644 --- a/ambari-common/src/main/python/resource_management/core/resources/__init__.py +++ b/ambari-common/src/main/python/resource_management/core/resources/__init__.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-common/src/main/python/resource_management/core/resources/accounts.py b/ambari-common/src/main/python/resource_management/core/resources/accounts.py index fb3f35a1b56..3bff1ebec16 100644 --- a/ambari-common/src/main/python/resource_management/core/resources/accounts.py +++ b/ambari-common/src/main/python/resource_management/core/resources/accounts.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-common/src/main/python/resource_management/core/resources/jcepolicyinfo.py b/ambari-common/src/main/python/resource_management/core/resources/jcepolicyinfo.py index b92aa06dcf9..4d1c5e225a7 100644 --- a/ambari-common/src/main/python/resource_management/core/resources/jcepolicyinfo.py +++ b/ambari-common/src/main/python/resource_management/core/resources/jcepolicyinfo.py @@ -20,7 +20,7 @@ """ from resource_management.core import shell -from ambari_commons import subprocess32 +import subprocess class JcePolicyInfo: @@ -31,5 +31,5 @@ def __init__(self, java_home): def is_unlimited_key_jce_policy(self): ret = shell.call( - self.command_format.format('-tu'), stdout=subprocess32.PIPE, stderr=subprocess32.PIPE, timeout=5, quiet=True)[0] + self.command_format.format('-tu'), stdout=subprocess.PIPE, stderr=subprocess.PIPE, timeout=5, quiet=True)[0] return ret == 0 diff --git a/ambari-common/src/main/python/resource_management/core/resources/klist.py b/ambari-common/src/main/python/resource_management/core/resources/klist.py index ec6fca89747..19a71f2e25b 100644 --- a/ambari-common/src/main/python/resource_management/core/resources/klist.py +++ b/ambari-common/src/main/python/resource_management/core/resources/klist.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-common/src/main/python/resource_management/core/resources/packaging.py b/ambari-common/src/main/python/resource_management/core/resources/packaging.py index 58488b509b8..c0c5429846b 100644 --- a/ambari-common/src/main/python/resource_management/core/resources/packaging.py +++ b/ambari-common/src/main/python/resource_management/core/resources/packaging.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-common/src/main/python/resource_management/core/resources/service.py b/ambari-common/src/main/python/resource_management/core/resources/service.py index 9f963fbb2ac..bc52dd81a60 100644 --- a/ambari-common/src/main/python/resource_management/core/resources/service.py +++ b/ambari-common/src/main/python/resource_management/core/resources/service.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-common/src/main/python/resource_management/core/resources/system.py b/ambari-common/src/main/python/resource_management/core/resources/system.py index 612ed9f6720..f2e7455b47c 100644 --- a/ambari-common/src/main/python/resource_management/core/resources/system.py +++ b/ambari-common/src/main/python/resource_management/core/resources/system.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -22,7 +22,7 @@ __all__ = ["File", "Directory", "Link", "Execute", "ExecuteScript", "Mount"] -from ambari_commons import subprocess32 +import subprocess from resource_management.core.signal_utils import TerminateStrategy from resource_management.core.base import Resource, ForcedListArgument, ResourceArgument, BooleanArgument @@ -231,14 +231,14 @@ class Execute(Resource): """ sudo = BooleanArgument(default=False) """ - subprocess32.PIPE - enable output gathering + subprocess.PIPE - enable output gathering None - disable output to gathering, and output to Python out straightly (even if logoutput is False) - subprocess32.STDOUT - redirect to stdout (not valid as value for stdout agument) + subprocess.STDOUT - redirect to stdout (not valid as value for stdout agument) {int fd} - redirect to file with descriptor. {string filename} - redirects to a file with name. """ - stdout = ResourceArgument(default=subprocess32.PIPE) - stderr = ResourceArgument(default=subprocess32.STDOUT) + stdout = ResourceArgument(default=subprocess.PIPE) + stderr = ResourceArgument(default=subprocess.STDOUT) """ This argument takes TerminateStrategy constants. Import it as shown below: diff --git a/ambari-common/src/main/python/resource_management/core/resources/zkmigrator.py b/ambari-common/src/main/python/resource_management/core/resources/zkmigrator.py index 49fb5e80c8b..40944a317c1 100644 --- a/ambari-common/src/main/python/resource_management/core/resources/zkmigrator.py +++ b/ambari-common/src/main/python/resource_management/core/resources/zkmigrator.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-common/src/main/python/resource_management/core/shell.py b/ambari-common/src/main/python/resource_management/core/shell.py index d815732a3b2..d2a92bf5d2f 100644 --- a/ambari-common/src/main/python/resource_management/core/shell.py +++ b/ambari-common/src/main/python/resource_management/core/shell.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -29,14 +29,15 @@ import sys import logging import string -from ambari_commons import subprocess32 +import subprocess import threading import traceback -from exceptions import Fail, ExecutionFailed, ExecuteTimeoutException +from .exceptions import Fail, ExecutionFailed, ExecuteTimeoutException from resource_management.core.logger import Logger from resource_management.core import utils from ambari_commons.constants import AMBARI_SUDO_BINARY from resource_management.core.signal_utils import TerminateStrategy, terminate_process +from functools import reduce # use quiet=True calls from this folder (logs get too messy duplicating the resources with its commands) NOT_LOGGED_FOLDER = 'resource_management/core' @@ -64,7 +65,7 @@ def inner(command, **kwargs): # logoutput=True - log in INFO level # logouput=None - log in DEBUG level # logouput=not-specified - log in DEBUG level, not counting internal calls - if 'logoutput' in function.func_code.co_varnames: + if 'logoutput' in function.__code__.co_varnames: kwargs['logoutput'] = ('logoutput' in kwargs and kwargs['logoutput'] and Logger.isEnabledFor(logging.INFO)) or \ ('logoutput' in kwargs and kwargs['logoutput']==None and Logger.isEnabledFor(logging.DEBUG)) or \ (not 'logoutput' in kwargs and not is_internal_call and Logger.isEnabledFor(logging.DEBUG)) @@ -88,7 +89,7 @@ def preexec_fn(): raise @log_function_call -def checked_call(command, quiet=False, logoutput=None, stdout=subprocess32.PIPE,stderr=subprocess32.STDOUT, +def checked_call(command, quiet=False, logoutput=None, stdout=subprocess.PIPE,stderr=subprocess.STDOUT, cwd=None, env=None, preexec_fn=preexec_fn, user=None, wait_for_finish=True, timeout=None, on_timeout=None, path=None, sudo=False, on_new_line=None, tries=1, try_sleep=0, timeout_kill_strategy=TerminateStrategy.TERMINATE_PARENT, returns=[0]): """ @@ -102,7 +103,7 @@ def checked_call(command, quiet=False, logoutput=None, stdout=subprocess32.PIPE, tries=tries, try_sleep=try_sleep, timeout_kill_strategy=timeout_kill_strategy, returns=returns) @log_function_call -def call(command, quiet=False, logoutput=None, stdout=subprocess32.PIPE,stderr=subprocess32.STDOUT, +def call(command, quiet=False, logoutput=None, stdout=subprocess.PIPE,stderr=subprocess.STDOUT, cwd=None, env=None, preexec_fn=preexec_fn, user=None, wait_for_finish=True, timeout=None, on_timeout=None, path=None, sudo=False, on_new_line=None, tries=1, try_sleep=0, timeout_kill_strategy=TerminateStrategy.TERMINATE_PARENT, returns=[0]): """ @@ -164,7 +165,7 @@ def _call_wrapper(command, **kwargs): return result -def _call(command, logoutput=None, throw_on_failure=True, stdout=subprocess32.PIPE,stderr=subprocess32.STDOUT, +def _call(command, logoutput=None, throw_on_failure=True, stdout=subprocess.PIPE,stderr=subprocess.STDOUT, cwd=None, env=None, preexec_fn=preexec_fn, user=None, wait_for_finish=True, timeout=None, on_timeout=None, path=None, sudo=False, on_new_line=None, tries=1, try_sleep=0, timeout_kill_strategy=TerminateStrategy.TERMINATE_PARENT, returns=[0]): """ @@ -175,8 +176,8 @@ def _call(command, logoutput=None, throw_on_failure=True, stdout=subprocess32.PI @param logoutput: boolean, whether command output should be logged of not @param throw_on_failure: if true, when return code is not zero exception is thrown @param stdout,stderr: - subprocess32.PIPE - enable output to variable - subprocess32.STDOUT - redirect to stdout + subprocess.PIPE - enable output to variable + subprocess.STDOUT - redirect to stdout None - disable output to variable, and output to Python out straightly (even if logoutput is False) {int fd} - redirect to file with descriptor. {string filename} - redirects to a file with name. @@ -207,11 +208,11 @@ def _call(command, logoutput=None, throw_on_failure=True, stdout=subprocess32.PI # replace placeholder from as_sudo / as_user if present env_str = _get_environment_str(env) - for placeholder, replacement in PLACEHOLDERS_TO_STR.iteritems(): + for placeholder, replacement in PLACEHOLDERS_TO_STR.items(): command = command.replace(placeholder, replacement.format(env_str=env_str)) # --noprofile is used to preserve PATH set for ambari-agent - subprocess32_command = ["/bin/bash","--login","--noprofile","-c", command] + subprocess_command = ["/bin/bash","--login","--noprofile","-c", command] # don't create stdout and stderr pipes, because forked process will not be able to use them if current process dies # creating pipes may lead to the forked process silent crash @@ -220,15 +221,15 @@ def _call(command, logoutput=None, throw_on_failure=True, stdout=subprocess32.PI stderr = None files_to_close = [] - if isinstance(stdout, basestring): + if isinstance(stdout, str): stdout = open(stdout, 'wb') files_to_close.append(stdout) - if isinstance(stderr, basestring): + if isinstance(stderr, str): stderr = open(stderr, 'wb') files_to_close.append(stderr) try: - proc = subprocess32.Popen(subprocess32_command, stdout=stdout, stderr=stderr, + proc = subprocess.Popen(subprocess_command, stdout=stdout, stderr=stderr, cwd=cwd, env=env, shell=False, close_fds=True, preexec_fn=preexec_fn) @@ -244,9 +245,9 @@ def _call(command, logoutput=None, throw_on_failure=True, stdout=subprocess32.PI logoutput = logoutput is True and Logger.logger.isEnabledFor(logging.INFO) or logoutput is None and Logger.logger.isEnabledFor(logging.DEBUG) read_set = [] - if stdout == subprocess32.PIPE: + if stdout == subprocess.PIPE: read_set.append(proc.stdout) - if stderr == subprocess32.PIPE: + if stderr == subprocess.PIPE: read_set.append(proc.stderr) fd_to_string = { @@ -273,8 +274,8 @@ def _call(command, logoutput=None, throw_on_failure=True, stdout=subprocess32.PI out_fd.close() continue - fd_to_string[out_fd] += line - all_output += line + fd_to_string[out_fd] += line.decode() + all_output += line.decode() if on_new_line: try: @@ -284,7 +285,7 @@ def _call(command, logoutput=None, throw_on_failure=True, stdout=subprocess32.PI raise Fail(err_msg) if logoutput: - sys.stdout.write(line) + sys.stdout.write(line.decode()) sys.stdout.flush() # Wait for process to terminate @@ -314,7 +315,7 @@ def _call(command, logoutput=None, throw_on_failure=True, stdout=subprocess32.PI raise ExecutionFailed(err_msg, code, out, err) # if separate stderr is enabled (by default it's redirected to out) - if stderr == subprocess32.PIPE: + if stderr == subprocess.PIPE: return code, out, err return code, out @@ -354,7 +355,7 @@ def quote_bash_args(command): if not command: return "''" - if not isinstance(command, basestring): + if not isinstance(command, str): raise Fail("Command should be a list of strings, found '{0}' in command list elements".format(str(command))) valid = set(string.ascii_letters + string.digits + '@%_-+=:,./') diff --git a/ambari-common/src/main/python/resource_management/core/signal_utils.py b/ambari-common/src/main/python/resource_management/core/signal_utils.py index d166502e64a..901e48c41c1 100644 --- a/ambari-common/src/main/python/resource_management/core/signal_utils.py +++ b/ambari-common/src/main/python/resource_management/core/signal_utils.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -60,15 +60,15 @@ def killpg_gracefully(proc, timeout=GRACEFUL_PG_KILL_TIMEOUT_SECONDS): if proc.poll() == None: try: pgid = os.getpgid(proc.pid) - sudo.kill(-pgid, signal.SIGTERM) + sudo.kill(-pgid, signal.SIGTERM.value) - for i in xrange(10*timeout): + for i in range(10*timeout): if proc.poll() is not None: break time.sleep(0.1) else: Logger.info("Cannot gracefully kill process group {0}. Resorting to SIGKILL.".format(pgid)) - sudo.kill(-pgid, signal.SIGKILL) + sudo.kill(-pgid, signal.SIGKILL.value) proc.wait() # catch race condition if proc already dead except OSError: diff --git a/ambari-common/src/main/python/resource_management/core/source.py b/ambari-common/src/main/python/resource_management/core/source.py index a2b159806e9..d652e20f35f 100644 --- a/ambari-common/src/main/python/resource_management/core/source.py +++ b/ambari-common/src/main/python/resource_management/core/source.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -20,7 +20,7 @@ """ -from __future__ import with_statement + from resource_management.core.environment import Environment from resource_management.core.logger import Logger from resource_management.core.exceptions import Fail @@ -31,8 +31,7 @@ import os import time -import urllib2 -import urlparse +import urllib.request, urllib.error, urllib.parse from ambari_commons.os_family_impl import OsFamilyFuncImpl, OsFamilyImpl from ambari_commons import OSConst @@ -116,8 +115,8 @@ def get_source(self, environment, template_name): if not os.path.exists(path): raise TemplateNotFound("%s at %s" % (template_name, path)) mtime = os.path.getmtime(path) - with open(path, "rb") as fp: - source = fp.read().decode('utf-8') + with open(path, "rt") as fp: + source = fp.read() return source, path, lambda: mtime == os.path.getmtime(path) class Template(Source): @@ -137,7 +136,7 @@ def __init__(self, name, extra_imports=[], **kwargs): self.template = self.template_env.get_template(self.name) def get_content(self): - default_variables = { 'env':self.env, 'repr':repr, 'str':str, 'bool':bool, 'unicode':unicode } + default_variables = { 'env':self.env, 'repr':repr, 'str':str, 'bool':bool, 'unicode':str } variables = checked_unite(default_variables, self.imports_dict) self.context.update(variables) @@ -174,8 +173,8 @@ def get_content(self): if self.download_path and not os.path.exists(self.download_path): raise Fail("Directory {0} doesn't exist, please provide valid download path".format(self.download_path)) - if urlparse.urlparse(self.url).path: - filename = os.path.basename(urlparse.urlparse(self.url).path) + if urllib.parse.urlparse(self.url).path: + filename = os.path.basename(urllib.parse.urlparse(self.url).path) else: filename = 'index.html.{0}'.format(time.time()) @@ -185,15 +184,15 @@ def get_content(self): Logger.info("Downloading the file from {0}".format(self.url)) if self.ignore_proxy: - opener = urllib2.build_opener(urllib2.ProxyHandler({})) + opener = urllib.request.build_opener(urllib.request.ProxyHandler({})) else: - opener = urllib2.build_opener() + opener = urllib.request.build_opener() - req = urllib2.Request(self.url) + req = urllib.request.Request(self.url) try: web_file = opener.open(req) - except urllib2.HTTPError as ex: + except urllib.error.HTTPError as ex: raise Fail("Failed to download file from {0} due to HTTP error: {1}".format(self.url, str(ex))) content = web_file.read() diff --git a/ambari-common/src/main/python/resource_management/core/sudo.py b/ambari-common/src/main/python/resource_management/core/sudo.py index b35f67a1a17..a5949a075ba 100644 --- a/ambari-common/src/main/python/resource_management/core/sudo.py +++ b/ambari-common/src/main/python/resource_management/core/sudo.py @@ -29,7 +29,7 @@ from resource_management.core import shell from resource_management.core.exceptions import Fail from ambari_commons.unicode_tolerant_fs import unicode_walk -from ambari_commons import subprocess32 +import subprocess from resource_management.core.utils import attr_to_bitmask @@ -145,10 +145,9 @@ def create_file(filename, content, encoding=None, on_file_created=None): _create_file(filename, content, encoding=encoding, sudo=False, on_file_created=on_file_created) def read_file(filename, encoding=None): - with open(filename, "rb") as fp: + with open(filename, 'rb') as fp: content = fp.read() - content = content.decode(encoding) if encoding else content return content def path_exists(path): @@ -173,7 +172,7 @@ def stat(path): class Stat: def __init__(self, path): stat_val = os.stat(path) - self.st_uid, self.st_gid, self.st_mode = stat_val.st_uid, stat_val.st_gid, stat_val.st_mode & 07777 + self.st_uid, self.st_gid, self.st_mode = stat_val.st_uid, stat_val.st_gid, stat_val.st_mode & 0o7777 return Stat(path) def kill(pid, signal): @@ -201,7 +200,8 @@ def chown_recursive(path, owner, group, follow_links=False): # os.chmod replacement def chmod(path, mode): - shell.checked_call(["chmod", oct(mode), path], sudo=True) + linux_chmod_str = str(oct(mode))[2:] + shell.checked_call(["chmod", linux_chmod_str, path], sudo=True) def chmod_extended(path, mode): shell.checked_call(["chmod", mode, path], sudo=True) @@ -242,10 +242,9 @@ def read_file(filename, encoding=None): shell.checked_call(["cp", "-f", filename, tmpf.name], sudo=True) with tmpf: - with open(tmpf.name, "rb") as fp: + with open(tmpf.name, 'rb') as fp: content = fp.read() - content = content.decode(encoding) if encoding else content return content # os.path.exists @@ -277,7 +276,7 @@ def stat(path): class Stat: def __init__(self, path): cmd = ["stat", "-c", "%u %g %a", path] - code, out, err = shell.checked_call(cmd, sudo=True, stderr=subprocess32.PIPE) + code, out, err = shell.checked_call(cmd, sudo=True, stderr=subprocess.PIPE) values = out.split(' ') if len(values) != 3: raise Fail("Execution of '{0}' returned unexpected output. {2}\n{3}".format(cmd, code, err, out)) @@ -306,7 +305,7 @@ def listdir(path): if not path_isdir(path): raise Fail("{0} is not a directory. Cannot list files of it.".format(path)) - code, out, err = shell.checked_call(["ls", path], sudo=True, stderr=subprocess32.PIPE) + code, out, err = shell.checked_call(["ls", path], sudo=True, stderr=subprocess.PIPE) files = out.splitlines() return files @@ -316,7 +315,7 @@ def chmod_recursive(path, recursive_mode_flags, recursion_follow_links): if recursion_follow_links: find_flags.append('-L') - for key, flags in recursive_mode_flags.iteritems(): + for key, flags in recursive_mode_flags.items(): shell.checked_call(["find"] + find_flags + [path, "-type", key, "-exec" , "chmod", flags ,"{}" ,";"]) def _create_file(filename, content, encoding, sudo, on_file_created=None): @@ -327,10 +326,11 @@ def _create_file(filename, content, encoding, sudo, on_file_created=None): Creates empty file if content is None. """ content = content if content else "" - content = content.encode(encoding) if encoding else content - + # Pre-encoding the string data + #write to specify encoding utf-8 tmpf_name = tempfile.gettempdir() + os.sep + tempfile.template + str(time.time()) + "_" + str(random.randint(0, 1000)) - with open(tmpf_name, "wb") as fp: + mode = "wb" if isinstance(content, bytes) else "w" + with open(tmpf_name, mode) as fp: fp.write(content) if on_file_created: on_file_created(tmpf_name) diff --git a/ambari-common/src/main/python/resource_management/core/system.py b/ambari-common/src/main/python/resource_management/core/system.py index c6cc7cc3a86..666a1b50b30 100644 --- a/ambari-common/src/main/python/resource_management/core/system.py +++ b/ambari-common/src/main/python/resource_management/core/system.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -24,7 +24,7 @@ import os import sys -import platform +import distro from resource_management.core import shell from resource_management.core.utils import lazy_property from resource_management.core.exceptions import Fail @@ -39,7 +39,7 @@ def os(self): In case cannot detect raises 'unknown' """ - platform = sys.platform + platform = sys.distro if platform.startswith('linux'): return "linux" else: diff --git a/ambari-common/src/main/python/resource_management/core/utils.py b/ambari-common/src/main/python/resource_management/core/utils.py index 68c6d908459..c8f7c77db8b 100644 --- a/ambari-common/src/main/python/resource_management/core/utils.py +++ b/ambari-common/src/main/python/resource_management/core/utils.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -25,7 +25,7 @@ import contextlib import sys import signal -import cStringIO +import io from functools import wraps import re @@ -77,7 +77,7 @@ def items(self): return self._dict.items() def iteritems(self): - return self._dict.iteritems() + return self._dict.items() def values(self): return self._dict.values() @@ -126,11 +126,11 @@ def checked_unite(dict1, dict2): @contextlib.contextmanager def suppress_stdout(): save_stdout = sys.stdout - sys.stdout = cStringIO.StringIO() + sys.stdout = io.StringIO() yield sys.stdout = save_stdout -class PasswordString(unicode): +class PasswordString(str): """ Logger replaces this strings with [PROTECTED] """ diff --git a/ambari-common/src/main/python/resource_management/libraries/__init__.py b/ambari-common/src/main/python/resource_management/libraries/__init__.py index b36d4a281e4..893b8130694 100644 --- a/ambari-common/src/main/python/resource_management/libraries/__init__.py +++ b/ambari-common/src/main/python/resource_management/libraries/__init__.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-common/src/main/python/resource_management/libraries/execution_command/__init__.py b/ambari-common/src/main/python/resource_management/libraries/execution_command/__init__.py index 5561e1087b2..152033a3be5 100644 --- a/ambari-common/src/main/python/resource_management/libraries/execution_command/__init__.py +++ b/ambari-common/src/main/python/resource_management/libraries/execution_command/__init__.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-common/src/main/python/resource_management/libraries/execution_command/cluster_settings.py b/ambari-common/src/main/python/resource_management/libraries/execution_command/cluster_settings.py index 2f5fee750db..eb0f0900747 100644 --- a/ambari-common/src/main/python/resource_management/libraries/execution_command/cluster_settings.py +++ b/ambari-common/src/main/python/resource_management/libraries/execution_command/cluster_settings.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-common/src/main/python/resource_management/libraries/execution_command/execution_command.py b/ambari-common/src/main/python/resource_management/libraries/execution_command/execution_command.py index 7ac060af80f..b64c9e64cca 100644 --- a/ambari-common/src/main/python/resource_management/libraries/execution_command/execution_command.py +++ b/ambari-common/src/main/python/resource_management/libraries/execution_command/execution_command.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -53,7 +53,7 @@ def __get_value(self, key, default_value=None): :param default_value: if key does not exist, return this value :return: the value maps to query key """ - sub_keys = filter(None, key.split('/')) + sub_keys = [_f for _f in key.split('/') if _f] value = self.__execution_command try: for sub_key in sub_keys: diff --git a/ambari-common/src/main/python/resource_management/libraries/execution_command/module_configs.py b/ambari-common/src/main/python/resource_management/libraries/execution_command/module_configs.py index f5481e6fdd2..d000544b35f 100644 --- a/ambari-common/src/main/python/resource_management/libraries/execution_command/module_configs.py +++ b/ambari-common/src/main/python/resource_management/libraries/execution_command/module_configs.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-common/src/main/python/resource_management/libraries/execution_command/stack_settings.py b/ambari-common/src/main/python/resource_management/libraries/execution_command/stack_settings.py index 0553087e619..b79a6694e3f 100644 --- a/ambari-common/src/main/python/resource_management/libraries/execution_command/stack_settings.py +++ b/ambari-common/src/main/python/resource_management/libraries/execution_command/stack_settings.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-common/src/main/python/resource_management/libraries/functions/__init__.py b/ambari-common/src/main/python/resource_management/libraries/functions/__init__.py index b907844ea09..7f5e59a152c 100644 --- a/ambari-common/src/main/python/resource_management/libraries/functions/__init__.py +++ b/ambari-common/src/main/python/resource_management/libraries/functions/__init__.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-common/src/main/python/resource_management/libraries/functions/check_process_status.py b/ambari-common/src/main/python/resource_management/libraries/functions/check_process_status.py index ac54bc9d6eb..ff31f9e95e5 100644 --- a/ambari-common/src/main/python/resource_management/libraries/functions/check_process_status.py +++ b/ambari-common/src/main/python/resource_management/libraries/functions/check_process_status.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -76,6 +76,6 @@ def wait_process_stopped(pid_file): check_process_status(pid_file) time.sleep(1) counter += 1 - except ComponentIsNotRunning, e: + except ComponentIsNotRunning as e: Logger.logger.debug(" reports ComponentIsNotRunning") component_is_stopped = True diff --git a/ambari-common/src/main/python/resource_management/libraries/functions/component_version.py b/ambari-common/src/main/python/resource_management/libraries/functions/component_version.py index fd182327457..42d159f39ca 100644 --- a/ambari-common/src/main/python/resource_management/libraries/functions/component_version.py +++ b/ambari-common/src/main/python/resource_management/libraries/functions/component_version.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -54,7 +54,7 @@ def get_component_repository_version(service_name = None, component_name = None, return component_versions[component_name] # fall back to the first one for the service - return component_versions.values()[0] + return list(component_versions.values())[0] def _get_component_repositories(config): diff --git a/ambari-common/src/main/python/resource_management/libraries/functions/conf_select.py b/ambari-common/src/main/python/resource_management/libraries/functions/conf_select.py index b56d80f74a5..2b20b86be6d 100644 --- a/ambari-common/src/main/python/resource_management/libraries/functions/conf_select.py +++ b/ambari-common/src/main/python/resource_management/libraries/functions/conf_select.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -22,7 +22,7 @@ # Python Imports import os -from ambari_commons import subprocess32 +import subprocess import ambari_simplejson as json # Local Imports @@ -77,7 +77,7 @@ def get_package_dirs(): package_dirs = data[conf_select_key] stack_root = Script.get_stack_root() - for package_name, directories in package_dirs.iteritems(): + for package_name, directories in package_dirs.items(): for dir in directories: current_dir = dir['current_dir'] current_dir = current_dir.format(stack_root) @@ -107,7 +107,7 @@ def create(stack_name, package, version, dry_run = False): command = "dry-run-create" if dry_run else "create-conf-dir" - code, stdout, stderr = shell.call(_get_cmd(command, package, version), logoutput=False, quiet=False, sudo=True, stderr = subprocess32.PIPE) + code, stdout, stderr = shell.call(_get_cmd(command, package, version), logoutput=False, quiet=False, sudo=True, stderr = subprocess.PIPE) # can set more than one directory # per package, so return that list, especially for dry_run @@ -123,7 +123,7 @@ def create(stack_name, package, version, dry_run = False): if not code and stdout and not dry_run: # take care of permissions if directories were created for directory in created_directories: - Directory(directory, mode=0755, cd_access='a', create_parents=True) + Directory(directory, mode=0o755, cd_access='a', create_parents=True) # seed the new directories with configurations from the old (current) directories _seed_new_configuration_directories(package, created_directories) @@ -147,7 +147,7 @@ def select(stack_name, package, version, ignore_errors=False): create(stack_name, package, version) shell.checked_call(_get_cmd("set-conf-dir", package, version), logoutput=False, quiet=False, sudo=True) - except Exception, exception: + except Exception as exception: if ignore_errors is True: Logger.warning("Could not select the directory for package {0}. Error: {1}".format(package, str(exception))) @@ -284,7 +284,7 @@ def convert_conf_directories_to_symlinks(package, version, dirs): # Normal path for other packages Link(old_conf, to = current_dir) - except Exception, e: + except Exception as e: Logger.warning("Could not change symlink for package {0} to point to current directory. Error: {1}".format(package, e)) @@ -308,7 +308,7 @@ def get_restricted_packages(): service_names = [] # pick out the services that are targeted - for servicename, servicedetail in cluster_version_summary.iteritems(): + for servicename, servicedetail in cluster_version_summary.items(): if servicedetail['upgrade']: service_names.append(servicename) @@ -395,7 +395,7 @@ def _seed_new_configuration_directories(package, created_directories): target_seed_directory = created_directory _copy_configurations(source_seed_directory, target_seed_directory) - except Exception, e: + except Exception as e: Logger.warning("Unable to seed new configuration directories for {0}. {1}".format(package, str(e))) diff --git a/ambari-common/src/main/python/resource_management/libraries/functions/constants.py b/ambari-common/src/main/python/resource_management/libraries/functions/constants.py index 661b3f71e00..7b5fedbaf1d 100644 --- a/ambari-common/src/main/python/resource_management/libraries/functions/constants.py +++ b/ambari-common/src/main/python/resource_management/libraries/functions/constants.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one diff --git a/ambari-common/src/main/python/resource_management/libraries/functions/copy_tarball.py b/ambari-common/src/main/python/resource_management/libraries/functions/copy_tarball.py index 52130ab30ea..9f8438a82fd 100644 --- a/ambari-common/src/main/python/resource_management/libraries/functions/copy_tarball.py +++ b/ambari-common/src/main/python/resource_management/libraries/functions/copy_tarball.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -64,8 +64,8 @@ def _prepare_tez_tarball(): # create the temp staging directories ensuring that non-root agents using tarfile can work with them mapreduce_temp_dir = tempfile.mkdtemp(prefix="mapreduce-tarball-", dir=temp_dir) tez_temp_dir = tempfile.mkdtemp(prefix="tez-tarball-", dir=temp_dir) - sudo.chmod(mapreduce_temp_dir, 0777) - sudo.chmod(tez_temp_dir, 0777) + sudo.chmod(mapreduce_temp_dir, 0o777) + sudo.chmod(tez_temp_dir, 0o777) Logger.info("Extracting {0} to {1}".format(mapreduce_source_file, mapreduce_temp_dir)) tar_archive.untar_archive(mapreduce_source_file, mapreduce_temp_dir) @@ -109,7 +109,7 @@ def _prepare_tez_tarball(): # ensure that the tez/lib directory is readable by non-root (which it typically is not) Directory(tez_lib_dir, - mode = 0755, + mode = 0o755, cd_access = 'a', recursive_ownership = True) @@ -117,7 +117,7 @@ def _prepare_tez_tarball(): tez_native_tarball_staging_dir = os.path.join(temp_dir, "tez-native-tarball-staging") if not os.path.exists(tez_native_tarball_staging_dir): Directory(tez_native_tarball_staging_dir, - mode = 0777, + mode = 0o777, cd_access='a', create_parents = True, recursive_ownership = True) @@ -127,7 +127,7 @@ def _prepare_tez_tarball(): tar_archive.archive_dir_via_temp_file(tez_tarball_with_native_lib, tez_temp_dir) # ensure that the tarball can be read and uploaded - sudo.chmod(tez_tarball_with_native_lib, 0744) + sudo.chmod(tez_tarball_with_native_lib, 0o744) # cleanup sudo.rmtree(mapreduce_temp_dir) @@ -156,7 +156,7 @@ def _prepare_mapreduce_tarball(): # create the temp staging directories ensuring that non-root agents using tarfile can work with them mapreduce_temp_dir = tempfile.mkdtemp(prefix="mapreduce-tarball-", dir=temp_dir) - sudo.chmod(mapreduce_temp_dir, 0777) + sudo.chmod(mapreduce_temp_dir, 0o777) # calculate the source directory for LZO hadoop_lib_native_source_dir = os.path.join(os.path.dirname(mapreduce_source_file), "lib", "native") @@ -173,7 +173,7 @@ def _prepare_mapreduce_tarball(): # ensure that the hadoop/lib/native directory is readable by non-root (which it typically is not) Directory(mapreduce_lib_dir, - mode = 0755, + mode = 0o755, cd_access = 'a', recursive_ownership = True) @@ -181,7 +181,7 @@ def _prepare_mapreduce_tarball(): mapreduce_native_tarball_staging_dir = os.path.join(temp_dir, "mapreduce-native-tarball-staging") if not os.path.exists(mapreduce_native_tarball_staging_dir): Directory(mapreduce_native_tarball_staging_dir, - mode = 0777, + mode = 0o777, cd_access = 'a', create_parents = True, recursive_ownership = True) @@ -191,7 +191,7 @@ def _prepare_mapreduce_tarball(): tar_archive.archive_dir_via_temp_file(mapreduce_tarball_with_native_lib, mapreduce_temp_dir) # ensure that the tarball can be read and uploaded - sudo.chmod(mapreduce_tarball_with_native_lib, 0744) + sudo.chmod(mapreduce_tarball_with_native_lib, 0o744) # cleanup sudo.rmtree(mapreduce_temp_dir) @@ -379,7 +379,7 @@ def _get_single_version_from_stack_select(): Call " versions" and return the version string if only one version is available. :return: Returns a version string if successful, and None otherwise. """ - # Ubuntu returns: "stdin: is not a tty", as subprocess32 output, so must use a temporary file to store the output. + # Ubuntu returns: "stdin: is not a tty", as subprocess output, so must use a temporary file to store the output. tmp_dir = Script.get_tmp_dir() tmp_file = os.path.join(tmp_dir, "copy_tarball_out.txt") stack_version = None @@ -391,13 +391,13 @@ def _get_single_version_from_stack_select(): code, stdoutdata = shell.call(get_stack_versions_cmd, logoutput=True) with open(tmp_file, 'r+') as file: out = file.read() - except Exception, e: + except Exception as e: Logger.logger.exception("Could not parse output of {0}. Error: {1}".format(str(tmp_file), str(e))) finally: try: if os.path.exists(tmp_file): os.remove(tmp_file) - except Exception, e: + except Exception as e: Logger.logger.exception("Could not remove file {0}. Error: {1}".format(str(tmp_file), str(e))) if code != 0 or out is None or out == "": @@ -414,7 +414,7 @@ def _get_single_version_from_stack_select(): return stack_version -def copy_to_hdfs(name, user_group, owner, file_mode=0444, custom_source_file=None, custom_dest_file=None, force_execute=False, +def copy_to_hdfs(name, user_group, owner, file_mode=0o444, custom_source_file=None, custom_dest_file=None, force_execute=False, use_upgrading_version_during_upgrade=True, replace_existing_files=False, skip=False, skip_component_check=False): """ :param name: Tarball name, e.g., tez, hive, pig, sqoop. @@ -482,7 +482,7 @@ def copy_to_hdfs(name, user_group, owner, file_mode=0444, custom_source_file=Non type="directory", action="create_on_execute", owner=owner, - mode=0555 + mode=0o555 ) # If the file already exists, it is a NO-OP @@ -492,7 +492,7 @@ def copy_to_hdfs(name, user_group, owner, file_mode=0444, custom_source_file=Non source=source_file, group=user_group, owner=owner, - mode=0444, + mode=0o444, replace_existing_files=replace_existing_files, ) Logger.info("Will attempt to copy {0} tarball from {1} to DFS at {2}.".format(name, source_file, dest_file)) diff --git a/ambari-common/src/main/python/resource_management/libraries/functions/curl_krb_request.py b/ambari-common/src/main/python/resource_management/libraries/functions/curl_krb_request.py index 55395cec7fd..cc234a3284e 100644 --- a/ambari-common/src/main/python/resource_management/libraries/functions/curl_krb_request.py +++ b/ambari-common/src/main/python/resource_management/libraries/functions/curl_krb_request.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -27,8 +27,8 @@ import time -from get_kinit_path import get_kinit_path -from get_klist_path import get_klist_path +from .get_kinit_path import get_kinit_path +from .get_klist_path import get_klist_path from resource_management.core import global_lock from resource_management.core import shell from resource_management.core.exceptions import Fail @@ -103,7 +103,7 @@ def curl_krb_request(tmp_dir, keytab, principal, url, cache_file_prefix, curl_krb_cache_path = os.path.join(tmp_dir, "curl_krb_cache") if not os.path.exists(curl_krb_cache_path): os.makedirs(curl_krb_cache_path) - os.chmod(curl_krb_cache_path, 01777) + os.chmod(curl_krb_cache_path, 0o1777) ccache_file_path = "{0}{1}{2}_{3}_cc_{4}".format(curl_krb_cache_path, os.sep, cache_file_prefix, user, ccache_file_name) kerberos_env = {'KRB5CCNAME': ccache_file_path} @@ -124,7 +124,7 @@ def curl_krb_request(tmp_dir, keytab, principal, url, cache_file_prefix, # kinit if it's time; this helps to avoid problems approaching ticket boundary when # executing a klist and then a curl last_kinit_time = _KINIT_CACHE_TIMES.get(ccache_file_name, 0) - current_time = long(time.time()) + current_time = int(time.time()) if current_time - kinit_timer_ms > last_kinit_time: is_kinit_required = True diff --git a/ambari-common/src/main/python/resource_management/libraries/functions/data_structure_utils.py b/ambari-common/src/main/python/resource_management/libraries/functions/data_structure_utils.py index 59e01aa5b47..4753f1c830c 100644 --- a/ambari-common/src/main/python/resource_management/libraries/functions/data_structure_utils.py +++ b/ambari-common/src/main/python/resource_management/libraries/functions/data_structure_utils.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-common/src/main/python/resource_management/libraries/functions/decorator.py b/ambari-common/src/main/python/resource_management/libraries/functions/decorator.py index 9446d567e56..5efb6e004c0 100644 --- a/ambari-common/src/main/python/resource_management/libraries/functions/decorator.py +++ b/ambari-common/src/main/python/resource_management/libraries/functions/decorator.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -52,7 +52,7 @@ def wrapper(*args, **kwargs): _times -= 1 try: return function(*args, **kwargs) - except _err_class, err: + except _err_class as err: Logger.info("Will retry %d time(s), caught exception: %s. Sleeping for %d sec(s)" % (_times, str(err), _sleep_time)) time.sleep(_sleep_time) @@ -93,7 +93,7 @@ def wrapper(*args, **kwargs): _times -= 1 try: return function(*args, **kwargs) - except _err_class, err: + except _err_class as err: Logger.info("Will retry %d time(s), caught exception: %s. Sleeping for %d sec(s)" % (_times, str(err), _sleep_time)) time.sleep(_sleep_time) if(_sleep_time * _backoff_factor <= max_sleep_time): @@ -101,7 +101,7 @@ def wrapper(*args, **kwargs): try: return function(*args, **kwargs) - except _err_class, err: + except _err_class as err: Logger.error(str(err)) return _return_on_fail diff --git a/ambari-common/src/main/python/resource_management/libraries/functions/default.py b/ambari-common/src/main/python/resource_management/libraries/functions/default.py index 061bc522328..6ba39186f0d 100644 --- a/ambari-common/src/main/python/resource_management/libraries/functions/default.py +++ b/ambari-common/src/main/python/resource_management/libraries/functions/default.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -26,7 +26,7 @@ from resource_management.core.logger import Logger def default(name, default_value): - subdicts = filter(None, name.split('/')) + subdicts = [_f for _f in name.split('/') if _f] curr_dict = Script.get_config() if not curr_dict: diff --git a/ambari-common/src/main/python/resource_management/libraries/functions/download_from_hdfs.py b/ambari-common/src/main/python/resource_management/libraries/functions/download_from_hdfs.py index 5826fc1e8ab..94fc34961a7 100644 --- a/ambari-common/src/main/python/resource_management/libraries/functions/download_from_hdfs.py +++ b/ambari-common/src/main/python/resource_management/libraries/functions/download_from_hdfs.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -32,7 +32,7 @@ from resource_management.core.logger import Logger -def download_from_hdfs(source_file, dest_path, user_group, owner, download_type="file", file_mode=0444, force_execute=False, +def download_from_hdfs(source_file, dest_path, user_group, owner, download_type="file", file_mode=0o444, force_execute=False, replace_existing_files=False): """ :param source_file: the source file path diff --git a/ambari-common/src/main/python/resource_management/libraries/functions/dynamic_variable_interpretation.py b/ambari-common/src/main/python/resource_management/libraries/functions/dynamic_variable_interpretation.py index 25c15262af6..11413104d4a 100644 --- a/ambari-common/src/main/python/resource_management/libraries/functions/dynamic_variable_interpretation.py +++ b/ambari-common/src/main/python/resource_management/libraries/functions/dynamic_variable_interpretation.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -100,7 +100,7 @@ def _copy_files(source_and_dest_pairs, component_user, file_owner, group_owner, action="create", owner=file_owner, hdfs_user=params.hdfs_user, # this will be the user to run the commands as - mode=0555 + mode=0o555 ) # Because CopyFromLocal does not guarantee synchronization, it's possible for two processes to first attempt to @@ -114,7 +114,7 @@ def _copy_files(source_and_dest_pairs, component_user, file_owner, group_owner, new_dest_file_name = orig_dest_file_name + "." + unique_string new_destination = os.path.join(destination_dir, new_dest_file_name) CopyFromLocal(source, - mode=0444, + mode=0o444, owner=file_owner, group=group_owner, user=params.hdfs_user, # this will be the user to run the commands as @@ -132,7 +132,7 @@ def _copy_files(source_and_dest_pairs, component_user, file_owner, group_owner, bin_dir=params.hadoop_bin_dir, conf_dir=params.hadoop_conf_dir ) - except Exception, e: + except Exception as e: Logger.error("Failed to copy file. Source: %s, Destination: %s. Error: %s" % (source, destination, e.message)) return_value = 1 return return_value @@ -171,7 +171,7 @@ def copy_tarballs_to_hdfs(tarball_prefix, stack_select_component_name, component Logger.warning("Could not find file: %s" % str(component_tar_source_file)) return 1 - # Ubuntu returns: "stdin: is not a tty", as subprocess32 output. + # Ubuntu returns: "stdin: is not a tty", as subprocess output. tmpfile = tempfile.NamedTemporaryFile() out = None (stack_selector_name, stack_selector_path, stack_selector_package) = stack_tools.get_stack_tool(stack_tools.STACK_SELECTOR_NAME) diff --git a/ambari-common/src/main/python/resource_management/libraries/functions/expect.py b/ambari-common/src/main/python/resource_management/libraries/functions/expect.py index 5c75e5103b5..2a82ad5984d 100644 --- a/ambari-common/src/main/python/resource_management/libraries/functions/expect.py +++ b/ambari-common/src/main/python/resource_management/libraries/functions/expect.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -31,7 +31,7 @@ def expect(name, expected_type, default_value=None): Optionally if the configuration is not found default_value for it can be returned. """ - subdicts = filter(None, name.split('/')) + subdicts = [_f for _f in name.split('/') if _f] curr_dict = Script.get_config() for x in subdicts: @@ -46,7 +46,7 @@ def expect(name, expected_type, default_value=None): if expected_type == bool: if isinstance(value, bool): return value - elif isinstance(value, basestring): + elif isinstance(value, str): if value != None and value.lower() == "true": value = True elif value != None and value.lower() == "false": @@ -56,7 +56,7 @@ def expect(name, expected_type, default_value=None): else: type_name = type(value).__name__ raise Fail("Configuration {0} expected to be boolean (true or false), but found instance of unknown type '{1}'".format(name, type_name)) - elif expected_type in [int, long, float]: + elif expected_type in [int, int, float]: try: value = expected_type(value) except (ValueError, TypeError): @@ -80,7 +80,7 @@ def expect_v2(name, expected_type, default_value=None): if expected_type == bool: if isinstance(value, bool): return value - elif isinstance(value, basestring): + elif isinstance(value, str): if value != None and value.lower() == "true": value = True elif value != None and value.lower() == "false": @@ -92,7 +92,7 @@ def expect_v2(name, expected_type, default_value=None): raise Fail( "Configuration {0} expected to be boolean (true or false), but found instance of unknown type '{1}'".format( name, type_name)) - elif expected_type in [int, long, float]: + elif expected_type in [int, int, float]: try: value = expected_type(value) except (ValueError, TypeError): diff --git a/ambari-common/src/main/python/resource_management/libraries/functions/fcntl_based_process_lock.py b/ambari-common/src/main/python/resource_management/libraries/functions/fcntl_based_process_lock.py index 67fadac7b15..fcbbeadafd0 100644 --- a/ambari-common/src/main/python/resource_management/libraries/functions/fcntl_based_process_lock.py +++ b/ambari-common/src/main/python/resource_management/libraries/functions/fcntl_based_process_lock.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-common/src/main/python/resource_management/libraries/functions/file_system.py b/ambari-common/src/main/python/resource_management/libraries/functions/file_system.py index cd4883647df..d54050e33d7 100644 --- a/ambari-common/src/main/python/resource_management/libraries/functions/file_system.py +++ b/ambari-common/src/main/python/resource_management/libraries/functions/file_system.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-common/src/main/python/resource_management/libraries/functions/find_executable.py b/ambari-common/src/main/python/resource_management/libraries/functions/find_executable.py index dd28523ce7c..8ef4f359ecd 100644 --- a/ambari-common/src/main/python/resource_management/libraries/functions/find_executable.py +++ b/ambari-common/src/main/python/resource_management/libraries/functions/find_executable.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -21,7 +21,7 @@ """ __all__ = ["find_executable"] -from find_path import find_path +from resource_management.libraries.functions.find_path import find_path def find_executable(search_directories, filename): @@ -38,10 +38,8 @@ def find_executable(search_directories, filename): @param filename: the name of the file for which to search @return: the absolute path to the specified executable; or, if not found just the specified executable name """ - if isinstance(search_directories, unicode): - search_directories = map(str.strip, search_directories.encode("ascii").split(",")) - elif isinstance(search_directories, str): - search_directories = map(str.strip, search_directories.split(",")) + if isinstance(search_directories, str): + search_directories = list(map(str.strip, search_directories.split(","))) elif not isinstance(search_directories, list): search_directories = ["/usr/bin", "/usr/kerberos/bin", "/usr/sbin", '/usr/lib/mit/bin', '/usr/lib/mit/sbin'] diff --git a/ambari-common/src/main/python/resource_management/libraries/functions/find_path.py b/ambari-common/src/main/python/resource_management/libraries/functions/find_path.py index 47b6120b17e..17ed698ff6f 100644 --- a/ambari-common/src/main/python/resource_management/libraries/functions/find_path.py +++ b/ambari-common/src/main/python/resource_management/libraries/functions/find_path.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-common/src/main/python/resource_management/libraries/functions/flume_agent_helper.py b/ambari-common/src/main/python/resource_management/libraries/functions/flume_agent_helper.py index 80e7b28bda3..4eda144be01 100644 --- a/ambari-common/src/main/python/resource_management/libraries/functions/flume_agent_helper.py +++ b/ambari-common/src/main/python/resource_management/libraries/functions/flume_agent_helper.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one diff --git a/ambari-common/src/main/python/resource_management/libraries/functions/format.py b/ambari-common/src/main/python/resource_management/libraries/functions/format.py index bf959a6327c..71d7711a095 100644 --- a/ambari-common/src/main/python/resource_management/libraries/functions/format.py +++ b/ambari-common/src/main/python/resource_management/libraries/functions/format.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -78,7 +78,7 @@ def convert_field_protected(self, value, conversion): def _convert_field(self, value, conversion, is_protected): if conversion == 'e': - return quote_bash_args(unicode(value)) + return quote_bash_args(str(value)) elif conversion == 'h': return utils.PASSWORDS_HIDE_STRING if is_protected else value elif conversion == 'p': diff --git a/ambari-common/src/main/python/resource_management/libraries/functions/format_jvm_option.py b/ambari-common/src/main/python/resource_management/libraries/functions/format_jvm_option.py index 49a1903d047..74694e291f6 100644 --- a/ambari-common/src/main/python/resource_management/libraries/functions/format_jvm_option.py +++ b/ambari-common/src/main/python/resource_management/libraries/functions/format_jvm_option.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -28,7 +28,7 @@ def format_jvm_option(name, default_value): curr_dict = default(name, default_value) - if isinstance(curr_dict, ( int, long )): + if isinstance(curr_dict, int): curr_dict = str(curr_dict) + "m" return curr_dict elif isinstance(curr_dict, str): @@ -38,7 +38,7 @@ def format_jvm_option(name, default_value): if "m" in curr_dict: return curr_dict else: - if isinstance(int(curr_dict), ( int, long )): + if isinstance(int(curr_dict), int): return str(int(curr_dict)) + "m" else: return default_value diff --git a/ambari-common/src/main/python/resource_management/libraries/functions/generate_logfeeder_input_config.py b/ambari-common/src/main/python/resource_management/libraries/functions/generate_logfeeder_input_config.py index 84ab492092d..789311bd06c 100755 --- a/ambari-common/src/main/python/resource_management/libraries/functions/generate_logfeeder_input_config.py +++ b/ambari-common/src/main/python/resource_management/libraries/functions/generate_logfeeder_input_config.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -32,7 +32,7 @@ def generate_logfeeder_input_config(type, content): """ import params Directory(LOGFEEDER_CONF_DIR, - mode=0755, + mode=0o755, cd_access='a', create_parents=True ) @@ -40,5 +40,5 @@ def generate_logfeeder_input_config(type, content): Logger.info("Generate Log Feeder config file: " + os.path.join(LOGFEEDER_CONF_DIR, input_file_name)) File(os.path.join(LOGFEEDER_CONF_DIR, input_file_name), content=content, - mode=0644 + mode=0o644 ) \ No newline at end of file diff --git a/ambari-common/src/main/python/resource_management/libraries/functions/get_architecture.py b/ambari-common/src/main/python/resource_management/libraries/functions/get_architecture.py index 4279c2e6746..40d88e9c2ef 100644 --- a/ambari-common/src/main/python/resource_management/libraries/functions/get_architecture.py +++ b/ambari-common/src/main/python/resource_management/libraries/functions/get_architecture.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-common/src/main/python/resource_management/libraries/functions/get_bare_principal.py b/ambari-common/src/main/python/resource_management/libraries/functions/get_bare_principal.py index dbfe9b7374d..1a14781988f 100644 --- a/ambari-common/src/main/python/resource_management/libraries/functions/get_bare_principal.py +++ b/ambari-common/src/main/python/resource_management/libraries/functions/get_bare_principal.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-common/src/main/python/resource_management/libraries/functions/get_config.py b/ambari-common/src/main/python/resource_management/libraries/functions/get_config.py index 57af51fd47b..76d32e057ab 100644 --- a/ambari-common/src/main/python/resource_management/libraries/functions/get_config.py +++ b/ambari-common/src/main/python/resource_management/libraries/functions/get_config.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-common/src/main/python/resource_management/libraries/functions/get_kdestroy_path.py b/ambari-common/src/main/python/resource_management/libraries/functions/get_kdestroy_path.py index cf13e2ebe7e..4453471c4dc 100644 --- a/ambari-common/src/main/python/resource_management/libraries/functions/get_kdestroy_path.py +++ b/ambari-common/src/main/python/resource_management/libraries/functions/get_kdestroy_path.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -21,7 +21,7 @@ """ __all__ = ["get_kdestroy_path"] -from find_executable import find_executable +from resource_management.libraries.functions.find_executable import find_executable def get_kdestroy_path(search_directories=None): diff --git a/ambari-common/src/main/python/resource_management/libraries/functions/get_kinit_path.py b/ambari-common/src/main/python/resource_management/libraries/functions/get_kinit_path.py index 23f1c9a5666..935af125924 100644 --- a/ambari-common/src/main/python/resource_management/libraries/functions/get_kinit_path.py +++ b/ambari-common/src/main/python/resource_management/libraries/functions/get_kinit_path.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -21,7 +21,7 @@ """ __all__ = ["get_kinit_path"] -from find_executable import find_executable +from resource_management.libraries.functions.find_executable import find_executable def get_kinit_path(search_directories=None): diff --git a/ambari-common/src/main/python/resource_management/libraries/functions/get_klist_path.py b/ambari-common/src/main/python/resource_management/libraries/functions/get_klist_path.py index 650177e7859..ec46aecddd4 100644 --- a/ambari-common/src/main/python/resource_management/libraries/functions/get_klist_path.py +++ b/ambari-common/src/main/python/resource_management/libraries/functions/get_klist_path.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -21,7 +21,7 @@ """ __all__ = ["get_klist_path"] -from find_executable import find_executable +from resource_management.libraries.functions.find_executable import find_executable def get_klist_path(search_directories=None): diff --git a/ambari-common/src/main/python/resource_management/libraries/functions/get_not_managed_resources.py b/ambari-common/src/main/python/resource_management/libraries/functions/get_not_managed_resources.py index 404a976276f..8cde6657ba2 100644 --- a/ambari-common/src/main/python/resource_management/libraries/functions/get_not_managed_resources.py +++ b/ambari-common/src/main/python/resource_management/libraries/functions/get_not_managed_resources.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -36,7 +36,7 @@ def get_not_managed_resources(): not_managed_hdfs_path_list = json.loads(config['clusterLevelParams']['not_managed_hdfs_path_list'])[:] if 'managed_hdfs_resource_property_names' in config['configurations']['cluster-env']: managed_hdfs_resource_property_names = config['configurations']['cluster-env']['managed_hdfs_resource_property_names'] - managed_hdfs_resource_property_list = filter(None, [property.strip() for property in managed_hdfs_resource_property_names.split(',')]) + managed_hdfs_resource_property_list = [_f for _f in [property.strip() for property in managed_hdfs_resource_property_names.split(',')] if _f] for property_name in managed_hdfs_resource_property_list: property_value = default('/configurations/' + property_name, None) diff --git a/ambari-common/src/main/python/resource_management/libraries/functions/get_path_from_url.py b/ambari-common/src/main/python/resource_management/libraries/functions/get_path_from_url.py index 0cc57824b56..abce5699f44 100644 --- a/ambari-common/src/main/python/resource_management/libraries/functions/get_path_from_url.py +++ b/ambari-common/src/main/python/resource_management/libraries/functions/get_path_from_url.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-common/src/main/python/resource_management/libraries/functions/get_port_from_url.py b/ambari-common/src/main/python/resource_management/libraries/functions/get_port_from_url.py index 199d4fe3dd2..b527e4bcf17 100644 --- a/ambari-common/src/main/python/resource_management/libraries/functions/get_port_from_url.py +++ b/ambari-common/src/main/python/resource_management/libraries/functions/get_port_from_url.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -34,7 +34,7 @@ def get_port_from_url(address): if is_empty(address): return address - if isinstance(address, (int, long)): + if isinstance(address, int): return address if address is None or address.strip() == "": diff --git a/ambari-common/src/main/python/resource_management/libraries/functions/get_stack_version.py b/ambari-common/src/main/python/resource_management/libraries/functions/get_stack_version.py index 64ea6671ad6..27f458a70c2 100644 --- a/ambari-common/src/main/python/resource_management/libraries/functions/get_stack_version.py +++ b/ambari-common/src/main/python/resource_management/libraries/functions/get_stack_version.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -75,7 +75,7 @@ def get_stack_version(package_name): command = 'ambari-python-wrap {stack_selector_path} status {package_name}'.format( stack_selector_path=stack_selector_path, package_name=package_name) return_code, stack_output = shell.call(command, timeout=20) - except Exception, e: + except Exception as e: Logger.error(str(e)) raise Fail('Unable to execute ' + stack_selector_path + ' command to retrieve the version.') diff --git a/ambari-common/src/main/python/resource_management/libraries/functions/get_unique_id_and_date.py b/ambari-common/src/main/python/resource_management/libraries/functions/get_unique_id_and_date.py index c428a6de8e0..09192680f97 100644 --- a/ambari-common/src/main/python/resource_management/libraries/functions/get_unique_id_and_date.py +++ b/ambari-common/src/main/python/resource_management/libraries/functions/get_unique_id_and_date.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-common/src/main/python/resource_management/libraries/functions/get_user_call_output.py b/ambari-common/src/main/python/resource_management/libraries/functions/get_user_call_output.py index 7b7acae0548..10652930d90 100644 --- a/ambari-common/src/main/python/resource_management/libraries/functions/get_user_call_output.py +++ b/ambari-common/src/main/python/resource_management/libraries/functions/get_user_call_output.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -43,7 +43,7 @@ def get_user_call_output(command, user, quiet=False, is_checked_call=True, **cal # other user should be able to write to it for f in out_files: - os.chmod(f.name, 0666) + os.chmod(f.name, 0o666) command_string += " 1>" + out_files[0].name command_string += " 2>" + out_files[1].name diff --git a/ambari-common/src/main/python/resource_management/libraries/functions/hdfs_utils.py b/ambari-common/src/main/python/resource_management/libraries/functions/hdfs_utils.py index 4018e135902..5a752998d16 100644 --- a/ambari-common/src/main/python/resource_management/libraries/functions/hdfs_utils.py +++ b/ambari-common/src/main/python/resource_management/libraries/functions/hdfs_utils.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-common/src/main/python/resource_management/libraries/functions/hive_check.py b/ambari-common/src/main/python/resource_management/libraries/functions/hive_check.py index 173e87cffb3..35a2d963790 100644 --- a/ambari-common/src/main/python/resource_management/libraries/functions/hive_check.py +++ b/ambari-common/src/main/python/resource_management/libraries/functions/hive_check.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one diff --git a/ambari-common/src/main/python/resource_management/libraries/functions/install_windows_msi.py b/ambari-common/src/main/python/resource_management/libraries/functions/install_windows_msi.py index fe2f27f5a2a..c878ce7e6a1 100644 --- a/ambari-common/src/main/python/resource_management/libraries/functions/install_windows_msi.py +++ b/ambari-common/src/main/python/resource_management/libraries/functions/install_windows_msi.py @@ -32,7 +32,7 @@ import socket import os import glob -import urlparse +import urllib.parse __all__ = ['install_windows_msi'] @@ -182,7 +182,7 @@ def install_windows_msi(url_base, save_dir, save_files, hadoop_user, hadoop_pass for save_file in save_files: if save_file.lower().endswith(".msi"): msi_file = save_file - file_url = urlparse.urljoin(url_base, save_file) + file_url = urllib.parse.urljoin(url_base, save_file) try: download_file(file_url, os.path.join(msi_save_dir, save_file)) except: diff --git a/ambari-common/src/main/python/resource_management/libraries/functions/is_empty.py b/ambari-common/src/main/python/resource_management/libraries/functions/is_empty.py index f920d02a2c8..e34e7a4d70d 100644 --- a/ambari-common/src/main/python/resource_management/libraries/functions/is_empty.py +++ b/ambari-common/src/main/python/resource_management/libraries/functions/is_empty.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-common/src/main/python/resource_management/libraries/functions/jmx.py b/ambari-common/src/main/python/resource_management/libraries/functions/jmx.py index dbd00923c55..e76d78b3e1c 100644 --- a/ambari-common/src/main/python/resource_management/libraries/functions/jmx.py +++ b/ambari-common/src/main/python/resource_management/libraries/functions/jmx.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -17,7 +17,7 @@ See the License for the specific language governing permissions and limitations under the License. ''' -import urllib2 +import urllib.request, urllib.error, urllib.parse import ambari_simplejson as json # simplejson is much faster comparing to Python 2.6 json module and has the same functions set. from resource_management.core import shell from resource_management.core.logger import Logger diff --git a/ambari-common/src/main/python/resource_management/libraries/functions/log_process_information.py b/ambari-common/src/main/python/resource_management/libraries/functions/log_process_information.py index 175c6118a6b..c8353e7d3cb 100644 --- a/ambari-common/src/main/python/resource_management/libraries/functions/log_process_information.py +++ b/ambari-common/src/main/python/resource_management/libraries/functions/log_process_information.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-common/src/main/python/resource_management/libraries/functions/lzo_utils.py b/ambari-common/src/main/python/resource_management/libraries/functions/lzo_utils.py index 7d7046c590e..3f4350a9d72 100644 --- a/ambari-common/src/main/python/resource_management/libraries/functions/lzo_utils.py +++ b/ambari-common/src/main/python/resource_management/libraries/functions/lzo_utils.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-common/src/main/python/resource_management/libraries/functions/module_version.py b/ambari-common/src/main/python/resource_management/libraries/functions/module_version.py index 6ec4ba33cee..d8307b8db9a 100644 --- a/ambari-common/src/main/python/resource_management/libraries/functions/module_version.py +++ b/ambari-common/src/main/python/resource_management/libraries/functions/module_version.py @@ -63,7 +63,7 @@ def to_list(self): self.__build ] - def __cmp__(self, other): + def cmp_version(self, other): """ :type other ModuleVersion @@ -81,7 +81,19 @@ def __cmp__(self, other): if r != 0: break - return 1 if r > 0 else -1 if r < 0 else 0 + return r + + def __lt__(self, other): + r = self.cmp_version(other) + return r < 0 + + def __gt__(self, other): + r = self.cmp_version(other) + return r > 0 + + def __eq__(self, other): + r = self.cmp_version(other) + return r == 0 @classmethod def parse(cls, module_version): diff --git a/ambari-common/src/main/python/resource_management/libraries/functions/mounted_dirs_helper.py b/ambari-common/src/main/python/resource_management/libraries/functions/mounted_dirs_helper.py index 712eacf8078..6655e45cf50 100644 --- a/ambari-common/src/main/python/resource_management/libraries/functions/mounted_dirs_helper.py +++ b/ambari-common/src/main/python/resource_management/libraries/functions/mounted_dirs_helper.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -57,7 +57,7 @@ def get_dir_to_mount_from_file(history_filename): line_array = line.split(",") if line_array and len(line_array) == 2: dir_to_mount[line_array[0]] = line_array[1] - except Exception, e: + except Exception as e: Logger.error("Encountered error while attempting to read dir mount mount values from file %s" % str(history_filename)) return dir_to_mount @@ -88,7 +88,7 @@ def handle_mounted_dirs(func, dirs_string, history_filename, update_cache=True): Directory(os.path.dirname(history_filename), create_parents = True, - mode=0755, + mode=0o755, ) # Get the dirs that Ambari knows about and their last known mount point @@ -179,7 +179,7 @@ def handle_mounted_dirs(func, dirs_string, history_filename, update_cache=True): Logger.error(header + msg + header) dir_to_mount = DIR_TO_MOUNT_HEADER - for kv in dir_to_mount_point.iteritems(): + for kv in dir_to_mount_point.items(): dir_to_mount += kv[0] + "," + kv[1] + "\n" return dir_to_mount @@ -227,7 +227,7 @@ def get_mounts_with_multiple_data_dirs(mount_points, dirs): mount_dirs[mount_point].append(dir) partition_mounts_list = [] - for mount_point, dir_list in mount_dirs.iteritems(): + for mount_point, dir_list in mount_dirs.items(): if len(dir_list) > 1: partition_mounts_list.append((mount_point, dir_list)) diff --git a/ambari-common/src/main/python/resource_management/libraries/functions/mpack_version.py b/ambari-common/src/main/python/resource_management/libraries/functions/mpack_version.py index 664f9fee25c..4c9816f02f5 100644 --- a/ambari-common/src/main/python/resource_management/libraries/functions/mpack_version.py +++ b/ambari-common/src/main/python/resource_management/libraries/functions/mpack_version.py @@ -63,7 +63,7 @@ def to_list(self): self.__build ] - def __cmp__(self, other): + def cmp_version(self, other): """ :type other MpackVersion @@ -81,7 +81,19 @@ def __cmp__(self, other): if r != 0: break - return 1 if r > 0 else -1 if r < 0 else 0 + return r + + def __lt__(self, other): + r = self.cmp_version(other) + return r < 0 + + def __gt__(self, other): + r = self.cmp_version(other) + return r > 0 + + def __eq__(self, other): + r = self.cmp_version(other) + return r == 0 @classmethod def parse(cls, mpack_version): diff --git a/ambari-common/src/main/python/resource_management/libraries/functions/namenode_ha_utils.py b/ambari-common/src/main/python/resource_management/libraries/functions/namenode_ha_utils.py index 2ffd3cc1bc4..589810b9a8f 100644 --- a/ambari-common/src/main/python/resource_management/libraries/functions/namenode_ha_utils.py +++ b/ambari-common/src/main/python/resource_management/libraries/functions/namenode_ha_utils.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one diff --git a/ambari-common/src/main/python/resource_management/libraries/functions/oozie_prepare_war.py b/ambari-common/src/main/python/resource_management/libraries/functions/oozie_prepare_war.py index 5ba48b87081..6138af1916f 100644 --- a/ambari-common/src/main/python/resource_management/libraries/functions/oozie_prepare_war.py +++ b/ambari-common/src/main/python/resource_management/libraries/functions/oozie_prepare_war.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -89,11 +89,11 @@ def prepare_war(params): # Generate marker files File(prepare_war_cmd_file, content=command_to_file, - mode=0644, + mode=0o644, ) File(libext_content_file, content=libext_content, - mode=0644, + mode=0o644, ) else: Logger.info(format("No need to run prepare-war since marker file {prepare_war_cmd_file} already exists.")) diff --git a/ambari-common/src/main/python/resource_management/libraries/functions/package_conditions.py b/ambari-common/src/main/python/resource_management/libraries/functions/package_conditions.py index 80c661cd8c1..f84d8e0e4ec 100644 --- a/ambari-common/src/main/python/resource_management/libraries/functions/package_conditions.py +++ b/ambari-common/src/main/python/resource_management/libraries/functions/package_conditions.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-common/src/main/python/resource_management/libraries/functions/ranger_functions.py b/ambari-common/src/main/python/resource_management/libraries/functions/ranger_functions.py index 2ac1f3208ed..37503f0f909 100644 --- a/ambari-common/src/main/python/resource_management/libraries/functions/ranger_functions.py +++ b/ambari-common/src/main/python/resource_management/libraries/functions/ranger_functions.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -21,14 +21,14 @@ import re import time import sys -import urllib2 +import urllib.request, urllib.error, urllib.parse import base64 -import httplib +import http.client # simplejson is much faster comparing to Python 2.6 json module and has the same functions set. import ambari_simplejson as json -from StringIO import StringIO as BytesIO +from io import StringIO as BytesIO from resource_management.core.logger import Logger from ambari_commons.inet_utils import openurl from ambari_commons.exceptions import TimeoutError @@ -68,8 +68,8 @@ def get_repository_by_name_urllib2(self, name, component, status, usernamepasswo """ try: searchRepoURL = self.urlReposPub + "?name=" + name + "&type=" + component + "&status=" + status - request = urllib2.Request(searchRepoURL) - base64string = base64.encodestring(usernamepassword).replace('\n', '') + request = urllib.request.Request(searchRepoURL) + base64string = base64.b64encode(usernamepassword.encode()).decode().replace('\n', '') request.add_header("Content-Type", "application/json") request.add_header("Accept", "application/json") request.add_header("Authorization", "Basic {0}".format(base64string)) @@ -84,12 +84,12 @@ def get_repository_by_name_urllib2(self, name, component, status, usernamepasswo return None else: return None - except urllib2.URLError, e: - if isinstance(e, urllib2.HTTPError): + except urllib.error.URLError as e: + if isinstance(e, urllib.error.HTTPError): raise Fail("Error getting {0} repository for component {1}. Http status code - {2}. \n {3}".format(name, component, e.code, e.read())) else: raise Fail("Error getting {0} repository for component {1}. Reason - {2}.".format(name, component, e.reason)) - except httplib.BadStatusLine: + except http.client.BadStatusLine: raise Fail("Ranger Admin service is not reachable, please restart the service and then try again") except TimeoutError: raise Fail("Connection to Ranger Admin failed. Reason - timeout") @@ -111,8 +111,8 @@ def create_ranger_repository(self, component, repo_name, repo_properties, """ response_code = self.check_ranger_login_urllib2(self.baseUrl) repo_data = json.dumps(repo_properties) - ambari_ranger_password = unicode(ambari_ranger_password) - admin_password = unicode(admin_password) + ambari_ranger_password = str(ambari_ranger_password) + admin_password = str(admin_password) ambari_username_password_for_ranger = format('{ambari_ranger_admin}:{ambari_ranger_password}') if response_code is not None and response_code == 200: @@ -152,12 +152,12 @@ def create_repository_urllib2(self, data, usernamepassword, policy_user): """ try: searchRepoURL = self.urlReposPub - base64string = base64.encodestring('{0}'.format(usernamepassword)).replace('\n', '') + base64string = base64.b64encode('{0}'.format(usernamepassword).encode()).decode().replace('\n', '') headers = { 'Accept': 'application/json', "Content-Type": "application/json" } - request = urllib2.Request(searchRepoURL, data, headers) + request = urllib.request.Request(searchRepoURL, data, headers) request.add_header("Authorization", "Basic {0}".format(base64string)) result = openurl(request, timeout=20) response_code = result.getcode() @@ -193,12 +193,12 @@ def create_repository_urllib2(self, data, usernamepassword, policy_user): else: Logger.info('Repository creation failed') return None - except urllib2.URLError, e: - if isinstance(e, urllib2.HTTPError): + except urllib.error.URLError as e: + if isinstance(e, urllib.error.HTTPError): raise Fail("Error creating repository. Http status code - {0}. \n {1}".format(e.code, e.read())) else: raise Fail("Error creating repository. Reason - {0}.".format(e.reason)) - except httplib.BadStatusLine: + except http.client.BadStatusLine: raise Fail("Ranger Admin service is not reachable, please restart the service and then try again") except TimeoutError: raise Fail("Connection to Ranger Admin failed. Reason - timeout") @@ -213,12 +213,12 @@ def check_ranger_login_urllib2(self, url): response = openurl(url, timeout=20) response_code = response.getcode() return response_code - except urllib2.URLError, e: - if isinstance(e, urllib2.HTTPError): + except urllib.error.URLError as e: + if isinstance(e, urllib.error.HTTPError): raise Fail("Connection to Ranger Admin failed. Http status code - {0}. \n {1}".format(e.code, e.read())) else: raise Fail("Connection to Ranger Admin failed. Reason - {0}.".format(e.reason)) - except httplib.BadStatusLine, e: + except http.client.BadStatusLine as e: raise Fail("Ranger Admin service is not reachable, please restart the service and then try again") except TimeoutError: raise Fail("Connection to Ranger Admin failed. Reason - timeout") @@ -234,8 +234,8 @@ def get_policy_by_repo_name(self, name, component, status, usernamepassword): """ try: searchPolicyURL = self.urlPolicies + "?repositoryName=" + name + "&repositoryType=" + component + "&isEnabled=" + status - request = urllib2.Request(searchPolicyURL) - base64string = base64.encodestring(usernamepassword).replace('\n', '') + request = urllib.request.Request(searchPolicyURL) + base64string = base64.b64encode(usernamepassword.encode()).decode().replace('\n', '') request.add_header("Content-Type", "application/json") request.add_header("Accept", "application/json") request.add_header("Authorization", "Basic {0}".format(base64string)) @@ -246,12 +246,12 @@ def get_policy_by_repo_name(self, name, component, status, usernamepassword): return response['vXPolicies'] else: return None - except urllib2.URLError, e: - if isinstance(e, urllib2.HTTPError): + except urllib.error.URLError as e: + if isinstance(e, urllib.error.HTTPError): raise Fail("Error getting policy from repository {0} for component {1}. Http status code - {2}. \n {3}".format(name, component, e.code, e.read())) else: raise Fail("Error getting policy from repository {0} for component {1}. Reason - {2}.".format(name, component, e.reason)) - except httplib.BadStatusLine: + except http.client.BadStatusLine: raise Fail("Ranger Admin service is not reachable, please restart the service and then try again") except TimeoutError: raise Fail("Connection to Ranger Admin failed. Reason - timeout") @@ -266,12 +266,12 @@ def update_ranger_policy(self, policyId, data, usernamepassword): """ try: searchRepoURL = self.urlPolicies + "/" + str(policyId) - base64string = base64.encodestring('{0}'.format(usernamepassword)).replace('\n', '') + base64string = base64.b64encode('{0}'.format(usernamepassword).encode()).decode().replace('\n', '') headers = { 'Accept': 'application/json', "Content-Type": "application/json" } - request = urllib2.Request(searchRepoURL, data, headers) + request = urllib.request.Request(searchRepoURL, data, headers) request.add_header("Authorization", "Basic {0}".format(base64string)) request.get_method = lambda: 'PUT' result = openurl(request, timeout=20) @@ -283,12 +283,12 @@ def update_ranger_policy(self, policyId, data, usernamepassword): else: Logger.error('Update Policy failed') return None - except urllib2.URLError, e: - if isinstance(e, urllib2.HTTPError): + except urllib.error.URLError as e: + if isinstance(e, urllib.error.HTTPError): raise Fail("Error updating policy. Http status code - {0}. \n {1}".format(e.code, e.read())) else: raise Fail("Error updating policy. Reason - {0}.".format(e.reason)) - except httplib.BadStatusLine: + except http.client.BadStatusLine: raise Fail("Ranger Admin service is not reachable, please restart the service and then try again") except TimeoutError: raise Fail("Connection to Ranger Admin failed. Reason - timeout") @@ -332,8 +332,8 @@ def create_ambari_admin_user(self,ambari_admin_username, ambari_admin_password,u raise Fail('Invalid password given for Ranger Admin user for Ambari') try: url = self.urlUsers + '?name=' + str(ambari_admin_username) - request = urllib2.Request(url) - base64string = base64.encodestring(usernamepassword).replace('\n', '') + request = urllib.request.Request(url) + base64string = base64.b64encode(usernamepassword.encode()).decode().replace('\n', '') request.add_header("Content-Type", "application/json") request.add_header("Accept", "application/json") request.add_header("Authorization", "Basic {0}".format(base64string)) @@ -362,12 +362,12 @@ def create_ambari_admin_user(self,ambari_admin_username, ambari_admin_password,u admin_user['description'] = ambari_admin_username admin_user['firstName'] = ambari_admin_username data = json.dumps(admin_user) - base64string = base64.encodestring('{0}'.format(usernamepassword)).replace('\n', '') + base64string = base64.b64encode('{0}'.format(usernamepassword).encode()).decode().replace('\n', '') headers = { 'Accept': 'application/json', "Content-Type": "application/json" } - request = urllib2.Request(url, data, headers) + request = urllib.request.Request(url, data, headers) request.add_header("Authorization", "Basic {0}".format(base64string)) result = openurl(request, timeout=20) response_code = result.getcode() @@ -380,12 +380,12 @@ def create_ambari_admin_user(self,ambari_admin_username, ambari_admin_password,u return None else: return None - except urllib2.URLError, e: - if isinstance(e, urllib2.HTTPError): + except urllib.error.URLError as e: + if isinstance(e, urllib.error.HTTPError): raise Fail("Error creating ambari admin user. Http status code - {0}. \n {1}".format(e.code, e.read())) else: raise Fail("Error creating ambari admin user. Reason - {0}.".format(e.reason)) - except httplib.BadStatusLine: + except http.client.BadStatusLine: raise Fail("Ranger Admin service is not reachable, please restart the service and then try again") except TimeoutError: raise Fail("Connection to Ranger Admin failed. Reason - timeout") diff --git a/ambari-common/src/main/python/resource_management/libraries/functions/ranger_functions_v2.py b/ambari-common/src/main/python/resource_management/libraries/functions/ranger_functions_v2.py index 03b78070878..e3bbede46d1 100644 --- a/ambari-common/src/main/python/resource_management/libraries/functions/ranger_functions_v2.py +++ b/ambari-common/src/main/python/resource_management/libraries/functions/ranger_functions_v2.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -20,12 +20,12 @@ import re import time import sys -import urllib2 +import urllib.request, urllib.error, urllib.parse import base64 -import httplib +import http.client # simplejson is much faster comparing to Python 2.6 json module and has the same functions set. import ambari_simplejson as json -from StringIO import StringIO as BytesIO +from io import StringIO as BytesIO from ambari_commons.inet_utils import openurl from resource_management.core.logger import Logger from ambari_commons.exceptions import TimeoutError @@ -67,8 +67,8 @@ def get_repository_by_name_urllib2(self, name, component, status, usernamepasswo """ try: search_repo_url = self.url_repos_pub + "?name=" + name + "&type=" + component + "&status=" + status - request = urllib2.Request(search_repo_url) - base_64_string = base64.encodestring(usernamepassword).replace('\n', '') + request = urllib.request.Request(search_repo_url) + base_64_string = base64.b64encode(usernamepassword.encode()).decode().replace('\n', '') request.add_header("Content-Type", "application/json") request.add_header("Accept", "application/json") request.add_header("Authorization", "Basic {0}".format(base_64_string)) @@ -83,12 +83,12 @@ def get_repository_by_name_urllib2(self, name, component, status, usernamepasswo return None else: return None - except urllib2.URLError, e: - if isinstance(e, urllib2.HTTPError): + except urllib.error.URLError as e: + if isinstance(e, urllib.error.HTTPError): raise Fail("Error getting {0} repository for component {1}. Http status code - {2}. \n {3}".format(name, component, e.code, e.read())) else: raise Fail("Error getting {0} repository for component {1}. Reason - {2}.".format(name, component, e.reason)) - except httplib.BadStatusLine: + except http.client.BadStatusLine: raise Fail("Ranger Admin service is not reachable, please restart the service and then try again") except TimeoutError: raise Fail("Connection to Ranger Admin failed. Reason - timeout") @@ -100,8 +100,8 @@ def create_ranger_repository(self, component, repo_name, repo_properties, if not is_stack_supports_ranger_kerberos or not is_security_enabled: response_code = self.check_ranger_login_urllib2(self.base_url) repo_data = json.dumps(repo_properties) - ambari_ranger_password = unicode(ambari_ranger_password) - admin_password = unicode(admin_password) + ambari_ranger_password = str(ambari_ranger_password) + admin_password = str(admin_password) ambari_username_password_for_ranger = format('{ambari_ranger_admin}:{ambari_ranger_password}') @@ -166,12 +166,12 @@ def create_repository_urllib2(self, data, usernamepassword): """ try: search_repo_url = self.url_repos_pub - base_64_string = base64.encodestring('{0}'.format(usernamepassword)).replace('\n', '') + base_64_string = base64.b64encode('{0}'.format(usernamepassword).encode()).decode().replace('\n', '') headers = { 'Accept': 'application/json', "Content-Type": "application/json" } - request = urllib2.Request(search_repo_url, data, headers) + request = urllib.request.Request(search_repo_url, data.encode(), headers) request.add_header("Authorization", "Basic {0}".format(base_64_string)) result = openurl(request, timeout=20) response_code = result.getcode() @@ -182,12 +182,12 @@ def create_repository_urllib2(self, data, usernamepassword): return response else: raise Fail('Repository creation failed') - except urllib2.URLError, e: - if isinstance(e, urllib2.HTTPError): + except urllib.error.URLError as e: + if isinstance(e, urllib.error.HTTPError): raise Fail("Error creating repository. Http status code - {0}. \n {1}".format(e.code, e.read())) else: raise Fail("Error creating repository. Reason - {0}.".format(e.reason)) - except httplib.BadStatusLine: + except http.client.BadStatusLine: raise Fail("Ranger Admin service is not reachable, please restart the service and then try again") except TimeoutError: raise Fail("Connection to Ranger Admin failed. Reason - timeout") @@ -203,12 +203,12 @@ def check_ranger_login_urllib2(self, url): response = openurl(url, timeout=20) response_code = response.getcode() return response_code - except urllib2.URLError, e: - if isinstance(e, urllib2.HTTPError): + except urllib.error.URLError as e: + if isinstance(e, urllib.error.HTTPError): raise Fail("Connection failed to Ranger Admin. Http status code - {0}. \n {1}".format(e.code, e.read())) else: raise Fail("Connection failed to Ranger Admin. Reason - {0}.".format(e.reason)) - except httplib.BadStatusLine, e: + except http.client.BadStatusLine as e: raise Fail("Ranger Admin service is not reachable, please restart the service and then try again") except TimeoutError: raise Fail("Connection failed to Ranger Admin. Reason - timeout") @@ -227,8 +227,8 @@ def create_ambari_admin_user(self, ambari_admin_username, ambari_admin_password, raise Fail('Invalid password given for Ranger Admin user for Ambari') try: url = self.url_users + '?name=' + str(ambari_admin_username) - request = urllib2.Request(url) - base_64_string = base64.encodestring(usernamepassword).replace('\n', '') + request = urllib.request.Request(url) + base_64_string = base64.b64encode(usernamepassword.encode()).decode().replace('\n', '') request.add_header("Content-Type", "application/json") request.add_header("Accept", "application/json") request.add_header("Authorization", "Basic {0}".format(base_64_string)) @@ -257,12 +257,12 @@ def create_ambari_admin_user(self, ambari_admin_username, ambari_admin_password, admin_user['description'] = ambari_admin_username admin_user['firstName'] = ambari_admin_username data = json.dumps(admin_user) - base_64_string = base64.encodestring('{0}'.format(usernamepassword)).replace('\n', '') + base_64_string = base64.b64encode('{0}'.format(usernamepassword).encode()).decode().replace('\n', '') headers = { 'Accept': 'application/json', "Content-Type": "application/json" } - request = urllib2.Request(url, data, headers) + request = urllib.request.Request(url, data.encode(), headers) request.add_header("Authorization", "Basic {0}".format(base_64_string)) result = openurl(request, timeout=20) response_code = result.getcode() @@ -275,12 +275,12 @@ def create_ambari_admin_user(self, ambari_admin_username, ambari_admin_password, return None else: return None - except urllib2.URLError, e: - if isinstance(e, urllib2.HTTPError): + except urllib.error.URLError as e: + if isinstance(e, urllib.error.HTTPError): raise Fail("Error creating ambari admin user. Http status code - {0}. \n {1}".format(e.code, e.read())) else: raise Fail("Error creating ambari admin user. Reason - {0}.".format(e.reason)) - except httplib.BadStatusLine: + except http.client.BadStatusLine: raise Fail("Ranger Admin service is not reachable, please restart the service and then try again") except TimeoutError: raise Fail("Connection to Ranger Admin failed. Reason - timeout") @@ -306,7 +306,7 @@ def call_curl_request(self,user,keytab,principal, url, flag_http_response, reque return response, error_msg, time_millis @safe_retry(times=75, sleep_time=8, backoff_factor=1, err_class=Fail, return_on_fail=None) - def check_ranger_login_curl(self, component_user,component_user_keytab,component_user_principal,base_url,True): + def check_ranger_login_curl(self, component_user,component_user_keytab,component_user_principal,base_url,Boolean_True): """ :param url: ranger admin host url :param usernamepassword: user credentials using which repository needs to be searched. @@ -317,7 +317,7 @@ def check_ranger_login_curl(self, component_user,component_user_keytab,component time_millis = 0 try: response,error_msg,time_millis = self.call_curl_request(component_user,component_user_keytab,component_user_principal,base_url,True) - except Fail,fail: + except Fail as fail: raise Fail(fail.args) return response, error_msg,time_millis @@ -348,7 +348,7 @@ def get_repository_by_name_curl(self, component_user, component_user_keytab, com return None else: return None - except Exception, err: + except Exception as err: raise Fail('Error in call for getting Ranger service:\n {0}'.format(err)) @safe_retry(times=5, sleep_time=8, backoff_factor=1.5, err_class=Fail, return_on_fail=None) @@ -383,7 +383,7 @@ def create_repository_curl(self, component_user, component_user_keytab, componen else: Logger.info('Repository creation failed') return None - except Exception, err: + except Exception as err: raise Fail('Error in call for creating Ranger service:\n {0}'.format(err)) @safe_retry(times=5, sleep_time=8, backoff_factor=1.5, err_class=Fail, return_on_fail=None) @@ -402,12 +402,12 @@ def update_repository_urllib2(self, component, repo_name, repo_properties, admin update_repo_url = update_repo_url + "?forceRename=true" repo_update_data = json.dumps(repo_properties) usernamepassword = admin_user + ":" + admin_password - base_64_string = base64.encodestring("{0}".format(usernamepassword)).replace("\n", "") + base_64_string = base64.b64encode("{0}".format(usernamepassword).encode()).decode().replace("\n", "") headers = { 'Accept': 'application/json', 'Content-Type': 'application/json' } - request = urllib2.Request(update_repo_url, repo_update_data, headers) + request = urllib.request.Request(update_repo_url, repo_update_data.encode(), headers) request.add_header("Authorization", "Basic {0}".format(base_64_string)) request.get_method = lambda: 'PUT' result = openurl(request, timeout=20) @@ -419,12 +419,12 @@ def update_repository_urllib2(self, component, repo_name, repo_properties, admin return response else: raise Fail("Service name {0} updation failed on Ranger Admin for service {1}".format(repo_name, component)) - except urllib2.URLError, e: - if isinstance(e, urllib2.HTTPError): + except urllib.error.URLError as e: + if isinstance(e, urllib.error.HTTPError): raise Fail("Error updating service name {0} on Ranger Admin for service {1}. Http status code - {2} \n {3}".format(repo_name, component, e.code, e.read())) else: raise Fail("Error updating service name {0} on Ranger Admin for service {1}. Reason - {2}".format(repo_name, component, e.reason)) - except httplib.BadStatusLine: + except http.client.BadStatusLine: raise Fail("Ranger Admin is not reachable for updating service name {0} for service {1}".format(repo_name, component)) except TimeoutError: raise Fail("Connection to Ranger Admin failed. Reason - timeout") @@ -460,5 +460,5 @@ def update_repository_curl(self, component, repo_name, repo_properties, componen else: Logger.info("Service name {0} updation failed on Ranger Admin for service {1}".format(repo_name, component)) return None - except Exception, err: + except Exception as err: raise Fail('Error updating service name {0} on Ranger Admin for service {1}.\n Reason - {2}'.format(repo_name, component, err)) diff --git a/ambari-common/src/main/python/resource_management/libraries/functions/reload_windows_env.py b/ambari-common/src/main/python/resource_management/libraries/functions/reload_windows_env.py index e6169541346..d574c56a41d 100644 --- a/ambari-common/src/main/python/resource_management/libraries/functions/reload_windows_env.py +++ b/ambari-common/src/main/python/resource_management/libraries/functions/reload_windows_env.py @@ -19,7 +19,7 @@ """ -from _winreg import (OpenKey, EnumValue, HKEY_LOCAL_MACHINE, KEY_READ, CloseKey) +from winreg import (OpenKey, EnumValue, HKEY_LOCAL_MACHINE, KEY_READ, CloseKey) import os default_whitelist = ["FALCON_CONF_DIR", "FALCON_DATA_DIR", "FALCON_HOME", "FALCON_LOG_DIR", "FLUME_HOME", diff --git a/ambari-common/src/main/python/resource_management/libraries/functions/repo_version_history.py b/ambari-common/src/main/python/resource_management/libraries/functions/repo_version_history.py index 4273e9b1fcd..7e53613560a 100644 --- a/ambari-common/src/main/python/resource_management/libraries/functions/repo_version_history.py +++ b/ambari-common/src/main/python/resource_management/libraries/functions/repo_version_history.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -92,7 +92,7 @@ def write_actual_version_to_history_file(repository_version, actual_version): wrote_value = True if wrote_value: Logger.info("Appended value \"{0}\" to file {1} to track this as a new version.".format(value, REPO_VERSION_HISTORY_FILE)) - except Exception, err: + except Exception as err: Logger.error("Failed to write to file {0} the value: {1}. Error: {2}".format(REPO_VERSION_HISTORY_FILE, value, str(err))) return wrote_value \ No newline at end of file diff --git a/ambari-common/src/main/python/resource_management/libraries/functions/repository_util.py b/ambari-common/src/main/python/resource_management/libraries/functions/repository_util.py index aac89493380..7fa60cfe775 100644 --- a/ambari-common/src/main/python/resource_management/libraries/functions/repository_util.py +++ b/ambari-common/src/main/python/resource_management/libraries/functions/repository_util.py @@ -130,7 +130,7 @@ def __init__(self, repo_object): if isinstance(repo_object, dict): json_dict = dict(repo_object) # strict dict(from ConfigDict) to avoid hidden type conversions - elif isinstance(repo_object, (str, unicode)): + elif isinstance(repo_object, str): json_dict = json.loads(repo_object) else: raise Fail("Cannot deserialize command repository {0}".format(str(repo_object))) diff --git a/ambari-common/src/main/python/resource_management/libraries/functions/security_commons.py b/ambari-common/src/main/python/resource_management/libraries/functions/security_commons.py index 3e74b757d83..1f6ed179cdd 100644 --- a/ambari-common/src/main/python/resource_management/libraries/functions/security_commons.py +++ b/ambari-common/src/main/python/resource_management/libraries/functions/security_commons.py @@ -51,7 +51,7 @@ def update_credential_provider_path(config, config_type, dest_provider_path, fil File(dest_provider_path, owner = file_owner, group = file_group, - mode = 0640, + mode = 0o640, content = StaticFile(src_provider_path) ) # make a copy of the config dictionary since it is read-only @@ -78,7 +78,7 @@ def validate_security_config_properties(params, configuration_rules): issues = {} - for config_file, rule_sets in configuration_rules.iteritems(): + for config_file, rule_sets in configuration_rules.items(): # Each configuration rule set may have 0 or more of the following rule sets: # - value_checks # - empty_checks @@ -94,7 +94,7 @@ def validate_security_config_properties(params, configuration_rules): # The rules are expected to be a dictionary of property names to expected values rules = rule_sets['value_checks'] if 'value_checks' in rule_sets else None if rules: - for property_name, expected_value in rules.iteritems(): + for property_name, expected_value in rules.items(): actual_value = get_value(actual_values, property_name, '') if actual_value != expected_value: issues[config_file] = "Property %s contains an unexpected value. " \ @@ -156,10 +156,10 @@ def get_params_from_filesystem(conf_dir, config_files): """ result = {} from xml.etree import ElementTree as ET - import ConfigParser, StringIO + import configparser, io import re - for config_file, file_type in config_files.iteritems(): + for config_file, file_type in config_files.items(): file_name, file_ext = os.path.splitext(config_file) config_filepath = conf_dir + os.sep + config_file @@ -178,8 +178,8 @@ def get_params_from_filesystem(conf_dir, config_files): elif file_type == FILE_TYPE_PROPERTIES: with open(config_filepath, 'r') as f: config_string = '[root]\n' + f.read() - ini_fp = StringIO.StringIO(re.sub(r'\\\s*\n', '\\\n ', config_string)) - config = ConfigParser.RawConfigParser() + ini_fp = io.StringIO(re.sub(r'\\\s*\n', '\\\n ', config_string)) + config = configparser.RawConfigParser() config.readfp(ini_fp) props = config.items('root') result[file_name] = {} @@ -265,7 +265,7 @@ def new_cached_exec(key, file_path, kinit_path, temp_dir, exec_user, keytab_file try: # Ensure the proper user owns this file - File(temp_kinit_cache_filename, owner=exec_user, mode=0600) + File(temp_kinit_cache_filename, owner=exec_user, mode=0o600) # Execute the kinit Execute(command, user=exec_user) diff --git a/ambari-common/src/main/python/resource_management/libraries/functions/setup_atlas_hook.py b/ambari-common/src/main/python/resource_management/libraries/functions/setup_atlas_hook.py index 4f915a4306b..401edaa93a4 100644 --- a/ambari-common/src/main/python/resource_management/libraries/functions/setup_atlas_hook.py +++ b/ambari-common/src/main/python/resource_management/libraries/functions/setup_atlas_hook.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -140,7 +140,7 @@ def setup_atlas_hook(service_name, service_props, atlas_hook_filepath, owner, gr properties = merged_props, owner = owner, group = group, - mode = 0644) + mode = 0o644) def setup_atlas_jar_symlinks(hook_name, jar_source_dir): diff --git a/ambari-common/src/main/python/resource_management/libraries/functions/setup_ranger_plugin.py b/ambari-common/src/main/python/resource_management/libraries/functions/setup_ranger_plugin.py index 1923efebef8..35f7fb0f833 100644 --- a/ambari-common/src/main/python/resource_management/libraries/functions/setup_ranger_plugin.py +++ b/ambari-common/src/main/python/resource_management/libraries/functions/setup_ranger_plugin.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -46,7 +46,7 @@ def setup_ranger_plugin(component_select_name, service_name, previous_jdbc_jar, File(downloaded_custom_connector, content = DownloadSource(driver_curl_source), - mode = 0644 + mode = 0o644 ) Execute(('cp', '--remove-destination', downloaded_custom_connector, driver_curl_target), @@ -54,7 +54,7 @@ def setup_ranger_plugin(component_select_name, service_name, previous_jdbc_jar, sudo=True ) - File(driver_curl_target, mode=0644) + File(driver_curl_target, mode=0o644) if policymgr_mgr_url.endswith('/'): policymgr_mgr_url = policymgr_mgr_url.rstrip('/') diff --git a/ambari-common/src/main/python/resource_management/libraries/functions/setup_ranger_plugin_xml.py b/ambari-common/src/main/python/resource_management/libraries/functions/setup_ranger_plugin_xml.py index 09b816c7530..989b24363f5 100644 --- a/ambari-common/src/main/python/resource_management/libraries/functions/setup_ranger_plugin_xml.py +++ b/ambari-common/src/main/python/resource_management/libraries/functions/setup_ranger_plugin_xml.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -57,7 +57,7 @@ def setup_ranger_plugin(component_select_name, service_name, previous_jdbc_jar, File(component_downloaded_custom_connector, content = DownloadSource(component_driver_curl_source), - mode = 0644 + mode = 0o644 ) Execute(('cp', '--remove-destination', component_downloaded_custom_connector, component_driver_curl_target), @@ -65,7 +65,7 @@ def setup_ranger_plugin(component_select_name, service_name, previous_jdbc_jar, sudo=True ) - File(component_driver_curl_target, mode=0644) + File(component_driver_curl_target, mode=0o644) if policymgr_mgr_url.endswith('/'): policymgr_mgr_url = policymgr_mgr_url.rstrip('/') @@ -101,14 +101,14 @@ def setup_ranger_plugin(component_select_name, service_name, previous_jdbc_jar, File(format('{component_conf_dir}/ranger-security.xml'), owner = component_user, group = component_group, - mode = 0644, + mode = 0o644, content = InlineTemplate(format('\n{current_datetime}\n')) ) Directory([os.path.join('/etc', 'ranger', repo_name), os.path.join('/etc', 'ranger', repo_name, 'policycache')], owner = component_user, group = component_group, - mode=0775, + mode=0o775, create_parents = True, cd_access = 'a' ) @@ -117,7 +117,7 @@ def setup_ranger_plugin(component_select_name, service_name, previous_jdbc_jar, File(os.path.join('/etc', 'ranger', repo_name, 'policycache', format('{cache_service}_{repo_name}.json')), owner = component_user, group = component_group, - mode = 0644 + mode = 0o644 ) # remove plain-text password from xml configs @@ -134,7 +134,7 @@ def setup_ranger_plugin(component_select_name, service_name, previous_jdbc_jar, configuration_attributes=plugin_audit_attributes, owner = component_user, group = component_group, - mode=0744) + mode=0o744) XmlConfig(format('ranger-{service_name}-security.xml'), conf_dir=component_conf_dir, @@ -142,7 +142,7 @@ def setup_ranger_plugin(component_select_name, service_name, previous_jdbc_jar, configuration_attributes=plugin_security_attributes, owner = component_user, group = component_group, - mode=0744) + mode=0o744) # remove plain-text password from xml configs plugin_password_properties = ['xasecure.policymgr.clientssl.keystore.password', 'xasecure.policymgr.clientssl.truststore.password'] @@ -160,7 +160,7 @@ def setup_ranger_plugin(component_select_name, service_name, previous_jdbc_jar, configuration_attributes=plugin_policymgr_ssl_attributes, owner = component_user, group = component_group, - mode=0744) + mode=0o744) else: XmlConfig("ranger-policymgr-ssl.xml", conf_dir=component_conf_dir, @@ -168,7 +168,7 @@ def setup_ranger_plugin(component_select_name, service_name, previous_jdbc_jar, configuration_attributes=plugin_policymgr_ssl_attributes, owner = component_user, group = component_group, - mode=0744) + mode=0o744) setup_ranger_plugin_keystore(service_name, audit_db_is_enabled, stack_version, credential_file, xa_audit_db_password, ssl_truststore_password, ssl_keystore_password, @@ -220,7 +220,7 @@ def setup_ranger_plugin_keystore(service_name, audit_db_is_enabled, stack_versio File(credential_file, owner = component_user, group = component_group, - mode = 0640 + mode = 0o640 ) dot_jceks_crc_file_path = os.path.join(os.path.dirname(credential_file), "." + os.path.basename(credential_file) + ".crc") @@ -229,7 +229,7 @@ def setup_ranger_plugin_keystore(service_name, audit_db_is_enabled, stack_versio owner = component_user, group = component_group, only_if = format("test -e {dot_jceks_crc_file_path}"), - mode = 0640 + mode = 0o640 ) def setup_configuration_file_for_required_plugins(component_user, component_group, create_core_site_path, @@ -241,7 +241,7 @@ def setup_configuration_file_for_required_plugins(component_user, component_grou configuration_attributes = configuration_attributes, owner = component_user, group = component_group, - mode = 0644, + mode = 0o644, xml_include_file = xml_include_file ) @@ -296,7 +296,7 @@ def generate_ranger_service_config(ranger_plugin_properties): ranger_plugin_properties_copy = {} ranger_plugin_properties_copy.update(ranger_plugin_properties) - for key, value in ranger_plugin_properties_copy.iteritems(): + for key, value in ranger_plugin_properties_copy.items(): if key.startswith("ranger.service.config.param."): modify_key_name = key.replace("ranger.service.config.param.","") custom_service_config_dict[modify_key_name] = value @@ -317,7 +317,7 @@ def get_policycache_service_name(service_name, repo_name, cache_service_list): Logger.warning("If service name for {0} is not created on Ranger Admin, then to re-create it delete policy cache file: {1}".format(service_name, policycache_json_file)) service_name_exist_flag = True break - except Exception, err: + except Exception as err: Logger.error("Error occurred while fetching service name from policy cache file.\nError: {0}".format(err)) return service_name_exist_flag diff --git a/ambari-common/src/main/python/resource_management/libraries/functions/show_logs.py b/ambari-common/src/main/python/resource_management/libraries/functions/show_logs.py index 8a0d5b963fb..b5aa1f5986b 100644 --- a/ambari-common/src/main/python/resource_management/libraries/functions/show_logs.py +++ b/ambari-common/src/main/python/resource_management/libraries/functions/show_logs.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-common/src/main/python/resource_management/libraries/functions/simulate_perf_cluster_alert_behaviour.py b/ambari-common/src/main/python/resource_management/libraries/functions/simulate_perf_cluster_alert_behaviour.py index 736e5e36ebd..1d901aac6d7 100644 --- a/ambari-common/src/main/python/resource_management/libraries/functions/simulate_perf_cluster_alert_behaviour.py +++ b/ambari-common/src/main/python/resource_management/libraries/functions/simulate_perf_cluster_alert_behaviour.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one @@ -82,7 +82,7 @@ def simulate_perf_cluster_alert_behaviour(alert_behaviour_properties, configurat if alert_timeout_return_value and alert_timeout_secs: logger.info("Sleeping for {0} seconds".format(alert_timeout_secs)) - print "Sleeping for {0} seconds".format(alert_timeout_secs) + print("Sleeping for {0} seconds".format(alert_timeout_secs)) time.sleep(int(alert_timeout_secs)) return (return_values_map[alert_timeout_return_value][0], [return_values_map[alert_timeout_return_value][1]]) else: diff --git a/ambari-common/src/main/python/resource_management/libraries/functions/solr_cloud_util.py b/ambari-common/src/main/python/resource_management/libraries/functions/solr_cloud_util.py index c143d213eee..35183e9d1a0 100644 --- a/ambari-common/src/main/python/resource_management/libraries/functions/solr_cloud_util.py +++ b/ambari-common/src/main/python/resource_management/libraries/functions/solr_cloud_util.py @@ -47,7 +47,7 @@ def __create_solr_cloud_cli_prefix(zookeeper_quorum, solr_znode, java64_home, ja return solr_cli_prefix def __append_flags_if_exists(command, flagsDict): - for key, value in flagsDict.iteritems(): + for key, value in flagsDict.items(): if value is not None: command+= " %s %s" % (key, value) return command @@ -221,7 +221,7 @@ def copy_solr_znode_from_local(zookeeper_quorum, solr_znode, java64_home, jaas_f Execute(copy_znode_cmd) def default_config(config, name, default_value): - subdicts = filter(None, name.split('/')) + subdicts = [_f for _f in name.split('/') if _f] if not config: return default_value for x in subdicts: @@ -239,19 +239,19 @@ def setup_solr_client(config, custom_log4j = True, custom_log_location = None, l solr_client_log_maxbackupindex = default_config(config, 'configurations/infra-solr-client-log4j/infra_client_log_maxbackupindex', 60) Directory(solr_client_log_dir, - mode=0755, + mode=0o755, cd_access='a', create_parents=True ) Directory(solr_client_dir, - mode=0755, + mode=0o755, cd_access='a', create_parents=True, recursive_ownership=True ) solrCliFilename = format("{solr_client_dir}/solrCloudCli.sh") File(solrCliFilename, - mode=0755, + mode=0o755, content=StaticFile(solrCliFilename) ) if custom_log4j: @@ -270,15 +270,15 @@ def setup_solr_client(config, custom_log4j = True, custom_log_location = None, l File(format("{solr_client_dir}/log4j.properties"), content=template.render(context), - mode=0644 + mode=0o644 ) else: File(format("{solr_client_dir}/log4j.properties"), - mode=0644 + mode=0o644 ) File(solr_client_log, - mode=0664, + mode=0o664, content='' ) diff --git a/ambari-common/src/main/python/resource_management/libraries/functions/stack_features.py b/ambari-common/src/main/python/resource_management/libraries/functions/stack_features.py index c9de8b883fb..099516ae45e 100644 --- a/ambari-common/src/main/python/resource_management/libraries/functions/stack_features.py +++ b/ambari-common/src/main/python/resource_management/libraries/functions/stack_features.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-common/src/main/python/resource_management/libraries/functions/stack_select.py b/ambari-common/src/main/python/resource_management/libraries/functions/stack_select.py index 1eaf49ed508..ae6e396eb59 100644 --- a/ambari-common/src/main/python/resource_management/libraries/functions/stack_select.py +++ b/ambari-common/src/main/python/resource_management/libraries/functions/stack_select.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -42,6 +42,7 @@ from resource_management.libraries.functions import stack_features from resource_management.libraries.functions import StackFeature from resource_management.libraries.functions import upgrade_summary +import importlib STACK_SELECT_PREFIX = 'ambari-python-wrap' @@ -329,7 +330,7 @@ def select(component, version): for moduleName in param_modules: if moduleName in modules: module = modules.get(moduleName) - reload(module) + importlib.reload(module) Logger.info("After {0}, reloaded module {1}".format(command, moduleName)) diff --git a/ambari-common/src/main/python/resource_management/libraries/functions/stack_tools.py b/ambari-common/src/main/python/resource_management/libraries/functions/stack_tools.py index eecfce4d364..c578b1171e1 100644 --- a/ambari-common/src/main/python/resource_management/libraries/functions/stack_tools.py +++ b/ambari-common/src/main/python/resource_management/libraries/functions/stack_tools.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one diff --git a/ambari-common/src/main/python/resource_management/libraries/functions/substitute_vars.py b/ambari-common/src/main/python/resource_management/libraries/functions/substitute_vars.py index 20362083d10..cb0d2e88d15 100644 --- a/ambari-common/src/main/python/resource_management/libraries/functions/substitute_vars.py +++ b/ambari-common/src/main/python/resource_management/libraries/functions/substitute_vars.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-common/src/main/python/resource_management/libraries/functions/tar_archive.py b/ambari-common/src/main/python/resource_management/libraries/functions/tar_archive.py index 3313288cbe8..9bb0dfcb23c 100644 --- a/ambari-common/src/main/python/resource_management/libraries/functions/tar_archive.py +++ b/ambari-common/src/main/python/resource_management/libraries/functions/tar_archive.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one diff --git a/ambari-common/src/main/python/resource_management/libraries/functions/upgrade_summary.py b/ambari-common/src/main/python/resource_management/libraries/functions/upgrade_summary.py index e6da97f06dc..c8546cafbe4 100644 --- a/ambari-common/src/main/python/resource_management/libraries/functions/upgrade_summary.py +++ b/ambari-common/src/main/python/resource_management/libraries/functions/upgrade_summary.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -89,7 +89,7 @@ def get_upgrade_summary(): service_summary_dict = {} service_summary = upgrade_summary["services"] - for service_name, service_summary_json in service_summary.iteritems(): + for service_name, service_summary_json in service_summary.items(): service_summary = UpgradeServiceSummary(service_name = service_name, source_stack = service_summary_json["sourceStackId"], source_version = service_summary_json["sourceVersion"], diff --git a/ambari-common/src/main/python/resource_management/libraries/functions/validate.py b/ambari-common/src/main/python/resource_management/libraries/functions/validate.py index c3c9ae750b8..3a596ac77f7 100644 --- a/ambari-common/src/main/python/resource_management/libraries/functions/validate.py +++ b/ambari-common/src/main/python/resource_management/libraries/functions/validate.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-common/src/main/python/resource_management/libraries/functions/version.py b/ambari-common/src/main/python/resource_management/libraries/functions/version.py index 7d6661fd5cd..7823dcb2549 100644 --- a/ambari-common/src/main/python/resource_management/libraries/functions/version.py +++ b/ambari-common/src/main/python/resource_management/libraries/functions/version.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -78,7 +78,8 @@ def compare_versions(version1, version2, format=False): """ v1 = version1 if not format else format_stack_version(version1) v2 = version2 if not format else format_stack_version(version2) - + def cmp(a, b): + return (a > b) - (a < b) max_segments = max(len(v1.split(".")), len(v2.split("."))) return cmp(_normalize(v1, desired_segments=max_segments), _normalize(v2, desired_segments=max_segments)) diff --git a/ambari-common/src/main/python/resource_management/libraries/functions/version_select_util.py b/ambari-common/src/main/python/resource_management/libraries/functions/version_select_util.py index 52034078884..6f14cf999e2 100644 --- a/ambari-common/src/main/python/resource_management/libraries/functions/version_select_util.py +++ b/ambari-common/src/main/python/resource_management/libraries/functions/version_select_util.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -64,7 +64,7 @@ def get_component_version_from_symlink(stack_name, component_name): matches = re.findall(r"( [\d\.]+(\-\d+)?)", out) version = matches[0][0].strip() if matches and len(matches) > 0 and len(matches[0]) > 0 else None Logger.debug("Version for component %s: %s" % (component_name, str(version))) - except Exception, e: + except Exception as e: Logger.error("Could not determine stack version for component %s by calling '%s'. Return Code: %s, Output: %s." % (component_name, get_stack_comp_version_cmd, str(code), str(out))) else: @@ -108,7 +108,7 @@ def get_component_version_with_stack_selector(stack_selector_path, component_nam Logger.debug("Command: %s\nOutput: %s" % (get_stack_comp_version_cmd, str(out))) matches = re.findall(r"([\d\.]+\-\d+)", out) version = matches[0] if matches and len(matches) > 0 else None - except Exception, e: + except Exception as e: Logger.error("Could not determine stack version for component %s by calling '%s'. Return Code: %s, Output: %s." % (component_name, get_stack_comp_version_cmd, str(code), str(out))) return version diff --git a/ambari-common/src/main/python/resource_management/libraries/functions/zip_archive.py b/ambari-common/src/main/python/resource_management/libraries/functions/zip_archive.py index cab36271787..54228fd08f2 100644 --- a/ambari-common/src/main/python/resource_management/libraries/functions/zip_archive.py +++ b/ambari-common/src/main/python/resource_management/libraries/functions/zip_archive.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one diff --git a/ambari-common/src/main/python/resource_management/libraries/providers/__init__.py b/ambari-common/src/main/python/resource_management/libraries/providers/__init__.py index d88d94885c9..b60edef2320 100644 --- a/ambari-common/src/main/python/resource_management/libraries/providers/__init__.py +++ b/ambari-common/src/main/python/resource_management/libraries/providers/__init__.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-common/src/main/python/resource_management/libraries/providers/execute_hadoop.py b/ambari-common/src/main/python/resource_management/libraries/providers/execute_hadoop.py index d831b6d5551..d6988c2e6e5 100644 --- a/ambari-common/src/main/python/resource_management/libraries/providers/execute_hadoop.py +++ b/ambari-common/src/main/python/resource_management/libraries/providers/execute_hadoop.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-common/src/main/python/resource_management/libraries/providers/execute_hdfs.py b/ambari-common/src/main/python/resource_management/libraries/providers/execute_hdfs.py index e207000d7e6..5b334cba4b0 100644 --- a/ambari-common/src/main/python/resource_management/libraries/providers/execute_hdfs.py +++ b/ambari-common/src/main/python/resource_management/libraries/providers/execute_hdfs.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-common/src/main/python/resource_management/libraries/providers/hdfs_resource.py b/ambari-common/src/main/python/resource_management/libraries/providers/hdfs_resource.py index 0efb1437540..a6b0c3d7975 100644 --- a/ambari-common/src/main/python/resource_management/libraries/providers/hdfs_resource.py +++ b/ambari-common/src/main/python/resource_management/libraries/providers/hdfs_resource.py @@ -26,7 +26,7 @@ import pwd import re import time -from urlparse import urlparse +from urllib.parse import urlparse from resource_management.core import shell from resource_management.core import sudo from resource_management.core.base import Fail @@ -118,11 +118,11 @@ def action_delayed_for_nameservice(self, nameservice, action_name, main_resource env.config[env_dict_key] = [] # Put values in dictionary-resource - for field_name, json_field_name in RESOURCE_TO_JSON_FIELDS.iteritems(): + for field_name, json_field_name in RESOURCE_TO_JSON_FIELDS.items(): if field_name == 'action': resource[json_field_name] = action_name elif field_name == 'mode' and main_resource.resource.mode: - resource[json_field_name] = oct(main_resource.resource.mode)[1:] + resource[json_field_name] = oct(main_resource.resource.mode)[2:] elif field_name == 'manage_if_exists': resource[json_field_name] = main_resource.manage_if_exists elif getattr(main_resource.resource, field_name): @@ -268,7 +268,7 @@ def _run_command(self, target, operation, method='POST', assertable_result=True, if not self.security_enabled: request_args['user.name'] = self.run_user - for k,v in request_args.iteritems(): + for k,v in request_args.items(): url = format("{url}&{k}={v}") cmd = ["curl", "-sS","-L", "-w", "%{http_code}", "-X", method] @@ -398,7 +398,7 @@ def action_delayed(self, action_name, main_resource): def action_delayed_for_nameservice(self, nameservice, action_name, main_resource): self.util = WebHDFSUtil(main_resource.resource.hdfs_site, nameservice, main_resource.resource.user, main_resource.resource.security_enabled, main_resource.resource.logoutput) - self.mode = oct(main_resource.resource.mode)[1:] if main_resource.resource.mode else main_resource.resource.mode + self.mode = oct(main_resource.resource.mode)[2:] if main_resource.resource.mode else main_resource.resource.mode self.mode_set = False self.main_resource = main_resource if action_name == "download": diff --git a/ambari-common/src/main/python/resource_management/libraries/providers/modify_properties_file.py b/ambari-common/src/main/python/resource_management/libraries/providers/modify_properties_file.py index f45f27d79dd..90a902fb6a7 100644 --- a/ambari-common/src/main/python/resource_management/libraries/providers/modify_properties_file.py +++ b/ambari-common/src/main/python/resource_management/libraries/providers/modify_properties_file.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -35,12 +35,12 @@ def action_create(self): comment_symbols = self.resource.comment_symbols delimiter = self.resource.key_value_delimiter properties = self.resource.properties - unsaved_values = properties.keys() + unsaved_values = list(properties.keys()) new_content_lines = [] final_content_lines = "" if sudo.path_isfile(filename): - file_content = sudo.read_file(filename, encoding=self.resource.encoding) + file_content = sudo.read_file(filename, encoding=self.resource.encoding).decode() new_content_lines += file_content.split('\n') Logger.info(format("Modifying existing properties file: {filename}")) @@ -53,18 +53,18 @@ def action_create(self): in_var_value = line.split(delimiter)[1].strip() if in_var_name in properties: - value = InlineTemplate(unicode(properties[in_var_name])).get_content() - new_content_lines[line_num] = u"{0}{1}{2}".format(unicode(in_var_name), delimiter, value) + value = InlineTemplate(str(properties[in_var_name])).get_content() + new_content_lines[line_num] = "{0}{1}{2}".format(str(in_var_name), delimiter, value) unsaved_values.remove(in_var_name) else: Logger.info(format("Creating new properties file as {filename} doesn't exist")) for property_name in unsaved_values: - value = InlineTemplate(unicode(properties[property_name])).get_content() - line = u"{0}{1}{2}".format(unicode(property_name), delimiter, value) + value = InlineTemplate(str(properties[property_name])).get_content() + line = "{0}{1}{2}".format(str(property_name), delimiter, value) new_content_lines.append(line) - final_content_lines = u"\n".join(new_content_lines) + final_content_lines = "\n".join(new_content_lines) if not final_content_lines.endswith("\n"): final_content_lines = final_content_lines + "\n" diff --git a/ambari-common/src/main/python/resource_management/libraries/providers/monitor_webserver.py b/ambari-common/src/main/python/resource_management/libraries/providers/monitor_webserver.py index 276dd209095..11b3b6d09d7 100644 --- a/ambari-common/src/main/python/resource_management/libraries/providers/monitor_webserver.py +++ b/ambari-common/src/main/python/resource_management/libraries/providers/monitor_webserver.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-common/src/main/python/resource_management/libraries/providers/msi.py b/ambari-common/src/main/python/resource_management/libraries/providers/msi.py index f615d76e993..8048fa3c46b 100644 --- a/ambari-common/src/main/python/resource_management/libraries/providers/msi.py +++ b/ambari-common/src/main/python/resource_management/libraries/providers/msi.py @@ -20,7 +20,7 @@ from resource_management import * -import urlparse +import urllib.parse from ambari_commons.inet_utils import download_file import os @@ -42,7 +42,7 @@ def action_install(self): # build string from passed arguments to Msi resource dict_args_str = ' ALLUSERS="1"' - for k, v in dict_args.iteritems(): + for k, v in dict_args.items(): dict_args_str += " " + str(k)+"="+str(v) list_args_str = '' for a in list_args: @@ -50,7 +50,7 @@ def action_install(self): # if http source present we download msi and then execute it if http_source: - download_url = urlparse.urljoin(http_source, name) + download_url = urllib.parse.urljoin(http_source, name) msi_file_path = os.path.join(working_dir, msi_filename) download_file(download_url, msi_file_path) if not os.path.exists(marker_file): diff --git a/ambari-common/src/main/python/resource_management/libraries/providers/properties_file.py b/ambari-common/src/main/python/resource_management/libraries/providers/properties_file.py index 283cc3f5544..849ed7a5d5e 100644 --- a/ambari-common/src/main/python/resource_management/libraries/providers/properties_file.py +++ b/ambari-common/src/main/python/resource_management/libraries/providers/properties_file.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-common/src/main/python/resource_management/libraries/providers/repository.py b/ambari-common/src/main/python/resource_management/libraries/providers/repository.py index 6fd1155a92e..9719d3df948 100644 --- a/ambari-common/src/main/python/resource_management/libraries/providers/repository.py +++ b/ambari-common/src/main/python/resource_management/libraries/providers/repository.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -46,11 +46,11 @@ class RepositoryProvider(Provider): def action_create(self): with tempfile.NamedTemporaryFile() as tmpf: with tempfile.NamedTemporaryFile() as old_repo_tmpf: - for repo_file_path, repo_file_content in RepositoryProvider.repo_files_content.iteritems(): + for repo_file_path, repo_file_content in RepositoryProvider.repo_files_content.items(): repo_file_content = repo_file_content.strip() File(tmpf.name, - content=repo_file_content, + content=repo_file_content.encode(), owner=os_utils.current_user(), ) @@ -144,6 +144,7 @@ def action_remove(self): def update(self, repo_file_path): repo_file_name = os.path.basename(repo_file_path) + self.update_cmd[4]='Dir::Etc::sourcelist=sources.list.d/%s' % repo_file_name update_cmd_formatted = [format(x) for x in self.update_cmd] update_failed_exception = None diff --git a/ambari-common/src/main/python/resource_management/libraries/providers/template_config.py b/ambari-common/src/main/python/resource_management/libraries/providers/template_config.py index f97e0d6c140..a23e60f61b4 100644 --- a/ambari-common/src/main/python/resource_management/libraries/providers/template_config.py +++ b/ambari-common/src/main/python/resource_management/libraries/providers/template_config.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-common/src/main/python/resource_management/libraries/providers/xml_config.py b/ambari-common/src/main/python/resource_management/libraries/providers/xml_config.py index bf196b552ff..89445b74676 100644 --- a/ambari-common/src/main/python/resource_management/libraries/providers/xml_config.py +++ b/ambari-common/src/main/python/resource_management/libraries/providers/xml_config.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-common/src/main/python/resource_management/libraries/resources/__init__.py b/ambari-common/src/main/python/resource_management/libraries/resources/__init__.py index 6f06210635e..1af0322544c 100644 --- a/ambari-common/src/main/python/resource_management/libraries/resources/__init__.py +++ b/ambari-common/src/main/python/resource_management/libraries/resources/__init__.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-common/src/main/python/resource_management/libraries/resources/execute_hadoop.py b/ambari-common/src/main/python/resource_management/libraries/resources/execute_hadoop.py index 2678eb7b085..6f04b857343 100644 --- a/ambari-common/src/main/python/resource_management/libraries/resources/execute_hadoop.py +++ b/ambari-common/src/main/python/resource_management/libraries/resources/execute_hadoop.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-common/src/main/python/resource_management/libraries/resources/execute_hdfs.py b/ambari-common/src/main/python/resource_management/libraries/resources/execute_hdfs.py index e85b448a5ea..eac7b6d01d7 100644 --- a/ambari-common/src/main/python/resource_management/libraries/resources/execute_hdfs.py +++ b/ambari-common/src/main/python/resource_management/libraries/resources/execute_hdfs.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-common/src/main/python/resource_management/libraries/resources/modify_properties_file.py b/ambari-common/src/main/python/resource_management/libraries/resources/modify_properties_file.py index d80d59682ca..aed5f4ced0c 100644 --- a/ambari-common/src/main/python/resource_management/libraries/resources/modify_properties_file.py +++ b/ambari-common/src/main/python/resource_management/libraries/resources/modify_properties_file.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-common/src/main/python/resource_management/libraries/resources/monitor_webserver.py b/ambari-common/src/main/python/resource_management/libraries/resources/monitor_webserver.py index dfd11743f7e..654bcdb0e53 100644 --- a/ambari-common/src/main/python/resource_management/libraries/resources/monitor_webserver.py +++ b/ambari-common/src/main/python/resource_management/libraries/resources/monitor_webserver.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-common/src/main/python/resource_management/libraries/resources/properties_file.py b/ambari-common/src/main/python/resource_management/libraries/resources/properties_file.py index 826fcf844a9..2a98155ef42 100644 --- a/ambari-common/src/main/python/resource_management/libraries/resources/properties_file.py +++ b/ambari-common/src/main/python/resource_management/libraries/resources/properties_file.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-common/src/main/python/resource_management/libraries/resources/repository.py b/ambari-common/src/main/python/resource_management/libraries/resources/repository.py index 99bdc40ab96..b425258fb11 100644 --- a/ambari-common/src/main/python/resource_management/libraries/resources/repository.py +++ b/ambari-common/src/main/python/resource_management/libraries/resources/repository.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-common/src/main/python/resource_management/libraries/resources/template_config.py b/ambari-common/src/main/python/resource_management/libraries/resources/template_config.py index 8ce2a00cd33..2166e5d1a02 100644 --- a/ambari-common/src/main/python/resource_management/libraries/resources/template_config.py +++ b/ambari-common/src/main/python/resource_management/libraries/resources/template_config.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-common/src/main/python/resource_management/libraries/resources/xml_config.py b/ambari-common/src/main/python/resource_management/libraries/resources/xml_config.py index c46f35cacee..290d5c3f4ef 100644 --- a/ambari-common/src/main/python/resource_management/libraries/resources/xml_config.py +++ b/ambari-common/src/main/python/resource_management/libraries/resources/xml_config.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-common/src/main/python/resource_management/libraries/script/__init__.py b/ambari-common/src/main/python/resource_management/libraries/script/__init__.py index 6e4cc09c534..61f0c1c07d2 100644 --- a/ambari-common/src/main/python/resource_management/libraries/script/__init__.py +++ b/ambari-common/src/main/python/resource_management/libraries/script/__init__.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-common/src/main/python/resource_management/libraries/script/config_dictionary.py b/ambari-common/src/main/python/resource_management/libraries/script/config_dictionary.py index 5f66d51570b..be910f757cc 100644 --- a/ambari-common/src/main/python/resource_management/libraries/script/config_dictionary.py +++ b/ambari-common/src/main/python/resource_management/libraries/script/config_dictionary.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -35,7 +35,7 @@ def __init__(self, dictionary): """ Recursively turn dict to ConfigDictionary """ - for k, v in dictionary.iteritems(): + for k, v in dictionary.items(): if isinstance(v, dict): dictionary[k] = ConfigDictionary(v) diff --git a/ambari-common/src/main/python/resource_management/libraries/script/dummy.py b/ambari-common/src/main/python/resource_management/libraries/script/dummy.py index c9f94d08484..a1608ad93cc 100644 --- a/ambari-common/src/main/python/resource_management/libraries/script/dummy.py +++ b/ambari-common/src/main/python/resource_management/libraries/script/dummy.py @@ -67,12 +67,12 @@ def prepare(self): self.user_group = "root" self.sudo = AMBARI_SUDO_BINARY - print "Host: %s" % self.host_name - print "Component: %s" % self.component_name - print "Pid File: %s" % self.pid_file + print("Host: %s" % self.host_name) + print("Component: %s" % self.component_name) + print("Pid File: %s" % self.pid_file) def install(self, env): - print "Install" + print("Install") self.prepare() """ component_name = self.get_component_name() @@ -91,15 +91,15 @@ def install(self, env): """ def configure(self, env): - print "Configure" + print("Configure") self.prepare() def start(self, env, upgrade_type=None): - print "Start" + print("Start") self.prepare() if self.config['configurations']['cluster-env']['security_enabled'] : - print "Executing kinit... " + print("Executing kinit... ") kinit_path_local = get_kinit_path(default('/configurations/kerberos-env/executable_search_paths', None)) principal_replaced = self.config['configurations'][self.principal_conf_name][self.principal_name].replace("_HOST", self.host_name) keytab_path_replaced = self.config['configurations'][self.keytab_conf_name][self.keytab_name].replace("_HOST", self.host_name) @@ -107,12 +107,12 @@ def start(self, env, upgrade_type=None): user="root") if not os.path.isfile(self.pid_file): - print "Creating pid file: %s" % self.pid_file + print("Creating pid file: %s" % self.pid_file) Directory(os.path.dirname(self.pid_file), owner=self.user, group=self.user_group, - mode=0755, + mode=0o755, create_parents=True ) @@ -122,15 +122,15 @@ def start(self, env, upgrade_type=None): ) def stop(self, env, upgrade_type=None): - print "Stop" + print("Stop") self.prepare() if os.path.isfile(self.pid_file): - print "Deleting pid file: %s" % self.pid_file + print("Deleting pid file: %s" % self.pid_file) Execute("%s rm -rf %s" % (self.sudo, self.pid_file)) def status(self, env): - print "Status" + print("Status") self.prepare() if not os.path.isfile(self.pid_file): diff --git a/ambari-common/src/main/python/resource_management/libraries/script/hook.py b/ambari-common/src/main/python/resource_management/libraries/script/hook.py index 63edcbed280..6a112effffb 100644 --- a/ambari-common/src/main/python/resource_management/libraries/script/hook.py +++ b/ambari-common/src/main/python/resource_management/libraries/script/hook.py @@ -21,7 +21,7 @@ __all__ = ["Hook"] from resource_management.libraries.script import Script -from ambari_commons import subprocess32 +import subprocess import sys @@ -58,6 +58,6 @@ def run_custom_hook(self, command): cmd = [sys.executable] cmd.extend(args) - if subprocess32.call(cmd) != 0: + if subprocess.call(cmd) != 0: self.fail_with_error("Error: Unable to run the custom hook script " + cmd.__str__()) diff --git a/ambari-common/src/main/python/resource_management/libraries/script/script.py b/ambari-common/src/main/python/resource_management/libraries/script/script.py index a011bad6a57..1dc44367a1c 100644 --- a/ambari-common/src/main/python/resource_management/libraries/script/script.py +++ b/ambari-common/src/main/python/resource_management/libraries/script/script.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -26,7 +26,7 @@ import sys import ssl import logging -import platform +import distro as platform import inspect import tarfile import traceback @@ -92,7 +92,7 @@ AGENT_TASKS_LOG_FILE = "/var/log/ambari-agent/agent_tasks.log" def get_path_from_configuration(name, configuration): - subdicts = filter(None, name.split('/')) + subdicts = [_f for _f in name.split('/') if _f] for x in subdicts: if x in configuration: @@ -164,7 +164,7 @@ def put_structured_out(self, sout): try: with open(self.stroutfile, 'w') as fp: json.dump(Script.structuredOut, fp) - except IOError, err: + except IOError as err: Script.structuredOut.update({"errMsg" : "Unable to write to " + self.stroutfile}) @@ -287,8 +287,8 @@ def execute(self): # parse arguments if len(args) < 6: - print "Script expects at least 6 arguments" - print USAGE.format(os.path.basename(sys.argv[0])) # print to stdout + print("Script expects at least 6 arguments") + print(USAGE.format(os.path.basename(sys.argv[0]))) # print to stdout sys.exit(1) self.command_name = str.lower(sys.argv[1]) @@ -304,8 +304,7 @@ def execute(self): if len(sys.argv) >= 9: Script.ca_cert_file_path = sys.argv[8] - logging_level_str = logging._levelNames[self.logging_level] - Logger.initialize_logger(__name__, logging_level=logging_level_str) + Logger.initialize_logger(__name__, logging_level=self.logging_level) # on windows we need to reload some of env variables manually because there is no default paths for configs(like # /etc/something/conf on linux. When this env vars created by one of the Script execution, they can not be updated @@ -333,7 +332,7 @@ def execute(self): Script.stack_settings = Script.execution_command.get_stack_settings() # load passwords here(used on windows to impersonate different users) Script.passwords = {} - for k, v in _PASSWORD_MAP.iteritems(): + for k, v in _PASSWORD_MAP.items(): if get_path_from_configuration(k, Script.config) and get_path_from_configuration(v, Script.config): Script.passwords[get_path_from_configuration(k, Script.config)] = get_path_from_configuration(v, Script.config) @@ -358,7 +357,7 @@ def execute(self): self.execute_prefix_function(self.command_name, 'post', env) # catch this to avoid unhandled exception logs in /var/log/messages - except (ComponentIsNotRunning, ClientComponentHasNoStatus), e: + except (ComponentIsNotRunning, ClientComponentHasNoStatus) as e: traceback.print_exc() sys.exit(1) except Fail as ex: @@ -432,7 +431,7 @@ def post_start(self, env=None): pids.append(sudo.read_file(pid_file).strip()) - Logger.info("Component has started with pid(s): {0}".format(', '.join(pids))) + Logger.info("Component has started with pid(s): {0}".format(', '.join([x.decode('utf-8') for x in pids]))) def post_stop(self, env): """ @@ -453,10 +452,10 @@ def post_stop(self, env): status_method(env) time.sleep(0.1) counter += 1 - except ComponentIsNotRunning, e: + except ComponentIsNotRunning as e: Logger.logger.debug("'status' reports ComponentIsNotRunning") component_is_stopped = True - except ClientComponentHasNoStatus, e: + except ClientComponentHasNoStatus as e: Logger.logger.debug("Client component has no status") component_is_stopped = True @@ -869,7 +868,7 @@ def install_packages(self, env): package_list_str = config['commandParams']['package_list'] agent_stack_retry_on_unavailability = bool(config['ambariLevelParams']['agent_stack_retry_on_unavailability']) agent_stack_retry_count = int(config['ambariLevelParams']['agent_stack_retry_count']) - if isinstance(package_list_str, basestring) and len(package_list_str) > 0: + if isinstance(package_list_str, str) and len(package_list_str) > 0: package_list = json.loads(package_list_str) for package in package_list: if self.check_package_condition(package): @@ -1142,31 +1141,31 @@ def generate_configs(self, env): Directory(self.get_tmp_dir(), create_parents = True) conf_tmp_dir = tempfile.mkdtemp(dir=self.get_tmp_dir()) - os.chmod(conf_tmp_dir, 0700) + os.chmod(conf_tmp_dir, 0o700) output_filename = os.path.join(self.get_tmp_dir(), config['commandParams']['output_file']) try: for file_dict in xml_configs_list: - for filename, dict in file_dict.iteritems(): + for filename, dict in file_dict.items(): XmlConfig(filename, conf_dir=conf_tmp_dir, - mode=0644, + mode=0o644, **self.generate_configs_get_xml_file_content(filename, dict) ) for file_dict in env_configs_list: - for filename,dicts in file_dict.iteritems(): + for filename,dicts in file_dict.items(): File(os.path.join(conf_tmp_dir, filename), - mode=0644, + mode=0o644, content=InlineTemplate(self.generate_configs_get_template_file_content(filename, dicts))) for file_dict in properties_configs_list: - for filename, dict in file_dict.iteritems(): + for filename, dict in file_dict.items(): PropertiesFile(os.path.join(conf_tmp_dir, filename), - mode=0644, + mode=0o644, properties=self.generate_configs_get_xml_file_dict(filename, dict) ) with closing(tarfile.open(output_filename, "w:gz")) as tar: - os.chmod(output_filename, 0600) + os.chmod(output_filename, 0o600) try: tar.add(conf_tmp_dir, arcname=os.path.basename(".")) finally: diff --git a/ambari-common/src/main/python/urlinfo_processor/urlinfo_processor.py b/ambari-common/src/main/python/urlinfo_processor/urlinfo_processor.py index 74f7fb93091..4934b79b674 100644 --- a/ambari-common/src/main/python/urlinfo_processor/urlinfo_processor.py +++ b/ambari-common/src/main/python/urlinfo_processor/urlinfo_processor.py @@ -20,7 +20,7 @@ import getopt import json -import urllib2 +import urllib.request, urllib.error, urllib.parse import re from os import path import xml.etree.ElementTree as ET @@ -56,7 +56,7 @@ def get_json_content(path): try: - response = urllib2.urlopen(path) + response = urllib.request.urlopen(path) content = response.read() except: content = open(path, "r").read() @@ -76,10 +76,10 @@ def replace_url_in_repoinfo_xml(repoinfo_xml_path, repo_id, repo_info): baseurl_tag = repo_tag.find("baseurl") if baseurl_tag is not None and family in repo_info: if family in repo_info: - print "URLINFO_PROCESSOR: replacing {0} to {1} for repo id:{2} and family:{3}".format(baseurl_tag.text, + print("URLINFO_PROCESSOR: replacing {0} to {1} for repo id:{2} and family:{3}".format(baseurl_tag.text, repo_info[family], repo_id, - family) + family)) baseurl_tag.text = repo_info[family] with open(repoinfo_xml_path, "w") as out: @@ -89,9 +89,9 @@ def replace_url_in_repoinfo_xml(repoinfo_xml_path, repo_id, repo_info): def replace_urls(stack_location, repo_version_path): repo_dict = get_json_content(repo_version_path) - repo_dict = {(json_stack_version_re.findall(ver)[0][1], ver): conf["latest"] for ver, conf in repo_dict.iteritems()} + repo_dict = {(json_stack_version_re.findall(ver)[0][1], ver): conf["latest"] for ver, conf in list(repo_dict.items())} - for version_info, repo_info in repo_dict.iteritems(): + for version_info, repo_info in repo_dict.items(): stack_version, repo_id = version_info repoinfo_xml_path = path.join(stack_location, stack_version, "repos", "repoinfo.xml") if path.exists(repoinfo_xml_path): @@ -104,23 +104,23 @@ def main(argv): try: opts, args = getopt.getopt(argv, "u:s:", ["urlinfo=", "stack_folder="]) except getopt.GetoptError: - print HELP_STRING + print(HELP_STRING) sys.exit(2) for opt, arg in opts: if opt == '-h': - print HELP_STRING + print(HELP_STRING) sys.exit() elif opt in ("-u", "--urlinfo"): urlinfo_path = arg elif opt in ("-s", "--stack_folder"): stack_folder = arg if not urlinfo_path or not stack_folder: - print HELP_STRING + print(HELP_STRING) sys.exit(2) - print "URLINFO_PROCESSOR: starting replacement of repo urls" + print("URLINFO_PROCESSOR: starting replacement of repo urls") replace_urls(stack_folder, urlinfo_path) - print "URLINFO_PROCESSOR: replacement finished" + print("URLINFO_PROCESSOR: replacement finished") if __name__ == "__main__": diff --git a/ambari-common/src/main/repo/install_ambari_tarball.py b/ambari-common/src/main/repo/install_ambari_tarball.py index 633ab908a46..a09d97fb37c 100644 --- a/ambari-common/src/main/repo/install_ambari_tarball.py +++ b/ambari-common/src/main/repo/install_ambari_tarball.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python2 +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -21,9 +21,9 @@ import os import sys import logging -from ambari_commons import subprocess32 +import subprocess from optparse import OptionParser -import ConfigParser +import configparser USAGE = "Usage: %prog [OPTION]... URL" DESCRIPTION = "URL should point to full tar.gz location e.g.: https://public-repo-1.hortonworks.com/something/ambari-server.tar.gz" @@ -52,13 +52,13 @@ def os_call(command, logoutput=None, env={}): print_output = logoutput==True or (logoutput==None and Utils.verbose) if not print_output: - stdout = subprocess32.PIPE - stderr = subprocess32.STDOUT + stdout = subprocess.PIPE + stderr = subprocess.STDOUT else: stdout = stderr = None logger.info("Running '{0}'".format(command)) - proc = subprocess32.Popen(command, shell=shell, stdout=stdout, stderr=stderr, env=env) + proc = subprocess.Popen(command, shell=shell, stdout=stdout, stderr=stderr, env=env, universal_newlines=True) if not print_output: out = proc.communicate()[0].strip('\n') @@ -156,7 +156,7 @@ def check_dependencies(self): is_rpm = not OSCheck.is_ubuntu_family() property_prefix = RPM_DEPENDENCIES_PROPERTY if is_rpm else DEB_DEPENDENCIES_PROPERTY - cp = ConfigParser.SafeConfigParser() + cp = configparser.SafeConfigParser() with open(OS_PACKAGE_DEPENDENCIES) as fp: cp.readfp(FakePropertiesHeader(fp)) @@ -183,7 +183,7 @@ def check_dependencies(self): packages_string = re.sub('[()]','',packages_string) if self.skip_dependencies: - var = raw_input("Please confirm you have the following packages installed {0} (y/n): ".format(packages_string)) + var = input("Please confirm you have the following packages installed {0} (y/n): ".format(packages_string)) if var.lower() != "y" and var.lower() != "yes": raise Exception("User canceled the installation.") return diff --git a/ambari-common/src/main/unix/ambari-python-wrap b/ambari-common/src/main/unix/ambari-python-wrap index e94467c96e3..e214bbd5e86 100755 --- a/ambari-common/src/main/unix/ambari-python-wrap +++ b/ambari-common/src/main/unix/ambari-python-wrap @@ -17,25 +17,17 @@ # See the License for the specific language governing permissions and # limitations under the License. -export PYTHONPATH=/usr/lib/python2.6/site-packages:/usr/lib/python2.6/site-packages/ambari_commons:$PYTHONPATH +export PYTHONPATH=/usr/lib/python3.9/site-packages:/usr/lib/python3.9/site-packages/ambari_commons:$PYTHONPATH -# checking for default Python 2 -if [ -a /usr/bin/python2 ] && [ -z "$PYTHON" ]; then - PYTHON=/usr/bin/python2 +# checking for default Python 3 +if [ -a /usr/bin/python3 ] && [ -z "$PYTHON" ]; then + PYTHON=/usr/bin/python3 fi -if [ -a /usr/bin/python2.7 ] && [ -z "$PYTHON" ]; then - PYTHON=/usr/bin/python2.7 +if [ -a /usr/bin/python3.9 ] && [ -z "$PYTHON" ]; then + PYTHON=/usr/bin/python3.9 fi -if [ -a /usr/bin/python2.6 ] && [ -z "$PYTHON" ]; then - PYTHON=/usr/bin/python2.6 -fi - -# if no preferable python versions found, try to use system one. Hoping it's Python 2 -if [[ -z "$PYTHON" ]]; then - PYTHON=/usr/bin/python -fi # execute script $PYTHON "$@" diff --git a/ambari-common/src/test/python/coilmq/auth/__init__.py b/ambari-common/src/test/python/coilmq/auth/__init__.py index 5ce3b61cfbe..dc9b243771b 100644 --- a/ambari-common/src/test/python/coilmq/auth/__init__.py +++ b/ambari-common/src/test/python/coilmq/auth/__init__.py @@ -20,9 +20,8 @@ limitations under the License.""" -class Authenticator(object): +class Authenticator(object, metaclass=abc.ABCMeta): """ Abstract base class for authenticators. """ - __metaclass__ = abc.ABCMeta @abc.abstractmethod def authenticate(self, login, passcode): diff --git a/ambari-common/src/test/python/coilmq/auth/simple.py b/ambari-common/src/test/python/coilmq/auth/simple.py index cb092bb96c3..b6d8b83f184 100644 --- a/ambari-common/src/test/python/coilmq/auth/simple.py +++ b/ambari-common/src/test/python/coilmq/auth/simple.py @@ -4,7 +4,7 @@ try: from configparser import ConfigParser except ImportError: - from ConfigParser import ConfigParser + from configparser import ConfigParser ConfigParser.read_file = ConfigParser.readfp from coilmq.auth import Authenticator diff --git a/ambari-common/src/test/python/coilmq/config/__init__.py b/ambari-common/src/test/python/coilmq/config/__init__.py index 4428cd485db..37f18368c2d 100644 --- a/ambari-common/src/test/python/coilmq/config/__init__.py +++ b/ambari-common/src/test/python/coilmq/config/__init__.py @@ -20,7 +20,7 @@ try: from configparser import ConfigParser except ImportError: - from ConfigParser import ConfigParser + from configparser import ConfigParser from pkg_resources import resource_filename, resource_stream diff --git a/ambari-common/src/test/python/coilmq/engine.py b/ambari-common/src/test/python/coilmq/engine.py index 42352a38961..8ac1a6bd717 100644 --- a/ambari-common/src/test/python/coilmq/engine.py +++ b/ambari-common/src/test/python/coilmq/engine.py @@ -1,4 +1,4 @@ -from __future__ import absolute_import + from coilmq.protocol import STOMP10 diff --git a/ambari-common/src/test/python/coilmq/protocol/__init__.py b/ambari-common/src/test/python/coilmq/protocol/__init__.py index da955ce6947..878f9e0b7f2 100644 --- a/ambari-common/src/test/python/coilmq/protocol/__init__.py +++ b/ambari-common/src/test/python/coilmq/protocol/__init__.py @@ -25,9 +25,7 @@ 'subscribe', 'unsubscribe', 'begin', 'commit', 'abort', 'ack', 'disconnect', 'nack', 'stomp'] -class STOMP(object): - - __metaclass__ = abc.ABCMeta +class STOMP(object, metaclass=abc.ABCMeta): def __init__(self, engine): self.engine = engine @@ -293,7 +291,7 @@ def connect(self, frame, response=None): self._negotiate_protocol(frame, connected_frame) heart_beat = frame.headers.get('heart-beat', '0,0') if heart_beat: - self.enable_heartbeat(*map(int, heart_beat.split(',')), response=connected_frame) + self.enable_heartbeat(*list(map(int, heart_beat.split(','))), response=connected_frame) super(STOMP11, self).connect(frame, response=connected_frame) def nack(self, frame): diff --git a/ambari-common/src/test/python/coilmq/scheduler.py b/ambari-common/src/test/python/coilmq/scheduler.py index 013de4733c4..1a9faf5f6ce 100644 --- a/ambari-common/src/test/python/coilmq/scheduler.py +++ b/ambari-common/src/test/python/coilmq/scheduler.py @@ -25,9 +25,8 @@ limitations under the License.""" -class SubscriberPriorityScheduler(object): +class SubscriberPriorityScheduler(object, metaclass=abc.ABCMeta): """ Abstract base class for choosing which recipient (subscriber) should receive a message. """ - __metaclass__ = abc.ABCMeta @abc.abstractmethod def choice(self, subscribers, message): diff --git a/ambari-common/src/test/python/coilmq/server/__init__.py b/ambari-common/src/test/python/coilmq/server/__init__.py index 1a7c52ab1e0..67fe35776bd 100644 --- a/ambari-common/src/test/python/coilmq/server/__init__.py +++ b/ambari-common/src/test/python/coilmq/server/__init__.py @@ -20,7 +20,7 @@ limitations under the License.""" -class StompConnection(object): +class StompConnection(object, metaclass=abc.ABCMeta): """ An "interface" for server implementation classes to "implement". @@ -30,7 +30,6 @@ class StompConnection(object): @ivar reliable_subscriber: Whether this client will ACK all messages. @type reliable_subscriber: C{bool} """ - __metaclass__ = abc.ABCMeta reliable_subscriber = False diff --git a/ambari-common/src/test/python/coilmq/server/socket_server.py b/ambari-common/src/test/python/coilmq/server/socket_server.py index 872ec01ece3..e062de4cc56 100644 --- a/ambari-common/src/test/python/coilmq/server/socket_server.py +++ b/ambari-common/src/test/python/coilmq/server/socket_server.py @@ -4,11 +4,11 @@ import logging import socket import threading -import Queue +import queue try: from socketserver import BaseRequestHandler, TCPServer, ThreadingMixIn except ImportError: - from SocketServer import BaseRequestHandler, TCPServer, ThreadingMixIn + from socketserver import BaseRequestHandler, TCPServer, ThreadingMixIn from coilmq.util.frames import FrameBuffer @@ -156,7 +156,7 @@ def __init__(self, server_address, RequestHandlerClass=None, timeout=3.0, self.queue_manager = queue_manager self.topic_manager = topic_manager self.protocol = protocol - self.frames_queue = Queue.Queue() + self.frames_queue = queue.Queue() self._serving_event = threading.Event() self._shutdown_request_event = threading.Event() TCPServer.__init__(self, server_address, RequestHandlerClass) diff --git a/ambari-common/src/test/python/coilmq/store/__init__.py b/ambari-common/src/test/python/coilmq/store/__init__.py index a0daf9d2567..e731960670b 100644 --- a/ambari-common/src/test/python/coilmq/store/__init__.py +++ b/ambari-common/src/test/python/coilmq/store/__init__.py @@ -24,7 +24,7 @@ lock = threading.RLock() -class QueueStore(object): +class QueueStore(object, metaclass=abc.ABCMeta): """ Abstract base class for queue storage. @@ -33,7 +33,6 @@ class QueueStore(object): @ivar log: A logger for this class. @type log: C{logging.Logger} """ - __metaclass__ = abc.ABCMeta def __init__(self): """ @@ -164,7 +163,7 @@ def __init__(self, store, destination): def __iter__(self): return self - def next(self): + def __next__(self): return self.__next__() def __next__(self): diff --git a/ambari-common/src/test/python/coilmq/store/dbm.py b/ambari-common/src/test/python/coilmq/store/dbm.py index ab4fb004713..fea771bb177 100644 --- a/ambari-common/src/test/python/coilmq/store/dbm.py +++ b/ambari-common/src/test/python/coilmq/store/dbm.py @@ -19,7 +19,7 @@ try: from configparser import ConfigParser except ImportError: - from ConfigParser import ConfigParser + from configparser import ConfigParser from coilmq.store import QueueStore diff --git a/ambari-common/src/test/python/coilmq/store/rds.py b/ambari-common/src/test/python/coilmq/store/rds.py index f21bee31fee..585619f538e 100644 --- a/ambari-common/src/test/python/coilmq/store/rds.py +++ b/ambari-common/src/test/python/coilmq/store/rds.py @@ -4,7 +4,7 @@ import sys; sys.exit('please, install redis-py package to use redis-store') import threading try: - import cPickle as pickle + import pickle as pickle except ImportError: import pickle diff --git a/ambari-common/src/test/python/coilmq/util/concurrency.py b/ambari-common/src/test/python/coilmq/util/concurrency.py index 3eb539a9ba2..0ad54c942d6 100644 --- a/ambari-common/src/test/python/coilmq/util/concurrency.py +++ b/ambari-common/src/test/python/coilmq/util/concurrency.py @@ -40,9 +40,7 @@ def wrapper(*args, **kwargs): return synchronize -class CoilTimerBase(object): - - __metaclass__ = abc.ABCMeta +class CoilTimerBase(object, metaclass=abc.ABCMeta): def __init__(self): self.jobs = [] diff --git a/ambari-common/src/test/python/coilmq/util/frames.py b/ambari-common/src/test/python/coilmq/util/frames.py index 3026ee01f85..a593409a904 100644 --- a/ambari-common/src/test/python/coilmq/util/frames.py +++ b/ambari-common/src/test/python/coilmq/util/frames.py @@ -4,7 +4,7 @@ from collections import OrderedDict import io -import six +from coilmq.util import six SEND = 'SEND' CONNECT = 'CONNECT' @@ -42,9 +42,7 @@ def parse_headers(buff): """ Parses buffer and returns command and headers as strings """ - preamble_lines = list(map( - lambda x: six.u(x).decode(), - iter(lambda: buff.readline().strip(), b'')) + preamble_lines = list([six.u(x).decode() for x in iter(lambda: buff.readline().strip(), b'')] ) if not preamble_lines: raise EmptyBuffer() @@ -355,5 +353,5 @@ def __next__(self): raise StopIteration() return msg - def next(self): + def __next__(self): return self.__next__() diff --git a/ambari-common/src/test/python/coilmq/util/six.py b/ambari-common/src/test/python/coilmq/util/six.py index 0a381fd7458..a0c6c9d7729 100644 --- a/ambari-common/src/test/python/coilmq/util/six.py +++ b/ambari-common/src/test/python/coilmq/util/six.py @@ -12,5 +12,5 @@ def u(s): def b(s): return s def u(s): - return unicode(s.replace(r'\\', r'\\\\'), "unicode_escape") + return str(s.replace(r'\\', r'\\\\'), "unicode_escape") binary_type = str \ No newline at end of file diff --git a/ambari-common/src/test/python/mock/docs/conf.py b/ambari-common/src/test/python/mock/docs/conf.py index 62f0491ccae..51ca069900c 100644 --- a/ambari-common/src/test/python/mock/docs/conf.py +++ b/ambari-common/src/test/python/mock/docs/conf.py @@ -65,8 +65,8 @@ def __init__(self): master_doc = 'index' # General substitutions. -project = u'Mock' -copyright = u'2007-2012, Michael Foord & the mock team' +project = 'Mock' +copyright = '2007-2012, Michael Foord & the mock team' # The default replacements for |version| and |release|, also used in various # other places throughout the built documents. @@ -187,8 +187,8 @@ def __init__(self): # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, author, document class [howto/manual]). latex_documents = [ - ('index', 'Mock.tex', u'Mock Documentation', - u'Michael Foord', 'manual'), + ('index', 'Mock.tex', 'Mock Documentation', + 'Michael Foord', 'manual'), ] # The name of an image file (relative to this directory) to place at the top of diff --git a/ambari-common/src/test/python/mock/mock.py b/ambari-common/src/test/python/mock/mock.py index 2a3f8693d3b..880c1cb0336 100644 --- a/ambari-common/src/test/python/mock/mock.py +++ b/ambari-common/src/test/python/mock/mock.py @@ -32,6 +32,12 @@ import pprint import sys +try: + import platform.linux_distribution +except ImportError: + import distro + + try: import inspect except ImportError: @@ -65,13 +71,13 @@ def inner(f): return inner try: - unicode + str except NameError: # Python 3 basestring = unicode = str try: - long + int except NameError: # Python 3 long = int @@ -86,7 +92,7 @@ def inner(f): next except NameError: def next(obj): - return obj.next() + return obj.__next__() BaseExceptions = (BaseException,) @@ -115,7 +121,7 @@ def _isidentifier(string): _super = super self = 'im_self' -builtin = '__builtin__' +builtin = 'builtins' if inPy3k: self = '__self__' builtin = 'builtins' @@ -216,12 +222,12 @@ def _copy_func_details(func, funcopy): funcopy.__name__ = func.__name__ funcopy.__doc__ = func.__doc__ #funcopy.__dict__.update(func.__dict__) - funcopy.__module__ = func.__module__ + #funcopy.__module__ = func.__module__ if not inPy3k: - funcopy.func_defaults = func.func_defaults + funcopy.__defaults__ = func.__defaults__ return - funcopy.__defaults__ = func.__defaults__ - funcopy.__kwdefaults__ = func.__kwdefaults__ + #funcopy.__defaults__ = func.__defaults__ + #funcopy.__kwdefaults__ = func.__kwdefaults__ def _callable(obj): @@ -1216,7 +1222,7 @@ def patched(*args, **keywargs): # not in Python 3 patched.compat_co_firstlineno = getattr( func, "compat_co_firstlineno", - func.func_code.co_firstlineno + func.__code__.co_firstlineno ) return patched @@ -1463,7 +1469,7 @@ def _patch_multiple(target, spec=None, create=False, spec_set=None, When used as a class decorator `patch.multiple` honours `patch.TEST_PREFIX` for choosing which methods to wrap. """ - if type(target) in (unicode, str): + if type(target) in (str, str): getter = lambda: _importer(target) else: getter = lambda: target @@ -1596,7 +1602,7 @@ class _patch_dict(object): """ def __init__(self, in_dict, values=(), clear=False, **kwargs): - if isinstance(in_dict, basestring): + if isinstance(in_dict, str): in_dict = _importer(in_dict) self.in_dict = in_dict # support any argument supported by dict(...) constructor @@ -1764,7 +1770,7 @@ def method(self, *args, **kw): '__hash__': lambda self: object.__hash__(self), '__str__': lambda self: object.__str__(self), '__sizeof__': lambda self: object.__sizeof__(self), - '__unicode__': lambda self: unicode(object.__str__(self)), + #'__unicode__': lambda self: str(object.__str__(self)), } _return_values = { @@ -1782,7 +1788,7 @@ def method(self, *args, **kw): '__nonzero__': True, '__oct__': '1', '__hex__': '0x1', - '__long__': long(1), + '__long__': int(1), '__index__': 1, } @@ -1993,7 +1999,7 @@ def __new__(cls, value=(), name=None, parent=None, two=False, name, args, kwargs = value elif _len == 2: first, second = value - if isinstance(first, basestring): + if isinstance(first, str): name = first if isinstance(second, tuple): args = second @@ -2003,7 +2009,7 @@ def __new__(cls, value=(), name=None, parent=None, two=False, args, kwargs = first, second elif _len == 1: value, = value - if isinstance(value, basestring): + if isinstance(value, str): name = value elif isinstance(value, tuple): args = value @@ -2047,7 +2053,7 @@ def __eq__(self, other): if isinstance(value, tuple): other_args = value other_kwargs = {} - elif isinstance(value, basestring): + elif isinstance(value, str): other_name = value other_args, other_kwargs = (), {} else: @@ -2057,7 +2063,7 @@ def __eq__(self, other): # len 2 # could be (name, args) or (name, kwargs) or (args, kwargs) first, second = other - if isinstance(first, basestring): + if isinstance(first, str): other_name = first if isinstance(second, tuple): other_args, other_kwargs = second, {} diff --git a/ambari-common/src/test/python/mock/setup.py b/ambari-common/src/test/python/mock/setup.py index a6ee625c4c1..1f9ef7c03ab 100644 --- a/ambari-common/src/test/python/mock/setup.py +++ b/ambari-common/src/test/python/mock/setup.py @@ -4,7 +4,7 @@ # E-mail: fuzzyman AT voidspace DOT org DOT uk # http://www.voidspace.org.uk/python/mock/ -from mock import __version__ +from mocks.mock import __version__ import os diff --git a/ambari-common/src/test/python/mock/tests/_testwith.py b/ambari-common/src/test/python/mock/tests/_testwith.py index 0b54780b806..09949d98ebb 100644 --- a/ambari-common/src/test/python/mock/tests/_testwith.py +++ b/ambari-common/src/test/python/mock/tests/_testwith.py @@ -2,7 +2,7 @@ # E-mail: fuzzyman AT voidspace DOT org DOT uk # http://www.voidspace.org.uk/python/mock/ -from __future__ import with_statement + from tests.support import unittest2, is_instance diff --git a/ambari-common/src/test/python/mock/tests/support.py b/ambari-common/src/test/python/mock/tests/support.py index 1b10c3428f3..173585e8a91 100644 --- a/ambari-common/src/test/python/mock/tests/support.py +++ b/ambari-common/src/test/python/mock/tests/support.py @@ -38,4 +38,4 @@ class X(object): next = next except NameError: def next(obj): - return obj.next() + return obj.__next__() diff --git a/ambari-common/src/test/python/mock/tests/support_with.py b/ambari-common/src/test/python/mock/tests/support_with.py index fa286122ced..f787f812810 100644 --- a/ambari-common/src/test/python/mock/tests/support_with.py +++ b/ambari-common/src/test/python/mock/tests/support_with.py @@ -1,4 +1,4 @@ -from __future__ import with_statement + import sys diff --git a/ambari-common/src/test/python/mock/tests/testmagicmethods.py b/ambari-common/src/test/python/mock/tests/testmagicmethods.py index ef0f16d8268..b8b143af613 100644 --- a/ambari-common/src/test/python/mock/tests/testmagicmethods.py +++ b/ambari-common/src/test/python/mock/tests/testmagicmethods.py @@ -5,10 +5,10 @@ from tests.support import unittest2, inPy3k try: - unicode + str except NameError: # Python 3 - unicode = str + str = str long = int import inspect @@ -83,10 +83,10 @@ def test_str(self): @unittest2.skipIf(inPy3k, "no unicode in Python 3") def test_unicode(self): mock = Mock() - self.assertEqual(unicode(mock), unicode(str(mock))) + self.assertEqual(str(mock), str(str(mock))) - mock.__unicode__ = lambda s: unicode('foo') - self.assertEqual(unicode(mock), unicode('foo')) + mock.__unicode__ = lambda s: str('foo') + self.assertEqual(str(mock), str('foo')) def test_dict_methods(self): @@ -315,14 +315,14 @@ def test_magicmock_defaults(self): self.assertEqual(int(mock), 1) self.assertEqual(complex(mock), 1j) self.assertEqual(float(mock), 1.0) - self.assertEqual(long(mock), long(1)) + self.assertEqual(int(mock), int(1)) self.assertNotIn(object(), mock) self.assertEqual(len(mock), 0) self.assertEqual(list(mock), []) self.assertEqual(hash(mock), object.__hash__(mock)) self.assertEqual(str(mock), object.__str__(mock)) - self.assertEqual(unicode(mock), object.__str__(mock)) - self.assertIsInstance(unicode(mock), unicode) + self.assertEqual(str(mock), object.__str__(mock)) + self.assertIsInstance(str(mock), str) self.assertTrue(bool(mock)) if not inPy3k: self.assertEqual(oct(mock), '1') @@ -399,7 +399,7 @@ def test_setting_unsupported_magic_method(self): mock = MagicMock() def set_setattr(): mock.__setattr__ = lambda self, name: None - self.assertRaisesRegexp(AttributeError, + self.assertRaisesRegex(AttributeError, "Attempting to set unsupported magic method '__setattr__'.", set_setattr ) diff --git a/ambari-common/src/test/python/mock/tests/testmock.py b/ambari-common/src/test/python/mock/tests/testmock.py index f3ceea9955c..c8f65207adb 100644 --- a/ambari-common/src/test/python/mock/tests/testmock.py +++ b/ambari-common/src/test/python/mock/tests/testmock.py @@ -20,7 +20,7 @@ try: - unicode + str except NameError: unicode = str @@ -32,7 +32,7 @@ def __init__(self): def __iter__(self): return self - def next(self): + def __next__(self): return next(self.thing) __next__ = next @@ -87,7 +87,7 @@ def test_constructor(self): def test_unicode_not_broken(self): # This used to raise an exception with Python 2.5 and Mock 0.4 - unicode(Mock()) + str(Mock()) def test_return_value_in_constructor(self): @@ -396,7 +396,7 @@ def test_only_allowed_methods_exist(self): # this should be allowed mock.something - self.assertRaisesRegexp( + self.assertRaisesRegex( AttributeError, "Mock object has no attribute 'something_else'", getattr, mock, 'something_else' @@ -415,12 +415,12 @@ def test_attributes(mock): mock.x mock.y mock.__something__ - self.assertRaisesRegexp( + self.assertRaisesRegex( AttributeError, "Mock object has no attribute 'z'", getattr, mock, 'z' ) - self.assertRaisesRegexp( + self.assertRaisesRegex( AttributeError, "Mock object has no attribute '__foobar__'", getattr, mock, '__foobar__' @@ -486,7 +486,7 @@ def test_baseexceptional_side_effect(self): def test_assert_called_with_message(self): mock = Mock() - self.assertRaisesRegexp(AssertionError, 'Not called', + self.assertRaisesRegex(AssertionError, 'Not called', mock.assert_called_with) diff --git a/ambari-common/src/test/python/mock/tests/testpatch.py b/ambari-common/src/test/python/mock/tests/testpatch.py index 8eb719bdb06..a0b6878e4c9 100644 --- a/ambari-common/src/test/python/mock/tests/testpatch.py +++ b/ambari-common/src/test/python/mock/tests/testpatch.py @@ -14,7 +14,7 @@ DEFAULT, call, _get_target ) -builtin_string = '__builtin__' +builtin_string = 'builtins' if inPy3k: builtin_string = 'builtins' unicode = str @@ -1528,7 +1528,7 @@ def func(): def test_patch_multiple_string_subclasses(self): - for base in (str, unicode): + for base in (str, str): Foo = type('Foo', (base,), {'fish': 'tasty'}) foo = Foo() @patch.multiple(foo, fish='nearly gone') diff --git a/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/__init__.py b/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/__init__.py index 5561e1087b2..152033a3be5 100644 --- a/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/__init__.py +++ b/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/__init__.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hcat.py b/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hcat.py index 29de1c07ddc..d7fdf128029 100644 --- a/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hcat.py +++ b/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hcat.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hcat_client.py b/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hcat_client.py index 8b5921a75e3..6a1d237edfc 100644 --- a/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hcat_client.py +++ b/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hcat_client.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hcat_service_check.py b/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hcat_service_check.py index 5112e99d279..9e4e932cb18 100644 --- a/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hcat_service_check.py +++ b/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hcat_service_check.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -35,7 +35,7 @@ def hcat_service_check(): File('/tmp/hcatSmoke.sh', content=StaticFile("hcatSmoke.sh"), - mode=0755 + mode=0o755 ) prepare_cmd = format("{kinit_cmd}sh /tmp/hcatSmoke.sh hcatsmoke{unique} prepare") diff --git a/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive.py b/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive.py index ac04f4b7713..d469cc1bada 100644 --- a/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive.py +++ b/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -27,11 +27,11 @@ def hive(name=None): if name == 'metastore' or name == 'hiveserver2': hive_config_dir = params.hive_server_conf_dir - config_file_mode = 0600 + config_file_mode = 0o600 jdbc_connector() else: hive_config_dir = params.hive_conf_dir - config_file_mode = 0644 + config_file_mode = 0o644 Directory(hive_config_dir, owner=params.hive_user, @@ -56,13 +56,13 @@ def hive(name=None): if name == 'metastore': File(params.start_metastore_path, - mode=0755, + mode=0o755, content=StaticFile('startMetastore.sh') ) elif name == 'hiveserver2': File(params.start_hiveserver2_path, - mode=0755, + mode=0o755, content=StaticFile('startHiveserver2.sh') ) @@ -90,7 +90,7 @@ def crt_directory(name): create_parents = True, owner=params.hive_user, group=params.user_group, - mode=0755) + mode=0o755) def crt_file(name): diff --git a/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive_client.py b/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive_client.py index 0a5fb2b9a49..cfa6f60feaf 100644 --- a/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive_client.py +++ b/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive_client.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive_metastore.py b/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive_metastore.py index c741174660d..d4918182b4d 100644 --- a/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive_metastore.py +++ b/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive_metastore.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive_server.py b/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive_server.py index 3ad81a1b729..9f78bb33bf0 100644 --- a/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive_server.py +++ b/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive_server.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive_service.py b/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive_service.py index 64199147fdb..b990eb2b32a 100644 --- a/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive_service.py +++ b/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive_service.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/mysql_server.py b/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/mysql_server.py index a160d4bd12d..8799addb19d 100644 --- a/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/mysql_server.py +++ b/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/mysql_server.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -41,7 +41,7 @@ def configure(self, env): mysql_service(daemon_name=self.daemon_name, action='start') File(params.mysql_adduser_path, - mode=0755, + mode=0o755, content=StaticFile('addMysqlUser.sh') ) diff --git a/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/mysql_service.py b/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/mysql_service.py index cf1d30efd26..4fa8319db41 100644 --- a/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/mysql_service.py +++ b/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/mysql_service.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/params.py b/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/params.py index ffe88170f64..fe2b0ecd120 100644 --- a/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/params.py +++ b/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/params.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/service_check.py b/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/service_check.py index 111e8a164a6..5fa338c5723 100644 --- a/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/service_check.py +++ b/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/service_check.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -36,7 +36,7 @@ def service_check(self, env): File(params.smoke_test_path, content=StaticFile('hiveserver2Smoke.sh'), - mode=0755 + mode=0o755 ) File(params.smoke_test_sql, diff --git a/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/status_params.py b/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/status_params.py index 77709755861..6d1fe3e5c35 100644 --- a/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/status_params.py +++ b/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/status_params.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-server/conf/unix/ambari-env.sh b/ambari-server/conf/unix/ambari-env.sh index 6371abbbd43..d2f655c1b90 100644 --- a/ambari-server/conf/unix/ambari-env.sh +++ b/ambari-server/conf/unix/ambari-env.sh @@ -20,7 +20,7 @@ export PATH=$PATH:$ROOT/var/lib/ambari-server export PYTHONPATH=$ROOT/usr/lib/ambari-server/lib:$PYTHONPATH # customize python binary for ambari -# export PYTHON=/usr/bin/python2 +# export PYTHON=/usr/bin/python3 # to add additional directory or jar to server classpath use SERVER_CLASSPATH variable # export SERVER_CLASSPATH=/etc/hadoop/conf/secure diff --git a/ambari-server/conf/unix/create-python-wrap.sh b/ambari-server/conf/unix/create-python-wrap.sh index 3190073c9d6..f241e4c3a38 100644 --- a/ambari-server/conf/unix/create-python-wrap.sh +++ b/ambari-server/conf/unix/create-python-wrap.sh @@ -21,10 +21,10 @@ PYTHON_WRAPER_TARGET="${PYTHON_WRAPER_DIR}/ambari-python-wrap" rm -f "$PYTHON_WRAPER_TARGET" AMBARI_PYTHON="" -python_binaries=( "/usr/bin/python" "/usr/bin/python2" "/usr/bin/python2.7" "/usr/bin/python2.6" ) +python_binaries=("/usr/bin/python3" "/usr/bin/python3.9" ) for python_binary in "${python_binaries[@]}" do - $python_binary -c "import sys ; ver = sys.version_info ; sys.exit(not (ver >= (2,6) and ver<(3,0)))" 1>/dev/null 2>/dev/null + $python_binary -c "import sys ; ver = sys.version_info ; sys.exit(not (ver >= (3,0)))" 1>/dev/null 2>/dev/null if [ $? -eq 0 ] ; then AMBARI_PYTHON="$python_binary" diff --git a/ambari-server/conf/unix/install-helper.sh b/ambari-server/conf/unix/install-helper.sh index 3613e90352a..f3ac20a23a6 100644 --- a/ambari-server/conf/unix/install-helper.sh +++ b/ambari-server/conf/unix/install-helper.sh @@ -143,10 +143,10 @@ install_autostart(){ } locate_python(){ - local python_binaries="/usr/bin/python;/usr/bin/python2;/usr/bin/python2.7" + local python_binaries="/usr/bin/python3;/usr/bin/python3.9" echo ${python_binaries}| tr ';' '\n' | while read python_binary; do - ${python_binary} -c "import sys ; ver = sys.version_info ; sys.exit(not (ver >= (2,7) and ver<(3,0)))" 1>>${LOG_FILE} 2>/dev/null + ${python_binary} -c "import sys ; ver = sys.version_info ; sys.exit(not (ver >= (3,0)))" 1>>${LOG_FILE} 2>/dev/null if [ $? -eq 0 ]; then echo "${python_binary}" diff --git a/ambari-server/conf/windows/install-helper.cmd b/ambari-server/conf/windows/install-helper.cmd index 3d4d6889654..b552bd13223 100644 --- a/ambari-server/conf/windows/install-helper.cmd +++ b/ambari-server/conf/windows/install-helper.cmd @@ -17,7 +17,7 @@ rem ################################################################## rem # SERVER INSTALL HELPER # rem ################################################################## -set COMMON_DIR="/usr/lib/python2.6/site-packages/common_functions" +set COMMON_DIR="/usr/lib/python3.9/site-packages/common_functions" set INSTALL_HELPER_AGENT="/var/lib/ambari-agent/install-helper.sh" set COMMON_DIR_SERVER="/usr/lib/ambari-server/lib/common_functions" diff --git a/ambari-server/pom.xml b/ambari-server/pom.xml index 172634ab7c0..00bd6f5af2b 100644 --- a/ambari-server/pom.xml +++ b/ambari-server/pom.xml @@ -920,7 +920,7 @@ win \ ; - python + python3 cmd cmd .cmd diff --git a/ambari-server/src/main/package/dependencies.properties b/ambari-server/src/main/package/dependencies.properties index 01244a8375d..1ea214864c1 100644 --- a/ambari-server/src/main/package/dependencies.properties +++ b/ambari-server/src/main/package/dependencies.properties @@ -28,6 +28,6 @@ # Such a format is respected by install_ambari_tarball.py by default, # however should be encouraged manually in pom.xml. -rpm.dependency.list=postgresql-server >= 8.1,\nRequires: openssl,\nRequires: python >= 2.6 -rpm.dependency.list.suse=postgresql-server >= 8.1,\nRequires: openssl,\nRequires: python-xml,\nRequires: python >= 2.6 -deb.dependency.list=openssl, postgresql (>= 8.1), python (>= 2.6), curl \ No newline at end of file +rpm.dependency.list=postgresql-server >= 8.1,\nRequires: openssl,\nRequires: python3 +rpm.dependency.list.suse=postgresql-server >= 8.1,\nRequires: openssl,\nRequires: python-xml,\nRequires: python3 +deb.dependency.list=openssl, postgresql (>= 8.1), python3, curl \ No newline at end of file diff --git a/ambari-server/src/main/python/ambari-server-state/Configurator.py b/ambari-server/src/main/python/ambari-server-state/Configurator.py index 3dc0991217b..b7c155ebb33 100644 --- a/ambari-server/src/main/python/ambari-server-state/Configurator.py +++ b/ambari-server/src/main/python/ambari-server-state/Configurator.py @@ -133,7 +133,7 @@ def getConfiguration(self): def chooseConfInitType(self): "Type of how to get paths to configuration files" "Configuration types are base on Configuration.CONFIG_INIT_TYPE tuple" - return int(raw_input("\tInput configuration type:\n" + + return int(input("\tInput configuration type:\n" + "0)Current path contains all required configuration files.\n" + "1)Enter path for each conf file manually.\n" + "Choose:" @@ -145,7 +145,7 @@ def initPaths(self): "Input alternative file paths for resources" if self.configurationType != 0: for service in self.servicesPath.keys(): - path = raw_input("Please enter path for " + service + "(if there is no such service type \"no\") :") + path = input("Please enter path for " + service + "(if there is no such service type \"no\") :") if len(path) > 0 and not path == "no": self.servicesPath[service] = path elif path == "no": diff --git a/ambari-server/src/main/python/ambari-server.py b/ambari-server/src/main/python/ambari-server.py index 601f4d3dda2..87b12204a61 100755 --- a/ambari-server/src/main/python/ambari-server.py +++ b/ambari-server/src/main/python/ambari-server.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -167,26 +167,26 @@ def stop(args): if status: try: os.kill(pid, signal.SIGTERM) - except OSError, e: + except OSError as e: err = "Unable to stop Ambari Server - " + str(e) print_info_msg(err) raise FatalException(1, err) - print "Waiting for server stop..." + print("Waiting for server stop...") logger.info("Waiting for server stop...") if not wait_for_server_to_stop(SERVER_STOP_TIMEOUT): err = "Ambari-server failed to stop gracefully. Sending SIGKILL to it" - print err + print(err) logger.error(err) os.kill(pid, signal.SIGKILL) pid_file_path = os.path.join(configDefaults.PID_DIR, PID_NAME) os.remove(pid_file_path) - print "Ambari Server stopped" + print("Ambari Server stopped") logger.info("Ambari Server stopped") else: - print "Ambari Server is not running" + print("Ambari Server is not running") logger.info("Ambari Server is not running") @@ -215,7 +215,7 @@ def status(args): args.exit_message = None status, statusStr = is_server_runing() - print "Ambari Server is " + statusStr + print("Ambari Server is " + statusStr) if status: args.exit_code = 0 @@ -233,13 +233,13 @@ def status(args): pid_file_path = os.path.join(configDefaults.PID_DIR, PID_NAME) if status: args.exit_code = 0 - print "Ambari Server running" - print "Found Ambari Server PID: " + str(pid) + " at: " + pid_file_path + print("Ambari Server running") + print("Found Ambari Server PID: " + str(pid) + " at: " + pid_file_path) else: if os.path.exists(pid_file_path): - print "Ambari Server not running. Stale PID File at: " + pid_file_path + print("Ambari Server not running. Stale PID File at: " + pid_file_path) else: - print "Ambari Server not running." + print("Ambari Server not running.") args.exit_code = 3 @@ -283,13 +283,13 @@ def setup_security(args): choice = optionCounter if choice is None: # Print menu options - print '=' * 75 - print 'Choose one of the following options: ' + print('=' * 75) + print('Choose one of the following options: ') iAction = 0 for actionDesc in actions: iAction += 1 - print ' [{0}] {1}'.format(iAction, actionDesc[1]) - print '=' * 75 + print(' [{0}] {1}'.format(iAction, actionDesc[1])) + print('=' * 75) choice_prompt = 'Enter choice, (1-{0}): '.format(iAction) choice_re = '[1-{0}]'.format(iAction) @@ -319,7 +319,7 @@ def get_backup_path(args): def backup(args): logger.info("Backup.") - print "Backup requested." + print("Backup requested.") backup_command = ["BackupRestore", 'backup'] path = get_backup_path(args) if not path is None: @@ -329,7 +329,7 @@ def backup(args): def restore(args): logger.info("Restore.") - print "Restore requested." + print("Restore requested.") restore_command = ["BackupRestore", 'restore'] path = get_backup_path(args) if not path is None: @@ -359,13 +359,13 @@ def print_action_arguments_help(action): required_options = _action_option_dependence_map[action][0] optional_options = _action_option_dependence_map[action][1] if required_options or optional_options: - print "Options used by action {0}:".format(action) + print("Options used by action {0}:".format(action)) if required_options: - print " required:{0}".format( - ";".join([print_opt for print_opt, _ in required_options])) + print(" required:{0}".format( + ";".join([print_opt for print_opt, _ in required_options]))) if optional_options: - print " optional:{0}".format( - ";".join([print_opt for print_opt, _ in optional_options])) + print(" optional:{0}".format( + ";".join([print_opt for print_opt, _ in optional_options]))) @OsFamilyFuncImpl(OSConst.WINSRV_FAMILY) def init_action_parser(action, parser): @@ -775,8 +775,8 @@ def fix_database_options(options, parser): @OsFamilyFuncImpl(OsFamilyImpl.DEFAULT) def fix_database_options(options, parser): if options.dbms == 'embedded': - print "WARNING: HostName for postgres server " + options.database_host + \ - " will be ignored: using localhost." + print("WARNING: HostName for postgres server " + options.database_host + \ + " will be ignored: using localhost.") options.database_host = "localhost" options.dbms = 'postgres' options.persistence_type = 'local' @@ -797,8 +797,8 @@ def fix_database_options(options, parser): parser.error("Option --jdbc-driver is used only in pair with --jdbc-db") if options.sid_or_sname.lower() not in ["sid", "sname"]: - print "WARNING: Valid values for sid_or_sname are 'sid' or 'sname'. Use 'sid' if the db identifier type is " \ - "Service ID. Use 'sname' if the db identifier type is Service Name" + print("WARNING: Valid values for sid_or_sname are 'sid' or 'sname'. Use 'sid' if the db identifier type is " \ + "Service ID. Use 'sname' if the db identifier type is Service Name") parser.print_help() exit(-1) else: @@ -925,7 +925,7 @@ def setup_logging(logger, filename, logging_level): logging.basicConfig(format=formatstr, level=logging_level, filename=filename) logger.setLevel(logging_level) - logger.info("loglevel=logging.{0}".format(logging._levelNames[logging_level])) + logger.info("loglevel=logging.{0}".format(logging._levelToName[logging_level])) def init_logging(): # init logger @@ -968,7 +968,7 @@ def main(options, args, parser): options.warnings = [] if len(args) == 0: - print parser.print_help() + print(parser.print_help()) parser.error("No action entered") action_map = create_user_action_map(args, options) @@ -996,7 +996,7 @@ def main(options, args, parser): matches += int(len(args) == args_number_required) if matches == 0: - print parser.print_help() + print(parser.print_help()) possible_args = ' or '.join(str(x) for x in action_obj.possible_args_numbers) parser.error("Invalid number of arguments. Entered: " + str(len(args)) + ", required: " + possible_args) @@ -1008,17 +1008,17 @@ def main(options, args, parser): required, optional = _action_option_dependence_map[action] for opt_str, opt_dest in required: if hasattr(options, opt_dest) and getattr(options, opt_dest) is None: - print "Missing option {0} for action {1}".format(opt_str, action) + print("Missing option {0} for action {1}".format(opt_str, action)) print_action_arguments_help(action) - print "Run ambari-server.py --help to see detailed description of each option" + print("Run ambari-server.py --help to see detailed description of each option") raise FatalException(1, "Missing option") action_obj.execute() if action_obj.need_restart: pstatus, pid = is_server_runing() if pstatus: - print 'NOTE: Restart Ambari Server to apply changes' + \ - ' ("ambari-server restart|stop+start")' + print('NOTE: Restart Ambari Server to apply changes' + \ + ' ("ambari-server restart|stop+start")') if options.warnings: for warning in options.warnings: @@ -1037,13 +1037,16 @@ def main(options, args, parser): print_warning_msg(e.reason) if options.exit_message is not None: - print options.exit_message + print(options.exit_message) if options.exit_code is not None: # not all actions may return a system exit code sys.exit(options.exit_code) def mainBody(): parser = optparse.OptionParser(usage="usage: %prog action [options]",) + if len(sys.argv) < 2: + print(parser.print_help()) + parser.error("No action entered") action = sys.argv[1] init_action_parser(action, parser) @@ -1085,7 +1088,7 @@ def enable_stack(options, args): if retcode == 0: status, pid = is_server_runing() if status: - print "restarting ambari server" + print("restarting ambari server") stop(options) start(options) diff --git a/ambari-server/src/main/python/ambari_server/BackupRestore.py b/ambari-server/src/main/python/ambari_server/BackupRestore.py index d418b7d901c..0ae59eca7d0 100644 --- a/ambari-server/src/main/python/ambari_server/BackupRestore.py +++ b/ambari-server/src/main/python/ambari_server/BackupRestore.py @@ -21,6 +21,7 @@ import sys import zipfile import os +import logging from ambari_server.ambariPath import AmbariPath # Default values are hardcoded here @@ -61,7 +62,7 @@ def perform_backup(self): # Use allowZip64=True to allow sizes greater than 4GB zipf = zipfile.ZipFile(self.zip_folder_path + self.zipname, 'w', allowZip64=True) zipdir(zipf, self.state_file_list, self.zipname) - except Exception, e: + except Exception as e: sys.exit("Could not create zip file. Details: " + str(e)) print("Zip file created at " + self.zip_folder_path + self.zipname) @@ -74,7 +75,7 @@ def perform_restore(self): try: print("Extracting the archive " + self.zip_folder_path + self.zipname) unzip(self.zip_folder_path + self.zipname, '/') - except Exception, e: + except Exception as e: sys.exit("Could not extract the zipfile " + self.zip_folder_path + self.zipname + " Details: " + str(e)) @@ -89,7 +90,7 @@ def unzip(source_filename, dest_dir): zf = zipfile.ZipFile(source_filename) try: zf.extractall(dest_dir) - except Exception, e: + except Exception as e: print("A problem occurred while unzipping. Details: " + str(e)) raise e finally: @@ -110,7 +111,7 @@ def zipdir(zipf, state_file_list, zipname): for file in files: if not file == zipname: zipf.write(os.path.join(root, file)) - except Exception, e: + except Exception as e: print("A problem occurred while unzipping. Details: " + str(e)) raise e finally: @@ -145,7 +146,7 @@ def retrieve_path_and_zipname(archive_absolute_path): if elements is not None and len(elements)>0: target['zipname'] = elements[len(elements)-1] target['path'] = archive_absolute_path.replace(elements[len(elements)-1], "") - except Exception, e: + except Exception as e: sys.exit("Could not retrieve path and zipname from the absolute path " + archive_absolute_path + ". Please check arguments." + " Details: " + str(e)) @@ -162,7 +163,7 @@ def main(argv=None): sys.exit("Unsupported process type: " + process_type) # if no archive is specified if len(argv) == 2: - print "No path specified. Will use " + DEFAULT_ARCHIVE + print("No path specified. Will use " + DEFAULT_ARCHIVE) location_data = retrieve_path_and_zipname(DEFAULT_ARCHIVE) else: location_data = retrieve_path_and_zipname(argv[2]) diff --git a/ambari-server/src/main/python/ambari_server/__init__.py b/ambari-server/src/main/python/ambari_server/__init__.py index 16818c904b9..6b1f9423dee 100644 --- a/ambari-server/src/main/python/ambari_server/__init__.py +++ b/ambari-server/src/main/python/ambari_server/__init__.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-server/src/main/python/ambari_server/ambariPath.py b/ambari-server/src/main/python/ambari_server/ambariPath.py index 940151c1366..20f460397e1 100644 --- a/ambari-server/src/main/python/ambari_server/ambariPath.py +++ b/ambari-server/src/main/python/ambari_server/ambariPath.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-server/src/main/python/ambari_server/checkDatabase.py b/ambari-server/src/main/python/ambari_server/checkDatabase.py index 2a3e0bad65a..08896880b3f 100644 --- a/ambari-server/src/main/python/ambari_server/checkDatabase.py +++ b/ambari-server/src/main/python/ambari_server/checkDatabase.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -83,9 +83,9 @@ def check_database(options): raise FatalException(int(retcode), "Database check failed to complete: {0}. \nPlease check {1} and {2} for more " "information.".format(stdout+stderr, configDefaults.SERVER_LOG_FILE, configDefaults.DB_CHECK_LOG)) else: - print str(stdout) + print(str(stdout)) if not stdout.startswith("No errors"): - print "Ambari Server 'check-database' completed" + print("Ambari Server 'check-database' completed") sys.exit(1) diff --git a/ambari-server/src/main/python/ambari_server/dbCleanup.py b/ambari-server/src/main/python/ambari_server/dbCleanup.py index 860d144e74d..7c418568de0 100644 --- a/ambari-server/src/main/python/ambari_server/dbCleanup.py +++ b/ambari-server/src/main/python/ambari_server/dbCleanup.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -92,7 +92,7 @@ def run_db_purge(options): current_user = ensure_can_start_under_current_user(ambari_user) environ = generate_env(options, ambari_user, current_user) - print "Purging historical data from the database ..." + print("Purging historical data from the database ...") if DEBUG_MODE and DEBUG_MODE == "y": command = DB_DEBUG_CLEANUP_CMD.format( jdk_path, @@ -114,17 +114,17 @@ def run_db_purge(options): print_info_msg("Return code from database cleanup command, retcode = " + str(retcode)) if stdout: - print "Console output from database purge-history command:" - print stdout - print + print("Console output from database purge-history command:") + print(stdout) + print() if stderr: - print "Error output from database purge-history command:" - print stderr - print + print("Error output from database purge-history command:") + print(stderr) + print() if retcode > 0: print_error_msg("Error encountered while purging the Ambari Server Database. Check the ambari-server.log for details.") else: - print "Purging historical data completed. Check the ambari-server.log for details." + print("Purging historical data completed. Check the ambari-server.log for details.") return retcode diff --git a/ambari-server/src/main/python/ambari_server/dbConfiguration.py b/ambari-server/src/main/python/ambari_server/dbConfiguration.py index c9e1afc3786..9e8c1ffdea3 100644 --- a/ambari-server/src/main/python/ambari_server/dbConfiguration.py +++ b/ambari-server/src/main/python/ambari_server/dbConfiguration.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -145,7 +145,7 @@ def configure_database(self, properties, options): return result def setup_database(self): - print 'Configuring {0} database...'.format(self.db_title) + print('Configuring {0} database...'.format(self.db_title)) #DB setup should be done last after doing any setup. if self._is_local_database(): @@ -194,12 +194,12 @@ def ensure_jdbc_driver_installed(self, properties): if replace_jdbc_in_share_dir: try: os.remove(os.path.join(configDefaults.JAVA_SHARE_PATH, custom_jdbc_name)) - except Exception, ee: + except Exception as ee: err = 'ERROR: Could not remove jdbc file. %s' % os.path.join(configDefaults.JAVA_SHARE_PATH, custom_jdbc_name) raise FatalException(1, err) shutil.copy(path_to_custom_jdbc_driver, configDefaults.JAVA_SHARE_PATH) - print "Copying {0} to {1}".format(path_to_custom_jdbc_driver, configDefaults.JAVA_SHARE_PATH) - except Exception, e: + print("Copying {0} to {1}".format(path_to_custom_jdbc_driver, configDefaults.JAVA_SHARE_PATH)) + except Exception as e: err = "Can not copy file {0} to {1} due to: {2} . Please check file " \ "permissions and free disk space.".format(path_to_custom_jdbc_driver, configDefaults.JAVA_SHARE_PATH, str(e)) raise FatalException(1, err) @@ -298,7 +298,7 @@ def _prompt_jdbc_driver_install(self, properties): print_error_msg(self.JDBC_DRIVER_INSTALL_MSG) else: print_warning_msg(self.JDBC_DRIVER_INSTALL_MSG) - raw_input(PRESS_ENTER_MSG) + input(PRESS_ENTER_MSG) result = self._is_jdbc_driver_installed(properties) return (result, self.JDBC_DRIVER_INSTALL_MSG) diff --git a/ambari-server/src/main/python/ambari_server/dbConfiguration_linux.py b/ambari-server/src/main/python/ambari_server/dbConfiguration_linux.py index 6bcc779da39..912e97df729 100644 --- a/ambari-server/src/main/python/ambari_server/dbConfiguration_linux.py +++ b/ambari-server/src/main/python/ambari_server/dbConfiguration_linux.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -23,7 +23,7 @@ import re import shutil import socket -from ambari_commons import subprocess32 +import subprocess import sys import time import pwd @@ -160,7 +160,7 @@ def _setup_remote_database(self): raise FatalException(-1, err) if self.ensure_jdbc_driver_installed(properties): - print 'Configuring remote database connection properties...' + print('Configuring remote database connection properties...') retcode = self._setup_remote_db() if retcode == -1: err = "Remote database setup aborted." @@ -188,7 +188,7 @@ def _get_default_driver_path(self, properties): def _install_jdbc_driver(self, properties, files_list): if type(files_list) is not int: - print 'Copying JDBC drivers to server resources...' + print('Copying JDBC drivers to server resources...') resources_dir = get_resources_location(properties) db_name = self.dbms_full_name.lower() @@ -393,7 +393,7 @@ class PGConfig(LinuxDBMSConfig): if OSCheck.is_suse_family() and not is_service_exist(PG_SERVICE_NAME): versioned_script_paths = glob.glob("/usr/pgsql-*/bin/postgresql*-setup") if versioned_script_paths: - versioned_script_path_tps = map(lambda path: (re.search(r'postgresql-([0-9]+\.?[0-9]*)', path).group(1), path), versioned_script_paths) + versioned_script_path_tps = [(re.search(r'postgresql-([0-9]+\.?[0-9]*)', path).group(1), path) for path in versioned_script_paths] versioned_script_path_tps.sort(key = lambda t: float(t[0]), reverse = True) for versioned_script_path_tp in versioned_script_path_tps: pgsql_service_file_name = "postgresql-%s" % versioned_script_path_tp[0] @@ -476,9 +476,9 @@ def ensure_dbms_is_running(self, options, properties, scmStatus=None): err = 'Unable to start PostgreSQL server. Status {0}. {1}. Exiting'.format(pg_status, err) raise FatalException(retcode, err) else: - print "Unable to check PostgreSQL server status when starting " \ - "without root privileges." - print "Please do not forget to start PostgreSQL server." + print("Unable to check PostgreSQL server status when starting " \ + "without root privileges.") + print("Please do not forget to start PostgreSQL server.") # # Private implementation @@ -487,7 +487,7 @@ def ensure_dbms_is_running(self, options, properties, scmStatus=None): def _setup_local_server(self, properties, options): # check if jdbc user is changed self._is_user_changed = PGConfig._is_jdbc_user_changed(self.database_username) - print 'Default properties detected. Using built-in database.' + print('Default properties detected. Using built-in database.') self._store_local_properties(properties, options) def _create_postgres_lock_directory(self): @@ -495,33 +495,33 @@ def _create_postgres_lock_directory(self): try: postgres_user_uid = pwd.getpwnam("postgres").pw_uid except KeyError: - print "WARNING: Unable to create /var/run/postgresql directory, because user [postgres] doesn't exist. Potentially," \ - " postgresql service start can be failed." + print("WARNING: Unable to create /var/run/postgresql directory, because user [postgres] doesn't exist. Potentially," \ + " postgresql service start can be failed.") return try: if not os.path.isdir("/var/run/postgresql"): os.mkdir("/var/run/postgresql") except Exception as e: - print "WARNING: Unable to create /var/run/postgresql directory. Potentially," \ - " postgresql service start can be failed." - print "Unexpected error: " + str(e) + print("WARNING: Unable to create /var/run/postgresql directory. Potentially," \ + " postgresql service start can be failed.") + print("Unexpected error: " + str(e)) return if postgres_user_uid: os.chown("/var/run/postgresql", postgres_user_uid, -1) def _setup_local_database(self): - print 'Checking PostgreSQL...' + print('Checking PostgreSQL...') (pg_status, retcode, out, err) = PGConfig._check_postgre_up() if not retcode == 0: err = 'Unable to start PostgreSQL server. Exiting' raise FatalException(retcode, err) - print 'Configuring local database...' + print('Configuring local database...') if self._is_user_changed: #remove backup for pg_hba in order to reconfigure postgres remove_file(PGConfig.PG_HBA_CONF_FILE_BACKUP) - print 'Configuring PostgreSQL...' + print('Configuring PostgreSQL...') retcode, out, err = self._configure_postgres() if not retcode == 0: err = 'Unable to configure PostgreSQL server. Exiting' @@ -544,7 +544,7 @@ def _reset_local_database(self): err = "Ambari Server 'reset' cancelled" raise FatalException(1, err) - print "Resetting the Server database..." + print("Resetting the Server database...") dbname = self.database_name filename = self.drop_tables_script_file @@ -672,16 +672,17 @@ def _check_postgre_up(): else: # run initdb only on non ubuntu systems as ubuntu does not have initdb cmd. if not OSCheck.is_ubuntu_family(): - print "Running initdb: This may take up to a minute." + print("Running initdb: This may take up to a minute.") retcode, out, err = run_os_command(PGConfig.PG_INITDB_CMD) if retcode == 0: - print out - print "About to start PostgreSQL" + print(out) + print("About to start PostgreSQL") try: - process = subprocess32.Popen(PGConfig.PG_START_CMD.split(' '), - stdout=subprocess32.PIPE, - stdin=subprocess32.PIPE, - stderr=subprocess32.PIPE + process = subprocess.Popen(PGConfig.PG_START_CMD.split(' '), + stdout=subprocess.PIPE, + stdin=subprocess.PIPE, + stderr=subprocess.PIPE, + universal_newlines=True ) out, err = process.communicate() retcode = process.returncode @@ -694,7 +695,7 @@ def _check_postgre_up(): if pg_status == PGConfig.PG_STATUS_RUNNING: print_info_msg("Postgres process is running. Returning...") return pg_status, 0, out, err - except (Exception), e: + except (Exception) as e: pg_status, retcode, out, err = PGConfig._get_postgre_status() if pg_status == PGConfig.PG_STATUS_RUNNING: return pg_status, 0, out, err @@ -733,23 +734,23 @@ def run_with_retries(command, message): :return: (code, out, err) """ for i in range(SETUP_DB_CONNECT_ATTEMPTS): - print message + print(message) retcode, outdata, errdata = run_os_command(command) if retcode == 0: - print 'done.' + print('done.') return retcode, outdata, errdata if (i+1) < SETUP_DB_CONNECT_ATTEMPTS: print_error_msg("Failed to execute command:" + str(command)) print_error_msg("stderr:" + errdata) print_error_msg("stdout:" + outdata) - print 'failed to execute queries ...retrying (%d)' % (i+1) + print('failed to execute queries ...retrying (%d)' % (i+1)) time.sleep(SETUP_DB_CONNECT_TIMEOUT) return retcode, outdata, errdata @staticmethod def _configure_pg_hba_ambaridb_users(conf_file, database_username): conf_file_content_in = sudo.read_file(conf_file) - conf_file_content_out = conf_file_content_in + conf_file_content_out = conf_file_content_in.decode() conf_file_content_out += "\n" conf_file_content_out += "local all " + database_username + ",mapred md5" conf_file_content_out += "\n" @@ -766,17 +767,17 @@ def _configure_pg_hba_ambaridb_users(conf_file, database_username): def _configure_pg_hba_postgres_user(): postgresString = "all postgres" pg_hba_conf_file_content_in = sudo.read_file(PGConfig.PG_HBA_CONF_FILE) - pg_hba_conf_file_content_out = re.sub('all\s*all', postgresString, pg_hba_conf_file_content_in) + pg_hba_conf_file_content_out = re.sub('all\s*all', postgresString, pg_hba_conf_file_content_in.decode()) sudo.create_file(PGConfig.PG_HBA_CONF_FILE, pg_hba_conf_file_content_out) - sudo.chmod(PGConfig.PG_HBA_CONF_FILE, 0644) + sudo.chmod(PGConfig.PG_HBA_CONF_FILE, 0o644) @staticmethod def _configure_postgresql_conf(): listenAddress = "listen_addresses = '*' #" postgresql_conf_file_in = sudo.read_file(PGConfig.POSTGRESQL_CONF_FILE) - postgresql_conf_file_out = re.sub('#+listen_addresses.*?(#|$)', listenAddress, postgresql_conf_file_in) + postgresql_conf_file_out = re.sub('#+listen_addresses.*?(#|$)', listenAddress, postgresql_conf_file_in.decode()) sudo.create_file(PGConfig.POSTGRESQL_CONF_FILE, postgresql_conf_file_out) - sudo.chmod(PGConfig.POSTGRESQL_CONF_FILE, 0644) + sudo.chmod(PGConfig.POSTGRESQL_CONF_FILE, 0o644) def _configure_postgres(self): if os.path.isfile(PGConfig.PG_HBA_CONF_FILE): @@ -784,11 +785,11 @@ def _configure_postgres(self): sudo.copy(PGConfig.PG_HBA_CONF_FILE, PGConfig.PG_HBA_CONF_FILE_BACKUP) else: #Postgres has been configured before, must not override backup - print "Backup for pg_hba found, reconfiguration not required" + print("Backup for pg_hba found, reconfiguration not required") return 0, "", "" PGConfig._configure_pg_hba_postgres_user() PGConfig._configure_pg_hba_ambaridb_users(PGConfig.PG_HBA_CONF_FILE, self.database_username) - sudo.chmod(PGConfig.PG_HBA_CONF_FILE, 0644) + sudo.chmod(PGConfig.PG_HBA_CONF_FILE, 0o644) PGConfig._configure_postgresql_conf() #restart postgresql if already running pg_status, retcode, out, err = PGConfig._get_postgre_status() @@ -799,11 +800,11 @@ def _configure_postgres(self): @staticmethod def _restart_postgres(): - print "Restarting PostgreSQL" - process = subprocess32.Popen(PGConfig.PG_RESTART_CMD.split(' '), - stdout=subprocess32.PIPE, - stdin=subprocess32.PIPE, - stderr=subprocess32.PIPE + print("Restarting PostgreSQL") + process = subprocess.Popen(PGConfig.PG_RESTART_CMD.split(' '), + stdout=subprocess.PIPE, + stdin=subprocess.PIPE, + stderr=subprocess.PIPE ) time.sleep(5) result = process.poll() @@ -1243,10 +1244,11 @@ def _extract_client_tarball(self, properties): cmd = SQLAConfig.EXTRACT_CMD.format(files[0], get_resources_location(properties)) - process = subprocess32.Popen(cmd.split(' '), - stdout=subprocess32.PIPE, - stdin=subprocess32.PIPE, - stderr=subprocess32.PIPE + process = subprocess.Popen(cmd.split(' '), + stdout=subprocess.PIPE, + stdin=subprocess.PIPE, + stderr=subprocess.PIPE, + universal_newlines=True ) out, err = process.communicate() diff --git a/ambari-server/src/main/python/ambari_server/dbConfiguration_windows.py b/ambari-server/src/main/python/ambari_server/dbConfiguration_windows.py index eca46ccbf75..d40548bdf11 100644 --- a/ambari-server/src/main/python/ambari_server/dbConfiguration_windows.py +++ b/ambari-server/src/main/python/ambari_server/dbConfiguration_windows.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -170,12 +170,12 @@ def _setup_remote_server(self, properties, options): pass def _setup_remote_database(self): - print 'Populating the {0} database structure...'.format(self.db_title) + print('Populating the {0} database structure...'.format(self.db_title)) self._populate_database_structure() def _reset_remote_database(self): - print 'Resetting the {0} database structure...'.format(self.db_title) + print('Resetting the {0} database structure...'.format(self.db_title)) self._populate_database_structure() diff --git a/ambari-server/src/main/python/ambari_server/enableStack.py b/ambari-server/src/main/python/ambari_server/enableStack.py index bf064bd9e66..45a4f1f3e70 100644 --- a/ambari-server/src/main/python/ambari_server/enableStack.py +++ b/ambari-server/src/main/python/ambari_server/enableStack.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one diff --git a/ambari-server/src/main/python/ambari_server/hostUpdate.py b/ambari-server/src/main/python/ambari_server/hostUpdate.py index 3002cb40603..a37b08c0f8c 100644 --- a/ambari-server/src/main/python/ambari_server/hostUpdate.py +++ b/ambari-server/src/main/python/ambari_server/hostUpdate.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -49,17 +49,17 @@ def update_host_names(args, options): logger.info("Update host names.") services_stopped = userInput.get_YN_input("Please, confirm Ambari services are stopped [y/n] (n)? ", False) if not services_stopped: - print 'Exiting...' + print('Exiting...') sys.exit(1) pending_commands = userInput.get_YN_input("Please, confirm there are no pending commands on cluster [y/n] (n)? ", False) if not pending_commands: - print 'Exiting...' + print('Exiting...') sys.exit(1) db_backup_done = userInput.get_YN_input("Please, confirm you have made backup of the Ambari db [y/n] (n)? ", False) if not db_backup_done: - print 'Exiting...' + print('Exiting...') sys.exit(1) status, pid = serverUtils.is_server_runing() diff --git a/ambari-server/src/main/python/ambari_server/kerberos_setup.py b/ambari-server/src/main/python/ambari_server/kerberos_setup.py index 84820efaff2..abbc7a10457 100644 --- a/ambari-server/src/main/python/ambari_server/kerberos_setup.py +++ b/ambari-server/src/main/python/ambari_server/kerberos_setup.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -77,7 +77,7 @@ def setup_kerberos(options): if input is not None and input != "": kerberos_property_value_map[kerberos_property.prop_name] = input - print "Properties to be updated / written into ambari properties:" + print("Properties to be updated / written into ambari properties:") pp = pprint.PrettyPrinter() pp.pprint(kerberos_property_value_map) @@ -85,9 +85,9 @@ def setup_kerberos(options): save = get_YN_input("Save settings [y/n] (y)? ", True) if save: update_properties_2(properties, kerberos_property_value_map) - print "Kerberos authentication settings successfully saved. Please restart the server in order for the new settings to take effect." + print("Kerberos authentication settings successfully saved. Please restart the server in order for the new settings to take effect.") else: - print "Kerberos authentication settings aborted." + print("Kerberos authentication settings aborted.") return 0; diff --git a/ambari-server/src/main/python/ambari_server/properties.py b/ambari-server/src/main/python/ambari_server/properties.py index 080d724da98..539363af055 100644 --- a/ambari-server/src/main/python/ambari_server/properties.py +++ b/ambari-server/src/main/python/ambari_server/properties.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -87,7 +87,7 @@ def __parse(self, lines): first, last = m.span() sepidx = last - 1 while line[-1] == '\\': - nextline = i.next() + nextline = next(i) nextline = nextline.strip() lineno += 1 line = line[:-1] + nextline @@ -117,7 +117,7 @@ def process_pair(self, key, value): oldvalue = self.unescape(oldvalue) value = self.unescape(value) self._props[key] = None if value is None else value.strip() - if self._keymap.has_key(key): + if key in self._keymap: oldkey = self._keymap.get(key) self._origprops[oldkey] = None if oldvalue is None else oldvalue.strip() else: @@ -132,20 +132,18 @@ def unescape(self, value): return newvalue def removeOldProp(self, key): - if self._origprops.has_key(key): + if key in self._origprops: del self._origprops[key] pass def removeProp(self, key): - if self._props.has_key(key): + if key in self._props: del self._props[key] pass def load(self, stream): - if type(stream) is not file: - raise TypeError, 'Argument should be a file object!' if stream.mode != 'r': - raise ValueError, 'Stream should be opened in read-only mode!' + raise ValueError('Stream should be opened in read-only mode!') try: self.fileName = os.path.abspath(stream.name) lines = stream.readlines() @@ -175,11 +173,11 @@ def __getattr__(self, name): raise NotImplementedError("The method '{}' is not implemented.".format(name)) def __contains__(self, key): - return key in self._props + return key in self._props def sort_props(self): tmp_props = {} - for key in sorted(self._props.iterkeys()): + for key in sorted(self._props.keys()): tmp_props[key] = self._props[key] self._props = tmp_props pass @@ -187,7 +185,7 @@ def sort_props(self): def sort_origprops(self): tmp_props = self._origprops.copy() self._origprops.clear() - for key in sorted(tmp_props.iterkeys()): + for key in sorted(tmp_props.keys()): self._origprops[key] = tmp_props[key] pass @@ -197,7 +195,7 @@ def store(self, out, header=""): This function will attempt to close the file handler once it's done. """ if out.mode[0] != 'w': - raise ValueError, 'Steam should be opened in write mode!' + raise ValueError('Steam should be opened in write mode!') try: out.write(''.join(('#', ASF_LICENSE_HEADER, '\n'))) out.write(''.join(('#', header, '\n'))) @@ -218,7 +216,7 @@ def store_ordered(self, out, header=""): """ Write the properties list to the stream 'out' along with the optional 'header' """ if out.mode[0] != 'w': - raise ValueError, 'Steam should be opened in write mode!' + raise ValueError('Steam should be opened in write mode!') try: out.write(''.join(('#', ASF_LICENSE_HEADER, '\n'))) out.write(''.join(('#', header, '\n'))) @@ -226,7 +224,7 @@ def store_ordered(self, out, header=""): tstamp = time.strftime('%a %b %d %H:%M:%S %Z %Y', time.localtime()) out.write(''.join(('#', tstamp, '\n'))) # Write properties from the pristine dictionary - for key in sorted(self._origprops.iterkeys()): + for key in sorted(self._origprops.keys()): val = self._origprops[key] if val is not None: out.write(''.join((key, '=', val, '\n'))) diff --git a/ambari-server/src/main/python/ambari_server/resourceFilesKeeper.py b/ambari-server/src/main/python/ambari_server/resourceFilesKeeper.py index 64600c8bba4..c9fc48be44d 100644 --- a/ambari-server/src/main/python/ambari_server/resourceFilesKeeper.py +++ b/ambari-server/src/main/python/ambari_server/resourceFilesKeeper.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -145,7 +145,7 @@ def list_stacks(self, root_dir): """ try: return self._list_metainfo_dirs(root_dir) - except Exception, err: + except Exception as err: raise KeeperException("Can not list stacks: {0}".format(str(err))) def list_common_services(self, root_dir): @@ -154,7 +154,7 @@ def list_common_services(self, root_dir): """ try: return self._list_metainfo_dirs(root_dir) - except Exception, err: + except Exception as err: raise KeeperException("Can not list common services: {0}".format(str(err))) def list_extensions(self, root_dir): @@ -163,7 +163,7 @@ def list_extensions(self, root_dir): """ try: return self._list_metainfo_dirs(root_dir) - except Exception, err: + except Exception as err: raise KeeperException("Can not list extensions: {0}".format(str(err))) def update_directory_archive(self, directory): @@ -217,7 +217,7 @@ def count_hash_sum(self, directory): break sha1.update(data) return sha1.hexdigest() - except Exception, err: + except Exception as err: raise KeeperException("Can not calculate directory " "hash: {0}".format(str(err))) @@ -232,7 +232,7 @@ def read_hash_sum(self, directory): try: with open(hash_file) as fh: return fh.readline().strip() - except Exception, err: + except Exception as err: raise KeeperException("Can not read file {0} : {1}".format(hash_file, str(err))) else: @@ -249,7 +249,7 @@ def write_hash_sum(self, directory, new_hash): with open(hash_file, "w") as fh: fh.write(new_hash) os.chmod(hash_file, 0o644) - except Exception, err: + except Exception as err: raise KeeperException("Can not write to file {0} : {1}".format(hash_file, str(err))) @@ -279,7 +279,7 @@ def zip_directory(self, directory, skip_if_empty = False): zf.write(absname, arcname) zf.close() os.chmod(zip_file_path, 0o755) - except Exception, err: + except Exception as err: raise KeeperException("Can not create zip archive of " "directory {0} : {1}".format(directory, str(err))) @@ -296,7 +296,7 @@ def dbg_out(self, text): if self.DEBUG: sys.stderr.write("{0}\n".format(text)) if not self.DEBUG and self.verbose: - print text + print(text) def main(argv=None): diff --git a/ambari-server/src/main/python/ambari_server/serverClassPath.py b/ambari-server/src/main/python/ambari_server/serverClassPath.py index 9257d499bdb..19905f19547 100644 --- a/ambari-server/src/main/python/ambari_server/serverClassPath.py +++ b/ambari-server/src/main/python/ambari_server/serverClassPath.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one diff --git a/ambari-server/src/main/python/ambari_server/serverConfiguration.py b/ambari-server/src/main/python/ambari_server/serverConfiguration.py index 7c6f318554f..2d962d9707c 100644 --- a/ambari-server/src/main/python/ambari_server/serverConfiguration.py +++ b/ambari-server/src/main/python/ambari_server/serverConfiguration.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -258,7 +258,7 @@ def get_ambari_properties(): properties = Properties() with open(conf_file) as hfR: properties.load(hfR) - except (Exception), e: + except (Exception) as e: print_error_msg ('Could not read "%s": %s' % (conf_file, str(e))) return -1 @@ -272,11 +272,11 @@ def get_ambari_properties(): else: root = '' - for k,v in properties.iteritems(): + for k,v in properties.items(): properties.__dict__[k] = v.replace("$ROOT", root) properties._props[k] = v.replace("$ROOT", root) - except (Exception), e: - print_error_msg ('Could not replace %s in "%s": %s' %(conf_file, root_env, str(e))) + except (Exception) as e: + print_error_msg('Could not replace %s in "%s": %s' %(conf_file, root_env, str(e))) return properties class ServerDatabaseType(object): @@ -439,7 +439,7 @@ def check_if_directories_writable(self, directories): for directory in directories: if not os.path.isdir(directory): try: - os.makedirs(directory, 0755) + os.makedirs(directory, 0o755) except Exception as ex: # permission denied here is expected when ambari runs as non-root print_error_msg("Could not create {0}. Reason: {1}".format(directory, str(ex))) @@ -744,7 +744,7 @@ def backup_file_in_temp(filePath): try: shutil.copyfile(filePath, tmpDir + os.sep + AMBARI_PROPERTIES_FILE + "." + str(back_up_file_count + 1)) - except (Exception), e: + except (Exception) as e: print_error_msg('Could not backup file in temp "%s": %s' % ( back_up_file_count, str(e))) return 0 @@ -808,7 +808,7 @@ def check_database_name_property(upgrade=False): version = get_ambari_version(properties) if upgrade and (properties[JDBC_DATABASE_PROPERTY] not in ServerDatabases.databases() - or properties.has_key(JDBC_RCA_SCHEMA_PROPERTY)): + or JDBC_RCA_SCHEMA_PROPERTY in properties): # This code exists for historic reasons in which property names changed from Ambari 1.6.1 to 1.7.0 persistence_type = properties[PERSISTENCE_TYPE_PROPERTY] if persistence_type == "remote": @@ -852,7 +852,7 @@ def update_database_name_property(upgrade=False): try: with open(conf_file, "w") as hfW: properties.store(hfW) - except Exception, e: + except Exception as e: err = 'Could not write ambari config file "%s": %s' % (conf_file, e) raise FatalException(-1, err) @@ -992,7 +992,7 @@ def remove_password_file(filename): if os.path.exists(passFilePath): try: os.remove(passFilePath) - except Exception, e: + except Exception as e: print_warning_msg('Unable to remove password file: {0}'.format(str(e))) return 1 pass @@ -1142,15 +1142,15 @@ def update_ambari_env(): # Previous env file does not exist if (not prev_env_file) or (prev_env_file is None): - print ("INFO: Can not find %s file from previous version, skipping restore of environment settings. " - "%s may not include any user customization.") % (configDefaults.AMBARI_ENV_BACKUP_FILE, AMBARI_ENV_FILE) + print(("INFO: Can not find %s file from previous version, skipping restore of environment settings. " + "%s may not include any user customization.") % (configDefaults.AMBARI_ENV_BACKUP_FILE, AMBARI_ENV_FILE)) return 0 try: if env_file is not None: os.remove(env_file) os.rename(prev_env_file, env_file) - print ("INFO: Original file %s kept") % (AMBARI_ENV_FILE) + print(("INFO: Original file %s kept") % (AMBARI_ENV_FILE)) except OSError as e: print_error_msg ( "Couldn't move %s file: %s" % (prev_env_file, str(e))) return -1 @@ -1204,7 +1204,7 @@ def update_ambari_properties(): try: old_properties = Properties() old_properties.load(hfOld) - except Exception, e: + except Exception as e: print_error_msg ('Could not read "%s": %s' % (prev_conf_file, str(e))) return -1 @@ -1238,7 +1238,7 @@ def update_ambari_properties(): with open(conf_file, 'w') as hfW: new_properties.store(hfW) - except Exception, e: + except Exception as e: print_error_msg ('Could not write "%s": %s' % (conf_file, str(e))) return -1 @@ -1247,7 +1247,7 @@ def update_ambari_properties(): new_conf_file = prev_conf_file + '.' + timestamp.strftime(fmt) try: os.rename(prev_conf_file, new_conf_file) - except Exception, e: + except Exception as e: print_error_msg ('Could not rename "%s" to "%s": %s' % (prev_conf_file, new_conf_file, str(e))) #Not critical, move on @@ -1263,7 +1263,7 @@ def update_properties(propertyMap): try: with open(conf_file, 'r') as file: properties.load(file) - except (Exception), e: + except (Exception) as e: print_error_msg('Could not read "%s": %s' % (conf_file, e)) return -1 @@ -1272,7 +1272,7 @@ def update_properties(propertyMap): properties.process_pair(key, str(propertyMap[key])) for key in properties.keys(): - if not propertyMap.has_key(key): + if not propertyMap.__contains__(key): properties.removeOldProp(key) with open(conf_file, 'w') as file: @@ -1301,14 +1301,14 @@ def write_property(key, value): try: with open(conf_file, "r") as hfR: properties.load(hfR) - except Exception, e: + except Exception as e: print_error_msg('Could not read ambari config file "%s": %s' % (conf_file, e)) return -1 properties.process_pair(key, value) try: with open(conf_file, 'w') as hfW: properties.store(hfW) - except Exception, e: + except Exception as e: print_error_msg('Could not write ambari config file "%s": %s' % (conf_file, e)) return -1 return 0 @@ -1394,29 +1394,29 @@ def from_properties(cls, properties, section_name): def __load_properties(properties, section_name): if section_name is None or section_name is "": raise FatalException(-1, "Invalid properties section: " + ("(empty)" if section_name is None else "")) - if(properties.has_key(section_name + ".desc")): #Not critical + if(properties.__contains__(section_name + ".desc")): #Not critical desc = properties[section_name + ".desc"] else: desc = section_name - if not properties.has_key(section_name + ".url"): + if not properties.__contains__(section_name + ".url"): raise FatalException(-1, "Invalid JDK URL in the properties section: " + section_name) url = properties[section_name + ".url"] #Required - if not properties.has_key(section_name + ".re"): + if not properties.__contains__(section_name + ".re"): raise FatalException(-1, "Invalid JDK output parsing regular expression in the properties section: " + section_name) reg_exp = properties[section_name + ".re"] #Required - if(properties.has_key(section_name + ".dest-file")): #Not critical + if(properties.__contains__(section_name + ".dest-file")): #Not critical dest_file = properties[section_name + ".dest-file"] else: dest_file = section_name + ".exe" - if(properties.has_key(section_name + ".jcpol-url")): #Not critical + if(properties.__contains__(section_name + ".jcpol-url")): #Not critical jcpol_url = properties[section_name + ".jcpol-url"] else: jcpol_url = None - if(properties.has_key(section_name + ".jcpol-file")): #Not critical + if(properties.__contains__(section_name + ".jcpol-file")): #Not critical jcpol_file = properties[section_name + ".jcpol-file"] else: jcpol_file = None - if(properties.has_key(section_name + ".home")): #Not critical + if(properties.__contains__(section_name + ".home")): #Not critical inst_dir = properties[section_name + ".home"] else: inst_dir = "C:\\" + section_name @@ -1458,14 +1458,14 @@ def find_jdk(): print("INFO: Looking for available JDKs at {0}".format(configDefaults.JDK_INSTALL_DIR)) jdks = glob.glob(os.path.join(configDefaults.JDK_INSTALL_DIR, configDefaults.JDK_SEARCH_PATTERN)) #[fbarca] Use the newest JDK - jdks.sort(None, None, True) + jdks.sort(reverse=True) print_info_msg("Found: {0}".format(str(jdks))) if len(jdks) == 0: return for jdkPath in jdks: - print "INFO: Trying to use JDK {0}".format(jdkPath) + print("INFO: Trying to use JDK {0}".format(jdkPath)) if validate_jdk(jdkPath): - print "INFO: Selected JDK {0}".format(jdkPath) + print("INFO: Selected JDK {0}".format(jdkPath)) return jdkPath else: print_error_msg ("JDK {0} is invalid".format(jdkPath)) @@ -1488,11 +1488,11 @@ def get_resources_location(properties): resources_dir = properties[RESOURCES_DIR_PROPERTY] if not resources_dir: resources_dir = configDefaults.SERVER_RESOURCES_DIR - except (KeyError), e: + except (KeyError) as e: err = 'Property ' + str(e) + ' is not defined at ' + properties.fileName resources_dir = configDefaults.SERVER_RESOURCES_DIR - if not os.path.exists(os.path.abspath(resources_dir)): + if not os.path.exists(os.path.abspath(str(resources_dir))): msg = 'Resources dir ' + resources_dir + ' is incorrectly configured: ' + err raise FatalException(1, msg) @@ -1540,7 +1540,7 @@ def get_mpacks_staging_location(properties): # def get_dashboard_location(properties): resources_dir = get_resources_location(properties) - dashboard_location = os.path.join(resources_dir, configDefaults.DASHBOARD_DIRNAME) + dashboard_location = os.path.join(str(resources_dir), configDefaults.DASHBOARD_DIRNAME) return dashboard_location # diff --git a/ambari-server/src/main/python/ambari_server/serverSetup.py b/ambari-server/src/main/python/ambari_server/serverSetup.py index 14b91faa532..967bfecb43f 100644 --- a/ambari-server/src/main/python/ambari_server/serverSetup.py +++ b/ambari-server/src/main/python/ambari_server/serverSetup.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -23,7 +23,7 @@ import re import shutil import sys -from ambari_commons import subprocess32 +import subprocess import getpass import logging @@ -104,9 +104,9 @@ def verify_setup_allowed(options): if isSecure: (isPersisted, masterKeyFile) = get_is_persisted(properties) if not isPersisted: - print "ERROR: Cannot run silent 'setup' with password encryption enabled " \ - "and Master Key not persisted." - print "Ambari Server 'setup' exiting." + print("ERROR: Cannot run silent 'setup' with password encryption enabled " \ + "and Master Key not persisted.") + print("Ambari Server 'setup' exiting.") return 1 factory = DBMSConfigFactory() @@ -127,8 +127,8 @@ def verify_setup_allowed(options): valid = False if not valid: - print "ERROR: Cannot run silent setup without database connection properties provided." - print "Ambari Server 'setup' exiting." + print("ERROR: Cannot run silent setup without database connection properties provided.") + print("Ambari Server 'setup' exiting.") return 2 return 0 @@ -146,7 +146,7 @@ def check_selinux(): try: retcode, out, err = run_os_command(GET_SE_LINUX_ST_CMD) se_status = re.search('(disabled|enabled)', out).group(0) - print "SELinux status is '" + se_status + "'" + print("SELinux status is '" + se_status + "'") if se_status == SE_STATUS_DISABLED: return 0 else: @@ -155,9 +155,9 @@ def check_selinux(): except AttributeError: err = "Error determining SELinux mode. Exiting." raise FatalException(1, err) - print "SELinux mode is '" + se_mode + "'" + print("SELinux mode is '" + str(se_mode) + "'") if se_mode == SE_MODE_ENFORCING: - print "Temporarily disabling SELinux" + print("Temporarily disabling SELinux") run_os_command(SE_SETENFORCE_CMD) print_warning_msg( "SELinux is set to 'permissive' mode and temporarily disabled.") @@ -179,7 +179,7 @@ def disable_security_enhancements(): @OsFamilyFuncImpl(OsFamilyImpl.DEFAULT) def disable_security_enhancements(): - print 'Checking SELinux...' + print('Checking SELinux...') err = '' retcode = check_selinux() if not retcode == 0: @@ -381,7 +381,7 @@ def check_firewall(): firewall_obj = Firewall().getFirewallObject() firewall_on = firewall_obj.check_firewall() if firewall_obj.stderrdata and len(firewall_obj.stderrdata) > 0: - print firewall_obj.stderrdata + print(firewall_obj.stderrdata) if firewall_on: print_warning_msg("%s is running. Confirm the necessary Ambari ports are accessible. " % firewall_obj.FIREWALL_SERVICE_NAME + @@ -437,7 +437,7 @@ def download_and_install_jdk(self, args, properties, ambariOnly = False): self.jdk_index = self.custom_jdk_number if args.stack_java_home: # reset stack specific jdk properties if stack_java_home exists - print 'Setting JAVA_HOME for stack services...' + print('Setting JAVA_HOME for stack services...') print_warning_msg("JAVA_HOME " + args.stack_java_home + " (Stack) must be valid on ALL hosts") print_warning_msg(jcePolicyWarn) properties.process_pair(STACK_JAVA_HOME_PROPERTY, args.stack_java_home) @@ -488,7 +488,7 @@ def download_and_install_jdk(self, args, properties, ambariOnly = False): if not os.path.exists(args.java_home) or not os.path.isfile(os.path.join(args.java_home, "bin", self.JAVA_BIN)): err = "Java home path or java binary file is unavailable. Please put correct path to java home." raise FatalException(1, err) - print "Validating JDK on Ambari Server...done." + print("Validating JDK on Ambari Server...done.") properties.process_pair(JAVA_HOME_PROPERTY, args.java_home) properties.removeOldProp(JDK_NAME_PROPERTY) @@ -514,14 +514,14 @@ def download_and_install_jdk(self, args, properties, ambariOnly = False): resources_dir = get_resources_location(properties) - dest_file = os.path.abspath(os.path.join(resources_dir, jdk_cfg.dest_file)) + dest_file = os.path.abspath(os.path.join(str(resources_dir), jdk_cfg.dest_file)) if os.path.exists(dest_file): - print "JDK already exists, using " + dest_file + print("JDK already exists, using " + dest_file) elif properties[JDK_DOWNLOAD_SUPPORTED_PROPERTY].upper() == "FALSE": - print "ERROR: Oracle JDK is not found in {1}. JDK download is not supported in this distribution. Please download Oracle JDK " \ - "archive ({0}) manually from Oracle site, place it into {1} and re-run this script.".format(jdk_cfg.dest_file, dest_file) - print "NOTE: If you have already downloaded the file, please verify if the name is exactly same as {0}.".format(jdk_cfg.dest_file) - print 'Exiting...' + print("ERROR: Oracle JDK is not found in {1}. JDK download is not supported in this distribution. Please download Oracle JDK " \ + "archive ({0}) manually from Oracle site, place it into {1} and re-run this script.".format(jdk_cfg.dest_file, dest_file)) + print("NOTE: If you have already downloaded the file, please verify if the name is exactly same as {0}.".format(jdk_cfg.dest_file)) + print('Exiting...') sys.exit(1) else: ok = get_YN_input("To download the Oracle JDK and the Java Cryptography Extension (JCE) " @@ -533,18 +533,18 @@ def download_and_install_jdk(self, args, properties, ambariOnly = False): "files manually.\nDo you accept the " "Oracle Binary Code License Agreement [y/n] (y)? ", True) if not ok: - print 'Exiting...' + print('Exiting...') sys.exit(1) jdk_url = jdk_cfg.url - print 'Downloading JDK from ' + jdk_url + ' to ' + dest_file + print('Downloading JDK from ' + jdk_url + ' to ' + dest_file) self._download_jdk(jdk_url, dest_file, progress_func) try: (retcode, out, java_home_dir) = self._install_jdk(dest_file, jdk_cfg) - except Exception, e: - print "Installation of JDK has failed: %s\n" % str(e) + except Exception as e: + print("Installation of JDK has failed: %s\n" % str(e)) file_exists = os.path.isfile(dest_file) if file_exists: ok = get_YN_input("JDK found at " + dest_file + ". " @@ -556,14 +556,14 @@ def download_and_install_jdk(self, args, properties, ambariOnly = False): else: jdk_url = jdk_cfg.url - print 'Re-downloading JDK from ' + jdk_url + ' to ' + dest_file + print('Re-downloading JDK from ' + jdk_url + ' to ' + dest_file) self._download_jdk(jdk_url, dest_file, progress_func) - print 'Successfully re-downloaded JDK distribution to ' + dest_file + print('Successfully re-downloaded JDK distribution to ' + dest_file) try: (retcode, out) = self._install_jdk(dest_file, jdk_cfg) - except Exception, e: - print "Installation of JDK was failed: %s\n" % str(e) + except Exception as e: + print("Installation of JDK was failed: %s\n" % str(e)) err = "Unable to install JDK. Please remove JDK, file found at " + \ dest_file + " and re-run Ambari Server setup" raise FatalException(1, err) @@ -591,20 +591,20 @@ def download_and_unpack_jce_policy(self, properties, ambariOnly = False): try: JDKSetup._download_jce_policy(jdk_cfg.jcpol_url, jdk_cfg.dest_jcpol_file, resources_dir, properties, ambariOnly) - except FatalException, e: - print err_msg_stdout + except FatalException as e: + print(err_msg_stdout) print_error_msg("Failed to download JCE policy files:") if e.reason is not None: print_error_msg("\nREASON: {0}".format(e.reason)) # TODO: We don't fail installation if _download_jce_policy fails. Is it OK? - print 'Installing JCE policy...' + print('Installing JCE policy...') try: jdk_path = properties.get_property(JAVA_HOME_PROPERTY) JDKSetup.unpack_jce_policy(jdk_path, resources_dir, jdk_cfg.dest_jcpol_file) self.adjust_jce_permissions(jdk_path) - except FatalException, e: - print err_msg_stdout + except FatalException as e: + print(err_msg_stdout) print_error_msg("Failed to install JCE policy files:") if e.reason is not None: print_error_msg("\nREASON: {0}".format(e.reason)) @@ -614,7 +614,7 @@ def download_and_unpack_jce_policy(self, properties, ambariOnly = False): def unpack_jce_policy(jdk_path, resources_dir, jce_packed_file): jdk_security_path = os.path.abspath(os.path.join(jdk_path, configDefaults.JDK_SECURITY_DIR)) - jce_zip_path = os.path.abspath(os.path.join(resources_dir, jce_packed_file)) + jce_zip_path = os.path.abspath(os.path.join(str(resources_dir), jce_packed_file)) expand_jce_zip_file(jce_zip_path, jdk_security_path) def _populate_jdk_configs(self, properties, jdk_num, ambariOnly = False): @@ -626,13 +626,13 @@ def remove_jdk_condition(name): if name != "jdk1.7": return True else: - print "JDK 7 detected. Removed from choices." + print("JDK 7 detected. Removed from choices.") return False - if properties.has_key(JDK_RELEASES): + if properties.__contains__(JDK_RELEASES): jdk_names = properties[JDK_RELEASES].split(',') - jdk_names = filter(None, jdk_names) + jdk_names = [_f for _f in jdk_names if _f] if ambariOnly: - jdk_names = filter(lambda x : remove_jdk_condition(x), jdk_names) + jdk_names = [x for x in jdk_names if remove_jdk_condition(x)] jdks = [] for jdk_name in jdk_names: jdkR = JDKRelease.from_properties(properties, jdk_name) @@ -661,35 +661,35 @@ def _download_jdk(self, jdk_url, dest_file, progress_func = None): try: force_download_file(jdk_url, dest_file, progress_func = progress_func) - print 'Successfully downloaded JDK distribution to ' + dest_file + print('Successfully downloaded JDK distribution to ' + dest_file) except FatalException: raise - except Exception, e: + except Exception as e: err = jdk_download_fail_msg.format(str(e)) raise FatalException(1, err) @staticmethod def _download_jce_policy(jcpol_url, dest_jcpol_file, resources_dir, properties, ambariOnly = False): - dest_file = os.path.abspath(os.path.join(resources_dir, dest_jcpol_file)) + dest_file = os.path.abspath(os.path.join(str(resources_dir), dest_jcpol_file)) if not os.path.exists(dest_file): if properties[JCE_DOWNLOAD_SUPPORTED_PROPERTY].upper() == "FALSE": - print "ERROR: JCE Policy archive is not found in {1}. JCE Policy archive download is not supported in this distribution. " \ - "Please download JCE Policy archive ({0}) from Oracle site, place it into {1} and re-run this script.".format(dest_jcpol_file, dest_file) - print 'Exiting...' + print("ERROR: JCE Policy archive is not found in {1}. JCE Policy archive download is not supported in this distribution. " \ + "Please download JCE Policy archive ({0}) from Oracle site, place it into {1} and re-run this script.".format(dest_jcpol_file, dest_file)) + print('Exiting...') sys.exit(1) - print 'Downloading JCE Policy archive from ' + jcpol_url + ' to ' + dest_file + print('Downloading JCE Policy archive from ' + jcpol_url + ' to ' + dest_file) try: force_download_file(jcpol_url, dest_file) - print 'Successfully downloaded JCE Policy archive to ' + dest_file + print('Successfully downloaded JCE Policy archive to ' + dest_file) except FatalException: raise - except Exception, e: + except Exception as e: err = 'Failed to download JCE Policy archive: ' + str(e) raise FatalException(1, err) else: - print "JCE Policy archive already exists, using " + dest_file + print("JCE Policy archive already exists, using " + dest_file) properties.process_pair(JCE_NAME_PROPERTY, dest_jcpol_file) if not ambariOnly: @@ -725,7 +725,7 @@ def __init__(self): def _install_jdk(self, java_inst_file, jdk_cfg): jdk_inst_dir = jdk_cfg.inst_dir - print "Installing JDK to {0}".format(jdk_inst_dir) + print("Installing JDK to {0}".format(jdk_inst_dir)) if not os.path.exists(jdk_inst_dir): os.makedirs(jdk_inst_dir) @@ -752,21 +752,21 @@ def _install_jdk(self, java_inst_file, jdk_cfg): if retcode == 1603: # JDK already installed - print "JDK already installed in {0}".format(jdk_inst_dir) + print("JDK already installed in {0}".format(jdk_inst_dir)) retcode = 0 else: if retcode != 0: err = "Installation of JDK returned exit code %s" % retcode raise FatalException(retcode, err) - print "Successfully installed JDK to {0}".format(jdk_inst_dir) + print("Successfully installed JDK to {0}".format(jdk_inst_dir)) # Don't forget to adjust the JAVA_HOME env var return (retcode, out, jdk_inst_dir) def _ensure_java_home_env_var_is_set(self, java_home_dir): - if not os.environ.has_key(JAVA_HOME) or os.environ[JAVA_HOME] != java_home_dir: + if JAVA_HOME not in os.environ or os.environ[JAVA_HOME] != java_home_dir: java_home_dir_unesc = compress_backslashes(java_home_dir) retcode, out, err = run_os_command("SETX {0} {1} /M".format(JAVA_HOME, java_home_dir_unesc)) if retcode != 0: @@ -804,7 +804,7 @@ def __init__(self): def _install_jdk(self, java_inst_file, jdk_cfg): jdk_inst_dir = jdk_cfg.inst_dir - print "Installing JDK to {0}".format(jdk_inst_dir) + print("Installing JDK to {0}".format(jdk_inst_dir)) retcode, out, err = run_os_command(self.CREATE_JDK_DIR_CMD.format(jdk_inst_dir)) retcode, out, err = run_os_command(self.CHMOD_JDK_DIR_CMD.format(jdk_inst_dir)) @@ -827,7 +827,7 @@ def _install_jdk(self, java_inst_file, jdk_cfg): jdk_version = re.search(jdk_cfg.reg_exp, out).group(1) java_home_dir = os.path.join(jdk_inst_dir, jdk_version) - print "Successfully installed JDK to {0}".format(jdk_inst_dir) + print("Successfully installed JDK to {0}".format(jdk_inst_dir)) return (retcode, out, java_home_dir) def _ensure_java_home_env_var_is_set(self, java_home_dir): @@ -844,11 +844,12 @@ def adjust_jce_permissions(self, jdk_path): cmd = " && ".join(cmds) - process = subprocess32.Popen(cmd, - stdout=subprocess32.PIPE, - stdin=subprocess32.PIPE, - stderr=subprocess32.PIPE, - shell=True + process = subprocess.Popen(cmd, + stdout=subprocess.PIPE, + stdin=subprocess.PIPE, + stderr=subprocess.PIPE, + shell=True, + universal_newlines=True ) (stdoutdata, stderrdata) = process.communicate() @@ -959,8 +960,8 @@ def _cache_jdbc_driver(args): try: shutil.copy(args.jdbc_driver, dest) - print "Copying {0} to {1}".format(args.jdbc_driver, dest) - except Exception, e: + print("Copying {0} to {1}".format(args.jdbc_driver, dest)) + except Exception as e: err = "Cannot copy file {0} to {1} due to: {2} . Please check file " \ "permissions and free disk space.".format(args.jdbc_driver, dest, str(e)) raise FatalException(1, err) @@ -970,17 +971,17 @@ def _cache_jdbc_driver(args): if os.path.isfile(symlink_name): os.remove(symlink_name) os.symlink(dest, symlink_name) - print "Creating symlink {0} to {1}".format(dest, symlink_name) - except Exception, e: + print("Creating symlink {0} to {1}".format(dest, symlink_name)) + except Exception as e: err = "Cannot create symlink {0} to {1} due to: {2} . Please check file " \ "permissions and free disk space.".format(dest, symlink_name, str(e)) raise FatalException(1, err) update_properties(properties) - print "If you are updating existing jdbc driver jar for " + args.jdbc_db + " with " + jdbc_name + ". Please remove the " \ + print("If you are updating existing jdbc driver jar for " + args.jdbc_db + " with " + jdbc_name + ". Please remove the " \ "old driver jar, from all hosts. Restarting services that need the driver, will " \ - "automatically copy the new jar to the hosts." - print "JDBC driver was successfully initialized." + "automatically copy the new jar to the hosts.") + print("JDBC driver was successfully initialized.") # # Database @@ -997,7 +998,7 @@ def prompt_db_properties(options): else: ok = True - print 'Configuring database...' + print('Configuring database...') options.must_set_database_options = ok options.database_index = factory.select_dbms(options) @@ -1022,8 +1023,8 @@ def _createDefDbFactory(options): properties = get_ambari_properties() if properties == -1: raise FatalException(-1, "Error getting ambari properties") - if not (properties.getPropertyDict().has_key(JDBC_URL_PROPERTY) and - properties.getPropertyDict().has_key(JDBC_RCA_URL_PROPERTY)): + if not (JDBC_URL_PROPERTY in properties.getPropertyDict() and + JDBC_RCA_URL_PROPERTY in properties.getPropertyDict()): raise FatalException(-1, "Ambari Server not set up yet. Nothing to reset.") empty_options = optparse.Values() @@ -1149,7 +1150,7 @@ def setup(options): logger.info("Setup ambari-server.") if options.only_silent: if check_setup_already_done(): - print "Nothing was done. Ambari Setup already performed and cannot re-run setup in silent mode. Use \"ambari-server setup\" command without -s option to change Ambari setup." + print("Nothing was done. Ambari Setup already performed and cannot re-run setup in silent mode. Use \"ambari-server setup\" command without -s option to change Ambari setup.") sys.exit(0) retcode = verify_setup_allowed(options) @@ -1158,7 +1159,7 @@ def setup(options): if not is_root(): warn_msg = configDefaults.MESSAGE_WARN_SETUP_NOT_ROOT - print warn_msg + print(warn_msg) # proceed jdbc properties if they were set if _check_jdbc_options(options): @@ -1175,26 +1176,26 @@ def setup(options): err = 'Failed to create user. Exiting.' raise FatalException(retcode, err) - print configDefaults.MESSAGE_CHECK_FIREWALL + print(configDefaults.MESSAGE_CHECK_FIREWALL) check_firewall() - print 'Checking JDK...' + print('Checking JDK...') try: download_and_install_jdk(options) except FatalException as e: err = 'Downloading or installing JDK failed: {0}. Exiting.'.format(e) raise FatalException(e.code, err) - print 'Checking GPL software agreement...' + print('Checking GPL software agreement...') write_gpl_license_accepted(default_prompt_value=options.accept_gpl) - print 'Completing setup...' + print('Completing setup...') retcode = configure_os_settings() if not retcode == 0: err = 'Configure of OS settings in ambari.properties failed. Exiting.' raise FatalException(retcode, err) - print 'Configuring database...' + print('Configuring database...') prompt_db_properties(options) #DB setup should be done last after doing any setup. @@ -1204,7 +1205,7 @@ def setup(options): check_jdbc_drivers(options) if not options.skip_view_extraction: - print 'Extracting system views...' + print('Extracting system views...') retcode = extract_views(options) if not retcode == 0: err = 'Error while extracting system views. Exiting' @@ -1212,12 +1213,12 @@ def setup(options): json_url = get_json_url_from_repo_file() if json_url: - print "Ambari repo file contains latest json url {0}, updating stacks repoinfos with it...".format(json_url) + print("Ambari repo file contains latest json url {0}, updating stacks repoinfos with it...".format(json_url)) properties = get_ambari_properties() stack_root = get_stack_location(properties) update_latest_in_repoinfos_for_stacks(stack_root, json_url) else: - print "Ambari repo file doesn't contain latest json url, skipping repoinfos modification" + print("Ambari repo file doesn't contain latest json url, skipping repoinfos modification") # we've already done this, but new files were created so run it one time. adjust_directory_permissions(svc_user) @@ -1254,7 +1255,7 @@ def setup_jce_policy(args): zip_name = zip_path[1] properties.process_pair(JCE_NAME_PROPERTY, zip_name) - print 'Installing JCE policy...' + print('Installing JCE policy...') try: JDKSetup.unpack_jce_policy(jdk_path, resources_dir, zip_name) except FatalException as e: @@ -1263,8 +1264,8 @@ def setup_jce_policy(args): update_properties(properties) - print 'NOTE: Restart Ambari Server to apply changes' + \ - ' ("ambari-server restart|stop|start")' + print('NOTE: Restart Ambari Server to apply changes' + \ + ' ("ambari-server restart|stop|start")') def check_ambari_java_version_is_valid(java_home, java_bin, min_version, properties): """ @@ -1272,14 +1273,15 @@ def check_ambari_java_version_is_valid(java_home, java_bin, min_version, propert Returns true, if Ambari meets with the minimal JDK version requirement. """ result = True - print 'Check JDK version for Ambari Server...' + print('Check JDK version for Ambari Server...') try: command = JDK_VERSION_CHECK_CMD.format(os.path.join(java_home, 'bin', java_bin)) - process = subprocess32.Popen(command, - stdout=subprocess32.PIPE, - stdin=subprocess32.PIPE, - stderr=subprocess32.PIPE, - shell=True + process = subprocess.Popen(command, + stdout=subprocess.PIPE, + stdin=subprocess.PIPE, + stderr=subprocess.PIPE, + shell=True, + universal_newlines=True ) (out, err) = process.communicate() if process.returncode != 0: @@ -1287,13 +1289,13 @@ def check_ambari_java_version_is_valid(java_home, java_bin, min_version, propert raise FatalException(process.returncode, err) else: actual_jdk_version = int(out) - print 'JDK version found: {0}'.format(actual_jdk_version) + print('JDK version found: {0}'.format(actual_jdk_version)) if actual_jdk_version < min_version: - print 'Minimum JDK version is {0} for Ambari. Setup JDK again only for Ambari Server.'.format(min_version) + print('Minimum JDK version is {0} for Ambari. Setup JDK again only for Ambari Server.'.format(min_version)) properties.process_pair(STACK_JAVA_VERSION, out) result = False else: - print 'Minimum JDK version is {0} for Ambari. Skipping to setup different JDK for Ambari Server.'.format(min_version) + print('Minimum JDK version is {0} for Ambari. Skipping to setup different JDK for Ambari Server.'.format(min_version)) except FatalException as e: err = 'Running java version check command failed: {0}. Exiting.'.format(e) diff --git a/ambari-server/src/main/python/ambari_server/serverUpgrade.py b/ambari-server/src/main/python/ambari_server/serverUpgrade.py index 16c5ca81afe..d7f0ee1293e 100644 --- a/ambari-server/src/main/python/ambari_server/serverUpgrade.py +++ b/ambari-server/src/main/python/ambari_server/serverUpgrade.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -23,7 +23,7 @@ import sys import shutil import base64 -import urllib2 +import urllib.request, urllib.error, urllib.parse import re import glob import optparse @@ -167,13 +167,13 @@ def run_schema_upgrade(args): if stdout: print_info_msg("Console output from schema upgrade command:", True) print_info_msg(stdout, True) - print + print() if retcode > 0: print_error_msg("Error executing schema upgrade, please check the server logs.") if stderr: print_error_msg("Error output from schema upgrade command:") print_error_msg(stderr) - print + print() else: print_info_msg('Schema upgrade completed', True) return retcode @@ -199,7 +199,7 @@ def move_user_custom_actions(): try: resources_dir = properties[RESOURCES_DIR_PROPERTY] - except (KeyError), e: + except (KeyError) as e: conf_file = properties.fileName err = 'Property ' + str(e) + ' is not defined at ' + conf_file print_error_msg(err) @@ -318,12 +318,12 @@ def upgrade(args): json_url = get_json_url_from_repo_file() if json_url: - print "Ambari repo file contains latest json url {0}, updating stacks repoinfos with it...".format(json_url) + print("Ambari repo file contains latest json url {0}, updating stacks repoinfos with it...".format(json_url)) properties = get_ambari_properties() stack_root = get_stack_location(properties) update_latest_in_repoinfos_for_stacks(stack_root, json_url) else: - print "Ambari repo file doesn't contain latest json url, skipping repoinfos modification" + print("Ambari repo file doesn't contain latest json url, skipping repoinfos modification") def add_jdbc_properties(properties): @@ -371,8 +371,8 @@ def set_current(options): base_url = get_ambari_server_api_base(properties) url = base_url + "clusters/{0}/stack_versions".format(finalize_options.cluster_name) - admin_auth = base64.encodestring('%s:%s' % (admin_login, admin_password)).replace('\n', '') - request = urllib2.Request(url) + admin_auth = base64.encodebytes(('%s:%s' % (admin_login, admin_password)).encode()).decode().replace('\n', '') + request = urllib.request.Request(url) request.add_header('Authorization', 'Basic %s' % admin_auth) request.add_header('X-Requested-By', 'ambari') @@ -387,12 +387,12 @@ def set_current(options): if get_verbose(): sys.stdout.write('\nCalling API ' + url + ' : ' + str(data) + '\n') - request.add_data(json.dumps(data)) + request.data=json.dumps(data) request.get_method = lambda: 'PUT' try: - response = urllib2.urlopen(request, context=get_ssl_context(properties)) - except urllib2.HTTPError, e: + response = urllib.request.urlopen(request, context=get_ssl_context(properties)) + except urllib.error.HTTPError as e: code = e.getcode() content = e.read() err = 'Error during setting current version. Http status code - {0}. \n {1}'.format( @@ -419,7 +419,7 @@ def restore_custom_services(): try: resources_dir = properties[RESOURCES_DIR_PROPERTY] - except (KeyError), e: + except (KeyError) as e: conf_file = properties.fileName err = 'Property ' + str(e) + ' is not defined at ' + conf_file print_error_msg(err) diff --git a/ambari-server/src/main/python/ambari_server/serverUtils.py b/ambari-server/src/main/python/ambari_server/serverUtils.py index f37e515f263..bd3a603406c 100644 --- a/ambari-server/src/main/python/ambari_server/serverUtils.py +++ b/ambari-server/src/main/python/ambari_server/serverUtils.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -21,7 +21,7 @@ import os import socket import ssl -import urllib2 +import urllib.request, urllib.error, urllib.parse from contextlib import closing import time @@ -52,7 +52,7 @@ def is_server_runing(): if os.path.exists(pid_file_path): try: f = open(pid_file_path, "r") - except IOError, ex: + except IOError as ex: raise FatalException(1, str(ex)) pid = f.readline().strip() @@ -110,10 +110,10 @@ def refresh_stack_hash(properties): resource_files_keeper = ResourceFilesKeeper(resources_location, stacks_location) try: - print "Organizing resource files at {0}...".format(resources_location, - verbose=get_verbose()) + print("Organizing resource files at {0}...".format(resources_location, + verbose=get_verbose())) resource_files_keeper.perform_housekeeping() - except KeeperException, ex: + except KeeperException as ex: msg = "Can not organize resource files at {0}: {1}".format( resources_location, str(ex)) raise FatalException(-1, msg) @@ -193,15 +193,15 @@ def get_json_via_rest_api(properties, admin_login, admin_password, entry_point): :return: HTTP status, JSON data """ url = get_ambari_server_api_base(properties) + entry_point - admin_auth = base64.encodestring('%s:%s' % (admin_login, admin_password)).replace('\n', '') - request = urllib2.Request(url) + admin_auth = base64.encodebytes(('%s:%s' % (admin_login, admin_password)).encode()).decode().replace('\n', '') + request = urllib.request.Request(url) request.add_header('Authorization', 'Basic %s' % admin_auth) request.add_header('X-Requested-By', 'ambari') request.get_method = lambda: 'GET' print_info_msg("Fetching information from Ambari's REST API") - with closing(urllib2.urlopen(request, context=get_ssl_context(properties))) as response: + with closing(urllib.request.urlopen(request, context=get_ssl_context(properties))) as response: response_status_code = response.getcode() json_data = None print_info_msg( @@ -216,15 +216,15 @@ def get_json_via_rest_api(properties, admin_login, admin_password, entry_point): def perform_changes_via_rest_api(properties, admin_login, admin_password, url_postfix, get_method, request_data=None): url = get_ambari_server_api_base(properties) + url_postfix - admin_auth = base64.encodestring('%s:%s' % (admin_login, admin_password)).replace('\n', '') - request = urllib2.Request(url) + admin_auth = base64.encodebytes(('%s:%s' % (admin_login, admin_password)).encode()).decode().replace('\n', '') + request = urllib.request.Request(url) request.add_header('Authorization', 'Basic %s' % admin_auth) request.add_header('X-Requested-By', 'ambari') if request_data is not None: - request.add_data(json.dumps(request_data)) + request.data=json.dumps(request_data) request.get_method = lambda: get_method - with closing(urllib2.urlopen(request, context=get_ssl_context(properties))) as response: + with closing(urllib.request.urlopen(request, context=get_ssl_context(properties))) as response: response_status_code = response.getcode() if response_status_code not in (200, 201): err = 'Error while performing changes via Ambari REST API. Http status code - ' + str( @@ -305,7 +305,7 @@ def eligible(service_info, is_sso_integration): def get_eligible_services(properties, admin_login, admin_password, cluster_name, entry_point, service_qualifier): print_info_msg("Fetching %s enabled services" % service_qualifier) - safe_cluster_name = urllib2.quote(cluster_name) + safe_cluster_name = urllib.parse.quote(cluster_name) response_code, json_data = get_json_via_rest_api(properties, admin_login, admin_password, entry_point % safe_cluster_name) diff --git a/ambari-server/src/main/python/ambari_server/setupActions.py b/ambari-server/src/main/python/ambari_server/setupActions.py index e75c70a4299..4e1d09d13e6 100644 --- a/ambari-server/src/main/python/ambari_server/setupActions.py +++ b/ambari-server/src/main/python/ambari_server/setupActions.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one diff --git a/ambari-server/src/main/python/ambari_server/setupHttps.py b/ambari-server/src/main/python/ambari_server/setupHttps.py index 824fe045121..a63a61b6e8a 100644 --- a/ambari-server/src/main/python/ambari_server/setupHttps.py +++ b/ambari-server/src/main/python/ambari_server/setupHttps.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -26,7 +26,7 @@ import string import datetime import tempfile -import urllib2 +import urllib.request, urllib.error, urllib.parse from ambari_commons.exceptions import FatalException, NonFatalException from ambari_commons.logging_utils import get_silent, print_warning_msg, print_error_msg from ambari_commons.os_utils import is_root, run_os_command, copy_file, set_file_permissions, remove_file @@ -166,7 +166,7 @@ def import_cert_and_key(security_server_keys_dir, options): retcode = 0 err = '' if not pem_password: - print 'Generating random password for HTTPS keystore...done.' + print('Generating random password for HTTPS keystore...done.') pem_password = generate_random_string() retcode, out, err = run_os_command(CHANGE_KEY_PWD_CND.format( import_key_path, pem_password)) @@ -199,7 +199,7 @@ def import_cert_and_key(security_server_keys_dir, options): retcode, out, err = run_os_command(EXPRT_KSTR_CMD.format(import_cert_path, \ import_key_path, passwordFilePath, passinFilePath, keystoreFilePathTmp)) if retcode == 0: - print 'Importing and saving Certificate...done.' + print('Importing and saving Certificate...done.') import_file_to_keystore(keystoreFilePathTmp, keystoreFilePath) import_file_to_keystore(passFilePathTmp, passFilePath) @@ -216,16 +216,16 @@ def import_cert_and_key(security_server_keys_dir, options): remove_file(passwordFilePath) if not retcode == 0: - print 'Error during keystore validation occured!:' - print err + print('Error during keystore validation occured!:') + print(err) return False return True else: print_error_msg('Could not import Certificate and Private Key.') - print 'SSL error on exporting keystore: ' + err.rstrip() + \ + print('SSL error on exporting keystore: ' + err.rstrip() + \ '.\nPlease ensure that provided Private Key password is correct and ' + \ - 're-import Certificate.' + 're-import Certificate.') return False @@ -244,14 +244,14 @@ def get_cert_info(path): retcode, out, err = run_os_command(GET_CRT_INFO_CMD.format(path)) if retcode != 0: - print 'Error getting Certificate info' - print err + print('Error getting Certificate info') + print(err) return None if out: certInfolist = out.split(os.linesep) else: - print 'Empty Certificate info' + print('Empty Certificate info') return None notBefore = None @@ -274,7 +274,7 @@ def get_cert_info(path): subjList = pattern.findall(subject) keys = [item.split('=')[0] for item in subjList] values = [item.split('=')[1] for item in subjList] - subjDict = dict(zip(keys, values)) + subjDict = dict(list(zip(keys, values))) result = subjDict result['notBefore'] = notBefore @@ -287,13 +287,13 @@ def get_cert_info(path): def is_valid_cert_exp(certInfoDict): - if certInfoDict.has_key(NOT_BEFORE_ATTR): + if NOT_BEFORE_ATTR in certInfoDict: notBefore = certInfoDict[NOT_BEFORE_ATTR] else: print_warning_msg('There is no Not Before value in Certificate') return False - if certInfoDict.has_key(NOT_AFTER_ATTR): + if NOT_AFTER_ATTR in certInfoDict: notAfter = certInfoDict['notAfter'] else: print_warning_msg('There is no Not After value in Certificate') @@ -316,7 +316,7 @@ def is_valid_cert_exp(certInfoDict): def is_valid_cert_host(certInfoDict): - if certInfoDict.has_key(COMMON_NAME_ATTR): + if COMMON_NAME_ATTR in certInfoDict: commonName = certInfoDict[COMMON_NAME_ATTR] else: print_warning_msg('There is no Common Name in Certificate') @@ -338,12 +338,12 @@ def is_valid_cert_host(certInfoDict): def get_fqdn(timeout=2): properties = get_ambari_properties() if properties == -1: - print "Error reading ambari properties" + print("Error reading ambari properties") return None get_fqdn_service_url = properties[GET_FQDN_SERVICE_URL] try: - handle = urllib2.urlopen(get_fqdn_service_url, '', timeout) + handle = urllib.request.urlopen(get_fqdn_service_url, '', timeout) str = handle.read() handle.close() return str @@ -354,7 +354,7 @@ def get_fqdn(timeout=2): def is_valid_https_port(port): properties = get_ambari_properties() if properties == -1: - print "Error getting ambari properties" + print("Error getting ambari properties") return False one_way_port = properties[SRVR_ONE_WAY_SSL_PORT_PROPERTY] @@ -366,11 +366,11 @@ def is_valid_https_port(port): two_way_port = SRVR_TWO_WAY_SSL_PORT if port.strip() == one_way_port.strip(): - print "Port for https can't match the port for one way authentication port(" + one_way_port + ")" + print("Port for https can't match the port for one way authentication port(" + one_way_port + ")") return False if port.strip() == two_way_port.strip(): - print "Port for https can't match the port for two way authentication port(" + two_way_port + ")" + print("Port for https can't match the port for two way authentication port(" + two_way_port + ")") return False return True @@ -397,7 +397,7 @@ def setup_https(options): if not is_root(): warn = 'ambari-server setup-https is run as ' \ 'non-root user, some sudo privileges might be required' - print warn + print(warn) options.exit_message = None if not get_silent(): properties = get_ambari_properties() @@ -439,7 +439,7 @@ def setup_https(options): return False if cert_must_import and not cert_was_imported: - print 'Setup of HTTPS failed. Exiting.' + print('Setup of HTTPS failed. Exiting.') return False conf_file = find_properties_file() @@ -448,14 +448,14 @@ def setup_https(options): if api_ssl_old_value != properties.get_property(SSL_API) \ or client_api_ssl_port_old_value != properties.get_property(SSL_API_PORT): - print "Ambari server URL changed. To make use of the Tez View in Ambari " \ - "please update the property tez.tez-ui.history-url.base in tez-site" + print("Ambari server URL changed. To make use of the Tez View in Ambari " \ + "please update the property tez.tez-ui.history-url.base in tez-site") ambari_user = read_ambari_user() if ambari_user: adjust_directory_permissions(ambari_user) return True - except (KeyError), e: + except (KeyError) as e: err = 'Property ' + str(e) + ' is not defined' raise FatalException(1, err) else: @@ -515,4 +515,4 @@ def setup_truststore(options, import_cert=False): f = open(conf_file, 'w') properties.store(f, "Changed by 'ambari-server setup-security' command") else: - print "setup-security is not enabled in silent mode." + print("setup-security is not enabled in silent mode.") diff --git a/ambari-server/src/main/python/ambari_server/setupMpacks.py b/ambari-server/src/main/python/ambari_server/setupMpacks.py index ab25612b601..934aac589e7 100755 --- a/ambari-server/src/main/python/ambari_server/setupMpacks.py +++ b/ambari-server/src/main/python/ambari_server/setupMpacks.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -97,7 +97,7 @@ def repl_list(_list): return _list dict.__init__(self, _dict) - for key, value in self.iteritems(): + for key, value in self.items(): if isinstance(value, dict): self[key] = _named_dict(value) if isinstance(value, list): @@ -116,7 +116,7 @@ def _get_temp_dir(): return -1 tmpdir = get_server_temp_location(properties) if not os.path.exists(tmpdir): - sudo.makedirs(tmpdir, 0755) + sudo.makedirs(tmpdir, 0o755) return tmpdir def download_mpack(mpack_path): @@ -179,7 +179,9 @@ def read_mpack_metadata(mpack_dir): print_error_msg("Malformed management pack. Metadata file missing!") return None - mpack_metadata = _named_dict(json.load(open(mpack_metafile, "r"))) + with open(mpack_metafile,"r") as file: + mpack_metadata = _named_dict(json.load(file)) + return mpack_metadata def get_mpack_properties(): @@ -316,8 +318,6 @@ def validate_purge(options, purge_list, mpack_dir, mpack_metadata, replay_mode=F :param replay_mode: Flag to indicate if purging in replay mode """ # Get ambari mpacks config properties - stack_location, extension_location, service_definitions_location, mpacks_staging_location, dashboard_location = get_mpack_properties() - if not purge_list: return @@ -346,7 +346,7 @@ def validate_purge(options, purge_list, mpack_dir, mpack_metadata, replay_mode=F raise FatalException(1, stderr) if not replay_mode: - purge_resources = set((v) for k, v in RESOURCE_FRIENDLY_NAMES.iteritems() if k in purge_list) + purge_resources = set((v) for k, v in RESOURCE_FRIENDLY_NAMES.items() if k in purge_list) answer = 'yes' if options.silent else 'no' warn_msg = "CAUTION: You have specified the --purge option with --purge-list={0}. " \ "This will replace all existing {1} currently installed.\n" \ @@ -391,7 +391,7 @@ def purge_stacks_and_mpacks(purge_list, replay_mode=False): if MPACKS_RESOURCE_NAME in purge_list and not replay_mode and os.path.exists(mpacks_staging_location): print_info_msg("Purging mpacks staging location: " + mpacks_staging_location) sudo.rmtree(mpacks_staging_location) - sudo.makedir(mpacks_staging_location, 0755) + sudo.makedir(mpacks_staging_location, 0o755) def process_stack_definitions_artifact(artifact, artifact_source_dir, options): """ @@ -410,7 +410,7 @@ def process_stack_definitions_artifact(artifact, artifact_source_dir, options): src_stack_dir = os.path.join(artifact_source_dir, file) dest_stack_dir = os.path.join(stack_location, file) if not os.path.exists(dest_stack_dir): - sudo.makedir(dest_stack_dir, 0755) + sudo.makedir(dest_stack_dir, 0o755) for file in sorted(os.listdir(src_stack_dir)): if os.path.isfile(os.path.join(src_stack_dir, file)): create_symlink(src_stack_dir, dest_stack_dir, file, options.force) @@ -418,13 +418,13 @@ def process_stack_definitions_artifact(artifact, artifact_source_dir, options): src_stack_version_dir = os.path.join(src_stack_dir, file) dest_stack_version_dir = os.path.join(dest_stack_dir, file) if not os.path.exists(dest_stack_version_dir): - sudo.makedir(dest_stack_version_dir, 0755) + sudo.makedir(dest_stack_version_dir, 0o755) for file in sorted(os.listdir(src_stack_version_dir)): if file == SERVICES_DIRNAME: src_stack_services_dir = os.path.join(src_stack_version_dir, file) dest_stack_services_dir = os.path.join(dest_stack_version_dir, file) if not os.path.exists(dest_stack_services_dir): - sudo.makedir(dest_stack_services_dir, 0755) + sudo.makedir(dest_stack_services_dir, 0o755) for file in sorted(os.listdir(src_stack_services_dir)): create_symlink(src_stack_services_dir, dest_stack_services_dir, file, options.force) src_service_dir = os.path.join(src_stack_services_dir, file) @@ -481,7 +481,7 @@ def process_extension_definitions_artifact(artifact, artifact_source_dir, option # Get ambari mpack properties stack_location, extension_location, service_definitions_location, mpacks_staging_location, dashboard_location = get_mpack_properties() if not os.path.exists(extension_location): - sudo.makedir(extension_location, 0755) + sudo.makedir(extension_location, 0o755) for file in sorted(os.listdir(artifact_source_dir)): if os.path.isfile(os.path.join(artifact_source_dir, file)): # Example: /var/lib/ambari-server/resources/extensions/README.txt @@ -490,7 +490,7 @@ def process_extension_definitions_artifact(artifact, artifact_source_dir, option src_extension_dir = os.path.join(artifact_source_dir, file) dest_extension_dir = os.path.join(extension_location, file) if not os.path.exists(dest_extension_dir): - sudo.makedir(dest_extension_dir, 0755) + sudo.makedir(dest_extension_dir, 0o755) for file in sorted(os.listdir(src_extension_dir)): create_symlink(src_extension_dir, dest_extension_dir, file, options.force) src_extension_version_dir = os.path.join(src_extension_dir, file) @@ -514,7 +514,7 @@ def process_service_definitions_artifact(artifact, artifact_source_dir, options) src_service_definitions_dir = os.path.join(artifact_source_dir, file) dest_service_definitions_dir = os.path.join(service_definitions_location, file) if not os.path.exists(dest_service_definitions_dir): - sudo.makedir(dest_service_definitions_dir, 0755) + sudo.makedir(dest_service_definitions_dir, 0o755) for file in sorted(os.listdir(src_service_definitions_dir)): create_symlink(src_service_definitions_dir, dest_service_definitions_dir, file, options.force) src_service_version_dir = os.path.join(src_service_definitions_dir, file) @@ -552,7 +552,7 @@ def process_stack_addon_service_definitions_artifact(artifact, artifact_source_d dest_link = os.path.join(dest_stack_services_path, service_name) if os.path.exists(dest_stack_path) and os.path.exists(dest_stack_version_path): if not os.path.exists(dest_stack_services_path): - sudo.makedir(dest_stack_services_path, 0755) + sudo.makedir(dest_stack_services_path, 0o755) if options.force and os.path.islink(dest_link): sudo.unlink(dest_link) sudo.symlink(source_service_version_path, dest_link) @@ -731,29 +731,29 @@ def _install_mpack(options, replay_mode=False, is_upgrade=False): mpacks_cache_location = os.path.join(mpacks_staging_location, MPACKS_CACHE_DIRNAME) # Create directories if not os.path.exists(stack_location): - sudo.makedir(stack_location, 0755) + sudo.makedir(stack_location, 0o755) adjust_ownership_list.append((stack_location, "0755", "{0}", True)) change_ownership_list.append((stack_location,"{0}",True)) if not os.path.exists(extension_location): - sudo.makedir(extension_location, 0755) + sudo.makedir(extension_location, 0o755) adjust_ownership_list.append((extension_location, "0755", "{0}", True)) change_ownership_list.append((extension_location,"{0}",True)) if not os.path.exists(service_definitions_location): - sudo.makedir(service_definitions_location, 0755) + sudo.makedir(service_definitions_location, 0o755) adjust_ownership_list.append((service_definitions_location, "0755", "{0}", True)) change_ownership_list.append((service_definitions_location,"{0}",True)) if not os.path.exists(mpacks_staging_location): - sudo.makedir(mpacks_staging_location, 0755) + sudo.makedir(mpacks_staging_location, 0o755) adjust_ownership_list.append((mpacks_staging_location, "0755", "{0}", True)) change_ownership_list.append((mpacks_staging_location,"{0}",True)) if not os.path.exists(mpacks_cache_location): - sudo.makedir(mpacks_cache_location, 0755) + sudo.makedir(mpacks_cache_location, 0o755) adjust_ownership_list.append((mpacks_cache_location, "0755", "{0}", True)) change_ownership_list.append((mpacks_cache_location,"{0}",True)) if not os.path.exists(dashboard_location): - sudo.makedir(dashboard_location, 0755) - sudo.makedir(os.path.join(dashboard_location, GRAFANA_DASHBOARDS_DIRNAME), 0755) - sudo.makedir(os.path.join(dashboard_location, SERVICE_METRICS_DIRNAME), 0755) + sudo.makedir(dashboard_location, 0o755) + sudo.makedir(os.path.join(dashboard_location, GRAFANA_DASHBOARDS_DIRNAME), 0o755) + sudo.makedir(os.path.join(dashboard_location, SERVICE_METRICS_DIRNAME), 0o755) adjust_ownership_list.append((dashboard_location, "0755", "{0}", True)) change_ownership_list.append((dashboard_location,"{0}",True)) diff --git a/ambari-server/src/main/python/ambari_server/setupSecurity.py b/ambari-server/src/main/python/ambari_server/setupSecurity.py index 9bb04445c2e..514ac92d6e5 100644 --- a/ambari-server/src/main/python/ambari_server/setupSecurity.py +++ b/ambari-server/src/main/python/ambari_server/setupSecurity.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -30,7 +30,7 @@ import sys import tempfile import time -import urllib2 +import urllib.request, urllib.error, urllib.parse from ambari_commons.exceptions import FatalException, NonFatalException from ambari_commons.logging_utils import print_warning_msg, print_error_msg, print_info_msg, get_verbose from ambari_commons.os_check import OSConst @@ -60,7 +60,7 @@ from ambari_server.userInput import get_validated_string_input, get_prompt_default, read_password, get_YN_input, \ quit_if_has_answer from contextlib import closing -from urllib2 import HTTPError +from urllib.error import HTTPError logger = logging.getLogger(__name__) @@ -118,14 +118,14 @@ def read_master_key(isReset=False, options = None): True, True, answer = options.master_key) if not masterKey: - print "Master Key cannot be empty!" + print("Master Key cannot be empty!") continue masterKey2 = get_validated_string_input("Re-enter master key: ", passwordDefault, passwordPattern, passwordDescr, True, True, answer = options.master_key) if masterKey != masterKey2: - print "Master key did not match!" + print("Master key did not match!") continue input = False @@ -162,7 +162,7 @@ def adjust_directory_permissions(ambari_user): if not os.path.exists(bootstrap_dir): try: os.makedirs(bootstrap_dir) - except Exception, ex: + except Exception as ex: print_warning_msg("Failed recreating the bootstrap directory: {0}".format(str(ex))) pass else: @@ -211,7 +211,7 @@ def adjust_directory_permissions(ambari_user): configDefaults.NR_ADJUST_OWNERSHIP_LIST.append((ambari_repo_file, "644", ambari_repo_file_owner, False)) - print "Adjusting ambari-server permissions and ownership..." + print("Adjusting ambari-server permissions and ownership...") for pack in configDefaults.NR_ADJUST_OWNERSHIP_LIST: file = pack[0] @@ -306,8 +306,8 @@ def get_ldap_property_from_db(properties, admin_login, admin_password, property_ def get_ldap_properties_from_db(properties, admin_login, admin_password): ldap_properties = None url = get_ambari_server_api_base(properties) + SETUP_LDAP_CONFIG_URL - admin_auth = base64.encodestring('%s:%s' % (admin_login, admin_password)).replace('\n', '') - request = urllib2.Request(url) + admin_auth = base64.b64encode('{}:{}'.format(admin_login, admin_password).encode()).decode().replace('\n', '') + request = urllib.request.Request(url) request.add_header('Authorization', 'Basic %s' % admin_auth) request.add_header('X-Requested-By', 'ambari') request.get_method = lambda: 'GET' @@ -323,7 +323,7 @@ def get_ldap_properties_from_db(properties, admin_login, admin_password): sys.stdout.flush() try: - with closing(urllib2.urlopen(request, context=get_ssl_context(properties))) as response: + with closing(urllib.request.urlopen(request, context=get_ssl_context(properties))) as response: response_status_code = response.getcode() if response_status_code != 200: request_in_progress = False @@ -397,8 +397,8 @@ def sync_ldap(options): raise FatalException(1, err) url = get_ambari_server_api_base(properties) + SERVER_API_LDAP_URL - admin_auth = base64.encodestring('%s:%s' % (admin_login, admin_password)).replace('\n', '') - request = urllib2.Request(url) + admin_auth = base64.encodebytes(('%s:%s' % (admin_login, admin_password)).encode()).decode().replace('\n', '') + request = urllib.request.Request(url) request.add_header('Authorization', 'Basic %s' % admin_auth) request.add_header('X-Requested-By', 'ambari') @@ -429,11 +429,11 @@ def sync_ldap(options): if get_verbose(): sys.stdout.write('\nCalling API ' + url + ' : ' + str(bodies) + '\n') - request.add_data(json.dumps(bodies)) + request.data=json.dumps(bodies) request.get_method = lambda: 'POST' try: - response = urllib2.urlopen(request, context=get_ssl_context(properties)) + response = urllib.request.urlopen(request, context=get_ssl_context(properties)) except Exception as e: err = 'Sync event creation failed. Error details: %s' % e raise FatalException(1, err) @@ -445,11 +445,11 @@ def sync_ldap(options): response_body = json.loads(response.read()) url = response_body['resources'][0]['href'] - request = urllib2.Request(url) + request = urllib.request.Request(url) request.add_header('Authorization', 'Basic %s' % admin_auth) request.add_header('X-Requested-By', 'ambari') body = [{"LDAP":{"synced_groups":"*","synced_users":"*"}}] - request.add_data(json.dumps(body)) + request.data=json.dumps(body) request.get_method = lambda: 'GET' request_in_progress = True @@ -458,7 +458,7 @@ def sync_ldap(options): sys.stdout.flush() try: - response = urllib2.urlopen(request, context=get_ssl_context(properties)) + response = urllib.request.urlopen(request, context=get_ssl_context(properties)) except Exception as e: request_in_progress = False err = 'Sync event check failed. Error details: %s' % e @@ -474,12 +474,12 @@ def sync_ldap(options): if sync_info['status'] == 'ERROR': raise FatalException(1, str(sync_info['status_detail'])) elif sync_info['status'] == 'COMPLETE': - print '\n\nCompleted LDAP Sync.' - print 'Summary:' - for principal_type, summary in sync_info['summary'].iteritems(): - print ' {0}:'.format(principal_type) - for action, amount in summary.iteritems(): - print ' {0} = {1!s}'.format(action, amount) + print('\n\nCompleted LDAP Sync.') + print('Summary:') + for principal_type, summary in sync_info['summary'].items(): + print(' {0}:'.format(principal_type)) + for action, amount in summary.items(): + print(' {0} = {1!s}'.format(action, amount)) request_in_progress = False else: time.sleep(1) @@ -506,7 +506,7 @@ def setup_sensitive_data_encryption(options): if not is_root(): warn = 'ambari-server encrypt-passwords is run as ' \ 'non-root user, some sudo privileges might be required' - print warn + print(warn) properties = get_ambari_properties() if properties == -1: @@ -517,7 +517,7 @@ def setup_sensitive_data_encryption(options): db_password = properties.get_property(JDBC_PASSWORD_PROPERTY) # Encrypt passwords cannot be called before setup if db_sql_auth and not db_password: - print 'Please call "setup" before "encrypt-passwords". Exiting...' + print('Please call "setup" before "encrypt-passwords". Exiting...') return 1 # Check configuration for location of master key @@ -535,7 +535,7 @@ def setup_sensitive_data_encryption(options): masterKey = None if isSecure: - print "Password encryption is enabled." + print("Password encryption is enabled.") decrypt = get_YN_input("Do you want to decrypt passwords managed by Ambari? [y/n] (n): ", False) if not decrypt: resetKey = get_YN_input("Do you want to reset Master Key? [y/n] (n): ", False) @@ -545,7 +545,7 @@ def setup_sensitive_data_encryption(options): if isPersisted: sensitive_data_encryption(options, "decryption") else: - print "Master Key not persisted." + print("Master Key not persisted.") masterKey = get_original_master_key(properties, options) # Unable get the right master key or skipped question if not masterKey: @@ -567,7 +567,7 @@ def setup_sensitive_data_encryption(options): if not isPersisted: # For encrypting of only unencrypted passwords without resetting the key ask # for master key if not persisted. - print "Master Key not persisted." + print("Master Key not persisted.") masterKey = get_original_master_key(properties, options) encrypt_sensitive_data(db_password, masterKey, options, isPersisted, properties, ts_password) @@ -597,7 +597,7 @@ def encrypt_sensitive_data(db_password, masterKey, options, persist, properties, if db_password and not is_alias_string(db_password): retCode = save_passwd_for_alias(JDBC_RCA_PASSWORD_ALIAS, db_password, masterKey) if retCode != 0: - print 'Failed to save secure database password.' + print('Failed to save secure database password.') else: propertyMap[JDBC_PASSWORD_PROPERTY] = get_alias_string(JDBC_RCA_PASSWORD_ALIAS) remove_password_file(JDBC_PASSWORD_FILENAME) @@ -607,7 +607,7 @@ def encrypt_sensitive_data(db_password, masterKey, options, persist, properties, if ts_password and not is_alias_string(ts_password): retCode = save_passwd_for_alias(SSL_TRUSTSTORE_PASSWORD_ALIAS, ts_password, masterKey) if retCode != 0: - print 'Failed to save secure TrustStore password.' + print('Failed to save secure TrustStore password.') else: propertyMap[SSL_TRUSTSTORE_PASSWORD_PROPERTY] = get_alias_string(SSL_TRUSTSTORE_PASSWORD_ALIAS) @@ -635,8 +635,8 @@ def setup_master_key(masterKeyFile, options, properties, resetKey): os.remove(masterKeyFile) print_info_msg("Deleting master key file at location: " + str( masterKeyFile)) - except Exception, e: - print 'ERROR: Could not remove master key file. %s' % e + except Exception as e: + print('ERROR: Could not remove master key file. %s' % e) # Blow up the credential store made with previous key, if any store_file = get_credential_store_location(properties) if os.path.exists(store_file): @@ -656,24 +656,24 @@ def deryptPasswordsConfigs(db_password, db_sql_auth, masterKey, ts_password): def printManualDecryptionWarning(db_password, db_sql_auth, ts_password): - print "To disable encryption, do the following:" - print "- Edit " + os.path.join(get_conf_dir(), AMBARI_PROPERTIES_FILE) + \ + print("To disable encryption, do the following:") + print("- Edit " + os.path.join(get_conf_dir(), AMBARI_PROPERTIES_FILE) + \ " and set " + SECURITY_IS_ENCRYPTION_ENABLED + " = " + "false." + \ " and set " + SECURITY_SENSITIVE_DATA_ENCRYPTON_ENABLED + " = " + "false." + \ - " and set all passwords and sensitive data in service configs to right value." + " and set all passwords and sensitive data in service configs to right value.") err = "{0} is already encrypted. Please call {1} to store unencrypted" \ " password and call 'encrypt-passwords' again." if db_sql_auth and db_password and is_alias_string(db_password): - print err.format('- Database password', "'" + SETUP_ACTION + "'") + print(err.format('- Database password', "'" + SETUP_ACTION + "'")) if ts_password and is_alias_string(ts_password): - print err.format('TrustStore password', "'" + LDAP_SETUP_ACTION + "'") + print(err.format('TrustStore password', "'" + LDAP_SETUP_ACTION + "'")) def setup_ambari_krb5_jaas(options): jaas_conf_file = search_file(SECURITY_KERBEROS_JASS_FILENAME, get_conf_dir()) if os.path.exists(jaas_conf_file): - print 'Setting up Ambari kerberos JAAS configuration to access ' + \ - 'secured Hadoop daemons...' + print('Setting up Ambari kerberos JAAS configuration to access ' + \ + 'secured Hadoop daemons...') principal = get_validated_string_input('Enter ambari server\'s kerberos ' 'principal name (ambari@EXAMPLE.COM): ', 'ambari@EXAMPLE.COM', '.*', '', False, False, answer = options.jaas_principal) @@ -685,7 +685,7 @@ def setup_ambari_krb5_jaas(options): for line in fileinput.FileInput(jaas_conf_file, inplace=1): line = re.sub('keyTab=.*$', 'keyTab="' + keytab + '"', line) line = re.sub('principal=.*$', 'principal="' + principal + '"', line) - print line, + print(line, end=' ') write_property(CHECK_AMBARI_KRB_JAAS_CONFIGURATION_PROPERTY, "true") else: @@ -930,7 +930,7 @@ def setup_ldap(options): if os.path.exists(ts_path): break else: - print 'File not found.' + print('File not found.') hasAnswer = options.trust_store_path is not None and options.trust_store_path quit_if_has_answer(hasAnswer) @@ -941,10 +941,10 @@ def setup_ldap(options): ldap_property_values_in_ambari_properties[SSL_TRUSTSTORE_PASSWORD_PROPERTY] = ts_password pass elif properties.get_property(SSL_TRUSTSTORE_TYPE_PROPERTY): - print 'The TrustStore is already configured: ' - print ' ' + SSL_TRUSTSTORE_TYPE_PROPERTY + ' = ' + properties.get_property(SSL_TRUSTSTORE_TYPE_PROPERTY) - print ' ' + SSL_TRUSTSTORE_PATH_PROPERTY + ' = ' + properties.get_property(SSL_TRUSTSTORE_PATH_PROPERTY) - print ' ' + SSL_TRUSTSTORE_PASSWORD_PROPERTY + ' = ' + properties.get_property(SSL_TRUSTSTORE_PASSWORD_PROPERTY) + print('The TrustStore is already configured: ') + print(' ' + SSL_TRUSTSTORE_TYPE_PROPERTY + ' = ' + properties.get_property(SSL_TRUSTSTORE_TYPE_PROPERTY)) + print(' ' + SSL_TRUSTSTORE_PATH_PROPERTY + ' = ' + properties.get_property(SSL_TRUSTSTORE_PATH_PROPERTY)) + print(' ' + SSL_TRUSTSTORE_PASSWORD_PROPERTY + ' = ' + properties.get_property(SSL_TRUSTSTORE_PASSWORD_PROPERTY)) if get_YN_input("Do you want to remove these properties [y/n] (y)? ", True, options.trust_store_reconfigure): properties.removeOldProp(SSL_TRUSTSTORE_TYPE_PROPERTY) properties.removeOldProp(SSL_TRUSTSTORE_PATH_PROPERTY) @@ -955,22 +955,22 @@ def setup_ldap(options): populate_ambari_requires_ldap(options, ldap_property_value_map) populate_service_management(options, ldap_property_value_map, properties, admin_login, admin_password) - print '=' * 20 - print 'Review Settings' - print '=' * 20 + print('=' * 20) + print('Review Settings') + print('=' * 20) for property in ldap_property_list_reqd: - if ldap_property_value_map.has_key(property.prop_name): + if property.prop_name in ldap_property_value_map: print("%s %s" % (property.get_prompt_text(ldap_type), ldap_property_value_map[property.prop_name])) for property in ldap_property_list_opt: - if ldap_property_value_map.has_key(property): + if property in ldap_property_value_map: if property not in ldap_property_list_passwords: print("%s: %s" % (property, ldap_property_value_map[property])) else: print("%s: %s" % (property, BLIND_PASSWORD)) for property in ldap_property_list_opt: - if ldap_property_values_in_ambari_properties.has_key(property): + if property in ldap_property_values_in_ambari_properties: if property not in ldap_property_list_passwords: print("%s: %s" % (property, ldap_property_values_in_ambari_properties[property])) else: @@ -985,7 +985,7 @@ def setup_ldap(options): if ts_password != encrypted_passwd: ldap_property_values_in_ambari_properties[SSL_TRUSTSTORE_PASSWORD_PROPERTY] = encrypted_passwd - print 'Saving LDAP properties...' + print('Saving LDAP properties...') #Saving LDAP configuration in Ambari DB using the REST API update_ldap_configuration(admin_login, admin_password, properties, ldap_property_value_map) @@ -994,7 +994,7 @@ def setup_ldap(options): ldap_property_values_in_ambari_properties[CLIENT_SECURITY] = 'ldap' update_properties_2(properties, ldap_property_values_in_ambari_properties) - print 'Saving LDAP properties finished' + print('Saving LDAP properties finished') return 0 @@ -1119,7 +1119,7 @@ def setup_pam(options): "Please create it before restarting Ambari.".format(pam_config_file)) update_properties_2(properties, pam_property_value_map) - print 'Saving...done' + print('Saving...done') return 0 # @@ -1153,7 +1153,7 @@ def migrate_ldap_pam(args): ensure_jdbc_driver_is_installed(args, properties) - print 'Migrating LDAP Users & Groups to PAM' + print('Migrating LDAP Users & Groups to PAM') serverClassPath = ServerClassPath(properties, args) class_path = serverClassPath.get_full_ambari_classpath_escaped_for_shell() @@ -1167,13 +1167,13 @@ def migrate_ldap_pam(args): (retcode, stdout, stderr) = run_os_command(command, env=environ) print_info_msg("Return code from LDAP to PAM migration command, retcode = " + str(retcode)) if stdout: - print "Console output from LDAP to PAM migration command:" - print stdout - print + print("Console output from LDAP to PAM migration command:") + print(stdout) + print() if stderr: - print "Error output from LDAP to PAM migration command:" - print stderr - print + print("Error output from LDAP to PAM migration command:") + print(stderr) + print() if retcode > 0: print_error_msg("Error executing LDAP to PAM migration, please check the server logs.") else: @@ -1226,7 +1226,7 @@ def populate_service_management(options, properties, ambari_properties, admin_lo services = ','.join(service_list) else: - print (" There are no eligible services installed.") + print(" There are no eligible services installed.") else: if options.ldap_manage_services: manage_services = 'true' == options.ldap_manage_services diff --git a/ambari-server/src/main/python/ambari_server/setupSso.py b/ambari-server/src/main/python/ambari_server/setupSso.py index d65f5796ea4..95153b692dd 100644 --- a/ambari-server/src/main/python/ambari_server/setupSso.py +++ b/ambari-server/src/main/python/ambari_server/setupSso.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -18,7 +18,7 @@ limitations under the License. ''' import re -import urllib2 +import urllib.request, urllib.error, urllib.parse import sys from ambari_commons.exceptions import FatalException, NonFatalException @@ -172,7 +172,7 @@ def populate_service_management(options, properties, ambari_properties, admin_lo services = ','.join(service_list) else: - print (" There are no eligible services installed.") + print(" There are no eligible services installed.") services = "" else: services = "" @@ -195,7 +195,7 @@ def get_sso_properties(properties, admin_login, admin_password): try: response_code, json_data = get_json_via_rest_api(properties, admin_login, admin_password, SSO_CONFIG_API_ENTRYPOINT) - except urllib2.HTTPError as http_error: + except urllib.error.HTTPError as http_error: if http_error.code == 404: # This means that there is no SSO configuration in the database yet -> we can not fetch the # property (but this is NOT an error) diff --git a/ambari-server/src/main/python/ambari_server/setupTrustedProxy.py b/ambari-server/src/main/python/ambari_server/setupTrustedProxy.py index 11f1e7a47f8..d9fc268e7fa 100644 --- a/ambari-server/src/main/python/ambari_server/setupTrustedProxy.py +++ b/ambari-server/src/main/python/ambari_server/setupTrustedProxy.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -19,10 +19,10 @@ ''' import ambari_simplejson as json -import httplib +import http.client import os import re -import urllib2 +import urllib.request, urllib.error, urllib.parse from ambari_commons.exceptions import FatalException, NonFatalException from ambari_commons.logging_utils import get_silent, print_info_msg @@ -49,8 +49,8 @@ def get_trusted_proxy_properties(ambari_properties, admin_login, admin_password) try: response_code, json_data = get_json_via_rest_api(ambari_properties, admin_login, admin_password, TPROXY_CONFIG_API_ENTRYPOINT) - except urllib2.HTTPError as http_error: - if http_error.code == httplib.NOT_FOUND: + except urllib.error.HTTPError as http_error: + if http_error.code == http.client.NOT_FOUND: # This means that there is no Trusted Proxy configuration in the database yet -> we can not fetch the properties; but this is NOT an error json_data = None else: diff --git a/ambari-server/src/main/python/ambari_server/userInput.py b/ambari-server/src/main/python/ambari_server/userInput.py index a00709e6f4e..69182bf962e 100644 --- a/ambari-server/src/main/python/ambari_server/userInput.py +++ b/ambari-server/src/main/python/ambari_server/userInput.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -48,21 +48,21 @@ def get_choice_string_input(prompt, default, firstChoice, secondChoice, answer = if hasAnswer: print(prompt) - input = True + inputBool = True result = default - while input: - choice = str(answer) if hasAnswer else raw_input(prompt).lower() + while inputBool: + choice = str(answer) if hasAnswer else input(prompt).lower() if choice in firstChoice: result = True - input = False + inputBool = False elif choice in secondChoice: result = False - input = False + inputBool = False elif choice is "": # Just enter pressed result = default - input = False + inputBool = False else: - print "input not recognized, please try again: " + print("inputBool not recognized, please try again: ") quit_if_has_answer(hasAnswer) return result @@ -70,66 +70,66 @@ def get_choice_string_input(prompt, default, firstChoice, secondChoice, answer = def get_validated_string_input(prompt, default, pattern, description, is_pass, allowEmpty=True, validatorFunction=None, answer = None): - input = "" - hasAnswer = answer is not None and (answer or allowEmpty) + inputBool = "" + hasAnswer = answer != None and (answer or allowEmpty) if hasAnswer: - print (prompt) + print(prompt) - while not input: + while not inputBool: if get_silent(): - print (prompt) - input = default + print(prompt) + inputBool = default elif is_pass: - input = str(answer) if hasAnswer else get_password(prompt) + inputBool = str(answer) if hasAnswer else get_password(prompt) else: - input = str(answer) if hasAnswer else raw_input(prompt) - if not input.strip(): + inputBool = str(answer) if hasAnswer else input(prompt) + if not inputBool.strip(): # Empty input - if default available use default if not allowEmpty and not default: - msg = 'Property' if description is None or description is "" else description + msg = 'Property' if description == None or description == "" else description msg += ' cannot be blank.' - print msg - input = "" + print(msg) + inputBool = "" quit_if_has_answer(hasAnswer) continue else: - input = default + inputBool = default if validatorFunction: - if not validatorFunction(input): - input = "" + if not validatorFunction(inputBool): + inputBool = "" quit_if_has_answer(hasAnswer) continue break # done here and picking up default else: - if not pattern == None and not re.search(pattern, input.strip()): - print description - input = "" + if not pattern == None and not re.search(pattern, inputBool.strip()): + print(description) + inputBool = "" quit_if_has_answer(hasAnswer) if validatorFunction: - if not validatorFunction(input): - input = "" + if not validatorFunction(inputBool): + inputBool = "" quit_if_has_answer(hasAnswer) continue - return input + return inputBool def get_validated_filepath_input(prompt, description, default = None, answer = None): - input = False + inputBool = False hasAnswer = answer is not None and answer - while not input: + while not inputBool: if get_silent(): - print (prompt) + print(prompt) return default else: - input = str(answer) if hasAnswer else raw_input(prompt) - if not input == None: - input = input.strip() - if not input == None and not "" == input and os.path.isfile(input): - return input + inputBool = str(answer) if hasAnswer else input(prompt) + if not inputBool == None: + inputBool = inputBool.strip() + if not inputBool == None and not "" == inputBool and os.path.isfile(inputBool): + return inputBool else: - print description + print(description) quit_if_has_answer(hasAnswer) - input = False + inputBool = False def get_multi_line_input(prompt, end_line=""): @@ -139,10 +139,10 @@ def get_multi_line_input(prompt, end_line=""): else: full_prompt += " (empty line to finish input):".format(end_line) - print full_prompt + print(full_prompt) user_input = None while True: - line = raw_input() + line = input() if line == end_line: # no strip() here for purpose return user_input else: @@ -163,8 +163,8 @@ def read_password(password_default, answer=None, confirm_password_prompt="Re-enter password: "): - input = True - while(input): + inputBool = True + while(inputBool): # setup password if password_prompt is None: password_prompt = 'Password (' + password_default + '): ' @@ -176,22 +176,22 @@ def read_password(password_default, password = get_validated_string_input(password_prompt, password_default, password_pattern, password_descr, True, answer = answer) if not password: - print 'Password cannot be blank.' + print('Password cannot be blank.') continue if password != password_default: password1 = get_validated_string_input(confirm_password_prompt, password_default, password_pattern, password_descr, True, answer = answer) if password != password1: - print "Passwords do not match" + print("Passwords do not match") continue - input = False + inputBool = False return password # quits from the application only if the input is provided with a flag ('--customInput=') def quit_if_has_answer(hasAnswer): if hasAnswer: - print "Validation has failed for the last input. Operation has interrupted." + print("Validation has failed for the last input. Operation has interrupted.") exit(1) \ No newline at end of file diff --git a/ambari-server/src/main/python/ambari_server/utils.py b/ambari-server/src/main/python/ambari_server/utils.py index a16d5826336..4b585f966ad 100644 --- a/ambari-server/src/main/python/ambari_server/utils.py +++ b/ambari-server/src/main/python/ambari_server/utils.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -24,8 +24,9 @@ import sys import time import glob -from ambari_commons import subprocess32 +import subprocess import logging +import distro import platform import xml.etree.ElementTree as ET @@ -172,7 +173,7 @@ def wait_for_ui_start(ambari_server_ui_port, pid, timeout=1): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.settimeout(1) sock.connect(('localhost', ambari_server_ui_port)) - print "\nServer started listening on " + str(ambari_server_ui_port) + print("\nServer started listening on " + str(ambari_server_ui_port)) return True except Exception as e: #print str(e) @@ -215,7 +216,7 @@ def looking_for_pid(pattern, wait_time=1): found_pids = [] # clear list for pid in pids: try: - arg = open(os.path.join(PROC_DIR, pid, PROC_CMDLINE), 'rb').read() + arg = open(os.path.join(PROC_DIR, pid, PROC_CMDLINE), 'rt').read() if pattern in arg: found_pids += [{ "pid": pid, @@ -272,11 +273,12 @@ def get_postgre_hba_dir(OS_FAMILY): pg_hba_init_basename = os.path.basename(get_pg_hba_init_files()) # Get postgres_data location (default: /var/lib/pgsql/data) cmd = "alias basename='echo {0}; true' ; alias exit=return; source {1} status &>/dev/null; echo $PGDATA".format(pg_hba_init_basename, get_pg_hba_init_files()) - p = subprocess32.Popen(cmd, - stdout=subprocess32.PIPE, - stdin=subprocess32.PIPE, - stderr=subprocess32.PIPE, - shell=True) + p = subprocess.Popen(cmd, + stdout=subprocess.PIPE, + stdin=subprocess.PIPE, + stderr=subprocess.PIPE, + shell=True, + universal_newlines=True) (PG_HBA_ROOT, err) = p.communicate() if PG_HBA_ROOT and len(PG_HBA_ROOT.strip()) > 0: @@ -320,6 +322,8 @@ def normalize(v): if pos > 0: v = v[0:pos] return [int(x) for x in re.sub(r'(\.0+)*$', '', v).split(".")] + def cmp(a, b): + return (a > b) - (a < b) return cmp(normalize(version1), normalize(version2)) pass diff --git a/ambari-server/src/main/python/ambari_server_main.py b/ambari-server/src/main/python/ambari_server_main.py index 5499f3abd55..ffd898b2ca5 100644 --- a/ambari-server/src/main/python/ambari_server_main.py +++ b/ambari-server/src/main/python/ambari_server_main.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -18,7 +18,7 @@ limitations under the License. ''' import os -from ambari_commons import subprocess32 +import subprocess import sys import logging import time @@ -133,8 +133,8 @@ def ensure_server_security_is_configured(): @OsFamilyFuncImpl(OsFamilyImpl.DEFAULT) def ensure_server_security_is_configured(): if not is_root(): - print "Unable to check firewall status when starting without root privileges." - print "Please do not forget to disable or adjust firewall if needed" + print("Unable to check firewall status when starting without root privileges.") + print("Please do not forget to disable or adjust firewall if needed") def get_ulimit_open_files(properties): @@ -181,8 +181,8 @@ def generate_child_process_param_list(ambari_user, java_exe, class_path, param_list = [locate_file('sh', '/bin'), "-c"] if is_root() and ambari_user != "root": # To inherit exported environment variables (especially AMBARI_PASSPHRASE), - # from subprocess32, we have to skip --login option of su command. That's why - # we change dir to / (otherwise subprocess32 can face with 'permission denied' + # from subprocess, we have to skip --login option of su command. That's why + # we change dir to / (otherwise subprocess can face with 'permission denied' # errors while trying to list current directory cmd = "{ulimit_cmd} ; {su} {ambari_user} -s {sh_shell} -c '. {ambari_env_file} && {command}'".format(ulimit_cmd=ulimit_cmd, su=locate_file('su', '/bin'), ambari_user=ambari_user, @@ -248,18 +248,18 @@ def wait_for_server_start(pidFile, scmStatus): if os.path.isfile(configDefaults.SERVER_OUT_FILE): if 'DB_CHECK_ERROR' in open(configDefaults.SERVER_OUT_FILE).read(): - print "\nDB configs consistency check failed. Run \"ambari-server start --skip-database-check\" to skip. " \ + print("\nDB configs consistency check failed. Run \"ambari-server start --skip-database-check\" to skip. " \ "You may try --auto-fix-database flag to attempt to fix issues automatically. " \ "If you use this \"--skip-database-check\" option, do not make any changes to your cluster topology " \ "or perform a cluster upgrade until you correct the database consistency issues. See " + \ - configDefaults.DB_CHECK_LOG + " for more details on the consistency issues." + configDefaults.DB_CHECK_LOG + " for more details on the consistency issues.") elif 'DB_CHECK_WARNING' in open(configDefaults.SERVER_OUT_FILE).read(): - print "\nDB configs consistency check found warnings. See " + configDefaults.DB_CHECK_LOG + " for more details." + print("\nDB configs consistency check found warnings. See " + configDefaults.DB_CHECK_LOG + " for more details.") # Only presume that DB check was successful if it explicitly appears in the log. An unexpected error may prevent # the consistency check from running at all, so missing error/warning message in the log cannot imply the check was # successful elif 'DB_CHECK_SUCCESS' in open(configDefaults.SERVER_OUT_FILE).read(): - print "\nDB configs consistency check: no errors and warnings were found." + print("\nDB configs consistency check: no errors and warnings were found.") else: sys.stdout.write(configDefaults.SERVER_OUT_FILE + " does not exist") @@ -322,7 +322,7 @@ def server_process_main(options, scmStatus=None): # Preparations if is_root(): - print configDefaults.MESSAGE_SERVER_RUNNING_AS_ROOT + print(configDefaults.MESSAGE_SERVER_RUNNING_AS_ROOT) ensure_jdbc_driver_is_installed(options, properties) @@ -356,12 +356,12 @@ def server_process_main(options, scmStatus=None): if options.skip_database_check: global jvm_args jvm_args += " -DskipDatabaseConsistencyCheck" - print "Ambari Server is starting with the database consistency check skipped. Do not make any changes to your cluster " \ + print("Ambari Server is starting with the database consistency check skipped. Do not make any changes to your cluster " \ "topology or perform a cluster upgrade until you correct the database consistency issues. See \"" \ - + configDefaults.DB_CHECK_LOG + "\" for more details on the consistency issues." + + configDefaults.DB_CHECK_LOG + "\" for more details on the consistency issues.") properties.process_pair(CHECK_DATABASE_SKIPPED_PROPERTY, "true") else: - print "Ambari database consistency check started..." + print("Ambari database consistency check started...") if options.fix_database_consistency: jvm_args += " -DfixDatabaseConsistency" properties.process_pair(CHECK_DATABASE_SKIPPED_PROPERTY, "false") @@ -379,12 +379,12 @@ def make_process_independent(): if processId > 0: try: os.setpgid(processId, processId) - except OSError, e: + except OSError as e: print_warning_msg('setpgid({0}, {0}) failed - {1}'.format(pidJava, str(e))) pass print_info_msg("Running server: " + str(param_list)) - procJava = subprocess32.Popen(param_list, env=environ, preexec_fn=make_process_independent) + procJava = subprocess.Popen(param_list, env=environ, preexec_fn=make_process_independent) pidJava = procJava.pid if pidJava <= 0: @@ -400,9 +400,9 @@ def make_process_independent(): else: pidfile = os.path.join(configDefaults.PID_DIR, PID_NAME) - print "Server PID at: "+pidfile - print "Server out at: "+configDefaults.SERVER_OUT_FILE - print "Server log at: "+configDefaults.SERVER_LOG_FILE + print("Server PID at: "+pidfile) + print("Server out at: "+configDefaults.SERVER_OUT_FILE) + print("Server log at: "+configDefaults.SERVER_LOG_FILE) wait_for_server_start(pidfile, scmStatus) diff --git a/ambari-server/src/main/python/ambari_windows_service.py b/ambari-server/src/main/python/ambari_windows_service.py index d171204e630..d6d1c322d66 100644 --- a/ambari-server/src/main/python/ambari_windows_service.py +++ b/ambari-server/src/main/python/ambari_windows_service.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one diff --git a/ambari-server/src/main/python/azuredb_create_generator.py b/ambari-server/src/main/python/azuredb_create_generator.py index 373519c9493..4dc2be009fb 100755 --- a/ambari-server/src/main/python/azuredb_create_generator.py +++ b/ambari-server/src/main/python/azuredb_create_generator.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -21,7 +21,7 @@ # This script transforms SQLServer "create" SQL to idempotent SQL for AzureDB. # It is a filter, ie. it expects input on stdin, and prints output on stdout. -from __future__ import print_function + import fileinput import re from textwrap import dedent diff --git a/ambari-server/src/main/python/bootstrap.py b/ambari-server/src/main/python/bootstrap.py index 17d8e2053a6..9136f7ce253 100755 --- a/ambari-server/src/main/python/bootstrap.py +++ b/ambari-server/src/main/python/bootstrap.py @@ -19,7 +19,7 @@ ''' import sys -sys.path.append("/usr/lib/ambari-server/lib/") # this file can be run with python2.7 that why we need this +sys.path.append("/usr/lib/ambari-server/lib/") # this file can be run with python3 that why we need this # On Linux, the bootstrap process is supposed to run on hosts that may have installed Python 2.4 and above (CentOS 5). # Hence, the whole bootstrap code needs to comply with Python 2.4 instead of Python 2.6. Most notably, @-decorators and @@ -29,7 +29,7 @@ import logging import pprint import os -from ambari_commons import subprocess32 +import subprocess import threading import traceback import re @@ -104,11 +104,11 @@ def run(self): self.host_log.write("Running scp command " + ' '.join(scpcommand)) self.host_log.write("==========================") self.host_log.write("\nCommand start time " + datetime.now().strftime('%Y-%m-%d %H:%M:%S')) - scpstat = subprocess32.Popen(scpcommand, stdout=subprocess32.PIPE, - stderr=subprocess32.PIPE) + scpstat = subprocess.Popen(scpcommand, stdout=subprocess.PIPE, + stderr=subprocess.PIPE, universal_newlines=True) log = scpstat.communicate() errorMsg = log[1] - log = log[0] + "\n" + log[1] + log = log[0] + "\n" + errorMsg self.host_log.write(log) self.host_log.write("scp " + self.inputFile) self.host_log.write("host=" + self.host + ", exitcode=" + str(scpstat.returncode) ) @@ -142,8 +142,8 @@ def run(self): self.host_log.write("Running ssh command " + ' '.join(sshcommand)) self.host_log.write("==========================") self.host_log.write("\nCommand start time " + datetime.now().strftime('%Y-%m-%d %H:%M:%S')) - sshstat = subprocess32.Popen(sshcommand, stdout=subprocess32.PIPE, - stderr=subprocess32.PIPE) + sshstat = subprocess.Popen(sshcommand, stdout=subprocess.PIPE, + stderr=subprocess.PIPE, universal_newlines=True) log = sshstat.communicate() errorMsg = log[1] if self.errorMessage and sshstat.returncode != 0: @@ -411,7 +411,7 @@ class BootstrapDefault(Bootstrap): def getRemoteName(self, filename): full_name = os.path.join(self.TEMP_FOLDER, filename) remote_files = self.shared_state.remote_files - if not remote_files.has_key(full_name): + if full_name not in remote_files: remote_files[full_name] = self.generateRandomFileName(full_name) return remote_files[full_name] @@ -891,10 +891,10 @@ def main(argv=None): if not OSCheck.is_windows_family(): # ssh doesn't like open files - subprocess32.Popen(["chmod", "600", sshkey_file], stdout=subprocess32.PIPE) + subprocess.Popen(["chmod", "600", sshkey_file], stdout=subprocess.PIPE) if passwordFile is not None and passwordFile != 'null': - subprocess32.Popen(["chmod", "600", passwordFile], stdout=subprocess32.PIPE) + subprocess.Popen(["chmod", "600", passwordFile], stdout=subprocess.PIPE) logging.info("BootStrapping hosts " + pprint.pformat(hostList) + " using " + scriptDir + " cluster primary OS: " + cluster_os_type + diff --git a/ambari-server/src/main/python/os_check_type.py b/ambari-server/src/main/python/os_check_type.py index 34de34b1780..1e74687b018 100644 --- a/ambari-server/src/main/python/os_check_type.py +++ b/ambari-server/src/main/python/os_check_type.py @@ -24,7 +24,7 @@ def main(argv=None): # Same logic that was in "os_type_check.sh" if len(sys.argv) != 2: - print "Usage: " + print("Usage: ") raise Exception("Error in number of arguments. Usage: ") pass @@ -32,8 +32,8 @@ def main(argv=None): current_os = OSCheck.get_os_family() + OSCheck.get_os_major_version() # If agent/server have the same {"family","main_version"} - then ok. - print "Cluster primary/cluster OS family is %s and local/current OS family is %s" % ( - cluster_os, current_os) + print("Cluster primary/cluster OS family is %s and local/current OS family is %s" % ( + cluster_os, current_os)) if current_os == cluster_os: sys.exit(0) else: diff --git a/ambari-server/src/main/python/setupAgent.py b/ambari-server/src/main/python/setupAgent.py index 870999c4f63..3ee26050eb5 100755 --- a/ambari-server/src/main/python/setupAgent.py +++ b/ambari-server/src/main/python/setupAgent.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -23,14 +23,14 @@ import sys import logging import os -from ambari_commons import subprocess32 +import subprocess from ambari_commons import OSCheck, OSConst from ambari_commons.os_family_impl import OsFamilyFuncImpl, OsFamilyImpl from ambari_commons.os_utils import get_ambari_repo_file_full_name if OSCheck.is_windows_family(): - import urllib2 + import urllib.request, urllib.error, urllib.parse from ambari_commons.exceptions import FatalException from ambari_commons.os_utils import run_os_command @@ -109,7 +109,7 @@ def execOsCommand(osCommand, tries=1, try_sleep=0, ret=None, cwd=None): if i>0: time.sleep(try_sleep) - osStat = subprocess32.Popen(osCommand, stdout=subprocess32.PIPE, cwd=cwd) + osStat = subprocess.Popen(osCommand, stdout=subprocess.PIPE, cwd=cwd, universal_newlines=True) log = osStat.communicate(0) ret = {"exitstatus": osStat.returncode, "log": log} @@ -169,7 +169,7 @@ def runAgent(passPhrase, expected_hostname, user_run_as, verbose, ret=None): vo = " -v" cmd = ['su', user_run_as, '-l', '-c', '/usr/sbin/ambari-agent restart --expected-hostname=%1s %2s' % (expected_hostname, vo)] log = "" - p = subprocess32.Popen(cmd, stdout=subprocess32.PIPE) + p = subprocess.Popen(cmd, stdout=subprocess.PIPE, universal_newlines=True) p.communicate() agent_retcode = p.returncode for i in range(3): @@ -180,7 +180,7 @@ def runAgent(passPhrase, expected_hostname, user_run_as, verbose, ret=None): log = ret['log'] except Exception: log = "Log not found" - print log + print(log) break return {"exitstatus": agent_retcode, "log": log} @@ -252,7 +252,7 @@ def findNearestAgentPackageVersion(projectVersion): projectVersion + "'|tr -d '\\n'|sed -s 's/[-|~][A-Za-z0-9]*//'"] else: Command = ["bash", "-c", "yum -q list all ambari-agent | grep '" + projectVersion + - "' | sed -re 's/\s+/ /g' | cut -d ' ' -f 2 | head -n1 | sed -e 's/-\w[^:]*//1' "] + "' | sed -re 's/\s+/ /g' | awk -F ' ' '{print $2}' | awk -F '-' '{print $1}' | head -n1 | sed -e 's/-\w[^:]*//1' "] return execOsCommand(Command) def isAgentPackageAlreadyInstalled(projectVersion): @@ -389,7 +389,7 @@ def main(argv=None): else: try: exitcode = run_setup(argv) - except Exception, e: + except Exception as e: exitcode = {"exitstatus": -1, "log": str(e)} return exitcode @@ -397,5 +397,5 @@ def main(argv=None): logging.basicConfig(level=logging.DEBUG) ret = main(sys.argv) retcode = ret["exitstatus"] - print ret["log"] + print(ret["log"]) sys.exit(retcode) diff --git a/ambari-server/src/main/resources/common-services/AMBARI_INFRA_SOLR/3.0.0/package/scripts/collection.py b/ambari-server/src/main/resources/common-services/AMBARI_INFRA_SOLR/3.0.0/package/scripts/collection.py index 632874cc8b1..d643f54b518 100755 --- a/ambari-server/src/main/resources/common-services/AMBARI_INFRA_SOLR/3.0.0/package/scripts/collection.py +++ b/ambari-server/src/main/resources/common-services/AMBARI_INFRA_SOLR/3.0.0/package/scripts/collection.py @@ -33,7 +33,7 @@ def backup_collection(env): env.set_params(command_commons) Directory(command_commons.index_location, - mode=0755, + mode=0o755, cd_access='a', create_parents=True, owner=params.infra_solr_user, @@ -138,7 +138,7 @@ def restore_collection(env): if command_commons.solr_hdfs_path: Directory([core_root_dir], - mode=0755, + mode=0o755, cd_access='a', create_parents=True, owner=params.infra_solr_user, @@ -149,7 +149,7 @@ def restore_collection(env): Directory([format("{core_root_dir}/data/index"), format("{core_root_dir}/data/tlog"), format("{core_root_dir}/data/snapshot_metadata")], - mode=0755, + mode=0o755, cd_access='a', create_parents=True, owner=params.infra_solr_user, @@ -179,7 +179,7 @@ def restore_collection(env): action="create_on_execute", source=source_folder, owner=params.infra_solr_user, - mode=0755, + mode=0o755, recursive_chown=True, recursive_chmod=True ) @@ -187,13 +187,13 @@ def restore_collection(env): type="directory", action="create_on_execute", owner=params.infra_solr_user, - mode=0755 + mode=0o755 ) command_commons.HdfsResource(format("{hdfs_solr_node_folder}/data/snapshot_metadata"), type="directory", action="create_on_execute", owner=params.infra_solr_user, - mode=0755 + mode=0o755 ) else: copy_cmd = format("cp -r {index_location}/snapshot.{src_core}/* {core_root_dir}/data/index/") if command_commons.solr_keep_backup \ @@ -209,7 +209,7 @@ def restore_collection(env): properties=core_properties, owner=params.infra_solr_user, group=params.user_group, - mode=0644, + mode=0o644, only_if=only_if_cmd ) @@ -281,7 +281,7 @@ def restore_collection(env): Directory( [format("{core_root_without_backup_dir}")], - mode=0755, + mode=0o755, cd_access='a', create_parents=True, owner=params.infra_solr_user, diff --git a/ambari-server/src/main/resources/common-services/AMBARI_INFRA_SOLR/3.0.0/package/scripts/migrate.py b/ambari-server/src/main/resources/common-services/AMBARI_INFRA_SOLR/3.0.0/package/scripts/migrate.py index 3947ddc1e64..832587afd5b 100755 --- a/ambari-server/src/main/resources/common-services/AMBARI_INFRA_SOLR/3.0.0/package/scripts/migrate.py +++ b/ambari-server/src/main/resources/common-services/AMBARI_INFRA_SOLR/3.0.0/package/scripts/migrate.py @@ -58,5 +58,5 @@ def migrate_index(env): if command_commons.delete_lock_on_start: for write_lock_file in deleted_write_locks: Logger.info(format("Put '{write_lock_file}' file back")) - File(write_lock_file, action="create", mode = 0644, owner=params.infra_solr_user, group=params.user_group, not_if=format("test -f {write_lock_file}")) + File(write_lock_file, action="create", mode = 0o644, owner=params.infra_solr_user, group=params.user_group, not_if=format("test -f {write_lock_file}")) diff --git a/ambari-server/src/main/resources/common-services/AMBARI_INFRA_SOLR/3.0.0/package/scripts/setup_infra_solr.py b/ambari-server/src/main/resources/common-services/AMBARI_INFRA_SOLR/3.0.0/package/scripts/setup_infra_solr.py index 569008445c0..2937d2a58d8 100755 --- a/ambari-server/src/main/resources/common-services/AMBARI_INFRA_SOLR/3.0.0/package/scripts/setup_infra_solr.py +++ b/ambari-server/src/main/resources/common-services/AMBARI_INFRA_SOLR/3.0.0/package/scripts/setup_infra_solr.py @@ -31,7 +31,7 @@ def setup_infra_solr(name = None): if name == 'server': Directory([params.infra_solr_log_dir, params.infra_solr_piddir, params.infra_solr_datadir, params.infra_solr_data_resources_dir], - mode=0755, + mode=0o755, cd_access='a', create_parents=True, owner=params.infra_solr_user, @@ -39,7 +39,7 @@ def setup_infra_solr(name = None): ) Directory([params.solr_dir, params.infra_solr_conf], - mode=0755, + mode=0o755, cd_access='a', owner=params.infra_solr_user, group=params.user_group, @@ -48,7 +48,7 @@ def setup_infra_solr(name = None): ) File(params.infra_solr_log, - mode=0644, + mode=0o644, owner=params.infra_solr_user, group=params.user_group, content='' @@ -56,7 +56,7 @@ def setup_infra_solr(name = None): File(format("{infra_solr_conf}/infra-solr-env.sh"), content=InlineTemplate(params.solr_env_content), - mode=0755, + mode=0o755, owner=params.infra_solr_user, group=params.user_group ) @@ -78,7 +78,7 @@ def setup_infra_solr(name = None): content=InlineTemplate(params.infra_solr_security_json_content), owner=params.infra_solr_user, group=params.user_group, - mode=0640 + mode=0o640 ) if params.security_enabled: @@ -90,12 +90,12 @@ def setup_infra_solr(name = None): content=Template("infra-solr-security.json.j2"), owner=params.infra_solr_user, group=params.user_group, - mode=0640) + mode=0o640) if os.path.exists(params.limits_conf_dir): File(os.path.join(params.limits_conf_dir, 'infra-solr.conf'), owner='root', group='root', - mode=0644, + mode=0o644, content=Template("infra-solr.conf.j2") ) diff --git a/ambari-server/src/main/resources/common-services/AMBARI_INFRA_SOLR/3.0.0/package/scripts/status_params.py b/ambari-server/src/main/resources/common-services/AMBARI_INFRA_SOLR/3.0.0/package/scripts/status_params.py index 3c1ed373fc6..309cf551545 100755 --- a/ambari-server/src/main/resources/common-services/AMBARI_INFRA_SOLR/3.0.0/package/scripts/status_params.py +++ b/ambari-server/src/main/resources/common-services/AMBARI_INFRA_SOLR/3.0.0/package/scripts/status_params.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one diff --git a/ambari-server/src/main/resources/common-services/AMBARI_INFRA_SOLR/3.0.0/service_advisor.py b/ambari-server/src/main/resources/common-services/AMBARI_INFRA_SOLR/3.0.0/service_advisor.py index 5e25431a274..309e45a1f15 100755 --- a/ambari-server/src/main/resources/common-services/AMBARI_INFRA_SOLR/3.0.0/service_advisor.py +++ b/ambari-server/src/main/resources/common-services/AMBARI_INFRA_SOLR/3.0.0/service_advisor.py @@ -33,7 +33,7 @@ service_advisor = imp.load_module('service_advisor', fp, PARENT_FILE, ('.py', 'rb', imp.PY_SOURCE)) except Exception as e: traceback.print_exc() - print "Failed to load parent" + print("Failed to load parent") class Ambari_Infra_SolrServiceAdvisor(service_advisor.ServiceAdvisor): diff --git a/ambari-server/src/main/resources/common-services/AMBARI_METRICS/3.0.0/package/alerts/alert_ambari_metrics_monitor.py b/ambari-server/src/main/resources/common-services/AMBARI_METRICS/3.0.0/package/alerts/alert_ambari_metrics_monitor.py index fa44a7fb632..5e406194355 100644 --- a/ambari-server/src/main/resources/common-services/AMBARI_METRICS/3.0.0/package/alerts/alert_ambari_metrics_monitor.py +++ b/ambari-server/src/main/resources/common-services/AMBARI_METRICS/3.0.0/package/alerts/alert_ambari_metrics_monitor.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one diff --git a/ambari-server/src/main/resources/common-services/AMBARI_METRICS/3.0.0/package/scripts/__init__.py b/ambari-server/src/main/resources/common-services/AMBARI_METRICS/3.0.0/package/scripts/__init__.py index 5561e1087b2..152033a3be5 100644 --- a/ambari-server/src/main/resources/common-services/AMBARI_METRICS/3.0.0/package/scripts/__init__.py +++ b/ambari-server/src/main/resources/common-services/AMBARI_METRICS/3.0.0/package/scripts/__init__.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-server/src/main/resources/common-services/AMBARI_METRICS/3.0.0/package/scripts/ams.py b/ambari-server/src/main/resources/common-services/AMBARI_METRICS/3.0.0/package/scripts/ams.py index 820220c84b1..197687faf98 100644 --- a/ambari-server/src/main/resources/common-services/AMBARI_METRICS/3.0.0/package/scripts/ams.py +++ b/ambari-server/src/main/resources/common-services/AMBARI_METRICS/3.0.0/package/scripts/ams.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -90,7 +90,7 @@ def ams(name=None): configuration_attributes=params.config['configurationAttributes']['hdfs-site'], owner=params.ams_user, group=params.user_group, - mode=0644 + mode=0o644 ) XmlConfig("hdfs-site.xml", @@ -99,7 +99,7 @@ def ams(name=None): configuration_attributes=params.config['configurationAttributes']['hdfs-site'], owner=params.ams_user, group=params.user_group, - mode=0644 + mode=0o644 ) XmlConfig("core-site.xml", @@ -108,7 +108,7 @@ def ams(name=None): configuration_attributes=params.config['configurationAttributes']['core-site'], owner=params.ams_user, group=params.user_group, - mode=0644 + mode=0o644 ) XmlConfig("core-site.xml", @@ -117,7 +117,7 @@ def ams(name=None): configuration_attributes=params.config['configurationAttributes']['core-site'], owner=params.ams_user, group=params.user_group, - mode=0644 + mode=0o644 ) else: @@ -241,15 +241,16 @@ def ams(name=None, action=None): else: continue if component_name in known_slave_components: - slave_components.append(component_name) + slave_components.insert(0, component_name) else: - master_components.append(component_name) + master_components.insert(0, component_name) if slave_components: new_ams_site['timeline.metrics.initial.configured.slave.components'] = ",".join(slave_components) if master_components: if 'ambari_server' not in master_components: - master_components.append('ambari_server') + master_components.insert(0,'ambari_server') + master_components=sorted(master_components) new_ams_site['timeline.metrics.initial.configured.master.components'] = ",".join(master_components) hbase_total_heapsize_with_trailing_m = params.hbase_heapsize @@ -296,7 +297,7 @@ def ams(name=None, action=None): if (params.log4j_props != None): File(format("{params.ams_collector_conf_dir}/log4j.properties"), - mode=0644, + mode=0o644, group=params.user_group, owner=params.ams_user, content=InlineTemplate(params.log4j_props) @@ -312,7 +313,7 @@ def ams(name=None, action=None): group=params.user_group, cd_access="a", create_parents = True, - mode=0755, + mode=0o755, ) Directory(params.ams_collector_pid_dir, @@ -320,13 +321,13 @@ def ams(name=None, action=None): group=params.user_group, cd_access="a", create_parents = True, - mode=0755, + mode=0o755, ) # Hack to allow native HBase libs to be included for embedded hbase File(os.path.join(params.ams_hbase_home_dir, "bin", "hadoop"), owner=params.ams_user, - mode=0755 + mode=0o755 ) # On some OS this folder could be not exists, so we will create it before pushing there files @@ -340,7 +341,7 @@ def ams(name=None, action=None): File(os.path.join(params.limits_conf_dir, 'ams.conf'), owner='root', group='root', - mode=0644, + mode=0o644, content=Template("ams.conf.j2") ) @@ -348,7 +349,7 @@ def ams(name=None, action=None): if not os.path.exists(params.phoenix_client_spool_dir): Directory(params.phoenix_client_spool_dir, owner=params.ams_user, - mode = 0755, + mode = 0o755, group=params.user_group, cd_access="a", create_parents = True @@ -363,7 +364,7 @@ def ams(name=None, action=None): configuration_attributes=params.config['configurationAttributes']['hdfs-site'], owner=params.ams_user, group=params.user_group, - mode=0644 + mode=0o644 ) XmlConfig("hdfs-site.xml", @@ -372,7 +373,7 @@ def ams(name=None, action=None): configuration_attributes=params.config['configurationAttributes']['hdfs-site'], owner=params.ams_user, group=params.user_group, - mode=0644 + mode=0o644 ) # Remove spnego configs from core-site if platform does not have python-kerberos library @@ -388,7 +389,7 @@ def ams(name=None, action=None): configuration_attributes=params.config['configurationAttributes']['core-site'], owner=params.ams_user, group=params.user_group, - mode=0644 + mode=0o644 ) XmlConfig("core-site.xml", @@ -397,7 +398,7 @@ def ams(name=None, action=None): configuration_attributes=params.config['configurationAttributes']['core-site'], owner=params.ams_user, group=params.user_group, - mode=0644 + mode=0o644 ) if params.metric_collector_https_enabled: @@ -423,13 +424,13 @@ def ams(name=None, action=None): Directory(params.ams_monitor_log_dir, owner=params.ams_user, group=params.user_group, - mode=0755, + mode=0o755, create_parents = True ) if params.host_in_memory_aggregation and params.log4j_props is not None: File(format("{params.ams_monitor_conf_dir}/log4j.properties"), - mode=0644, + mode=0o644, group=params.user_group, owner=params.ams_user, content=InlineTemplate(params.log4j_props) @@ -458,7 +459,7 @@ def ams(name=None, action=None): owner=params.ams_user, group=params.user_group, cd_access="a", - mode=0755, + mode=0o755, create_parents = True ) @@ -466,7 +467,7 @@ def ams(name=None, action=None): owner=params.ams_user, group=params.user_group, cd_access="a", - mode=0755, + mode=0o755, create_parents = True) Execute(format("{sudo} chown -R {ams_user}:{user_group} {ams_monitor_dir}") @@ -505,7 +506,7 @@ def ams(name=None, action=None): File(os.path.join(params.limits_conf_dir, 'ams.conf'), owner='root', group='root', - mode=0644, + mode=0o644, content=Template("ams.conf.j2") ) @@ -523,7 +524,7 @@ def ams(name=None, action=None): Directory(ams_grafana_directory, owner=params.ams_user, group=params.user_group, - mode=0755, + mode=0o755, create_parents = True, recursive_ownership = True ) @@ -538,7 +539,7 @@ def ams(name=None, action=None): owner=params.ams_user, group=params.user_group, content=InlineTemplate(params.ams_grafana_ini_template), - mode=0600 + mode=0o600 ) if action != 'stop': diff --git a/ambari-server/src/main/resources/common-services/AMBARI_METRICS/3.0.0/package/scripts/functions.py b/ambari-server/src/main/resources/common-services/AMBARI_METRICS/3.0.0/package/scripts/functions.py index e3b3a48cdee..46da3c34ff7 100644 --- a/ambari-server/src/main/resources/common-services/AMBARI_METRICS/3.0.0/package/scripts/functions.py +++ b/ambari-server/src/main/resources/common-services/AMBARI_METRICS/3.0.0/package/scripts/functions.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-server/src/main/resources/common-services/AMBARI_METRICS/3.0.0/package/scripts/hbase.py b/ambari-server/src/main/resources/common-services/AMBARI_METRICS/3.0.0/package/scripts/hbase.py index 691d700a696..d6f8ce9d634 100644 --- a/ambari-server/src/main/resources/common-services/AMBARI_METRICS/3.0.0/package/scripts/hbase.py +++ b/ambari-server/src/main/resources/common-services/AMBARI_METRICS/3.0.0/package/scripts/hbase.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -123,7 +123,7 @@ def hbase(name=None # 'master' or 'regionserver' or 'client' owner = params.hbase_user, group = params.user_group, cd_access="a", - mode=0775, + mode=0o775, create_parents = True ) @@ -162,7 +162,7 @@ def hbase(name=None # 'master' or 'regionserver' or 'client' if not os.path.exists(params.phoenix_server_spool_dir): Directory(params.phoenix_server_spool_dir, owner=params.ams_user, - mode = 0755, + mode = 0o755, group=params.user_group, cd_access="a", create_parents = True @@ -212,14 +212,14 @@ def hbase(name=None # 'master' or 'regionserver' or 'client' owner = params.hbase_user, create_parents = True, cd_access = "a", - mode = 0755, + mode = 0o755, ) Directory (params.hbase_log_dir, owner = params.hbase_user, create_parents = True, cd_access = "a", - mode = 0755, + mode = 0o755, ) if name == "master": @@ -232,7 +232,7 @@ def hbase(name=None # 'master' or 'regionserver' or 'client' type="directory", action="create_on_execute", owner=params.hbase_user, - mode=0775, + mode=0o775, dfs_type=params.dfs_type ) @@ -240,7 +240,7 @@ def hbase(name=None # 'master' or 'regionserver' or 'client' type="directory", action="create_on_execute", owner=params.hbase_user, - mode=0711, + mode=0o711, dfs_type=params.dfs_type ) @@ -248,7 +248,7 @@ def hbase(name=None # 'master' or 'regionserver' or 'client' if params.is_hbase_distributed: #Workaround for status commands not aware of operating mode - File(format("{params.hbase_pid_dir}/distributed_mode"), action="create", mode=0644, owner=params.hbase_user) + File(format("{params.hbase_pid_dir}/distributed_mode"), action="create", mode=0o644, owner=params.hbase_user) pass @@ -271,14 +271,14 @@ def hbase(name=None # 'master' or 'regionserver' or 'client' if params.hbase_log4j_props is not None: File(format("{params.hbase_conf_dir}/log4j.properties"), - mode=0644, + mode=0o644, group=params.user_group, owner=params.hbase_user, content=InlineTemplate(params.hbase_log4j_props) ) elif os.path.exists(format("{params.hbase_conf_dir}/log4j.properties")): File(format("{params.hbase_conf_dir}/log4j.properties"), - mode=0644, + mode=0o644, group=params.user_group, owner=params.hbase_user ) diff --git a/ambari-server/src/main/resources/common-services/AMBARI_METRICS/3.0.0/package/scripts/hbase_master.py b/ambari-server/src/main/resources/common-services/AMBARI_METRICS/3.0.0/package/scripts/hbase_master.py index 9b21c025f30..7779f9c936b 100644 --- a/ambari-server/src/main/resources/common-services/AMBARI_METRICS/3.0.0/package/scripts/hbase_master.py +++ b/ambari-server/src/main/resources/common-services/AMBARI_METRICS/3.0.0/package/scripts/hbase_master.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-server/src/main/resources/common-services/AMBARI_METRICS/3.0.0/package/scripts/hbase_regionserver.py b/ambari-server/src/main/resources/common-services/AMBARI_METRICS/3.0.0/package/scripts/hbase_regionserver.py index 2180b538be2..2bee9eb75ed 100644 --- a/ambari-server/src/main/resources/common-services/AMBARI_METRICS/3.0.0/package/scripts/hbase_regionserver.py +++ b/ambari-server/src/main/resources/common-services/AMBARI_METRICS/3.0.0/package/scripts/hbase_regionserver.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -59,7 +59,7 @@ def status(self, env): check_process_status(pid_file) def decommission(self, env): - print "Decommission not yet implemented!" + print("Decommission not yet implemented!") if __name__ == "__main__": diff --git a/ambari-server/src/main/resources/common-services/AMBARI_METRICS/3.0.0/package/scripts/hbase_service.py b/ambari-server/src/main/resources/common-services/AMBARI_METRICS/3.0.0/package/scripts/hbase_service.py index d322f51b353..8651cc9a77d 100644 --- a/ambari-server/src/main/resources/common-services/AMBARI_METRICS/3.0.0/package/scripts/hbase_service.py +++ b/ambari-server/src/main/resources/common-services/AMBARI_METRICS/3.0.0/package/scripts/hbase_service.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-server/src/main/resources/common-services/AMBARI_METRICS/3.0.0/package/scripts/metrics_collector.py b/ambari-server/src/main/resources/common-services/AMBARI_METRICS/3.0.0/package/scripts/metrics_collector.py index 1c6f2a19f7a..3427288a8c0 100644 --- a/ambari-server/src/main/resources/common-services/AMBARI_METRICS/3.0.0/package/scripts/metrics_collector.py +++ b/ambari-server/src/main/resources/common-services/AMBARI_METRICS/3.0.0/package/scripts/metrics_collector.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-server/src/main/resources/common-services/AMBARI_METRICS/3.0.0/package/scripts/metrics_grafana.py b/ambari-server/src/main/resources/common-services/AMBARI_METRICS/3.0.0/package/scripts/metrics_grafana.py index baad306fea3..d8f48e651cc 100644 --- a/ambari-server/src/main/resources/common-services/AMBARI_METRICS/3.0.0/package/scripts/metrics_grafana.py +++ b/ambari-server/src/main/resources/common-services/AMBARI_METRICS/3.0.0/package/scripts/metrics_grafana.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-server/src/main/resources/common-services/AMBARI_METRICS/3.0.0/package/scripts/metrics_grafana_util.py b/ambari-server/src/main/resources/common-services/AMBARI_METRICS/3.0.0/package/scripts/metrics_grafana_util.py index 5be65103a60..5b4dd928f9f 100644 --- a/ambari-server/src/main/resources/common-services/AMBARI_METRICS/3.0.0/package/scripts/metrics_grafana_util.py +++ b/ambari-server/src/main/resources/common-services/AMBARI_METRICS/3.0.0/package/scripts/metrics_grafana_util.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -17,7 +17,7 @@ limitations under the License. """ -import httplib +import http.client from ambari_commons.parallel_processing import PrallelProcessResult, execute_in_parallel, SUCCESS from service_check import post_metrics_to_collector @@ -26,7 +26,7 @@ from resource_management.libraries.script.script import Script from resource_management import Template from collections import namedtuple -from urlparse import urlparse +from urllib.parse import urlparse from base64 import b64encode import random import time @@ -52,7 +52,7 @@ def perform_grafana_get_call(url, server): if grafana_https_enabled: ca_certs = params.ams_grafana_ca_cert - for i in xrange(0, params.grafana_connect_attempts): + for i in range(0, params.grafana_connect_attempts): try: conn = network.get_http_connection( server.host, @@ -62,7 +62,7 @@ def perform_grafana_get_call(url, server): ssl_version=Script.get_force_https_protocol_value() ) - userAndPass = b64encode('{0}:{1}'.format(server.user, server.password)) + userAndPass = b64encode('{0}:{1}'.format(server.user, server.password).encode()).decode() headers = { 'Authorization' : 'Basic %s' % userAndPass } Logger.info("Connecting (GET) to %s:%s%s" % (server.host, server.port, url)) @@ -71,7 +71,7 @@ def perform_grafana_get_call(url, server): response = conn.getresponse() Logger.info("Http response: %s %s" % (response.status, response.reason)) break - except (httplib.HTTPException, socket.error) as ex: + except (http.client.HTTPException, socket.error) as ex: if i < params.grafana_connect_attempts - 1: Logger.info("Connection to Grafana failed. Next retry in %s seconds." % (params.grafana_connect_retry_delay)) @@ -88,7 +88,7 @@ def perform_grafana_put_call(url, id, payload, server): response = None data = None - userAndPass = b64encode('{0}:{1}'.format(server.user, server.password)) + userAndPass = b64encode('{0}:{1}'.format(server.user, server.password).encode()).decode() headers = {"Content-Type": "application/json", 'Authorization' : 'Basic %s' % userAndPass } grafana_https_enabled = server.protocol.lower() == 'https' @@ -97,7 +97,7 @@ def perform_grafana_put_call(url, id, payload, server): if grafana_https_enabled: ca_certs = params.ams_grafana_ca_cert - for i in xrange(0, params.grafana_connect_attempts): + for i in range(0, params.grafana_connect_attempts): try: conn = network.get_http_connection( server.host, @@ -112,7 +112,7 @@ def perform_grafana_put_call(url, id, payload, server): Logger.info("Http data: %s" % data) conn.close() break - except (httplib.HTTPException, socket.error) as ex: + except (http.client.HTTPException, socket.error) as ex: if i < params.grafana_connect_attempts - 1: Logger.info("Connection to Grafana failed. Next retry in %s seconds." % (params.grafana_connect_retry_delay)) @@ -129,7 +129,7 @@ def perform_grafana_post_call(url, payload, server): response = None data = None - userAndPass = b64encode('{0}:{1}'.format(server.user, server.password)) + userAndPass = b64encode('{0}:{1}'.format(server.user, server.password).encode()).decode() Logger.debug('POST payload: %s' % payload) headers = {"Content-Type": "application/json", "Content-Length" : len(payload), 'Authorization' : 'Basic %s' % userAndPass} @@ -139,7 +139,7 @@ def perform_grafana_post_call(url, payload, server): if grafana_https_enabled: ca_certs = params.ams_grafana_ca_cert - for i in xrange(0, params.grafana_connect_attempts): + for i in range(0, params.grafana_connect_attempts): try: Logger.info("Connecting (POST) to %s:%s%s" % (server.host, server.port, url)) conn = network.get_http_connection( @@ -163,7 +163,7 @@ def perform_grafana_post_call(url, payload, server): Logger.info("Http data: %s" % data) conn.close() break - except (httplib.HTTPException, socket.error) as ex: + except (http.client.HTTPException, socket.error) as ex: if i < params.grafana_connect_attempts - 1: Logger.info("Connection to Grafana failed. Next retry in %s seconds." % (params.grafana_connect_retry_delay)) @@ -185,7 +185,7 @@ def perform_grafana_delete_call(url, server): if grafana_https_enabled: ca_certs = params.ams_grafana_ca_cert - for i in xrange(0, params.grafana_connect_attempts): + for i in range(0, params.grafana_connect_attempts): try: conn = network.get_http_connection( server.host, @@ -194,7 +194,7 @@ def perform_grafana_delete_call(url, server): ssl_version=Script.get_force_https_protocol_value() ) - userAndPass = b64encode('{0}:{1}'.format(server.user, server.password)) + userAndPass = b64encode('{0}:{1}'.format(server.user, server.password).encode()).decode() headers = { 'Authorization' : 'Basic %s' % userAndPass } Logger.info("Connecting (DELETE) to %s:%s%s" % (server.host, server.port, url)) @@ -203,7 +203,7 @@ def perform_grafana_delete_call(url, server): response = conn.getresponse() Logger.info("Http response: %s %s" % (response.status, response.reason)) break - except (httplib.HTTPException, socket.error) as ex: + except (http.client.HTTPException, socket.error) as ex: if i < params.grafana_connect_attempts - 1: Logger.info("Connection to Grafana failed. Next retry in %s seconds." % (params.grafana_connect_retry_delay)) @@ -323,7 +323,7 @@ def create_ams_datasource(): if response and response.status == 200: datasources = response.read() datasources_json = json.loads(datasources) - for i in xrange(0, len(datasources_json)): + for i in range(0, len(datasources_json)): datasource_name = datasources_json[i]["name"] if datasource_name == METRICS_GRAFANA_DATASOURCE_NAME: create_datasource = False # datasource already exists @@ -440,7 +440,7 @@ def create_ams_dashboards(): try: with open(dashboard_file, 'r') as file: dashboard_def = json.load(file) - except Exception, e: + except Exception as e: Logger.error('Unable to load dashboard json file %s' % dashboard_file) Logger.error(str(e)) continue diff --git a/ambari-server/src/main/resources/common-services/AMBARI_METRICS/3.0.0/package/scripts/metrics_monitor.py b/ambari-server/src/main/resources/common-services/AMBARI_METRICS/3.0.0/package/scripts/metrics_monitor.py index 03176ab55ea..bd799f4d082 100644 --- a/ambari-server/src/main/resources/common-services/AMBARI_METRICS/3.0.0/package/scripts/metrics_monitor.py +++ b/ambari-server/src/main/resources/common-services/AMBARI_METRICS/3.0.0/package/scripts/metrics_monitor.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-server/src/main/resources/common-services/AMBARI_METRICS/3.0.0/package/scripts/params.py b/ambari-server/src/main/resources/common-services/AMBARI_METRICS/3.0.0/package/scripts/params.py index e7174fbf867..b1502d5ef36 100644 --- a/ambari-server/src/main/resources/common-services/AMBARI_METRICS/3.0.0/package/scripts/params.py +++ b/ambari-server/src/main/resources/common-services/AMBARI_METRICS/3.0.0/package/scripts/params.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -18,7 +18,7 @@ """ -import ConfigParser +import configparser import os import re @@ -136,7 +136,7 @@ def get_grafana_dashboard_defs(): def get_ambari_version(): ambari_version = None AMBARI_AGENT_CONF = '/etc/ambari-agent/conf/ambari-agent.ini' - ambari_agent_config = ConfigParser.RawConfigParser() + ambari_agent_config = configparser.RawConfigParser() if os.path.exists(AMBARI_AGENT_CONF): try: ambari_agent_config.read(AMBARI_AGENT_CONF) @@ -145,7 +145,7 @@ def get_ambari_version(): f = open(ver_file, "r") ambari_version = f.read().strip() f.close() - except Exception, e: + except Exception as e: Logger.info('Unable to determine ambari version from version file.') Logger.debug('Exception: %s' % str(e)) # No hostname script identified in the ambari agent conf @@ -159,7 +159,7 @@ def get_ambari_version(): ams_collector_conf_dir = "/etc/ambari-metrics-collector/conf" ams_monitor_log_dir = config['configurations']['ams-env']['metrics_monitor_log_dir'] -ams_monitor_dir = "/usr/lib/python2.6/site-packages/resource_monitoring" +ams_monitor_dir = "/usr/lib/python3.9/site-packages/resource_monitoring" ams_monitor_conf_dir = "/etc/ambari-metrics-monitor/conf" ams_monitor_pid_dir = status_params.ams_monitor_pid_dir ams_monitor_script = "/usr/sbin/ambari-metrics-monitor" diff --git a/ambari-server/src/main/resources/common-services/AMBARI_METRICS/3.0.0/package/scripts/params_linux.py b/ambari-server/src/main/resources/common-services/AMBARI_METRICS/3.0.0/package/scripts/params_linux.py index 92bfed95b39..4fb0fb9ae40 100644 --- a/ambari-server/src/main/resources/common-services/AMBARI_METRICS/3.0.0/package/scripts/params_linux.py +++ b/ambari-server/src/main/resources/common-services/AMBARI_METRICS/3.0.0/package/scripts/params_linux.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-server/src/main/resources/common-services/AMBARI_METRICS/3.0.0/package/scripts/params_windows.py b/ambari-server/src/main/resources/common-services/AMBARI_METRICS/3.0.0/package/scripts/params_windows.py index 64589ec4968..9cc9f0f8982 100644 --- a/ambari-server/src/main/resources/common-services/AMBARI_METRICS/3.0.0/package/scripts/params_windows.py +++ b/ambari-server/src/main/resources/common-services/AMBARI_METRICS/3.0.0/package/scripts/params_windows.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-server/src/main/resources/common-services/AMBARI_METRICS/3.0.0/package/scripts/service_check.py b/ambari-server/src/main/resources/common-services/AMBARI_METRICS/3.0.0/package/scripts/service_check.py index b31475adfe0..68738657333 100644 --- a/ambari-server/src/main/resources/common-services/AMBARI_METRICS/3.0.0/package/scripts/service_check.py +++ b/ambari-server/src/main/resources/common-services/AMBARI_METRICS/3.0.0/package/scripts/service_check.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -28,9 +28,9 @@ from ambari_commons.os_family_impl import OsFamilyFuncImpl, OsFamilyImpl from ambari_commons.parallel_processing import PrallelProcessResult, execute_in_parallel, SUCCESS -import httplib +import http.client import ambari_commons.network as network -import urllib +import urllib.request, urllib.parse, urllib.error import ambari_simplejson as json # simplejson is much faster comparing to Python 2.6 json module and has the same functions set. import os import random @@ -102,7 +102,7 @@ def service_check_for_single_host(self, metric_collector_host, params): "precision": "seconds", "grouped": "false", } - encoded_get_metrics_parameters = urllib.urlencode(get_metrics_parameters) + encoded_get_metrics_parameters = urllib.parse.urlencode(get_metrics_parameters) if is_spnego_enabled(params): method = 'GET' @@ -115,7 +115,7 @@ def service_check_for_single_host(self, metric_collector_host, params): Logger.info("Connecting (GET) to %s:%s%s" % (metric_collector_host, params.metric_collector_port, self.AMS_METRICS_GET_URL % encoded_get_metrics_parameters)) - for i in xrange(0, self.AMS_READ_TRIES): + for i in range(0, self.AMS_READ_TRIES): conn = network.get_http_connection( metric_collector_host, int(params.metric_collector_port), @@ -196,7 +196,7 @@ def call_curl_krb_request(tmp_dir, user_keytab, user_princ, uri, kinit_path, use if method == 'POST': Logger.info("Generated metrics for %s:\n%s" % (uri, metric_json)) - for i in xrange(0, tries): + for i in range(0, tries): try: Logger.info("Connecting (%s) to %s" % (method, uri)); @@ -208,7 +208,7 @@ def call_curl_krb_request(tmp_dir, user_keytab, user_princ, uri, kinit_path, use kinit_path, False, "AMS Service Check", user, connection_timeout=connection_timeout, kinit_timer_ms=0, method=method, body=metric_json, header=header) - except Exception, exception: + except Exception as exception: if i < tries - 1: #range/xrange returns items from start to end-1 time.sleep(connection_timeout) Logger.info("Connection failed for %s. Next retry in %s seconds." @@ -257,7 +257,7 @@ def floats_eq(f1, f2, delta): def post_metrics_to_collector(ams_metrics_post_url, metric_collector_host, metric_collector_port, metric_collector_https_enabled, metric_json, headers, ca_certs, tries = 1, connect_timeout = 10): - for i in xrange(0, tries): + for i in range(0, tries): try: Logger.info("Generated metrics for host %s :\n%s" % (metric_collector_host, metric_json)) @@ -275,7 +275,7 @@ def post_metrics_to_collector(ams_metrics_post_url, metric_collector_host, metri response = conn.getresponse() Logger.info("Http response for host %s: %s %s" % (metric_collector_host, response.status, response.reason)) - except (httplib.HTTPException, socket.error) as ex: + except (http.client.HTTPException, socket.error) as ex: if i < tries - 1: #range/xrange returns items from start to end-1 time.sleep(connect_timeout) Logger.info("Connection failed for host %s. Next retry in %s seconds." diff --git a/ambari-server/src/main/resources/common-services/AMBARI_METRICS/3.0.0/package/scripts/service_mapping.py b/ambari-server/src/main/resources/common-services/AMBARI_METRICS/3.0.0/package/scripts/service_mapping.py index 2eeb427bd56..41f1d6d4f9f 100644 --- a/ambari-server/src/main/resources/common-services/AMBARI_METRICS/3.0.0/package/scripts/service_mapping.py +++ b/ambari-server/src/main/resources/common-services/AMBARI_METRICS/3.0.0/package/scripts/service_mapping.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-server/src/main/resources/common-services/AMBARI_METRICS/3.0.0/package/scripts/split_points.py b/ambari-server/src/main/resources/common-services/AMBARI_METRICS/3.0.0/package/scripts/split_points.py index ffe10b5c115..906fed07a4d 100644 --- a/ambari-server/src/main/resources/common-services/AMBARI_METRICS/3.0.0/package/scripts/split_points.py +++ b/ambari-server/src/main/resources/common-services/AMBARI_METRICS/3.0.0/package/scripts/split_points.py @@ -101,7 +101,7 @@ def initialize_region_counts(self): memstore_flush_size = format_Xmx_size_to_bytes(self.ams_hbase_site['hbase.hregion.memstore.flush.size']) max_inmemory_regions = (memstore_max_mem / memstore_flush_size) - other_region_static_count - print 'max_inmemory_regions: %s' % max_inmemory_regions + print('max_inmemory_regions: %s' % max_inmemory_regions) if max_inmemory_regions > 2: # Lets say total = 25, so we have 20 regions to allocate between @@ -123,7 +123,7 @@ def initialize_ordered_set_of_metrics(self): self.gatherMetrics(metrics, self.customServiceMetricsDir) self.metrics = sorted(metrics) - print 'metrics length: %s' % len(self.metrics) + print('metrics length: %s' % len(self.metrics)) def gatherMetrics(self, metrics, dir): @@ -137,7 +137,7 @@ def gatherMetrics(self, metrics, dir): # Process for stack services selected at deploy time or all stack services if # services arg is not passed if self.services is None or file.rstrip(metric_filename_ext) in self.services: - print 'Processing file: %s' % os.path.join(dir, file) + print('Processing file: %s' % os.path.join(dir, file)) service_metrics = set() with open(os.path.join(dir, file), 'r') as f: for metric in f: @@ -214,15 +214,15 @@ def main(argv = None): if services: services = str(services).split(',') pass - except Exception, ex: + except Exception as ex: sys.stderr.write(str(ex)) sys.stderr.write("\nUsage: Expected items not found in input. Found " " ams-hbase-site => {0}, ams-hbase-env => {1}," " services => {2}".format(ams_hbase_site, ams_hbase_env, services)) sys.exit(2) - print '--------- AMS Regions Split point finder ---------' - print 'Services: %s' % services + print('--------- AMS Regions Split point finder ---------') + print('Services: %s' % services) mode = 'distributed' if 'hbase.rootdir' in ams_hbase_site and \ 'hdfs' in ams_hbase_site['hbase.rootdir'] else \ @@ -232,15 +232,15 @@ def main(argv = None): ams_hbase_site, ams_hbase_env, serviceMetricsDir, mode, services) result = split_point_finder.get_split_points() - print 'Split points for precision table : %s' % len(result.precision) - print 'precision: %s' % str(result.precision) - print 'Split points for aggregate table : %s' % len(result.aggregate) - print 'aggregate: %s' % str(result.aggregate) + print('Split points for precision table : %s' % len(result.precision)) + print('precision: %s' % str(result.precision)) + print('Split points for aggregate table : %s' % len(result.aggregate)) + print('aggregate: %s' % str(result.aggregate)) return 0 else: - print 'Cannot find service metrics dir in %s' % scriptDir + print('Cannot find service metrics dir in %s' % scriptDir) if __name__ == '__main__': main(sys.argv) diff --git a/ambari-server/src/main/resources/common-services/AMBARI_METRICS/3.0.0/package/scripts/status_params.py b/ambari-server/src/main/resources/common-services/AMBARI_METRICS/3.0.0/package/scripts/status_params.py index 27c60202ce2..fd43b7fa777 100644 --- a/ambari-server/src/main/resources/common-services/AMBARI_METRICS/3.0.0/package/scripts/status_params.py +++ b/ambari-server/src/main/resources/common-services/AMBARI_METRICS/3.0.0/package/scripts/status_params.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-server/src/main/resources/common-services/AMBARI_METRICS/3.0.0/service_advisor.py b/ambari-server/src/main/resources/common-services/AMBARI_METRICS/3.0.0/service_advisor.py index 97ae6ace0f7..b64d5f0fd84 100644 --- a/ambari-server/src/main/resources/common-services/AMBARI_METRICS/3.0.0/service_advisor.py +++ b/ambari-server/src/main/resources/common-services/AMBARI_METRICS/3.0.0/service_advisor.py @@ -40,7 +40,7 @@ service_advisor = imp.load_module('service_advisor', fp, PARENT_FILE, ('.py', 'rb', imp.PY_SOURCE)) except Exception as e: traceback.print_exc() - print "Failed to load parent" + print("Failed to load parent") class AMBARI_METRICSServiceAdvisor(service_advisor.ServiceAdvisor): @@ -183,7 +183,7 @@ def getAmsMemoryRecommendation(self, services, hosts): hosts)) hbase_heapsize += int((schCount * multiplier)) total_sinks_count += schCount - collector_heapsize = int(hbase_heapsize/3 if hbase_heapsize > 2048 else 512) + collector_heapsize = int(hbase_heapsize//3 if hbase_heapsize > 2048 else 512) hbase_heapsize = min(hbase_heapsize, 32768) return self.round_to_n(collector_heapsize), self.round_to_n(hbase_heapsize), total_sinks_count @@ -385,7 +385,7 @@ def recommendAmsConfigurationsFromHDP206(self, configurations, clusterData, serv putAmsHbaseSiteProperty("phoenix.coprocessor.maxMetaDataCacheSize", 20480000) pass - metrics_api_handlers = min(50, max(20, int(total_sinks_count / 100))) + metrics_api_handlers = min(50, max(20, int(total_sinks_count // 100))) putAmsSiteProperty("timeline.metrics.service.handler.thread.count", metrics_api_handlers) serviceAdvisor = AMBARI_METRICSServiceAdvisor() diff --git a/ambari-server/src/main/resources/custom_actions/scripts/check_host.py b/ambari-server/src/main/resources/custom_actions/scripts/check_host.py index 9fd2fe5ee17..6df423ac95b 100644 --- a/ambari-server/src/main/resources/custom_actions/scripts/check_host.py +++ b/ambari-server/src/main/resources/custom_actions/scripts/check_host.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -136,7 +136,7 @@ def actionexecute(self, env): try : java_home_check_structured_output = self.execute_java_home_available_check(config) structured_output[CHECK_JAVA_HOME] = java_home_check_structured_output - except Exception, exception: + except Exception as exception: Logger.exception("There was an unexpected error while checking for the Java home location: " + str(exception)) structured_output[CHECK_JAVA_HOME] = {"exit_code" : 1, "message": str(exception)} @@ -144,7 +144,7 @@ def actionexecute(self, env): try : db_connection_check_structured_output = self.execute_db_connection_check(config, tmp_dir) structured_output[CHECK_DB_CONNECTION] = db_connection_check_structured_output - except Exception, exception: + except Exception as exception: Logger.exception("There was an unknown error while checking database connectivity: " + str(exception)) structured_output[CHECK_DB_CONNECTION] = {"exit_code" : 1, "message": str(exception)} @@ -152,14 +152,14 @@ def actionexecute(self, env): try : host_resolution_structured_output = self.execute_host_resolution_check(config) structured_output[CHECK_HOST_RESOLUTION] = host_resolution_structured_output - except Exception, exception : + except Exception as exception : Logger.exception("There was an unknown error while checking IP address lookups: " + str(exception)) structured_output[CHECK_HOST_RESOLUTION] = {"exit_code" : 1, "message": str(exception)} if CHECK_LAST_AGENT_ENV in check_execute_list: try : last_agent_env_structured_output = self.execute_last_agent_env_check() structured_output[CHECK_LAST_AGENT_ENV] = last_agent_env_structured_output - except Exception, exception : + except Exception as exception : Logger.exception("There was an unknown error while checking last host environment details: " + str(exception)) structured_output[CHECK_LAST_AGENT_ENV] = {"exit_code" : 1, "message": str(exception)} @@ -170,7 +170,7 @@ def actionexecute(self, env): installed_packages, repos = self.execute_existing_repos_and_installed_packages_check(config) structured_output[CHECK_INSTALLED_PACKAGES] = installed_packages structured_output[CHECK_EXISTING_REPOS] = repos - except Exception, exception : + except Exception as exception : Logger.exception("There was an unknown error while checking installed packages and existing repositories: " + str(exception)) structured_output[CHECK_INSTALLED_PACKAGES] = {"exit_code" : 1, "message": str(exception)} structured_output[CHECK_EXISTING_REPOS] = {"exit_code" : 1, "message": str(exception)} @@ -180,7 +180,7 @@ def actionexecute(self, env): try : transparent_huge_page_structured_output = self.execute_transparent_huge_page_check(config) structured_output[CHECK_TRANSPARENT_HUGE_PAGE] = transparent_huge_page_structured_output - except Exception, exception : + except Exception as exception : Logger.exception("There was an unknown error while getting transparent huge page data: " + str(exception)) structured_output[CHECK_TRANSPARENT_HUGE_PAGE] = {"exit_code" : 1, "message": str(exception)} @@ -366,7 +366,7 @@ def execute_db_connection_check(self, config, tmp_dir): java_dir = os.path.dirname(java_home) try: download_file(jdk_url, jdk_download_target) - except Exception, e: + except Exception as e: message = "Error downloading JDK from Ambari Server resources. Check network access to " \ "Ambari Server.\n" + str(e) Logger.exception(message) @@ -380,7 +380,7 @@ def execute_db_connection_check(self, config, tmp_dir): install_path = [java_dir] try: Execute(install_cmd, path = install_path) - except Exception, e: + except Exception as e: message = "Error installing java.\n" + str(e) Logger.exception(message) db_connection_check_structured_output = {"exit_code" : 1, "message": message} @@ -398,10 +398,10 @@ def execute_db_connection_check(self, config, tmp_dir): Directory(java_dir) Execute(chmod_cmd, not_if = format("test -e {java_exec}"), sudo = True) Execute(install_cmd, not_if = format("test -e {java_exec}")) - File(format("{java_home}/bin/java"), mode=0755, cd_access="a") + File(format("{java_home}/bin/java"), mode=0o755, cd_access="a") Directory(java_home, owner=getpass.getuser(), recursive_ownership=True) Execute(('chmod', '-R', '755', java_home), sudo = True) - except Exception, e: + except Exception as e: message = "Error installing java.\n" + str(e) Logger.exception(message) db_connection_check_structured_output = {"exit_code" : 1, "message": message} @@ -413,7 +413,7 @@ def execute_db_connection_check(self, config, tmp_dir): try: download_file(check_db_connection_url, check_db_connection_path) - except Exception, e: + except Exception as e: message = "Error downloading DBConnectionVerification.jar from Ambari Server resources. Check network access to " \ "Ambari Server.\n" + str(e) Logger.exception(message) @@ -431,7 +431,7 @@ def execute_db_connection_check(self, config, tmp_dir): # unpack tar.gz jdbc which was donaloaded untar_sqla_type2_driver = ('tar', '-xvf', jdbc_path, '-C', agent_cache_dir) Execute(untar_sqla_type2_driver, sudo = True) - except Exception, e: + except Exception as e: message = format("Error: Ambari Server cannot download the database JDBC driver and is unable to test the " \ "database connection. You must run ambari-server setup --jdbc-db={db_name} " \ "--jdbc-driver=/path/to/your/{db_name}/driver.jar on the Ambari Server host to make the JDBC " \ @@ -485,7 +485,7 @@ def execute_host_resolution_check(self, config): try: host = host.strip() socket.gethostbyname(host) - except socket.error,exception: + except socket.error as exception: successCount -= 1 failedCount += 1 diff --git a/ambari-server/src/main/resources/custom_actions/scripts/clear_repocache.py b/ambari-server/src/main/resources/custom_actions/scripts/clear_repocache.py index 8fabc184dd9..50e3307370e 100644 --- a/ambari-server/src/main/resources/custom_actions/scripts/clear_repocache.py +++ b/ambari-server/src/main/resources/custom_actions/scripts/clear_repocache.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-server/src/main/resources/custom_actions/scripts/install_packages.py b/ambari-server/src/main/resources/custom_actions/scripts/install_packages.py index ef7830b3847..75292b4f480 100644 --- a/ambari-server/src/main/resources/custom_actions/scripts/install_packages.py +++ b/ambari-server/src/main/resources/custom_actions/scripts/install_packages.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -188,7 +188,7 @@ def _fix_default_links_for_current(self): else: Logger.info("Restricting conf-select packages to {0}".format(restricted_packages)) - for package_name, directories in conf_select.get_package_dirs().iteritems(): + for package_name, directories in conf_select.get_package_dirs().items(): Logger.info("Attempting to fix the default conf links for {0}".format(package_name)) Logger.info("The following directories will be fixed for {0}: {1}".format(package_name, str(directories))) @@ -244,7 +244,7 @@ def _relink_configurations_with_conf_select(self, stack_id, stack_version): else: Logger.info("Restricting conf-select packages to {0}".format(restricted_packages)) - for package_name, directories in conf_select.get_package_dirs().iteritems(): + for package_name, directories in conf_select.get_package_dirs().items(): if 0 == len(restricted_packages) or package_name in restricted_packages: conf_select.convert_conf_directories_to_symlinks(package_name, stack_version, directories) @@ -350,7 +350,7 @@ def find_best_fit_version(self, versions, repo_version): normalized_repo_version = repo_version.split('-')[0] # Find all versions that match the normalized repo version - match_versions = filter(lambda x: x.startswith(normalized_repo_version), versions) + match_versions = [x for x in versions if x.startswith(normalized_repo_version)] if match_versions: if len(match_versions) == 1: diff --git a/ambari-server/src/main/resources/custom_actions/scripts/remove_bits.py b/ambari-server/src/main/resources/custom_actions/scripts/remove_bits.py index 0be9a34ab00..57b5fa78605 100644 --- a/ambari-server/src/main/resources/custom_actions/scripts/remove_bits.py +++ b/ambari-server/src/main/resources/custom_actions/scripts/remove_bits.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-server/src/main/resources/custom_actions/scripts/remove_previous_stacks.py b/ambari-server/src/main/resources/custom_actions/scripts/remove_previous_stacks.py index 4ebd115102b..6b7371656a2 100644 --- a/ambari-server/src/main/resources/custom_actions/scripts/remove_previous_stacks.py +++ b/ambari-server/src/main/resources/custom_actions/scripts/remove_previous_stacks.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -113,6 +113,8 @@ def compare(self, version1, version2): """ vesion1_sections = re.findall(r"[\w']+", version1) vesion2_sections = re.findall(r"[\w']+", version2) + def cmp(a, b): + return (a > b) - (a < b) return cmp(vesion1_sections, vesion2_sections) if __name__ == "__main__": diff --git a/ambari-server/src/main/resources/custom_actions/scripts/ru_execute_tasks.py b/ambari-server/src/main/resources/custom_actions/scripts/ru_execute_tasks.py index 92d1b894f50..745b23407f3 100644 --- a/ambari-server/src/main/resources/custom_actions/scripts/ru_execute_tasks.py +++ b/ambari-server/src/main/resources/custom_actions/scripts/ru_execute_tasks.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -79,7 +79,7 @@ def resolve_ambari_config(): agent_config.read(config_path) else: raise Exception("No config found at %s" % str(config_path)) - except Exception, err: + except Exception as err: traceback.print_exc() Logger.warning(err) diff --git a/ambari-server/src/main/resources/custom_actions/scripts/stack_select_set_all.py b/ambari-server/src/main/resources/custom_actions/scripts/stack_select_set_all.py index 9ae27ba8655..6043353d75a 100644 --- a/ambari-server/src/main/resources/custom_actions/scripts/stack_select_set_all.py +++ b/ambari-server/src/main/resources/custom_actions/scripts/stack_select_set_all.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-server/src/main/resources/custom_actions/scripts/update_repo.py b/ambari-server/src/main/resources/custom_actions/scripts/update_repo.py index ece27f5e576..16b396efc85 100644 --- a/ambari-server/src/main/resources/custom_actions/scripts/update_repo.py +++ b/ambari-server/src/main/resources/custom_actions/scripts/update_repo.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -63,7 +63,7 @@ def actionexecute(self, env): ) structured_output["repo_update"] = {"exit_code" : 0, "message": format("Repository files successfully updated!")} Repository(None, action="create") - except Exception, exception: + except Exception as exception: Logger.logger.exception("ERROR: There was an unexpected error while updating repositories") raise Fail("Failed to update repo files!") diff --git a/ambari-server/src/main/resources/custom_actions/scripts/validate_configs.py b/ambari-server/src/main/resources/custom_actions/scripts/validate_configs.py index 4ef0f00a8d8..f92cfa3a625 100644 --- a/ambari-server/src/main/resources/custom_actions/scripts/validate_configs.py +++ b/ambari-server/src/main/resources/custom_actions/scripts/validate_configs.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -363,7 +363,7 @@ def actionexecute(self, env): validation_passed = self.check_users(params) and self.check_directories(params) if validation_passed: - print 'All configurations validated!' + print('All configurations validated!') else: self.fail_with_error('Configurations validation failed!') diff --git a/ambari-server/src/main/resources/host_scripts/alert_disk_space.py b/ambari-server/src/main/resources/host_scripts/alert_disk_space.py index eb927812bed..357d56360e9 100644 --- a/ambari-server/src/main/resources/host_scripts/alert_disk_space.py +++ b/ambari-server/src/main/resources/host_scripts/alert_disk_space.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one @@ -33,7 +33,7 @@ PERCENT_USED_CRITICAL_KEY = "percent.free.space.critical.threshold" # defaults in case no script parameters are passed -MIN_FREE_SPACE_DEFAULT = 5000000000L +MIN_FREE_SPACE_DEFAULT = 5000000000 PERCENT_USED_WARNING_DEFAULT = 50 PERCENT_USED_CRITICAL_DEFAULT = 80 @@ -74,7 +74,7 @@ def execute(configurations={}, parameters={}, host_name=None): try: disk_usage = _get_disk_usage(path) result_code, label = _get_warnings_for_partition(parameters, disk_usage) - except NotImplementedError, platform_error: + except NotImplementedError as platform_error: return 'CRITICAL', [str(platform_error)] return result_code, [label] @@ -90,7 +90,7 @@ def _get_warnings_for_partition(parameters, disk_usage): # parse script parameters if MIN_FREE_SPACE_KEY in parameters: # long(float(5e9)) seems like gson likes scientific notation - min_free_space = long(float(parameters[MIN_FREE_SPACE_KEY])) + min_free_space = int(float(parameters[MIN_FREE_SPACE_KEY])) if PERCENT_USED_WARNING_KEY in parameters: warning_percent = float(parameters[PERCENT_USED_WARNING_KEY]) @@ -139,7 +139,7 @@ def execute(configurations={}, parameters={}, host_name=None): try: disk_usage = _get_disk_usage() result = _get_warnings_for_partition(parameters, disk_usage) - except NotImplementedError, platform_error: + except NotImplementedError as platform_error: result = ('CRITICAL', [str(platform_error)]) return result @@ -212,4 +212,4 @@ def _get_formatted_size(bytes): return '%.1f' % (bytes / 1000000000000.0) + ' TB' if __name__ == '__main__': - print _get_disk_usage(os.getcwd()) + print(_get_disk_usage(os.getcwd())) diff --git a/ambari-server/src/main/resources/host_scripts/alert_ulimit.py b/ambari-server/src/main/resources/host_scripts/alert_ulimit.py index 8c57b841134..19abd7f1f9e 100644 --- a/ambari-server/src/main/resources/host_scripts/alert_ulimit.py +++ b/ambari-server/src/main/resources/host_scripts/alert_ulimit.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one diff --git a/ambari-server/src/main/resources/host_scripts/alert_version_select.py b/ambari-server/src/main/resources/host_scripts/alert_version_select.py index f54ccad7e77..6cd94805469 100644 --- a/ambari-server/src/main/resources/host_scripts/alert_version_select.py +++ b/ambari-server/src/main/resources/host_scripts/alert_version_select.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one @@ -104,5 +104,5 @@ def execute(configurations={}, parameters={}, host_name=None): else: msg.append("No stack root {0} to check.".format(stack_root_dir)) return (RESULT_STATE_OK, ["\n".join(msg)]) - except Exception, e: + except Exception as e: return (RESULT_STATE_CRITICAL, [e.message]) diff --git a/ambari-server/src/main/resources/scripts/Ambaripreupload.py b/ambari-server/src/main/resources/scripts/Ambaripreupload.py index 0de7ac2aa92..aa5c3c64723 100644 --- a/ambari-server/src/main/resources/scripts/Ambaripreupload.py +++ b/ambari-server/src/main/resources/scripts/Ambaripreupload.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -53,7 +53,7 @@ with Environment() as env: def get_stack_version(): if not options.hdp_version: - # Ubuntu returns: "stdin: is not a tty", as subprocess32 output. + # Ubuntu returns: "stdin: is not a tty", as subprocess output. tmpfile = tempfile.NamedTemporaryFile() out = None with open(tmpfile.name, 'r+') as file: @@ -213,7 +213,7 @@ def _copy_files(source_and_dest_pairs, file_owner, group_owner, kinit_if_needed) params.HdfsResource(destination, action="create_on_execute", type = 'file', - mode=0444, + mode=0o444, owner=file_owner, group=group_owner, source=source @@ -259,34 +259,34 @@ def copy_tarballs_to_hdfs(source, dest, component_user, file_owner, group_owner) def createHdfsResources(): Logger.info("Creating hdfs directories...") - params.HdfsResource(format('{hdfs_path_prefix}/atshistory'), user='hdfs', change_permissions_for_parents=True, owner='yarn', group='hadoop', type='directory', action= ['create_on_execute'], mode=0755) - params.HdfsResource(format('{hdfs_path_prefix}/user/hcat'), owner='hcat', type='directory', action=['create_on_execute'], mode=0755) - params.HdfsResource(format('{hdfs_path_prefix}/hive/warehouse'), owner='hive', type='directory', action=['create_on_execute'], mode=0777) - params.HdfsResource(format('{hdfs_path_prefix}/warehouse/tablespace/external/hive'), owner='hive', type='directory', action=['create_on_execute'], mode=01777) - params.HdfsResource(format('{hdfs_path_prefix}/user/hive'), owner='hive', type='directory', action=['create_on_execute'], mode=0755) - params.HdfsResource(format('{hdfs_path_prefix}/user/hive/.yarn/package/LLAP'), owner='hive', type='directory', action=['create_on_execute'], mode=0755) - params.HdfsResource(format('{hdfs_path_prefix}/tmp'), mode=0777, action=['create_on_execute'], type='directory', owner='hdfs') - params.HdfsResource(format('{hdfs_path_prefix}/user/ambari-qa'), type='directory', action=['create_on_execute'], mode=0770) - params.HdfsResource(format('{hdfs_path_prefix}/user/oozie'), owner='oozie', type='directory', action=['create_on_execute'], mode=0775) - params.HdfsResource(format('{hdfs_path_prefix}/app-logs'), recursive_chmod=True, owner='yarn', group='hadoop', type='directory', action=['create_on_execute'], mode=0777) + params.HdfsResource(format('{hdfs_path_prefix}/atshistory'), user='hdfs', change_permissions_for_parents=True, owner='yarn', group='hadoop', type='directory', action= ['create_on_execute'], mode=0o755) + params.HdfsResource(format('{hdfs_path_prefix}/user/hcat'), owner='hcat', type='directory', action=['create_on_execute'], mode=0o755) + params.HdfsResource(format('{hdfs_path_prefix}/hive/warehouse'), owner='hive', type='directory', action=['create_on_execute'], mode=0o777) + params.HdfsResource(format('{hdfs_path_prefix}/warehouse/tablespace/external/hive'), owner='hive', type='directory', action=['create_on_execute'], mode=0o1777) + params.HdfsResource(format('{hdfs_path_prefix}/user/hive'), owner='hive', type='directory', action=['create_on_execute'], mode=0o755) + params.HdfsResource(format('{hdfs_path_prefix}/user/hive/.yarn/package/LLAP'), owner='hive', type='directory', action=['create_on_execute'], mode=0o755) + params.HdfsResource(format('{hdfs_path_prefix}/tmp'), mode=0o777, action=['create_on_execute'], type='directory', owner='hdfs') + params.HdfsResource(format('{hdfs_path_prefix}/user/ambari-qa'), type='directory', action=['create_on_execute'], mode=0o770) + params.HdfsResource(format('{hdfs_path_prefix}/user/oozie'), owner='oozie', type='directory', action=['create_on_execute'], mode=0o775) + params.HdfsResource(format('{hdfs_path_prefix}/app-logs'), recursive_chmod=True, owner='yarn', group='hadoop', type='directory', action=['create_on_execute'], mode=0o777) params.HdfsResource(format('{hdfs_path_prefix}/tmp/entity-file-history/active'), owner='yarn', group='hadoop', type='directory', action=['create_on_execute']) params.HdfsResource(format('{hdfs_path_prefix}/mapred'), owner='mapred', type='directory', action=['create_on_execute']) params.HdfsResource(format('{hdfs_path_prefix}/mapred/system'), owner='hdfs', type='directory', action=['create_on_execute']) - params.HdfsResource(format('{hdfs_path_prefix}/mr-history/done'), change_permissions_for_parents=True, owner='mapred', group='hadoop', type='directory', action=['create_on_execute'], mode=0777) - params.HdfsResource(format('{hdfs_path_prefix}/user/yarn-ats'), owner='yarn-ats', type='directory', action=['create_on_execute'], mode=0755) - params.HdfsResource(format('{hdfs_path_prefix}/atshistory/done'), owner='yarn', group='hadoop', type='directory', action=['create_on_execute'], mode=0700) - params.HdfsResource(format('{hdfs_path_prefix}/atshistory/active'), owner='yarn', group='hadoop', type='directory', action=['create_on_execute'], mode=01777) - params.HdfsResource(format('{hdfs_path_prefix}/ams/hbase'), owner='ams', type='directory', action=['create_on_execute'], mode=0775) - params.HdfsResource(format('{hdfs_path_prefix}/amshbase/staging'), owner='ams', type='directory', action=['create_on_execute'], mode=0711) - params.HdfsResource(format('{hdfs_path_prefix}/user/ams/hbase'), owner='ams', type='directory', action=['create_on_execute'], mode=0775) - params.HdfsResource(format('{hdfs_path_prefix}/hdp'), owner='hdfs', type='directory', action=['create_on_execute'], mode=0755) - params.HdfsResource(format('{hdfs_path_prefix}/user/spark'), owner='spark', group='hadoop', type='directory', action=['create_on_execute'], mode=0775) - params.HdfsResource(format('{hdfs_path_prefix}/user/livy'), owner='livy', group='hadoop', type='directory', action=['create_on_execute'], mode=0775) - params.HdfsResource(format('{hdfs_path_prefix}/hdp/spark-events'), owner='spark', group='hadoop', type='directory', action=['create_on_execute'], mode=0777) - params.HdfsResource(format('{hdfs_path_prefix}/hdp/spark2-events'), owner='spark', group='hadoop', type='directory', action=['create_on_execute'], mode=0777) + params.HdfsResource(format('{hdfs_path_prefix}/mr-history/done'), change_permissions_for_parents=True, owner='mapred', group='hadoop', type='directory', action=['create_on_execute'], mode=0o777) + params.HdfsResource(format('{hdfs_path_prefix}/user/yarn-ats'), owner='yarn-ats', type='directory', action=['create_on_execute'], mode=0o755) + params.HdfsResource(format('{hdfs_path_prefix}/atshistory/done'), owner='yarn', group='hadoop', type='directory', action=['create_on_execute'], mode=0o700) + params.HdfsResource(format('{hdfs_path_prefix}/atshistory/active'), owner='yarn', group='hadoop', type='directory', action=['create_on_execute'], mode=0o1777) + params.HdfsResource(format('{hdfs_path_prefix}/ams/hbase'), owner='ams', type='directory', action=['create_on_execute'], mode=0o775) + params.HdfsResource(format('{hdfs_path_prefix}/amshbase/staging'), owner='ams', type='directory', action=['create_on_execute'], mode=0o711) + params.HdfsResource(format('{hdfs_path_prefix}/user/ams/hbase'), owner='ams', type='directory', action=['create_on_execute'], mode=0o775) + params.HdfsResource(format('{hdfs_path_prefix}/hdp'), owner='hdfs', type='directory', action=['create_on_execute'], mode=0o755) + params.HdfsResource(format('{hdfs_path_prefix}/user/spark'), owner='spark', group='hadoop', type='directory', action=['create_on_execute'], mode=0o775) + params.HdfsResource(format('{hdfs_path_prefix}/user/livy'), owner='livy', group='hadoop', type='directory', action=['create_on_execute'], mode=0o775) + params.HdfsResource(format('{hdfs_path_prefix}/hdp/spark-events'), owner='spark', group='hadoop', type='directory', action=['create_on_execute'], mode=0o777) + params.HdfsResource(format('{hdfs_path_prefix}/hdp/spark2-events'), owner='spark', group='hadoop', type='directory', action=['create_on_execute'], mode=0o777) params.HdfsResource(format('{hdfs_path_prefix}/hbase'), owner='hbase', type='directory', action=['create_on_execute']) - params.HdfsResource(format('{hdfs_path_prefix}/apps/hbase/staging'), owner='hbase', type='directory', action=['create_on_execute'], mode=0711) - params.HdfsResource(format('{hdfs_path_prefix}/user/hbase'), owner='hbase', type='directory', action=['create_on_execute'], mode=0755) + params.HdfsResource(format('{hdfs_path_prefix}/apps/hbase/staging'), owner='hbase', type='directory', action=['create_on_execute'], mode=0o711) + params.HdfsResource(format('{hdfs_path_prefix}/user/hbase'), owner='hbase', type='directory', action=['create_on_execute'], mode=0o755) params.HdfsResource(format('{hdfs_path_prefix}/apps/zeppelin'), owner='zeppelin', group='hadoop', type='directory', action=['create_on_execute']) params.HdfsResource(format('{hdfs_path_prefix}/user/zeppelin'), owner='zeppelin', group='hadoop', type='directory', action=['create_on_execute']) params.HdfsResource(format('{hdfs_path_prefix}/user/zeppelin/test'), owner='zeppelin', group='hadoop', type='directory', action=['create_on_execute']) @@ -315,7 +315,7 @@ def putCreatedHdfsResourcesToIgnore(env): def putSQLDriverToOozieShared(): params.HdfsResource(hdfs_path_prefix + '/user/oozie/share/lib/sqoop/{0}'.format(sql_driver_filename), - owner='hdfs', type='file', action=['create_on_execute'], mode=0644, source=options.sql_driver_path) + owner='hdfs', type='file', action=['create_on_execute'], mode=0o644, source=options.sql_driver_path) def create_yarn_service_tarball(): """ @@ -342,13 +342,13 @@ def create_yarn_service_tarball(): Directory('/var/lib/ambari-agent/tmp/hadoop_java_io_tmpdir', owner=params.hdfs_user, group=params.user_group, - mode=01777 + mode=0o1777 ) Directory('/var/log/hadoop', create_parents = True, owner='root', group=params.user_group, - mode=0775, + mode=0o775, cd_access='a', ) Directory('/var/run/hadoop', @@ -368,7 +368,7 @@ def create_yarn_service_tarball(): ) Directory('/tmp/hbase-hbase', owner='hbase', - mode=0775, + mode=0o775, create_parents = True, cd_access="a", ) @@ -396,7 +396,7 @@ def create_yarn_service_tarball(): ) File(hashcode_file, - mode = 0644, + mode = 0o644, ) prepare_war(params) @@ -461,13 +461,13 @@ def create_yarn_service_tarball(): # format("{oozie_shared_lib}/lib"), # format("{oozie_shared_lib}/lib_{millis}")), # sudo=True) - except Exception, e: + except Exception as e: Logger.warning('Exception occurred while preparing oozie share lib: '+ repr(e)) params.HdfsResource(format("{oozie_hdfs_user_dir}/share"), action="create_on_execute", type = 'directory', - mode=0755, + mode=0o755, recursive_chmod = True, owner=oozie_user, source = oozie_shared_lib @@ -494,7 +494,7 @@ def create_yarn_service_tarball(): # jar shouldn't be used before (read comment below) File(format("{ambari_libs_dir}/fast-hdfs-resource.jar"), - mode=0644, + mode=0o644, content=StaticFile("/var/lib/ambari-agent/cache/stack-hooks/before-START/files/fast-hdfs-resource.jar") ) # Create everything in one jar call (this is fast). diff --git a/ambari-server/src/main/resources/scripts/add_service_api.py b/ambari-server/src/main/resources/scripts/add_service_api.py index 65faee7b767..321b8c6bd2d 100644 --- a/ambari-server/src/main/resources/scripts/add_service_api.py +++ b/ambari-server/src/main/resources/scripts/add_service_api.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -72,7 +72,7 @@ def main(): # assign components to hosts for x in COMPONENTS_TO_HOSTS: - for component, host in x.iteritems(): + for component, host in x.items(): checked_call('curl -H \'X-Requested-By:anything\' -i -X POST -d \'{{"host_components":[{{"HostRoles":{{"component_name":"{component}"}}}}]}}\' -u admin:admin {server_url}/api/v1/clusters/{cluster_name}/hosts?Hosts/host_name={host}'. format(host=host, component=component, server_url=SERVER_URL, cluster_name=CLUSTER_NAME)) @@ -90,29 +90,29 @@ def main(): config = configs[site_name] config[x['StackConfigurations']['property_name']] = x['StackConfigurations']['property_value'] - for site_name, site_content in configs.iteritems(): + for site_name, site_content in configs.items(): code = call('/var/lib/ambari-server/resources/scripts/configs.sh get {hostname} {cluster_name} {site_name}'.format(hostname=HOSTNAME, cluster_name=CLUSTER_NAME, site_name=site_name))[0] if code: - print "Adding new site: "+site_name + print("Adding new site: "+site_name) checked_call('curl -i -H \'X-Requested-By:anything\' -X PUT -d \'{{"Clusters":{{"desired_configs":{{"type":"{site_name}","tag":"version1","properties":{site_content}}}}}}}\' -u admin:admin {server_url}/api/v1/clusters/{cluster_name}'.format(site_name=site_name, site_content=json.dumps(site_content), server_url=SERVER_URL, cluster_name=CLUSTER_NAME)) else: timestamp = int(time.time()) - print "Modifiying site: "+site_name+" version"+str(timestamp) + print("Modifiying site: "+site_name+" version"+str(timestamp)) checked_call('/var/lib/ambari-server/resources/scripts/configs.sh get {hostname} {cluster_name} {site_name} /tmp/current_site.json'.format(hostname=HOSTNAME, cluster_name=CLUSTER_NAME, site_name=site_name)) with open('/tmp/current_site.json', "r") as f: fcontent = f.read() d = json.loads("{"+fcontent+"}") - for k,v in site_content.iteritems(): + for k,v in site_content.items(): d['properties'][k] = v checked_call('curl -i -H \'X-Requested-By:anything\' -X PUT -d \'{{"Clusters":{{"desired_configs":{{"type":"{site_name}","tag":"version{timestamp}","properties":{site_content}}}}}}}\' -u admin:admin {server_url}/api/v1/clusters/{cluster_name}'.format(site_name=site_name, timestamp=timestamp, site_content=json.dumps(d['properties']), server_url=SERVER_URL, cluster_name=CLUSTER_NAME)) - for site_name, site_configs in CONFIGS_TO_CHANGE.iteritems(): - for config_name, config_value in site_configs.iteritems(): - print "Adding config "+config_name+"="+config_value+" to "+site_name + for site_name, site_configs in CONFIGS_TO_CHANGE.items(): + for config_name, config_value in site_configs.items(): + print("Adding config "+config_name+"="+config_value+" to "+site_name) checked_call('/var/lib/ambari-server/resources/scripts/configs.sh set {hostname} {cluster_name} {site_name} {config_name} {config_value}'.format(config_name=config_name, config_value=config_value, hostname=HOSTNAME, cluster_name=CLUSTER_NAME, site_name=site_name)) diff --git a/ambari-server/src/main/resources/scripts/check_ambari_permissions.py b/ambari-server/src/main/resources/scripts/check_ambari_permissions.py index 8a2f94b80be..d456c1d3b95 100644 --- a/ambari-server/src/main/resources/scripts/check_ambari_permissions.py +++ b/ambari-server/src/main/resources/scripts/check_ambari_permissions.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -20,7 +20,7 @@ import os import shlex -from ambari_commons import subprocess32 +import subprocess import argparse JAR_FILE_PERMISSIONS = 644 @@ -74,7 +74,7 @@ def get_YN_input(prompt, default): def get_choice_string_input(prompt, default, firstChoice, secondChoice): - choice = raw_input(prompt).lower() + choice = input(prompt).lower() if choice in firstChoice: return True elif choice in secondChoice: @@ -82,23 +82,23 @@ def get_choice_string_input(prompt, default, firstChoice, secondChoice): elif choice is "": # Just enter pressed return default else: - print "input not recognized, please try again: " + print("input not recognized, please try again: ") return get_choice_string_input(prompt, default, firstChoice, secondChoice) def check_directory_permissions(dir_path, perm): - print "Checking directory " + dir_path + ":" + print("Checking directory " + dir_path + ":") directories_with_wrong_permissions = [] # check directory permissions directories_with_wrong_permissions = [] if os.path.exists(dir_path): (retcode, stdout, stderr) = os_run_os_command("find " + str(dir_path) + " -type d -perm " + str(perm)) if retcode > 0: - print "ERROR: failed to check permissions for directory " + str(dir_path) + ": " + str(stderr) + "\n" + print("ERROR: failed to check permissions for directory " + str(dir_path) + ": " + str(stderr) + "\n") if stdout and not stdout == "": directories_with_wrong_permissions = directories_with_wrong_permissions + stdout.splitlines() else: - print "ERROR: directory " + dir_path + " doesn't exist!\n" + print("ERROR: directory " + dir_path + " doesn't exist!\n") return directories_with_wrong_permissions @@ -108,22 +108,22 @@ def check_files_in_directory_or_file_for_permissions(path, perm): if os.path.exists(path): if os.path.isdir(path): # check files in directory - print "Checking files in directory " + path + print("Checking files in directory " + path) (retcode, stdout, stderr) = os_run_os_command("find " + str(path) + " -type f -perm " + str(perm)) if retcode > 0: - print "ERROR: failed to check permissions for files in " + str(path) + ": " + str(stderr) + "\n" + print("ERROR: failed to check permissions for files in " + str(path) + ": " + str(stderr) + "\n") elif os.path.isfile(path): # check file for permissions - print "Checking file " + path + ":" + print("Checking file " + path + ":") (retcode, stdout, stderr) = os_run_os_command("find " + str(path) + " -type f -perm " + str(perm)) if retcode > 0: - print "ERROR: failed to check permissions for directory " + str(path) + ": " + str(stderr) + "\n" + print("ERROR: failed to check permissions for directory " + str(path) + ": " + str(stderr) + "\n") if stdout and not stdout == "": files_with_wrong_permissions = files_with_wrong_permissions + stdout.splitlines() else: - print "ERROR: directory/file " + path + " doesn't exist!\n" + print("ERROR: directory/file " + path + " doesn't exist!\n") return files_with_wrong_permissions @@ -135,106 +135,107 @@ def update_permissions(list_of_paths, permissions, ask_msg): for path in list_of_paths: (retcode, stdout, stderr) = os_run_os_command("chmod " + str(permissions) + " " + str(path)) if retcode > 0: - print "ERROR: failed to update permissions" + str(permissions) + " for " + str(path) + ": " + str(stderr) + "\n" + print("ERROR: failed to update permissions" + str(permissions) + " for " + str(path) + ": " + str(stderr) + "\n") def print_paths_with_wrong_permissions(list_of_paths): for path in list_of_paths: (retcode, stdout, stderr) = os_run_os_command("stat -c \"%A %a %n\" " + str(path)) if retcode > 0: - print "ERROR: failed to get permissions for path " + str(path) + ": " + str(stderr) + "\n" + print("ERROR: failed to get permissions for path " + str(path) + ": " + str(stderr) + "\n") else: - print str(stdout).rstrip("\n") + print(str(stdout).rstrip("\n")) def do_work(args): - print "\n*****Check file, or files in directory for valid permissions (without w for group and other)*****" + print("\n*****Check file, or files in directory for valid permissions (without w for group and other)*****") files_with_wrong_permissions = [] for path in files_to_check: path = os.path.join(args.ambari_root_dir, path.lstrip('/')) files_with_wrong_permissions = files_with_wrong_permissions + check_files_in_directory_or_file_for_permissions(path, "/g=w,o=w") if files_with_wrong_permissions: - print "\nFiles with wrong permissions:" + print("\nFiles with wrong permissions:") print_paths_with_wrong_permissions(files_with_wrong_permissions) update_permissions(files_with_wrong_permissions, FILE_PERMISSIONS, "Fix permissions for files to " + str(FILE_PERMISSIONS) + " (recommended) ") - print "\n*****Check ambari jar file, or files in directory, for valid permissions (without w+x for group and other)*****" + print("\n*****Check ambari jar file, or files in directory, for valid permissions (without w+x for group and other)*****") jar_files_with_wrong_permissions = [] for jar_path in jar_files_to_check: jar_path = os.path.join(args.ambari_root_dir, jar_path.lstrip('/')) if os.path.exists(jar_path): if os.path.isdir(jar_path): # check files in directory for permissions - print "Checking jars in " + str(jar_path) + print("Checking jars in " + str(jar_path)) (retcode, stdout, stderr) = os_run_os_command("find " + str(jar_path) + " -type f -name *.jar -perm /g=w+x,o=w+x") if retcode > 0: - print "ERROR: failed to check permissions for jar files in " + str(jar_path) + ": " + str(stderr) + "\n" + print("ERROR: failed to check permissions for jar files in " + str(jar_path) + ": " + str(stderr) + "\n") elif os.path.isfile(jar_path): # check file for permissions - print "Checking jar " + str(jar_path) + print("Checking jar " + str(jar_path)) (retcode, stdout, stderr) = os_run_os_command("find " + str(jar_path) + " -type f -perm /g=w+x,o=w+x") if retcode > 0: - print "ERROR: failed to check permissions for file " + str(jar_path) + ": " + str(stderr) + "\n" + print("ERROR: failed to check permissions for file " + str(jar_path) + ": " + str(stderr) + "\n") if stdout and not stdout == "": jar_files_with_wrong_permissions = jar_files_with_wrong_permissions + stdout.splitlines() else: - print "ERROR: directory " + jar_path + " doesn't exist!\n" + print("ERROR: directory " + jar_path + " doesn't exist!\n") if jar_files_with_wrong_permissions: - print "\nJar files with wrong permissions:" + print("\nJar files with wrong permissions:") print_paths_with_wrong_permissions(jar_files_with_wrong_permissions) update_permissions(jar_files_with_wrong_permissions, JAR_FILE_PERMISSIONS, "Fix permissions for jar files to " + str(JAR_FILE_PERMISSIONS) + " (recommended) ") - print "\n*****Check directories for valid permissions (without w for group and other)*****" + print("\n*****Check directories for valid permissions (without w for group and other)*****") directories_with_wrong_permissions = [] for dir_path in directories_to_check: dir_path = os.path.join(args.ambari_root_dir, dir_path.lstrip('/')) directories_with_wrong_permissions = directories_with_wrong_permissions + check_directory_permissions(dir_path, "/g=w,o=w") if directories_with_wrong_permissions: - print "\nDirectories with wrong permissions:" + print("\nDirectories with wrong permissions:") print_paths_with_wrong_permissions(directories_with_wrong_permissions) update_permissions(directories_with_wrong_permissions, DIRECTORY_PERMISSIONS, "Fix permissions for directories to " + str(DIRECTORY_PERMISSIONS) + " (recommended) ") - print "\n*****Check secure directories for valid permissions (without r+w+x for group and other)*****" + print("\n*****Check secure directories for valid permissions (without r+w+x for group and other)*****") secure_directories_with_wrong_permissions = [] for dir_path in secure_directories_to_check: dir_path = os.path.join(args.ambari_root_dir, dir_path.lstrip('/')) secure_directories_with_wrong_permissions = secure_directories_with_wrong_permissions + check_directory_permissions(dir_path, "/g=r+w+x,o=r+w+x") if secure_directories_with_wrong_permissions: - print "\nSecure directories with wrong permissions:" + print("\nSecure directories with wrong permissions:") print_paths_with_wrong_permissions(secure_directories_with_wrong_permissions) update_permissions(secure_directories_with_wrong_permissions, SECURE_DIRECTORY_PERMISSIONS, "Fix permissions for secure directories to " + str(SECURE_DIRECTORY_PERMISSIONS) + " (recommended) ") - print "\n*****Check secure file, or files in directory for valid permissions (without r+w+x for group and other)*****" + print("\n*****Check secure file, or files in directory for valid permissions (without r+w+x for group and other)*****") secure_files_with_wrong_permissions = [] for path in secure_files_to_check: path = os.path.join(args.ambari_root_dir, path.lstrip('/')) secure_files_with_wrong_permissions = secure_files_with_wrong_permissions + check_files_in_directory_or_file_for_permissions(path, "/g=r+w+x,o=r+w+x") if secure_files_with_wrong_permissions: - print "\nSecure files with wrong permissions:" + print("\nSecure files with wrong permissions:") print_paths_with_wrong_permissions(secure_files_with_wrong_permissions) update_permissions(secure_files_with_wrong_permissions, SECURE_FILE_PERMISSIONS, "Fix permissions for secure files to " + str(SECURE_FILE_PERMISSIONS) + " (recommended) ") - print "\nCheck completed." + print("\nCheck completed.") def os_run_os_command(cmd, env=None, shell=False, cwd=None): if type(cmd) == str: cmd = shlex.split(cmd) - process = subprocess32.Popen(cmd, - stdout=subprocess32.PIPE, - stdin=subprocess32.PIPE, - stderr=subprocess32.PIPE, + process = subprocess.Popen(cmd, + stdout=subprocess.PIPE, + stdin=subprocess.PIPE, + stderr=subprocess.PIPE, env=env, cwd=cwd, - shell=shell + shell=shell, + universal_newlines=True ) (stdoutdata, stderrdata) = process.communicate() diff --git a/ambari-server/src/main/resources/scripts/cluster_blueprint.py b/ambari-server/src/main/resources/scripts/cluster_blueprint.py index e73825d45d4..48b07c1a75b 100644 --- a/ambari-server/src/main/resources/scripts/cluster_blueprint.py +++ b/ambari-server/src/main/resources/scripts/cluster_blueprint.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -25,7 +25,7 @@ import optparse import getpass import logging -import urllib2 +import urllib.request, urllib.error, urllib.parse import re import json import base64 @@ -58,16 +58,16 @@ def get_validated_string_input(prompt, default, pattern, description, input = "" while not input: if SILENT: - print (prompt) + print(prompt) input = default elif is_pass: input = getpass.getpass(prompt) else: - input = raw_input(prompt) + input = input(prompt) if not input.strip(): # Empty input - if default available use default if not allowEmpty and not default: - print 'Property cannot be blank.' + print('Property cannot be blank.') input = "" continue else: @@ -79,7 +79,7 @@ def get_validated_string_input(prompt, default, pattern, description, break # done here and picking up default else: if not pattern == None and not re.search(pattern, input.strip()): - print description + print(description) input = "" if validatorFunction: @@ -114,10 +114,10 @@ def get_server_info(silent=False): pass -class PreemptiveBasicAuthHandler(urllib2.BaseHandler): +class PreemptiveBasicAuthHandler(urllib.request.BaseHandler): def __init__(self): - password_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm() + password_mgr = urllib.request.HTTPPasswordMgrWithDefaultRealm() password_mgr.add_password(None, getUrl(''), USERNAME, PASSWORD) self.passwd = password_mgr self.add_password = self.passwd.add_password @@ -127,7 +127,7 @@ def http_request(self, req): user = USERNAME pw = PASSWORD raw = "%s:%s" % (user, pw) - auth = 'Basic %s' % base64.b64encode(raw).strip() + auth = 'Basic %s' % base64.b64encode(raw.encode()).decode().strip() req.add_unredirected_header('Authorization', auth) return req @@ -135,9 +135,9 @@ class AmbariBlueprint: def __init__(self): handler = PreemptiveBasicAuthHandler() - opener = urllib2.build_opener(handler) + opener = urllib.request.build_opener(handler) # Install opener for all requests - urllib2.install_opener(opener) + urllib.request.install_opener(opener) self.urlOpener = opener def importBlueprint(self, blueprintLocation, hostsLocation, clusterName): @@ -362,7 +362,7 @@ def exportBlueprint(self, clusterName, exportFilePath): def performPostOperation(self, url, data): - req = urllib2.Request(url, data) + req = urllib.request.Request(url, data) req.add_header("X-Requested-By", "ambari_scripts") req.get_method = lambda: 'POST' @@ -379,13 +379,13 @@ def performPostOperation(self, url, data): return retCode pass pass - except urllib2.HTTPError, e: + except urllib.error.HTTPError as e: logger.error("POST request failed.") logger.error('HTTPError : %s' % e.read()) if e.code == 409: return '409' pass - except Exception, e: + except Exception as e: logger.error("POST request failed.") logger.error(e) if 'HTTP Error 409' in str(e): diff --git a/ambari-server/src/main/resources/scripts/configs.py b/ambari-server/src/main/resources/scripts/configs.py index 44be04bec87..8a1f071b1fc 100644 --- a/ambari-server/src/main/resources/scripts/configs.py +++ b/ambari-server/src/main/resources/scripts/configs.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -22,7 +22,7 @@ from optparse import OptionGroup from collections import OrderedDict import sys -import urllib2, ssl +import urllib.request, urllib.error, urllib.parse, ssl import time import json import base64 @@ -80,20 +80,20 @@ def api_accessor(host, login, password, protocol, port, unsafe=None): def do_request(api_url, request_type=GET_REQUEST_TYPE, request_body=''): try: url = '{0}://{1}:{2}{3}'.format(protocol, host, port, api_url) - admin_auth = base64.encodestring('%s:%s' % (login, password)).replace('\n', '') - request = urllib2.Request(url) + admin_auth = base64.encodebytes(('%s:%s' % (login, password)).encode()).decode().replace('\n', '') + request = urllib.request.Request(url) request.add_header('Authorization', 'Basic %s' % admin_auth) request.add_header('X-Requested-By', 'ambari') - request.add_data(request_body) + request.data=json.dumps(request_body) request.get_method = lambda: request_type if unsafe: ctx = ssl.create_default_context() ctx.check_hostname = False ctx.verify_mode = ssl.CERT_NONE - response = urllib2.urlopen(request, context=ctx) + response = urllib.request.urlopen(request, context=ctx) else: - response = urllib2.urlopen(request) + response = urllib.request.urlopen(request) response_body = response.read() except Exception as exc: @@ -161,7 +161,7 @@ def read_xml_data_to_map(path): properties_attributes = {} tree = ET.parse(path) root = tree.getroot() - for properties in root.getiterator('property'): + for properties in root.iter('property'): name = properties.find('name') value = properties.find('value') final = properties.find('final') @@ -218,7 +218,7 @@ def output(config): return output def output_to_console(config): - print json.dumps(config, indent=2) + print(json.dumps(config, indent=2)) def get_config(cluster, config_type, accessor, output): properties, attributes = get_current_config(cluster, config_type, accessor) @@ -316,7 +316,7 @@ def main(): try: with open(options.credentials_file) as credentials_file: file_content = credentials_file.read() - login_lines = filter(None, file_content.splitlines()) + login_lines = [_f for _f in file_content.splitlines() if _f] if len(login_lines) == 2: user = login_lines[0] password = login_lines[1] diff --git a/ambari-server/src/main/resources/scripts/export_ams_metrics.py b/ambari-server/src/main/resources/scripts/export_ams_metrics.py index b492a8cfef6..f38d71ec0e1 100644 --- a/ambari-server/src/main/resources/scripts/export_ams_metrics.py +++ b/ambari-server/src/main/resources/scripts/export_ams_metrics.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -21,7 +21,7 @@ import sys import os import logging -import urllib2 +import urllib.request, urllib.error, urllib.parse import json import datetime import time @@ -94,10 +94,10 @@ def setup_logger(verbose, log_file): @staticmethod def get_data_from_url(collector_uri): - req = urllib2.Request(collector_uri) + req = urllib.request.Request(collector_uri) connection = None try: - connection = urllib2.urlopen(req) + connection = urllib.request.urlopen(req) except Exception as e: logger.error('Error on metrics GET request: %s' % collector_uri) logger.error(str(e)) @@ -376,7 +376,7 @@ def main(): d = datetime.datetime.now() time_suffix = '{0}-{1}-{2}-{3}-{4}-{5}'.format(d.year, d.month, d.day, d.hour, d.minute, d.second) - print 'Time: %s' % time_suffix + print('Time: %s' % time_suffix) logfile = os.path.join('/tmp', 'ambari_metrics_export.out') diff --git a/ambari-server/src/main/resources/scripts/stack_advisor.py b/ambari-server/src/main/resources/scripts/stack_advisor.py index 5ae21285d65..03896fc2256 100755 --- a/ambari-server/src/main/resources/scripts/stack_advisor.py +++ b/ambari-server/src/main/resources/scripts/stack_advisor.py @@ -151,10 +151,10 @@ def instantiateStackAdvisor(stackName, stackVersion, parentVersions): """Instantiates StackAdvisor implementation for the specified Stack""" import imp - with open(AMBARI_CONFIGURATION_PATH, 'rb') as fp: + with open(AMBARI_CONFIGURATION_PATH, 'r') as fp: imp.load_module('ambari_configuration', fp, AMBARI_CONFIGURATION_PATH, ('.py', 'rb', imp.PY_SOURCE)) - with open(STACK_ADVISOR_PATH, 'rb') as fp: + with open(STACK_ADVISOR_PATH, 'r') as fp: default_stack_advisor = imp.load_module('stack_advisor', fp, STACK_ADVISOR_PATH, ('.py', 'rb', imp.PY_SOURCE)) className = STACK_ADVISOR_DEFAULT_IMPL_CLASS stack_advisor = default_stack_advisor @@ -167,21 +167,21 @@ def instantiateStackAdvisor(stackName, stackVersion, parentVersions): path = STACK_ADVISOR_IMPL_PATH_TEMPLATE.format(stackName, version) if os.path.isfile(path): - with open(path, 'rb') as fp: + with open(path, 'r') as fp: stack_advisor = imp.load_module('stack_advisor_impl', fp, path, ('.py', 'rb', imp.PY_SOURCE)) className = STACK_ADVISOR_IMPL_CLASS_TEMPLATE.format(stackName, version.replace('.', '')) - print "StackAdvisor implementation for stack {0}, version {1} was loaded".format(stackName, version) + print("StackAdvisor implementation for stack {0}, version {1} was loaded".format(stackName, version)) except IOError: # file not found traceback.print_exc() - print "StackAdvisor implementation for stack {0}, version {1} was not found".format(stackName, version) + print("StackAdvisor implementation for stack {0}, version {1} was not found".format(stackName, version)) try: clazz = getattr(stack_advisor, className) - print "Returning " + className + " implementation" + print("Returning " + className + " implementation") return clazz() except Exception as e: traceback.print_exc() - print "Returning default implementation" + print("Returning default implementation") return default_stack_advisor.DefaultStackAdvisor() @@ -190,10 +190,10 @@ def instantiateStackAdvisor(stackName, stackVersion, parentVersions): main(sys.argv) except StackAdvisorException as stack_exception: traceback.print_exc() - print "Error occured in stack advisor.\nError details: {0}".format(str(stack_exception)) + print("Error occured in stack advisor.\nError details: {0}".format(str(stack_exception))) sys.exit(1) except Exception as e: traceback.print_exc() - print "Error occured in stack advisor.\nError details: {0}".format(str(e)) + print("Error occured in stack advisor.\nError details: {0}".format(str(e))) sys.exit(2) diff --git a/ambari-server/src/main/resources/scripts/takeover_config_merge.py b/ambari-server/src/main/resources/scripts/takeover_config_merge.py index 7de94129ac1..e94dca6a562 100644 --- a/ambari-server/src/main/resources/scripts/takeover_config_merge.py +++ b/ambari-server/src/main/resources/scripts/takeover_config_merge.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -28,8 +28,8 @@ import time import xml import xml.etree.ElementTree as ET -import StringIO -import ConfigParser +import io +import configparser from optparse import OptionGroup logger = logging.getLogger('AmbariTakeoverConfigMerge') @@ -84,7 +84,7 @@ def read_data_to_map(self, path): configurations = {} with open(path, 'r') as file: try: - for name, value in yaml.load(file).iteritems(): + for name, value in yaml.load(file).items(): if name != None: configurations[name] = str(value) except: @@ -97,17 +97,17 @@ def read_data_to_map(self, path): configurations = {} try : #Adding dummy section to properties file content for use ConfigParser - properties_file_content = StringIO.StringIO() + properties_file_content = io.StringIO() properties_file_content.write('[dummysection]\n') properties_file_content.write(open(path).read()) properties_file_content.seek(0, os.SEEK_SET) - cp = ConfigParser.ConfigParser() + cp = configparser.ConfigParser() cp.optionxform = str cp.readfp(properties_file_content) for section in cp._sections: - for name, value in cp._sections[section].iteritems(): + for name, value in cp._sections[section].items(): if name != None: configurations[name] = value del configurations['__name__'] @@ -190,7 +190,7 @@ def get_all_supported_files_grouped_by_name(extensions=SUPPORTED_EXTENSIONS, dir config_name = None if ConfigMerge.UNKNOWN_FILES_MAPPING_FILE: - for path_regex, name in ConfigMerge.CONTENT_UNKNOWN_FILES_MAPPING_FILE.iteritems(): + for path_regex, name in ConfigMerge.CONTENT_UNKNOWN_FILES_MAPPING_FILE.items(): match = re.match(path_regex, os.path.relpath(file_path, ConfigMerge.INPUT_DIR)) if match: config_name = name @@ -218,8 +218,8 @@ def merge_configurations(filepath_to_configurations): property_name_to_value_to_filepaths = {} merged_configurations = {} - for path, configurations in filepath_to_configurations.iteritems(): - for configuration_name, value in configurations.iteritems(): + for path, configurations in filepath_to_configurations.items(): + for configuration_name, value in configurations.items(): if not configuration_name in property_name_to_value_to_filepaths: property_name_to_value_to_filepaths[configuration_name] = {} if not value in property_name_to_value_to_filepaths[configuration_name]: @@ -234,7 +234,7 @@ def merge_configurations(filepath_to_configurations): @staticmethod def format_for_blueprint(configurations, attributes): all_configs = [] - for configuration_type, configuration_properties in configurations.iteritems(): + for configuration_type, configuration_properties in configurations.items(): is_content = False all_configs.append({}) @@ -245,13 +245,13 @@ def format_for_blueprint(configurations, attributes): if is_content: content = LICENSE - for property_name, property_value in configuration_properties.iteritems(): + for property_name, property_value in configuration_properties.items(): content+=property_name + "=" + property_value + "\n" all_configs[-1][configuration_type] = {'properties': {"content" : content}} else: all_configs[-1][configuration_type] = {'properties' :configuration_properties} - for configuration_type_attributes, properties_attributes in attributes.iteritems(): + for configuration_type_attributes, properties_attributes in attributes.items(): if properties_attributes and configuration_type == configuration_type_attributes: all_configs[-1][configuration_type].update({"properties_attributes" : {"final" : properties_attributes}}) @@ -264,12 +264,12 @@ def format_for_blueprint(configurations, attributes): @staticmethod def format_conflicts_output(property_name_to_value_to_filepaths): output = "" - for property_name, value_to_filepaths in property_name_to_value_to_filepaths.iteritems(): + for property_name, value_to_filepaths in property_name_to_value_to_filepaths.items(): if len(value_to_filepaths) == 1: continue first_item = False - for value, filepaths in value_to_filepaths.iteritems(): + for value, filepaths in value_to_filepaths.items(): if not first_item: first_item = True output += "\n\n=== {0} | {1} | {2} |\nHas conflicts with:\n\n".format(property_name,filepaths[0], value) @@ -283,7 +283,7 @@ def perform_merge(self): result_configurations = {} result_property_attributes = {} has_conflicts = False - for filename, paths_and_parsers in self.config_files_map.iteritems(): + for filename, paths_and_parsers in self.config_files_map.items(): filepath_to_configurations = {} filepath_to_property_attributes = {} configuration_type = os.path.splitext(filename)[0] @@ -380,14 +380,14 @@ def format_diff_output(file_conflicts, configurations_conflicts, attributes_conf if configurations_conflicts: output += "\n\n======= Property diff conflicts ====== " - for config_name, property in configurations_conflicts.iteritems(): + for config_name, property in configurations_conflicts.items(): if property: output+= "\n\n||| " + config_name + " |||\n" output+= "\n".join(str(p) for p in property) if attributes_conflicts: output += "\n\n======= Final attribute diff conflicts ====== " - for config_name, property_with_attribute in attributes_conflicts.iteritems(): + for config_name, property_with_attribute in attributes_conflicts.items(): if property_with_attribute: output+= "\n\n||| " + config_name + " |||\n" output+= "\n".join(str(p) for p in property_with_attribute) @@ -426,8 +426,8 @@ def configuration_diff(left, right): def get_conflicts_and_matches(left_items, right_items, left_path, right_path): matches = [] conflicts = [] - for left_key, left_value in left_items.iteritems(): - for right_key, right_value in right_items.iteritems(): + for left_key, left_value in left_items.items(): + for right_key, right_value in right_items.items(): if left_key == right_key: matches.append(right_key) if left_value != right_value: @@ -437,7 +437,7 @@ def get_conflicts_and_matches(left_items, right_items, left_path, right_path): @staticmethod def get_missing_attributes(attributes, matches, file_path): conflicts = [] - for key, value in attributes.iteritems(): + for key, value in attributes.items(): if not key in matches: conflicts.append({key : "Final attribute is missing in {0} file".format(file_path)}) return conflicts @@ -445,7 +445,7 @@ def get_missing_attributes(attributes, matches, file_path): @staticmethod def get_missing_properties(configurations, matches, file_path): conflicts = [] - for key, value in configurations.iteritems(): + for key, value in configurations.items(): if not key in matches: conflicts.append({key : "Property is missing in {0} file".format(file_path)}) return conflicts diff --git a/ambari-server/src/main/resources/stack-hooks/after-INSTALL/scripts/params.py b/ambari-server/src/main/resources/stack-hooks/after-INSTALL/scripts/params.py index 472ca1fd720..6f93a694b7f 100644 --- a/ambari-server/src/main/resources/stack-hooks/after-INSTALL/scripts/params.py +++ b/ambari-server/src/main/resources/stack-hooks/after-INSTALL/scripts/params.py @@ -29,7 +29,6 @@ from resource_management.libraries.functions import format_jvm_option from resource_management.libraries.functions.version import format_stack_version, get_major_version from resource_management.libraries.functions.format import format -from string import lower config = Script.get_config() tmp_dir = Script.get_tmp_dir() diff --git a/ambari-server/src/main/resources/stack-hooks/after-INSTALL/scripts/shared_initialization.py b/ambari-server/src/main/resources/stack-hooks/after-INSTALL/scripts/shared_initialization.py index 91e91a9372f..6605d2d349a 100644 --- a/ambari-server/src/main/resources/stack-hooks/after-INSTALL/scripts/shared_initialization.py +++ b/ambari-server/src/main/resources/stack-hooks/after-INSTALL/scripts/shared_initialization.py @@ -97,7 +97,7 @@ def setup_config(): ) Directory(params.logsearch_logfeeder_conf, - mode=0755, + mode=0o755, cd_access='a', create_parents=True ) @@ -139,7 +139,7 @@ def link_configs(struct_out_file): if not params.sysprep_skip_conf_select or not os.path.exists(params.conf_select_marker_file): # On parallel command execution this should be executed by a single process at a time. with FcntlBasedProcessLock(params.link_configs_lock_file, enabled = params.is_parallel_execution_enabled, skip_fcntl_failures = True): - for package_name, directories in conf_select.get_package_dirs().iteritems(): + for package_name, directories in conf_select.get_package_dirs().items(): conf_select.convert_conf_directories_to_symlinks(package_name, json_version, directories) # create a file to mark that conf-selects were already done diff --git a/ambari-server/src/main/resources/stack-hooks/before-ANY/scripts/params.py b/ambari-server/src/main/resources/stack-hooks/before-ANY/scripts/params.py index e13023bb72f..41751383ecb 100644 --- a/ambari-server/src/main/resources/stack-hooks/before-ANY/scripts/params.py +++ b/ambari-server/src/main/resources/stack-hooks/before-ANY/scripts/params.py @@ -234,7 +234,7 @@ def is_secure_port(port): dfs_ha_namemodes_ids_list = [] other_namenode_id = None -for ns, dfs_ha_namenode_ids in dfs_ha_namenode_ids_all_ns.iteritems(): +for ns, dfs_ha_namenode_ids in dfs_ha_namenode_ids_all_ns.items(): found = False if not is_empty(dfs_ha_namenode_ids): dfs_ha_namemodes_ids_list = dfs_ha_namenode_ids.split(",") @@ -284,7 +284,7 @@ def is_secure_port(port): #Append new user-group mapping to the dict try: user_group_map = ast.literal_eval(config['clusterLevelParams']['user_groups']) - for key in user_group_map.iterkeys(): + for key in user_group_map.keys(): user_to_groups_dict[key] = user_group_map[key] except ValueError: print('User Group mapping (user_group) is missing in the hostLevelParams') diff --git a/ambari-server/src/main/resources/stack-hooks/before-ANY/scripts/shared_initialization.py b/ambari-server/src/main/resources/stack-hooks/before-ANY/scripts/shared_initialization.py index 335b1c45e5d..0f800a68f3f 100644 --- a/ambari-server/src/main/resources/stack-hooks/before-ANY/scripts/shared_initialization.py +++ b/ambari-server/src/main/resources/stack-hooks/before-ANY/scripts/shared_initialization.py @@ -63,7 +63,7 @@ def setup_users(): if params.has_hbase_masters: Directory (params.hbase_tmp_dir, owner = params.hbase_user, - mode=0775, + mode=0o775, create_parents = True, cd_access="a", ) @@ -116,8 +116,8 @@ def create_users_and_groups(user_and_groups): groups_list = parts[1].strip(",").split(",") if parts[1] else [] # skip creating groups and users if * is provided as value. - users_list = filter(lambda x: x != '*' , users_list) - groups_list = filter(lambda x: x != '*' , groups_list) + users_list = [x for x in users_list if x != '*'] + groups_list = [x for x in groups_list if x != '*'] if users_list: User(users_list, @@ -137,7 +137,7 @@ def set_uid(user, user_dirs): File(format("{tmp_dir}/changeUid.sh"), content=StaticFile("changeToSecureUid.sh"), - mode=0555) + mode=0o555) ignore_groupsusers_create_str = str(params.ignore_groupsusers_create).lower() uid = get_uid(user, return_existing=True) Execute(format("{tmp_dir}/changeUid.sh {user} {user_dirs} {new_uid}", new_uid=0 if uid is None else uid), @@ -169,7 +169,7 @@ def get_uid(user, return_existing=False): return None File(format("{tmp_dir}/changeUid.sh"), content=StaticFile("changeToSecureUid.sh"), - mode=0555) + mode=0o555) code, newUid = shell.call(format("{tmp_dir}/changeUid.sh {user}")) return int(newUid) else: @@ -187,14 +187,14 @@ def setup_hadoop_env(): tc_owner = params.hdfs_user # create /etc/hadoop - Directory(params.hadoop_dir, mode=0755) + Directory(params.hadoop_dir, mode=0o755) # write out hadoop-env.sh, but only if the directory exists if os.path.exists(params.hadoop_conf_dir): File(os.path.join(params.hadoop_conf_dir, 'hadoop-env.sh'), owner=tc_owner, group=params.user_group, content=InlineTemplate(params.hadoop_env_sh_template)) - + def setup_env(): import params # Create tmp dir for java.io.tmpdir @@ -202,7 +202,7 @@ def setup_env(): Directory(params.hadoop_java_io_tmpdir, owner=params.hdfs_user if params.has_hdfs_clients else None, group=params.user_group, - mode=01777 + mode=0o1777 ) def setup_java(): @@ -239,7 +239,7 @@ def __setup_java(custom_java_home, custom_jdk_name): ) File(jdk_curl_target, - mode = 0755, + mode = 0o755, ) tmp_java_dir = tempfile.mkdtemp(prefix="jdk_tmp_", dir=params.tmp_dir) @@ -266,7 +266,7 @@ def __setup_java(custom_java_home, custom_jdk_name): Directory(tmp_java_dir, action="delete") File(format("{custom_java_home}/bin/java"), - mode=0755, + mode=0o755, cd_access="a", ) Execute(('chmod', '-R', '755', params.java_home), diff --git a/ambari-server/src/main/resources/stack-hooks/before-START/files/topology_script.py b/ambari-server/src/main/resources/stack-hooks/before-START/files/topology_script.py index e026ba77378..44da1699362 100644 --- a/ambari-server/src/main/resources/stack-hooks/before-START/files/topology_script.py +++ b/ambari-server/src/main/resources/stack-hooks/before-START/files/topology_script.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -18,14 +18,8 @@ ''' import sys, os -try: - # Python 2 - from string import join - import ConfigParser -except ImportError: - # Python 3 - join = ' '.join - import configparser as ConfigParser +import configparser + DEFAULT_RACK = "/default-rack" DATA_FILE_NAME = os.path.dirname(os.path.abspath(__file__)) + "/topology_mappings.data" @@ -36,17 +30,17 @@ class TopologyScript(): def load_rack_map(self): try: #RACK_MAP contains both host name vs rack and ip vs rack mappings - mappings = ConfigParser.ConfigParser() + mappings = configparser.ConfigParser() mappings.read(DATA_FILE_NAME) return dict(mappings.items(SECTION_NAME)) - except ConfigParser.NoSectionError: + except configparser.NoSectionError: return {} def get_racks(self, rack_map, args): if len(args) == 1: return DEFAULT_RACK else: - return join([self.lookup_by_hostname_or_ip(input_argument, rack_map) for input_argument in args[1:]],) + return ' '.join([self.lookup_by_hostname_or_ip(input_argument, rack_map) for input_argument in args[1:]],) def lookup_by_hostname_or_ip(self, hostname_or_ip, rack_map): #try looking up by hostname diff --git a/ambari-server/src/main/resources/stack-hooks/before-START/scripts/custom_extensions.py b/ambari-server/src/main/resources/stack-hooks/before-START/scripts/custom_extensions.py index 04299ba68df..b01b4de60f9 100644 --- a/ambari-server/src/main/resources/stack-hooks/before-START/scripts/custom_extensions.py +++ b/ambari-server/src/main/resources/stack-hooks/before-START/scripts/custom_extensions.py @@ -121,7 +121,7 @@ def download_extensions(owner_user, owner_group, hdfs_source_dir, local_target_d extensions_tmp_dir=format("{tmp_dir}/custom_extensions") Directory(local_target_dir, owner="root", - mode=0755, + mode=0o755, group="root", create_parents=True) @@ -130,11 +130,11 @@ def download_extensions(owner_user, owner_group, hdfs_source_dir, local_target_d action="create_on_execute", owner=owner_user, group=owner_group, - mode=0755) + mode=0o755) Directory(extensions_tmp_dir, owner=params.hdfs_user, - mode=0755, + mode=0o755, create_parents=True) # copy from hdfs to /tmp @@ -143,7 +143,7 @@ def download_extensions(owner_user, owner_group, hdfs_source_dir, local_target_d action="download_on_execute", source=hdfs_source_dir, user=params.hdfs_user, - mode=0644, + mode=0o644, replace_existing_files=True) # Execute command is not quoting correctly. diff --git a/ambari-server/src/main/resources/stack-hooks/before-START/scripts/params.py b/ambari-server/src/main/resources/stack-hooks/before-START/scripts/params.py index 139ce60c88a..99781d124ce 100644 --- a/ambari-server/src/main/resources/stack-hooks/before-START/scripts/params.py +++ b/ambari-server/src/main/resources/stack-hooks/before-START/scripts/params.py @@ -300,7 +300,7 @@ hdfs_site = config['configurations']['hdfs-site'] smoke_user = config['configurations']['cluster-env']['smokeuser'] smoke_hdfs_user_dir = format("/user/{smoke_user}") -smoke_hdfs_user_mode = 0770 +smoke_hdfs_user_mode = 0o770 ##### Namenode RPC ports - metrics config section start ##### diff --git a/ambari-server/src/main/resources/stack-hooks/before-START/scripts/rack_awareness.py b/ambari-server/src/main/resources/stack-hooks/before-START/scripts/rack_awareness.py index 48158bb8200..e2eb8d0c458 100644 --- a/ambari-server/src/main/resources/stack-hooks/before-START/scripts/rack_awareness.py +++ b/ambari-server/src/main/resources/stack-hooks/before-START/scripts/rack_awareness.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one @@ -30,7 +30,7 @@ def create_topology_mapping(): content=Template("topology_mappings.data.j2"), owner=params.hdfs_user, group=params.user_group, - mode=0644, + mode=0o644, only_if=format("test -d {net_topology_script_dir}")) def create_topology_script(): @@ -38,7 +38,7 @@ def create_topology_script(): File(params.net_topology_script_file_path, content=StaticFile('topology_script.py'), - mode=0755, + mode=0o755, only_if=format("test -d {net_topology_script_dir}")) def create_topology_script_and_mapping(): diff --git a/ambari-server/src/main/resources/stack-hooks/before-START/scripts/shared_initialization.py b/ambari-server/src/main/resources/stack-hooks/before-START/scripts/shared_initialization.py index eb8e2c54cb6..efceede77e1 100644 --- a/ambari-server/src/main/resources/stack-hooks/before-START/scripts/shared_initialization.py +++ b/ambari-server/src/main/resources/stack-hooks/before-START/scripts/shared_initialization.py @@ -41,7 +41,7 @@ def setup_hadoop(): create_parents = True, owner='root', group=params.user_group, - mode=0775, + mode=0o775, cd_access='a', ) if params.has_namenode: @@ -82,14 +82,14 @@ def setup_hadoop(): log4j_filename = os.path.join(params.hadoop_conf_dir, "log4j.properties") if (params.log4j_props != None): File(log4j_filename, - mode=0644, + mode=0o644, group=params.user_group, owner=params.hdfs_user, content=InlineTemplate(params.log4j_props) ) elif (os.path.exists(format("{params.hadoop_conf_dir}/log4j.properties"))): File(log4j_filename, - mode=0644, + mode=0o644, group=params.user_group, owner=params.hdfs_user, ) @@ -99,11 +99,11 @@ def setup_hadoop(): # if WebHDFS is not enabled we need this jar to create hadoop folders and copy tarballs to HDFS. if params.sysprep_skip_copy_fast_jar_hdfs: - print "Skipping copying of fast-hdfs-resource.jar as host is sys prepped" + print("Skipping copying of fast-hdfs-resource.jar as host is sys prepped") else: # for source-code of jar goto contrib/fast-hdfs-resource File(format("{ambari_libs_dir}/fast-hdfs-resource.jar"), - mode=0644, + mode=0o644, content=StaticFile("fast-hdfs-resource.jar") ) @@ -136,7 +136,7 @@ def setup_configs(): if os.path.exists(params.hadoop_conf_dir): File(params.task_log4j_properties_location, content=StaticFile("task-log4j.properties"), - mode=0755 + mode=0o755 ) if os.path.exists(os.path.join(params.hadoop_conf_dir, 'configuration.xsl')): @@ -165,7 +165,7 @@ def create_dirs(): type="directory", action="create_on_execute", owner=params.hdfs_user, - mode=0777 + mode=0o777 ) params.HdfsResource(params.smoke_hdfs_user_dir, type="directory", @@ -186,7 +186,7 @@ def create_microsoft_r_dir(): type="directory", action="create_on_execute", owner=params.hdfs_user, - mode=0777) + mode=0o777) params.HdfsResource(None, action="execute") except Exception as exception: Logger.warning("Could not check the existence of {0} on DFS while starting {1}, exception: {2}".format(directory, params.current_service, str(exception))) diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/FLINK/package/scripts/flink_history_server.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/FLINK/package/scripts/flink_history_server.py index 0851464f9ed..43718f7b61b 100755 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/FLINK/package/scripts/flink_history_server.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/FLINK/package/scripts/flink_history_server.py @@ -1,4 +1,4 @@ -#!/usr/bin/python +#!/usr/bin/python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/FLINK/package/scripts/flink_service.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/FLINK/package/scripts/flink_service.py index f5cbb20cdac..8d615c42326 100755 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/FLINK/package/scripts/flink_service.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/FLINK/package/scripts/flink_service.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -46,7 +46,7 @@ def flink_service(name, upgrade_type=None, action=None): action="create_on_execute", owner=params.flink_user, group=params.user_group, - mode=0777, + mode=0o777, recursive_chmod=True ) params.HdfsResource(None, action="execute") diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/FLINK/package/scripts/params.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/FLINK/package/scripts/params.py index 8473f10e9fe..1ba7138a9e7 100755 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/FLINK/package/scripts/params.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/FLINK/package/scripts/params.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/FLINK/package/scripts/service_check.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/FLINK/package/scripts/service_check.py index f1bd5502720..4596414f730 100755 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/FLINK/package/scripts/service_check.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/FLINK/package/scripts/service_check.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/FLINK/package/scripts/setup_flink.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/FLINK/package/scripts/setup_flink.py index 86c67d1dcf2..2a6d666ea45 100755 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/FLINK/package/scripts/setup_flink.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/FLINK/package/scripts/setup_flink.py @@ -31,24 +31,24 @@ def setup_flink(env, type, upgrade_type = None, action = None): Directory(params.flink_pid_dir, owner=params.flink_user, group=params.user_group, - mode=0775, + mode=0o775, create_parents = True ) - Directory(params.flink_etc_dir, mode=0755) + Directory(params.flink_etc_dir, mode=0o755) Directory(params.flink_config_dir, owner = params.flink_user, group = params.user_group, create_parents = True) - Directory(params.flink_log_dir,mode=0767) + Directory(params.flink_log_dir,mode=0o767) if type == 'historyserver' and action == 'config': params.HdfsResource(params.flink_hdfs_user_dir, type="directory", action="create_on_execute", owner=params.flink_user, - mode=0775 + mode=0o775 ) params.HdfsResource(None, action="execute") @@ -58,14 +58,14 @@ def setup_flink(env, type, upgrade_type = None, action = None): owner=params.flink_user, group = params.flink_group, content=InlineTemplate(params.flink_conf_template), - mode=0755) + mode=0o755) #create log4j.properties in /etc/conf dir File(os.path.join(params.flink_config_dir, 'log4j.properties'), owner=params.flink_user, group=params.flink_group, content=params.flink_log4j_properties, - mode=0644, + mode=0o644, ) #create log4j-cli.properties in /etc/conf dir @@ -73,7 +73,7 @@ def setup_flink(env, type, upgrade_type = None, action = None): owner=params.flink_user, group=params.flink_group, content=params.flink_log4j_cli_properties, - mode=0644, + mode=0o644, ) #create log4j-console.properties in /etc/conf dir @@ -81,7 +81,7 @@ def setup_flink(env, type, upgrade_type = None, action = None): owner=params.flink_user, group=params.flink_group, content=params.flink_log4j_console_properties, - mode=0644, + mode=0o644, ) #create log4j-session.properties in /etc/conf dir @@ -89,5 +89,5 @@ def setup_flink(env, type, upgrade_type = None, action = None): owner=params.flink_user, group=params.flink_group, content=params.flink_log4j_session_properties, - mode=0644, + mode=0o644, ) diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/FLINK/package/scripts/status_params.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/FLINK/package/scripts/status_params.py index 87bc00b65f3..a2eee370bf0 100755 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/FLINK/package/scripts/status_params.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/FLINK/package/scripts/status_params.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HBASE/package/scripts/__init__.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HBASE/package/scripts/__init__.py index 5561e1087b2..152033a3be5 100755 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HBASE/package/scripts/__init__.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HBASE/package/scripts/__init__.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HBASE/package/scripts/functions.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HBASE/package/scripts/functions.py index f98b9b970d3..d35ce60bb8d 100755 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HBASE/package/scripts/functions.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HBASE/package/scripts/functions.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -35,8 +35,8 @@ def calc_xmn_from_xms(heapsize_str, xmn_percent, xmn_max): heapsize_unit = re.search('\D+',heapsize_str).group(0) xmn_val = int(math.floor(heapsize*xmn_percent)) xmn_val -= xmn_val % 8 - - result_xmn_val = xmn_max if xmn_val > xmn_max else xmn_val + + result_xmn_val = int(xmn_max) if xmn_val > int(xmn_max) else xmn_val return str(result_xmn_val) + heapsize_unit def ensure_unit_for_memory(memory_size): diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HBASE/package/scripts/hbase.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HBASE/package/scripts/hbase.py index f6ff4c7a0ec..85b02c5ac50 100755 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HBASE/package/scripts/hbase.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HBASE/package/scripts/hbase.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -44,7 +44,7 @@ def hbase(name=None): configuration_attributes=params.config['configurationAttributes']['hbase-site'] ) - if params.service_map.has_key(name): + if name in params.service_map: # Manually overriding service logon user & password set by the installation package service_name = params.service_map[name] ServiceConfig(service_name, @@ -61,7 +61,7 @@ def hbase(name=None): lzo_utils.install_lzo_if_needed() Directory( params.etc_prefix_dir, - mode=0755 + mode=0o755 ) Directory( params.hbase_conf_dir, @@ -72,7 +72,7 @@ def hbase(name=None): Directory(params.java_io_tmpdir, create_parents = True, - mode=0777 + mode=0o777 ) # If a file location is specified in ioengine parameter, @@ -87,7 +87,7 @@ def hbase(name=None): owner = params.hbase_user, group = params.user_group, create_parents = True, - mode = 0755 + mode = 0o755 ) parent_dir = os.path.dirname(params.tmp_dir) @@ -124,7 +124,7 @@ def hbase(name=None): owner=params.hbase_user, group=params.user_group, content=params.mount_table_content, - mode=0644 + mode=0o644 ) if 'hdfs-site' in params.config['configurations']: @@ -174,7 +174,7 @@ def hbase(name=None): File(os.path.join(params.limits_conf_dir, 'hbase.conf'), owner='root', group='root', - mode=0644, + mode=0o644, content=Template("hbase.conf.j2") ) @@ -192,28 +192,28 @@ def hbase(name=None): owner = params.hbase_user, create_parents = True, cd_access = "a", - mode = 0755, + mode = 0o755, ) Directory (params.log_dir, owner = params.hbase_user, create_parents = True, cd_access = "a", - mode = 0755, + mode = 0o755, ) generate_logfeeder_input_config('hbase', Template("input.config-hbase.json.j2", extra_imports=[default])) if (params.log4j_props != None): File(format("{params.hbase_conf_dir}/log4j.properties"), - mode=0644, + mode=0o644, group=params.user_group, owner=params.hbase_user, content=InlineTemplate(params.log4j_props) ) elif (os.path.exists(format("{params.hbase_conf_dir}/log4j.properties"))): File(format("{params.hbase_conf_dir}/log4j.properties"), - mode=0644, + mode=0o644, group=params.user_group, owner=params.hbase_user ) @@ -227,14 +227,14 @@ def hbase(name=None): type="directory", action="create_on_execute", owner=params.hbase_user, - mode=0711 + mode=0o711 ) if params.create_hbase_home_directory: params.HdfsResource(params.hbase_home_directory, type="directory", action="create_on_execute", owner=params.hbase_user, - mode=0755 + mode=0o755 ) params.HdfsResource(None, action="execute") diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HBASE/package/scripts/hbase_client.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HBASE/package/scripts/hbase_client.py index b301c7538bf..9527fbd8ff7 100755 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HBASE/package/scripts/hbase_client.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HBASE/package/scripts/hbase_client.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -60,8 +60,8 @@ def pre_upgrade_restart(self, env, upgrade_type=None): try: stack_select.select_packages(params.version) except Exception as e: - print "Ignoring error due to missing phoenix-client" - print str(e) + print("Ignoring error due to missing phoenix-client") + print(str(e)) diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HBASE/package/scripts/hbase_decommission.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HBASE/package/scripts/hbase_decommission.py index 7d69ba7f79c..86701d86cfb 100755 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HBASE/package/scripts/hbase_decommission.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HBASE/package/scripts/hbase_decommission.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -54,11 +54,11 @@ def hbase_decommission(env): File(params.region_drainer, content=StaticFile("draining_servers.rb"), - mode=0755 + mode=0o755 ) File(params.region_drainer2, content=StaticFile("draining_servers2.rb"), - mode=0755 + mode=0o755 ) if params.hbase_excluded_hosts and params.hbase_excluded_hosts.split(","): diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HBASE/package/scripts/hbase_master.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HBASE/package/scripts/hbase_master.py index 43a02d60855..1fe6aa79477 100755 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HBASE/package/scripts/hbase_master.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HBASE/package/scripts/hbase_master.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HBASE/package/scripts/hbase_regionserver.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HBASE/package/scripts/hbase_regionserver.py index 90568f2dfc2..0a291b92b87 100755 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HBASE/package/scripts/hbase_regionserver.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HBASE/package/scripts/hbase_regionserver.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -41,6 +41,7 @@ from resource_management.core.logger import Logger + class HbaseRegionServer(Script): def install(self, env): import params @@ -53,7 +54,7 @@ def configure(self, env): hbase(name='regionserver') def decommission(self, env): - print "Decommission not yet implemented!" + print("Decommission not yet implemented!") def graceful_stop(self, env, upgrade_type=None): import params diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HBASE/package/scripts/hbase_service.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HBASE/package/scripts/hbase_service.py index 1dbd5608756..482f71c83a7 100755 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HBASE/package/scripts/hbase_service.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HBASE/package/scripts/hbase_service.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HBASE/package/scripts/hbase_upgrade.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HBASE/package/scripts/hbase_upgrade.py index e5bb7819aaf..77a65ac721f 100755 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HBASE/package/scripts/hbase_upgrade.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HBASE/package/scripts/hbase_upgrade.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -36,7 +36,7 @@ def take_snapshot(self, env): def restore_snapshot(self, env): import params - print "TODO AMBARI-12698" + print("TODO AMBARI-12698") if __name__ == "__main__": HbaseMasterUpgrade().execute() diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HBASE/package/scripts/params.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HBASE/package/scripts/params.py index e0607f3adf7..ba87813f1af 100755 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HBASE/package/scripts/params.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HBASE/package/scripts/params.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HBASE/package/scripts/params_linux.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HBASE/package/scripts/params_linux.py index 0aab19f0572..f447794c10d 100755 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HBASE/package/scripts/params_linux.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HBASE/package/scripts/params_linux.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HBASE/package/scripts/params_windows.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HBASE/package/scripts/params_windows.py index ddc9e93dce7..0117644abb1 100755 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HBASE/package/scripts/params_windows.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HBASE/package/scripts/params_windows.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HBASE/package/scripts/service_check.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HBASE/package/scripts/service_check.py index f54b29f5b68..96823b12a0c 100755 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HBASE/package/scripts/service_check.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HBASE/package/scripts/service_check.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -55,16 +55,16 @@ def service_check(self, env): File( format("{exec_tmp_dir}/hbaseSmokeVerify.sh"), content = StaticFile("hbaseSmokeVerify.sh"), - mode = 0755 + mode = 0o755 ) File(hbase_servicecheck_cleanup_file, content = StaticFile("hbase-smoke-cleanup.sh"), - mode = 0755 + mode = 0o755 ) File( hbase_servicecheck_file, - mode = 0755, + mode = 0o755, content = Template('hbase-smoke.sh.j2') ) @@ -75,7 +75,7 @@ def service_check(self, env): File( hbase_grant_premissions_file, owner = params.hbase_user, group = params.user_group, - mode = 0755, + mode = 0o755, content = Template('hbase_grant_permissions.j2') ) diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HBASE/package/scripts/setup_ranger_hbase.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HBASE/package/scripts/setup_ranger_hbase.py index 3b58dbc0080..7334a5084cb 100755 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HBASE/package/scripts/setup_ranger_hbase.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HBASE/package/scripts/setup_ranger_hbase.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -42,7 +42,7 @@ def setup_ranger_hbase(upgrade_type=None, service_name="hbase-master"): action="create_on_execute", owner=params.hdfs_user, group=params.hdfs_user, - mode=0755, + mode=0o755, recursive_chmod=True ) params.HdfsResource("/ranger/audit/hbaseMaster", @@ -50,7 +50,7 @@ def setup_ranger_hbase(upgrade_type=None, service_name="hbase-master"): action="create_on_execute", owner=params.hbase_user, group=params.hbase_user, - mode=0700, + mode=0o700, recursive_chmod=True ) params.HdfsResource("/ranger/audit/hbaseRegional", @@ -58,11 +58,11 @@ def setup_ranger_hbase(upgrade_type=None, service_name="hbase-master"): action="create_on_execute", owner=params.hbase_user, group=params.hbase_user, - mode=0700, + mode=0o700, recursive_chmod=True ) params.HdfsResource(None, action="execute") - except Exception, err: + except Exception as err: Logger.exception("Audit directory creation in HDFS for HBASE Ranger plugin failed with error:\n{0}".format(err)) api_version = 'v2' diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HBASE/package/scripts/status_params.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HBASE/package/scripts/status_params.py index 1e17f0101a0..f7e3931a29e 100755 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HBASE/package/scripts/status_params.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HBASE/package/scripts/status_params.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HBASE/package/scripts/upgrade.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HBASE/package/scripts/upgrade.py index b5e22624859..b08beadf259 100755 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HBASE/package/scripts/upgrade.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HBASE/package/scripts/upgrade.py @@ -1,5 +1,5 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HBASE/service_advisor.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HBASE/service_advisor.py index 9656a3b71f5..0841333e999 100755 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HBASE/service_advisor.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HBASE/service_advisor.py @@ -35,7 +35,7 @@ service_advisor = imp.load_module('service_advisor', fp, PARENT_FILE, ('.py', 'rb', imp.PY_SOURCE)) except Exception as e: traceback.print_exc() - print "Failed to load parent" + print("Failed to load parent") class HBASEServiceAdvisor(service_advisor.ServiceAdvisor): @@ -573,7 +573,7 @@ def calculateCoprocessorConfigurations(self, services, configurations, ranger_hb if hbase_coprocessor_classes: # Split string into an array with non-empty elements - hbaseCoProcessorConfigs[key] = filter(None, hbase_coprocessor_classes.split(',')) + hbaseCoProcessorConfigs[key] = [_f for _f in hbase_coprocessor_classes.split(',') if _f] # Authorization # If configurations has it - it has priority as it is calculated. diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/alerts/alert_checkpoint_time.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/alerts/alert_checkpoint_time.py index 26127c3e3a8..c7c3760518c 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/alerts/alert_checkpoint_time.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/alerts/alert_checkpoint_time.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one @@ -19,7 +19,7 @@ """ import time -import urllib2 +import urllib.request, urllib.error, urllib.parse import ambari_simplejson as json # simplejson is much faster comparing to Python 2.6 json module and has the same functions set. import logging import traceback @@ -243,7 +243,7 @@ def get_value_from_jmx(query, jmx_property, connection_timeout): response = None try: - response = urllib2.urlopen(query, timeout=connection_timeout) + response = urllib.request.urlopen(query, timeout=connection_timeout) data = response.read() data_dict = json.loads(data) return data_dict["beans"][0][jmx_property] diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/alerts/alert_datanode_unmounted_data_dir.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/alerts/alert_datanode_unmounted_data_dir.py index aa1e737c053..422751678ad 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/alerts/alert_datanode_unmounted_data_dir.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/alerts/alert_datanode_unmounted_data_dir.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one @@ -20,7 +20,7 @@ import os import logging -import urlparse +import urllib.parse from resource_management.libraries.functions import file_system from resource_management.libraries.functions import mounted_dirs_helper @@ -101,7 +101,7 @@ def execute(configurations={}, parameters={}, host_name=None): continue # parse the path in case it contains a URI scheme - data_dir = urlparse.urlparse(data_dir).path + data_dir = urllib.parse.urlparse(data_dir).path normalized_data_dirs.add(data_dir) diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/alerts/alert_ha_namenode_health.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/alerts/alert_ha_namenode_health.py index 28b3f22a5a9..2f40172a3d2 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/alerts/alert_ha_namenode_health.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/alerts/alert_ha_namenode_health.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one @@ -18,7 +18,7 @@ limitations under the License. """ -import urllib2 +import urllib.request, urllib.error, urllib.parse import ambari_simplejson as json # simplejson is much faster comparing to Python 2.6 json module and has the same functions set. import logging @@ -203,7 +203,7 @@ def get_jmx(query, connection_timeout): response = None try: - response = urllib2.urlopen(query, timeout=connection_timeout) + response = urllib.request.urlopen(query, timeout=connection_timeout) json_data = response.read() return json_data finally: diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/alerts/alert_metrics_deviation.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/alerts/alert_metrics_deviation.py index 28942b8f8d2..32de2211843 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/alerts/alert_metrics_deviation.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/alerts/alert_metrics_deviation.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one @@ -17,13 +17,12 @@ See the License for the specific language governing permissions and limitations under the License. """ -import httplib +import http.client import locale import json import logging -import urllib import time -import urllib2 +import urllib.request, urllib.error, urllib.parse import os import ambari_commons.network as network @@ -311,7 +310,7 @@ def execute(configurations={}, parameters={}, host_name=None): "grouped": "true", } - encoded_get_metrics_parameters = urllib.urlencode(get_metrics_parameters) + encoded_get_metrics_parameters = urllib.parse.urlencode(get_metrics_parameters) ams_monitor_conf_dir = "/etc/ambari-metrics-monitor/conf" metric_truststore_ca_certs='ca.pem' @@ -332,7 +331,7 @@ def execute(configurations={}, parameters={}, host_name=None): response = conn.getresponse() data = response.read() conn.close() - except Exception, e: + except Exception as e: logger.info(str(e)) return (RESULT_STATE_UNKNOWN, ["Unable to retrieve metrics from the Ambari Metrics service."]) @@ -442,7 +441,7 @@ def get_jmx(query, connection_timeout): response = None try: - response = urllib2.urlopen(query, timeout=connection_timeout) + response = urllib.request.urlopen(query, timeout=connection_timeout) json_data = response.read() return json_data except Exception: diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/alerts/alert_upgrade_finalized.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/alerts/alert_upgrade_finalized.py index 427f1d1dd0f..a55b46cedfa 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/alerts/alert_upgrade_finalized.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/alerts/alert_upgrade_finalized.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one @@ -18,7 +18,7 @@ limitations under the License. """ -import urllib2 +import urllib.request, urllib.error, urllib.parse import ambari_simplejson as json # simplejson is much faster comparing to Python 2.6 json module and has the same functions set. import logging import traceback @@ -166,7 +166,7 @@ def get_value_from_jmx(query, jmx_property): response = None try: - response = urllib2.urlopen(query, timeout=int(CONNECTION_TIMEOUT_DEFAULT)) + response = urllib.request.urlopen(query, timeout=int(CONNECTION_TIMEOUT_DEFAULT)) data = response.read() data_dict = json.loads(data) diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/files/checkWebUI.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/files/checkWebUI.py index 7ee02d55352..46be1946a61 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/files/checkWebUI.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/files/checkWebUI.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -19,17 +19,17 @@ ''' import optparse -import httplib +import http.client import socket import ssl -class ForcedProtocolHTTPSConnection(httplib.HTTPSConnection): +class ForcedProtocolHTTPSConnection(http.client.HTTPSConnection): """ Some of python implementations does not work correctly with sslv3 but trying to use it, we need to change protocol to tls1. """ def __init__(self, host, port, force_protocol, **kwargs): - httplib.HTTPSConnection.__init__(self, host, port, **kwargs) + http.client.HTTPSConnection.__init__(self, host, port, **kwargs) self.force_protocol = force_protocol def connect(self): @@ -41,7 +41,7 @@ def connect(self): def make_connection(host, port, https, force_protocol=None): try: - conn = httplib.HTTPConnection(host, port) if not https else httplib.HTTPSConnection(host, port) + conn = http.client.HTTPConnection(host, port) if not https else http.client.HTTPSConnection(host, port) conn.request("GET", "/") return conn.getresponse().status except ssl.SSLError: @@ -51,11 +51,11 @@ def make_connection(host, port, https, force_protocol=None): tls1_conn.request("GET", "/") return tls1_conn.getresponse().status except Exception as e: - print e + print(e) finally: tls1_conn.close() except Exception as e: - print e + print(e) finally: conn.close() # @@ -78,8 +78,8 @@ def main(): for host in hosts: httpCode = make_connection(host, port, https.lower() == "true", protocol) - if httpCode != 200 and httpCode != 302: - print "Cannot access WEB UI on: http://" + host + ":" + port if not https.lower() == "true" else "Cannot access WEB UI on: https://" + host + ":" + port + if httpCode != 200: + print("Cannot access WEB UI on: http://" + host + ":" + port if not https.lower() == "true" else "Cannot access WEB UI on: https://" + host + ":" + port) exit(1) if __name__ == "__main__": diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/scripts/balancer-emulator/hdfs-command.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/scripts/balancer-emulator/hdfs-command.py index 88529b48852..92bde08d636 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/scripts/balancer-emulator/hdfs-command.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/scripts/balancer-emulator/hdfs-command.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/scripts/hdfs.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/scripts/hdfs.py index 53f983b07ee..8b59f4f7d56 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/scripts/hdfs.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/scripts/hdfs.py @@ -51,7 +51,7 @@ def hdfs(name=None): File(os.path.join(params.limits_conf_dir, 'hdfs.conf'), owner='root', group='root', - mode=0644, + mode=0o644, content=Template("hdfs.conf.j2") ) @@ -73,7 +73,7 @@ def hdfs(name=None): content=Template("hdfs_jn_jaas.conf.j2") ) - tc_mode = 0644 + tc_mode = 0o644 tc_owner = "root" else: tc_mode = None @@ -135,7 +135,7 @@ def hdfs(name=None): configuration_attributes=params.config['configurationAttributes']['core-site'], owner=params.hdfs_user, group=params.user_group, - mode=0644 + mode=0o644 ) File(os.path.join(params.hadoop_conf_dir, 'slaves'), @@ -226,7 +226,7 @@ def hdfs(component=None): mode="f", ) pass - if params.service_map.has_key(component): + if component in params.service_map: service_name = params.service_map[component] ServiceConfig(service_name, action="change_user", diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/scripts/hdfs_datanode.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/scripts/hdfs_datanode.py index c61a117ecda..56aa3c16bef 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/scripts/hdfs_datanode.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/scripts/hdfs_datanode.py @@ -46,7 +46,7 @@ def datanode(action=None): import params Directory(params.dfs_domain_socket_dir, create_parents = True, - mode=0751, + mode=0o751, owner=params.hdfs_user, group=params.user_group) @@ -56,7 +56,7 @@ def datanode(action=None): File(params.data_dir_mount_file, owner=params.hdfs_user, group=params.user_group, - mode=0644, + mode=0o644, content=data_dir_to_mount_file_content ) diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/scripts/hdfs_namenode.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/scripts/hdfs_namenode.py index 33151457bae..5df7afc6652 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/scripts/hdfs_namenode.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/scripts/hdfs_namenode.py @@ -288,7 +288,7 @@ def create_name_dirs(directories): dirs = directories.split(",") Directory(dirs, - mode=0755, + mode=0o755, owner=params.hdfs_user, group=params.user_group, create_parents = True, @@ -305,7 +305,7 @@ def create_hdfs_directories(name_service): type="directory", action="create_on_execute", owner=params.hdfs_user, - mode=0777, + mode=0o777, nameservices=name_services, ) params.HdfsResource(params.smoke_hdfs_user_dir, @@ -591,7 +591,7 @@ def is_namenode_bootstrapped(params): def find_timeout(): import params - if isinstance(params.command_timeout, (int, long)): + if isinstance(params.command_timeout, int): return params.command_timeout return int(params.command_timeout) diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/scripts/hdfs_nfsgateway.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/scripts/hdfs_nfsgateway.py index d5246cdf44a..9944e24babd 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/scripts/hdfs_nfsgateway.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/scripts/hdfs_nfsgateway.py @@ -22,7 +22,7 @@ from resource_management.core.resources import Directory from resource_management.core import shell from utils import service -from ambari_commons import subprocess32 +import subprocess import os # NFS GATEWAY is always started by root using jsvc due to rpcbind bugs diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/scripts/hdfs_rebalance.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/scripts/hdfs_rebalance.py index 68c609f60b3..c31041b329c 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/scripts/hdfs_rebalance.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/scripts/hdfs_rebalance.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -47,7 +47,7 @@ def parseLine(self, line): class HdfsLine(): class LineType: - HeaderStart, Progress, ProgressEnd, Unknown = range(4) + HeaderStart, Progress, ProgressEnd, Unknown = list(range(4)) MEMORY_SUFFIX = ['B','KB','MB','GB','TB','PB','EB'] diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/scripts/hdfs_snamenode.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/scripts/hdfs_snamenode.py index 0eaeef47593..1a0fa23c7c8 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/scripts/hdfs_snamenode.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/scripts/hdfs_snamenode.py @@ -32,7 +32,7 @@ def snamenode(action=None, format=False): Directory(fs_checkpoint_dir, create_parents = True, cd_access="a", - mode=0755, + mode=0o755, owner=params.hdfs_user, group=params.user_group) File(params.exclude_file_path, diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/scripts/journalnode_upgrade.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/scripts/journalnode_upgrade.py index 75851072027..bb903933b9d 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/scripts/journalnode_upgrade.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/scripts/journalnode_upgrade.py @@ -54,7 +54,7 @@ def post_upgrade_check(): try: namenode_ha = namenode_ha_state.NamenodeHAState() - except ValueError, err: + except ValueError as err: raise Fail("Could not retrieve Namenode HA addresses. Error: " + str(err)) Logger.info(str(namenode_ha)) diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/scripts/namenode.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/scripts/namenode.py index 28f854b4cf1..d25c2e46771 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/scripts/namenode.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/scripts/namenode.py @@ -187,7 +187,7 @@ def restore_snapshot(self, env): """ Restore the snapshot during a Downgrade. """ - print "TODO AMBARI-12698" + print("TODO AMBARI-12698") pass def prepare_express_upgrade(self, env): @@ -286,7 +286,7 @@ def rebalancehdfs(self, env): # to generate a (relatively) unique cache filename so that we can use it as needed. # TODO: params.tmp_dir=/var/lib/ambari-agent/tmp. However hdfs user doesn't have access to this path. # TODO: Hence using /tmp - ccache_file_name = "hdfs_rebalance_cc_" + HASH_ALGORITHM(format("{hdfs_principal_name}|{hdfs_user_keytab}")).hexdigest() + ccache_file_name = "hdfs_rebalance_cc_" + HASH_ALGORITHM(format("{hdfs_principal_name}|{hdfs_user_keytab}").encode()).hexdigest() ccache_file_path = os.path.join(tempfile.gettempdir(), ccache_file_name) rebalance_env['KRB5CCNAME'] = ccache_file_path diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/scripts/namenode_ha_state.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/scripts/namenode_ha_state.py index 15265ba0e72..5199b298247 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/scripts/namenode_ha_state.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/scripts/namenode_ha_state.py @@ -161,7 +161,7 @@ def get_address_for_host(self, hostname): :param hostname: Host name :return: Returns the appropriate address (HTTP if no encryption, HTTPS otherwise) for the given host. """ - for id, addresses in self.nn_unique_id_to_addresses.iteritems(): + for id, addresses in self.nn_unique_id_to_addresses.items(): if addresses and len(addresses) == 2: if ":" in addresses[0]: nn_hostname = addresses[0].split(":")[0].strip() diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/scripts/namenode_upgrade.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/scripts/namenode_upgrade.py index 14d6ce2ce1f..1bd5b7adb09 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/scripts/namenode_upgrade.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/scripts/namenode_upgrade.py @@ -83,7 +83,7 @@ def prepare_upgrade_enter_safe_mode(hdfs_binary): Logger.info("Transition successful: {0}, original state: {1}".format(str(safemode_transition_successful), str(original_state))) if not safemode_transition_successful: raise Fail("Could not transition to safemode state %s. Please check logs to make sure namenode is up." % str(desired_state)) - except Exception, e: + except Exception as e: message = "Could not enter safemode. Error: {0}. As the HDFS user, call this command: {1}".format(str(e), safe_mode_enter_cmd) Logger.error(message) raise Fail(message) @@ -100,7 +100,7 @@ def prepare_upgrade_save_namespace(hdfs_binary): try: Logger.info("Checkpoint the current namespace.") as_user(save_namespace_cmd, params.hdfs_user, env={'PATH': params.hadoop_bin_dir}) - except Exception, e: + except Exception as e: message = format("Could not save the NameSpace. As the HDFS user, call this command: {save_namespace_cmd}") Logger.error(message) raise Fail(message) @@ -130,7 +130,7 @@ def prepare_upgrade_backup_namenode_dir(): Execute(('cp', '-ar', namenode_current_image, backup_current_folder), sudo=True ) - except Exception, e: + except Exception as e: failed_paths.append(namenode_current_image) if len(failed_paths) > 0: Logger.error("Could not backup the NameNode Name Dir(s) to {0}, make sure that the destination path is " @@ -156,7 +156,7 @@ def prepare_upgrade_finalize_previous_upgrades(hdfs_binary): Logger.warning('Finalize command did not contain substring: %s' % expected_substring) else: Logger.warning("Finalize command did not return any output.") - except Exception, e: + except Exception as e: Logger.warning("Ensure no upgrades are in progress.") def reach_safemode_state(user, safemode_state, in_ha, hdfs_binary): diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/scripts/params_linux.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/scripts/params_linux.py index 806a6220f78..3f57070edc0 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/scripts/params_linux.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/scripts/params_linux.py @@ -247,7 +247,7 @@ if namenode_federation_enabled(hdfs_site): - jn_edits_dirs = get_properties_for_all_nameservices(hdfs_site, 'dfs.journalnode.edits.dir').values() + jn_edits_dirs = list(get_properties_for_all_nameservices(hdfs_site, 'dfs.journalnode.edits.dir').values()) else: jn_edits_dirs = [config['configurations']['hdfs-site']['dfs.journalnode.edits.dir']] @@ -258,7 +258,7 @@ namenode_dirs_stub_filename = "namenode_dirs_created" smoke_hdfs_user_dir = format("/user/{smoke_user}") -smoke_hdfs_user_mode = 0770 +smoke_hdfs_user_mode = 0o770 hdfs_namenode_format_disabled = default("/configurations/cluster-env/hdfs_namenode_format_disabled", False) hdfs_namenode_formatted_mark_suffix = "/namenode-formatted/" @@ -314,7 +314,7 @@ dfs_ha_namemodes_ids_list = [] other_namenode_id = None -for ns, dfs_ha_namenode_ids in dfs_ha_namenode_ids_all_ns.iteritems(): +for ns, dfs_ha_namenode_ids in dfs_ha_namenode_ids_all_ns.items(): found = False if not is_empty(dfs_ha_namenode_ids): dfs_ha_namemodes_ids_list = dfs_ha_namenode_ids.split(",") diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/scripts/service_check.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/scripts/service_check.py index ffcf2daea16..67e005fcc82 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/scripts/service_check.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/scripts/service_check.py @@ -66,7 +66,7 @@ def service_check(self, env): params.HdfsResource(dir, type="directory", action="create_on_execute", - mode=0777 + mode=0o777 ) params.HdfsResource(tmp_file, type="file", @@ -102,7 +102,7 @@ def service_check(self, env): checkWebUICmd = format("ambari-python-wrap {checkWebUIFilePath} -m {comma_sep_jn_hosts} -p {journalnode_port} -s {https_only} -o {script_https_protocol}") File(checkWebUIFilePath, content=StaticFile(checkWebUIFileName), - mode=0775) + mode=0o775) Execute(checkWebUICmd, logoutput=True, diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/scripts/setup_ranger_hdfs.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/scripts/setup_ranger_hdfs.py index 471de04322f..dbe87a256b9 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/scripts/setup_ranger_hdfs.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/scripts/setup_ranger_hdfs.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -103,7 +103,7 @@ def create_ranger_audit_hdfs_directories(): action="create_on_execute", owner=params.hdfs_user, group=params.hdfs_user, - mode=0755, + mode=0o755, recursive_chmod=True, ) params.HdfsResource("/ranger/audit/hdfs", @@ -111,7 +111,7 @@ def create_ranger_audit_hdfs_directories(): action="create_on_execute", owner=params.hdfs_user, group=params.hdfs_user, - mode=0700, + mode=0o700, recursive_chmod=True, ) params.HdfsResource(None, action="execute") diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/scripts/utils.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/scripts/utils.py index f94685eddf2..5be4199e71d 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/scripts/utils.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/scripts/utils.py @@ -18,8 +18,8 @@ """ import os import re -import urllib2 -from ambari_commons import subprocess32 +import urllib.request, urllib.error, urllib.parse +import subprocess import ambari_simplejson as json # simplejson is much faster comparing to Python 2.6 json module and has the same functions set. from resource_management.core.resources.system import Directory, File, Execute @@ -198,13 +198,13 @@ def service(action=None, name=None, user=None, options="", create_pid_dir=False, if action != "stop": if name == "nfs3": Directory(params.hadoop_pid_dir_prefix, - mode=0755, + mode=0o755, owner=params.root_user, group=params.root_group ) else: Directory(params.hadoop_pid_dir_prefix, - mode=0755, + mode=0o755, owner=params.hdfs_user, group=params.user_group ) @@ -216,7 +216,7 @@ def service(action=None, name=None, user=None, options="", create_pid_dir=False, if create_log_dir: if name == "nfs3": Directory(log_dir, - mode=0775, + mode=0o775, owner=params.root_user, group=params.user_group) else: @@ -295,7 +295,7 @@ def service(action=None, name=None, user=None, options="", create_pid_dir=False, # If stop didn't happen, kill it forcefully if code != 0: - code, out, err = shell.checked_call(("cat", pid_file), sudo=True, env=hadoop_env_exports, stderr=subprocess32.PIPE) + code, out, err = shell.checked_call(("cat", pid_file), sudo=True, env=hadoop_env_exports, stderr=subprocess.PIPE) pid = out Execute(("kill", "-9", pid), sudo=True) @@ -326,7 +326,7 @@ def get_jmx_data(nn_address, modeler_type, metric, encrypted=False, security_ena data, error_msg, time_millis = curl_krb_request(params.tmp_dir, params.smoke_user_keytab, params.smokeuser_principal, nn_address, "jn_upgrade", params.kinit_path_local, False, None, params.smoke_user) else: - data = urllib2.urlopen(nn_address).read() + data = urllib.request.urlopen(nn_address).read() my_data = None if data: data_dict = json.loads(data) @@ -424,6 +424,6 @@ def set_up_zkfc_security(params): File(os.path.join(params.hadoop_conf_secure_dir, 'hdfs_jaas.conf'), owner=params.hdfs_user, group=params.user_group, - mode=0644, + mode=0o644, content=Template("hdfs_jaas.conf.j2") ) diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/scripts/zkfc_slave.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/scripts/zkfc_slave.py index 342485d8c15..6d0921d9a42 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/scripts/zkfc_slave.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/package/scripts/zkfc_slave.py @@ -80,7 +80,7 @@ def start_static(env, upgrade_type=None): env.set_params(params) ZkfcSlave.configure_static(env) Directory(params.hadoop_pid_dir_prefix, - mode=0755, + mode=0o755, owner=params.hdfs_user, group=params.user_group ) diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/service_advisor.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/service_advisor.py index 153b76c069a..44fd5b3f4b7 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/service_advisor.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HDFS/service_advisor.py @@ -38,7 +38,7 @@ service_advisor = imp.load_module('service_advisor', fp, PARENT_FILE, ('.py', 'rb', imp.PY_SOURCE)) except Exception as e: traceback.print_exc() - print "Failed to load parent." + print("Failed to load parent.") class HDFSServiceAdvisor(service_advisor.ServiceAdvisor): @@ -240,15 +240,15 @@ def recommendConfigurationsFromHDP206(self, configurations, clusterData, service # dfs.datanode.du.reserved should be set to 10-15% of volume size # For each host selects maximum size of the volume. Then gets minimum for all hosts. # This ensures that each host will have at least one data dir with available space. - reservedSizeRecommendation = 0l #kBytes + reservedSizeRecommendation = 0 #kBytes for host in hosts["items"]: mountPoints = [] mountPointDiskAvailableSpace = [] #kBytes for diskInfo in host["Hosts"]["disk_info"]: mountPoints.append(diskInfo["mountpoint"]) - mountPointDiskAvailableSpace.append(long(diskInfo["size"])) + mountPointDiskAvailableSpace.append(int(diskInfo["size"])) - maxFreeVolumeSizeForHost = 0l #kBytes + maxFreeVolumeSizeForHost = 0 #kBytes for dataDir in dataDirs: mp = HDFSRecommender.getMountPointForDir(dataDir, mountPoints) for i in range(len(mountPoints)): @@ -264,7 +264,7 @@ def recommendConfigurationsFromHDP206(self, configurations, clusterData, service if reservedSizeRecommendation: reservedSizeRecommendation = max(reservedSizeRecommendation * 1024 / 8, 1073741824) # At least 1Gb is reserved - putHDFSSiteProperty('dfs.datanode.du.reserved', reservedSizeRecommendation) #Bytes + putHDFSSiteProperty('dfs.datanode.du.reserved', int(reservedSizeRecommendation)) #Bytes # recommendations for "hadoop.proxyuser.*.hosts", "hadoop.proxyuser.*.groups" properties in core-site self.recommendHadoopProxyUsers(configurations, services, hosts) @@ -325,18 +325,18 @@ def recommendConfigurationsFromHDP22(self, configurations, clusterData, services nn_max_heapsize = min(int(namenodeHosts[0]["Hosts"]["total_mem"]), int(namenodeHosts[1]["Hosts"]["total_mem"])) / 1024 masters_at_host = max( - self.getHostComponentsByCategories(namenodeHosts[0]["Hosts"]["host_name"], ["MASTER"], services, hosts), - self.getHostComponentsByCategories(namenodeHosts[1]["Hosts"]["host_name"], ["MASTER"], services, hosts)) + len(self.getHostComponentsByCategories(namenodeHosts[0]["Hosts"]["host_name"], ["MASTER"], services, hosts)), + len(self.getHostComponentsByCategories(namenodeHosts[1]["Hosts"]["host_name"], ["MASTER"], services, hosts))) else: nn_max_heapsize = int(namenodeHosts[0]["Hosts"]["total_mem"] / 1024) # total_mem in kb - masters_at_host = self.getHostComponentsByCategories(namenodeHosts[0]["Hosts"]["host_name"], ["MASTER"], - services, hosts) + masters_at_host = len(self.getHostComponentsByCategories(namenodeHosts[0]["Hosts"]["host_name"], ["MASTER"], + services, hosts)) putHdfsEnvPropertyAttribute('namenode_heapsize', 'maximum', max(nn_max_heapsize, 1024)) nn_heapsize_limit = nn_max_heapsize nn_heapsize_limit -= clusterData["reservedRam"] - if len(masters_at_host) > 1: + if masters_at_host > 1: nn_heapsize_limit = int(nn_heapsize_limit / 2) putHdfsEnvProperty('namenode_heapsize', max(nn_heapsize_limit, 1024)) @@ -870,7 +870,7 @@ def validateRangerAuthorizerFromHDP23(self, properties, recommendedDefaults, con try: if hdfs_site['dfs.namenode.inode.attributes.provider.class'].lower() != 'org.apache.ranger.authorization.hadoop.RangerHdfsAuthorizer'.lower(): raise ValueError() - except (KeyError, ValueError), e: + except (KeyError, ValueError) as e: message = "dfs.namenode.inode.attributes.provider.class needs to be set to 'org.apache.ranger.authorization.hadoop.RangerHdfsAuthorizer' if Ranger HDFS Plugin is enabled." validationItems.append({"config-name": 'dfs.namenode.inode.attributes.provider.class', "item": self.getWarnItem(message)}) diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/alerts/alert_hive_interactive_thrift_port.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/alerts/alert_hive_interactive_thrift_port.py index 1a160251fc6..72ce0359dc4 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/alerts/alert_hive_interactive_thrift_port.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/alerts/alert_hive_interactive_thrift_port.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/alerts/alert_hive_metastore.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/alerts/alert_hive_metastore.py index 7599894abd6..eb1c243c0ad 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/alerts/alert_hive_metastore.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/alerts/alert_hive_metastore.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one @@ -23,7 +23,7 @@ import socket import time import traceback -from urlparse import urlparse +from urllib.parse import urlparse from resource_management.core import global_lock from resource_management.core.resources import Execute diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/alerts/alert_hive_sys_db.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/alerts/alert_hive_sys_db.py index 980798bd77d..4fde9d165ab 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/alerts/alert_hive_sys_db.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/alerts/alert_hive_sys_db.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/alerts/alert_hive_thrift_port.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/alerts/alert_hive_thrift_port.py index 49851d05e77..bc4ece9337d 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/alerts/alert_hive_thrift_port.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/alerts/alert_hive_thrift_port.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one @@ -214,12 +214,12 @@ def execute(configurations={}, parameters={}, host_name=None): result_code = 'OK' total_time = time.time() - start_time label = OK_MESSAGE.format(total_time, port) - except: + except Exception as exception: result_code = 'CRITICAL' label = CRITICAL_MESSAGE.format(host_name, port, traceback.format_exc()) - except: - label = traceback.format_exc() + except Exception as e: + label = str(e) result_code = 'UNKNOWN' return (result_code, [label]) diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/alerts/alert_llap_app_status.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/alerts/alert_llap_app_status.py index 8689a473fae..cb0b432f571 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/alerts/alert_llap_app_status.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/alerts/alert_llap_app_status.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/scripts/__init__.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/scripts/__init__.py index 5561e1087b2..152033a3be5 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/scripts/__init__.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/scripts/__init__.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/scripts/hcat.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/scripts/hcat.py index 09631022152..31b05ee12a5 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/scripts/hcat.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/scripts/hcat.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -60,7 +60,7 @@ def hcat(): configuration_attributes=params.config['configurationAttributes']['hive-site'], owner=params.hive_user, group=params.user_group, - mode=0644) + mode=0o644) File(format("{hcat_conf_dir}/hcat-env.sh"), owner=params.webhcat_user, diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/scripts/hcat_client.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/scripts/hcat_client.py index 7058e2d58b4..ddc71d04922 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/scripts/hcat_client.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/scripts/hcat_client.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/scripts/hcat_service_check.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/scripts/hcat_service_check.py index dccb2117b6c..1ddec50e07b 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/scripts/hcat_service_check.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/scripts/hcat_service_check.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -41,7 +41,7 @@ def hcat_service_check(): File(format("{tmp_dir}/hcatSmoke.sh"), content=StaticFile("hcatSmoke.sh"), - mode=0755 + mode=0o755 ) prepare_cmd = format("{kinit_cmd}env JAVA_HOME={java64_home} {tmp_dir}/hcatSmoke.sh hcatsmoke{unique} prepare {purge_tables}") diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/scripts/hive.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/scripts/hive.py index eaf9dd02a69..3d09284ba54 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/scripts/hive.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/scripts/hive.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -22,7 +22,7 @@ import os import glob import traceback -from urlparse import urlparse +from urllib.parse import urlparse # Ambari Commons & Resource Management Imports from ambari_commons.constants import SERVICE @@ -71,7 +71,7 @@ def hive(name=None): configuration_attributes = params.config['configurationAttributes']['hive-site'], owner = params.hive_user, group = params.user_group, - mode = 0644) + mode = 0o644) # Generate atlas-application.properties.xml file if params.enable_atlas_hook: @@ -82,7 +82,7 @@ def hive(name=None): owner=params.hive_user, group=params.user_group, content=InlineTemplate(params.hive_env_sh_template), - mode=0755 + mode=0o755 ) # On some OS this folder could be not exists, so we will create it before pushing there files @@ -95,7 +95,7 @@ def hive(name=None): File(os.path.join(params.limits_conf_dir, 'hive.conf'), owner='root', group='root', - mode=0644, + mode=0o644, content=Template("hive.conf.j2") ) if params.security_enabled: @@ -107,7 +107,7 @@ def hive(name=None): File(format("/usr/lib/ambari-agent/{check_db_connection_jar_name}"), content = DownloadSource(format("{jdk_location}/{check_db_connection_jar_name}")), - mode = 0644, + mode = 0o644, ) if params.hive_jdbc_target is not None and not os.path.exists(params.hive_jdbc_target): @@ -124,7 +124,7 @@ def setup_hiveserver2(): import params File(params.start_hiveserver2_path, - mode=0755, + mode=0o755, content=Template(format('{start_hiveserver2_script}')) ) @@ -132,7 +132,7 @@ def setup_hiveserver2(): owner=params.hive_user, group=params.user_group, content=Template("hadoop-metrics2-hiveserver2.properties.j2"), - mode=0600 + mode=0o600 ) XmlConfig("hiveserver2-site.xml", conf_dir=params.hive_conf_dir, @@ -140,7 +140,8 @@ def setup_hiveserver2(): configuration_attributes=params.config['configurationAttributes']['hiveserver2-site'], owner=params.hive_user, group=params.user_group, - mode=0600) + mode=0o600) + # if warehouse directory is in DFS if not params.whs_dir_protocol or params.whs_dir_protocol == urlparse(params.default_fs).scheme: @@ -149,7 +150,7 @@ def setup_hiveserver2(): type = "directory", action = "create_on_execute", owner = params.hive_user, - mode = 01775 + mode = 0o1775 ) if not is_empty(params.hive_hook_proto_base_directory): @@ -157,7 +158,7 @@ def setup_hiveserver2(): type = "directory", action = "create_on_execute", owner = params.hive_user, - mode = 01777 + mode = 0o1777 ) dag_meta = params.tez_hook_proto_base_directory + "dag_meta" @@ -165,7 +166,7 @@ def setup_hiveserver2(): type = "directory", action = "create_on_execute", owner = params.hive_user, - mode = 01777 + mode = 0o1777 ) dag_data = params.tez_hook_proto_base_directory + "dag_data" @@ -173,7 +174,7 @@ def setup_hiveserver2(): type = "directory", action = "create_on_execute", owner = params.hive_user, - mode = 01777 + mode = 0o1777 ) app_data = params.tez_hook_proto_base_directory + "app_data" @@ -181,7 +182,7 @@ def setup_hiveserver2(): type = "directory", action = "create_on_execute", owner = params.hive_user, - mode = 01777 + mode = 0o1777 ) if not is_empty(params.hive_exec_scratchdir) and not urlparse(params.hive_exec_scratchdir).path.startswith("/tmp"): @@ -190,7 +191,7 @@ def setup_hiveserver2(): action="create_on_execute", owner=params.hive_user, group=params.hdfs_user, - mode=0777) # Hive expects this dir to be writeable by everyone as it is used as a temp dir + mode=0o777) # Hive expects this dir to be writeable by everyone as it is used as a temp dir if params.hive_repl_cmrootdir is not None and params.hive_repl_cmrootdir.strip() != "": params.HdfsResource(params.hive_repl_cmrootdir, @@ -198,14 +199,14 @@ def setup_hiveserver2(): action = "create_on_execute", owner = params.hive_user, group=params.user_group, - mode = 01777) + mode = 0o1777) if params.hive_repl_rootdir is not None and params.hive_repl_rootdir.strip() != "": params.HdfsResource(params.hive_repl_rootdir, type = "directory", action = "create_on_execute", owner = params.hive_user, group=params.user_group, - mode = 0700) + mode = 0o700) params.HdfsResource(None, action="execute") @@ -248,14 +249,14 @@ def create_hive_hdfs_dirs(): action = "create_on_execute", owner = params.hive_user, group = params.user_group, - mode = 01777 + mode = 0o1777 ) params.HdfsResource(managed_dir, type = "directory", action = "create_on_execute", owner = params.hive_user, group = params.user_group, - mode = 0770 + mode = 0o770 ) if __is_hdfs_acls_enabled(): @@ -279,7 +280,7 @@ def create_hive_hdfs_dirs(): type = "directory", action = "create_on_execute", owner = params.hive_user, - mode = 01775 + mode = 0o1775 ) params.HdfsResource(None, action = "execute") @@ -306,19 +307,19 @@ def setup_non_client(): cd_access='a', owner=params.hive_user, group=params.user_group, - mode=0755) + mode=0o755) Directory(params.hive_log_dir, create_parents = True, cd_access='a', owner=params.hive_user, group=params.user_group, - mode=0755) + mode=0o755) Directory(params.hive_var_lib, create_parents = True, cd_access='a', owner=params.hive_user, group=params.user_group, - mode=0755) + mode=0o755) def setup_metastore(): @@ -333,17 +334,16 @@ def setup_metastore(): configuration_attributes=params.config['configurationAttributes']['hivemetastore-site'], owner=params.hive_user, group=params.user_group, - mode=0600) - + mode=0o600) File(os.path.join(params.hive_conf_dir, "hadoop-metrics2-hivemetastore.properties"), owner=params.hive_user, group=params.user_group, content=Template("hadoop-metrics2-hivemetastore.properties.j2"), - mode=0600 + mode=0o600 ) File(params.start_metastore_path, - mode=0755, + mode=0o755, content=StaticFile('startMetastore.sh') ) @@ -353,14 +353,14 @@ def setup_metastore(): action = "create_on_execute", owner = params.hive_user, group=params.user_group, - mode = 01777) + mode = 0o1777) if params.hive_repl_rootdir is not None and params.hive_repl_rootdir.strip() != "": params.HdfsResource(params.hive_repl_rootdir, type = "directory", action = "create_on_execute", owner = params.hive_user, group=params.user_group, - mode = 0700) + mode = 0o700) params.HdfsResource(None, action="execute") generate_logfeeder_input_config('hive', Template("input.config-hive.json.j2", extra_imports=[default])) @@ -476,8 +476,8 @@ def fill_conf_dir(component_conf_dir): # mode_identified_for_file = 0644 if component_conf_dir == hive_client_conf_path else 0600 # mode_identified_for_dir = 0755 if component_conf_dir == hive_client_conf_path else 0700 - mode_identified_for_file = 0644 - mode_identified_for_dir = 0755 + mode_identified_for_file = 0o644 + mode_identified_for_dir = 0o755 Directory(component_conf_dir, owner=params.hive_user, @@ -504,7 +504,7 @@ def fill_conf_dir(component_conf_dir): File(format("{component_conf_dir}/hive-env.sh.template"), owner=params.hive_user, group=params.user_group, - mode=0755 + mode=0o755 ) # Create properties files under conf dir @@ -623,5 +623,5 @@ def jdbc_connector(target, hive_previous_jdbc_jar): pass File(target, - mode = 0644, + mode = 0o644, ) diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/scripts/hive_client.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/scripts/hive_client.py index 751ccca6474..fe2d4abf69e 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/scripts/hive_client.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/scripts/hive_client.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/scripts/hive_metastore.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/scripts/hive_metastore.py index e81226ede02..f559235f039 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/scripts/hive_metastore.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/scripts/hive_metastore.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -161,7 +161,7 @@ def upgrade_schema(self, env): Execute(('cp', params.source_jdbc_file, target_directory), path=["/bin", "/usr/bin/"], sudo = True) - File(target_directory_and_filename, mode = 0644) + File(target_directory_and_filename, mode = 0o644) # build the schema tool command binary = format("{hive_bin_dir}/schematool") diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/scripts/hive_server.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/scripts/hive_server.py index 54c0ed9fb0f..0b6314ef228 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/scripts/hive_server.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/scripts/hive_server.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/scripts/hive_server_upgrade.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/scripts/hive_server_upgrade.py index 7560ceeaab1..3ddd0379e36 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/scripts/hive_server_upgrade.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/scripts/hive_server_upgrade.py @@ -124,7 +124,7 @@ def _get_current_hiveserver_version(): version_hive_bin = format('{stack_root}/{source_version}/usr/lib/hive/bin') command = format('{version_hive_bin}/hive --version') return_code, output = shell.call(command, user=params.hive_user, path=hive_execute_path) - except Exception, e: + except Exception as e: Logger.error(str(e)) raise Fail('Unable to execute hive --version command to retrieve the hiveserver2 version.') diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/scripts/hive_service.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/scripts/hive_service.py index 344acb65f38..e16738366fe 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/scripts/hive_service.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/scripts/hive_service.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/scripts/mysql_server.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/scripts/mysql_server.py index 09df0771c5b..ec9f4a393c1 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/scripts/mysql_server.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/scripts/mysql_server.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/scripts/mysql_service.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/scripts/mysql_service.py index 172f5c0053c..903ec83410b 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/scripts/mysql_service.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/scripts/mysql_service.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -55,7 +55,7 @@ def mysql_service(action='start'): sudo = True, ) elif action == 'start': - import params + import params Execute(cmd, logoutput = True, not_if = status_cmd, diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/scripts/mysql_users.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/scripts/mysql_users.py index ef763a0eed1..5b04e201394 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/scripts/mysql_users.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/scripts/mysql_users.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -30,7 +30,7 @@ def mysql_adduser(): import params File(params.mysql_adduser_path, - mode=0755, + mode=0o755, content=StaticFile('addMysqlUser.sh') ) hive_server_host = format("{hive_server_host}") @@ -56,7 +56,7 @@ def mysql_deluser(): import params File(params.mysql_deluser_path, - mode=0755, + mode=0o755, content=StaticFile('removeMysqlUser.sh') ) hive_server_host = format("{hive_server_host}") diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/scripts/mysql_utils.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/scripts/mysql_utils.py index 3d3c2704ea5..6db85b8afd3 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/scripts/mysql_utils.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/scripts/mysql_utils.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/scripts/params.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/scripts/params.py index cbd4fe4c2c2..690e616fe0d 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/scripts/params.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/scripts/params.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -20,8 +20,7 @@ # Python Imports import os -from urlparse import urlparse - +from urllib.parse import urlparse # Local Imports import status_params @@ -164,7 +163,7 @@ hive_tar_source = "{0}/{1}/hive/hive.tar.gz".format(STACK_ROOT_PATTERN, STACK_VERSION_PATTERN) hive_tar_dest_file = "/{0}/apps/{1}/hive/hive.tar.gz".format(STACK_NAME_PATTERN,STACK_VERSION_PATTERN) -tarballs_mode = 0444 +tarballs_mode = 0o444 purge_tables = "false" # Starting from stack version for feature hive_purge_table drop should be executed with purge @@ -192,7 +191,7 @@ raise Exception("hadoop.security.credential.provider.path property should be set") else: hive_metastore_user_passwd = config['configurations']['hive-site']['javax.jdo.option.ConnectionPassword'] -hive_metastore_user_passwd = unicode(hive_metastore_user_passwd) if not is_empty(hive_metastore_user_passwd) else hive_metastore_user_passwd +hive_metastore_user_passwd = str(hive_metastore_user_passwd) if not is_empty(hive_metastore_user_passwd) else hive_metastore_user_passwd hive_metastore_db_type = config['configurations']['hive-env']['hive_database_type'] hive_db_schma_name = config['configurations']['hive-site']['ambari.hive.db.schema.name'] @@ -401,7 +400,7 @@ hive_env_sh_template = config['configurations']['hive-env']['content'] hive_hdfs_user_dir = format("/user/{hive_user}") -hive_hdfs_user_mode = 0755 +hive_hdfs_user_mode = 0o755 hive_metastore_warehouse_dir = config['configurations']['hive-site']["hive.metastore.warehouse.dir"] hive_metastore_warehouse_external_dir = config['configurations']['hive-site']["hive.metastore.warehouse.external.dir"] whs_dir_protocol = urlparse(hive_metastore_warehouse_dir).scheme @@ -546,9 +545,9 @@ webhcat_server_host = config['clusterHostInfo']['webhcat_server_hosts'] hcat_hdfs_user_dir = format("/user/{webhcat_user}") -hcat_hdfs_user_mode = 0755 +hcat_hdfs_user_mode = 0o755 webhcat_hdfs_user_dir = format("/user/{webhcat_user}") -webhcat_hdfs_user_mode = 0755 +webhcat_hdfs_user_mode = 0o755 #Webhcat log4j properties webhcat_log_maxfilesize = default("/configurations/webhcat-log4j/webhcat_log_maxfilesize", 256) diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/scripts/post_upgrade.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/scripts/post_upgrade.py index f0c1d50a553..9d4ca703d5e 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/scripts/post_upgrade.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/scripts/post_upgrade.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/scripts/service_check.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/scripts/service_check.py index 46fa56605e8..5bbf08acb61 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/scripts/service_check.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/scripts/service_check.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/scripts/setup_ranger_hive.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/scripts/setup_ranger_hive.py index 22f796a19d0..34ada1c4179 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/scripts/setup_ranger_hive.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/scripts/setup_ranger_hive.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -47,7 +47,7 @@ def setup_ranger_hive(upgrade_type = None): action="create_on_execute", owner=params.hdfs_user, group=params.hdfs_user, - mode=0755, + mode=0o755, recursive_chmod=True ) params.HdfsResource("/ranger/audit/hiveServer2", @@ -55,11 +55,11 @@ def setup_ranger_hive(upgrade_type = None): action="create_on_execute", owner=params.hive_user, group=params.hive_user, - mode=0700, + mode=0o700, recursive_chmod=True ) params.HdfsResource(None, action="execute") - except Exception, err: + except Exception as err: Logger.exception("Audit directory creation in HDFS for HIVE Ranger plugin failed with error:\n{0}".format(err)) api_version='v2' diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/scripts/status_params.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/scripts/status_params.py index 48b88ae1e2e..20fe9ecaea3 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/scripts/status_params.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/scripts/status_params.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/scripts/webhcat.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/scripts/webhcat.py index c48d2dd9c4d..78146e38027 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/scripts/webhcat.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/scripts/webhcat.py @@ -40,13 +40,13 @@ def webhcat(): Directory(params.templeton_pid_dir, owner=params.webhcat_user, - mode=0755, + mode=0o755, group=params.user_group, create_parents = True) Directory(params.templeton_log_dir, owner=params.webhcat_user, - mode=0755, + mode=0o755, group=params.user_group, create_parents = True) @@ -105,14 +105,14 @@ def webhcat(): log4j_webhcat_filename = 'webhcat-log4j.properties' if (params.log4j_webhcat_props != None): File(format("{webhcat_conf_dir}/{log4j_webhcat_filename}"), - mode=0644, + mode=0o644, group=params.user_group, owner=params.webhcat_user, content=InlineTemplate(params.log4j_webhcat_props) ) elif (os.path.exists("{webhcat_conf_dir}/{log4j_webhcat_filename}.template")): File(format("{webhcat_conf_dir}/{log4j_webhcat_filename}"), - mode=0644, + mode=0o644, group=params.user_group, owner=params.webhcat_user, content=StaticFile(format("{webhcat_conf_dir}/{log4j_webhcat_filename}.template")) diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/scripts/webhcat_service_check.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/scripts/webhcat_service_check.py index e17a648209a..fe1523c6920 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/scripts/webhcat_service_check.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/package/scripts/webhcat_service_check.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -17,7 +17,7 @@ limitations under the License. """ -import urllib2 +import urllib.request, urllib.error, urllib.parse from resource_management.core.logger import Logger from resource_management.core.exceptions import Fail @@ -33,7 +33,7 @@ def webhcat_service_check(): import params File(format("{tmp_dir}/templetonSmoke.sh"), content= StaticFile('templetonSmoke.sh'), - mode=0755 + mode=0o755 ) if params.security_enabled: diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/service_advisor.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/service_advisor.py index ae9ae406f1c..e7b28670e47 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/service_advisor.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/HIVE/service_advisor.py @@ -39,7 +39,7 @@ service_advisor = imp.load_module("service_advisor", fp, PARENT_FILE, (".py", "rb", imp.PY_SOURCE)) except Exception as e: traceback.print_exc() - print "Failed to load parent" + print("Failed to load parent") class HiveServiceAdvisor(service_advisor.ServiceAdvisor): @@ -987,9 +987,9 @@ def validateHiveInteractiveSiteConfigurationsFromHDP30(self, properties, recomme if llap_queue_cap and "hive.server2.tez.sessions.per.default.queue" in hsi_site: num_tez_sessions = hsi_site["hive.server2.tez.sessions.per.default.queue"] if num_tez_sessions: - num_tez_sessions = long(num_tez_sessions) - yarn_min_container_size = long(self.get_yarn_min_container_size(services, configurations)) - tez_am_container_size = self.calculate_tez_am_container_size(services, long(total_cluster_cap)) + num_tez_sessions = int(num_tez_sessions) + yarn_min_container_size = int(self.get_yarn_min_container_size(services, configurations)) + tez_am_container_size = self.calculate_tez_am_container_size(services, int(total_cluster_cap)) normalized_tez_am_container_size = self._normalizeUp(tez_am_container_size, yarn_min_container_size) llap_selected_queue_cap_remaining = llap_queue_cap - (normalized_tez_am_container_size * num_tez_sessions) if llap_selected_queue_cap_remaining <= llap_queue_cap/2: @@ -1133,9 +1133,9 @@ def min_queue_perc_reqd_for_llap_and_hive_app(self, services, hosts, configurati total_queue_size_at_20_perc = 20.0 / 100 * total_cluster_cap # Calculate based on minimum size required by containers. - yarn_min_container_size = long(self.get_yarn_min_container_size(services, configurations)) - hive_tez_container_size = long(self.get_hive_tez_container_size(services)) - tez_am_container_size = self.calculate_tez_am_container_size(services, long(total_cluster_cap)) + yarn_min_container_size = int(self.get_yarn_min_container_size(services, configurations)) + hive_tez_container_size = int(self.get_hive_tez_container_size(services)) + tez_am_container_size = self.calculate_tez_am_container_size(services, int(total_cluster_cap)) normalized_val = self._normalizeUp(hive_tez_container_size, yarn_min_container_size) \ + self._normalizeUp(tez_am_container_size, yarn_min_container_size) diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/KAFKA/package/scripts/kafka.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/KAFKA/package/scripts/kafka.py index ea392a325d1..2d76ef16011 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/KAFKA/package/scripts/kafka.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/KAFKA/package/scripts/kafka.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -95,7 +95,7 @@ def kafka(upgrade_type=None): kafka_server_config['kafka.timeline.metrics.truststore.password'] = params.metric_truststore_password kafka_data_dir = kafka_server_config['log.dirs'] - kafka_data_dirs = filter(None, kafka_data_dir.split(",")) + kafka_data_dirs = [_f for _f in kafka_data_dir.split(",") if _f] rack="/default-rack" i=0 @@ -107,7 +107,7 @@ def kafka(upgrade_type=None): i=i+1 Directory(kafka_data_dirs, - mode=0755, + mode=0o755, cd_access='a', owner=params.kafka_user, group=params.user_group, @@ -116,7 +116,7 @@ def kafka(upgrade_type=None): ) PropertiesFile("server.properties", - mode=0640, + mode=0o640, dir=params.conf_dir, properties=kafka_server_config, owner=params.kafka_user, @@ -130,7 +130,7 @@ def kafka(upgrade_type=None): if (params.log4j_props != None): File(format("{conf_dir}/log4j.properties"), - mode=0644, + mode=0o644, group=params.user_group, owner=params.kafka_user, content=InlineTemplate(params.log4j_props) @@ -165,14 +165,14 @@ def kafka(upgrade_type=None): File(os.path.join(params.limits_conf_dir, 'kafka.conf'), owner='root', group='root', - mode=0644, + mode=0o644, content=Template("kafka.conf.j2") ) File(os.path.join(params.conf_dir, 'tools-log4j.properties'), owner='root', group='root', - mode=0644, + mode=0o644, content=Template("tools-log4j.properties.j2") ) @@ -191,7 +191,7 @@ def replace_sasl_related_config(property, only_protocol=False): def mutable_config_dict(kafka_broker_config): kafka_server_config = {} - for key, value in kafka_broker_config.iteritems(): + for key, value in kafka_broker_config.items(): kafka_server_config[key] = value return kafka_server_config @@ -224,7 +224,7 @@ def setup_symlink(kafka_managed_dir, kafka_ambari_managed_dir): action="delete") Directory(kafka_managed_dir, - mode=0755, + mode=0o755, cd_access='a', owner=params.kafka_user, group=params.user_group, @@ -256,7 +256,7 @@ def backup_dir_contents(dir_path, backup_folder_suffix): import params backup_destination_path = params.tmp_dir + os.path.normpath(dir_path)+backup_folder_suffix Directory(backup_destination_path, - mode=0755, + mode=0o755, cd_access='a', owner=params.kafka_user, group=params.user_group, @@ -280,7 +280,7 @@ def backup_dir_contents(dir_path, backup_folder_suffix): def ensure_base_directories(): import params Directory([params.kafka_log_dir, params.kafka_pid_dir, params.conf_dir], - mode=0755, + mode=0o755, cd_access='a', owner=params.kafka_user, group=params.user_group, diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/KAFKA/package/scripts/kafka_broker.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/KAFKA/package/scripts/kafka_broker.py index 697471896df..7c817434cf0 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/KAFKA/package/scripts/kafka_broker.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/KAFKA/package/scripts/kafka_broker.py @@ -111,8 +111,8 @@ def stop(self, env, upgrade_type=None): for i in range(max_wait): Logger.info("Waiting for Kafka Broker stop, current pid: {0}, seconds: {1}s".format(pid, i + 1)) try: - sudo.kill(pid, signal.SIGTERM) - except OSError, e: + sudo.kill(pid, signal.SIGTERM.value) + except OSError as e: Logger.info("Kafka Broker is not running, delete pid file: {0}".format(params.kafka_pid_file)) File(params.kafka_pid_file, action = "delete") return @@ -121,7 +121,7 @@ def stop(self, env, upgrade_type=None): try: check_process_status(params.kafka_pid_file) - except ComponentIsNotRunning, e: + except ComponentIsNotRunning as e: File(params.kafka_pid_file, action = "delete") return diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/KAFKA/package/scripts/params.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/KAFKA/package/scripts/params.py index 2ee2d572cab..5c5f986e8ff 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/KAFKA/package/scripts/params.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/KAFKA/package/scripts/params.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/KAFKA/package/scripts/service_check.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/KAFKA/package/scripts/service_check.py index 087bf681a39..350e70ec00b 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/KAFKA/package/scripts/service_check.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/KAFKA/package/scripts/service_check.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -67,7 +67,7 @@ def read_kafka_config(self): import params kafka_config = {} - content = sudo.read_file(params.conf_dir + "/server.properties") + content = sudo.read_file(params.conf_dir + "/server.properties").decode() for line in content.splitlines(): if line.startswith("#") or not line.strip(): continue diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/KAFKA/package/scripts/status_params.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/KAFKA/package/scripts/status_params.py index 57bdf5e0601..d1c01aaf08c 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/KAFKA/package/scripts/status_params.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/KAFKA/package/scripts/status_params.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/KAFKA/package/scripts/upgrade.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/KAFKA/package/scripts/upgrade.py index 94b98c98349..7c862214b46 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/KAFKA/package/scripts/upgrade.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/KAFKA/package/scripts/upgrade.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/KAFKA/package/scripts/utils.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/KAFKA/package/scripts/utils.py index 2f1fa5e0188..83b4262afef 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/KAFKA/package/scripts/utils.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/KAFKA/package/scripts/utils.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/KAFKA/service_advisor.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/KAFKA/service_advisor.py index 43e426b9b71..d1863a73275 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/KAFKA/service_advisor.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/KAFKA/service_advisor.py @@ -36,7 +36,7 @@ service_advisor = imp.load_module('service_advisor', fp, PARENT_FILE, ('.py', 'rb', imp.PY_SOURCE)) except Exception as e: traceback.print_exc() - print "Failed to load parent" + print("Failed to load parent") class KafkaServiceAdvisor(service_advisor.ServiceAdvisor): diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/KERBEROS/package/scripts/kerberos_client.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/KERBEROS/package/scripts/kerberos_client.py index 202d48abb2a..ef0f5d89a9c 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/KERBEROS/package/scripts/kerberos_client.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/KERBEROS/package/scripts/kerberos_client.py @@ -30,7 +30,7 @@ def install(self, env): if install_packages: self.install_packages(env) else: - print "Kerberos client packages are not being installed, manual installation is required." + print("Kerberos client packages are not being installed, manual installation is required.") self.configure(env) diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/KERBEROS/package/scripts/service_check.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/KERBEROS/package/scripts/service_check.py index d446ba01ef2..1fccb4f3421 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/KERBEROS/package/scripts/service_check.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/KERBEROS/package/scripts/service_check.py @@ -49,7 +49,7 @@ def service_check(self, env): if ((params.smoke_test_principal is not None) and (params.smoke_test_keytab_file is not None) and os.path.isfile(params.smoke_test_keytab_file)): - print "Performing kinit using %s" % params.smoke_test_principal + print("Performing kinit using %s" % params.smoke_test_principal) ccache_file_name = HASH_ALGORITHM("{0}|{1}".format(params.smoke_test_principal, params.smoke_test_keytab_file)).hexdigest() ccache_file_path = "{0}{1}kerberos_service_check_cc_{2}".format(params.tmp_dir, os.sep, ccache_file_name) @@ -76,10 +76,10 @@ def service_check(self, env): raise Fail(err_msg) else: # Ambari is not managing identities so if the smoke user does not exist, indicate why.... - print "Skipping this service check since Ambari is not managing Kerberos identities and the smoke user " \ + print("Skipping this service check since Ambari is not managing Kerberos identities and the smoke user " \ "credentials are not available. To execute this service check, the smoke user principal name " \ "and keytab file location must be set in the cluster_env and the smoke user's keytab file must" \ - "exist in the configured location." + "exist in the configured location.") if __name__ == "__main__": diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/SOLR/package/scripts/setup_solr.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/SOLR/package/scripts/setup_solr.py index 1c8719c1fe8..5ba810d91a1 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/SOLR/package/scripts/setup_solr.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/SOLR/package/scripts/setup_solr.py @@ -32,7 +32,7 @@ def setup_solr(name = None): if name == 'server': Directory([params.solr_log_dir, params.solr_piddir, params.solr_datadir, params.solr_data_resources_dir], - mode=0755, + mode=0o755, cd_access='a', create_parents=True, owner=params.solr_user, @@ -40,7 +40,7 @@ def setup_solr(name = None): ) Directory([params.solr_dir, params.solr_conf], - mode=0755, + mode=0o755, cd_access='a', owner=params.solr_user, group=params.user_group, @@ -49,7 +49,7 @@ def setup_solr(name = None): ) File(params.solr_log, - mode=0644, + mode=0o644, owner=params.solr_user, group=params.user_group, content='' @@ -57,7 +57,7 @@ def setup_solr(name = None): File(format("{solr_conf}/solr-env.sh"), content=InlineTemplate(params.solr_env_content), - mode=0755, + mode=0o755, owner=params.solr_user, group=params.user_group ) @@ -79,7 +79,7 @@ def setup_solr(name = None): content=InlineTemplate(params.solr_security_json_content), owner=params.solr_user, group=params.user_group, - mode=0640 + mode=0o640 ) if params.security_enabled: @@ -91,12 +91,12 @@ def setup_solr(name = None): content=Template("solr-security.json.j2"), owner=params.solr_user, group=params.user_group, - mode=0640) + mode=0o640) if os.path.exists(params.limits_conf_dir): File(os.path.join(params.limits_conf_dir, 'solr.conf'), owner='root', group='root', - mode=0644, + mode=0o644, content=Template("solr.conf.j2") ) diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/SOLR/package/scripts/status_params.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/SOLR/package/scripts/status_params.py index 20e60d3d26e..1f91defaa52 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/SOLR/package/scripts/status_params.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/SOLR/package/scripts/status_params.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/SOLR/service_advisor.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/SOLR/service_advisor.py index f5cf7d09531..ff7c878c674 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/SOLR/service_advisor.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/SOLR/service_advisor.py @@ -33,7 +33,7 @@ service_advisor = imp.load_module('service_advisor', fp, PARENT_FILE, ('.py', 'rb', imp.PY_SOURCE)) except Exception as e: traceback.print_exc() - print "Failed to load parent" + print("Failed to load parent") class SolrServiceAdvisor(service_advisor.ServiceAdvisor): diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/SPARK/package/scripts/job_history_server.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/SPARK/package/scripts/job_history_server.py index bf181495cca..8fb59a4212b 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/SPARK/package/scripts/job_history_server.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/SPARK/package/scripts/job_history_server.py @@ -1,4 +1,4 @@ -#!/usr/bin/python +#!/usr/bin/python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/SPARK/package/scripts/params.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/SPARK/package/scripts/params.py index 445ec70e47f..222810f5b33 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/SPARK/package/scripts/params.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/SPARK/package/scripts/params.py @@ -1,4 +1,4 @@ -#!/usr/bin/python +#!/usr/bin/python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -21,7 +21,7 @@ import socket import status_params import os -from urlparse import urlparse +from urllib.parse import urlparse from ambari_commons.constants import AMBARI_SUDO_BINARY diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/SPARK/package/scripts/setup_spark.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/SPARK/package/scripts/setup_spark.py index b7335b3ccf5..7d205be57f4 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/SPARK/package/scripts/setup_spark.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/SPARK/package/scripts/setup_spark.py @@ -1,4 +1,4 @@ -#!/usr/bin/python +#!/usr/bin/python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -24,7 +24,7 @@ import os import socket -from urlparse import urlparse +from urllib.parse import urlparse from resource_management.core.exceptions import ComponentIsNotRunning from resource_management.core.logger import Logger from resource_management.core import shell @@ -49,7 +49,7 @@ def setup_spark(env, type, upgrade_type = None, action = None): Directory([params.spark_pid_dir, params.spark_log_dir], owner=params.spark_user, group=params.user_group, - mode=0775, + mode=0o775, create_parents = True ) if type == 'server' and action == 'config': @@ -57,21 +57,21 @@ def setup_spark(env, type, upgrade_type = None, action = None): owner=params.spark_user, group=params.user_group, create_parents = True, - mode=0775 + mode=0o775 ) Directory(params.spark_history_store_path, owner=params.spark_user, group=params.user_group, create_parents = True, - mode=0775 + mode=0o775 ) params.HdfsResource(params.spark_hdfs_user_dir, type="directory", action="create_on_execute", owner=params.spark_user, - mode=0775 + mode=0o775 ) if params.spark_warehouse_dir and (not params.whs_dir_protocol or params.whs_dir_protocol == urlparse(params.default_fs).scheme): @@ -80,7 +80,7 @@ def setup_spark(env, type, upgrade_type = None, action = None): type="directory", action="create_on_execute", owner=params.spark_user, - mode=0777 + mode=0o777 ) params.HdfsResource(None, action="execute") @@ -106,7 +106,7 @@ def setup_spark(env, type, upgrade_type = None, action = None): key_value_delimiter = " ", owner=params.spark_user, group=params.spark_group, - mode=0644 + mode=0o644 ) # create spark-env.sh in etc/conf dir @@ -114,7 +114,7 @@ def setup_spark(env, type, upgrade_type = None, action = None): owner=params.spark_user, group=params.spark_group, content=InlineTemplate(params.spark_env_sh), - mode=0644, + mode=0o644, ) #create log4j.properties in etc/conf dir @@ -122,7 +122,7 @@ def setup_spark(env, type, upgrade_type = None, action = None): owner=params.spark_user, group=params.spark_group, content=params.spark_log4j_properties, - mode=0644, + mode=0o644, ) #create metrics.properties in etc/conf dir @@ -130,7 +130,7 @@ def setup_spark(env, type, upgrade_type = None, action = None): owner=params.spark_user, group=params.spark_group, content=InlineTemplate(params.spark_metrics_properties), - mode=0644 + mode=0o644 ) if params.is_hive_installed: @@ -139,14 +139,14 @@ def setup_spark(env, type, upgrade_type = None, action = None): configurations=params.spark_hive_properties, owner=params.spark_user, group=params.spark_group, - mode=0644) + mode=0o644) if params.spark_thrift_fairscheduler_content: # create spark-thrift-fairscheduler.xml File(os.path.join(params.spark_conf_dir,"spark-thrift-fairscheduler.xml"), owner=params.spark_user, group=params.spark_group, - mode=0755, + mode=0o755, content=InlineTemplate(params.spark_thrift_fairscheduler_content) ) diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/SPARK/package/scripts/spark_client.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/SPARK/package/scripts/spark_client.py index 6cf1abe6d62..36917b1e2c6 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/SPARK/package/scripts/spark_client.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/SPARK/package/scripts/spark_client.py @@ -1,4 +1,4 @@ -#!/usr/bin/python +#!/usr/bin/python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/SPARK/package/scripts/spark_service.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/SPARK/package/scripts/spark_service.py index 3ce1ef35b18..2c669d41940 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/SPARK/package/scripts/spark_service.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/SPARK/package/scripts/spark_service.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -49,12 +49,12 @@ def make_tarfile(output_filename, source_dirs): parent_dir=os.path.dirname(output_filename) if not os.path.exists(parent_dir): os.makedirs(parent_dir) - os.chmod(parent_dir, 0711) + os.chmod(parent_dir, 0o711) with closing(tarfile.open(output_filename, "w:gz")) as tar: for dir in source_dirs: for file in os.listdir(dir): tar.add(os.path.join(dir,file),arcname=file) - os.chmod(output_filename, 0644) + os.chmod(output_filename, 0o644) def spark_service(name, upgrade_type=None, action=None): @@ -78,7 +78,7 @@ def spark_service(name, upgrade_type=None, action=None): action="create_on_execute", owner=params.spark_user, group=params.user_group, - mode=0777, + mode=0o777, recursive_chmod=True ) params.HdfsResource(None, action="execute") diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/SPARK/package/scripts/spark_thrift_server.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/SPARK/package/scripts/spark_thrift_server.py index f9468c439cb..5838fdefbdd 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/SPARK/package/scripts/spark_thrift_server.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/SPARK/package/scripts/spark_thrift_server.py @@ -1,4 +1,4 @@ -#!/usr/bin/python +#!/usr/bin/python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/SPARK/package/scripts/status_params.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/SPARK/package/scripts/status_params.py index 1bd8f2c3e6f..4d276bbb402 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/SPARK/package/scripts/status_params.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/SPARK/package/scripts/status_params.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/SPARK/service_advisor.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/SPARK/service_advisor.py index 55d8eaed13a..c0a496ad5ed 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/SPARK/service_advisor.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/SPARK/service_advisor.py @@ -40,7 +40,7 @@ service_advisor = imp.load_module('service_advisor', fp, PARENT_FILE, ('.py', 'rb', imp.PY_SOURCE)) except Exception as e: traceback.print_exc() - print "Failed to load parent" + print("Failed to load parent") class SparkServiceAdvisor(service_advisor.ServiceAdvisor): diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/TEZ/package/scripts/params.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/TEZ/package/scripts/params.py index c01dc620a26..145bcbdc22f 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/TEZ/package/scripts/params.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/TEZ/package/scripts/params.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/TEZ/package/scripts/params_linux.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/TEZ/package/scripts/params_linux.py index e9d64fcfeac..474b5d76e8a 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/TEZ/package/scripts/params_linux.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/TEZ/package/scripts/params_linux.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/TEZ/package/scripts/params_windows.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/TEZ/package/scripts/params_windows.py index 64c2a53cd93..f00c6a0828d 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/TEZ/package/scripts/params_windows.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/TEZ/package/scripts/params_windows.py @@ -50,5 +50,5 @@ def refresh_tez_state_dependent_params(): stack_version_formatted = get_stack_version("tez") -if os.environ.has_key("TEZ_HOME"): +if "TEZ_HOME" in os.environ: refresh_tez_state_dependent_params() diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/TEZ/package/scripts/service_check.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/TEZ/package/scripts/service_check.py index 3fe4e3fcc99..1490392a906 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/TEZ/package/scripts/service_check.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/TEZ/package/scripts/service_check.py @@ -48,7 +48,7 @@ def service_check(self, env): File(format("{tmp_dir}/sample-tez-test"), content = "foo\nbar\nfoo\nbar\nfoo", - mode = 0755 + mode = 0o755 ) params.HdfsResource("/tmp/tezsmokeoutput", diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/TEZ/package/scripts/tez.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/TEZ/package/scripts/tez.py index 2fdb675f2de..0e1d2ecdd1f 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/TEZ/package/scripts/tez.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/TEZ/package/scripts/tez.py @@ -44,7 +44,7 @@ def tez(config_dir): if config_dir is None: config_dir = params.tez_conf_dir - Directory(params.tez_conf_dir, mode=0755) + Directory(params.tez_conf_dir, mode=0o755) Directory(config_dir, owner = params.tez_user, @@ -57,13 +57,13 @@ def tez(config_dir): configuration_attributes=params.config['configurationAttributes']['tez-site'], owner = params.tez_user, group = params.user_group, - mode = 0664) + mode = 0o664) tez_env_file_path = os.path.join(config_dir, "tez-env.sh") File(tez_env_file_path, owner=params.tez_user, content=InlineTemplate(params.tez_env_sh_template), - mode=0555) + mode=0o555) @OsFamilyFuncImpl(os_family=OSConst.WINSRV_FAMILY) diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/TEZ/package/scripts/tez_client.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/TEZ/package/scripts/tez_client.py index 8c20a7302e8..e91ad261e0c 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/TEZ/package/scripts/tez_client.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/TEZ/package/scripts/tez_client.py @@ -19,7 +19,7 @@ """ import os -import urlparse +import urllib.parse from ambari_commons import OSConst from ambari_commons.inet_utils import download_file @@ -109,7 +109,7 @@ def _install_lzo_support_if_needed(self, params): hadoop_lzo_file = os.path.split(hadoop_lzo_dest_path)[1] config = Script.get_config() - file_url = urlparse.urljoin(config['ambariLevelParams']['jdk_location'], hadoop_lzo_file) + file_url = urllib.parse.urljoin(config['ambariLevelParams']['jdk_location'], hadoop_lzo_file) hadoop_lzo_dl_path = os.path.join(config["agentLevelParams"]["agentCacheDir"], hadoop_lzo_file) download_file(file_url, hadoop_lzo_dl_path) #This is for protection against configuration changes. It will infect every new destination with the lzo jar, diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/TEZ/service_advisor.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/TEZ/service_advisor.py index 684b6de5ccc..72506e679d4 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/TEZ/service_advisor.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/TEZ/service_advisor.py @@ -38,7 +38,7 @@ service_advisor = imp.load_module('service_advisor', fp, PARENT_FILE, ('.py', 'rb', imp.PY_SOURCE)) except Exception as e: traceback.print_exc() - print "Failed to load parent" + print("Failed to load parent") class TezServiceAdvisor(service_advisor.ServiceAdvisor): diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/YARN/package/alerts/alert_nodemanager_health.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/YARN/package/alerts/alert_nodemanager_health.py index d7159e4eb03..23884e686fa 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/YARN/package/alerts/alert_nodemanager_health.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/YARN/package/alerts/alert_nodemanager_health.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one @@ -20,7 +20,7 @@ import ambari_simplejson as json # simplejson is much faster comparing to Python 2.6 json module and has the same functions set. import socket -import urllib2 +import urllib.request, urllib.error, urllib.parse import logging import traceback from ambari_commons import OSCheck @@ -168,9 +168,9 @@ def execute(configurations={}, parameters={}, host_name=None): json_response = json.loads(url_response) else: # execute the query for the JSON that includes templeton status - url_response = urllib2.urlopen(query, timeout=connection_timeout) + url_response = urllib.request.urlopen(query, timeout=connection_timeout) json_response = json.loads(url_response.read()) - except urllib2.HTTPError, httpError: + except urllib.error.HTTPError as httpError: label = CRITICAL_HTTP_STATUS_MESSAGE.format(str(httpError.code), query, str(httpError), traceback.format_exc()) diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/YARN/package/alerts/alert_nodemanagers_summary.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/YARN/package/alerts/alert_nodemanagers_summary.py index adf27ecc303..b009de64264 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/YARN/package/alerts/alert_nodemanagers_summary.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/YARN/package/alerts/alert_nodemanagers_summary.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one @@ -18,7 +18,7 @@ limitations under the License. """ -import urllib2 +import urllib.request, urllib.error, urllib.parse import ambari_simplejson as json # simplejson is much faster comparing to Python 2.6 json module and has the same functions set. import logging import traceback @@ -140,7 +140,7 @@ def execute(configurations={}, parameters={}, host_name=None): try: url_response_json = json.loads(url_response) live_nodemanagers = json.loads(find_value_in_jmx(url_response_json, "LiveNodeManagers", live_nodemanagers_qry)) - except ValueError, error: + except ValueError as error: convert_to_json_failed = True logger.exception("[Alert][{0}] Convert response to json failed or json doesn't contain needed data: {1}". format("NodeManager Health Summary", str(error))) @@ -191,7 +191,7 @@ def get_value_from_jmx(query, jmx_property, connection_timeout): try: # use a customer header process that will look for the non-standard # "Refresh" header and attempt to follow the redirect - url_opener = urllib2.build_opener(RefreshHeaderProcessor()) + url_opener = urllib.request.build_opener(RefreshHeaderProcessor()) response = url_opener.open(query, timeout=connection_timeout) data = response.read() diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/YARN/package/files/validateYarnComponentStatusWindows.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/YARN/package/files/validateYarnComponentStatusWindows.py index 218b893cffd..4f2d4b062a3 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/YARN/package/files/validateYarnComponentStatusWindows.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/YARN/package/files/validateYarnComponentStatusWindows.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -19,9 +19,9 @@ ''' import optparse -from ambari_commons import subprocess32 +import subprocess import ambari_simplejson as json # simplejson is much faster comparing to Python 2.6 json module and has the same functions set. -import urllib2 +import urllib.request, urllib.error, urllib.parse RESOURCEMANAGER = 'rm' NODEMANAGER = 'nm' @@ -38,16 +38,16 @@ def getResponse(path, address, ssl_enabled): url = 'http://' + address + path try: - handle = urllib2.urlopen(url) + handle = urllib.request.urlopen(url) output = handle.read() handle.close() response = json.loads(output) if response == None: - print 'There is no response for url: ' + str(url) + print('There is no response for url: ' + str(url)) exit(1) return response except Exception as e: - print 'Error getting response for url:' + str(url), e + print('Error getting response for url:' + str(url), e) exit(1) #Verify that REST api is available for given component @@ -59,7 +59,7 @@ def validateAvailability(component, path, address, ssl_enabled): if not is_valid: exit(1) except Exception as e: - print 'Error checking availability status of component', e + print('Error checking availability status of component', e) exit(1) #Validate component-specific response @@ -70,7 +70,7 @@ def validateAvailabilityResponse(component, response): if rm_state == STARTED_STATE: return True else: - print 'Resourcemanager is not started' + print('Resourcemanager is not started') return False elif component == NODEMANAGER: @@ -88,7 +88,7 @@ def validateAvailabilityResponse(component, response): else: return False except Exception as e: - print 'Error validation of availability response for ' + str(component), e + print('Error validation of availability response for ' + str(component), e) return False #Verify that component has required resources to work @@ -100,7 +100,7 @@ def validateAbility(component, path, address, ssl_enabled): if not is_valid: exit(1) except Exception as e: - print 'Error checking ability of component', e + print('Error checking ability of component', e) exit(1) #Validate component-specific response that it has required resources to work @@ -108,24 +108,24 @@ def validateAbilityResponse(component, response): try: if component == RESOURCEMANAGER: nodes = [] - if response.has_key('nodes') and not response['nodes'] == None and response['nodes'].has_key('node'): + if 'nodes' in response and not response['nodes'] == None and 'node' in response['nodes']: nodes = response['nodes']['node'] connected_nodes_count = len(nodes) if connected_nodes_count == 0: - print 'There is no connected nodemanagers to resourcemanager' + print('There is no connected nodemanagers to resourcemanager') return False - active_nodes = filter(lambda x: x['state'] == RUNNING_STATE, nodes) + active_nodes = [x for x in nodes if x['state'] == RUNNING_STATE] active_nodes_count = len(active_nodes) if connected_nodes_count == 0: - print 'There is no connected active nodemanagers to resourcemanager' + print('There is no connected active nodemanagers to resourcemanager') return False else: return True else: return False except Exception as e: - print 'Error validation of ability response', e + print('Error validation of ability response', e) return False # diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/YARN/package/scripts/install_jars.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/YARN/package/scripts/install_jars.py index 728a0148b97..ba4788fef43 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/YARN/package/scripts/install_jars.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/YARN/package/scripts/install_jars.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -34,7 +34,7 @@ def install_tez_jars(): type="directory", action="create_on_execute", owner=params.tez_user, - mode=0755 + mode=0o755 ) app_dir_path = None @@ -56,25 +56,25 @@ def install_tez_jars(): if lib_dir_path: tez_jars[params.tez_local_lib_jars] = lib_dir_path - for src_file_regex, dest_dir in tez_jars.iteritems(): + for src_file_regex, dest_dir in tez_jars.items(): for src_filepath in glob.glob(src_file_regex): src_filename = os.path.basename(src_filepath) params.HdfsResource(format("{dest_dir}/{src_filename}"), type="file", action="create_on_execute", source=src_filepath, - mode=0755, + mode=0o755, owner=params.tez_user ) - for src_file_regex, dest_dir in tez_jars.iteritems(): + for src_file_regex, dest_dir in tez_jars.items(): for src_filepath in glob.glob(src_file_regex): src_filename = os.path.basename(src_filepath) params.HdfsResource(format("{dest_dir}/{src_filename}"), type="file", action="create_on_execute", source=src_filepath, - mode=0755, + mode=0o755, owner=params.tez_user ) params.HdfsResource(None, action="execute") diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/YARN/package/scripts/nodemanager_upgrade.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/YARN/package/scripts/nodemanager_upgrade.py index 24075980097..22cd8cc7f45 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/YARN/package/scripts/nodemanager_upgrade.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/YARN/package/scripts/nodemanager_upgrade.py @@ -17,7 +17,7 @@ """ -from ambari_commons import subprocess32 +import subprocess from resource_management.core.logger import Logger from resource_management.core.exceptions import Fail diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/YARN/package/scripts/params.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/YARN/package/scripts/params.py index d0ad6f601d1..0e1d12bab71 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/YARN/package/scripts/params.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/YARN/package/scripts/params.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/YARN/package/scripts/params_linux.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/YARN/package/scripts/params_linux.py index 5950386ad3c..3308f8861a6 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/YARN/package/scripts/params_linux.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/YARN/package/scripts/params_linux.py @@ -157,9 +157,9 @@ def get_spark_version(service_name, component_name, yarn_version): # ats 1.5 properties entity_groupfs_active_dir = config['configurations']['yarn-site']['yarn.timeline-service.entity-group-fs-store.active-dir'] -entity_groupfs_active_dir_mode = 01777 +entity_groupfs_active_dir_mode = 0o1777 entity_groupfs_store_dir = config['configurations']['yarn-site']['yarn.timeline-service.entity-group-fs-store.done-dir'] -entity_groupfs_store_dir_mode = 0700 +entity_groupfs_store_dir_mode = 0o700 hadoop_conf_secure_dir = os.path.join(hadoop_conf_dir, "secure") @@ -181,7 +181,7 @@ def get_spark_version(service_name, component_name, yarn_version): smokeuser = config['configurations']['cluster-env']['smokeuser'] smokeuser_principal = config['configurations']['cluster-env']['smokeuser_principal_name'] -smoke_hdfs_user_mode = 0770 +smoke_hdfs_user_mode = 0o770 security_enabled = config['configurations']['cluster-env']['security_enabled'] nm_security_marker_dir = "/var/lib/hadoop-yarn" nm_security_marker = format('{nm_security_marker_dir}/nm_security_enabled') @@ -192,7 +192,7 @@ def get_spark_version(service_name, component_name, yarn_version): yarn_executor_container_group = config['configurations']['yarn-site']['yarn.nodemanager.linux-container-executor.group'] yarn_nodemanager_container_executor_class = config['configurations']['yarn-site']['yarn.nodemanager.container-executor.class'] is_linux_container_executor = (yarn_nodemanager_container_executor_class == 'org.apache.hadoop.yarn.server.nodemanager.LinuxContainerExecutor') -container_executor_mode = 06050 if is_linux_container_executor else 02050 +container_executor_mode = 0o6050 if is_linux_container_executor else 0o2050 kinit_path_local = get_kinit_path(default('/configurations/kerberos-env/executable_search_paths', None)) yarn_http_policy = config['configurations']['yarn-site']['yarn.http.policy'] yarn_https_on = (yarn_http_policy.upper() == 'HTTPS_ONLY') @@ -233,7 +233,7 @@ def get_spark_version(service_name, component_name, yarn_version): rm_webui_https_address = format("{rm_host}:{rm_https_port}") if security_enabled: - tc_mode = 0644 + tc_mode = 0o644 tc_owner = "root" else: tc_mode = None @@ -499,7 +499,7 @@ def get_spark_version(service_name, component_name, yarn_version): ranger_plugin_config = { 'username' : config['configurations']['ranger-yarn-plugin-properties']['REPOSITORY_CONFIG_USERNAME'], - 'password' : unicode(config['configurations']['ranger-yarn-plugin-properties']['REPOSITORY_CONFIG_PASSWORD']), + 'password' : str(config['configurations']['ranger-yarn-plugin-properties']['REPOSITORY_CONFIG_PASSWORD']), 'yarn.url' : format('{scheme}://{yarn_rest_url}'), 'commonNameForCertificate' : config['configurations']['ranger-yarn-plugin-properties']['common.name.for.certificate'] } diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/YARN/package/scripts/service.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/YARN/package/scripts/service.py index 547b3cba35b..835ea17815b 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/YARN/package/scripts/service.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/YARN/package/scripts/service.py @@ -31,7 +31,7 @@ @OsFamilyFuncImpl(os_family=OSConst.WINSRV_FAMILY) def service(componentName, action='start', serviceName='yarn'): import status_params - if status_params.service_map.has_key(componentName): + if componentName in status_params.service_map: service_name = status_params.service_map[componentName] if action == 'start' or action == 'stop': Service(service_name, action=action) diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/YARN/package/scripts/service_check.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/YARN/package/scripts/service_check.py index 24baa0e08c4..02bb16ee364 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/YARN/package/scripts/service_check.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/YARN/package/scripts/service_check.py @@ -22,7 +22,7 @@ import sys import ambari_simplejson as json # simplejson is much faster comparing to Python 2.6 json module and has the same functions set. import re -from ambari_commons import subprocess32 +import subprocess from ambari_commons import os_utils from ambari_commons import OSConst from ambari_commons.os_family_impl import OsFamilyImpl diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/YARN/package/scripts/setup_ranger_yarn.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/YARN/package/scripts/setup_ranger_yarn.py index 8fc648269c3..0f7ace7b497 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/YARN/package/scripts/setup_ranger_yarn.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/YARN/package/scripts/setup_ranger_yarn.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -34,7 +34,7 @@ def setup_ranger_yarn(): action="create_on_execute", owner=params.hdfs_user, group=params.hdfs_user, - mode=0755, + mode=0o755, recursive_chmod=True ) params.HdfsResource("/ranger/audit/yarn", @@ -42,7 +42,7 @@ def setup_ranger_yarn(): action="create_on_execute", owner=params.yarn_user, group=params.yarn_user, - mode=0700, + mode=0o700, recursive_chmod=True ) params.HdfsResource(None, action="execute") diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/YARN/package/scripts/status_params.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/YARN/package/scripts/status_params.py index ad31e0b8d5e..aaace6cd864 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/YARN/package/scripts/status_params.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/YARN/package/scripts/status_params.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/YARN/package/scripts/yarn.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/YARN/package/scripts/yarn.py index 1cc4d8aedc0..92eed757400 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/YARN/package/scripts/yarn.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/YARN/package/scripts/yarn.py @@ -56,7 +56,7 @@ def yarn(name=None, config_dir=None): owner=params.yarn_user, group=params.user_group, create_parents=True, - mode=0755, + mode=0o755, cd_access='a', ) @@ -96,7 +96,7 @@ def yarn(name=None, config_dir=None): configuration_attributes=params.config['configurationAttributes']['core-site'], owner=params.hdfs_user, group=params.user_group, - mode=0644 + mode=0o644 ) # During RU, Core Masters and Slaves need hdfs-site.xml @@ -108,7 +108,7 @@ def yarn(name=None, config_dir=None): configuration_attributes=params.config['configurationAttributes']['hdfs-site'], owner=params.hdfs_user, group=params.user_group, - mode=0644 + mode=0o644 ) XmlConfig("mapred-site.xml", @@ -117,7 +117,7 @@ def yarn(name=None, config_dir=None): configuration_attributes=params.config['configurationAttributes']['mapred-site'], owner=params.yarn_user, group=params.user_group, - mode=0644 + mode=0o644 ) XmlConfig("yarn-site.xml", @@ -126,7 +126,7 @@ def yarn(name=None, config_dir=None): configuration_attributes=params.config['configurationAttributes']['yarn-site'], owner=params.yarn_user, group=params.user_group, - mode=0644 + mode=0o644 ) XmlConfig("capacity-scheduler.xml", @@ -135,23 +135,22 @@ def yarn(name=None, config_dir=None): configuration_attributes=params.config['configurationAttributes']['capacity-scheduler'], owner=params.yarn_user, group=params.user_group, - mode=0644 + mode=0o644 ) - File(format("{limits_conf_dir}/yarn.conf"), - mode=0644, + mode=0o644, content=Template('yarn.conf.j2') ) File(format("{limits_conf_dir}/mapreduce.conf"), - mode=0644, + mode=0o644, content=Template('mapreduce.conf.j2') ) File(os.path.join(config_dir, "yarn-env.sh"), owner=params.yarn_user, group=params.user_group, - mode=0755, + mode=0o755, content=InlineTemplate(params.yarn_env_sh_template) ) @@ -162,19 +161,19 @@ def yarn(name=None, config_dir=None): File(os.path.join(config_dir, "container-executor.cfg"), group=params.user_group, - mode=0644, + mode=0o644, content=InlineTemplate(params.container_executor_cfg_template) ) Directory(params.cgroups_dir, group=params.user_group, create_parents = True, - mode=0755, + mode=0o755, cd_access="a") File(os.path.join(config_dir, "mapred-env.sh"), owner=params.tc_owner, - mode=0755, + mode=0o755, content=InlineTemplate(params.mapred_env_sh_template) ) @@ -182,7 +181,7 @@ def yarn(name=None, config_dir=None): File(os.path.join(params.hadoop_bin, "task-controller"), owner="root", group=params.mapred_tt_group, - mode=06050 + mode=0o6050 ) File(os.path.join(config_dir, 'taskcontroller.cfg'), owner = params.tc_owner, @@ -296,7 +295,7 @@ def setup_historyserver(): type="directory", owner=params.yarn_user, group=params.user_group, - mode=01777, + mode=0o1777, recursive_chmod=True ) @@ -306,7 +305,7 @@ def setup_historyserver(): action="create_on_execute", type="directory", owner=params.hdfs_user, - mode=0777, + mode=0o777, ) params.HdfsResource(params.entity_file_history_directory, @@ -331,7 +330,7 @@ def setup_historyserver(): owner=params.mapred_user, group=params.user_group, change_permissions_for_parents=True, - mode=0777 + mode=0o777 ) params.HdfsResource(None, action="execute") Directory(params.jhs_leveldb_state_store_dir, @@ -374,14 +373,14 @@ def setup_nodemanager(): File(params.nm_log_dir_to_mount_file, owner=params.hdfs_user, group=params.user_group, - mode=0644, + mode=0o644, content=nm_log_dir_to_mount_file_content ) nm_local_dir_to_mount_file_content = handle_mounted_dirs(create_local_dir, params.nm_local_dirs, params.nm_local_dir_to_mount_file, params) File(params.nm_local_dir_to_mount_file, owner=params.hdfs_user, group=params.user_group, - mode=0644, + mode=0o644, content=nm_local_dir_to_mount_file_content ) @@ -389,7 +388,7 @@ def setup_resourcemanager(): import params Directory(params.rm_nodes_exclude_dir, - mode=0755, + mode=0o755, create_parents=True, cd_access='a', ) @@ -400,7 +399,7 @@ def setup_resourcemanager(): ) if params.include_hosts: Directory(params.rm_nodes_include_dir, - mode=0755, + mode=0o755, create_parents=True, cd_access='a', ) @@ -419,7 +418,7 @@ def setup_resourcemanager(): action="create_on_execute", owner=params.yarn_user, group=params.user_group, - mode=0700 + mode=0o700 ) params.HdfsResource(None, action="execute") @@ -450,7 +449,7 @@ def setup_ats(): change_permissions_for_parents=True, owner=params.yarn_user, group=params.user_group, - mode=0755 + mode=0o755 ) params.HdfsResource(params.entity_groupfs_store_dir, type="directory", @@ -467,7 +466,7 @@ def setup_ats(): change_permissions_for_parents=True, owner=params.yarn_user, group=params.user_group, - mode=0755 + mode=0o755 ) params.HdfsResource(params.entity_groupfs_active_dir, type="directory", @@ -483,7 +482,7 @@ def create_log_dir(dir_name): Directory(dir_name, create_parents = True, cd_access="a", - mode=0775, + mode=0o775, owner=params.yarn_user, group=params.user_group, ignore_failures=True, @@ -501,7 +500,7 @@ def create_local_dir(dir_name): Directory(dir_name, create_parents=True, cd_access="a", - mode=0755, + mode=0o755, owner=params.yarn_user, group=params.user_group, ignore_failures=True, @@ -531,7 +530,7 @@ def yarn(name = None): mode='f' ) - if params.service_map.has_key(name): + if name in params.service_map: service_name = params.service_map[name] ServiceConfig(service_name, diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/YARN/service_advisor.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/YARN/service_advisor.py index a9d9403ebc3..401cbcea51a 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/YARN/service_advisor.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/YARN/service_advisor.py @@ -41,7 +41,7 @@ service_advisor = imp.load_module('service_advisor', fp, PARENT_FILE, ('.py', 'rb', imp.PY_SOURCE)) except Exception as e: traceback.print_exc() - print "Failed to load parent" + print("Failed to load parent") class YARNServiceAdvisor(service_advisor.ServiceAdvisor): @@ -946,7 +946,7 @@ def calculate_yarn_apptimelineserver_heapsize(self, host_mem, yarn_timeline_app_ if host_mem < 4096: ats_heapsize = 1024 else: - ats_heapsize = long(min(math.floor(host_mem/2), long(yarn_timeline_app_cache_size) * 500 + 3072)) + ats_heapsize = int(min(math.floor(host_mem/2), int(yarn_timeline_app_cache_size) * 500 + 3072)) return ats_heapsize """ @@ -1048,7 +1048,7 @@ def updateLlapConfigs(self, configurations, services, hosts, llap_queue_name): self.setLlapDaemonQueuePropAttributes(services, configurations) if not services["changed-configurations"]: - read_llap_daemon_yarn_cont_mb = long(self.get_yarn_min_container_size(services, configurations)) + read_llap_daemon_yarn_cont_mb = int(self.get_yarn_min_container_size(services, configurations)) putHiveInteractiveSiteProperty("hive.llap.daemon.yarn.container.mb", read_llap_daemon_yarn_cont_mb) putHiveInteractiveSitePropertyAttribute('hive.llap.daemon.yarn.container.mb', "minimum", read_llap_daemon_yarn_cont_mb) putHiveInteractiveSitePropertyAttribute('hive.llap.daemon.yarn.container.mb', "maximum", self.__get_min_hsi_mem(services, hosts) * 0.8) @@ -1149,7 +1149,7 @@ def updateLlapConfigs(self, configurations, services, hosts, llap_queue_name): self.logger.info("DBG: Calculated total_cluster_capacity : {0}, using following : node_manager_cnt : {1}, " "yarn_nm_mem_in_mb : {2}".format(total_cluster_capacity, node_manager_cnt, yarn_nm_mem_in_mb)) yarn_min_container_size = float(self.get_yarn_min_container_size(services, configurations)) - tez_am_container_size = self.calculate_tez_am_container_size(services, long(total_cluster_capacity), is_cluster_create_opr, + tez_am_container_size = self.calculate_tez_am_container_size(services, int(total_cluster_capacity), is_cluster_create_opr, changed_configs_has_enable_hive_int) normalized_tez_am_container_size = self._normalizeUp(tez_am_container_size, yarn_min_container_size) @@ -1292,7 +1292,7 @@ def updateLlapConfigs(self, configurations, services, hosts, llap_queue_name): self.logger.info("DBG: Readjusted 'llap_concurrency' to : 1. Earlier calculated value : 0") if llap_concurrency * normalized_tez_am_container_size > hive_tez_am_cap_available: - llap_concurrency = long(math.floor(hive_tez_am_cap_available / normalized_tez_am_container_size)) + llap_concurrency = int(math.floor(hive_tez_am_cap_available / normalized_tez_am_container_size)) self.logger.info("DBG: Readjusted 'llap_concurrency' to : {0}, as llap_concurrency({1}) * normalized_tez_am_container_size({2}) > hive_tez_am_cap_available({3}))" .format(llap_concurrency, llap_concurrency, normalized_tez_am_container_size, hive_tez_am_cap_available)) @@ -1305,7 +1305,7 @@ def updateLlapConfigs(self, configurations, services, hosts, llap_queue_name): else: # Read current value if 'hive.server2.tez.sessions.per.default.queue' in hsi_site: - llap_concurrency = long(hsi_site['hive.server2.tez.sessions.per.default.queue']) + llap_concurrency = int(hsi_site['hive.server2.tez.sessions.per.default.queue']) if llap_concurrency <= 0: self.logger.warning("'hive.server2.tez.sessions.per.default.queue' current value : {0}. Expected value : >= 1".format(llap_concurrency)) self.recommendDefaultLlapConfiguration(configurations, services, hosts) @@ -1412,10 +1412,10 @@ def updateLlapConfigs(self, configurations, services, hosts, llap_queue_name): self.logger.info("DBG: Calculated 'Cache per node' : {0}, using following : llap_daemon_mem_per_node : {1}, total_mem_for_executors_per_node : {2}" .format(cache_mem_per_node, llap_daemon_mem_per_node, total_mem_for_executors_per_node)) - tez_runtime_io_sort_mb = (long((0.8 * mem_per_thread_for_llap) / 3)) - tez_runtime_unordered_output_buffer_size = long(0.8 * 0.075 * mem_per_thread_for_llap) + tez_runtime_io_sort_mb = (int((0.8 * mem_per_thread_for_llap) / 3)) + tez_runtime_unordered_output_buffer_size = int(0.8 * 0.075 * mem_per_thread_for_llap) # 'hive_auto_convert_join_noconditionaltask_size' value is in bytes. Thus, multiplying it by 1048576. - hive_auto_convert_join_noconditionaltask_size = (long((0.8 * mem_per_thread_for_llap) / 3)) * MB_TO_BYTES + hive_auto_convert_join_noconditionaltask_size = (int((0.8 * mem_per_thread_for_llap) / 3)) * MB_TO_BYTES # Calculate value for prop 'llap_heap_size' llap_xmx = max(total_mem_for_executors_per_node * 0.8, total_mem_for_executors_per_node - self.get_llap_headroom_space(services, configurations)) @@ -1428,7 +1428,7 @@ def updateLlapConfigs(self, configurations, services, hosts, llap_queue_name): # If its None, read the base service YARN's NODEMANAGER node memory, as are host are considered homogenous. hive_server_interactive_hosts = self.getHostsWithComponent("YARN", "NODEMANAGER", services, hosts) if hive_server_interactive_hosts is not None and len(hive_server_interactive_hosts) > 0: - host_mem = long(hive_server_interactive_hosts[0]["Hosts"]["total_mem"]) + host_mem = int(hive_server_interactive_hosts[0]["Hosts"]["total_mem"]) hive_server_interactive_heapsize = min(max(2048.0, 400.0*llap_concurrency), 3.0/8 * host_mem) self.logger.info("DBG: Calculated 'hive_server_interactive_heapsize' : {0}, using following : llap_concurrency : {1}, host_mem : " "{2}".format(hive_server_interactive_heapsize, llap_concurrency, host_mem)) @@ -1437,15 +1437,15 @@ def updateLlapConfigs(self, configurations, services, hosts, llap_queue_name): self.logger.info("DBG: Applying the calculated values....") if is_cluster_create_opr or changed_configs_has_enable_hive_int: - normalized_tez_am_container_size = long(normalized_tez_am_container_size) + normalized_tez_am_container_size = int(normalized_tez_am_container_size) putTezInteractiveSiteProperty('tez.am.resource.memory.mb', normalized_tez_am_container_size) self.logger.info("DBG: Setting 'tez.am.resource.memory.mb' config value as : {0}".format(normalized_tez_am_container_size)) if not llap_concurrency_in_changed_configs: - putHiveInteractiveSiteProperty('hive.server2.tez.sessions.per.default.queue', max(long(num_executors_per_node/16), 1)) - putHiveInteractiveSitePropertyAttribute('hive.server2.tez.sessions.per.default.queue', "maximum", max(long(num_executors_per_node/4), 1)) + putHiveInteractiveSiteProperty('hive.server2.tez.sessions.per.default.queue', max(int(num_executors_per_node/16), 1)) + putHiveInteractiveSitePropertyAttribute('hive.server2.tez.sessions.per.default.queue', "maximum", max(int(num_executors_per_node/4), 1)) - num_llap_nodes = long(num_llap_nodes) + num_llap_nodes = int(num_llap_nodes) putHiveInteractiveEnvPropertyAttribute('num_llap_nodes', "minimum", min_nodes_required) putHiveInteractiveEnvPropertyAttribute('num_llap_nodes', "maximum", node_manager_cnt) #TODO A single value is not being set for numNodes in case of a custom queue. Also the attribute is set to non-visible, so the UI likely ends up using an old cached value @@ -1461,7 +1461,7 @@ def updateLlapConfigs(self, configurations, services, hosts, llap_queue_name): putHiveInteractiveEnvProperty('num_llap_nodes_for_llap_daemons', num_llap_nodes) self.logger.info("DBG: Setting config 'num_llap_nodes_for_llap_daemons' as : {0}".format(num_llap_nodes)) - llap_container_size = long(llap_daemon_mem_per_node) + llap_container_size = int(llap_daemon_mem_per_node) putHiveInteractiveSiteProperty('hive.llap.daemon.yarn.container.mb', llap_container_size) putHiveInteractiveSitePropertyAttribute('hive.llap.daemon.yarn.container.mb', "minimum", yarn_min_container_size) putHiveInteractiveSitePropertyAttribute('hive.llap.daemon.yarn.container.mb', "maximum", self.__get_min_hsi_mem(services, hosts) * 0.8) @@ -1469,7 +1469,7 @@ def updateLlapConfigs(self, configurations, services, hosts, llap_queue_name): # Set 'hive.tez.container.size' only if it is read as "SET_ON_FIRST_INVOCATION", implying initialization. # Else, we don't (1). Override the previous calculated value or (2). User provided value. if is_cluster_create_opr or changed_configs_has_enable_hive_int: - mem_per_thread_for_llap = long(mem_per_thread_for_llap) + mem_per_thread_for_llap = int(mem_per_thread_for_llap) putHiveInteractiveSiteProperty('hive.tez.container.size', mem_per_thread_for_llap) self.logger.info("DBG: Setting 'hive.tez.container.size' config value as : {0}".format(mem_per_thread_for_llap)) @@ -1481,15 +1481,15 @@ def updateLlapConfigs(self, configurations, services, hosts, llap_queue_name): putTezInteractiveSiteProperty('tez.runtime.unordered.output.buffer.size-mb', tez_runtime_unordered_output_buffer_size) putHiveInteractiveSiteProperty('hive.auto.convert.join.noconditionaltask.size', hive_auto_convert_join_noconditionaltask_size) - num_executors_per_node = long(num_executors_per_node) + num_executors_per_node = int(num_executors_per_node) self.logger.info("DBG: Putting num_executors_per_node as {0}".format(num_executors_per_node)) putHiveInteractiveSiteProperty('hive.llap.daemon.num.executors', num_executors_per_node) putHiveInteractiveSitePropertyAttribute('hive.llap.daemon.num.executors', "minimum", 1) - putHiveInteractiveSitePropertyAttribute('hive.llap.daemon.num.executors', "maximum", long(num_executors_per_node_max)) + putHiveInteractiveSitePropertyAttribute('hive.llap.daemon.num.executors', "maximum", int(num_executors_per_node_max)) # 'hive.llap.io.threadpool.size' config value is to be set same as value calculated for # 'hive.llap.daemon.num.executors' at all times. - cache_mem_per_node = long(cache_mem_per_node) + cache_mem_per_node = int(cache_mem_per_node) putHiveInteractiveSiteProperty('hive.llap.io.threadpool.size', num_executors_per_node) putHiveInteractiveSiteProperty('hive.llap.io.memory.size', cache_mem_per_node) @@ -1500,11 +1500,11 @@ def updateLlapConfigs(self, configurations, services, hosts, llap_queue_name): putHiveInteractiveEnvProperty("hive_heapsize", int(hive_server_interactive_heapsize)) ssd_cache_on = services["configurations"]["hive-interactive-site"]["properties"]["hive.llap.io.allocator.mmap"] == "true" - llap_io_enabled = 'true' if long(cache_mem_per_node) >= 1024 or ssd_cache_on else 'false' + llap_io_enabled = 'true' if int(cache_mem_per_node) >= 1024 or ssd_cache_on else 'false' services["forced-configurations"].append({"type" : "hive-interactive-site", "name" : "hive.llap.io.enabled"}) putHiveInteractiveSiteProperty('hive.llap.io.enabled', llap_io_enabled) - putHiveInteractiveEnvProperty('llap_heap_size', long(llap_xmx)) + putHiveInteractiveEnvProperty('llap_heap_size', int(llap_xmx)) self.logger.info("DBG: Done putting all configs") def recommendDefaultLlapConfiguration(self, configurations, services, hosts): @@ -1515,7 +1515,7 @@ def recommendDefaultLlapConfiguration(self, configurations, services, hosts): putHiveInteractiveEnvProperty = self.putProperty(configurations, "hive-interactive-env", services) putHiveInteractiveEnvPropertyAttribute = self.putPropertyAttribute(configurations, "hive-interactive-env") - yarn_min_container_size = long(self.get_yarn_min_container_size(services, configurations)) + yarn_min_container_size = int(self.get_yarn_min_container_size(services, configurations)) node_manager_host_list = self.getHostsForComponent(services, "YARN", "NODEMANAGER") node_manager_cnt = len(node_manager_host_list) @@ -1714,7 +1714,7 @@ def checkAndManageLlapQueue(self, services, configurations, hosts, llap_queue_na # one concatenated string. updated_cap_sched_configs_as_dict = False if not received_as_key_value_pair: - for prop, val in capacity_scheduler_properties.items(): + for prop, val in list(capacity_scheduler_properties.items()): if llap_queue_name not in prop: if prop == 'yarn.scheduler.capacity.root.queues': updated_cap_sched_configs_str = updated_cap_sched_configs_str \ @@ -2039,10 +2039,10 @@ def min_queue_perc_reqd_for_llap_and_hive_app(self, services, hosts, configurati total_queue_size_at_20_perc = 20.0 / 100 * total_cluster_cap # Calculate based on minimum size required by containers. - yarn_min_container_size = long(self.get_yarn_min_container_size(services, configurations)) + yarn_min_container_size = int(self.get_yarn_min_container_size(services, configurations)) yarn_service_am_size = self.calculate_yarn_service_am_size(float(yarn_min_container_size)) - hive_tez_container_size = long(self.get_hive_tez_container_size(services)) - tez_am_container_size = self.calculate_tez_am_container_size(services, long(total_cluster_cap)) + hive_tez_container_size = int(self.get_hive_tez_container_size(services)) + tez_am_container_size = self.calculate_tez_am_container_size(services, int(total_cluster_cap)) normalized_val = self._normalizeUp(yarn_service_am_size, yarn_min_container_size) \ + self._normalizeUp(hive_tez_container_size, yarn_min_container_size) \ + self._normalizeUp(tez_am_container_size, yarn_min_container_size) diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/ZEPPELIN/package/scripts/interpreter_json_template.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/ZEPPELIN/package/scripts/interpreter_json_template.py index 6a64d0c7b31..64efd94f698 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/ZEPPELIN/package/scripts/interpreter_json_template.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/ZEPPELIN/package/scripts/interpreter_json_template.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -137,7 +137,7 @@ "zeppelin.R.render.options": { "type": "string", "name": "zeppelin.R.render.options", - "value": "out.format \u003d \u0027html\u0027, comment \u003d NA, echo \u003d FALSE, results \u003d \u0027asis\u0027, message \u003d F, warning \u003d F" + "value": "out.format \\u003d \\u0027html\\u0027, comment \\u003d NA, echo \\u003d FALSE, results \\u003d \\u0027asis\\u0027, message \\u003d F, warning \\u003d F" }, "zeppelin.R.cmd": { "type": "string", diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/ZEPPELIN/package/scripts/params.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/ZEPPELIN/package/scripts/params.py index 2d7593c4709..27b86b38afb 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/ZEPPELIN/package/scripts/params.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/ZEPPELIN/package/scripts/params.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/ZEPPELIN/package/scripts/zeppelin_server.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/ZEPPELIN/package/scripts/zeppelin_server.py index 12ed5063f34..e9f099a57d5 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/ZEPPELIN/package/scripts/zeppelin_server.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/ZEPPELIN/package/scripts/zeppelin_server.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -89,7 +89,7 @@ def create_zeppelin_log_dir(self, env): group=params.zeppelin_group, cd_access="a", create_parents=True, - mode=0755 + mode=0o755 ) def create_zeppelin_hdfs_conf_dir(self, env): @@ -100,7 +100,7 @@ def create_zeppelin_hdfs_conf_dir(self, env): group=params.zeppelin_group, cd_access="a", create_parents=True, - mode=0755 + mode=0o755 ) def chown_zeppelin_pid_dir(self, env): @@ -123,7 +123,7 @@ def configure(self, env): cd_access="a", create_parents=True, recursive_ownership=True, - mode=0755 + mode=0o755 ) self.chown_zeppelin_pid_dir(env) @@ -159,7 +159,7 @@ def configure(self, env): configuration_attributes=params.config['configurationAttributes']['hbase-site'], owner=params.zeppelin_user, group=params.zeppelin_group, - mode=0644) + mode=0o644) XmlConfig("hdfs-site.xml", conf_dir=params.external_dependency_conf, @@ -167,7 +167,7 @@ def configure(self, env): configuration_attributes=params.config['configurationAttributes']['hdfs-site'], owner=params.zeppelin_user, group=params.zeppelin_group, - mode=0644) + mode=0o644) XmlConfig("core-site.xml", conf_dir=params.external_dependency_conf, @@ -175,7 +175,7 @@ def configure(self, env): configuration_attributes=params.config['configurationAttributes']['core-site'], owner=params.zeppelin_user, group=params.zeppelin_group, - mode=0644, + mode=0o644, xml_include_file=params.mount_table_xml_inclusion_file_full_path) if params.mount_table_content: @@ -183,7 +183,7 @@ def configure(self, env): owner=params.zeppelin_user, group=params.zeppelin_group, content=params.mount_table_content, - mode=0644 + mode=0o644 ) def check_and_copy_notebook_in_hdfs(self, params): @@ -437,7 +437,7 @@ def set_interpreter_settings(self, config_data): File(interpreter_config, group=params.zeppelin_group, owner=params.zeppelin_user, - mode=0644, + mode=0o644, content=json.dumps(config_data, indent=2)) if params.conf_stored_in_hdfs: @@ -655,7 +655,7 @@ def create_interpreter_json(self): content=interpreter_json, owner=params.zeppelin_user, group=params.zeppelin_group, - mode=0664) + mode=0o664) if params.conf_stored_in_hdfs: params.HdfsResource(self.get_zeppelin_conf_FS(params), diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/ZEPPELIN/service_advisor.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/ZEPPELIN/service_advisor.py index cfdf8ab4791..54d3b585e62 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/ZEPPELIN/service_advisor.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/ZEPPELIN/service_advisor.py @@ -39,7 +39,7 @@ service_advisor = imp.load_module('service_advisor', fp, PARENT_FILE, ('.py', 'rb', imp.PY_SOURCE)) except Exception as e: traceback.print_exc() - print "Failed to load parent" + print("Failed to load parent") class ZeppelinServiceAdvisor(service_advisor.ServiceAdvisor): @@ -270,7 +270,7 @@ def __conditionallyUpdateSuperUsers(self, config_name, property_name, user_to_ad if superusers: _superusers = superusers.split(',') _superusers = [x.strip() for x in _superusers] - _superusers = filter(None, _superusers) # Removes empty string elements from array + _superusers = [_f for _f in _superusers if _f] # Removes empty string elements from array else: _superusers = [] diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/ZOOKEEPER/package/scripts/service_check.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/ZOOKEEPER/package/scripts/service_check.py index 05177a595db..7ddcfb19977 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/ZOOKEEPER/package/scripts/service_check.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/ZOOKEEPER/package/scripts/service_check.py @@ -36,7 +36,7 @@ def service_check(self, env): env.set_params(params) File(format("{zk_log_dir}/zookeeper.log"), - mode=0664, + mode=0o664, owner=params.zk_user, group=params.user_group, ) @@ -46,7 +46,7 @@ def service_check(self, env): ) File(format("{tmp_dir}/zkSmoke.sh"), - mode=0755, + mode=0o755, content=StaticFile('zkSmoke.sh') ) diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/ZOOKEEPER/package/scripts/status_params.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/ZOOKEEPER/package/scripts/status_params.py index c74dbb1c294..cb172138fbc 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/ZOOKEEPER/package/scripts/status_params.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/ZOOKEEPER/package/scripts/status_params.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/ZOOKEEPER/package/scripts/zookeeper.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/ZOOKEEPER/package/scripts/zookeeper.py index 6572479ee51..d936263e8c2 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/ZOOKEEPER/package/scripts/zookeeper.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/ZOOKEEPER/package/scripts/zookeeper.py @@ -56,14 +56,14 @@ def zookeeper(type = None, upgrade_type=None): owner=params.zk_user, create_parents = True, group=params.user_group, - mode=0755, + mode=0o755, ) Directory(params.zk_log_dir, owner=params.zk_user, create_parents = True, group=params.user_group, - mode=0755, + mode=0o755, ) Directory(params.zk_data_dir, @@ -71,27 +71,27 @@ def zookeeper(type = None, upgrade_type=None): create_parents = True, cd_access="a", group=params.user_group, - mode=0755, + mode=0o755, ) if type == 'server': myid = str(sorted(params.zookeeper_hosts).index(params.hostname) + 1) File(os.path.join(params.zk_data_dir, "myid"), - mode = 0644, + mode = 0o644, content = myid ) if (params.log4j_props != None): File(os.path.join(params.config_dir, "log4j.properties"), - mode=0644, + mode=0o644, group=params.user_group, owner=params.zk_user, content=InlineTemplate(params.log4j_props) ) elif (os.path.exists(os.path.join(params.config_dir, "log4j.properties"))): File(os.path.join(params.config_dir, "log4j.properties"), - mode=0644, + mode=0o644, group=params.user_group, owner=params.zk_user ) diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/ZOOKEEPER/package/scripts/zookeeper_client.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/ZOOKEEPER/package/scripts/zookeeper_client.py index 39daea41b79..3086e26e47c 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/ZOOKEEPER/package/scripts/zookeeper_client.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/ZOOKEEPER/package/scripts/zookeeper_client.py @@ -73,7 +73,7 @@ def pre_upgrade_restart(self, env, upgrade_type=None): class ZookeeperClientWindows(ZookeeperClient): def install(self, env): # client checks env var to determine if it is installed - if not os.environ.has_key("ZOOKEEPER_HOME"): + if "ZOOKEEPER_HOME" not in os.environ: self.install_packages(env) self.configure(env) diff --git a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/ZOOKEEPER/service_advisor.py b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/ZOOKEEPER/service_advisor.py index 61415ae30e0..309902a5c2e 100644 --- a/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/ZOOKEEPER/service_advisor.py +++ b/ambari-server/src/main/resources/stacks/BIGTOP/3.2.0/services/ZOOKEEPER/service_advisor.py @@ -37,7 +37,7 @@ service_advisor = imp.load_module('service_advisor', fp, PARENT_FILE, ('.py', 'rb', imp.PY_SOURCE)) except Exception as e: traceback.print_exc() - print "Failed to load parent" + print("Failed to load parent") class ZookeeperServiceAdvisor(service_advisor.ServiceAdvisor): diff --git a/ambari-server/src/main/resources/stacks/stack_advisor.py b/ambari-server/src/main/resources/stacks/stack_advisor.py index a7f3ab86235..73de84d4667 100644 --- a/ambari-server/src/main/resources/stacks/stack_advisor.py +++ b/ambari-server/src/main/resources/stacks/stack_advisor.py @@ -29,7 +29,7 @@ import sys import logging from math import ceil, floor -from urlparse import urlparse +from urllib.parse import urlparse # Local imports from ambari_configuration import AmbariConfiguration @@ -710,7 +710,7 @@ def instantiateServiceAdvisor(self, service): if path is not None and os.path.exists(path) and class_name is not None: try: - with open(path, 'rb') as fp: + with open(path, 'r') as fp: service_advisor = imp.load_module('service_advisor_impl', fp, path, ('.py', 'rb', imp.PY_SOURCE)) # Find the class name by reading from all of the available attributes of the python file. @@ -867,7 +867,7 @@ def get_heap_size_properties(self, services): if hasattr(advisor, "heap_size_properties"): # Override the values in "default" with those from the service advisor default.update(advisor.heap_size_properties) - except Exception, e: + except Exception as e: self.logger.exception() return default @@ -955,8 +955,8 @@ def createComponentLayoutRecommendations(self, services, hosts): for key in hostsComponentsMap.keys(): index += 1 host_group_name = "host-group-{0}".format(index) - host_groups.append( { "name": host_group_name, "components": hostsComponentsMap[key] } ) - bindings.append( { "name": host_group_name, "hosts": [{ "fqdn": key }] } ) + host_groups.insert(0, { "name": host_group_name, "components": hostsComponentsMap[key] } ) + bindings.insert(0, {"name": host_group_name, "hosts": [{"fqdn": key}]}) return recommendations @@ -1071,7 +1071,7 @@ def getFilteredHostsBasedOnDependencies(self, services, component, hostsList, ho if (requiredComponent is not None) and (requiredComponent["component_category"] != "CLIENT"): scope = "cluster" if "scope" not in dependency["Dependencies"] else dependency["Dependencies"]["scope"] if scope == "host": - for host, hostComponents in hostsComponentsMap.iteritems(): + for host, hostComponents in hostsComponentsMap.items(): isRequiredIncluded = False for hostComponent in hostComponents: currentComponentName = None if "name" not in hostComponent else hostComponent["name"] @@ -1372,21 +1372,21 @@ def getConfigurationClusterSummary(self, servicesList, hosts, components, servic cluster["containers"] = int(round(max(3, min(core_multiplier * cluster["cpu"], min(ceil(1.8 * cluster["disk"]), - cluster["totalAvailableRam"] / cluster["minContainerSize"]))))) + cluster["totalAvailableRam"] // cluster["minContainerSize"]))))) self.logger.info("Containers per node - cluster[containers]: " + str(cluster["containers"])) if cluster["containers"] * cluster["minContainerSize"] > cluster["totalAvailableRam"]: - cluster["containers"] = int(ceil(cluster["totalAvailableRam"] / cluster["minContainerSize"])) + cluster["containers"] = int(ceil(cluster["totalAvailableRam"] // cluster["minContainerSize"])) self.logger.info("Modified number of containers based on provided value for yarn.scheduler.minimum-allocation-mb") pass - cluster["ramPerContainer"] = int(abs(cluster["totalAvailableRam"] / cluster["containers"])) + cluster["ramPerContainer"] = int(abs(cluster["totalAvailableRam"] // cluster["containers"])) cluster["yarnMinContainerSize"] = min(suggestedMinContainerRam, cluster["ramPerContainer"]) self.logger.info("Ram per containers before normalization - cluster[ramPerContainer]: " + str(cluster["ramPerContainer"])) '''If greater than cluster["yarnMinContainerSize"], value will be in multiples of cluster["yarnMinContainerSize"]''' if cluster["ramPerContainer"] > cluster["yarnMinContainerSize"]: - cluster["ramPerContainer"] = int(cluster["ramPerContainer"] / cluster["yarnMinContainerSize"]) * cluster["yarnMinContainerSize"] + cluster["ramPerContainer"] = int(cluster["ramPerContainer"] // cluster["yarnMinContainerSize"]) * cluster["yarnMinContainerSize"] cluster["mapMemory"] = int(cluster["ramPerContainer"]) @@ -1412,7 +1412,7 @@ def getCallContext(self, services): # if serviceName is being added def isServiceBeingAdded(self, services, serviceName): if services: - if 'user-context' in services.keys(): + if 'user-context' in list(services.keys()): userContext = services["user-context"] if DefaultStackAdvisor.OPERATION in userContext and \ 'AddService' == userContext[DefaultStackAdvisor.OPERATION] and \ @@ -1441,9 +1441,9 @@ def get_system_min_uid(self): with open(login_defs, 'r') as f: data = f.read().split('\n') # look for uid_min_tag in file - uid = filter(lambda x: uid_min_tag in x, data) + uid = [x for x in data if uid_min_tag in x] # filter all lines, where uid_min_tag was found in comments - uid = filter(lambda x: x.find(comment_tag) > x.find(uid_min_tag) or x.find(comment_tag) == -1, uid) + uid = [x for x in uid if x.find(comment_tag) > x.find(uid_min_tag) or x.find(comment_tag) == -1] if uid is not None and len(uid) > 0: uid = uid[0] @@ -2012,7 +2012,7 @@ def getHostForComponent(self, component, hostsList): if len(hostsList) != 1: scheme = self.getComponentLayoutSchemes().get(componentName, None) if scheme is not None: - hostIndex = next((index for key, index in scheme.iteritems() if isinstance(key, (int, long)) and len(hostsList) < key), scheme['else']) + hostIndex = next((index for key, index in scheme.items() if isinstance(key, int) and len(hostsList) < key), scheme['else']) else: hostIndex = 0 for host in hostsList[hostIndex:]: @@ -2662,7 +2662,7 @@ def get_service_component_meta(self, service, component, services): def getHadoopProxyUsersValidationItems(self, properties, services, hosts, configurations): validationItems = [] users = self.getHadoopProxyUsers(services, hosts, configurations) - for user_name, user_properties in users.iteritems(): + for user_name, user_properties in users.items(): props = ["hadoop.proxyuser.{0}.hosts".format(user_name)] if "propertyGroups" in user_properties: props.append("hadoop.proxyuser.{0}.groups".format(user_name)) @@ -2682,7 +2682,7 @@ def getHadoopProxyUsers(self, services, hosts, configurations): servicesList = self.get_services_list(services) users = {} - for serviceName, serviceUserComponents in self.getServiceHadoopProxyUsersConfigurationDict().iteritems(): + for serviceName, serviceUserComponents in self.getServiceHadoopProxyUsersConfigurationDict().items(): users.update(self._getHadoopProxyUsersForService(serviceName, serviceUserComponents, services, hosts, configurations)) return users @@ -2751,10 +2751,10 @@ def _getHadoopProxyUsersForService(self, serviceName, serviceUserComponents, ser if user: usersComponents[user] = (userNameConfig, userNameProperty, hostSelectorMap) - for user, (userNameConfig, userNameProperty, hostSelectorMap) in usersComponents.iteritems(): + for user, (userNameConfig, userNameProperty, hostSelectorMap) in usersComponents.items(): proxyUsers = {"config": userNameConfig, "propertyName": userNameProperty} - for proxyPropertyName, hostSelector in hostSelectorMap.iteritems(): - componentHostNamesString = hostSelector if isinstance(hostSelector, basestring) else '*' + for proxyPropertyName, hostSelector in hostSelectorMap.items(): + componentHostNamesString = hostSelector if isinstance(hostSelector, str) else '*' if isinstance(hostSelector, (list, tuple)): _, componentHostNames = self.get_data_for_proxyuser(user, services, configurations) # preserve old values for component in hostSelector: @@ -2792,7 +2792,7 @@ def recommendHadoopProxyUsers(self, configurations, services, hosts): if hive_user and get_from_dict(users, (hive_user, "propertyHosts"), default_value=None): services["forced-configurations"].append({"type" : "core-site", "name" : "hadoop.proxyuser.{0}.hosts".format(hive_user)}) - for user_name, user_properties in users.iteritems(): + for user_name, user_properties in users.items(): # Add properties "hadoop.proxyuser.*.hosts", "hadoop.proxyuser.*.groups" to core-site for all users self.put_proxyuser_value(user_name, user_properties["propertyHosts"], services=services, configurations=configurations, put_function=putCoreSiteProperty) @@ -2880,7 +2880,7 @@ def restore_special_values(data, replacement_dict): :param replacement_dict: :return: """ - for replacement, original in replacement_dict.iteritems(): + for replacement, original in replacement_dict.items(): data.remove(replacement) data.add(original) @@ -2938,7 +2938,7 @@ def get_data_for_proxyuser(self, user_name, services, configurations, groups=Fal def merge_proxyusers_values(self, first, second): result = set() def append(data): - if isinstance(data, str) or isinstance(data, unicode): + if isinstance(data, str) or isinstance(data, str): if data != "*": result.update(data.split(",")) else: @@ -3110,18 +3110,18 @@ def validatorEnoughDiskSpace(self, properties, propertyName, hostInfo, reqiuredD mountPoints = {} for mountPoint in hostInfo["disk_info"]: mountPoints[mountPoint["mountpoint"]] = self.to_number(mountPoint["available"]) - mountPoint = DefaultStackAdvisor.getMountPointForDir(dir, mountPoints.keys()) + mountPoint = DefaultStackAdvisor.getMountPointForDir(dir, list(mountPoints.keys())) if not mountPoints: return self.getErrorItem("No disk info found on host %s" % hostInfo["host_name"]) if mountPoint is None: - return self.getErrorItem("No mount point in directory %s. Mount points: %s" % (dir, ', '.join(mountPoints.keys()))) + return self.getErrorItem("No mount point in directory %s. Mount points: %s" % (dir, ', '.join(list(mountPoints.keys())))) if mountPoints[mountPoint] < reqiuredDiskSpace: msg = "Ambari Metrics disk space requirements not met. \n" \ "Recommended disk space for partition {0} is {1}G" - return self.getWarnItem(msg.format(mountPoint, reqiuredDiskSpace/1048576)) # in Gb + return self.getWarnItem(msg.format(mountPoint, reqiuredDiskSpace//1048576)) # in Gb return None @classmethod @@ -3245,7 +3245,7 @@ def getAllYarnLeafQueues(self, capacitySchedulerProperties): """ Gets all YARN leaf queues. """ - config_list = capacitySchedulerProperties.keys() + config_list = list(capacitySchedulerProperties.keys()) yarn_queues = None leafQueueNames = set() if 'yarn.scheduler.capacity.root.queues' in config_list: @@ -3270,7 +3270,7 @@ def getAllYarnLeafQueues(self, capacitySchedulerProperties): # (3). 'yarn.scheduler.capacity.root.default, # Added leaf queues names are as : d1, c2 and default for the 3 leaf queues. leafQueuePathSplits = queue.split(".") - if leafQueuePathSplits > 0: + if len(leafQueuePathSplits) > 0: leafQueueName = leafQueuePathSplits[-1] leafQueueNames.add(leafQueueName) return leafQueueNames diff --git a/ambari-server/src/test/python/TestAmbariConfiguration.py b/ambari-server/src/test/python/TestAmbariConfiguration.py index fd2bc7b09c0..5125e29eefb 100644 --- a/ambari-server/src/test/python/TestAmbariConfiguration.py +++ b/ambari-server/src/test/python/TestAmbariConfiguration.py @@ -198,10 +198,10 @@ def testAmbariJWTProperties(self): ambari_sso_details = ambari_configuration.get_ambari_sso_details() self.assertIsNotNone(ambari_sso_details) - self.assertEquals('', ambari_sso_details.get_jwt_audiences()) - self.assertEquals('hadoop-jwt', ambari_sso_details.get_jwt_cookie_name()) - self.assertEquals('https://knox.ambari.apache.org', ambari_sso_details.get_sso_provider_url()) - self.assertEquals('MIICVTCCAb6gAwIBAg...2G2Vhj8vTYptEVg==', + self.assertEqual('', ambari_sso_details.get_jwt_audiences()) + self.assertEqual('hadoop-jwt', ambari_sso_details.get_jwt_cookie_name()) + self.assertEqual('https://knox.ambari.apache.org', ambari_sso_details.get_sso_provider_url()) + self.assertEqual('MIICVTCCAb6gAwIBAg...2G2Vhj8vTYptEVg==', ambari_sso_details.get_sso_provider_certificate()) def testCertWithHeaderAndFooter(self): @@ -220,26 +220,26 @@ def testCertWithHeaderAndFooter(self): ambari_configuration = self.ambari_configuration_class(services_json) ambari_sso_details = ambari_configuration.get_ambari_sso_details() - self.assertEquals('-----BEGIN CERTIFICATE-----\n' + self.assertEqual('-----BEGIN CERTIFICATE-----\n' 'MIIE3DCCA8SgAwIBAgIJAKfbOMmFyOlNMA0GCSqGSIb3DQEBBQUAMIGkMQswCQYD\n' '................................................................\n' 'dXRpbmcxFzAVBgNVBAMTDmNsb3VkYnJlYWstcmdsMSUwIwYJKoZIhvcNAQkBFhZy\n' '-----END CERTIFICATE-----', ambari_sso_details.get_sso_provider_certificate(True, False)) - self.assertEquals('-----BEGIN CERTIFICATE-----' + self.assertEqual('-----BEGIN CERTIFICATE-----' 'MIIE3DCCA8SgAwIBAgIJAKfbOMmFyOlNMA0GCSqGSIb3DQEBBQUAMIGkMQswCQYD' '................................................................' 'dXRpbmcxFzAVBgNVBAMTDmNsb3VkYnJlYWstcmdsMSUwIwYJKoZIhvcNAQkBFhZy' '-----END CERTIFICATE-----', ambari_sso_details.get_sso_provider_certificate(True, True)) - self.assertEquals('MIIE3DCCA8SgAwIBAgIJAKfbOMmFyOlNMA0GCSqGSIb3DQEBBQUAMIGkMQswCQYD\n' + self.assertEqual('MIIE3DCCA8SgAwIBAgIJAKfbOMmFyOlNMA0GCSqGSIb3DQEBBQUAMIGkMQswCQYD\n' '................................................................\n' 'dXRpbmcxFzAVBgNVBAMTDmNsb3VkYnJlYWstcmdsMSUwIwYJKoZIhvcNAQkBFhZy', ambari_sso_details.get_sso_provider_certificate(False, False)) - self.assertEquals('MIIE3DCCA8SgAwIBAgIJAKfbOMmFyOlNMA0GCSqGSIb3DQEBBQUAMIGkMQswCQYD' + self.assertEqual('MIIE3DCCA8SgAwIBAgIJAKfbOMmFyOlNMA0GCSqGSIb3DQEBBQUAMIGkMQswCQYD' '................................................................' 'dXRpbmcxFzAVBgNVBAMTDmNsb3VkYnJlYWstcmdsMSUwIwYJKoZIhvcNAQkBFhZy', ambari_sso_details.get_sso_provider_certificate(False, True)) @@ -258,26 +258,26 @@ def testCertWithoutHeaderAndFooter(self): ambari_configuration = self.ambari_configuration_class(services_json) ambari_sso_details = ambari_configuration.get_ambari_sso_details() - self.assertEquals('-----BEGIN CERTIFICATE-----\n' + self.assertEqual('-----BEGIN CERTIFICATE-----\n' 'MIIE3DCCA8SgAwIBAgIJAKfbOMmFyOlNMA0GCSqGSIb3DQEBBQUAMIGkMQswCQYD\n' '................................................................\n' 'dXRpbmcxFzAVBgNVBAMTDmNsb3VkYnJlYWstcmdsMSUwIwYJKoZIhvcNAQkBFhZy\n' '-----END CERTIFICATE-----', ambari_sso_details.get_sso_provider_certificate(True, False)) - self.assertEquals('-----BEGIN CERTIFICATE-----' + self.assertEqual('-----BEGIN CERTIFICATE-----' 'MIIE3DCCA8SgAwIBAgIJAKfbOMmFyOlNMA0GCSqGSIb3DQEBBQUAMIGkMQswCQYD' '................................................................' 'dXRpbmcxFzAVBgNVBAMTDmNsb3VkYnJlYWstcmdsMSUwIwYJKoZIhvcNAQkBFhZy' '-----END CERTIFICATE-----', ambari_sso_details.get_sso_provider_certificate(True, True)) - self.assertEquals('MIIE3DCCA8SgAwIBAgIJAKfbOMmFyOlNMA0GCSqGSIb3DQEBBQUAMIGkMQswCQYD\n' + self.assertEqual('MIIE3DCCA8SgAwIBAgIJAKfbOMmFyOlNMA0GCSqGSIb3DQEBBQUAMIGkMQswCQYD\n' '................................................................\n' 'dXRpbmcxFzAVBgNVBAMTDmNsb3VkYnJlYWstcmdsMSUwIwYJKoZIhvcNAQkBFhZy', ambari_sso_details.get_sso_provider_certificate(False, False)) - self.assertEquals('MIIE3DCCA8SgAwIBAgIJAKfbOMmFyOlNMA0GCSqGSIb3DQEBBQUAMIGkMQswCQYD' + self.assertEqual('MIIE3DCCA8SgAwIBAgIJAKfbOMmFyOlNMA0GCSqGSIb3DQEBBQUAMIGkMQswCQYD' '................................................................' 'dXRpbmcxFzAVBgNVBAMTDmNsb3VkYnJlYWstcmdsMSUwIwYJKoZIhvcNAQkBFhZy', ambari_sso_details.get_sso_provider_certificate(False, True)) @@ -372,38 +372,38 @@ def testNotEmtpyLDAPConfiguration(self): self.assertIsNotNone(ambari_ldap_details) self.assertTrue(ambari_ldap_details.is_ldap_enabled()) - self.assertEquals(ambari_ldap_details.get_server_host(), "host1") - self.assertEquals(ambari_ldap_details.get_server_port(), 336) - self.assertEquals(ambari_ldap_details.get_server_url(), "host1:336") - self.assertEquals(ambari_ldap_details.get_secondary_server_host(), "host2") - self.assertEquals(ambari_ldap_details.get_secondary_server_port(), 337) - self.assertEquals(ambari_ldap_details.get_secondary_server_url(), "host2:337") + self.assertEqual(ambari_ldap_details.get_server_host(), "host1") + self.assertEqual(ambari_ldap_details.get_server_port(), 336) + self.assertEqual(ambari_ldap_details.get_server_url(), "host1:336") + self.assertEqual(ambari_ldap_details.get_secondary_server_host(), "host2") + self.assertEqual(ambari_ldap_details.get_secondary_server_port(), 337) + self.assertEqual(ambari_ldap_details.get_secondary_server_url(), "host2:337") self.assertTrue(ambari_ldap_details.is_use_ssl()) self.assertTrue(ambari_ldap_details.is_anonymous_bind()) - self.assertEquals(ambari_ldap_details.get_bind_dn(), "bind_dn") - self.assertEquals(ambari_ldap_details.get_bind_password(), "bind_password") - self.assertEquals(ambari_ldap_details.get_dn_attribute(), "dn_attr") - self.assertEquals(ambari_ldap_details.get_user_object_class(), "user.object_class") - self.assertEquals(ambari_ldap_details.get_user_name_attribute(), "user.name_attr") - self.assertEquals(ambari_ldap_details.get_user_search_base(), "user.search_base") - self.assertEquals(ambari_ldap_details.get_group_object_class(), "group.object_class") - self.assertEquals(ambari_ldap_details.get_group_name_attribute(), "group.name_attr") - self.assertEquals(ambari_ldap_details.get_group_member_attribute(), "group.member_attr") - self.assertEquals(ambari_ldap_details.get_group_search_base(), "group.search_base") - self.assertEquals(ambari_ldap_details.get_group_mapping_rules(), "group_mapping_rules") - self.assertEquals(ambari_ldap_details.get_user_search_filter(), "user_search_filter") - self.assertEquals(ambari_ldap_details.get_user_member_replace_pattern(), "user_member_replace_pattern") - self.assertEquals(ambari_ldap_details.get_user_member_filter(), "user_member_filter") - self.assertEquals(ambari_ldap_details.get_group_search_filter(), "group_search_filter") - self.assertEquals(ambari_ldap_details.get_group_member_replace_pattern(), "group_member_replace_pattern") - self.assertEquals(ambari_ldap_details.get_group_member_filter(), "group_member_filter") + self.assertEqual(ambari_ldap_details.get_bind_dn(), "bind_dn") + self.assertEqual(ambari_ldap_details.get_bind_password(), "bind_password") + self.assertEqual(ambari_ldap_details.get_dn_attribute(), "dn_attr") + self.assertEqual(ambari_ldap_details.get_user_object_class(), "user.object_class") + self.assertEqual(ambari_ldap_details.get_user_name_attribute(), "user.name_attr") + self.assertEqual(ambari_ldap_details.get_user_search_base(), "user.search_base") + self.assertEqual(ambari_ldap_details.get_group_object_class(), "group.object_class") + self.assertEqual(ambari_ldap_details.get_group_name_attribute(), "group.name_attr") + self.assertEqual(ambari_ldap_details.get_group_member_attribute(), "group.member_attr") + self.assertEqual(ambari_ldap_details.get_group_search_base(), "group.search_base") + self.assertEqual(ambari_ldap_details.get_group_mapping_rules(), "group_mapping_rules") + self.assertEqual(ambari_ldap_details.get_user_search_filter(), "user_search_filter") + self.assertEqual(ambari_ldap_details.get_user_member_replace_pattern(), "user_member_replace_pattern") + self.assertEqual(ambari_ldap_details.get_user_member_filter(), "user_member_filter") + self.assertEqual(ambari_ldap_details.get_group_search_filter(), "group_search_filter") + self.assertEqual(ambari_ldap_details.get_group_member_replace_pattern(), "group_member_replace_pattern") + self.assertEqual(ambari_ldap_details.get_group_member_filter(), "group_member_filter") self.assertTrue(ambari_ldap_details.is_force_lower_case_user_names()) self.assertTrue(ambari_ldap_details.is_pagination_enabled()) self.assertTrue(ambari_ldap_details.is_follow_referral_handling()) self.assertTrue(ambari_ldap_details.is_disable_endpoint_identification()) self.assertTrue(ambari_ldap_details.is_ldap_alternate_user_search_enabled()) - self.assertEquals(ambari_ldap_details.get_alternate_user_search_filter(), "alternate_user_search_filter") - self.assertEquals(ambari_ldap_details.get_sync_collision_handling_behavior(), "collision_behavior") + self.assertEqual(ambari_ldap_details.get_alternate_user_search_filter(), "alternate_user_search_filter") + self.assertEqual(ambari_ldap_details.get_sync_collision_handling_behavior(), "collision_behavior") def testAmbariNotMangingLdapConfiguration(self): ## Case 1: missing the boolean flag indicating that Ambari manages LDAP configuration diff --git a/ambari-server/src/test/python/TestAmbariServer.py b/ambari-server/src/test/python/TestAmbariServer.py index 0b6a2ee31ed..168bb0ff0e4 100644 --- a/ambari-server/src/test/python/TestAmbariServer.py +++ b/ambari-server/src/test/python/TestAmbariServer.py @@ -18,21 +18,24 @@ import os import sys from mock.mock import patch, MagicMock, call +import importlib +import distro with patch.object(os, "geteuid", new=MagicMock(return_value=0)): from resource_management.core import sudo - reload(sudo) + importlib.reload(sudo) import datetime import json import operator -from ambari_commons import subprocess32 +import subprocess +import distro import platform import socket import re import signal import stat -import StringIO +import io import tempfile from unittest import TestCase os.environ["ROOT"] = "" @@ -61,16 +64,16 @@ def search_file_proxy(filename, searchpatch, pathsep=os.pathsep): os_utils.search_file = search_file_proxy -with patch.object(platform, "linux_distribution", return_value = MagicMock(return_value=('Redhat', '6.4', 'Final'))): +with patch.object(distro, "linux_distribution", return_value = MagicMock(return_value=('Redhat', '6.4', 'Final'))): with patch("os.path.isdir", return_value = MagicMock(return_value=True)): with patch("os.access", return_value = MagicMock(return_value=True)): with patch.object(os_utils, "parse_log4j_file", return_value={'ambari.log.dir': '/var/log/ambari-server'}): - with patch("platform.linux_distribution", return_value = os_distro_value): + with patch("distro.linux_distribution", return_value = os_distro_value): with patch("os.symlink"): with patch.object(os_utils, "is_service_exist", return_value = True): with patch("glob.glob", return_value = ['/etc/init.d/postgresql-9.3']): _ambari_server_ = __import__('ambari-server') - with patch("__builtin__.open"): + with patch("builtins.open"): from ambari_commons.firewall import Firewall from ambari_commons.os_check import OSCheck, OSConst from ambari_commons.os_family_impl import OsFamilyImpl, OsFamilyFuncImpl @@ -120,12 +123,12 @@ def search_file_proxy(filename, searchpatch, pathsep=os.pathsep): CURR_AMBARI_VERSION = "2.0.0" -@patch.object(platform, "linux_distribution", new = MagicMock(return_value=('Redhat', '6.4', 'Final'))) +@patch.object(distro, "linux_distribution", new = MagicMock(return_value=('Redhat', '6.4', 'Final'))) @patch("ambari_server.dbConfiguration_linux.get_postgre_hba_dir", new = MagicMock(return_value = "/var/lib/pgsql/data")) @patch("ambari_server.dbConfiguration_linux.get_postgre_running_status", new = MagicMock(return_value = "running")) class TestAmbariServer(TestCase): def setUp(self): - out = StringIO.StringIO() + out = io.StringIO() sys.stdout = out @@ -146,27 +149,27 @@ def test_configure_pg_hba_ambaridb_users(self, run_os_command_method): self.assertTrue(run_os_command_method.called) string_expected = self.get_file_string(self.get_samples_dir("configure_pg_hba_ambaridb_users1")) string_actual = self.get_file_string(tf1.name) - self.assertEquals(string_expected, string_actual) + self.assertEqual(string_expected, string_actual) pass @not_for_platform(PLATFORM_WINDOWS) - @patch("__builtin__.raw_input") - def test_servicename_regex(self, raw_input_method): + @patch("builtins.input") + def test_servicename_regex(self, input_method): ''' Test to make sure the service name can contain digits ''' set_silent(False) - raw_input_method.return_value = "OT100" + input_method.return_value = "OT100" result = OracleConfig._get_validated_service_name("ambari", 1) self.assertEqual("OT100", result, "Not accepting digits") pass @not_for_platform(PLATFORM_WINDOWS) - @patch("__builtin__.raw_input") - def test_dbname_regex(self, raw_input_method): + @patch("builtins.input") + def test_dbname_regex(self, input_method): ''' Test to make sure the service name can contain digits ''' set_silent(False) - raw_input_method.return_value = "OT100" + input_method.return_value = "OT100" result = LinuxDBMSConfig._get_validated_db_name("Database", "ambari") self.assertEqual("OT100", result, "Not accepting digits") pass @@ -197,38 +200,38 @@ def test_configure_pg_hba_postgres_user(self): pass - @patch("__builtin__.raw_input") - def test_get_choice_string_input(self, raw_input_method): + @patch("builtins.input") + def test_get_choice_string_input(self, input_method): prompt = "blablabla" default = "default blablabla" firstChoice = set(['yes', 'ye', 'y']) secondChoice = set(['no', 'n']) # test first input - raw_input_method.return_value = "Y" + input_method.return_value = "Y" result = get_choice_string_input(prompt, default, firstChoice, secondChoice) - self.assertEquals(result, True) - raw_input_method.reset_mock() + self.assertEqual(result, True) + input_method.reset_mock() # test second input - raw_input_method.return_value = "N" + input_method.return_value = "N" result = get_choice_string_input(prompt, default, firstChoice, secondChoice) - self.assertEquals(result, False) + self.assertEqual(result, False) - raw_input_method.reset_mock() + input_method.reset_mock() # test enter pressed - raw_input_method.return_value = "" + input_method.return_value = "" result = get_choice_string_input(prompt, default, firstChoice, secondChoice) - self.assertEquals(result, default) + self.assertEqual(result, default) - raw_input_method.reset_mock() + input_method.reset_mock() # test wrong input list_of_return_values = ['yes', 'dsad', 'fdsfds'] @@ -236,21 +239,21 @@ def test_get_choice_string_input(self, raw_input_method): def side_effect(list): return list_of_return_values.pop() - raw_input_method.side_effect = side_effect + input_method.side_effect = side_effect result = get_choice_string_input(prompt, default, firstChoice, secondChoice) - self.assertEquals(result, True) - self.assertEquals(raw_input_method.call_count, 3) + self.assertEqual(result, True) + self.assertEqual(input_method.call_count, 3) pass @patch("re.search") - @patch("__builtin__.raw_input") + @patch("builtins.input") @patch("getpass.getpass") def test_get_validated_string_input(self, get_pass_method, - raw_input_method, re_search_method): + input_method, re_search_method): prompt = "blabla" default = "default_pass" pattern = "pattern_pp" @@ -263,29 +266,29 @@ def test_get_validated_string_input(self, get_pass_method, result = get_validated_string_input(prompt, default, pattern, description, is_pass) - self.assertEquals(get_pass_method.return_value, result) + self.assertEqual(get_pass_method.return_value, result) get_pass_method.assure_called_once(prompt) - self.assertFalse(raw_input_method.called) + self.assertFalse(input_method.called) # check raw input get_pass_method.reset_mock() - raw_input_method.reset_mock() + input_method.reset_mock() is_pass = False - raw_input_method.return_value = "dkf90ewuf0" + input_method.return_value = "dkf90ewuf0" result = get_validated_string_input(prompt, default, pattern, description, is_pass) - self.assertEquals(raw_input_method.return_value, result) + self.assertEqual(input_method.return_value, result) self.assertFalse(get_pass_method.called) - raw_input_method.assure_called_once(prompt) + input_method.assure_called_once(prompt) pass @not_for_platform(PLATFORM_WINDOWS) def test_get_pass_file_path(self): result = get_pass_file_path("/etc/ambari/conf_file", JDBC_PASSWORD_FILENAME) - self.assertEquals("/etc/ambari/password.dat", result) + self.assertEqual("/etc/ambari/password.dat", result) pass @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) @@ -858,7 +861,7 @@ def test_configure_postgres(self, PGConfig.PG_HBA_CONF_FILE = tf1.name PGConfig.PG_HBA_CONF_FILE_BACKUP = tf2.name - out = StringIO.StringIO() + out = io.StringIO() sys.stdout = out retcode, out1, err = dbConfig._configure_postgres() sys.stdout = sys.__stdout__ @@ -893,7 +896,7 @@ def test_configure_postgres(self, @not_for_platform(PLATFORM_WINDOWS) @patch("time.sleep") - @patch.object(subprocess32, "Popen") + @patch.object(subprocess, "Popen") @patch("ambari_server.dbConfiguration_linux.run_os_command") @patch.object(PGConfig, "_get_postgre_status") @patch("ambari_server.dbConfiguration_linux.print_info_msg") @@ -914,7 +917,7 @@ def test_restart_postgres(self, printInfoMsg_mock, get_postgre_status_mock, @not_for_platform(PLATFORM_WINDOWS) @patch("shlex.split") - @patch("subprocess32.Popen") + @patch("subprocess.Popen") @patch("ambari_commons.os_linux.print_info_msg") def test_run_os_command(self, printInfoMsg_mock, popenMock, splitMock): @@ -936,7 +939,7 @@ def test_run_os_command(self, printInfoMsg_mock, popenMock, splitMock): @only_for_platform(PLATFORM_WINDOWS) @patch("shlex.split") - @patch("subprocess32.Popen") + @patch("subprocess.Popen") @patch("ambari_commons.os_windows.print_info_msg") def test_run_os_command(self, printInfoMsg_mock, popenMock, splitMock): @@ -1191,11 +1194,11 @@ def test_read_ambari_user(self, properties_mock, get_ambari_properties_mock): properties_mock.__getitem__.return_value = "dummy_user" get_ambari_properties_mock.return_value = properties_mock user = read_ambari_user() - self.assertEquals(user, "dummy_user") + self.assertEqual(user, "dummy_user") # Testing with undefined user properties_mock.__getitem__.return_value = None user = read_ambari_user() - self.assertEquals(user, None) + self.assertEqual(user, None) pass @patch("ambari_server.serverConfiguration.get_ambari_properties") @@ -1283,11 +1286,11 @@ def test_adjust_directory_permissions(self, change_owner_mock, print_info_msg_mo adjust_directory_permissions("user") self.assertTrue(len(set_file_permissions_mock.call_args_list) == len(configDefaults.NR_ADJUST_OWNERSHIP_LIST)) - self.assertEquals(set_file_permissions_mock.call_args_list[0][0][3], True) - self.assertEquals(set_file_permissions_mock.call_args_list[1][0][3], False) + self.assertEqual(set_file_permissions_mock.call_args_list[0][0][3], True) + self.assertEqual(set_file_permissions_mock.call_args_list[1][0][3], False) self.assertTrue(len(change_owner_mock.call_args_list) == len(configDefaults.NR_CHANGE_OWNERSHIP_LIST)) - self.assertEquals(change_owner_mock.call_args_list[0][0][2], True) + self.assertEqual(change_owner_mock.call_args_list[0][0][2], True) finally: configDefaults.NR_ADJUST_OWNERSHIP_LIST = old_adjust_owner_list configDefaults.NR_CHANGE_OWNERSHIP_LIST = old_change_owner_list @@ -1349,9 +1352,9 @@ def file_exists_side_effect(*args, **kwargs): for args_entry in set_file_permissions_mock.call_args_list: if args_entry[0][0] == ambari_repo_file_entry[0]: # File name # ambari repo file name matched; assert the rest of the entries - self.assertEquals(args_entry[0][1], ambari_repo_file_entry[1]) # Permissions - self.assertEquals(args_entry[0][2], ambari_repo_file_entry[2]) # File owner - self.assertEquals(args_entry[0][3], ambari_repo_file_entry[3]) # Non-recursive + self.assertEqual(args_entry[0][1], ambari_repo_file_entry[1]) # Permissions + self.assertEqual(args_entry[0][2], ambari_repo_file_entry[2]) # File owner + self.assertEqual(args_entry[0][3], ambari_repo_file_entry[3]) # Non-recursive entry_found = True break @@ -1513,8 +1516,8 @@ def test_create_custom_user(self, run_os_command_mock, print_warning_msg_mock, run_os_command_mock.side_effect = [(0, "", "")] result = userChecks._create_custom_user() self.assertFalse(print_warning_msg_mock.called) - self.assertEquals(result, 0) - self.assertEquals(userChecks.user, user) + self.assertEqual(result, 0) + self.assertEqual(userChecks.user, user) print_info_msg_mock.reset_mock() print_warning_msg_mock.reset_mock() @@ -1524,8 +1527,8 @@ def test_create_custom_user(self, run_os_command_mock, print_warning_msg_mock, run_os_command_mock.side_effect = [(9, "", "")] result = userChecks._create_custom_user() self.assertTrue("User dummy-user already exists" in str(print_info_msg_mock.call_args_list[1][0])) - self.assertEquals(result, 0) - self.assertEquals(userChecks.user, user) + self.assertEqual(result, 0) + self.assertEqual(userChecks.user, user) print_info_msg_mock.reset_mock() print_warning_msg_mock.reset_mock() @@ -1535,7 +1538,7 @@ def test_create_custom_user(self, run_os_command_mock, print_warning_msg_mock, run_os_command_mock.side_effect = [(1, "", "")] result = userChecks._create_custom_user() self.assertTrue(print_warning_msg_mock.called) - self.assertEquals(result, 1) + self.assertEqual(result, 1) pass @only_for_platform(PLATFORM_WINDOWS) @@ -1582,8 +1585,8 @@ def user_not_found(*args, **keywargs): self.assertTrue(print_warning_msg_mock.called) self.assertTrue(net_user_add_mock.called) self.assertEqual(str(net_user_add_mock.call_args_list[0][0]), str((None, 1, {'comment': 'Ambari user', 'password': 'dummy-user', 'flags': 513, 'name': 'dummy-user', 'priv': 1}))) - self.assertEquals(result, 0) - self.assertEquals(userChecks.user, ".\\" + user) + self.assertEqual(result, 0) + self.assertEqual(userChecks.user, ".\\" + user) _reset_mocks() @@ -1594,8 +1597,8 @@ def user_not_found(*args, **keywargs): #lsa_add_account_rights_mock result = userChecks._create_custom_user() self.assertTrue("User dummy-user already exists" in print_info_msg_mock.call_args_list[0][0][0]) - self.assertEquals(result, 0) - self.assertEquals(userChecks.user, ".\\" + user) + self.assertEqual(result, 0) + self.assertEqual(userChecks.user, ".\\" + user) self.assertFalse(net_user_add_mock.called) _reset_mocks() @@ -1609,8 +1612,8 @@ def user_not_found(*args, **keywargs): self.assertEqual(str(net_get_dc_name_mock.call_args_list[0][0]), str((None, "dummy_domain"))) self.assertTrue(net_user_add_mock.called) self.assertEqual(str(net_user_add_mock.call_args_list[0][0]), str(('dummy_dc', 1, {'comment': 'Ambari user', 'password': 'newpassword', 'flags': 513, 'name': 'dummy_user', 'priv': 1}))) - self.assertEquals(result, 0) - self.assertEquals(userChecks.user, "dummy_domain\\dummy_user") + self.assertEqual(result, 0) + self.assertEqual(userChecks.user, "dummy_domain\\dummy_user") _reset_mocks() @@ -1623,8 +1626,8 @@ def user_not_found(*args, **keywargs): self.assertTrue(net_get_dc_name_mock.called) self.assertEqual(str(net_get_dc_name_mock.call_args_list[0][0]), str((None, "dummy_domain"))) self.assertFalse(net_user_add_mock.called) - self.assertEquals(result, 0) - self.assertEquals(userChecks.user, "dummy_domain\\dummy_user") + self.assertEqual(result, 0) + self.assertEqual(userChecks.user, "dummy_domain\\dummy_user") pass @not_for_platform(PLATFORM_WINDOWS) @@ -1890,7 +1893,7 @@ def _reset_mocks(): @patch("ambari_server.serverConfiguration.search_file") - @patch("__builtin__.open") + @patch("builtins.open") @patch("ambari_server.serverConfiguration.read_ambari_user") @patch("ambari_server.serverConfiguration.set_file_permissions") def test_store_password_file(self, set_file_permissions_mock, @@ -1964,7 +1967,7 @@ def test_check_firewall_is_running(self, get_os_major_version_mock, get_os_type_ @patch("ambari_server.setupHttps.get_validated_string_input") @patch("ambari_server.setupHttps.run_os_command") @patch("ambari_server.setupHttps.get_and_persist_truststore_type") - @patch("__builtin__.open") + @patch("builtins.open") @patch("ambari_server.setupHttps.find_properties_file") @patch("ambari_server.setupHttps.run_component_https_cmd") @patch("ambari_server.setupHttps.get_delete_cert_command") @@ -1980,7 +1983,7 @@ def test_setup_truststore(self, find_jdk_mock, get_ambari_properties_mock, get_Y get_and_persist_truststore_type_mock, run_os_command_mock, get_validated_string_input_mock, get_validated_filepath_input_mock): - out = StringIO.StringIO() + out = io.StringIO() sys.stdout = out component = "component" command = "command" @@ -2064,7 +2067,7 @@ def test_setup_truststore(self, find_jdk_mock, get_ambari_properties_mock, get_Y get_validated_filepath_input_mock.reset_mock() pass - @patch("__builtin__.open") + @patch("builtins.open") @patch("ambari_commons.logging_utils.get_silent") @patch("ambari_server.setupHttps.find_jdk") @patch("ambari_server.setupHttps.get_ambari_properties") @@ -2141,7 +2144,7 @@ def reset_mocks(): @patch("ambari_server.setupHttps.get_ambari_properties") @patch("ambari_server.setupHttps.import_cert_and_key_action") @patch("ambari_server.setupHttps.get_YN_input") - @patch("__builtin__.open") + @patch("builtins.open") @patch("ambari_server.setupHttps.is_root") @patch("ambari_server.setupHttps.is_valid_cert_host") @patch("ambari_server.setupHttps.is_valid_cert_exp") @@ -2155,7 +2158,7 @@ def test_setup_https(self, is_valid_cert_exp_mock, is_valid_cert_host_mock, \ is_valid_cert_exp_mock.return_value = True is_valid_cert_host_mock.return_value = True - open_Mock.return_value = file + open_Mock.return_value = open() p = get_ambari_properties_mock.return_value args = MagicMock() @@ -2330,18 +2333,18 @@ def test_import_cert_and_key_action(self, import_cert_and_key_mock): @patch("ambari_server.setupHttps.read_ambari_user") @patch("ambari_server.setupHttps.set_file_permissions") @patch("ambari_server.setupHttps.import_file_to_keystore") - @patch("__builtin__.open") + @patch("builtins.open") @patch("ambari_server.setupHttps.run_os_command") @patch("os.path.join") @patch("os.path.isfile") - @patch("__builtin__.raw_input") + @patch("builtins.input") @patch("ambari_server.setupHttps.get_validated_string_input") @patch("ambari_server.setupHttps.is_valid_cert_host") @patch("ambari_server.setupHttps.is_valid_cert_exp") def test_ambariServerSetupWithCustomDbName(self, is_valid_cert_exp_mock, \ is_valid_cert_host_mock, \ get_validated_string_input_mock, \ - raw_input_mock, \ + input_mock, \ os_path_isfile_mock, \ os_path_join_mock, run_os_command_mock, \ open_mock, import_file_to_keystore_mock, \ @@ -2351,7 +2354,7 @@ def test_ambariServerSetupWithCustomDbName(self, is_valid_cert_exp_mock, \ is_valid_cert_host_mock.return_value = True os_path_isfile_mock.return_value = True get_validated_string_input_mock.return_value = "password" - raw_input_mock.side_effect = \ + input_mock.side_effect = \ ["cert_file_path", "key_file_path"] os_path_join_mock.side_effect = ["keystore_file_path", "keystore_file_path_tmp", \ "pass_file_path", "pass_file_path_tmp", \ @@ -2370,7 +2373,7 @@ def test_ambariServerSetupWithCustomDbName(self, is_valid_cert_exp_mock, \ " 'keystore_cert_key_file_path')]" options = self._create_empty_options_mock() import_cert_and_key("key_dir", options) - self.assertTrue(raw_input_mock.call_count == 2) + self.assertTrue(input_mock.call_count == 2) self.assertTrue(get_validated_string_input_mock.called) self.assertEqual(os_path_join_mock.call_count, 8) self.assertTrue(set_file_permissions_mock.call_count == 1) @@ -2384,7 +2387,7 @@ def test_ambariServerSetupWithCustomDbName(self, is_valid_cert_exp_mock, \ @patch("ambari_server.setupHttps.read_ambari_user") @patch("ambari_server.setupHttps.set_file_permissions") @patch("ambari_server.setupHttps.import_file_to_keystore") - @patch("__builtin__.open") + @patch("builtins.open") @patch("ambari_server.setupHttps.run_os_command") @patch("os.path.join") @patch("ambari_server.setupHttps.get_validated_filepath_input") @@ -2421,16 +2424,16 @@ def test_import_cert_and_key_with_empty_password(self, \ " 'keystore_cert_key_file_path')]" options = self._create_empty_options_mock() import_cert_and_key("key_dir", options) - self.assertEquals(get_validated_filepath_input_mock.call_count, 2) + self.assertEqual(get_validated_filepath_input_mock.call_count, 2) self.assertTrue(get_validated_string_input_mock.called) - self.assertEquals(os_path_join_mock.call_count, 8) - self.assertEquals(set_file_permissions_mock.call_count, 1) + self.assertEqual(os_path_join_mock.call_count, 8) + self.assertEqual(set_file_permissions_mock.call_count, 1) self.assertEqual(str(import_file_to_keystore_mock.call_args_list), \ expect_import_file_to_keystore) self.assertTrue(generate_random_string_mock.called) pass - @patch("__builtin__.open") + @patch("builtins.open") @patch("ambari_server.setupHttps.copy_file") @patch("ambari_server.setupHttps.is_root") @patch("ambari_server.setupHttps.read_ambari_user") @@ -2552,7 +2555,7 @@ def test_is_valid_https_port(self, get_ambari_properties_mock): pass @patch("socket.getfqdn") - @patch("urllib2.urlopen") + @patch("urllib.request.urlopen") @patch("ambari_server.setupHttps.get_ambari_properties") def test_get_fqdn(self, get_ambari_properties_mock, url_open_mock, getfqdn_mock): #No ambari.properties @@ -2653,8 +2656,8 @@ def test_get_cert_info(self, run_os_command_mock): self.assertEqual(cert_info[attr3_key], attr3_value) pass - @patch("__builtin__.raw_input") - def test_get_validated_string_input(self, raw_input_mock): + @patch("builtins.input") + def test_get_validated_string_input(self, input_mock): prompt = 'prompt' default_value = 'default' description = 'desc' @@ -2662,14 +2665,14 @@ def test_get_validated_string_input(self, raw_input_mock): validator.return_value = True inputed_value1 = 'val1' inputed_value2 = 'val2' - raw_input_mock.return_value = inputed_value1 + input_mock.return_value = inputed_value1 input = get_validated_string_input(prompt, default_value, None, description, False, False, validator) self.assertTrue(validator.called) self.assertEqual(inputed_value1, input) validator.side_effect = [False, True] - raw_input_mock.side_effect = [inputed_value1, inputed_value2] + input_mock.side_effect = [inputed_value1, inputed_value2] input = get_validated_string_input(prompt, default_value, None, description, False, False, validator) self.assertEqual(inputed_value2, input) @@ -2678,7 +2681,7 @@ def test_get_validated_string_input(self, raw_input_mock): @not_for_platform(PLATFORM_WINDOWS) @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) @patch("ambari_server.serverUtils.run_os_command") - @patch("__builtin__.open") + @patch("builtins.open") @patch("os.path.exists") def test_is_server_runing(self, os_path_exists_mock, open_mock, \ run_os_command_mock): @@ -2715,7 +2718,7 @@ def test_is_server_runing(self, query_service_status_mock): @not_for_platform(PLATFORM_WINDOWS) @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) @patch("ambari_server.serverUtils.run_os_command") - @patch("__builtin__.open") + @patch("builtins.open") @patch("os.path.exists") def test_is_server_runing_bad_file(self, os_path_exists_mock, open_mock, \ run_os_command_mock): @@ -2923,7 +2926,7 @@ def _init_test_jdk_mocks(): statMock.return_value = statResult try: rcode = download_and_install_jdk(args) - except Exception, e: + except Exception as e: raise self.assertEqual(0, rcode) @@ -3046,7 +3049,7 @@ def test_get_postgre_status(self, run_os_command_mock): @not_for_platform(PLATFORM_WINDOWS) @patch("time.sleep") - @patch("subprocess32.Popen") + @patch("subprocess.Popen") @patch("ambari_server.dbConfiguration_linux.run_os_command") @patch.object(PGConfig, "_get_postgre_status") def test_check_postgre_up(self, get_postgre_status_mock, run_os_command_mock, @@ -3074,7 +3077,7 @@ def test_check_postgre_up(self, get_postgre_status_mock, run_os_command_mock, self.assertEqual(0, retcode) pass - @patch("platform.linux_distribution") + @patch("distro.linux_distribution") @patch("platform.system") @patch("ambari_commons.logging_utils.print_info_msg") @patch("ambari_commons.logging_utils.print_error_msg") @@ -3099,12 +3102,12 @@ def test_configure_os_settings(self, get_conf_dir_mock, write_property_mock, get self.assertEqual(0, rcode) self.assertTrue(write_property_mock.called) self.assertEqual(2, write_property_mock.call_count) - self.assertEquals(write_property_mock.call_args_list[0][0][0], "server.os_family") - self.assertEquals(write_property_mock.call_args_list[1][0][0], "server.os_type") + self.assertEqual(write_property_mock.call_args_list[0][0][0], "server.os_family") + self.assertEqual(write_property_mock.call_args_list[1][0][0], "server.os_type") pass - @patch("__builtin__.open") + @patch("builtins.open") @patch("ambari_server.serverConfiguration.Properties") @patch("ambari_server.serverConfiguration.search_file") @patch("ambari_server.serverConfiguration.get_conf_dir") @@ -3146,7 +3149,7 @@ def test_prompt_db_properties_default(self, get_ambari_properties_mock): pass @not_for_platform(PLATFORM_WINDOWS) - @patch.object(subprocess32, "Popen") + @patch.object(subprocess, "Popen") def test_check_ambari_java_version_is_valid(self, popenMock): # case 1: jdk7 is picked for stacks properties = Properties() @@ -3598,7 +3601,7 @@ def test_unpack_jce_policy(self, rmtree_mock, copy_files_mock, os_listdir_mock, @patch.object(JDKSetup, "unpack_jce_policy") @patch("ambari_server.serverSetup.get_ambari_properties") @patch("ambari_commons.os_utils.search_file") - @patch("__builtin__.open") + @patch("builtins.open") @patch("ambari_server.serverSetup.logger") def test_setup_jce_policy(self, logger_mock, open_mock, search_file_mock, get_ambari_properties_mock, unpack_jce_policy_mock, update_properties_mock, path_split_mock, shutil_copy_mock, exists_mock): @@ -4290,13 +4293,13 @@ def reset_mocks(): @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) @patch("ambari_server.serverSetup.get_YN_input") - @patch("__builtin__.raw_input") + @patch("builtins.input") @patch("ambari_server.serverSetup.is_root") @patch("ambari_server.serverSetup.logger") - def test_reset_default(self, logger_mock, is_root_mock, raw_input_mock, get_YN_inputMock): + def test_reset_default(self, logger_mock, is_root_mock, input_mock, get_YN_inputMock): is_root_mock.return_value=True get_YN_inputMock.return_value = False - raw_input_mock.return_value="" + input_mock.return_value="" args = MagicMock() try: @@ -4429,8 +4432,8 @@ def test_silent_reset(self, is_server_runing_mock, @patch("ambari_server.serverConfiguration.get_ambari_properties") @patch("ambari_server_main.get_ambari_properties") @patch("os.path.exists") - @patch("__builtin__.open") - @patch.object(subprocess32, "Popen") + @patch("builtins.open") + @patch.object(subprocess, "Popen") @patch("ambari_server.serverConfiguration.search_file") @patch("ambari_server_main.check_database_name_property") @patch("ambari_server_main.find_jdk") @@ -4658,10 +4661,11 @@ def reset_mocks(): self.assertTrue('some_reason' in e.reason) self.assertTrue(perform_housekeeping_mock.called) - perform_housekeeping_mock.side_effect = lambda *v, **kv : None - perform_housekeeping_mock.reset_mock() - - self.assertFalse('Unable to start PostgreSQL server' in e.reason) + try: + perform_housekeeping_mock.side_effect = lambda *v, **kv: None + perform_housekeeping_mock.reset_mock() + except FatalException as e: + self.assertFalse('Unable to start PostgreSQL server' in e.reason) self.assertFalse(check_postgre_up_mock.called) args = reset_mocks() @@ -4812,7 +4816,7 @@ def reset_mocks(): self.assertFalse(get_validated_string_input_method.called) self.assertFalse(save_master_key_method.called) popen_arg = popenMock.call_args[1]['env'] - self.assertEquals(os_environ_mock.copy.return_value, popen_arg) + self.assertEqual(os_environ_mock.copy.return_value, popen_arg) args = reset_mocks() @@ -4836,7 +4840,7 @@ def reset_mocks(): self.assertTrue(get_validated_string_input_method.called) self.assertTrue(save_master_key_method.called) popen_arg = popenMock.call_args[1]['env'] - self.assertEquals(os_environ_mock.copy.return_value, popen_arg) + self.assertEqual(os_environ_mock.copy.return_value, popen_arg) # Checking situation when required properties not set up args = reset_mocks() @@ -4997,7 +5001,7 @@ def test_setup_jdbc(self, copy_mock, os_symlink_mock, os_remove_mock, lexists_mo try: setup_jdbc(args) except FatalException as e: - self.assertEquals("File test jdbc does not exist!", e.reason) + self.assertEqual("File test jdbc does not exist!", e.reason) fail = True self.assertTrue(fail) @@ -5009,7 +5013,7 @@ def test_setup_jdbc(self, copy_mock, os_symlink_mock, os_remove_mock, lexists_mo try: setup_jdbc(args) except FatalException as e: - self.assertEquals("Unsupported database name incorrect db. Please see help for more information.", e.reason) + self.assertEqual("Unsupported database name incorrect db. Please see help for more information.", e.reason) fail = True self.assertTrue(fail) @@ -5021,7 +5025,7 @@ def test_setup_jdbc(self, copy_mock, os_symlink_mock, os_remove_mock, lexists_mo try: setup_jdbc(args) except FatalException as e: - self.assertEquals("Error getting ambari properties", e.reason) + self.assertEqual("Error getting ambari properties", e.reason) fail = True self.assertTrue(fail) @@ -5033,7 +5037,7 @@ def test_setup_jdbc(self, copy_mock, os_symlink_mock, os_remove_mock, lexists_mo try: setup_jdbc(args) except FatalException as e: - self.assertEquals("Error getting ambari properties", e.reason) + self.assertEqual("Error getting ambari properties", e.reason) fail = True self.assertTrue(fail) @@ -5086,8 +5090,8 @@ def side_effect(): self.assertTrue(os_remove_mock.called) self.assertTrue(os_symlink_mock.called) self.assertTrue(copy_mock.called) - self.assertEquals(os_symlink_mock.call_args_list[0][0][0], os.path.join("somewhere","test jdbc")) - self.assertEquals(os_symlink_mock.call_args_list[0][0][1], os.path.join("somewhere","postgres-jdbc-driver.jar")) + self.assertEqual(os_symlink_mock.call_args_list[0][0][0], os.path.join("somewhere","test jdbc")) + self.assertEqual(os_symlink_mock.call_args_list[0][0][1], os.path.join("somewhere","postgres-jdbc-driver.jar")) pass @only_for_platform(PLATFORM_WINDOWS) @@ -5111,7 +5115,7 @@ def test_setup_jdbc(self, copy_mock, os_symlink_mock, os_remove_mock, lexists_mo try: setup_jdbc(args) except FatalException as e: - self.assertEquals("File test jdbc does not exist!", e.reason) + self.assertEqual("File test jdbc does not exist!", e.reason) fail = True self.assertTrue(fail) @@ -5123,7 +5127,7 @@ def test_setup_jdbc(self, copy_mock, os_symlink_mock, os_remove_mock, lexists_mo try: setup_jdbc(args) except FatalException as e: - self.assertEquals("Unsupported database name incorrect db. Please see help for more information.", e.reason) + self.assertEqual("Unsupported database name incorrect db. Please see help for more information.", e.reason) fail = True self.assertTrue(fail) @@ -5135,7 +5139,7 @@ def test_setup_jdbc(self, copy_mock, os_symlink_mock, os_remove_mock, lexists_mo try: setup_jdbc(args) except FatalException as e: - self.assertEquals("Error getting ambari properties", e.reason) + self.assertEqual("Error getting ambari properties", e.reason) fail = True self.assertFalse(fail) pass @@ -5143,7 +5147,7 @@ def test_setup_jdbc(self, copy_mock, os_symlink_mock, os_remove_mock, lexists_mo @not_for_platform(PLATFORM_WINDOWS) @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) - @patch("__builtin__.open") + @patch("builtins.open") @patch("os.path.isfile") @patch("os.path.lexists") @patch("os.path.exists") @@ -5247,10 +5251,10 @@ def reset_mocks(): self.fail("Did not expect failure: " + str(fe)) else: self.assertTrue(write_property_mock.called) - self.assertEquals(write_property_mock.call_args_list[0][0][0], JDBC_DATABASE_NAME_PROPERTY) - self.assertEquals(write_property_mock.call_args_list[0][0][1], "ambari") - self.assertEquals(write_property_mock.call_args_list[1][0][0], JDBC_DATABASE_PROPERTY) - self.assertEquals(write_property_mock.call_args_list[1][0][1], "postgres") + self.assertEqual(write_property_mock.call_args_list[0][0][0], JDBC_DATABASE_NAME_PROPERTY) + self.assertEqual(write_property_mock.call_args_list[0][0][1], "ambari") + self.assertEqual(write_property_mock.call_args_list[1][0][0], JDBC_DATABASE_PROPERTY) + self.assertEqual(write_property_mock.call_args_list[1][0][1], "postgres") self.assertFalse(move_user_custom_actions_mock.called) args = reset_mocks() @@ -5296,6 +5300,7 @@ def reset_mocks(): get_ambari_properties_mock.return_value = properties get_ambari_properties_3_mock.side_effect = get_ambari_properties_2_mock.side_effect = [properties, properties2, properties2] + try: upgrade(args) except FatalException as fe: @@ -5327,6 +5332,7 @@ def reset_mocks(): isfile_mock.side_effect = [False, True, False, False, False] + try: upgrade(args) except FatalException as fe: @@ -5351,6 +5357,7 @@ def reset_mocks(): isfile_mock.side_effect = None + try: upgrade(args) except FatalException as fe: @@ -5396,7 +5403,7 @@ def test_find_and_copy_custom_services(self, glob_mock, isdir_mock, basename_moc @not_for_platform(PLATFORM_WINDOWS) @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) - @patch("__builtin__.open") + @patch("builtins.open") @patch("os.path.isfile") @patch("os.path.exists") @patch("os.path.lexists") @@ -5533,7 +5540,7 @@ def reset_mocks(): try: upgrade(args) except FatalException as e: - self.assertEquals("Error getting ambari properties", e.reason) + self.assertEqual("Error getting ambari properties", e.reason) fail = True self.assertTrue(fail) @@ -5571,16 +5578,16 @@ def reset_mocks(): upgrade(args) self.assertTrue(os_remove_mock.called) - self.assertEquals(os_remove_mock.call_count, 1) - self.assertEquals(os_remove_mock.call_args[0][0], os.path.join("resources", "oracle-jdbc-driver.jar")) - self.assertEquals(os_symlink_mock.call_count, 1) - self.assertEquals(os_symlink_mock.call_args[0][0], os.path.join("resources", "ojdbc6.jar")) - self.assertEquals(os_symlink_mock.call_args[0][1], os.path.join("resources", "oracle-jdbc-driver.jar")) + self.assertEqual(os_remove_mock.call_count, 1) + self.assertEqual(os_remove_mock.call_args[0][0], os.path.join("resources", "oracle-jdbc-driver.jar")) + self.assertEqual(os_symlink_mock.call_count, 1) + self.assertEqual(os_symlink_mock.call_args[0][0], os.path.join("resources", "ojdbc6.jar")) + self.assertEqual(os_symlink_mock.call_args[0][1], os.path.join("resources", "oracle-jdbc-driver.jar")) pass @only_for_platform(PLATFORM_WINDOWS) @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) - @patch("__builtin__.open") + @patch("builtins.open") @patch("os.path.isfile") @patch("os.path.exists") @patch("os.path.lexists") @@ -5716,7 +5723,7 @@ def reset_mocks(): try: upgrade(args) except FatalException as e: - self.assertEquals("Error getting ambari properties", e.reason) + self.assertEqual("Error getting ambari properties", e.reason) fail = True self.assertTrue(fail) @@ -5755,7 +5762,7 @@ def reset_mocks(): def test_print_info_msg(self): - out = StringIO.StringIO() + out = io.StringIO() sys.stdout = out set_verbose(True) @@ -5768,7 +5775,7 @@ def test_print_info_msg(self): def test_print_error_msg(self): - out = StringIO.StringIO() + out = io.StringIO() sys.stdout = out set_verbose(True) @@ -5781,7 +5788,7 @@ def test_print_error_msg(self): def test_print_warning_msg(self): - out = StringIO.StringIO() + out = io.StringIO() sys.stdout = out set_verbose(True) @@ -6037,7 +6044,7 @@ def reset_mocks(): self.assertTrue(get_YN_input_mock.called) self.assertTrue(get_validated_string_input_mock.called) - self.assertEquals(args.database_index, 3) + self.assertEqual(args.database_index, 3) pass @patch("ambari_server.serverConfiguration.get_conf_dir") @@ -6109,7 +6116,7 @@ def _test_update_ambari_properties(self, get_conf_dir_mock): # Command should not fail if *.rpmsave file is missing result = update_ambari_properties() - self.assertEquals(result, 0) + self.assertEqual(result, 0) os.unlink(fn2) @@ -6119,7 +6126,7 @@ def _test_update_ambari_properties(self, get_conf_dir_mock): configDefaults.AMBARI_PROPERTIES_BACKUP_FILE = fn result = update_ambari_properties() - self.assertNotEquals(result, 0) + self.assertNotEqual(result, 0) pass @patch("ambari_server.properties.Properties.__init__") @@ -6127,17 +6134,17 @@ def _test_update_ambari_properties(self, get_conf_dir_mock): def test_update_ambari_properties_negative_case(self, search_file_mock, properties_mock): search_file_mock.return_value = None #Call tested method - self.assertEquals(0, update_ambari_properties()) + self.assertEqual(0, update_ambari_properties()) self.assertFalse(properties_mock.called) search_file_mock.return_value = False #Call tested method - self.assertEquals(0, update_ambari_properties()) + self.assertEqual(0, update_ambari_properties()) self.assertFalse(properties_mock.called) search_file_mock.return_value = '' #Call tested method - self.assertEquals(0, update_ambari_properties()) + self.assertEqual(0, update_ambari_properties()) self.assertFalse(properties_mock.called) pass @@ -6200,11 +6207,11 @@ def _test_update_ambari_properties_without_some_properties(self, get_conf_dir_mo @patch("ambari_server.serverSetup.check_ambari_user") @patch("ambari_server.serverSetup.download_and_install_jdk") @patch("ambari_server.serverSetup.configure_os_settings") - @patch('__builtin__.raw_input') + @patch('builtins.input') @patch("ambari_server.serverSetup.disable_security_enhancements") @patch("ambari_server.serverSetup.expand_jce_zip_file") @patch("ambari_server.serverSetup.logger") - def test_setup_remote_db_wo_client(self, logger_mock, expand_jce_zip_file_mock, check_selinux_mock, raw_input, configure_os_settings_mock, + def test_setup_remote_db_wo_client(self, logger_mock, expand_jce_zip_file_mock, check_selinux_mock, input, configure_os_settings_mock, download_jdk_mock, check_ambari_user_mock, is_root_mock, check_jdbc_drivers_mock, read_password_mock, ensure_jdbc_driver_installed_mock, store_remote_properties_mock, get_validated_string_input_0_mock, get_YN_input_0_mock, @@ -6226,7 +6233,7 @@ def test_setup_remote_db_wo_client(self, logger_mock, expand_jce_zip_file_mock, del args.database_password del args.persistence_type - raw_input.return_value = "" + input.return_value = "" is_root_mock.return_value = True check_selinux_mock.return_value = (0, "") run_os_command_mock.return_value = 3,"","" @@ -6259,12 +6266,12 @@ def test_setup_remote_db_wo_client(self, logger_mock, expand_jce_zip_file_mock, @patch("ambari_server.userInput.get_YN_input") @patch("ambari_commons.os_utils.is_root") @patch("ambari_server.dbConfiguration_linux.store_password_file") - @patch("__builtin__.raw_input") - def test_store_remote_properties(self, raw_input_mock, store_password_file_mock, + @patch("builtins.input") + def test_store_remote_properties(self, input_mock, store_password_file_mock, is_root_mock, get_YN_input, exit_mock, run_os_command_mock ): - raw_input_mock.return_value = "" + input_mock.return_value = "" is_root_mock.return_value = True get_YN_input.return_value = False run_os_command_mock.return_value = 3,"","" @@ -6298,7 +6305,7 @@ def test_store_remote_properties(self, raw_input_mock, store_password_file_mock, self.assertTrue(found) # verify that some properties exist - self.assertEquals("internal", properties.get_property(JDBC_CONNECTION_POOL_TYPE)) + self.assertEqual("internal", properties.get_property(JDBC_CONNECTION_POOL_TYPE)) # now try with MySQL instead of Oracle to verify that the properties are different args.dbms = "mysql" @@ -6312,7 +6319,7 @@ def test_store_remote_properties(self, raw_input_mock, store_password_file_mock, dbConfig._store_remote_properties(properties, args) # verify MySQL properties - self.assertEquals("c3p0", properties.get_property(JDBC_CONNECTION_POOL_TYPE)) + self.assertEqual("c3p0", properties.get_property(JDBC_CONNECTION_POOL_TYPE)) @not_for_platform(PLATFORM_WINDOWS) @@ -6375,11 +6382,11 @@ def side_effect(): pathExistsMock.return_value = 1 res = remove_file("/someNonExsistantDir/filename") - self.assertEquals(res, 1) + self.assertEqual(res, 1) removeMock.side_effect = None res = remove_file("/someExsistantDir/filename") - self.assertEquals(res, 0) + self.assertEqual(res, 0) @patch("shutil.copyfile") def test_copy_file(self, shutilCopyfileMock): @@ -6413,7 +6420,7 @@ def side_effect(): @patch("ambari_server.dbConfiguration_linux.print_error_msg") @patch("ambari_server.dbConfiguration.print_error_msg") @patch("ambari_server.dbConfiguration_linux.print_warning_msg") - @patch("__builtin__.raw_input") + @patch("builtins.input") @patch("glob.glob") @patch("os.path.isdir") @patch("os.path.lexists") @@ -6426,9 +6433,9 @@ def side_effect(): @patch("ambari_server.dbConfiguration.get_validated_string_input") def test_ensure_jdbc_drivers_installed(self, get_valid_str_in_mock, update_properties_mock, getYN_mock, isfile_mock, shutil_copy_mock, os_symlink_mock, os_remove_mock, lexists_mock, isdir_mock, glob_mock, - raw_input_mock, print_warning_msg, print_error_msg_mock, print_error_msg_2_mock, + input_mock, print_warning_msg, print_error_msg_mock, print_error_msg_2_mock, get_ambari_properties_mock, get_ambari_properties_2_mock): - out = StringIO.StringIO() + out = io.StringIO() sys.stdout = out def reset_mocks(): @@ -6437,7 +6444,7 @@ def reset_mocks(): shutil_copy_mock.reset_mock() print_error_msg_mock.reset_mock() print_warning_msg.reset_mock() - raw_input_mock.reset_mock() + input_mock.reset_mock() isfile_mock.reset_mock() os_remove_mock.reset_mock getYN_mock.reset_mock() @@ -6477,7 +6484,7 @@ def reset_mocks(): dbms = factory.create(args, props) rcode = dbms.ensure_jdbc_driver_installed(props) - self.assertEquals(update_properties_mock.call_count, 0) + self.assertEqual(update_properties_mock.call_count, 0) self.assertTrue(rcode) args = reset_mocks() @@ -6487,8 +6494,8 @@ def reset_mocks(): dbms = factory.create(args, props) rcode = dbms.ensure_jdbc_driver_installed(props) - self.assertEquals(update_properties_mock.call_count, 1) - self.assertEquals(getYN_mock.call_count, 1) + self.assertEqual(update_properties_mock.call_count, 1) + self.assertEqual(getYN_mock.call_count, 1) self.assertTrue(rcode) # check scenario when user entered valid jdbc full path @@ -6498,12 +6505,12 @@ def reset_mocks(): rcode = dbms.ensure_jdbc_driver_installed(props) - self.assertEquals(update_properties_mock.call_count, 1) + self.assertEqual(update_properties_mock.call_count, 1) self.assertTrue(rcode) - self.assertEquals(props['server.jdbc.driver.path'], '/test/full/path/to/oracle_jdbc.jar') - self.assertEquals(shutil_copy_mock.call_count, 1) - self.assertEquals(shutil_copy_mock.call_count, 1) - self.assertEquals(os_remove_mock.call_count, 1) + self.assertEqual(props['server.jdbc.driver.path'], '/test/full/path/to/oracle_jdbc.jar') + self.assertEqual(shutil_copy_mock.call_count, 1) + self.assertEqual(shutil_copy_mock.call_count, 1) + self.assertEqual(os_remove_mock.call_count, 1) # check scenario when no default jdbc and user entered incorrect full jdbc path args = reset_mocks() @@ -6551,9 +6558,9 @@ def test_check_jdbc_drivers(self, os_symlink_mock, os_remove_mock, lexists_mock, check_jdbc_drivers(args) - self.assertEquals(os_symlink_mock.call_count, 1) - self.assertEquals(os_symlink_mock.call_args_list[0][0][0], os.path.join(os.sep,'tmp','ojdbc6.jar')) - self.assertEquals(os_symlink_mock.call_args_list[0][0][1], os.path.join(os.sep,'tmp','oracle-jdbc-driver.jar')) + self.assertEqual(os_symlink_mock.call_count, 1) + self.assertEqual(os_symlink_mock.call_args_list[0][0][0], os.path.join(os.sep,'tmp','ojdbc6.jar')) + self.assertEqual(os_symlink_mock.call_args_list[0][0][1], os.path.join(os.sep,'tmp','oracle-jdbc-driver.jar')) # Check negative scenarios @@ -6632,7 +6639,7 @@ def test_parse_properties_file(self, find_properties_file_mock, check_database_n args = MagicMock() parse_properties_file(args) - self.assertEquals(args.persistence_type, "local") + self.assertEqual(args.persistence_type, "local") with open(tf1.name, 'w') as fout: fout.write("\n") @@ -6641,7 +6648,7 @@ def test_parse_properties_file(self, find_properties_file_mock, check_database_n args = MagicMock() parse_properties_file(args) - self.assertEquals(args.persistence_type, "remote") + self.assertEqual(args.persistence_type, "remote") pass @@ -6654,7 +6661,7 @@ def test_configure_database_username_password_masterkey_persisted(self, decrypt_password_for_alias_method, path_isabs_method): - out = StringIO.StringIO() + out = io.StringIO() sys.stdout = out properties = Properties() @@ -6682,8 +6689,8 @@ def test_configure_database_username_password_masterkey_persisted(self, dbms = OracleConfig(args, properties, "local") self.assertTrue(decrypt_password_for_alias_method.called) - self.assertEquals("fakeuser", dbms.database_username) - self.assertEquals("falepasswd", dbms.database_password) + self.assertEqual("fakeuser", dbms.database_username) + self.assertEqual("falepasswd", dbms.database_password) sys.stdout = sys.__stdout__ pass @@ -6693,20 +6700,20 @@ def test_configure_database_username_password_masterkey_persisted(self, @patch("ambari_server.dbConfiguration_linux.read_password") def test_configure_database_password(self, read_password_method): - out = StringIO.StringIO() + out = io.StringIO() sys.stdout = out read_password_method.return_value = "fakepasswd" result = LinuxDBMSConfig._configure_database_password(True) self.assertTrue(read_password_method.called) - self.assertEquals("fakepasswd", result) + self.assertEqual("fakepasswd", result) result = LinuxDBMSConfig._configure_database_password(True) - self.assertEquals("fakepasswd", result) + self.assertEqual("fakepasswd", result) result = LinuxDBMSConfig._configure_database_password(True) - self.assertEquals("fakepasswd", result) + self.assertEqual("fakepasswd", result) sys.stdout = sys.__stdout__ pass @@ -6715,12 +6722,12 @@ def test_configure_database_password(self, read_password_method): @not_for_platform(PLATFORM_WINDOWS) def test_configure_database_password_silent(self): - out = StringIO.StringIO() + out = io.StringIO() sys.stdout = out set_silent(True) result = LinuxDBMSConfig._configure_database_password(True, "CustomDefaultPasswd") - self.assertEquals("CustomDefaultPasswd", result) + self.assertEqual("CustomDefaultPasswd", result) sys.stdout = sys.__stdout__ pass @@ -6759,7 +6766,7 @@ def test_check_database(self, exitMock, getJavaExePathMock, self.assertTrue(ensureCanStartUnderCurrentUserMock.called) self.assertTrue(generateEnvMock.called) - self.assertEquals(runOSCommandMock.call_args[0][0], '/path/to/java -cp test:path12 org.apache.ambari.server.checks.DatabaseConsistencyChecker') + self.assertEqual(runOSCommandMock.call_args[0][0], '/path/to/java -cp test:path12 org.apache.ambari.server.checks.DatabaseConsistencyChecker') pass @@ -6861,8 +6868,8 @@ def _init_test_ldap_properties_map_invalid_input_2(): return ldap_properties_map @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) - @patch("urllib2.urlopen") - @patch("__builtin__.raw_input") + @patch("urllib.request.urlopen") + @patch("builtins.input") @patch("ambari_server.userInput.get_password") @patch("ambari_server.setupSecurity.get_is_secure") @patch("ambari_server.setupSecurity.get_YN_input") @@ -6877,8 +6884,8 @@ def test_setup_ldap_invalid_input(self, get_ldap_properties_from_db_method, is_s update_properties_method, get_YN_input_method, get_is_secure_method, - get_password_mock, raw_input_mock, urlopen_mock): - out = StringIO.StringIO() + get_password_mock, input_mock, urlopen_mock): + out = io.StringIO() sys.stdout = out is_server_runing_method.return_value = (True, 0) search_file_message.return_value = "filepath" @@ -6891,7 +6898,7 @@ def test_setup_ldap_invalid_input(self, get_ldap_properties_from_db_method, is_s properties.process_pair(CLIENT_API_PORT_PROPERTY, '8080') get_ambari_properties_method.return_value = properties - raw_input_mock.side_effect = [LDAP_GENERIC, 'a', '3', 'b', 'b', 'hody', 'b', '2', 'false', 'user', 'uid', 'memberof', 'group', 'cn', 'member', 'dn', 'base', 'follow', 'true', 'skip', 'false', 'false', 'admin'] + input_mock.side_effect = [LDAP_GENERIC, 'a', '3', 'b', 'b', 'hody', 'b', '2', 'false', 'user', 'uid', 'memberof', 'group', 'cn', 'member', 'dn', 'base', 'follow', 'true', 'skip', 'false', 'false', 'admin'] get_password_mock.side_effect = ['admin'] set_silent(False) get_YN_input_method.return_value = True @@ -6910,22 +6917,22 @@ def test_setup_ldap_invalid_input(self, get_ldap_properties_from_db_method, is_s requestData = json.loads(request.data) self.assertTrue(isinstance(requestData, dict)) ldapProperties = requestData['Configuration']['properties']; - properties_updated_in_ambari_db = sorted(ldapProperties.iteritems(), key=operator.itemgetter(0)) - properties_should_be_updated_in_ambari_db = sorted(TestAmbariServer._init_test_ldap_properties_map_invalid_input_1().iteritems(), key=operator.itemgetter(0)) + properties_updated_in_ambari_db = sorted(ldapProperties.items(), key=operator.itemgetter(0)) + properties_should_be_updated_in_ambari_db = sorted(TestAmbariServer._init_test_ldap_properties_map_invalid_input_1().items(), key=operator.itemgetter(0)) self.assertEqual(properties_should_be_updated_in_ambari_db, properties_updated_in_ambari_db) - properties_updated_in_ambari_dot_properties = sorted(update_properties_method.call_args[0][1].iteritems(), key=operator.itemgetter(0)) - properties_should_be_updated_in_ambari_dot_properties = sorted({"client.security": "ldap"}.iteritems(), key=operator.itemgetter(0)) - self.assertEquals(properties_should_be_updated_in_ambari_dot_properties, properties_updated_in_ambari_dot_properties) + properties_updated_in_ambari_dot_properties = sorted(update_properties_method.call_args[0][1].items(), key=operator.itemgetter(0)) + properties_should_be_updated_in_ambari_dot_properties = sorted({"client.security": "ldap"}.items(), key=operator.itemgetter(0)) + self.assertEqual(properties_should_be_updated_in_ambari_dot_properties, properties_updated_in_ambari_dot_properties) self.assertTrue(urlopen_mock.called) self.assertTrue(update_properties_method.called) self.assertTrue(get_YN_input_method.called) - self.assertEquals(22, raw_input_mock.call_count) + self.assertEqual(22, input_mock.call_count) self.assertEqual(1, get_password_mock.call_count) - raw_input_mock.reset_mock() - raw_input_mock.side_effect = [LDAP_GENERIC, 'a', '3', '', '', 'b', '2', 'false', 'user', 'uid', 'memberof', 'group', 'cn', 'member', 'dn', 'base', 'follow', 'true', 'skip', 'false', 'false', 'admin'] + input_mock.reset_mock() + input_mock.side_effect = [LDAP_GENERIC, 'a', '3', '', '', 'b', '2', 'false', 'user', 'uid', 'memberof', 'group', 'cn', 'member', 'dn', 'base', 'follow', 'true', 'skip', 'false', 'false', 'admin'] get_password_mock.reset_mock() get_password_mock.side_effect = ['admin'] @@ -6940,18 +6947,18 @@ def test_setup_ldap_invalid_input(self, get_ldap_properties_from_db_method, is_s requestData = json.loads(request.data) self.assertTrue(isinstance(requestData, dict)) ldapProperties = requestData['Configuration']['properties']; - properties_updated_in_ambari_db = sorted(ldapProperties.iteritems(), key=operator.itemgetter(0)) - properties_should_be_updated_in_ambari_db = sorted(TestAmbariServer._init_test_ldap_properties_map_invalid_input_2().iteritems(), key=operator.itemgetter(0)) + properties_updated_in_ambari_db = sorted(ldapProperties.items(), key=operator.itemgetter(0)) + properties_should_be_updated_in_ambari_db = sorted(TestAmbariServer._init_test_ldap_properties_map_invalid_input_2().items(), key=operator.itemgetter(0)) self.assertEqual(properties_should_be_updated_in_ambari_db, properties_updated_in_ambari_db) - properties_updated_in_ambari_dot_properties = sorted(update_properties_method.call_args[0][1].iteritems(), key=operator.itemgetter(0)) - properties_should_be_updated_in_ambari_dot_properties = sorted({"client.security": "ldap"}.iteritems(), key=operator.itemgetter(0)) - self.assertEquals(properties_should_be_updated_in_ambari_dot_properties, properties_updated_in_ambari_dot_properties) + properties_updated_in_ambari_dot_properties = sorted(update_properties_method.call_args[0][1].items(), key=operator.itemgetter(0)) + properties_should_be_updated_in_ambari_dot_properties = sorted({"client.security": "ldap"}.items(), key=operator.itemgetter(0)) + self.assertEqual(properties_should_be_updated_in_ambari_dot_properties, properties_updated_in_ambari_dot_properties) self.assertTrue(urlopen_mock.called) self.assertTrue(update_properties_method.called) self.assertTrue(get_YN_input_method.called) - self.assertEquals(21, raw_input_mock.call_count) + self.assertEqual(21, input_mock.call_count) self.assertEqual(1, get_password_mock.call_count) sys.stdout = sys.__stdout__ @@ -6959,7 +6966,7 @@ def test_setup_ldap_invalid_input(self, get_ldap_properties_from_db_method, is_s @patch("ambari_server.setupSecurity.is_server_runing") def test_setup_ldap_should_fail_if_ambari_server_is_not_running(self, is_server_runing_mock): - out = StringIO.StringIO() + out = io.StringIO() sys.stdout = out is_server_runing_mock.return_value = (False, 0) try: @@ -7028,7 +7035,7 @@ def _init_test_ldap_properties_map(): return ldap_properties_map @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) - @patch("urllib2.urlopen") + @patch("urllib.request.urlopen") @patch("ambari_server.setupSecurity.get_is_secure") @patch("ambari_server.setupSecurity.encrypt_password") @patch("ambari_server.setupSecurity.save_passwd_for_alias") @@ -7053,7 +7060,7 @@ def test_setup_ldap(self, get_cluster_name_method, get_eligible_services_method, configure_ldap_password_method, update_properties_method, get_YN_input_method, save_passwd_for_alias_method, encrypt_password_method, get_is_secure_method, urlopen_mock): - out = StringIO.StringIO() + out = io.StringIO() sys.stdout = out options = self._create_empty_options_mock() @@ -7121,13 +7128,13 @@ def valid_input_side_effect(*args, **kwargs): requestData = json.loads(request.data) self.assertTrue(isinstance(requestData, dict)) ldapProperties = requestData['Configuration']['properties']; - properties_updated_in_ambari_db = sorted(ldapProperties.iteritems(), key=operator.itemgetter(0)) - properties_should_be_updated_in_ambari_db = sorted(TestAmbariServer._init_test_ldap_properties_map().iteritems(), key=operator.itemgetter(0)) + properties_updated_in_ambari_db = sorted(ldapProperties.items(), key=operator.itemgetter(0)) + properties_should_be_updated_in_ambari_db = sorted(TestAmbariServer._init_test_ldap_properties_map().items(), key=operator.itemgetter(0)) self.assertEqual(properties_should_be_updated_in_ambari_db, properties_updated_in_ambari_db) - properties_updated_in_ambari_dot_properties = sorted(update_properties_method.call_args[0][1].iteritems(), key=operator.itemgetter(0)) - properties_should_be_updated_in_ambari_dot_properties = sorted({"client.security": "ldap"}.iteritems(), key=operator.itemgetter(0)) - self.assertEquals(properties_should_be_updated_in_ambari_dot_properties, properties_updated_in_ambari_dot_properties) + properties_updated_in_ambari_dot_properties = sorted(update_properties_method.call_args[0][1].items(), key=operator.itemgetter(0)) + properties_should_be_updated_in_ambari_dot_properties = sorted({"client.security": "ldap"}.items(), key=operator.itemgetter(0)) + self.assertEqual(properties_should_be_updated_in_ambari_dot_properties, properties_updated_in_ambari_dot_properties) self.assertTrue(urlopen_mock.called) self.assertTrue(update_properties_method.called) @@ -7199,15 +7206,15 @@ def input_enable_ssl(*args, **kwargs): LDAP_MGR_PASSWORD_PROPERTY: get_alias_string(LDAP_MGR_PASSWORD_ALIAS) } - sorted_x = sorted(ldap_properties_map.iteritems(), key=operator.itemgetter(0)) - sorted_y = sorted(update_properties_method.call_args[0][1].iteritems(), + sorted_x = sorted(ldap_properties_map.items(), key=operator.itemgetter(0)) + sorted_y = sorted(update_properties_method.call_args[0][1].items(), key=operator.itemgetter(0)) sys.stdout = sys.__stdout__ pass @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) - @patch("urllib2.urlopen") + @patch("urllib.request.urlopen") @patch("ambari_server.setupSecurity.get_YN_input") @patch("ambari_server.setupSecurity.read_password") @patch("ambari_server.setupSecurity.get_validated_string_input") @@ -7217,7 +7224,7 @@ def input_enable_ssl(*args, **kwargs): def test_setup_ldap_primary_host_and_port_with_ldap_url_option(self, get_ldap_properties_from_db_method, is_server_runing_method, get_ambari_properties_method, get_validated_string_input_method, read_password_method, get_YN_input_method, urlopen_method): - out = StringIO.StringIO() + out = io.StringIO() sys.stdout = out is_server_runing_method.return_value = (True, 0) @@ -7276,7 +7283,7 @@ def valid_input_side_effect(*args, **kwargs): pass @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) - @patch("urllib2.urlopen") + @patch("urllib.request.urlopen") @patch("ambari_server.setupSecurity.get_YN_input") @patch("ambari_server.setupSecurity.get_validated_string_input") @patch("ambari_server.setupSecurity.get_ambari_properties") @@ -7285,7 +7292,7 @@ def valid_input_side_effect(*args, **kwargs): def test_setup_ldap_with_ambari_admin_username_and_password_options(self, get_ldap_properties_from_db_method, is_server_runing_method, get_ambari_properties_method, get_validated_string_input_method, get_YN_input_method, urlopen_method): - out = StringIO.StringIO() + out = io.StringIO() sys.stdout = out is_server_runing_method.return_value = (True, 0) @@ -7333,7 +7340,7 @@ def valid_input_side_effect(*args, **kwargs): pass @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) - @patch("urllib2.urlopen") + @patch("urllib.request.urlopen") @patch("ambari_server.setupSecurity.get_YN_input") @patch("ambari_server.setupSecurity.get_validated_string_input") @patch("ambari_server.setupSecurity.get_ambari_properties") @@ -7342,7 +7349,7 @@ def valid_input_side_effect(*args, **kwargs): @patch("ambari_server.setupSecurity.get_ldap_properties_from_db") def test_setup_ldap_enforcement_cli_option(self, get_ldap_properties_from_db_method, query_ldap_type_method, is_server_runing_method, get_ambari_properties_method, get_validated_string_input_method, get_YN_input_method, urlopen_method): - out = StringIO.StringIO() + out = io.StringIO() sys.stdout = out is_server_runing_method.return_value = (True, 0) @@ -7441,36 +7448,36 @@ def test_LdapPropTemplate_get_default_value_returns_stored_property_value_if_pre properties = Properties() properties.process_pair("a.prop", "value") prop_template = LdapPropTemplate(properties, None, "a.prop", "Any prop:", REGEX_ANYTHING, False, LdapDefaultMap('default_value')) - self.assertEquals(prop_template.get_default_value('any_type'), "value") + self.assertEqual(prop_template.get_default_value('any_type'), "value") pass def test_LdapPropTemplate_get_default_value_returns_default_value_if_stored_property_value_not_exists(self): prop_template = LdapPropTemplate(Properties(), None, "a.prop", "Any prop:", REGEX_ANYTHING, False, LdapDefault('default_value')) - self.assertEquals(prop_template.get_default_value('any_type'), "default_value") + self.assertEqual(prop_template.get_default_value('any_type'), "default_value") pass def test_LdapPropTemplate_get_default_value_returns_none_if_stored_property_value_not_exists_and_no_default_value_was_specified(self): prop_template = LdapPropTemplate(Properties(), None, "a.prop", "Any prop:", REGEX_ANYTHING, False) - self.assertEquals(prop_template.get_default_value('any_type'), None) + self.assertEqual(prop_template.get_default_value('any_type'), None) pass def test_LdapDefaultMap_get_default_value_returns_none_if_default_map_is_none(self): default_map = LdapDefaultMap(None) - self.assertEquals(default_map.get_default_value('any_type'), None) + self.assertEqual(default_map.get_default_value('any_type'), None) pass def test_LdapDefaultMap_get_default_value_returns_none_if_key_not_present(self): default_map = LdapDefaultMap({LDAP_GENERIC : 'value'}) - self.assertEquals(default_map.get_default_value('non_existent_type'), None) + self.assertEqual(default_map.get_default_value('non_existent_type'), None) pass def test_LdapDefaultMap_get_default_value_returns_key_value_if_key_presents(self): default_map = LdapDefaultMap({LDAP_GENERIC : 'value'}) - self.assertEquals(default_map.get_default_value(LDAP_GENERIC), 'value') + self.assertEqual(default_map.get_default_value(LDAP_GENERIC), 'value') pass - @patch("urllib2.urlopen") + @patch("urllib.request.urlopen") @patch("ambari_server.setupSecurity.get_validated_string_input") @patch("ambari_server.setupSecurity.get_ambari_properties") @patch("ambari_server.setupSecurity.is_ldap_enabled") @@ -7506,14 +7513,14 @@ def test_ldap_sync_all(self, logger_mock, is_root_method, is_server_runing_mock, url = '{0}://{1}:{2!s}{3}'.format('http', '127.0.0.1', '8080', '/api/v1/ldap_sync_events') request = urlopen_mock.call_args_list[0][0][0] - self.assertEquals(url, str(request.get_full_url())) - self.assertEquals('[{"Event": {"specs": [{"principal_type": "users", "sync_type": "all"}, {"principal_type": "groups", "sync_type": "all"}]}}]', request.data) + self.assertEqual(url, str(request.get_full_url())) + self.assertEqual('[{"Event": {"specs": [{"principal_type": "users", "sync_type": "all"}, {"principal_type": "groups", "sync_type": "all"}]}}]', request.data) self.assertTrue(response.getcode.called) self.assertTrue(response.read.called) pass - @patch("urllib2.urlopen") + @patch("urllib.request.urlopen") @patch("ambari_server.setupSecurity.get_validated_string_input") @patch("ambari_server.setupSecurity.get_ambari_properties") @patch("ambari_server.setupSecurity.is_ldap_enabled") @@ -7549,16 +7556,16 @@ def test_ldap_sync_all_post_process_existing_users(self, logger_mock, is_root_me url = '{0}://{1}:{2!s}{3}'.format('http', '127.0.0.1', '8080', '/api/v1/ldap_sync_events') request = urlopen_mock.call_args_list[0][0][0] - self.assertEquals(url, str(request.get_full_url())) - self.assertEquals('[{"Event": {"specs": [{"post_process_existing_users": "true", "principal_type": "users", "sync_type": "all"}, {"post_process_existing_users": "true", "principal_type": "groups", "sync_type": "all"}]}}]', request.data) + self.assertEqual(url, str(request.get_full_url())) + self.assertEqual('[{"Event": {"specs": [{"principal_type": "users", "sync_type": "all", "post_process_existing_users": "true"}, {"principal_type": "groups", "sync_type": "all", "post_process_existing_users": "true"}]}}]', request.data) self.assertTrue(response.getcode.called) self.assertTrue(response.read.called) pass - @patch("__builtin__.open") + @patch("builtins.open") @patch("os.path.exists") - @patch("urllib2.urlopen") + @patch("urllib.request.urlopen") @patch("ambari_server.setupSecurity.get_validated_string_input") @patch("ambari_server.setupSecurity.get_ambari_properties") @patch("ambari_server.setupSecurity.is_ldap_enabled") @@ -7597,15 +7604,15 @@ def test_ldap_sync_users(self, logger_mock, is_root_method, is_server_runing_moc request = urlopen_mock.call_args_list[0][0][0] - self.assertEquals('[{"Event": {"specs": [{"principal_type": "users", "sync_type": "specific", "names": "bob, tom"}]}}]', request.data) + self.assertEqual('[{"Event": {"specs": [{"principal_type": "users", "sync_type": "specific", "names": "bob, tom"}]}}]', request.data) self.assertTrue(response.getcode.called) self.assertTrue(response.read.called) pass - @patch("__builtin__.open") + @patch("builtins.open") @patch("os.path.exists") - @patch("urllib2.urlopen") + @patch("urllib.request.urlopen") @patch("ambari_server.setupSecurity.get_validated_string_input") @patch("ambari_server.setupSecurity.get_ambari_properties") @patch("ambari_server.setupSecurity.is_ldap_enabled") @@ -7644,15 +7651,15 @@ def test_ldap_sync_users_post_process_existing_users(self, logger_mock, is_root_ request = urlopen_mock.call_args_list[0][0][0] - self.assertEquals('[{"Event": {"specs": [{"post_process_existing_users": "true", "principal_type": "users", "sync_type": "specific", "names": "bob, tom"}]}}]', request.data) + self.assertEqual('[{"Event": {"specs": [{"principal_type": "users", "sync_type": "specific", "names": "bob, tom", "post_process_existing_users": "true"}]}}]', request.data) self.assertTrue(response.getcode.called) self.assertTrue(response.read.called) pass - @patch("__builtin__.open") + @patch("builtins.open") @patch("os.path.exists") - @patch("urllib2.urlopen") + @patch("urllib.request.urlopen") @patch("ambari_server.setupSecurity.get_validated_string_input") @patch("ambari_server.setupSecurity.get_ambari_properties") @patch("ambari_server.setupSecurity.is_ldap_enabled") @@ -7691,15 +7698,15 @@ def test_ldap_sync_groups(self, logger_mock, is_root_method, is_server_runing_mo request = urlopen_mock.call_args_list[0][0][0] - self.assertEquals('[{"Event": {"specs": [{"principal_type": "groups", "sync_type": "specific", "names": "group1, group2"}]}}]', request.data) + self.assertEqual('[{"Event": {"specs": [{"principal_type": "groups", "sync_type": "specific", "names": "group1, group2"}]}}]', request.data) self.assertTrue(response.getcode.called) self.assertTrue(response.read.called) pass - @patch("__builtin__.open") + @patch("builtins.open") @patch("os.path.exists") - @patch("urllib2.urlopen") + @patch("urllib.request.urlopen") @patch("ambari_server.setupSecurity.get_validated_string_input") @patch("ambari_server.setupSecurity.get_ambari_properties") @patch("ambari_server.setupSecurity.is_ldap_enabled") @@ -7738,13 +7745,13 @@ def test_ldap_sync_groups_post_process_existing_users(self, logger_mock, is_root request = urlopen_mock.call_args_list[0][0][0] - self.assertEquals('[{"Event": {"specs": [{"post_process_existing_users": "true", "principal_type": "groups", "sync_type": "specific", "names": "group1, group2"}]}}]', request.data) + self.assertEqual('[{"Event": {"specs": [{"principal_type": "groups", "sync_type": "specific", "names": "group1, group2", "post_process_existing_users": "true"}]}}]', request.data) self.assertTrue(response.getcode.called) self.assertTrue(response.read.called) pass - @patch("urllib2.urlopen") + @patch("urllib.request.urlopen") @patch("ambari_server.setupSecurity.get_validated_string_input") @patch("ambari_server.setupSecurity.get_ambari_properties") @patch("ambari_server.setupSecurity.is_ldap_enabled") @@ -7783,13 +7790,13 @@ def test_ldap_sync_ssl(self, logger_mock, is_root_method, is_server_runing_mock, url = '{0}://{1}:{2!s}{3}'.format('https', socket.getfqdn(), '8443', '/api/v1/ldap_sync_events') request = urlopen_mock.call_args_list[0][0][0] - self.assertEquals(url, str(request.get_full_url())) + self.assertEqual(url, str(request.get_full_url())) self.assertTrue(response.getcode.called) self.assertTrue(response.read.called) pass - @patch("urllib2.urlopen") + @patch("urllib.request.urlopen") @patch("ambari_server.setupSecurity.get_validated_string_input") @patch("ambari_server.setupSecurity.get_ambari_properties") @patch("ambari_server.setupSecurity.is_ldap_enabled") @@ -7824,13 +7831,13 @@ def test_ldap_sync_existing(self, logger_mock, is_root_method, is_server_runing_ request = urlopen_mock.call_args_list[0][0][0] - self.assertEquals('[{"Event": {"specs": [{"principal_type": "users", "sync_type": "existing"}, {"principal_type": "groups", "sync_type": "existing"}]}}]', request.data) + self.assertEqual('[{"Event": {"specs": [{"principal_type": "users", "sync_type": "existing"}, {"principal_type": "groups", "sync_type": "existing"}]}}]', request.data) self.assertTrue(response.getcode.called) self.assertTrue(response.read.called) pass - @patch("urllib2.urlopen") + @patch("urllib.request.urlopen") @patch("ambari_server.setupSecurity.get_validated_string_input") @patch("ambari_server.setupSecurity.get_ambari_properties") @patch("ambari_server.setupSecurity.is_ldap_enabled") @@ -7865,13 +7872,13 @@ def test_ldap_sync_existing_post_process_existing_users(self, logger_mock, is_ro request = urlopen_mock.call_args_list[0][0][0] - self.assertEquals('[{"Event": {"specs": [{"post_process_existing_users": "true", "principal_type": "users", "sync_type": "existing"}, {"post_process_existing_users": "true", "principal_type": "groups", "sync_type": "existing"}]}}]', request.data) + self.assertEqual('[{"Event": {"specs": [{"principal_type": "users", "sync_type": "existing", "post_process_existing_users": "true"}, {"principal_type": "groups", "sync_type": "existing", "post_process_existing_users": "true"}]}}]', request.data) self.assertTrue(response.getcode.called) self.assertTrue(response.read.called) pass - @patch("urllib2.urlopen") + @patch("urllib.request.urlopen") @patch("ambari_server.setupSecurity.get_validated_string_input") @patch("ambari_server.setupSecurity.is_ldap_enabled") @patch("ambari_server.setupSecurity.is_server_runing") @@ -7906,7 +7913,7 @@ def test_ldap_sync_no_sync_mode(self, logger_mock, is_root_method, is_server_run pass pass - @patch("urllib2.urlopen") + @patch("urllib.request.urlopen") @patch("ambari_server.setupSecurity.get_validated_string_input") @patch("ambari_server.setupSecurity.is_ldap_enabled") @patch("ambari_server.setupSecurity.is_server_runing") @@ -7940,9 +7947,9 @@ def test_ldap_sync_error_status(self, logger_mock, is_root_method, is_server_run pass pass - @patch("urllib2.urlopen") - @patch("urllib2.Request") - @patch("base64.encodestring") + @patch("urllib.request.urlopen") + @patch("urllib.request") + @patch("base64.encode") @patch("ambari_server.setupSecurity.is_server_runing") @patch("ambari_server.setupSecurity.is_ldap_enabled") @patch("ambari_server.setupSecurity.get_validated_string_input") @@ -8024,7 +8031,7 @@ def test_sync_ldap_not_configured(self, logger_mock, is_ldap_enabled_mock, pass pass - @patch("__builtin__.open") + @patch("builtins.open") @patch("os.path.exists") def test_get_ldap_event_spec_names(self, os_path_exists_mock, open_mock): os_path_exists_mock.return_value = 1 @@ -8042,12 +8049,12 @@ def test_get_ldap_event_spec_names(self, os_path_exists_mock, open_mock): get_ldap_event_spec_names("groups.txt", specs, new_specs) - self.assertEquals("[{'Event': {'specs': [{'principal_type': 'groups', 'sync_type': 'specific', 'names': ' some group, another group, grp, group*'}]}}]", str(bodies)) + self.assertEqual("[{'Event': {'specs': [{'principal_type': 'groups', 'sync_type': 'specific', 'names': ' some group, another group, grp, group*'}]}}]", str(bodies)) pass @patch("ambari_server.setupSecurity.read_password") def test_configure_ldap_password(self, read_password_method): - out = StringIO.StringIO() + out = io.StringIO() sys.stdout = out read_password_method.return_value = "blah" options = self._create_empty_options_mock() @@ -8060,7 +8067,7 @@ def test_configure_ldap_password(self, read_password_method): @patch("ambari_server.userInput.get_validated_string_input") def test_read_password(self, get_validated_string_input_method): - out = StringIO.StringIO() + out = io.StringIO() sys.stdout = out passwordDefault = "" @@ -8072,21 +8079,21 @@ def test_read_password(self, get_validated_string_input_method): password = read_password(passwordDefault, passwordPattern, passwordPrompt, passwordDescr) self.assertTrue(3, get_validated_string_input_method.call_count) - self.assertEquals('aaa', password) + self.assertEqual('aaa', password) get_validated_string_input_method.reset_mock() get_validated_string_input_method.side_effect = ['aaa', 'aaa'] password = read_password(passwordDefault, passwordPattern, passwordPrompt, passwordDescr) self.assertTrue(2, get_validated_string_input_method.call_count) - self.assertEquals('aaa', password) + self.assertEqual('aaa', password) get_validated_string_input_method.reset_mock() get_validated_string_input_method.side_effect = ['aaa'] password = read_password('aaa', passwordPattern, passwordPrompt, passwordDescr) self.assertTrue(1, get_validated_string_input_method.call_count) - self.assertEquals('aaa', password) + self.assertEqual('aaa', password) sys.stdout = sys.__stdout__ pass @@ -8100,7 +8107,7 @@ def test_generate_random_string(self): self.assertTrue(str1 != str2) pass - @patch("__builtin__.open") + @patch("builtins.open") @patch("ambari_server.serverConfiguration.search_file") @patch("ambari_server.serverConfiguration.backup_file_in_temp") def test_update_properties_2(self, backup_file_in_temp_mock, search_file_mock, open_mock): @@ -8115,8 +8122,8 @@ def test_update_properties_2(self, backup_file_in_temp_mock, search_file_mock, o properties.store_ordered.assert_called_with(f.__enter__.return_value) backup_file_in_temp_mock.assert_called_with(conf_file) - self.assertEquals(2, properties.removeOldProp.call_count) - self.assertEquals(2, properties.process_pair.call_count) + self.assertEqual(2, properties.removeOldProp.call_count) + self.assertEqual(2, properties.process_pair.call_count) properties = MagicMock() backup_file_in_temp_mock.reset_mock() @@ -8275,9 +8282,9 @@ def test_check_database_name_property(self, get_ambari_version_mock, get_ambari_ @patch("ambari_server.serverSetup.extract_views") @patch("ambari_server.serverSetup.adjust_directory_permissions") @patch("sys.exit") - @patch("__builtin__.raw_input") + @patch("builtins.input") @patch("ambari_server.serverSetup.expand_jce_zip_file") - def test_ambariServerSetupWithCustomDbName(self, expand_jce_zip_file_mock, raw_input, exit_mock, adjust_dirs_mock, + def test_ambariServerSetupWithCustomDbName(self, expand_jce_zip_file_mock, input, exit_mock, adjust_dirs_mock, extract_views_mock, store_password_file_mock, get_is_secure_mock, setup_db_mock, is_root_mock, #is_local_database_mock, check_selinux_mock, check_jdbc_drivers_mock, check_ambari_user_mock, @@ -8288,7 +8295,7 @@ def test_ambariServerSetupWithCustomDbName(self, expand_jce_zip_file_mock, raw_i args = MagicMock() - raw_input.return_value = "" + input.return_value = "" get_YN_input.return_value = False verify_setup_allowed_method.return_value = 0 is_root_mock.return_value = True @@ -8502,7 +8509,7 @@ def test_change_tables_owner_no_tables(self, print_error_msg_mock, run_os_comman dbms = PGConfig(args, properties, "local") result = dbms._change_tables_owner() self.assertFalse(result) - self.assertEquals(print_error_msg_mock.call_args_list[0][0][0], 'Failed to get list of ambari tables') + self.assertEqual(print_error_msg_mock.call_args_list[0][0][0], 'Failed to get list of ambari tables') @patch("ambari_server.dbConfiguration.decrypt_password_for_alias") @patch("ambari_server.dbConfiguration_linux.run_os_command") @@ -8530,7 +8537,7 @@ def test_change_tables_owner_fatal_psql(self, print_error_msg_mock, run_os_comma dbms = PGConfig(args, properties, "local") result = dbms._change_tables_owner() self.assertFalse(result) - self.assertEquals(print_error_msg_mock.call_args_list[0][0][0], """Failed to get list of ambari tables. Message from psql: + self.assertEqual(print_error_msg_mock.call_args_list[0][0][0], """Failed to get list of ambari tables. Message from psql: stdout: stderr:psql: could not connect to server: No such file or directory """) @@ -8567,7 +8574,7 @@ def test_change_tables_owner(self, print_error_msg_mock, run_os_command_mock, dbms = PGConfig(args, properties, "local") result = dbms._change_tables_owner() self.assertTrue(result) - self.assertEquals(run_os_command_mock.call_count, 7) + self.assertEqual(run_os_command_mock.call_count, 7) @patch("os.path.isdir", new = MagicMock(return_value=True)) @patch("os.access", new = MagicMock(return_value=True)) @@ -8603,14 +8610,14 @@ def test_update_host_names(self, logger_mock, getYNInput_mock, sysExitMock, isFi update_host_names(["update-host-names", "/testFileWithChanges"], properties) - self.assertEquals(len(sysExitMock.call_args_list), 3) + self.assertEqual(len(sysExitMock.call_args_list), 3) self.assertTrue(isFileMock.called) self.assertTrue(getJavaExePathMock.called) self.assertTrue(readAmbariUserMock.called) self.assertTrue(ensureCanStartUnderCurrentUserMock.called) self.assertTrue(generateEnvMock.called) - self.assertEquals(runOSCommandMock.call_args[0][0], '/path/to/java -cp test:path12 ' + self.assertEqual(runOSCommandMock.call_args[0][0], '/path/to/java -cp test:path12 ' 'org.apache.ambari.server.update.HostUpdateHelper /testFileWithChanges > ' '/var/log/ambari-server/ambari-server.out 2>&1') @@ -8689,7 +8696,7 @@ def test_status_extra_option(self, init_logging_mock, setup_logging_mock, get_am try: _ambari_server_.mainBody() except SystemExit as e: - self.assertEquals(e.code, 2) + self.assertEqual(e.code, 2) flag = True self.assertTrue(flag) @@ -8704,19 +8711,19 @@ def test_web_server_startup_timeout(self): properties = Properties() timeout = get_web_server_startup_timeout(properties) - self.assertEquals(90, timeout) + self.assertEqual(90, timeout) properties.process_pair(WEB_SERVER_STARTUP_TIMEOUT, "") timeout = get_web_server_startup_timeout(properties) - self.assertEquals(90, timeout) + self.assertEqual(90, timeout) properties.process_pair(WEB_SERVER_STARTUP_TIMEOUT, "120") timeout = get_web_server_startup_timeout(properties) - self.assertEquals(120, timeout) + self.assertEqual(120, timeout) properties.process_pair(WEB_SERVER_STARTUP_TIMEOUT, "120 ") timeout = get_web_server_startup_timeout(properties) - self.assertEquals(120, timeout) + self.assertEqual(120, timeout) def _create_empty_options_mock(self): diff --git a/ambari-server/src/test/python/TestBootstrap.py b/ambari-server/src/test/python/TestBootstrap.py index 5fe970904be..5771ee28e40 100644 --- a/ambari-server/src/test/python/TestBootstrap.py +++ b/ambari-server/src/test/python/TestBootstrap.py @@ -19,7 +19,7 @@ from stacks.utils.RMFTestCase import * import bootstrap import time -from ambari_commons import subprocess32 +import subprocess import os import logging import tempfile @@ -28,7 +28,6 @@ from ambari_commons.os_check import OSCheck from bootstrap import PBootstrap, Bootstrap, BootstrapDefault, SharedState, HostLog, SCP, SSH from unittest import TestCase -from ambari_commons.subprocess32 import Popen from bootstrap import AMBARI_PASSPHRASE_VAR_NAME from mock.mock import MagicMock, call from mock.mock import patch @@ -50,14 +49,14 @@ def test_getRemoteName(self): utime2 = 12345 bootstrap_obj.getUtime = MagicMock(return_value=utime1) remote1 = bootstrap_obj.getRemoteName("/tmp/setupAgent.sh") - self.assertEquals(remote1, "/tmp/setupAgent{0}.sh".format(utime1)) + self.assertEqual(remote1, "/tmp/setupAgent{0}.sh".format(utime1)) bootstrap_obj.getUtime.return_value=utime2 remote1 = bootstrap_obj.getRemoteName("/tmp/setupAgent.sh") - self.assertEquals(remote1, "/tmp/setupAgent{0}.sh".format(utime1)) + self.assertEqual(remote1, "/tmp/setupAgent{0}.sh".format(utime1)) remote2 = bootstrap_obj.getRemoteName("/tmp/host_pass") - self.assertEquals(remote2, "/tmp/host_pass{0}".format(utime2)) + self.assertEqual(remote2, "/tmp/host_pass{0}".format(utime2)) # TODO: Test bootstrap timeout @@ -69,19 +68,19 @@ def test_getAmbariPort(self): "setupAgentFile", "ambariServer", "centos6", None, "8440", "root") bootstrap_obj = Bootstrap("hostname", shared_state) - self.assertEquals(bootstrap_obj.getAmbariPort(),"8440") + self.assertEqual(bootstrap_obj.getAmbariPort(),"8440") shared_state.server_port = None bootstrap_obj = Bootstrap("hostname", shared_state) - self.assertEquals(bootstrap_obj.getAmbariPort(),"null") + self.assertEqual(bootstrap_obj.getAmbariPort(),"null") - @patch.object(subprocess32, "Popen") + @patch.object(subprocess, "Popen") @patch("sys.stderr") @patch("sys.exit") @patch.object(PBootstrap, "run") @patch("os.path.dirname") @patch("os.path.realpath") - def test_bootstrap_main(self, dirname_mock, realpath_mock, run_mock, exit_mock, stderr_mock, subprocess32_Popen_mock): + def test_bootstrap_main(self, dirname_mock, realpath_mock, run_mock, exit_mock, stderr_mock, subprocess_Popen_mock): bootstrap.main(["bootstrap.py", "hostname,hostname2", "/tmp/bootstrap", "root", "123", "sshkey_file", "setupAgent.py", "ambariServer", \ "centos6", "1.1.1", "8440", "root", "passwordfile"]) self.assertTrue(run_mock.called) @@ -114,7 +113,7 @@ def test_getRunSetupWithPasswordCommand(self, environ_mock): ret = bootstrap_obj.getRunSetupWithPasswordCommand("hostname") expected = "/var/lib/ambari-agent/tmp/ambari-sudo.sh -S python /var/lib/ambari-agent/tmp/setupAgent{0}.py hostname TEST_PASSPHRASE " \ "ambariServer root 8440 < /var/lib/ambari-agent/tmp/host_pass{0}".format(utime) - self.assertEquals(ret, expected) + self.assertEqual(ret, expected) def test_generateRandomFileName(self): @@ -137,19 +136,19 @@ def test_getRepoDir(self, is_suse_family, is_redhat_family): is_redhat_family.return_value = False is_suse_family.return_value = True res = bootstrap_obj.getRepoDir() - self.assertEquals(res, "/etc/zypp/repos.d") + self.assertEqual(res, "/etc/zypp/repos.d") # non-Suse is_suse_family.return_value = False is_redhat_family.return_value = True res = bootstrap_obj.getRepoDir() - self.assertEquals(res, "/etc/yum.repos.d") + self.assertEqual(res, "/etc/yum.repos.d") def test_getSetupScript(self): shared_state = SharedState("root", "123", "sshkey_file", "scriptDir", "bootdir", "setupAgentFile", "ambariServer", "centos6", None, "8440", "root") bootstrap_obj = Bootstrap("hostname", shared_state) - self.assertEquals(bootstrap_obj.shared_state.script_dir, "scriptDir") + self.assertEqual(bootstrap_obj.shared_state.script_dir, "scriptDir") def test_run_setup_agent_command_ends_with_project_version(self): @@ -186,26 +185,26 @@ def test_host_log(self): with open(tmp_filename) as f: s = f.read() etalon = "a\nb\nc\n" - self.assertEquals(s, etalon) + self.assertEqual(s, etalon) # Next write dummy_log.write("Yet another string") # Read it with open(tmp_filename) as f: s = f.read() etalon = "a\nb\nc\nYet another string\n" - self.assertEquals(s, etalon) + self.assertEqual(s, etalon) # Should not append line end if it already exists dummy_log.write("line break->\n") # Read it with open(tmp_filename) as f: s = f.read() etalon = "a\nb\nc\nYet another string\nline break->\n" - self.assertEquals(s, etalon) + self.assertEqual(s, etalon) # Cleanup os.unlink(tmp_filename) - @patch.object(subprocess32, "Popen") + @patch.object(subprocess, "Popen") def test_SCP(self, popenMock): params = SharedState("root", "123", "sshkey_file", "scriptDir", "bootdir", "setupAgentFile", "ambariServer", "centos6", @@ -232,7 +231,7 @@ def write_side_effect(text): self.assertTrue(log_sample in log['text']) self.assertTrue(error_sample in log['text']) command_str = str(popenMock.call_args[0][0]) - self.assertEquals(command_str, "['scp', '-r', '-o', 'ConnectTimeout=60', '-o', " + self.assertEqual(command_str, "['scp', '-r', '-o', 'ConnectTimeout=60', '-o', " "'BatchMode=yes', '-o', 'StrictHostKeyChecking=no', '-P', '123', '-i', 'sshkey_file'," " 'src/file', 'root@dummy-host:dst/file']") self.assertEqual(retcode["exitstatus"], 0) @@ -248,7 +247,7 @@ def write_side_effect(text): self.assertEqual(retcode["exitstatus"], 1) - @patch.object(subprocess32, "Popen") + @patch.object(subprocess, "Popen") def test_SSH(self, popenMock): params = SharedState("root", "123", "sshkey_file", "scriptDir", "bootdir", "setupAgentFile", "ambariServer", "centos6", @@ -275,7 +274,7 @@ def write_side_effect(text): self.assertTrue(log_sample in log['text']) self.assertTrue(error_sample in log['text']) command_str = str(popenMock.call_args[0][0]) - self.assertEquals(command_str, "['ssh', '-o', 'ConnectTimeOut=60', '-o', " + self.assertEqual(command_str, "['ssh', '-o', 'ConnectTimeOut=60', '-o', " "'StrictHostKeyChecking=no', '-o', 'BatchMode=yes', '-tt', '-i', " "'sshkey_file', '-p', '123', 'root@dummy-host', 'dummy-command']") self.assertEqual(retcode["exitstatus"], 0) @@ -311,7 +310,7 @@ def test_getOsCheckScript(self): None, "8440", "root") bootstrap_obj = Bootstrap("hostname", shared_state) ocs = bootstrap_obj.getOsCheckScript() - self.assertEquals(ocs, "scriptDir/os_check_type.py") + self.assertEqual(ocs, "scriptDir/os_check_type.py") @patch.object(BootstrapDefault, "getRemoteName") @@ -323,7 +322,7 @@ def test_getOsCheckScriptRemoteLocation(self, getRemoteName_mock): v = "/tmp/os_check_type1374259902.py" getRemoteName_mock.return_value = v ocs = bootstrap_obj.getOsCheckScriptRemoteLocation() - self.assertEquals(ocs, v) + self.assertEqual(ocs, v) @patch.object(BootstrapDefault, "is_suse") @@ -334,7 +333,7 @@ def test_getRepoFile(self, is_suse_mock): bootstrap_obj = Bootstrap("hostname", shared_state) is_suse_mock.return_value = False rf = bootstrap_obj.getRepoFile() - self.assertEquals(rf, "/etc/yum.repos.d/ambari.repo") + self.assertEqual(rf, "/etc/yum.repos.d/ambari.repo") @patch.object(SSH, "__init__") @@ -350,7 +349,7 @@ def test_createTargetDir(self, write_mock, run_mock, init_mock.return_value = None run_mock.return_value = expected res = bootstrap_obj.createTargetDir() - self.assertEquals(res, expected) + self.assertEqual(res, expected) command = str(init_mock.call_args[0][4]) self.assertEqual(command, "SUDO=$([ \"$EUID\" -eq 0 ] && echo || echo sudo) ; $SUDO mkdir -p /var/lib/ambari-agent/tmp ; " @@ -376,7 +375,7 @@ def test_copyOsCheckScript(self, write_mock, run_mock, init_mock, init_mock.return_value = None run_mock.return_value = expected res = bootstrap_obj.copyOsCheckScript() - self.assertEquals(res, expected) + self.assertEqual(res, expected) input_file = str(init_mock.call_args[0][4]) remote_file = str(init_mock.call_args[0][5]) self.assertEqual(input_file, "OsCheckScript") @@ -400,12 +399,12 @@ def test_getRepoFile(self, is_redhat_family, is_ubuntu_family, is_suse_family, h hasPassword_mock.return_value = False getRemoteName_mock.return_value = "RemoteName" rf = bootstrap_obj.getMoveRepoFileCommand("target") - self.assertEquals(rf, "/var/lib/ambari-agent/tmp/ambari-sudo.sh mv RemoteName target/ambari.repo") + self.assertEqual(rf, "/var/lib/ambari-agent/tmp/ambari-sudo.sh mv RemoteName target/ambari.repo") # With password hasPassword_mock.return_value = True getRemoteName_mock.return_value = "RemoteName" rf = bootstrap_obj.getMoveRepoFileCommand("target") - self.assertEquals(rf, "/var/lib/ambari-agent/tmp/ambari-sudo.sh -S mv RemoteName target/ambari.repo < RemoteName") + self.assertEqual(rf, "/var/lib/ambari-agent/tmp/ambari-sudo.sh -S mv RemoteName target/ambari.repo < RemoteName") @patch("os.path.exists") @patch.object(OSCheck, "is_suse_family") @@ -458,7 +457,7 @@ def os_path_exists_side_effect(*args, **kwargs): scp_run_mock.side_effect = [expected1, expected3] ssh_run_mock.side_effect = [expected2, expected4] res = bootstrap_obj.copyNeededFiles() - self.assertEquals(res, expected1["exitstatus"]) + self.assertEqual(res, expected1["exitstatus"]) input_file = str(scp_init_mock.call_args[0][4]) remote_file = str(scp_init_mock.call_args[0][5]) self.assertEqual(input_file, "setupAgentFile") @@ -473,7 +472,7 @@ def os_path_exists_side_effect(*args, **kwargs): scp_run_mock.side_effect = [expected1, expected3] ssh_run_mock.side_effect = [expected2, expected4] res = bootstrap_obj.copyNeededFiles() - self.assertEquals(res, expected2["exitstatus"]) + self.assertEqual(res, expected2["exitstatus"]) # yet another order expected1 = {"exitstatus": 33, "log": "log33", "errormsg": "errorMsg"} expected2 = {"exitstatus": 17, "log": "log17", "errormsg": "errorMsg"} @@ -482,7 +481,7 @@ def os_path_exists_side_effect(*args, **kwargs): scp_run_mock.side_effect = [expected1, expected3] ssh_run_mock.side_effect = [expected2, expected4] res = bootstrap_obj.copyNeededFiles() - self.assertEquals(res, expected3["exitstatus"]) + self.assertEqual(res, expected3["exitstatus"]) # #Ambari repo file does not exist @@ -499,7 +498,7 @@ def os_path_exists_side_effect(*args, **kwargs): scp_run_mock.side_effect = [expectedResult] res = bootstrap_obj.copyNeededFiles() self.assertFalse(ssh_run_mock.called) - self.assertEquals(res, expectedResult["exitstatus"]) + self.assertEqual(res, expectedResult["exitstatus"]) @patch.object(BootstrapDefault, "getOsCheckScriptRemoteLocation") @patch.object(SSH, "__init__") @@ -516,7 +515,7 @@ def test_runOsCheckScript(self, write_mock, run_mock, init_mock.return_value = None run_mock.return_value = expected res = bootstrap_obj.runOsCheckScript() - self.assertEquals(res, expected) + self.assertEqual(res, expected) command = str(init_mock.call_args[0][4]) self.assertEqual(command, "chmod a+x OsCheckScriptRemoteLocation && " @@ -538,7 +537,7 @@ def test_runSetupAgent(self, write_mock, run_mock, init_mock.return_value = None run_mock.return_value = expected res = bootstrap_obj.runSetupAgent() - self.assertEquals(res, expected) + self.assertEqual(res, expected) command = str(init_mock.call_args[0][4]) self.assertEqual(command, "RunSetupCommand") @@ -598,7 +597,7 @@ def test_checkSudoPackage(self, write_mock, run_mock, init_mock, is_redhat_famil is_ubuntu_family.return_value = False is_suse_family.return_value = False res = bootstrap_obj.checkSudoPackage() - self.assertEquals(res, expected) + self.assertEqual(res, expected) command = str(init_mock.call_args[0][4]) self.assertEqual(command, "[ \"$EUID\" -eq 0 ] || rpm -qa | grep -e '^sudo\-'") @@ -621,7 +620,7 @@ def test_checkSudoPackageUbuntu(self, write_mock, run_mock, init_mock, init_mock.return_value = None run_mock.return_value = expected res = bootstrap_obj.checkSudoPackage() - self.assertEquals(res, expected) + self.assertEqual(res, expected) command = str(init_mock.call_args[0][4]) self.assertEqual(command, "[ \"$EUID\" -eq 0 ] || dpkg --get-selections|grep -e '^sudo\s*install'") @@ -641,7 +640,7 @@ def test_deletePasswordFile(self, getPasswordFile_mock, write_mock, run_mock, init_mock.return_value = None run_mock.return_value = expected res = bootstrap_obj.deletePasswordFile() - self.assertEquals(res, expected) + self.assertEqual(res, expected) command = str(init_mock.call_args[0][4]) self.assertEqual(command, "rm PasswordFile") @@ -668,7 +667,7 @@ def test_copyPasswordFile(self, write_mock, ssh_run_mock, ssh_init_mock.return_value = None ssh_run_mock.return_value = expected2 res = bootstrap_obj.copyPasswordFile() - self.assertEquals(res, expected1["exitstatus"]) + self.assertEqual(res, expected1["exitstatus"]) input_file = str(scp_init_mock.call_args[0][4]) remote_file = str(scp_init_mock.call_args[0][4]) self.assertEqual(input_file, "PasswordFile") @@ -697,7 +696,7 @@ def test_changePasswordFileModeOnHost(self, getPasswordFile_mock, write_mock, init_mock.return_value = None run_mock.return_value = expected res = bootstrap_obj.changePasswordFileModeOnHost() - self.assertEquals(res, expected) + self.assertEqual(res, expected) command = str(init_mock.call_args[0][4]) self.assertEqual(command, "chmod 600 PasswordFile") @@ -865,9 +864,9 @@ def fake_start_time_generator(): def status_get_item_mock(item): if item == "return_code": - return return_code_generator.next() + return next(return_code_generator) elif item == "start_time": - return start_time_generator.next() + return next(start_time_generator) dict_mock = MagicMock() dict_mock.__getitem__.side_effect = status_get_item_mock diff --git a/ambari-server/src/test/python/TestClusterBlueprint.py b/ambari-server/src/test/python/TestClusterBlueprint.py index 281c87f0ec7..86f429061a2 100644 --- a/ambari-server/src/test/python/TestClusterBlueprint.py +++ b/ambari-server/src/test/python/TestClusterBlueprint.py @@ -54,7 +54,7 @@ def test_importBlueprint(self, get_server_info_mock, performPostOperationMock): pass - @patch("__builtin__.open") + @patch("builtins.open") @patch.object(AmbariBlueprint, "performGetOperation") @patch.object(cluster_blueprint, "get_server_info") def test_exportBlueprint(self, get_server_info_mock, diff --git a/ambari-server/src/test/python/TestConfigs.py b/ambari-server/src/test/python/TestConfigs.py index 6d2ab34d260..fd31890113b 100644 --- a/ambari-server/src/test/python/TestConfigs.py +++ b/ambari-server/src/test/python/TestConfigs.py @@ -16,13 +16,14 @@ limitations under the License. ''' -import StringIO +import io import imp import os import sys import json from mock.mock import patch, MagicMock from unittest import TestCase +import urllib.request, urllib.parse, urllib.error def get_configs(): test_directory = os.path.dirname(os.path.abspath(__file__)) @@ -34,7 +35,7 @@ def get_configs(): class TestConfigs(TestCase): def setUp(self): - out = StringIO.StringIO() + out = io.StringIO() sys.stdout = out def tearDown(self): @@ -53,13 +54,13 @@ def urlopen_side_effect(request): response.read.side_effect = [response_data] request_check = req_type.get('request_assertion', None) if request_check is not None: - request_body = json.loads(request.get_data()) + request_body = json.loads(json.loads(request.data)) request_check.get(request_url, lambda x: None)(request_body) return response return urlopen_side_effect @patch.object(configs, 'output_to_file') - @patch('urllib2.urlopen') + @patch('urllib.request.urlopen') def test_get_config_to_file(self, urlopen_method, to_file_method): response_mapping = { 'GET': { @@ -70,14 +71,14 @@ def test_get_config_to_file(self, urlopen_method, to_file_method): } } def config_assertion(config): - self.assertEquals(config['properties'], {'config1': 'value1', 'config2': 'value2'}) + self.assertEqual(config['properties'], {'config1': 'value1', 'config2': 'value2'}) urlopen_method.side_effect = self.get_url_open_side_effect(response_mapping) to_file_method.return_value = config_assertion sys.argv = ['configs.py', '-u', 'user', '-p', 'password', '-t', '8081', '-s', 'http', '-a', 'get', '-l','localhost','-n', 'cluster1', '-c','hdfs-site'] configs.main() @patch.object(configs, 'output_to_file') - @patch('urllib2.urlopen') + @patch('urllib.request.urlopen') def test_update_specific_config(self, urlopen_method, to_file_method): response_mapping = { 'GET': { @@ -89,7 +90,7 @@ def test_update_specific_config(self, urlopen_method, to_file_method): 'PUT': { 'request_assertion': { 'https://localhost:8081/api/v1/clusters/cluster1': - lambda request_body: self.assertEquals(request_body['Clusters']['desired_configs']['properties'], {"config1": "value3", "config2": "value2"}) + lambda request_body: self.assertEqual(request_body['Clusters']['desired_configs']['properties'], {"config1": "value3", "config2": "value2"}) } } } @@ -98,7 +99,7 @@ def test_update_specific_config(self, urlopen_method, to_file_method): configs.main() @patch.object(configs, 'output_to_file') - @patch('urllib2.urlopen') + @patch('urllib.request.urlopen') def test_update_from_file(self, urlopen_method, to_file_method): response_mapping = { 'GET': { @@ -110,7 +111,7 @@ def test_update_from_file(self, urlopen_method, to_file_method): 'PUT': { 'request_assertion': { 'https://localhost:8081/api/v1/clusters/cluster1': - lambda request_body: self.assertEquals(request_body['Clusters']['desired_configs']['properties'], {"config1": "value3", "config2": "value2"}) + lambda request_body: self.assertEqual(request_body['Clusters']['desired_configs']['properties'], {"config1": "value3", "config2": "value2"}) } } } @@ -119,11 +120,11 @@ def test_update_from_file(self, urlopen_method, to_file_method): configs.main() @patch.object(configs, 'output_to_file') - @patch('urllib2.urlopen') + @patch('urllib.request.urlopen') def test_update_specific_config_with_attributes(self, urlopen_method, to_file_method): def update_check(request_body): - self.assertEquals(request_body['Clusters']['desired_configs']['properties'], {"config1": "value4", "config2": "value2", "config3": "value3"}) - self.assertEquals(request_body['Clusters']['desired_configs']['properties_attributes'], {"final":{"config1": "true", "config3": "true"}}) + self.assertEqual(request_body['Clusters']['desired_configs']['properties'], {"config1": "value4", "config2": "value2", "config3": "value3"}) + self.assertEqual(request_body['Clusters']['desired_configs']['properties_attributes'], {"final":{"config1": "true", "config3": "true"}}) response_mapping = { 'GET': { 'body': { @@ -142,7 +143,7 @@ def update_check(request_body): configs.main() @patch.object(configs, 'output_to_file') - @patch('urllib2.urlopen') + @patch('urllib.request.urlopen') def test_delete_config(self, urlopen_method, to_file_method): response_mapping = { 'GET': { @@ -154,7 +155,7 @@ def test_delete_config(self, urlopen_method, to_file_method): 'PUT': { 'request_assertion': { 'https://localhost:8081/api/v1/clusters/cluster1': - lambda request_body: self.assertEquals(request_body['Clusters']['desired_configs']['properties'], {"config2": "value2"}) + lambda request_body: self.assertEqual(request_body['Clusters']['desired_configs']['properties'], {"config2": "value2"}) } } } @@ -164,11 +165,11 @@ def test_delete_config(self, urlopen_method, to_file_method): configs.main() @patch.object(configs, 'output_to_file') - @patch('urllib2.urlopen') + @patch('urllib.request.urlopen') def test_delete_config_with_attributes(self, urlopen_method, to_file_method): def delete_check(request_body): - self.assertEquals(request_body['Clusters']['desired_configs']['properties'], {"config2": "value2", "config3": "value3"}) - self.assertEquals(request_body['Clusters']['desired_configs']['properties_attributes'], {"final":{"config3": "true"}}) + self.assertEqual(request_body['Clusters']['desired_configs']['properties'], {"config2": "value2", "config3": "value3"}) + self.assertEqual(request_body['Clusters']['desired_configs']['properties_attributes'], {"final":{"config3": "true"}}) response_mapping = { 'GET': { 'body': { @@ -187,7 +188,7 @@ def delete_check(request_body): configs.main() @patch.object(configs, 'output_to_file') - @patch('urllib2.urlopen') + @patch('urllib.request.urlopen') def test_set_properties_from_xml(self, urlopen_method, to_file_method): response_mapping = { 'GET': { @@ -199,7 +200,7 @@ def test_set_properties_from_xml(self, urlopen_method, to_file_method): 'PUT': { 'request_assertion': { 'https://localhost:8081/api/v1/clusters/cluster1': - lambda request_body: self.assertEquals(request_body['Clusters']['desired_configs']['properties'], {"config1": "value1", "config2": "value2"}) + lambda request_body: self.assertEqual(request_body['Clusters']['desired_configs']['properties'], {"config1": "value1", "config2": "value2"}) } } } diff --git a/ambari-server/src/test/python/TestExecutionCommand.py b/ambari-server/src/test/python/TestExecutionCommand.py index b7c52e55cd2..bd3fef4c98f 100644 --- a/ambari-server/src/test/python/TestExecutionCommand.py +++ b/ambari-server/src/test/python/TestExecutionCommand.py @@ -43,7 +43,7 @@ def setUp(self): def test_get_module_name(self): module_name = self.__execution_command.get_module_name() - self.assertEquals(module_name, "HDFS") + self.assertEqual(module_name, "HDFS") # TODO : Check if this will be part of _hosts info in clusterHostInfo. ''' @@ -62,23 +62,23 @@ def test_get_java_version(self): def test_get_module_configs(self): module_configs = self.__execution_command.get_module_configs() - self.assertNotEquals(module_configs, None) + self.assertNotEqual(module_configs, None) zookeeper_client_port = module_configs.get_property_value("zookeeper", "zoo.cfg", "clientPort") - self.assertEquals(int(zookeeper_client_port), 2181) + self.assertEqual(int(zookeeper_client_port), 2181) zookeeper_client_port_fake = module_configs.get_property_value("zookeeper", "zoo.cfg", "clientPort1") - self.assertEquals(zookeeper_client_port_fake, None) + self.assertEqual(zookeeper_client_port_fake, None) zookeeper_client_port_default_value = module_configs.get_property_value("zookeeper", "zoo.cfg", "clientPort1", 1111) - self.assertEquals(int(zookeeper_client_port_default_value), 1111) + self.assertEqual(int(zookeeper_client_port_default_value), 1111) zookeeper_empty_value = module_configs.get_all_properties("zookeeper", "zoo_fake") - self.assertEquals(zookeeper_empty_value, {}) + self.assertEqual(zookeeper_empty_value, {}) zookeeper_log_max_backup_size = module_configs.get_property_value('zookeeper', 'zookeeper-log4j', 'zookeeper_log_max_backup_size', 10) - self.assertEquals(zookeeper_log_max_backup_size, u'10') + self.assertEqual(zookeeper_log_max_backup_size, '10') properties = module_configs.get_properties("zookeeper", "zoo.cfg", ['clientPort', 'dataDir', 'fake']) self.assertEqual(int(properties.get('clientPort')), 2181) @@ -114,7 +114,7 @@ def test_access_to_stack_settings(self): stack_settings = self.__execution_command.get_stack_settings() stack_name = stack_settings.get_mpack_name() - self.assertEquals(stack_name, "HDP") + self.assertEqual(stack_name, "HDP") stack_features = stack_settings.get_stack_features() self.assertTrue("snappy" in stack_features) @@ -183,7 +183,7 @@ def test_access_to_execution_command(self): self.assertEqual(cluster_name, "c1") repo_file = exec_cmd.get_repository_file() - expected = {u'resolved': True, u'repoVersion': u'3.0.1.0-187', u'repositories': [{u'mirrorsList': None, u'tags': [], u'ambariManaged': True, u'baseUrl': u'http://s3.amazonaws.com/dev.hortonworks.com/HDP/centos7/3.x/BUILDS/3.0.1.0-187', u'repoName': u'HDP', u'components': None, u'distribution': None, u'repoId': u'HDP-3.0-repo-1', u'applicableServices': []}, {u'mirrorsList': None, u'tags': [u'GPL'], u'ambariManaged': True, u'baseUrl': u'http://s3.amazonaws.com/dev.hortonworks.com/HDP-GPL/centos7/3.x/BUILDS/3.0.1.0-187', u'repoName': u'HDP-GPL', u'components': None, u'distribution': None, u'repoId': u'HDP-3.0-GPL-repo-1', u'applicableServices': []}, {u'mirrorsList': None, u'tags': [], u'ambariManaged': True, u'baseUrl': u'http://s3.amazonaws.com/dev.hortonworks.com/HDP-UTILS-1.1.0.22/repos/centos7', u'repoName': u'HDP-UTILS', u'components': None, u'distribution': None, u'repoId': u'HDP-UTILS-1.1.0.22-repo-1', u'applicableServices': []}], u'feature': {u'preInstalled': False, u'scoped': True}, u'stackName': u'HDP', u'repoVersionId': 1, u'repoFileName': u'ambari-hdp-1'} + expected = {'resolved': True, 'repoVersion': '3.0.1.0-187', 'repositories': [{'mirrorsList': None, 'tags': [], 'ambariManaged': True, 'baseUrl': 'http://s3.amazonaws.com/dev.hortonworks.com/HDP/centos7/3.x/BUILDS/3.0.1.0-187', 'repoName': 'HDP', 'components': None, 'distribution': None, 'repoId': 'HDP-3.0-repo-1', 'applicableServices': []}, {'mirrorsList': None, 'tags': ['GPL'], 'ambariManaged': True, 'baseUrl': 'http://s3.amazonaws.com/dev.hortonworks.com/HDP-GPL/centos7/3.x/BUILDS/3.0.1.0-187', 'repoName': 'HDP-GPL', 'components': None, 'distribution': None, 'repoId': 'HDP-3.0-GPL-repo-1', 'applicableServices': []}, {'mirrorsList': None, 'tags': [], 'ambariManaged': True, 'baseUrl': 'http://s3.amazonaws.com/dev.hortonworks.com/HDP-UTILS-1.1.0.22/repos/centos7', 'repoName': 'HDP-UTILS', 'components': None, 'distribution': None, 'repoId': 'HDP-UTILS-1.1.0.22-repo-1', 'applicableServices': []}], 'feature': {'preInstalled': False, 'scoped': True}, 'stackName': 'HDP', 'repoVersionId': 1, 'repoFileName': 'ambari-hdp-1'} self.assertDictEqual(expected, repo_file) local_components = exec_cmd.get_local_components() @@ -242,12 +242,12 @@ def test_access_to_execution_command(self): self.assertEqual(mpack_version, '3.0') user_groups = exec_cmd.get_user_groups() - self.assertEqual(user_groups, u'{"zookeeper":["hadoop"],"ambari-qa":["hadoop","users"],"hdfs":["hdfs","hadoop"]}') + self.assertEqual(user_groups, '{"zookeeper":["hadoop"],"ambari-qa":["hadoop","users"],"hdfs":["hdfs","hadoop"]}') group_list = exec_cmd.get_group_list() - self.assertEqual(group_list, u'["hdfs","hadoop","users"]') + self.assertEqual(group_list, '["hdfs","hadoop","users"]') user_list = exec_cmd.get_user_list() - self.assertEqual(user_list, u'["zookeeper","ambari-qa","hdfs"]') + self.assertEqual(user_list, '["zookeeper","ambari-qa","hdfs"]') host_name = exec_cmd.get_host_name() self.assertEqual(host_name, 'host-1.openstacklocal') diff --git a/ambari-server/src/test/python/TestMpacks.py b/ambari-server/src/test/python/TestMpacks.py index 6001af626c6..ceb27e99672 100644 --- a/ambari-server/src/test/python/TestMpacks.py +++ b/ambari-server/src/test/python/TestMpacks.py @@ -15,11 +15,14 @@ See the License for the specific language governing permissions and limitations under the License. ''' +import logging import os import platform +import distro from mock.mock import patch, MagicMock, call from unittest import TestCase from ambari_commons.exceptions import FatalException +import importlib os.environ["ROOT"] = "" @@ -33,17 +36,17 @@ # We have to use this import HACK because the filename contains a dash _search_file = os_utils.search_file os_utils.search_file = MagicMock(return_value="/tmp/ambari.properties") -with patch.object(platform, "linux_distribution", return_value = MagicMock(return_value=('Redhat', '6.4', 'Final'))): +with patch.object(distro, "linux_distribution", return_value = MagicMock(return_value=('Redhat', '6.4', 'Final'))): with patch("os.path.isdir", return_value = MagicMock(return_value=True)): with patch("os.access", return_value = MagicMock(return_value=True)): with patch.object(os_utils, "parse_log4j_file", return_value={'ambari.log.dir': '/var/log/ambari-server'}): - with patch("platform.linux_distribution", return_value = os_distro_value): + with patch("distro.linux_distribution", return_value = os_distro_value): with patch("os.symlink"): with patch.object(os_utils, "is_service_exist", return_value = True): with patch("glob.glob", return_value = ['/etc/init.d/postgresql-9.3']): _ambari_server_ = __import__('ambari-server') os_utils.search_file = _search_file - with patch("__builtin__.open"): + with patch("builtins.open"): from ambari_commons.exceptions import FatalException, NonFatalException from ambari_server import serverConfiguration serverConfiguration.search_file = _search_file @@ -56,7 +59,7 @@ with patch.object(os, "geteuid", new=MagicMock(return_value=0)): from resource_management.core import sudo - reload(sudo) + importlib.reload(sudo) def get_configs(): test_directory = os.path.dirname(os.path.abspath(__file__)) @@ -83,7 +86,7 @@ def test_install_mpack_with_no_mpack_path(self): try: install_mpack(options) except FatalException as e: - self.assertEquals("Management pack not specified!", e.reason) + self.assertEqual("Management pack not specified!", e.reason) fail = True self.assertTrue(fail) @@ -97,7 +100,7 @@ def test_install_mpack_with_invalid_mpack_path(self, download_mpack_mock): try: install_mpack(options) except FatalException as e: - self.assertEquals("Management pack could not be downloaded!", e.reason) + self.assertEqual("Management pack could not be downloaded!", e.reason) fail = True self.assertTrue(fail) @@ -232,7 +235,7 @@ def test_install_mpack_with_malformed_mpack(self, get_ambari_properties_mock, do try: install_mpack(options) except FatalException as e: - self.assertEquals("Malformed management pack. Root directory missing!", e.reason) + self.assertEqual("Malformed management pack. Root directory missing!", e.reason) fail = True self.assertTrue(fail) @@ -243,7 +246,7 @@ def test_install_mpack_with_malformed_mpack(self, get_ambari_properties_mock, do try: install_mpack(options) except FatalException as e: - self.assertEquals("Malformed management pack. Failed to expand management pack!", e.reason) + self.assertEqual("Malformed management pack. Failed to expand management pack!", e.reason) fail = True self.assertTrue(fail) @@ -254,7 +257,7 @@ def test_install_mpack_with_malformed_mpack(self, get_ambari_properties_mock, do try: install_mpack(options) except FatalException as e: - self.assertEquals("Malformed management pack {0}. Metadata file missing!".format(options.mpack_path), e.reason) + self.assertEqual("Malformed management pack {0}. Metadata file missing!".format(options.mpack_path), e.reason) fail = True self.assertTrue(fail) @@ -326,7 +329,7 @@ def test_install_stack_mpack(self, set_file_permissions_mock, validate_purge_moc try: install_mpack(options) except Exception as e: - print e + print(e) stacks_directory = configs[serverConfiguration.STACK_LOCATION_KEY] common_services_directory = configs[serverConfiguration.COMMON_SERVICES_PATH_PROPERTY] @@ -420,7 +423,6 @@ def test_install_stack_mpack(self, set_file_permissions_mock, validate_purge_moc @patch("ambari_server.setupMpacks.expand_mpack") @patch("ambari_server.setupMpacks.download_mpack") @patch("ambari_server.setupMpacks.set_file_permissions") - def test_install_extension_mpack(self, set_file_permissions_mock, download_mpack_mock, expand_mpack_mock, add_replay_log_mock, purge_stacks_and_mpacks_mock, get_ambari_properties_mock, get_ambari_version_mock, create_symlink_mock, read_ambari_user_mock, os_mkdir_mock, shutil_move_mock, os_path_exists_mock): @@ -430,7 +432,7 @@ def test_install_extension_mpack(self, set_file_permissions_mock, download_mpack download_mpack_mock.return_value = "/tmp/myextension.tar.gz" expand_mpack_mock.return_value = "mpacks/myextension-ambari-mpack-1.0.0.0" get_ambari_version_mock.return_value = "2.4.0.0" - + os_path_exists_mock.side_effect = [True, True, True, True, False, True, False, False, False, False, True, True, False, False, False] get_ambari_properties_mock.return_value = configs @@ -590,7 +592,6 @@ def test_install_addon_service_mpack(self, set_file_permissions_mock, download_m @patch("ambari_server.setupMpacks.download_mpack") @patch("ambari_server.setupMpacks.run_os_command") @patch("ambari_server.setupMpacks.set_file_permissions") - def test_upgrade_stack_mpack(self, set_file_permissions_mock, run_os_command_mock, download_mpack_mock, expand_mpack_mock, purge_stacks_and_mpacks_mock, _uninstall_mpack_mock, add_replay_log_mock, get_ambari_properties_mock, get_ambari_version_mock, create_symlink_mock, read_ambari_user_mock, os_mkdir_mock, shutil_move_mock, @@ -771,7 +772,7 @@ def test_upgrade_stack_mpack(self, set_file_permissions_mock, run_os_command_moc run_os_command_mock.assert_has_calls(run_os_command_calls) os_mkdir_mock.assert_has_calls(os_mkdir_calls) create_symlink_mock.assert_has_calls(create_symlink_calls) - self.assertEqual(18, create_symlink_mock.call_count) + self.assertEqual(18, create_symlink_mock.call_count) create_symlink_using_path_mock.assert_has_calls(create_symlink_using_path_calls) self.assertEqual(1, create_symlink_using_path_mock.call_count) _uninstall_mpack_mock.assert_has_calls([call("mystack-ambari-mpack", "1.0.0.0")]) diff --git a/ambari-server/src/test/python/TestOSCheck.py b/ambari-server/src/test/python/TestOSCheck.py index e91ad995831..c2327809b84 100644 --- a/ambari-server/src/test/python/TestOSCheck.py +++ b/ambari-server/src/test/python/TestOSCheck.py @@ -18,6 +18,7 @@ limitations under the License. ''' +import distro import platform import datetime import os @@ -46,7 +47,7 @@ with patch("os.path.isdir", return_value = MagicMock(return_value=True)): with patch("os.access", return_value = MagicMock(return_value=True)): with patch.object(os_utils, "parse_log4j_file", return_value={'ambari.log.dir': '/var/log/ambari-server'}): - with patch("platform.linux_distribution", return_value = os_distro_value_linux): + with patch("distro.linux_distribution", return_value = os_distro_value_linux): with patch.object(OSCheck, "os_distribution", return_value = os_distro_value): with patch.object(os_utils, "is_service_exist", return_value = True): with patch.object(utils, "get_postgre_hba_dir"): @@ -55,7 +56,7 @@ from ambari_server.serverConfiguration import update_ambari_properties, configDefaults -@patch.object(platform, "linux_distribution", new = MagicMock(return_value=('Redhat', '6.4', 'Final'))) +@patch.object(distro, "linux_distribution", new = MagicMock(return_value=('Redhat', '6.4', 'Final'))) class TestOSCheck(TestCase): @patch.object(OSCheck, "os_distribution") @patch("ambari_commons.os_check._is_oracle_linux") @@ -65,7 +66,7 @@ def test_get_os_type(self, mock_is_oracle_linux, mock_linux_distribution): mock_is_oracle_linux.return_value = False mock_linux_distribution.return_value = ('my_os', '2015.09', '') result = OSCheck.get_os_type() - self.assertEquals(result, 'my_os') + self.assertEqual(result, 'my_os') # 2 - Negative case mock_linux_distribution.return_value = ('', 'aaaa', 'bbbbb') @@ -74,37 +75,37 @@ def test_get_os_type(self, mock_is_oracle_linux, mock_linux_distribution): self.fail("Should throw exception in OSCheck.get_os_type()") except Exception as e: # Expected - self.assertEquals("Cannot detect os type. Exiting...", str(e)) + self.assertEqual("Cannot detect os type. Exiting...", str(e)) pass # 3 - path exist: '/etc/oracle-release' mock_is_oracle_linux.return_value = True mock_linux_distribution.return_value = ('some_os', '1234', '') result = OSCheck.get_os_type() - self.assertEquals(result, 'oraclelinux') + self.assertEqual(result, 'oraclelinux') # 4 - Common system mock_is_oracle_linux.return_value = False mock_linux_distribution.return_value = ('CenToS', '4.56', '') result = OSCheck.get_os_type() - self.assertEquals(result, 'centos') + self.assertEqual(result, 'centos') # 5 - Red Hat Enterprise Linux mock_is_oracle_linux.return_value = False # Red Hat Enterprise Linux Server release 6.5 (Santiago) mock_linux_distribution.return_value = ('Red Hat Enterprise Linux Server', '6.5', 'Santiago') result = OSCheck.get_os_type() - self.assertEquals(result, 'redhat') + self.assertEqual(result, 'redhat') # Red Hat Enterprise Linux Workstation release 6.4 (Santiago) mock_linux_distribution.return_value = ('Red Hat Enterprise Linux Workstation', '6.4', 'Santiago') result = OSCheck.get_os_type() - self.assertEquals(result, 'redhat') + self.assertEqual(result, 'redhat') # Red Hat Enterprise Linux AS release 4 (Nahant Update 3) mock_linux_distribution.return_value = ('Red Hat Enterprise Linux AS', '4', 'Nahant Update 3') result = OSCheck.get_os_type() - self.assertEquals(result, 'redhat') + self.assertEqual(result, 'redhat') @patch.object(OSCheck, "os_distribution") @patch("os.path.exists") @@ -114,31 +115,31 @@ def test_get_os_family(self, mock_exists, mock_linux_distribution): mock_exists.return_value = False mock_linux_distribution.return_value = ('MY_os', '5.6.7', '') result = OSCheck.get_os_family() - self.assertEquals(result, 'my_os') + self.assertEqual(result, 'my_os') # 2 - Redhat mock_exists.return_value = False mock_linux_distribution.return_value = ('Centos Linux', '2.4', '') result = OSCheck.get_os_family() - self.assertEquals(result, 'redhat') + self.assertEqual(result, 'redhat') # 3 - Ubuntu mock_exists.return_value = False mock_linux_distribution.return_value = ('Ubuntu', '14.04', '') result = OSCheck.get_os_family() - self.assertEquals(result, 'ubuntu') + self.assertEqual(result, 'ubuntu') # 4 - Suse mock_exists.return_value = False mock_linux_distribution.return_value = ( 'suse linux enterprise server', '11.3', '') result = OSCheck.get_os_family() - self.assertEquals(result, 'suse') + self.assertEqual(result, 'suse') mock_exists.return_value = False mock_linux_distribution.return_value = ('SLED', '1.2.3.4.5', '') result = OSCheck.get_os_family() - self.assertEquals(result, 'suse') + self.assertEqual(result, 'suse') # 5 - Negative case mock_linux_distribution.return_value = ('', '111', '2222') @@ -147,7 +148,7 @@ def test_get_os_family(self, mock_exists, mock_linux_distribution): self.fail("Should throw exception in OSCheck.get_os_family()") except Exception as e: # Expected - self.assertEquals("Cannot detect os type. Exiting...", str(e)) + self.assertEqual("Cannot detect os type. Exiting...", str(e)) pass @patch.object(OSCheck, "os_distribution") @@ -156,7 +157,7 @@ def test_get_os_version(self, mock_linux_distribution): # 1 - Any system mock_linux_distribution.return_value = ('some_os', '123.45', '') result = OSCheck.get_os_version() - self.assertEquals(result, '123.45') + self.assertEqual(result, '123.45') # 2 - Negative case mock_linux_distribution.return_value = ('ssss', '', 'ddddd') @@ -165,7 +166,7 @@ def test_get_os_version(self, mock_linux_distribution): self.fail("Should throw exception in OSCheck.get_os_version()") except Exception as e: # Expected - self.assertEquals("Cannot detect os version. Exiting...", str(e)) + self.assertEqual("Cannot detect os version. Exiting...", str(e)) pass @patch.object(OSCheck, "os_distribution") @@ -174,12 +175,12 @@ def test_get_os_major_version(self, mock_linux_distribution): # 1 mock_linux_distribution.return_value = ('abcd_os', '123.45.67', '') result = OSCheck.get_os_major_version() - self.assertEquals(result, '123') + self.assertEqual(result, '123') # 2 mock_linux_distribution.return_value = ('Suse', '11', '') result = OSCheck.get_os_major_version() - self.assertEquals(result, '11') + self.assertEqual(result, '11') @patch.object(OSCheck, "os_distribution") def test_aliases(self, mock_linux_distribution): @@ -191,10 +192,10 @@ def test_aliases(self, mock_linux_distribution): mock_linux_distribution.return_value = ('qwerty_os', '123.45.67', '') - self.assertEquals(OSCheck.get_os_type(), 'aliased_os') - self.assertEquals(OSCheck.get_os_major_version(), '5') - self.assertEquals(OSCheck.get_os_version(), '5.45.67') - self.assertEquals(OSCheck.get_os_family(), 'aliased_os_family') + self.assertEqual(OSCheck.get_os_type(), 'aliased_os') + self.assertEqual(OSCheck.get_os_major_version(), '5') + self.assertEqual(OSCheck.get_os_version(), '5.45.67') + self.assertEqual(OSCheck.get_os_family(), 'aliased_os_family') @patch.object(OSCheck, "os_distribution") def test_get_os_release_name(self, mock_linux_distribution): @@ -202,7 +203,7 @@ def test_get_os_release_name(self, mock_linux_distribution): # 1 - Any system mock_linux_distribution.return_value = ('', '', 'MY_NEW_RELEASE') result = OSCheck.get_os_release_name() - self.assertEquals(result, 'my_new_release') + self.assertEqual(result, 'my_new_release') # 2 - Negative case mock_linux_distribution.return_value = ('aaaa', 'bbbb', '') @@ -211,7 +212,7 @@ def test_get_os_release_name(self, mock_linux_distribution): self.fail("Should throw exception in OSCheck.get_os_release_name()") except Exception as e: # Expected - self.assertEquals("Cannot detect os release name. Exiting...", str(e)) + self.assertEqual("Cannot detect os release name. Exiting...", str(e)) pass @patch("ambari_server.serverConfiguration.get_conf_dir") @@ -262,10 +263,10 @@ def _test_update_ambari_properties_os(self, get_conf_dir_mock): else: pass - self.assertEquals(count, 9) + self.assertEqual(count, 9) # Command should not fail if *.rpmsave file is missing result = update_ambari_properties() - self.assertEquals(result, 0) + self.assertEqual(result, 0) pass @patch.object(OSCheck, "os_distribution") @@ -280,7 +281,7 @@ def test_os_type_check(self, mock_linux_distribution): os_check_type.main() except SystemExit as e: # exit_code=0 - self.assertEquals("0", str(e)) + self.assertEqual("0", str(e)) # 2 - server and agent os is not compatible mock_linux_distribution.return_value = ('ddd', '33', 'bb') @@ -291,7 +292,7 @@ def test_os_type_check(self, mock_linux_distribution): os_check_type.main() self.fail("Must fail because os's not compatible.") except Exception as e: - self.assertEquals( + self.assertEqual( "Local OS is not compatible with cluster primary OS family. Please perform manual bootstrap on this host.", str(e)) pass diff --git a/ambari-server/src/test/python/TestResourceFilesKeeper.py b/ambari-server/src/test/python/TestResourceFilesKeeper.py index b8b78770839..6a66bbdd34f 100644 --- a/ambari-server/src/test/python/TestResourceFilesKeeper.py +++ b/ambari-server/src/test/python/TestResourceFilesKeeper.py @@ -20,7 +20,7 @@ os.environ["ROOT"] = "" import time -from ambari_commons import subprocess32 +import subprocess import os import logging import tempfile @@ -28,7 +28,6 @@ from xml.dom import minidom from unittest import TestCase -from ambari_commons.subprocess32 import Popen from mock.mock import MagicMock, call from mock.mock import patch from mock.mock import create_autospec @@ -59,7 +58,7 @@ class TestResourceFilesKeeper(TestCase): ResourceFilesKeeper.PACKAGE_DIR) if get_platform() != PLATFORM_WINDOWS: - DUMMY_UNCHANGEABLE_PACKAGE_HASH="a6e939662fce1f116054a1bfb8a5915f87e09319" + DUMMY_UNCHANGEABLE_PACKAGE_HASH="66e2d69a8d0666ae21cb3870b07ce2e5c3eb668f" else: DUMMY_UNCHANGEABLE_PACKAGE_HASH="2e438f4f9862420ed8930a56b8809b8aca359e87" DUMMY_HASH="dummy_hash" @@ -133,7 +132,7 @@ def test_update_directory_archives(self, abspath_mock, abspath_mock.side_effect = lambda s : s resource_files_keeper = ResourceFilesKeeper(self.TEST_RESOURCES_DIR, self.TEST_STACKS_DIR) resource_files_keeper.update_directory_archives() - self.assertEquals(pprint.pformat( + self.assertEqual(pprint.pformat( update_directory_archive_mock.call_args_list), self.UPDATE_DIRECTORY_ARCHIVE_CALL_LIST) pass @@ -147,7 +146,7 @@ def test_list_stacks(self, exists_mock, glob_mock): glob_mock.return_value = ["stack1", "stack2", "stack3"] exists_mock.side_effect = [True, False, True] res = resource_files_keeper.list_stacks(self.SOME_PATH) - self.assertEquals(pprint.pformat(res), "['stack1', 'stack3']") + self.assertEqual(pprint.pformat(res), "['stack1', 'stack3']") # Test exception handling glob_mock.side_effect = self.keeper_exc_side_effect @@ -156,7 +155,7 @@ def test_list_stacks(self, exists_mock, glob_mock): self.fail('KeeperException not thrown') except KeeperException: pass # Expected - except Exception, e: + except Exception as e: self.fail('Unexpected exception thrown:' + str(e)) @@ -168,7 +167,7 @@ def test_list_common_services(self, exists_mock, glob_mock): glob_mock.return_value = ["common_service1", "common_service2", "common_service3"] exists_mock.side_effect = [True, False, True] res = resource_files_keeper.list_common_services(self.SOME_PATH) - self.assertEquals(pprint.pformat(res), "['common_service1', 'common_service3']") + self.assertEqual(pprint.pformat(res), "['common_service1', 'common_service3']") # Test exception handling glob_mock.side_effect = self.keeper_exc_side_effect @@ -177,7 +176,7 @@ def test_list_common_services(self, exists_mock, glob_mock): self.fail('KeeperException not thrown') except KeeperException: pass # Expected - except Exception, e: + except Exception as e: self.fail('Unexpected exception thrown:' + str(e)) @patch("os.path.isfile") @@ -268,7 +267,7 @@ def test_update_directory_archive(self, write_hash_sum_mock, self.fail('KeeperException not thrown') except KeeperException: pass # Expected - except Exception, e: + except Exception as e: self.fail('Unexpected exception thrown:' + str(e)) self.assertTrue(read_hash_sum_mock.called) self.assertTrue(count_hash_sum_mock.called) @@ -336,44 +335,44 @@ def test_count_hash_sum(self): resource_files_keeper = ResourceFilesKeeper(self.TEST_RESOURCES_DIR, self.DUMMY_UNCHANGEABLE_PACKAGE) test_dir = os.path.join(self.DUMMY_UNCHANGEABLE_PACKAGE) hash_sum = resource_files_keeper.count_hash_sum(test_dir) - self.assertEquals(hash_sum, self.DUMMY_UNCHANGEABLE_PACKAGE_HASH) + self.assertEqual(hash_sum, self.DUMMY_UNCHANGEABLE_PACKAGE_HASH) # Test exception handling - with patch("__builtin__.open") as open_mock: + with patch("builtins.open") as open_mock: open_mock.side_effect = self.exc_side_effect try: resource_files_keeper.count_hash_sum(test_dir) self.fail('KeeperException not thrown') except KeeperException: pass # Expected - except Exception, e: + except Exception as e: self.fail('Unexpected exception thrown:' + str(e)) def test_read_hash_sum(self): resource_files_keeper = ResourceFilesKeeper(self.TEST_RESOURCES_DIR, self.DUMMY_UNCHANGEABLE_PACKAGE) hash_sum = resource_files_keeper.read_hash_sum(self.DUMMY_UNCHANGEABLE_PACKAGE) - self.assertEquals(hash_sum, "dummy_hash") + self.assertEqual(hash_sum, "dummy_hash") # Test exception handling # If file exists, should rethrow exception with patch("os.path.isfile") as isfile_mock: isfile_mock.return_value = True - with patch("__builtin__.open") as open_mock: + with patch("builtins.open") as open_mock: open_mock.side_effect = self.exc_side_effect try: resource_files_keeper.read_hash_sum("path-to-directory") self.fail('KeeperException not thrown') except KeeperException: pass # Expected - except Exception, e: + except Exception as e: self.fail('Unexpected exception thrown:' + str(e)) # Test exception handling # If file does not exist, should ignore exception with patch("os.path.isfile") as isfile_mock: isfile_mock.return_value = False - with patch("__builtin__.open") as open_mock: + with patch("builtins.open") as open_mock: open_mock.side_effect = self.exc_side_effect res = resource_files_keeper.read_hash_sum("path-to-directory") self.assertEqual(res, None) @@ -386,23 +385,23 @@ def test_write_hash_sum(self): resource_files_keeper.write_hash_sum( self.DUMMY_UNCHANGEABLE_PACKAGE, NEW_HASH) hash_sum = resource_files_keeper.read_hash_sum(self.DUMMY_UNCHANGEABLE_PACKAGE) - self.assertEquals(hash_sum, NEW_HASH) + self.assertEqual(hash_sum, NEW_HASH) # Revert to previous value resource_files_keeper.write_hash_sum( self.DUMMY_UNCHANGEABLE_PACKAGE, self.DUMMY_HASH) hash_sum = resource_files_keeper.read_hash_sum(self.DUMMY_UNCHANGEABLE_PACKAGE) - self.assertEquals(hash_sum, self.DUMMY_HASH) + self.assertEqual(hash_sum, self.DUMMY_HASH) # Test exception handling - with patch("__builtin__.open") as open_mock: + with patch("builtins.open") as open_mock: open_mock.side_effect = self.exc_side_effect try: resource_files_keeper.write_hash_sum("path-to-directory", self.DUMMY_HASH) self.fail('KeeperException not thrown') except KeeperException: pass # Expected - except Exception, e: + except Exception as e: self.fail('Unexpected exception thrown:' + str(e)) @@ -419,7 +418,7 @@ def test_zip_directory(self, os_path_exists_mock): self.assertTrue(40000 < arc_size < 50000) # After creating zip, count hash sum of dir (should not change) hash_val = resource_files_keeper.count_hash_sum(self.DUMMY_UNCHANGEABLE_PACKAGE) - self.assertEquals(hash_val, self.DUMMY_UNCHANGEABLE_PACKAGE_HASH) + self.assertEqual(hash_val, self.DUMMY_UNCHANGEABLE_PACKAGE_HASH) # Remove arc file os.unlink(arc_file) @@ -431,7 +430,7 @@ def test_zip_directory(self, os_path_exists_mock): self.fail('KeeperException not thrown') except KeeperException: pass # Expected - except Exception, e: + except Exception as e: self.fail('Unexpected exception thrown:' + str(e)) # Test skip zipping of an empty directory @@ -441,7 +440,7 @@ def test_zip_directory(self, os_path_exists_mock): skip_empty_directory = True resource_files_keeper.zip_directory("empty-to-directory", skip_empty_directory) self.assertTrue(os_listdir_mock.called) - except Exception, e: + except Exception as e: self.fail('Unexpected exception thrown: ' + str(e)) pass @@ -453,7 +452,7 @@ def test_zip_directory(self, os_path_exists_mock): skip_empty_directory = True resource_files_keeper.zip_directory("empty-to-directory", skip_empty_directory) self.assertTrue(os_path_exists_mock.called) - except Exception, e: + except Exception as e: self.fail('Unexpected exception thrown: ' + str(e)) pass diff --git a/ambari-server/src/test/python/TestSensitiveDataEncryption.py b/ambari-server/src/test/python/TestSensitiveDataEncryption.py index 8ff65882f92..194178c77a7 100644 --- a/ambari-server/src/test/python/TestSensitiveDataEncryption.py +++ b/ambari-server/src/test/python/TestSensitiveDataEncryption.py @@ -16,6 +16,7 @@ limitations under the License. ''' import os +import importlib import sys from ambari_commons.exceptions import FatalException @@ -23,11 +24,11 @@ with patch.object(os, "geteuid", new=MagicMock(return_value=0)): from resource_management.core import sudo - reload(sudo) + importlib.reload(sudo) import operator -import platform -import StringIO +import distro +import io from unittest import TestCase os.environ["ROOT"] = "" @@ -55,15 +56,15 @@ def search_file_proxy(filename, searchpatch, pathsep=os.pathsep): os_utils.search_file = search_file_proxy -with patch.object(platform, "linux_distribution", return_value = MagicMock(return_value=('Redhat', '6.4', 'Final'))): +with patch.object(distro, "linux_distribution", return_value = MagicMock(return_value=('Redhat', '6.4', 'Final'))): with patch("os.path.isdir", return_value = MagicMock(return_value=True)): with patch("os.access", return_value = MagicMock(return_value=True)): with patch.object(os_utils, "parse_log4j_file", return_value={'ambari.log.dir': '/var/log/ambari-server'}): - with patch("platform.linux_distribution", return_value = os_distro_value): + with patch("distro.linux_distribution", return_value = os_distro_value): with patch("os.symlink"): with patch("glob.glob", return_value = ['/etc/init.d/postgresql-9.3']): _ambari_server_ = __import__('ambari-server') - with patch("__builtin__.open"): + with patch("builtins.open"): from ambari_server.properties import Properties from ambari_server.serverConfiguration import configDefaults, JDBC_RCA_PASSWORD_FILE_PROPERTY, JDBC_PASSWORD_PROPERTY, \ JDBC_RCA_PASSWORD_ALIAS, SSL_TRUSTSTORE_PASSWORD_PROPERTY, SECURITY_IS_ENCRYPTION_ENABLED, \ @@ -72,12 +73,12 @@ def search_file_proxy(filename, searchpatch, pathsep=os.pathsep): from ambari_server.serverClassPath import ServerClassPath -@patch.object(platform, "linux_distribution", new = MagicMock(return_value=('Redhat', '6.4', 'Final'))) +@patch.object(distro, "linux_distribution", new = MagicMock(return_value=('Redhat', '6.4', 'Final'))) @patch("ambari_server.dbConfiguration_linux.get_postgre_hba_dir", new = MagicMock(return_value = "/var/lib/pgsql/data")) @patch("ambari_server.dbConfiguration_linux.get_postgre_running_status", new = MagicMock(return_value = "running")) class TestSensitiveDataEncryption(TestCase): def setUp(self): - out = StringIO.StringIO() + out = io.StringIO() sys.stdout = out @@ -87,11 +88,13 @@ def tearDown(self): @patch("os.path.isdir", new = MagicMock(return_value=True)) @patch("os.access", new = MagicMock(return_value=True)) @patch.object(ServerClassPath, "get_full_ambari_classpath_escaped_for_shell", new = MagicMock(return_value = 'test' + os.pathsep + 'path12')) + @patch('ambari_server.serverConfiguration.find_properties_file') @patch("ambari_server.setupSecurity.find_jdk") @patch("ambari_server.setupSecurity.get_ambari_properties") @patch("ambari_server.setupSecurity.run_os_command") - def test_sensitive_data_encryption(self, run_os_command_mock, get_ambari_properties_method, find_jdk_mock): + def test_sensitive_data_encryption(self, run_os_command_mock, get_ambari_properties_method, find_jdk_mock, find_properties_file_mock): find_jdk_mock.return_value = "/" + find_properties_file_mock.return_value = "/tmp/ambari.properties" environ = os.environ.copy() run_os_command_mock.return_value = 0,"","" @@ -109,7 +112,7 @@ def test_sensitive_data_encryption_nojdk(self, find_jdk_mock, print_mock): options = self._create_empty_options_mock() code = sensitive_data_encryption(options, "encription") - self.assertEquals(code, 1) + self.assertEqual(code, 1) print_mock.assert_called_with("No JDK found, please run the \"setup\" " "command to install a JDK automatically or install any " "JDK manually to " + configDefaults.JDK_INSTALL_DIR) @@ -118,11 +121,13 @@ def test_sensitive_data_encryption_nojdk(self, find_jdk_mock, print_mock): @patch("os.path.isdir", new = MagicMock(return_value=True)) @patch("os.access", new = MagicMock(return_value=True)) @patch.object(ServerClassPath, "get_full_ambari_classpath_escaped_for_shell", new = MagicMock(return_value = 'test' + os.pathsep + 'path12')) + @patch('ambari_server.serverConfiguration.find_properties_file') @patch("ambari_server.setupSecurity.find_jdk") @patch("ambari_server.setupSecurity.get_ambari_properties") @patch("ambari_server.setupSecurity.run_os_command") - def test_sensitive_data_decryption_not_persisted(self, run_os_command_mock, get_ambari_properties_method, find_jdk_mock): + def test_sensitive_data_decryption_not_persisted(self, run_os_command_mock, get_ambari_properties_method, find_jdk_mock,find_properties_file_mock): find_jdk_mock.return_value = "/" + find_properties_file_mock.return_value = "/tmp/ambari.properties" environ = os.environ.copy() master = "master" environ[SECURITY_KEY_ENV_VAR_NAME] = master @@ -205,10 +210,10 @@ def test_reset_master_key_not_persisted(self, get_original_master_key_mock, sens SECURITY_IS_ENCRYPTION_ENABLED: 'true', SECURITY_SENSITIVE_DATA_ENCRYPTON_ENABLED: 'true'} - sorted_x = sorted(result_expected.iteritems(), key=operator.itemgetter(0)) - sorted_y = sorted(update_properties_method.call_args[0][1].iteritems(), + sorted_x = sorted(result_expected.items(), key=operator.itemgetter(0)) + sorted_y = sorted(update_properties_method.call_args[0][1].items(), key=operator.itemgetter(0)) - self.assertEquals(sorted_x, sorted_y) + self.assertEqual(sorted_x, sorted_y) pass @patch("ambari_server.setupSecurity.get_is_persisted") @@ -278,10 +283,10 @@ def test_encrypt_part_not_persisted(self, get_original_master_key_mock, sensitiv SECURITY_IS_ENCRYPTION_ENABLED: 'true', SECURITY_SENSITIVE_DATA_ENCRYPTON_ENABLED: 'true'} - sorted_x = sorted(result_expected.iteritems(), key=operator.itemgetter(0)) - sorted_y = sorted(update_properties_method.call_args[0][1].iteritems(), + sorted_x = sorted(result_expected.items(), key=operator.itemgetter(0)) + sorted_y = sorted(update_properties_method.call_args[0][1].items(), key=operator.itemgetter(0)) - self.assertEquals(sorted_x, sorted_y) + self.assertEqual(sorted_x, sorted_y) pass @patch("ambari_server.setupSecurity.get_is_persisted") @@ -396,7 +401,7 @@ def test_setup_sensitive_data_encryption_not_persist(self, adjust_directory_perm self.assertTrue(update_properties_method.called) self.assertFalse(save_master_key_method.called) self.assertTrue(save_passwd_for_alias_method.called) - self.assertEquals(2, save_passwd_for_alias_method.call_count) + self.assertEqual(2, save_passwd_for_alias_method.call_count) self.assertTrue(remove_password_file_method.called) self.assertTrue(adjust_directory_permissions_mock.called) sensitive_data_encryption_metod.assert_called_with(options, "encryption", master_key) @@ -410,10 +415,10 @@ def test_setup_sensitive_data_encryption_not_persist(self, adjust_directory_perm SECURITY_IS_ENCRYPTION_ENABLED: 'true', SECURITY_SENSITIVE_DATA_ENCRYPTON_ENABLED: 'true'} - sorted_x = sorted(result_expected.iteritems(), key=operator.itemgetter(0)) - sorted_y = sorted(update_properties_method.call_args[0][1].iteritems(), + sorted_x = sorted(result_expected.items(), key=operator.itemgetter(0)) + sorted_y = sorted(update_properties_method.call_args[0][1].items(), key=operator.itemgetter(0)) - self.assertEquals(sorted_x, sorted_y) + self.assertEqual(sorted_x, sorted_y) pass @patch("ambari_server.setupSecurity.save_passwd_for_alias") @@ -469,10 +474,10 @@ def test_setup_sensitive_data_encryption_persist(self, sensitive_data_encryption SECURITY_IS_ENCRYPTION_ENABLED: 'true', SECURITY_SENSITIVE_DATA_ENCRYPTON_ENABLED: 'true'} - sorted_x = sorted(result_expected.iteritems(), key=operator.itemgetter(0)) - sorted_y = sorted(update_properties_method.call_args[0][1].iteritems(), + sorted_x = sorted(result_expected.items(), key=operator.itemgetter(0)) + sorted_y = sorted(update_properties_method.call_args[0][1].items(), key=operator.itemgetter(0)) - self.assertEquals(sorted_x, sorted_y) + self.assertEqual(sorted_x, sorted_y) pass @patch("ambari_server.setupSecurity.read_master_key") @@ -542,10 +547,10 @@ def test_reset_master_key_persisted(self, get_is_persisted_method, get_is_secure SECURITY_IS_ENCRYPTION_ENABLED: 'true', SECURITY_SENSITIVE_DATA_ENCRYPTON_ENABLED: 'true'} - sorted_x = sorted(result_expected.iteritems(), key=operator.itemgetter(0)) - sorted_y = sorted(update_properties_method.call_args[0][1].iteritems(), + sorted_x = sorted(result_expected.items(), key=operator.itemgetter(0)) + sorted_y = sorted(update_properties_method.call_args[0][1].items(), key=operator.itemgetter(0)) - self.assertEquals(sorted_x, sorted_y) + self.assertEqual(sorted_x, sorted_y) pass @patch("os.path.exists") @@ -604,10 +609,10 @@ def test_decrypt_sensitive_data_persister(self, get_is_persisted_method, get_is_ SECURITY_IS_ENCRYPTION_ENABLED: 'false', SECURITY_SENSITIVE_DATA_ENCRYPTON_ENABLED: 'false'} - sorted_x = sorted(result_expected.iteritems(), key=operator.itemgetter(0)) - sorted_y = sorted(update_properties_method.call_args[0][1].iteritems(), + sorted_x = sorted(result_expected.items(), key=operator.itemgetter(0)) + sorted_y = sorted(update_properties_method.call_args[0][1].items(), key=operator.itemgetter(0)) - self.assertEquals(sorted_x, sorted_y) + self.assertEqual(sorted_x, sorted_y) pass def _create_empty_options_mock(self): diff --git a/ambari-server/src/test/python/TestServerClassPath.py b/ambari-server/src/test/python/TestServerClassPath.py index ef8af17f06b..90dab2d00a7 100644 --- a/ambari-server/src/test/python/TestServerClassPath.py +++ b/ambari-server/src/test/python/TestServerClassPath.py @@ -26,6 +26,7 @@ from mock.mock import patch, MagicMock from unittest import TestCase from ambari_server.properties import Properties +import distro import platform from ambari_commons import os_utils @@ -34,7 +35,7 @@ project_dir = os.path.join(os.path.abspath(os.path.dirname(__file__)),os.path.normpath("../../../../")) shutil.copyfile(project_dir+"/ambari-server/conf/unix/ambari.properties", "/tmp/ambari.properties") -with patch.object(platform, "linux_distribution", return_value = MagicMock(return_value=('Redhat', '6.4', 'Final'))): +with patch.object(distro, "linux_distribution", return_value = MagicMock(return_value=('Redhat', '6.4', 'Final'))): with patch("os.path.isdir", return_value = MagicMock(return_value=True)): with patch("os.access", return_value = MagicMock(return_value=True)): with patch.object(os_utils, "parse_log4j_file", return_value={'ambari.log.dir': '/var/log/ambari-server'}): @@ -42,7 +43,7 @@ from ambari_server.serverConfiguration import get_conf_dir from ambari_server.serverClassPath import ServerClassPath, AMBARI_SERVER_LIB, SERVER_CLASSPATH_KEY, JDBC_DRIVER_PATH_PROPERTY -@patch.object(platform, "linux_distribution", new = MagicMock(return_value=('Redhat', '6.4', 'Final'))) +@patch.object(distro, "linux_distribution", new = MagicMock(return_value=('Redhat', '6.4', 'Final'))) @patch("os.path.isdir", new = MagicMock(return_value=True)) @patch("os.access", new = MagicMock(return_value=True)) @patch("ambari_server.serverConfiguration.search_file", new=MagicMock(return_value="/tmp/ambari.properties")) @@ -55,7 +56,7 @@ def test_server_class_path_default(self, get_conf_dir_mock): expected_classpath = "'/etc/ambari-server/conf:/usr/lib/ambari-server/*'" serverClassPath = ServerClassPath(properties, None) - self.assertEquals(expected_classpath, serverClassPath.get_full_ambari_classpath_escaped_for_shell()) + self.assertEqual(expected_classpath, serverClassPath.get_full_ambari_classpath_escaped_for_shell()) @patch("ambari_server.serverConfiguration.get_conf_dir") @patch("ambari_server.dbConfiguration.get_jdbc_driver_path") @@ -73,7 +74,7 @@ def test_server_class_path_custom_jar(self, get_native_libs_path_mock, get_jdbc_ serverClassPath = ServerClassPath(properties, MagicMock()) actual_classpath = serverClassPath.get_full_ambari_classpath_escaped_for_shell() del os.environ[AMBARI_SERVER_LIB] - self.assertEquals(expected_classpath, actual_classpath) + self.assertEqual(expected_classpath, actual_classpath) @patch("ambari_server.serverConfiguration.get_conf_dir") @patch("ambari_server.dbConfiguration.get_jdbc_driver_path") @@ -90,7 +91,7 @@ def test_server_class_path_custom_env_classpath(self, get_native_libs_path_mock, serverClassPath = ServerClassPath(properties, MagicMock()) actual_classpath = serverClassPath.get_full_ambari_classpath_escaped_for_shell() del os.environ[SERVER_CLASSPATH_KEY] - self.assertEquals(expected_classpath, actual_classpath) + self.assertEqual(expected_classpath, actual_classpath) @patch("ambari_server.serverConfiguration.get_conf_dir") @patch("ambari_server.dbConfiguration.get_jdbc_driver_path") @@ -106,7 +107,7 @@ def test_server_class_path_custom_jdbc_path(self, get_native_libs_path_mock, get expected_classpath = "'/etc/ambari-server/conf:/usr/lib/ambari-server/*:/ambari/properties/path/to/custom/jdbc.jar:/path/to/jdbc.jar'" serverClassPath = ServerClassPath(properties, MagicMock()) actual_classpath = serverClassPath.get_full_ambari_classpath_escaped_for_shell() - self.assertEquals(expected_classpath, actual_classpath) + self.assertEqual(expected_classpath, actual_classpath) @patch("ambari_server.serverConfiguration.get_conf_dir") def test_server_class_path_find_all_jars(self, get_conf_dir_mock): diff --git a/ambari-server/src/test/python/TestServerUpgrade.py b/ambari-server/src/test/python/TestServerUpgrade.py index ad621ff64af..c41bd362a8c 100644 --- a/ambari-server/src/test/python/TestServerUpgrade.py +++ b/ambari-server/src/test/python/TestServerUpgrade.py @@ -18,13 +18,15 @@ import os os.environ["ROOT"] = "" -import StringIO +import io import sys from ambari_commons.exceptions import FatalException from unittest import TestCase from mock.mock import patch, MagicMock from ambari_commons import os_utils import platform +import distro +import urllib.request, urllib.parse, urllib.error import shutil project_dir = os.path.join(os.path.abspath(os.path.dirname(__file__)),os.path.normpath("../../../../")) @@ -32,7 +34,7 @@ _search_file = os_utils.search_file os_utils.search_file = MagicMock(return_value="/tmp/ambari.properties") -with patch.object(platform, "linux_distribution", return_value = MagicMock(return_value=('Redhat', '6.4', 'Final'))): +with patch.object(distro, "linux_distribution", return_value = MagicMock(return_value=('Redhat', '6.4', 'Final'))): with patch("os.path.isdir", return_value = MagicMock(return_value=True)): with patch("os.access", return_value = MagicMock(return_value=True)): with patch.object(os_utils, "parse_log4j_file", return_value={'ambari.log.dir': '/var/log/ambari-server'}): @@ -41,7 +43,7 @@ os_utils.search_file = _search_file -@patch.object(platform, "linux_distribution", new = MagicMock(return_value=('Redhat', '6.4', 'Final'))) +@patch.object(distro, "linux_distribution", new = MagicMock(return_value=('Redhat', '6.4', 'Final'))) @patch("os.path.isdir", new = MagicMock(return_value=True)) @patch("os.access", new = MagicMock(return_value=True)) class TestServerUpgrade(TestCase): @@ -52,7 +54,7 @@ class TestServerUpgrade(TestCase): @patch('ambari_server.serverUpgrade.get_ambari_properties') @patch('ambari_server.serverUtils.get_ambari_server_api_base') @patch('ambari_commons.logging_utils.get_verbose') - @patch('urllib2.urlopen') + @patch('urllib.request.urlopen') def test_set_current(self, urlopen_mock, get_verbose_mock, get_ambari_server_api_base_mock, get_ambari_properties_mock, get_validated_string_input_mock, no_finalize_options_set_mock, is_server_runing_mock): @@ -95,10 +97,10 @@ def test_set_current(self, urlopen_mock, get_verbose_mock, get_ambari_server_api self.assertTrue(urlopen_mock.called) request = urlopen_mock.call_args_list[0][0][0] - self.assertEquals(request._Request__original, 'http://127.0.0.1:8080/api/v1/clusters/cc/stack_versions') - self.assertEquals(request.data, '{"ClusterStackVersions": {"state": "CURRENT", "repository_version": "HDP-2.2.2.0-2561", "force": false}}') - self.assertEquals(request.origin_req_host, '127.0.0.1') - self.assertEquals(request.headers, {'X-requested-by': 'ambari', 'Authorization': 'Basic ZHVtbXlfc3RyaW5nOmR1bW15X3N0cmluZw=='}) + self.assertEqual(request.get_full_url(), 'http://127.0.0.1:8080/api/v1/clusters/cc/stack_versions') + self.assertEqual(request.data, '{"ClusterStackVersions": {"repository_version": "HDP-2.2.2.0-2561", "state": "CURRENT", "force": false}}') + self.assertEqual(request.origin_req_host, '127.0.0.1') + self.assertEqual(request.headers, {'X-requested-by': 'ambari', 'Authorization': 'Basic ZHVtbXlfc3RyaW5nOmR1bW15X3N0cmluZw=='}) @patch("ambari_server.serverUpgrade.is_server_runing") @patch('ambari_server.serverUpgrade.SetCurrentVersionOptions.no_finalize_options_set') @@ -106,7 +108,7 @@ def test_set_current(self, urlopen_mock, get_verbose_mock, get_ambari_server_api @patch('ambari_server.serverUpgrade.get_ambari_properties') @patch('ambari_server.serverUtils.get_ambari_server_api_base') @patch('ambari_commons.logging_utils.get_verbose') - @patch('urllib2.urlopen') + @patch('urllib.request.urlopen') def test_set_current_with_force(self, urlopen_mock, get_verbose_mock, get_ambari_server_api_base_mock, get_ambari_properties_mock, get_validated_string_input_mock, no_finalize_options_set_mock, is_server_runing_mock): @@ -149,10 +151,10 @@ def test_set_current_with_force(self, urlopen_mock, get_verbose_mock, get_ambari self.assertTrue(urlopen_mock.called) request = urlopen_mock.call_args_list[0][0][0] - self.assertEquals(request._Request__original, 'http://127.0.0.1:8080/api/v1/clusters/cc/stack_versions') - self.assertEquals(request.data, '{"ClusterStackVersions": {"state": "CURRENT", "repository_version": "HDP-2.2.2.0-2561", "force": true}}') - self.assertEquals(request.origin_req_host, '127.0.0.1') - self.assertEquals(request.headers, {'X-requested-by': 'ambari', 'Authorization': 'Basic ZHVtbXlfc3RyaW5nOmR1bW15X3N0cmluZw=='}) + self.assertEqual(request.get_full_url(), 'http://127.0.0.1:8080/api/v1/clusters/cc/stack_versions') + self.assertEqual(request.data, '{"ClusterStackVersions": {"repository_version": "HDP-2.2.2.0-2561", "state": "CURRENT", "force": true}}') + self.assertEqual(request.origin_req_host, '127.0.0.1') + self.assertEqual(request.headers, {'X-requested-by': 'ambari', 'Authorization': 'Basic ZHVtbXlfc3RyaW5nOmR1bW15X3N0cmluZw=='}) def testCurrentVersionOptions(self): diff --git a/ambari-server/src/test/python/TestServerUtils.py b/ambari-server/src/test/python/TestServerUtils.py index 07042722c93..59c2841f731 100644 --- a/ambari-server/src/test/python/TestServerUtils.py +++ b/ambari-server/src/test/python/TestServerUtils.py @@ -21,6 +21,7 @@ from mock.mock import patch, MagicMock from unittest import TestCase +import distro import platform import socket import ssl @@ -31,7 +32,7 @@ project_dir = os.path.join(os.path.abspath(os.path.dirname(__file__)),os.path.normpath("../../../../")) shutil.copyfile(project_dir+"/ambari-server/conf/unix/ambari.properties", "/tmp/ambari.properties") -with patch.object(platform, "linux_distribution", return_value = MagicMock(return_value=('Redhat', '6.4', 'Final'))): +with patch.object(distro, "linux_distribution", return_value = MagicMock(return_value=('Redhat', '6.4', 'Final'))): with patch("os.path.isdir", return_value = MagicMock(return_value=True)): with patch("os.access", return_value = MagicMock(return_value=True)): with patch.object(os_utils, "parse_log4j_file", return_value={'ambari.log.dir': '/var/log/ambari-server'}): @@ -39,7 +40,7 @@ is_api_ssl_enabled, get_ssl_context from ambari_server.serverConfiguration import CLIENT_API_PORT, CLIENT_API_PORT_PROPERTY, SSL_API, DEFAULT_SSL_API_PORT, SSL_API_PORT -@patch.object(platform, "linux_distribution", new = MagicMock(return_value=('Redhat', '6.4', 'Final'))) +@patch.object(distro, "linux_distribution", new = MagicMock(return_value=('Redhat', '6.4', 'Final'))) class TestServerUtils(TestCase): def test_get_ambari_server_api_base(self): @@ -50,7 +51,7 @@ def test_get_ambari_server_api_base(self): CLIENT_API_PORT_PROPERTY: None }) result = get_ambari_server_api_base(properties) - self.assertEquals(result, 'http://127.0.0.1:8080/api/v1/') + self.assertEqual(result, 'http://127.0.0.1:8080/api/v1/') # Test case of using http protocol and custom port properties = FakeProperties({ @@ -58,7 +59,7 @@ def test_get_ambari_server_api_base(self): CLIENT_API_PORT_PROPERTY: "8033" }) result = get_ambari_server_api_base(properties) - self.assertEquals(result, 'http://127.0.0.1:8033/api/v1/') + self.assertEqual(result, 'http://127.0.0.1:8033/api/v1/') # Test case of using https protocol (and ssl port) fqdn = socket.getfqdn() @@ -70,7 +71,7 @@ def test_get_ambari_server_api_base(self): CLIENT_API_PORT_PROPERTY: None }) result = get_ambari_server_api_base(properties) - self.assertEquals(result, 'https://{0}:8443/api/v1/'.format(fqdn)) + self.assertEqual(result, 'https://{0}:8443/api/v1/'.format(fqdn)) def test_get_ambari_admin_credentials_from_cli_options(self): @@ -80,8 +81,8 @@ def test_get_ambari_admin_credentials_from_cli_options(self): options.ambari_admin_username = user_name options.ambari_admin_password = password user, pw = get_ambari_admin_username_password_pair(options) - self.assertEquals(user, user_name) - self.assertEquals(pw, password) + self.assertEqual(user, user_name) + self.assertEqual(pw, password) @patch("ambari_server.serverUtils.get_validated_string_input") def test_get_ambari_admin_credentials_from_user_input(self, get_validated_string_input_mock): @@ -97,8 +98,8 @@ def valid_input_side_effect(*args, **kwargs): get_validated_string_input_mock.side_effect = valid_input_side_effect user, pw = get_ambari_admin_username_password_pair(options) - self.assertEquals(user, user_name) - self.assertEquals(pw, password) + self.assertEqual(user, user_name) + self.assertEqual(pw, password) def test_is_api_ssl_enabled(self): properties = FakeProperties({ diff --git a/ambari-server/src/test/python/TestServiceAdvisor.py b/ambari-server/src/test/python/TestServiceAdvisor.py index 41e5b5ca14a..6318f0a5757 100644 --- a/ambari-server/src/test/python/TestServiceAdvisor.py +++ b/ambari-server/src/test/python/TestServiceAdvisor.py @@ -54,19 +54,19 @@ def test_getServiceComponentCardinalityValidations(self): hosts = self.load_json("validation-hosts.json") validations = self.serviceAdvisor.getServiceComponentCardinalityValidations(services, hosts, "HDFS") - self.assertEquals(len(validations), 1) + self.assertEqual(len(validations), 1) expected = { "type": 'host-component', "level": 'ERROR', "component-name": 'DATANODE', "message": 'You have selected 0 DataNode components. Please consider that at least 1 DataNode components should be installed in cluster.' } - self.assertEquals(validations[0], expected) + self.assertEqual(validations[0], expected) validations = self.serviceAdvisor.getServiceComponentCardinalityValidations(services, hosts, "HBASE") - self.assertEquals(len(validations), 0) + self.assertEqual(len(validations), 0) services["services"][0]["components"][0]["StackServiceComponents"]["hostnames"].append("c7402.ambari.apache.org") validations = self.serviceAdvisor.getServiceComponentCardinalityValidations(services, hosts, "HDFS") - self.assertEquals(len(validations), 0) + self.assertEqual(len(validations), 0) diff --git a/ambari-server/src/test/python/TestSetupAgent.py b/ambari-server/src/test/python/TestSetupAgent.py index b52eed294f4..0b33e9faa8a 100644 --- a/ambari-server/src/test/python/TestSetupAgent.py +++ b/ambari-server/src/test/python/TestSetupAgent.py @@ -15,7 +15,7 @@ See the License for the specific language governing permissions and limitations under the License. ''' -from ambari_commons import subprocess32 +import subprocess from mock.mock import MagicMock from unittest import TestCase from mock.mock import patch @@ -62,7 +62,7 @@ def test_configureAgent(self, execOsCommand_mock): @not_for_platform(PLATFORM_WINDOWS) @patch.object(setup_agent, 'execOsCommand') @patch("os.environ") - @patch("subprocess32.Popen") + @patch("subprocess.Popen") @patch("time.sleep") def test_runAgent(self, sleep_mock, popen_mock, environ_mock, execOsCommand_mock): expected_hostname = "test.hst" @@ -305,13 +305,13 @@ def test_returned_optimal_version_is_default(self, findNearestAgentPackageVersio @not_for_platform(PLATFORM_WINDOWS) @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) - @patch.object(subprocess32, 'Popen') + @patch.object(subprocess, 'Popen') def test_execOsCommand(self, Popen_mock): self.assertIsNone(setup_agent.execOsCommand("hostname -f")) @only_for_platform(PLATFORM_WINDOWS) @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) - @patch.object(subprocess32, 'Popen') + @patch.object(subprocess, 'Popen') def test_execOsCommand(self, Popen_mock): p = MagicMock() p.communicate.return_value = ("", "") diff --git a/ambari-server/src/test/python/TestSetupSso.py b/ambari-server/src/test/python/TestSetupSso.py index 54b745b38f1..a1b05448b24 100644 --- a/ambari-server/src/test/python/TestSetupSso.py +++ b/ambari-server/src/test/python/TestSetupSso.py @@ -17,15 +17,16 @@ ''' import os import platform +import distro import sys import unittest -import StringIO +import io from mock.mock import patch, MagicMock from only_for_platform import os_distro_value from ambari_commons import os_utils -from urllib2 import HTTPError +from urllib.error import HTTPError import shutil @@ -58,16 +59,16 @@ def search_file_proxy(filename, searchpatch, pathsep=os.pathsep): os_utils.search_file = search_file_proxy -with patch.object(platform, "linux_distribution", return_value = MagicMock(return_value=('Redhat', '6.4', 'Final'))): +with patch.object(distro, "linux_distribution", return_value = MagicMock(return_value=('Redhat', '6.4', 'Final'))): with patch("os.path.isdir", return_value = MagicMock(return_value=True)): with patch("os.access", return_value = MagicMock(return_value=True)): with patch.object(os_utils, "parse_log4j_file", return_value={'ambari.log.dir': '/var/log/ambari-server'}): - with patch("platform.linux_distribution", return_value = os_distro_value): + with patch("distro.linux_distribution", return_value = os_distro_value): with patch("os.symlink"): with patch.object(os_utils, "is_service_exist", return_value = True): with patch("glob.glob", return_value = ['/etc/init.d/postgresql-9.3']): _ambari_server_ = __import__('ambari-server') - with patch("__builtin__.open"): + with patch("builtins.open"): from ambari_commons.exceptions import FatalException, NonFatalException from ambari_server.properties import Properties from ambari_server.setupSso import setup_sso, AMBARI_SSO_AUTH_ENABLED, \ @@ -77,7 +78,7 @@ def search_file_proxy(filename, searchpatch, pathsep=os.pathsep): class TestSetupSso(unittest.TestCase): @patch("ambari_server.setupSso.is_server_runing") def test_sso_setup_should_fail_if_server_is_not_running(self, is_server_runing_mock): - out = StringIO.StringIO() + out = io.StringIO() sys.stdout = out is_server_runing_mock.return_value = (False, 0) @@ -96,7 +97,7 @@ def test_sso_setup_should_fail_if_server_is_not_running(self, is_server_runing_m @patch("ambari_server.setupSso.get_silent") @patch("ambari_server.setupSso.is_server_runing") def test_silent_mode_is_not_allowed(self, is_server_runing_mock, get_silent_mock): - out = StringIO.StringIO() + out = io.StringIO() sys.stdout = out is_server_runing_mock.return_value = (True, 0) @@ -117,7 +118,7 @@ def test_silent_mode_is_not_allowed(self, is_server_runing_mock, get_silent_mock @patch("ambari_server.setupSso.get_silent") @patch("ambari_server.setupSso.is_server_runing") def test_invalid_sso_enabled_cli_option_should_result_in_error(self, is_server_runing_mock, get_silent_mock): - out = StringIO.StringIO() + out = io.StringIO() sys.stdout = out is_server_runing_mock.return_value = (True, 0) @@ -139,7 +140,7 @@ def test_invalid_sso_enabled_cli_option_should_result_in_error(self, is_server_r @patch("ambari_server.setupSso.get_silent") @patch("ambari_server.setupSso.is_server_runing") def test_missing_sso_provider_url_cli_option_when_enabling_sso_should_result_in_error(self, is_server_runing_mock, get_silent_mock): - out = StringIO.StringIO() + out = io.StringIO() sys.stdout = out is_server_runing_mock.return_value = (True, 0) @@ -162,7 +163,7 @@ def test_missing_sso_provider_url_cli_option_when_enabling_sso_should_result_in_ @patch("ambari_server.setupSso.get_silent") @patch("ambari_server.setupSso.is_server_runing") def test_missing_sso_public_cert_file_cli_option_when_enabling_sso_should_result_in_error(self, is_server_runing_mock, get_silent_mock): - out = StringIO.StringIO() + out = io.StringIO() sys.stdout = out is_server_runing_mock.return_value = (True, 0) @@ -185,7 +186,7 @@ def test_missing_sso_public_cert_file_cli_option_when_enabling_sso_should_result @patch("ambari_server.setupSso.get_silent") @patch("ambari_server.setupSso.is_server_runing") def test_invalid_sso_provider_url_cli_option_when_enabling_sso_should_result_in_error(self, is_server_runing_mock, get_silent_mock): - out = StringIO.StringIO() + out = io.StringIO() sys.stdout = out is_server_runing_mock.return_value = (True, 0) @@ -226,14 +227,14 @@ def test_invalid_sso_provider_url_cli_option_when_enabling_sso_should_result_in_ @patch("ambari_server.setupSso.get_silent") @patch("ambari_server.setupSso.is_server_runing") @patch("ambari_server.setupSso.get_json_via_rest_api") - @patch('__builtin__.open') + @patch('builtins.open') def test_all_cli_options_are_collected_when_enabling_sso(self, open_mock, get_json_via_rest_api_mock, is_server_runing_mock, get_silent_mock, get_ambari_properties_mock, perform_changes_via_rest_api_mock): - out = StringIO.StringIO() + out = io.StringIO() sys.stdout = out certificate_data = '-----BEGIN CERTIFICATE-----\n' \ @@ -289,14 +290,14 @@ def test_all_cli_options_are_collected_when_enabling_sso(self, open_mock, @patch("ambari_server.setupSso.get_silent") @patch("ambari_server.setupSso.is_server_runing") @patch("ambari_server.setupSso.get_json_via_rest_api") - @patch('__builtin__.open') + @patch('builtins.open') def test_only_sso_enabled_cli_option_is_collected_when_disabling_sso(self, open_mock, get_json_via_rest_api_mock, is_server_runing_mock, get_silent_mock, get_ambari_properties_mock, perform_changes_via_rest_api_mock): - out = StringIO.StringIO() + out = io.StringIO() sys.stdout = out certificate_data = '-----BEGIN CERTIFICATE-----\n' \ @@ -345,7 +346,7 @@ def test_only_sso_enabled_cli_option_is_collected_when_disabling_sso(self, open_ @patch("ambari_server.setupSso.get_silent") @patch("ambari_server.setupSso.is_server_runing") @patch("ambari_server.setupSso.get_json_via_rest_api") - @patch('__builtin__.open') + @patch('builtins.open') def test_sso_is_enabled_for_all_services_via_user_input(self, open_mock, get_json_via_rest_api_mock, is_server_runing_mock, @@ -353,7 +354,7 @@ def test_sso_is_enabled_for_all_services_via_user_input(self, open_mock, get_ambari_properties_mock, get_YN_input_mock, perform_changes_via_rest_api_mock): - out = StringIO.StringIO() + out = io.StringIO() sys.stdout = out certificate_data = '-----BEGIN CERTIFICATE-----\n' \ @@ -417,13 +418,13 @@ def yn_input_side_effect(*args, **kwargs): pass @patch("ambari_server.setupSso.perform_changes_via_rest_api") - @patch("urllib2.urlopen") + @patch("urllib.request.urlopen") @patch("ambari_server.setupSso.get_cluster_name") @patch("ambari_server.setupSso.get_YN_input") @patch("ambari_server.setupSso.get_ambari_properties") @patch("ambari_server.setupSso.get_silent") @patch("ambari_server.setupSso.is_server_runing") - @patch('__builtin__.open') + @patch('builtins.open') def test_setup_sso_should_not_fail_when_sso_config_cannot_be_loaded_due_to_404_error(self, open_mock, is_server_runing_mock, get_silent_mock, @@ -432,7 +433,7 @@ def test_setup_sso_should_not_fail_when_sso_config_cannot_be_loaded_due_to_404_e get_cluster_name_mock, urlopen_mock, perform_changes_via_rest_api_mock): - out = StringIO.StringIO() + out = io.StringIO() sys.stdout = out certificate_data = '-----BEGIN CERTIFICATE-----\n' \ @@ -483,7 +484,7 @@ def test_setup_sso_should_not_fail_when_sso_config_cannot_be_loaded_due_to_404_e self.assertEqual(ssoProperties[SSO_ENABLED_SERVICES], "*") - @patch("urllib2.urlopen") + @patch("urllib.request.urlopen") @patch("ambari_server.setupSso.perform_changes_via_rest_api") @patch("ambari_server.setupSso.get_cluster_name") @patch("ambari_server.setupSso.get_YN_input") @@ -491,7 +492,7 @@ def test_setup_sso_should_not_fail_when_sso_config_cannot_be_loaded_due_to_404_e @patch("ambari_server.setupSso.get_silent") @patch("ambari_server.setupSso.is_server_runing") @patch("ambari_server.setupSso.get_json_via_rest_api") - @patch('__builtin__.open') + @patch('builtins.open') def test_sso_enabled_services_are_collected_via_user_input(self, open_mock, get_json_via_rest_api_mock, is_server_runing_mock, @@ -501,7 +502,7 @@ def test_sso_enabled_services_are_collected_via_user_input(self, open_mock, get_cluster_name_mock, perform_changes_via_rest_api_mock, urlopen_mock): - out = StringIO.StringIO() + out = io.StringIO() sys.stdout = out certificate_data = '-----BEGIN CERTIFICATE-----\n' \ @@ -621,4 +622,3 @@ def _create_empty_options_mock(self): options.sso_jwt_cookie_name = None options.sso_jwt_audience_list = None return options - \ No newline at end of file diff --git a/ambari-server/src/test/python/TestSetupTrustedProxy.py b/ambari-server/src/test/python/TestSetupTrustedProxy.py index 2d4205b43cf..cfdfa716537 100644 --- a/ambari-server/src/test/python/TestSetupTrustedProxy.py +++ b/ambari-server/src/test/python/TestSetupTrustedProxy.py @@ -17,16 +17,17 @@ ''' import os +import distro import platform import sys import unittest -import StringIO +import io from mock.mock import patch, MagicMock from only_for_platform import os_distro_value from ambari_commons import os_utils -from urllib2 import HTTPError +from urllib.error import HTTPError import shutil @@ -59,16 +60,16 @@ def search_file_proxy(filename, searchpatch, pathsep=os.pathsep): os_utils.search_file = search_file_proxy -with patch.object(platform, "linux_distribution", return_value = MagicMock(return_value=('Redhat', '7.4', 'Final'))): +with patch.object(distro, "linux_distribution", return_value = MagicMock(return_value=('Redhat', '7.4', 'Final'))): with patch("os.path.isdir", return_value = MagicMock(return_value=True)): with patch("os.access", return_value = MagicMock(return_value=True)): with patch.object(os_utils, "parse_log4j_file", return_value={'ambari.log.dir': '/var/log/ambari-server'}): - with patch("platform.linux_distribution", return_value = os_distro_value): + with patch("distro.linux_distribution", return_value = os_distro_value): with patch("os.symlink"): with patch.object(os_utils, "is_service_exist", return_value = True): with patch("glob.glob", return_value = ['/etc/init.d/postgresql-9.3']): _ambari_server_ = __import__('ambari-server') - with patch("__builtin__.open"): + with patch("builtins.open"): from ambari_commons.exceptions import FatalException, NonFatalException from ambari_server.properties import Properties from ambari_server.setupTrustedProxy import setup_trusted_proxy, TPROXY_SUPPORT_ENABLED, PROXYUSER_HOSTS, PROXYUSER_USERS, PROXYUSER_GROUPS @@ -77,7 +78,7 @@ class TestSetupTrustedProxy(unittest.TestCase): @patch("ambari_server.setupTrustedProxy.is_server_runing") def test_tproxy_setup_should_fail_if_server_is_not_running(self, is_server_runing_mock): - out = StringIO.StringIO() + out = io.StringIO() sys.stdout = out is_server_runing_mock.return_value = (False, 0) @@ -97,7 +98,7 @@ def test_tproxy_setup_should_fail_if_server_is_not_running(self, is_server_runin @patch("ambari_server.setupTrustedProxy.get_silent") @patch("ambari_server.setupTrustedProxy.is_server_runing") def test_silent_mode_is_not_allowed(self, is_server_runing_mock, get_silent_mock): - out = StringIO.StringIO() + out = io.StringIO() sys.stdout = out is_server_runing_mock.return_value = (True, 0) @@ -118,7 +119,7 @@ def test_silent_mode_is_not_allowed(self, is_server_runing_mock, get_silent_mock @patch("ambari_server.setupTrustedProxy.get_silent") @patch("ambari_server.setupTrustedProxy.is_server_runing") def test_invalid_tproxy_enabled_cli_option_should_result_in_error(self, is_server_runing_mock, get_silent_mock): - out = StringIO.StringIO() + out = io.StringIO() sys.stdout = out is_server_runing_mock.return_value = (True, 0) @@ -146,7 +147,7 @@ def test_invalid_tproxy_enabled_cli_option_should_result_in_error(self, is_serve @patch("ambari_server.setupTrustedProxy.get_json_via_rest_api") def test_tproxy_is_enabled_for_two_proxy_users(self, get_json_via_rest_api_mock, is_server_runing_mock, get_silent_mock, get_ambari_properties_mock, get_validated_string_input_mock, get_YN_input_mock, perform_changes_via_rest_api_mock): - out = StringIO.StringIO() + out = io.StringIO() sys.stdout = out get_json_via_rest_api_mock.return_value = (200, {}) @@ -199,7 +200,7 @@ def test_tproxy_is_enabled_for_two_proxy_users(self, get_json_via_rest_api_mock, @patch("ambari_server.setupTrustedProxy.is_server_runing") @patch("ambari_server.setupTrustedProxy.get_json_via_rest_api") def test_disabling_tproxy_support(self, get_json_via_rest_api_mock, is_server_runing_mock, get_silent_mock, get_ambari_properties_mock, perform_changes_via_rest_api_mock): - out = StringIO.StringIO() + out = io.StringIO() sys.stdout = out get_json_via_rest_api_mock.return_value = (200, {}) @@ -229,7 +230,7 @@ def test_disabling_tproxy_support(self, get_json_via_rest_api_mock, is_server_ru @patch("ambari_server.setupTrustedProxy.is_server_runing") @patch("os.path.isfile") def test_enable_tproxy_support_using_configuration_file_path_from_command_line_should_fail_if_file_does_not_exist(self, isfile_mock, is_server_runing_mock, get_silent_mock): - out = StringIO.StringIO() + out = io.StringIO() sys.stdout = out is_server_runing_mock.return_value = (True, 0) @@ -257,9 +258,9 @@ def test_enable_tproxy_support_using_configuration_file_path_from_command_line_s @patch("ambari_server.setupTrustedProxy.is_server_runing") @patch("ambari_server.setupTrustedProxy.get_json_via_rest_api") @patch("os.path.isfile") - @patch('__builtin__.open') + @patch('builtins.open') def test_enable_tproxy_support_using_configuration_file_path_from_command_line(self, open_mock, isfile_mock, get_json_via_rest_api_mock, is_server_runing_mock, get_silent_mock, get_ambari_properties_mock, perform_changes_via_rest_api_mock): - out = StringIO.StringIO() + out = io.StringIO() sys.stdout = out get_json_via_rest_api_mock.return_value = (200, {}) diff --git a/ambari-server/src/test/python/TestStackAdvisor.py b/ambari-server/src/test/python/TestStackAdvisor.py index 1f3bd97d81d..ea0f85d31df 100644 --- a/ambari-server/src/test/python/TestStackAdvisor.py +++ b/ambari-server/src/test/python/TestStackAdvisor.py @@ -39,11 +39,11 @@ def test_stackAdvisorLoadedForNotHDPStack(self): path_template = os.path.join(self.test_directory, '../resources/stacks/{0}/{1}/services/stack_advisor.py') path_template_name = "STACK_ADVISOR_IMPL_PATH_TEMPLATE" setattr(self.stack_advisor, path_template_name, path_template) - self.assertEquals(path_template, getattr(self.stack_advisor, path_template_name)) + self.assertEqual(path_template, getattr(self.stack_advisor, path_template_name)) instantiate_stack_advisor_method_name = 'instantiateStackAdvisor' instantiate_stack_advisor_method = getattr(self.stack_advisor, instantiate_stack_advisor_method_name) stack_advisor = instantiate_stack_advisor_method("XYZ", "1.0.1", ["1.0.0"]) - self.assertEquals("XYZ101StackAdvisor", stack_advisor.__class__.__name__) + self.assertEqual("XYZ101StackAdvisor", stack_advisor.__class__.__name__) services = { "Versions": { @@ -89,14 +89,14 @@ def test_stackAdvisorLoadedForNotHDPStack(self): config_recommendations = stack_advisor.recommendConfigurations(services, hosts) yarn_configs = config_recommendations["recommendations"]["blueprint"]["configurations"]["yarn-site"]["properties"] '''Check that value is populated from child class, not parent''' - self.assertEquals("-Xmx101m", yarn_configs["yarn.nodemanager.resource.memory-mb"]) + self.assertEqual("-Xmx101m", yarn_configs["yarn.nodemanager.resource.memory-mb"]) def test_stackAdvisorDefaultImpl(self): instantiate_stack_advisor_method_name = 'instantiateStackAdvisor' instantiate_stack_advisor_method = getattr(self.stack_advisor, instantiate_stack_advisor_method_name) '''Not existent stack - to return default implementation''' default_stack_advisor = instantiate_stack_advisor_method("HDP1", "2.0.6", []) - self.assertEquals("DefaultStackAdvisor", default_stack_advisor.__class__.__name__) + self.assertEqual("DefaultStackAdvisor", default_stack_advisor.__class__.__name__) services = { "Versions": { @@ -302,8 +302,8 @@ def test_stackAdvisorDefaultImpl(self): "Versions": {"stack_name": "HDP1", "stack_version": "2.0.6"}, "items": [] } - self.assertEquals(actualValidateConfigResponse, expectedValidationResponse) - self.assertEquals(actualValidateLayoutResponse, expectedValidationResponse) + self.assertEqual(actualValidateConfigResponse, expectedValidationResponse) + self.assertEqual(actualValidateLayoutResponse, expectedValidationResponse) actualRecommendConfigResponse = default_stack_advisor.recommendConfigurations(services, hosts) expectedRecommendConfigResponse = { "Versions": {"stack_name": "HDP1", "stack_version": "2.0.6"}, @@ -319,7 +319,7 @@ def test_stackAdvisorDefaultImpl(self): } } } - self.assertEquals(actualRecommendConfigResponse, expectedRecommendConfigResponse) + self.assertEqual(actualRecommendConfigResponse, expectedRecommendConfigResponse) actualRecommendLayoutResponse = default_stack_advisor.recommendComponentLayout(services, hosts) expectedRecommendLayoutResponse = { "Versions": {"stack_name": "HDP1", "stack_version": "2.0.6"}, @@ -329,11 +329,11 @@ def test_stackAdvisorDefaultImpl(self): "blueprint": { "host_groups": [ { - "name": "host-group-1", + "name": "host-group-2", "components": [] }, { - "name": "host-group-2", + "name": "host-group-1", "components": [ {"name": "GANGLIA_SERVER"}, {"name": "HBASE_MASTER"}, @@ -349,18 +349,18 @@ def test_stackAdvisorDefaultImpl(self): { "host_groups": [ { - "name": "host-group-1", + "name": "host-group-2", "hosts": [{"fqdn": "host2"}] }, { - "name": "host-group-2", + "name": "host-group-1", "hosts": [{"fqdn": "host1"}] } ] } } } - self.assertEquals(actualRecommendLayoutResponse, expectedRecommendLayoutResponse) + self.assertEqual(actualRecommendLayoutResponse, expectedRecommendLayoutResponse) # Test with maintenance_state. One host is in maintenance mode. hosts= { @@ -420,7 +420,7 @@ def test_stackAdvisorDefaultImpl(self): "hosts": ["host1"], "Versions": {"stack_name": "HDP1", "stack_version": "2.0.6"} } - self.assertEquals(actualRecommendLayoutResponse, expectedRecommendLayoutResponse) + self.assertEqual(actualRecommendLayoutResponse, expectedRecommendLayoutResponse) # Test with maintenance_state. Both hosts are in maintenance mode. hosts= { @@ -464,7 +464,7 @@ def test_stackAdvisorDefaultImpl(self): } } - self.assertEquals(actualRecommendLayoutResponse, expectedRecommendLayoutResponse) + self.assertEqual(actualRecommendLayoutResponse, expectedRecommendLayoutResponse) # Config groups support by default services["config-groups"] = [{ @@ -500,7 +500,7 @@ def test_stackAdvisorDefaultImpl(self): } } } - self.assertEquals(actualConfigGroupRecommendConfigResponse, expectedConfigGroupRecommendConfigResponse) + self.assertEqual(actualConfigGroupRecommendConfigResponse, expectedConfigGroupRecommendConfigResponse) services = { "services": [ @@ -636,4 +636,4 @@ def test_stackAdvisorDefaultImpl(self): {'name': 'mapreduce.map.memory.mb', 'type': 'mapred-site'}, {'name': 'mapreduce.reduce.memory.mb', 'type': 'mapred-site'}] - self.assertEquals(properties_dict, expected_properties_dict) \ No newline at end of file + self.assertEqual(properties_dict, expected_properties_dict) \ No newline at end of file diff --git a/ambari-server/src/test/python/TestUtils.py b/ambari-server/src/test/python/TestUtils.py index 268d7e968a6..f1eabf8c013 100644 --- a/ambari-server/src/test/python/TestUtils.py +++ b/ambari-server/src/test/python/TestUtils.py @@ -16,7 +16,7 @@ limitations under the License. ''' -import StringIO +import io import sys from unittest import TestCase from mock.mock import patch, MagicMock @@ -62,13 +62,13 @@ def test_locate_file(self, isfile_mock): utils.ENV_PATH = ['/test'] # File was found in the path isfile_mock.return_value = True - self.assertEquals('/test/myfile', utils.locate_file('myfile')) + self.assertEqual('/test/myfile', utils.locate_file('myfile')) # File not found in the path isfile_mock.return_value = False - self.assertEquals('myfile', utils.locate_file('myfile')) + self.assertEqual('myfile', utils.locate_file('myfile')) # Testing default vaule isfile_mock.return_value = False - self.assertEquals('/tmp/myfile', utils.locate_file('myfile', '/tmp')) + self.assertEqual('/tmp/myfile', utils.locate_file('myfile', '/tmp')) @patch('os.path.exists') @patch('os.path.join') @@ -78,7 +78,7 @@ def test_pid_exists(self, path_join_mock, path_exists_mock): self.assertTrue(utils.pid_exists('1')) @patch('time.time') - @patch('__builtin__.open') + @patch('builtins.open') @patch('time.sleep') @patch('os.listdir') @patch('os.path.join') @@ -98,14 +98,14 @@ def test_obj(): get_symlink_path_mock.return_value = "/symlinkpath" time_mock.side_effect = [0, 0, 0, 0, 0, 0, 6] - out = StringIO.StringIO() + out = io.StringIO() sys.stdout = out r = utils.looking_for_pid("test args", 5) self.assertEqual(".....", out.getvalue()) sys.stdout = sys.__stdout__ - self.assertEquals(len(r), 1) - self.assertEquals(r[0], { + self.assertEqual(len(r), 1) + self.assertEqual(r[0], { "pid": "1000", "exe": "/symlinkpath", "cmd": "test args" @@ -118,14 +118,14 @@ def test_obj(): def test_get_symlink_path(self, readlink_mock, dirname_mock, join_mock, normpath_mock): normpath_mock.return_value = "test value" - self.assertEquals(utils.get_symlink_path("/"), "test value") + self.assertEqual(utils.get_symlink_path("/"), "test value") @patch.object(utils, 'pid_exists') - @patch('__builtin__.open') + @patch('builtins.open') @patch('os.kill') def test_save_main_pid_ex(self, kill_mock, open_mock, pid_exists_mock): def test_write(data): - self.assertEquals(data, "222\n") + self.assertEqual(data, "222\n") def test_close(): pass @@ -147,12 +147,12 @@ def test_obj(): "cmd": "" }, ], "/pidfile", ["/exe1"]) - self.assertEquals(open_mock.call_count, 1) - self.assertEquals(pid_exists_mock.call_count, 4) - self.assertEquals(kill_mock.call_count, 1) + self.assertEqual(open_mock.call_count, 1) + self.assertEqual(pid_exists_mock.call_count, 4) + self.assertEqual(kill_mock.call_count, 1) @patch('os.path.isfile') - @patch('__builtin__.open') + @patch('builtins.open') @patch('os.remove') def test_check_exitcode(self, remove_mock, open_mock, isfile_mock): def test_read(): @@ -169,7 +169,7 @@ def test_obj(): open_mock.return_value = test_obj isfile_mock.return_value = True - self.assertEquals(utils.check_exitcode("/tmp/nofile"), 777) + self.assertEqual(utils.check_exitcode("/tmp/nofile"), 777) def test_format_with_reload(self): @@ -192,32 +192,32 @@ def test_format_with_reload(self): # make sure local variables and env variables work message = "{foo} {bar} {envfoo} {envbar}" formatted_message = format(message) - self.assertEquals("foo1 bar1 env-foo1 env-bar1", formatted_message) + self.assertEqual("foo1 bar1 env-foo1 env-bar1", formatted_message) # try the same thing with an instance; we pass in keyword args to be # combined with the env params formatter = ConfigurationFormatter() formatted_message = formatter.format(message, foo="foo2", bar="bar2") - self.assertEquals("foo2 bar2 env-foo1 env-bar1", formatted_message) + self.assertEqual("foo2 bar2 env-foo1 env-bar1", formatted_message) # now supply keyword args to override env params formatted_message = formatter.format(message, envfoo="foobar", envbar="foobarbaz", foo="foo3", bar="bar3") - self.assertEquals("foo3 bar3 foobar foobarbaz", formatted_message) + self.assertEqual("foo3 bar3 foobar foobarbaz", formatted_message) def test_compare_versions(self): - self.assertEquals(utils.compare_versions("1.7.0", "2.0.0"), -1) - self.assertEquals(utils.compare_versions("2.0.0", "2.0.0"), 0) - self.assertEquals(utils.compare_versions("2.1.0", "2.0.0"), 1) - - self.assertEquals(utils.compare_versions("1.7.0_abc", "2.0.0-abc"), -1) - self.assertEquals(utils.compare_versions("2.0.0.abc", "2.0.0_abc"), 0) - self.assertEquals(utils.compare_versions("2.1.0-abc", "2.0.0.abc"), 1) - - self.assertEquals(utils.compare_versions("2.1.0-1","2.0.0-2"),1) - self.assertEquals(utils.compare_versions("2.0.0_1","2.0.0-2"),0) - self.assertEquals(utils.compare_versions("2.0.0-1","2.0.0-2"),0) - self.assertEquals(utils.compare_versions("2.0.0_1","2.0.0_2"),0) - self.assertEquals(utils.compare_versions("2.0.0-abc","2.0.0_abc"),0) + self.assertEqual(utils.compare_versions("1.7.0", "2.0.0"), -1) + self.assertEqual(utils.compare_versions("2.0.0", "2.0.0"), 0) + self.assertEqual(utils.compare_versions("2.1.0", "2.0.0"), 1) + + self.assertEqual(utils.compare_versions("1.7.0_abc", "2.0.0-abc"), -1) + self.assertEqual(utils.compare_versions("2.0.0.abc", "2.0.0_abc"), 0) + self.assertEqual(utils.compare_versions("2.1.0-abc", "2.0.0.abc"), 1) + + self.assertEqual(utils.compare_versions("2.1.0-1","2.0.0-2"),1) + self.assertEqual(utils.compare_versions("2.0.0_1","2.0.0-2"),0) + self.assertEqual(utils.compare_versions("2.0.0-1","2.0.0-2"),0) + self.assertEqual(utils.compare_versions("2.0.0_1","2.0.0_2"),0) + self.assertEqual(utils.compare_versions("2.0.0-abc","2.0.0_abc"),0) class FakeProperties(object): def __init__(self, prop_map): diff --git a/ambari-server/src/test/python/TestValidateConfigs.py b/ambari-server/src/test/python/TestValidateConfigs.py index 427f02e0284..f26f22927a1 100644 --- a/ambari-server/src/test/python/TestValidateConfigs.py +++ b/ambari-server/src/test/python/TestValidateConfigs.py @@ -39,22 +39,22 @@ def test_check_users(self, geteuid_mock): "component_configurations/NAMENODE/hadoop-env/hdfs_user" : "root", "component_configurations/NAMENODE/hadoop-env/user_group" : "root" } - self.assertEquals(vc.check_users(params), True) + self.assertEqual(vc.check_users(params), True) params = { "component_configurations/NAMENODE/hadoop-env/hdfs_user" : "root", "component_configurations/NAMENODE/hadoop-env/user_group" : "wrong_group" } - self.assertEquals(vc.check_users(params), False) + self.assertEqual(vc.check_users(params), False) params = { "component_configurations/NAMENODE/hadoop-env/hdfs_user" : "wrong_user", "component_configurations/NAMENODE/hadoop-env/user_group" : "root" } - self.assertEquals(vc.check_users(params), False) + self.assertEqual(vc.check_users(params), False) params = { "component_configurations/NAMENODE/hadoop-env/hdfs_user" : "wrong_user", "component_configurations/NAMENODE/hadoop-env/user_group" : "wrong_group" } - self.assertEquals(vc.check_users(params), False) + self.assertEqual(vc.check_users(params), False) def test_check_user_in_group(self): vc = ValidateConfigs() @@ -103,7 +103,7 @@ def test_flatten_dict(self): vc = ValidateConfigs() - self.assertEquals(vc.flatten_dict(init_dict, prefix="prefix"), result_list) + self.assertEqual(vc.flatten_dict(init_dict, prefix="prefix"), sorted(result_list)) def test_get_value(self): @@ -114,7 +114,7 @@ def test_get_value(self): vc = ValidateConfigs() - self.assertEquals(vc.get_value("component_configurations/NAMENODE/hadoop-env/hdfs_user", params), 'root') - self.assertEquals(vc.get_value("component_configurations/NAMENODE/hadoop-env/user_group", params), 'root') + self.assertEqual(vc.get_value("component_configurations/NAMENODE/hadoop-env/hdfs_user", params), 'root') + self.assertEqual(vc.get_value("component_configurations/NAMENODE/hadoop-env/user_group", params), 'root') diff --git a/ambari-server/src/test/python/TestVersion.py b/ambari-server/src/test/python/TestVersion.py index d08cfbb260f..c42ea4a5fb3 100644 --- a/ambari-server/src/test/python/TestVersion.py +++ b/ambari-server/src/test/python/TestVersion.py @@ -65,6 +65,9 @@ def test_comparison(self): versions = range(1000, 3000, 7) versions = [".".join(list(str(elem))) for elem in versions] + def cmp(a, b): + return (a > b) - (a < b) + for idx, x in enumerate(versions): for idy, y in enumerate(versions): # Expected value will either be -1, 0, 1, and it relies on the fact @@ -198,7 +201,7 @@ def test_get_current_component_version(self, get_config_mock, get_role_component version = self.version_module.get_current_component_version() self.assertFalse(get_role_component_current_stack_version_mock.called) - self.assertEquals(ver1, version) + self.assertEqual(ver1, version) # case 2. version not come with commands params but repository is resolved get_role_component_current_stack_version_mock.reset_mock() @@ -206,7 +209,7 @@ def test_get_current_component_version(self, get_config_mock, get_role_component version = self.version_module.get_current_component_version() self.assertFalse(get_role_component_current_stack_version_mock.called) - self.assertEquals(ver2, version) + self.assertEqual(ver2, version) # case 3. same as case 2 but repository is not resolved get_role_component_current_stack_version_mock.reset_mock() diff --git a/ambari-server/src/test/python/TestVersionSelectUtil.py b/ambari-server/src/test/python/TestVersionSelectUtil.py index 82985fa92b0..ed7549f055b 100644 --- a/ambari-server/src/test/python/TestVersionSelectUtil.py +++ b/ambari-server/src/test/python/TestVersionSelectUtil.py @@ -36,7 +36,7 @@ def setUp(self): with open(test_file_path, 'rb') as fp: self.module = imp.load_module('module', fp, test_file_path, ('.py', 'rb', imp.PY_SOURCE)) - @patch('__builtin__.open') + @patch('builtins.open') @patch("resource_management.core.shell.call") @patch('os.path.exists') @patch("resource_management.libraries.functions.stack_tools.get_stack_tool") @@ -80,25 +80,25 @@ def read(self): # Missing stack name version = self.module.get_component_version_from_symlink(None, "hadoop-hdfs-datanode") - self.assertEquals(version, None) + self.assertEqual(version, None) # Missing component name version = self.module.get_component_version_from_symlink("HDP", None) - self.assertEquals(version, None) + self.assertEqual(version, None) # Invalid stack name version = self.module.get_component_version_from_symlink("StackDoesNotExist", "hadoop-hdfs-datanode") - self.assertEquals(version, None) + self.assertEqual(version, None) # Invalid component name version = self.module.get_component_version_from_symlink("HDP", "hadoop-nonexistent-component-name") - self.assertEquals(version, None) + self.assertEqual(version, None) # Pass version = self.module.get_component_version_from_symlink("HDP", "hadoop-hdfs-namenode") - self.assertEquals(version, stack_expected_version) + self.assertEqual(version, stack_expected_version) version = self.module.get_component_version_from_symlink("HDP", "hadoop-hdfs-datanode") - self.assertEquals(version, stack_expected_version) + self.assertEqual(version, stack_expected_version) - @patch('__builtin__.open') + @patch('builtins.open') @patch("resource_management.core.shell.call") @patch('os.path.exists') @patch("resource_management.libraries.functions.stack_tools.get_stack_tool") @@ -134,6 +134,6 @@ def read(self): # Pass version = self.module.get_component_version_from_symlink("HDP", "hive-server2") - self.assertEquals(version, stack_expected_version) + self.assertEqual(version, stack_expected_version) version = self.module.get_component_version_from_symlink("HDP", "zookeeper-server") - self.assertEquals(version, stack_expected_version) + self.assertEqual(version, stack_expected_version) diff --git a/ambari-server/src/test/python/TestYAMLUtils.py b/ambari-server/src/test/python/TestYAMLUtils.py index 4d2d0354efd..245c29f2950 100644 --- a/ambari-server/src/test/python/TestYAMLUtils.py +++ b/ambari-server/src/test/python/TestYAMLUtils.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -31,36 +31,36 @@ def test_convert_yaml_array(self): expected_values.append("c6401.ambari.apache.org") values = yaml_utils.get_values_from_yaml_array("['c6401.ambari.apache.org']") - self.assertEquals(expected_values, values) + self.assertEqual(expected_values, values) expected_values.append("c6402.ambari.apache.org") values = yaml_utils.get_values_from_yaml_array("['c6401.ambari.apache.org', 'c6402.ambari.apache.org']") - self.assertEquals(expected_values, values) + self.assertEqual(expected_values, values) values = yaml_utils.get_values_from_yaml_array('["c6401.ambari.apache.org", "c6402.ambari.apache.org"]') - self.assertEquals(expected_values, values) + self.assertEqual(expected_values, values) values = yaml_utils.get_values_from_yaml_array('[\'c6401.ambari.apache.org\', "c6402.ambari.apache.org"]') - self.assertEquals(expected_values, values) + self.assertEqual(expected_values, values) def test_yaml_property_escaping(self): """ Tests that YAML values are escaped with quotes properly when needed """ - self.assertEquals("True", yaml_utils.escape_yaml_property("True")) - self.assertEquals("FALSE", yaml_utils.escape_yaml_property("FALSE")) - self.assertEquals("yes", yaml_utils.escape_yaml_property("yes")) - self.assertEquals("NO", yaml_utils.escape_yaml_property("NO")) - self.assertEquals("28", yaml_utils.escape_yaml_property("28")) - self.assertEquals("28.0", yaml_utils.escape_yaml_property("28.0")) - self.assertEquals("[a,b,c]", yaml_utils.escape_yaml_property("[a,b,c]")) - self.assertEquals("{ foo : bar }", yaml_utils.escape_yaml_property("{ foo : bar }")) + self.assertEqual("True", yaml_utils.escape_yaml_property("True")) + self.assertEqual("FALSE", yaml_utils.escape_yaml_property("FALSE")) + self.assertEqual("yes", yaml_utils.escape_yaml_property("yes")) + self.assertEqual("NO", yaml_utils.escape_yaml_property("NO")) + self.assertEqual("28", yaml_utils.escape_yaml_property("28")) + self.assertEqual("28.0", yaml_utils.escape_yaml_property("28.0")) + self.assertEqual("[a,b,c]", yaml_utils.escape_yaml_property("[a,b,c]")) + self.assertEqual("{ foo : bar }", yaml_utils.escape_yaml_property("{ foo : bar }")) # some strings which should be escaped - self.assertEquals("'5f'", yaml_utils.escape_yaml_property("5f")) - self.assertEquals("'28.O'", yaml_utils.escape_yaml_property("28.O")) - self.assertEquals("'This is a test of a string'", yaml_utils.escape_yaml_property("This is a test of a string")) + self.assertEqual("'5f'", yaml_utils.escape_yaml_property("5f")) + self.assertEqual("'28.O'", yaml_utils.escape_yaml_property("28.O")) + self.assertEqual("'This is a test of a string'", yaml_utils.escape_yaml_property("This is a test of a string")) # test maps map = """ diff --git a/ambari-server/src/test/python/custom_actions/TestCheckHost.py b/ambari-server/src/test/python/custom_actions/TestCheckHost.py index 108f81c6a20..c01183ba06f 100644 --- a/ambari-server/src/test/python/custom_actions/TestCheckHost.py +++ b/ambari-server/src/test/python/custom_actions/TestCheckHost.py @@ -22,7 +22,7 @@ import json import os import socket -from ambari_commons import subprocess32 +import subprocess from ambari_commons import inet_utils, OSCheck from resource_management import Script, ConfigDictionary from resource_management.core.exceptions import Fail @@ -57,7 +57,7 @@ def testJavaHomeAvailableCheck(self, structured_out_mock, get_tmp_dir_mock, mock checkHost = CheckHost() checkHost.actionexecute(None) - self.assertEquals(structured_out_mock.call_args[0][0], {'java_home_check': {'message': 'Java home exists!', + self.assertEqual(structured_out_mock.call_args[0][0], {'java_home_check': {'message': 'Java home exists!', 'exit_code': 0}}) # test, java home doesn't exist os_isfile_mock.reset_mock() @@ -65,7 +65,7 @@ def testJavaHomeAvailableCheck(self, structured_out_mock, get_tmp_dir_mock, mock checkHost.actionexecute(None) - self.assertEquals(structured_out_mock.call_args[0][0], {'java_home_check': {"message": "Java home doesn't exist!", + self.assertEqual(structured_out_mock.call_args[0][0], {'java_home_check': {"message": "Java home doesn't exist!", "exit_code" : 1}}) @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) @@ -102,7 +102,7 @@ def testDBConnectionCheck(self, shell_call_mock, isfile_mock, format_mock, struc except Fail: pass - self.assertEquals(structured_out_mock.call_args[0][0], {'db_connection_check': {'message': 'Error downloading ' \ + self.assertEqual(structured_out_mock.call_args[0][0], {'db_connection_check': {'message': 'Error downloading ' \ 'DBConnectionVerification.jar from Ambari Server resources. Check network access to Ambari ' \ 'Server.\ntest exception', 'exit_code': 1}}) @@ -129,12 +129,12 @@ def testDBConnectionCheck(self, shell_call_mock, isfile_mock, format_mock, struc except Fail: pass - self.assertEquals(format_mock.call_args[0][0], 'Error: Ambari Server cannot download the database JDBC driver ' + self.assertEqual(format_mock.call_args[0][0], 'Error: Ambari Server cannot download the database JDBC driver ' 'and is unable to test the database connection. You must run ambari-server setup ' '--jdbc-db={db_name} --jdbc-driver=/path/to/your/{db_name}/driver.jar on the Ambari ' 'Server host to make the JDBC driver available for download and to enable testing ' 'the database connection.\n') - self.assertEquals(structured_out_mock.call_args[0][0]['db_connection_check']['exit_code'], 1) + self.assertEqual(structured_out_mock.call_args[0][0]['db_connection_check']['exit_code'], 1) # test, no connection to remote db mock_config.return_value = {"commandParams" : {"check_execute_list" : "db_connection_check", @@ -159,9 +159,9 @@ def testDBConnectionCheck(self, shell_call_mock, isfile_mock, format_mock, struc except Fail: pass - self.assertEquals(structured_out_mock.call_args[0][0], {'db_connection_check': {'message': 'test message', + self.assertEqual(structured_out_mock.call_args[0][0], {'db_connection_check': {'message': 'test message', 'exit_code': 1}}) - self.assertEquals(format_mock.call_args[0][0],'{java_exec} -cp {check_db_connection_path}{class_path_delimiter}' + self.assertEqual(format_mock.call_args[0][0],'{java_exec} -cp {check_db_connection_path}{class_path_delimiter}' '{jdbc_jar_path} -Djava.library.path={java_library_path} org.apache.ambari.server.DBConnectionVerification' ' "{db_connection_url}" "{user_name}" {user_passwd!p} {jdbc_driver_class}') @@ -172,7 +172,7 @@ def testDBConnectionCheck(self, shell_call_mock, isfile_mock, format_mock, struc checkHost.actionexecute(None) - self.assertEquals(structured_out_mock.call_args[0][0], {'db_connection_check': + self.assertEqual(structured_out_mock.call_args[0][0], {'db_connection_check': {'message': 'DB connection check completed successfully!', 'exit_code': 0}}) #test jdk_name and java home are not available @@ -195,7 +195,7 @@ def testDBConnectionCheck(self, shell_call_mock, isfile_mock, format_mock, struc except Fail: pass - self.assertEquals(structured_out_mock.call_args[0][0], {'db_connection_check': {'message': 'Custom java is not ' \ + self.assertEqual(structured_out_mock.call_args[0][0], {'db_connection_check': {'message': 'Custom java is not ' \ 'available on host. Please install it. Java home should be the same as on server. \n', 'exit_code': 1}}) pass @@ -234,16 +234,16 @@ def testHostResolution(self, structured_out_mock, get_tmp_dir_mock, mock_config, structured_out_mock.assert_called_with({'host_resolution_check': {'failures': [ - {'cause': (), 'host': u'c6401.ambari.apache.org', 'type': 'FORWARD_LOOKUP'}, - {'cause': (), 'host': u'c6402.ambari.apache.org', 'type': 'FORWARD_LOOKUP'}, - {'cause': (), 'host': u'c6403.ambari.apache.org', 'type': 'FORWARD_LOOKUP'}, - {'cause': (), 'host': u'foobar', 'type': 'FORWARD_LOOKUP'}, - {'cause': (), 'host': u'!!!', 'type': 'FORWARD_LOOKUP'}], + {'cause': (), 'host': 'c6401.ambari.apache.org', 'type': 'FORWARD_LOOKUP'}, + {'cause': (), 'host': 'c6402.ambari.apache.org', 'type': 'FORWARD_LOOKUP'}, + {'cause': (), 'host': 'c6403.ambari.apache.org', 'type': 'FORWARD_LOOKUP'}, + {'cause': (), 'host': 'foobar', 'type': 'FORWARD_LOOKUP'}, + {'cause': (), 'host': '!!!', 'type': 'FORWARD_LOOKUP'}], 'message': 'There were 5 host(s) that could not resolve to an IP address.', - 'failed_count': 5, 'success_count': 0, 'exit_code': 0, 'hosts_with_failures': [u'c6401.ambari.apache.org', - u'c6402.ambari.apache.org', - u'c6403.ambari.apache.org', - u'foobar', u'!!!']}}) + 'failed_count': 5, 'success_count': 0, 'exit_code': 0, 'hosts_with_failures': ['c6401.ambari.apache.org', + 'c6402.ambari.apache.org', + 'c6403.ambari.apache.org', + 'foobar', '!!!']}}) pass @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) @@ -382,7 +382,7 @@ def testLastAgentEnv(self, time_mock, checkReverseLookup_mock, checkFirewall_moc @patch.object(Script, 'get_tmp_dir') @patch.object(Script, 'get_config') @patch("os.path.isfile") - @patch('__builtin__.open') + @patch('builtins.open') def testTransparentHugePage(self, open_mock, os_path_isfile_mock, mock_config, get_tmp_dir_mock, structured_out_mock, resolve_config_mock): @@ -404,13 +404,13 @@ def testTransparentHugePage(self, open_mock, os_path_isfile_mock, mock_config, checkHost = CheckHost() checkHost.actionexecute(None) - self.assertEquals(structured_out_mock.call_args[0][0], {'transparentHugePage' : {'message': 'never', 'exit_code': 0}}) + self.assertEqual(structured_out_mock.call_args[0][0], {'transparentHugePage' : {'message': 'never', 'exit_code': 0}}) # case 2, file not exists os_path_isfile_mock.return_value = False checkHost.actionexecute(None) - self.assertEquals(structured_out_mock.call_args[0][0], {'transparentHugePage' : {'message': '', 'exit_code': 0}}) + self.assertEqual(structured_out_mock.call_args[0][0], {'transparentHugePage' : {'message': '', 'exit_code': 0}}) @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) @@ -445,14 +445,14 @@ def testUnsupportedDatabaseType(self, isfile_mock, format_mock, structured_out_m except Fail: pass - self.assertEquals(structured_out_mock.call_args[0][0], {'db_connection_check': {'message': '\'unsupported_db\' database type not supported.', 'exit_code': 1}}) + self.assertEqual(structured_out_mock.call_args[0][0], {'db_connection_check': {'message': '\'unsupported_db\' database type not supported.', 'exit_code': 1}}) @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) def testBuildUrl(self, ): checkHost = CheckHost() - self.assertEquals('base_url/path', checkHost.build_url('base_url', 'path')) - self.assertEquals('base_url/path', checkHost.build_url('base_url/', 'path')) - self.assertEquals('base_url/path', checkHost.build_url('base_url/', '/path')) - self.assertEquals('base_url/path', checkHost.build_url('base_url', '/path')) + self.assertEqual('base_url/path', checkHost.build_url('base_url', 'path')) + self.assertEqual('base_url/path', checkHost.build_url('base_url/', 'path')) + self.assertEqual('base_url/path', checkHost.build_url('base_url/', '/path')) + self.assertEqual('base_url/path', checkHost.build_url('base_url', '/path')) diff --git a/ambari-server/src/test/python/custom_actions/TestClearRepoCache.py b/ambari-server/src/test/python/custom_actions/TestClearRepoCache.py index 1cd4a8f8079..656581e1fb1 100644 --- a/ambari-server/src/test/python/custom_actions/TestClearRepoCache.py +++ b/ambari-server/src/test/python/custom_actions/TestClearRepoCache.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-server/src/test/python/custom_actions/TestInstallPackages.py b/ambari-server/src/test/python/custom_actions/TestInstallPackages.py index d373bff8924..cebf1e80361 100644 --- a/ambari-server/src/test/python/custom_actions/TestInstallPackages.py +++ b/ambari-server/src/test/python/custom_actions/TestInstallPackages.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -19,7 +19,7 @@ ''' import json import os -from ambari_commons import subprocess32 +import subprocess import select from stacks.utils.RMFTestCase import * @@ -42,7 +42,7 @@ @patch.object(select, "select", new=MagicMock(return_value=([subproc_stdout], None, None))) @patch("pty.openpty", new = MagicMock(return_value=(1,5))) @patch.object(os, "close", new=MagicMock()) -@patch.object(subprocess32, "Popen", new=subproc_mock) +@patch.object(subprocess, "Popen", new=subproc_mock) class TestInstallPackages(RMFTestCase): def setUp(self): @@ -78,7 +78,7 @@ def test_get_installed_package_version(self): with patch("ambari_commons.shell.subprocess_executor") as checked_call_mock: checked_call_mock.return_value = r expected_version = pkg_manager.get_installed_package_version("test") - self.assertEquals("3.1.0.0-54", expected_version) + self.assertEqual("3.1.0.0-54", expected_version) @patch("ambari_commons.repo_manager.ManagerFactory.get") @@ -125,22 +125,22 @@ def test_normal_flow_rhel(self, os_type=('Redhat', '6.4', 'Final'), ) self.assertTrue(put_structured_out_mock.called) - self.assertEquals(put_structured_out_mock.call_args[0][0], + self.assertEqual(put_structured_out_mock.call_args[0][0], {'package_installation_result': 'SUCCESS', 'repository_version_id': 1, 'actual_version': VERSION_STUB}) self.assertResourceCalled('Repository', 'HDP-UTILS-1.1.0.20', - base_url=u'http://repo1/HDP/centos5/2.x/updates/2.2.0.0', + base_url='http://repo1/HDP/centos5/2.x/updates/2.2.0.0', action=['prepare'], - components=[u'HDP-UTILS', 'main'], + components=['HDP-UTILS', 'main'], repo_template='[{{repo_id}}]\nname={{repo_id}}\n{% if mirror_list %}mirrorlist={{mirror_list}}{% else %}baseurl={{base_url}}{% endif %}\n\npath=/\nenabled=1\ngpgcheck=0', repo_file_name=repo_file_name, mirror_list=None, ) self.assertResourceCalled('Repository', 'HDP-2.2', - base_url=u'http://repo1/HDP/centos5/2.x/updates/2.2.0.0', + base_url='http://repo1/HDP/centos5/2.x/updates/2.2.0.0', action=['prepare'], - components=[u'HDP', 'main'], + components=['HDP', 'main'], repo_template='[{{repo_id}}]\nname={{repo_id}}\n{% if mirror_list %}mirrorlist={{mirror_list}}{% else %}baseurl={{base_url}}{% endif %}\n\npath=/\nenabled=1\ngpgcheck=0', repo_file_name=repo_file_name, mirror_list=None, @@ -196,7 +196,7 @@ def test_no_repos(self, os_type=('Redhat', '6.4', 'Final'), ) except Fail as e: - self.assertEquals(e.message, "Failed to distribute repositories/install packages") + self.assertEqual(str(e), "Failed to distribute repositories/install packages") else: self.assertFalse("Packages can't be installed without repos") @@ -246,23 +246,23 @@ def test_normal_flow_sles(self, subprocess_with_timeout, write_actual_version_to os_type=('Suse', '11', 'SP1'), ) self.assertTrue(put_structured_out_mock.called) - self.assertEquals(put_structured_out_mock.call_args[0][0], + self.assertEqual(put_structured_out_mock.call_args[0][0], {'package_installation_result': 'SUCCESS', 'repository_version_id': 1, 'actual_version': VERSION_STUB}) self.assertResourceCalled('Repository', 'HDP-UTILS-1.1.0.20', - base_url=u'http://repo1/HDP/centos5/2.x/updates/2.2.0.0', + base_url='http://repo1/HDP/centos5/2.x/updates/2.2.0.0', action=['prepare'], - components=[u'HDP-UTILS', 'main'], + components=['HDP-UTILS', 'main'], repo_template='[{{repo_id}}]\nname={{repo_id}}\n{% if mirror_list %}mirrorlist={{mirror_list}}{% else %}baseurl={{base_url}}{% endif %}\n\npath=/\nenabled=1\ngpgcheck=0', repo_file_name=repo_file_name, mirror_list=None, ) self.assertResourceCalled('Repository', 'HDP-2.2', - base_url=u'http://repo1/HDP/centos5/2.x/updates/2.2.0.0', + base_url='http://repo1/HDP/centos5/2.x/updates/2.2.0.0', action=['prepare'], - components=[u'HDP', 'main'], - repo_template=u'[{{repo_id}}]\nname={{repo_id}}\n{% if mirror_list %}mirrorlist={{mirror_list}}{% else %}baseurl={{base_url}}{% endif %}\n\npath=/\nenabled=1\ngpgcheck=0', + components=['HDP', 'main'], + repo_template='[{{repo_id}}]\nname={{repo_id}}\n{% if mirror_list %}mirrorlist={{mirror_list}}{% else %}baseurl={{base_url}}{% endif %}\n\npath=/\nenabled=1\ngpgcheck=0', repo_file_name=repo_file_name, mirror_list=None, ) @@ -315,23 +315,23 @@ def test_exclude_existing_repo(self, subprocess_with_timeout, write_actual_versi os_type=('Redhat', '6.4', 'Final'), ) self.assertTrue(put_structured_out_mock.called) - self.assertEquals(put_structured_out_mock.call_args[0][0], + self.assertEqual(put_structured_out_mock.call_args[0][0], {'package_installation_result': 'SUCCESS', 'repository_version_id': 1, 'actual_version': VERSION_STUB}) self.assertResourceCalled('Repository', 'HDP-UTILS-1.1.0.20', - base_url=u'http://repo1/HDP/centos5/2.x/updates/2.2.0.0', + base_url='http://repo1/HDP/centos5/2.x/updates/2.2.0.0', action=['prepare'], - components=[u'HDP-UTILS', 'main'], - repo_template=u'[{{repo_id}}]\nname={{repo_id}}\n{% if mirror_list %}mirrorlist={{mirror_list}}{% else %}baseurl={{base_url}}{% endif %}\n\npath=/\nenabled=1\ngpgcheck=0', + components=['HDP-UTILS', 'main'], + repo_template='[{{repo_id}}]\nname={{repo_id}}\n{% if mirror_list %}mirrorlist={{mirror_list}}{% else %}baseurl={{base_url}}{% endif %}\n\npath=/\nenabled=1\ngpgcheck=0', repo_file_name=repo_file_name, mirror_list=None, ) self.assertResourceCalled('Repository', 'HDP-2.2', base_url='http://repo1/HDP/centos5/2.x/updates/2.2.0.0', action=['prepare'], - components=[u'HDP', 'main'], - repo_template=u'[{{repo_id}}]\nname={{repo_id}}\n{% if mirror_list %}mirrorlist={{mirror_list}}{% else %}baseurl={{base_url}}{% endif %}\n\npath=/\nenabled=1\ngpgcheck=0', + components=['HDP', 'main'], + repo_template='[{{repo_id}}]\nname={{repo_id}}\n{% if mirror_list %}mirrorlist={{mirror_list}}{% else %}baseurl={{base_url}}{% endif %}\n\npath=/\nenabled=1\ngpgcheck=0', repo_file_name=repo_file_name, mirror_list=None, ) @@ -401,23 +401,23 @@ def side_effect(retcode): os_type=('Redhat', '6.4', 'Final')) self.assertTrue(put_structured_out_mock.called) - self.assertEquals(put_structured_out_mock.call_args[0][0], + self.assertEqual(put_structured_out_mock.call_args[0][0], {'repository_version_id': 1, 'package_installation_result': 'FAIL'}) self.assertResourceCalled('Repository', 'HDP-UTILS-1.1.0.20', - base_url=u'http://repo1/HDP/centos5/2.x/updates/2.2.0.0', + base_url='http://repo1/HDP/centos5/2.x/updates/2.2.0.0', action=['prepare'], - components=[u'HDP-UTILS', 'main'], - repo_template=u'[{{repo_id}}]\nname={{repo_id}}\n{% if mirror_list %}mirrorlist={{mirror_list}}{% else %}baseurl={{base_url}}{% endif %}\n\npath=/\nenabled=1\ngpgcheck=0', - repo_file_name=u'ambari-hdp-1', + components=['HDP-UTILS', 'main'], + repo_template='[{{repo_id}}]\nname={{repo_id}}\n{% if mirror_list %}mirrorlist={{mirror_list}}{% else %}baseurl={{base_url}}{% endif %}\n\npath=/\nenabled=1\ngpgcheck=0', + repo_file_name='ambari-hdp-1', mirror_list=None, ) self.assertResourceCalled('Repository', 'HDP-2.2', - base_url=u'http://repo1/HDP/centos5/2.x/updates/2.2.0.0', + base_url='http://repo1/HDP/centos5/2.x/updates/2.2.0.0', action=['prepare'], - components=[u'HDP', 'main'], - repo_template=u'[{{repo_id}}]\nname={{repo_id}}\n{% if mirror_list %}mirrorlist={{mirror_list}}{% else %}baseurl={{base_url}}{% endif %}\n\npath=/\nenabled=1\ngpgcheck=0', - repo_file_name=u'ambari-hdp-1', + components=['HDP', 'main'], + repo_template='[{{repo_id}}]\nname={{repo_id}}\n{% if mirror_list %}mirrorlist={{mirror_list}}{% else %}baseurl={{base_url}}{% endif %}\n\npath=/\nenabled=1\ngpgcheck=0', + repo_file_name='ambari-hdp-1', mirror_list=None, ) self.assertResourceCalled('Repository', None, @@ -473,23 +473,23 @@ def test_format_package_name(self, subprocess_with_timeout, write_actual_version os_type=('Suse', '11', 'Final'), ) self.assertTrue(put_structured_out_mock.called) - self.assertEquals(put_structured_out_mock.call_args[0][0], + self.assertEqual(put_structured_out_mock.call_args[0][0], {'package_installation_result': 'SUCCESS', 'repository_version_id': 1, 'actual_version': VERSION_STUB}) self.assertResourceCalled('Repository', 'HDP-UTILS-1.1.0.20', - base_url=u'http://repo1/HDP/centos5/2.x/updates/2.2.0.0', + base_url='http://repo1/HDP/centos5/2.x/updates/2.2.0.0', action=['prepare'], - components=[u'HDP-UTILS', 'main'], - repo_template=u'[{{repo_id}}]\nname={{repo_id}}\n{% if mirror_list %}mirrorlist={{mirror_list}}{% else %}baseurl={{base_url}}{% endif %}\n\npath=/\nenabled=1\ngpgcheck=0', + components=['HDP-UTILS', 'main'], + repo_template='[{{repo_id}}]\nname={{repo_id}}\n{% if mirror_list %}mirrorlist={{mirror_list}}{% else %}baseurl={{base_url}}{% endif %}\n\npath=/\nenabled=1\ngpgcheck=0', repo_file_name=repo_file_name, mirror_list=None, ) self.assertResourceCalled('Repository', 'HDP-2.2', - base_url=u'http://repo1/HDP/centos5/2.x/updates/2.2.0.0', + base_url='http://repo1/HDP/centos5/2.x/updates/2.2.0.0', action=['prepare'], - components=[u'HDP', 'main'], - repo_template=u'[{{repo_id}}]\nname={{repo_id}}\n{% if mirror_list %}mirrorlist={{mirror_list}}{% else %}baseurl={{base_url}}{% endif %}\n\npath=/\nenabled=1\ngpgcheck=0', + components=['HDP', 'main'], + repo_template='[{{repo_id}}]\nname={{repo_id}}\n{% if mirror_list %}mirrorlist={{mirror_list}}{% else %}baseurl={{base_url}}{% endif %}\n\npath=/\nenabled=1\ngpgcheck=0', repo_file_name=repo_file_name, mirror_list=None, ) @@ -553,23 +553,23 @@ def test_format_package_name_via_repositoryFile(self, subprocess_with_timeout, w os_type=('Suse', '11', 'Final'), ) self.assertTrue(put_structured_out_mock.called) - self.assertEquals(put_structured_out_mock.call_args[0][0], + self.assertEqual(put_structured_out_mock.call_args[0][0], {'package_installation_result': 'SUCCESS', 'repository_version_id': 4, 'actual_version': VERSION_STUB}) self.assertResourceCalled('Repository', 'HDP-UTILS-1.1.0.20-repo-4', - base_url=u'http://repo1/HDP-UTILS/centos5/2.x/updates/2.2.0.0', + base_url='http://repo1/HDP-UTILS/centos5/2.x/updates/2.2.0.0', action=['prepare'], - components=[u'HDP-UTILS', 'main'], - repo_template=u'[{{repo_id}}]\nname={{repo_id}}\n{% if mirror_list %}mirrorlist={{mirror_list}}{% else %}baseurl={{base_url}}{% endif %}\n\npath=/\nenabled=1\ngpgcheck=0', + components=['HDP-UTILS', 'main'], + repo_template='[{{repo_id}}]\nname={{repo_id}}\n{% if mirror_list %}mirrorlist={{mirror_list}}{% else %}baseurl={{base_url}}{% endif %}\n\npath=/\nenabled=1\ngpgcheck=0', repo_file_name=repo_file_name, mirror_list=None, ) self.assertResourceCalled('Repository', 'HDP-2.2-repo-4', - base_url=u'http://repo1/HDP/centos5/2.x/updates/2.2.0.0', + base_url='http://repo1/HDP/centos5/2.x/updates/2.2.0.0', action=['prepare'], - components=[u'HDP', 'main'], - repo_template=u'[{{repo_id}}]\nname={{repo_id}}\n{% if mirror_list %}mirrorlist={{mirror_list}}{% else %}baseurl={{base_url}}{% endif %}\n\npath=/\nenabled=1\ngpgcheck=0', + components=['HDP', 'main'], + repo_template='[{{repo_id}}]\nname={{repo_id}}\n{% if mirror_list %}mirrorlist={{mirror_list}}{% else %}baseurl={{base_url}}{% endif %}\n\npath=/\nenabled=1\ngpgcheck=0', repo_file_name=repo_file_name, mirror_list=None, ) @@ -624,12 +624,12 @@ def test_version_reporting__build_number_defined(self, subprocess_with_timeout, os_type=('Redhat', '6.4', 'Final'), ) self.assertTrue(put_structured_out_mock.called) - self.assertEquals(put_structured_out_mock.call_args[0][0], + self.assertEqual(put_structured_out_mock.call_args[0][0], {'package_installation_result': 'SUCCESS', 'repository_version_id': 1, 'actual_version': VERSION_STUB}) self.assertTrue(write_actual_version_to_history_file_mock.called) - self.assertEquals(write_actual_version_to_history_file_mock.call_args[0], (VERSION_STUB_WITHOUT_BUILD_NUMBER, VERSION_STUB)) + self.assertEqual(write_actual_version_to_history_file_mock.call_args[0], (VERSION_STUB_WITHOUT_BUILD_NUMBER, VERSION_STUB)) stack_versions_mock.reset_mock() write_actual_version_to_history_file_mock.reset_mock() @@ -659,7 +659,7 @@ def test_version_reporting__build_number_defined(self, subprocess_with_timeout, os_type=('Redhat', '6.4', 'Final'), ) self.assertTrue(put_structured_out_mock.called) - self.assertEquals(put_structured_out_mock.call_args[0][0], + self.assertEqual(put_structured_out_mock.call_args[0][0], {'package_installation_result': 'SUCCESS', 'repository_version_id': 1, 'actual_version': VERSION_STUB}) @@ -726,7 +726,7 @@ def test_version_reporting__build_number_not_defined_stack_root_present__no_comp self.assertTrue(put_structured_out_mock.called) - self.assertEquals(put_structured_out_mock.call_args_list[-1][0][0], + self.assertEqual(put_structured_out_mock.call_args_list[-1][0][0], { 'actual_version': '2.2.0.1-885', 'package_installation_result': 'FAIL', 'repository_version_id': 1}) @@ -795,7 +795,7 @@ def test_version_reporting__build_number_not_defined_stack_root_absent(self, pass # Expected self.assertTrue(put_structured_out_mock.called) - self.assertEquals(put_structured_out_mock.call_args_list[-1][0][0], + self.assertEqual(put_structured_out_mock.call_args_list[-1][0][0], {'package_installation_result': 'FAIL', 'repository_version_id': 1}) @@ -835,7 +835,7 @@ def test_version_reporting__build_number_not_defined_stack_root_absent(self, pass # Expected self.assertTrue(put_structured_out_mock.called) - self.assertEquals(put_structured_out_mock.call_args[0][0], + self.assertEqual(put_structured_out_mock.call_args[0][0], {'package_installation_result': 'FAIL', 'repository_version_id': 1, 'actual_version': VERSION_STUB}) @@ -890,12 +890,12 @@ def test_version_reporting__build_number_not_defined_stack_root_present(self, os_type=('Redhat', '6.4', 'Final'), ) self.assertTrue(put_structured_out_mock.called) - self.assertEquals(put_structured_out_mock.call_args[0][0], + self.assertEqual(put_structured_out_mock.call_args[0][0], {'package_installation_result': 'SUCCESS', 'repository_version_id': 1, 'actual_version': VERSION_STUB}) self.assertTrue(write_actual_version_to_history_file_mock.called) - self.assertEquals(write_actual_version_to_history_file_mock.call_args[0], (VERSION_STUB_WITHOUT_BUILD_NUMBER, VERSION_STUB)) + self.assertEqual(write_actual_version_to_history_file_mock.call_args[0], (VERSION_STUB_WITHOUT_BUILD_NUMBER, VERSION_STUB)) stack_versions_mock.reset_mock() write_actual_version_to_history_file_mock.reset_mock() @@ -925,7 +925,7 @@ def test_version_reporting__build_number_not_defined_stack_root_present(self, os_type=('Redhat', '6.4', 'Final'), ) self.assertTrue(put_structured_out_mock.called) - self.assertEquals(put_structured_out_mock.call_args[0][0], + self.assertEqual(put_structured_out_mock.call_args[0][0], {'package_installation_result': 'SUCCESS', 'repository_version_id': 1, 'actual_version': VERSION_STUB}) @@ -980,12 +980,12 @@ def test_version_reporting__wrong_build_number_specified_stack_root_present(self os_type=('Redhat', '6.4', 'Final'), ) self.assertTrue(put_structured_out_mock.called) - self.assertEquals(put_structured_out_mock.call_args[0][0], + self.assertEqual(put_structured_out_mock.call_args[0][0], {'package_installation_result': 'SUCCESS', 'repository_version_id': 1, 'actual_version': VERSION_STUB}) self.assertTrue(write_actual_version_to_history_file_mock.called) - self.assertEquals(write_actual_version_to_history_file_mock.call_args[0], ('2.2.0.1', VERSION_STUB)) + self.assertEqual(write_actual_version_to_history_file_mock.call_args[0], ('2.2.0.1', VERSION_STUB)) stack_versions_mock.reset_mock() write_actual_version_to_history_file_mock.reset_mock() @@ -1015,7 +1015,7 @@ def test_version_reporting__wrong_build_number_specified_stack_root_present(self os_type=('Redhat', '6.4', 'Final'), ) self.assertTrue(put_structured_out_mock.called) - self.assertEquals(put_structured_out_mock.call_args[0][0], + self.assertEqual(put_structured_out_mock.call_args[0][0], {'package_installation_result': 'SUCCESS', 'repository_version_id': 1, 'actual_version': VERSION_STUB}) @@ -1079,7 +1079,7 @@ def test_version_reporting__wrong_build_number_specified_stack_root_absent(self, pass # Expected self.assertTrue(put_structured_out_mock.called) - self.assertEquals(put_structured_out_mock.call_args_list[-1][0][0], + self.assertEqual(put_structured_out_mock.call_args_list[-1][0][0], {'package_installation_result': 'FAIL', 'repository_version_id': 1}) @@ -1119,7 +1119,7 @@ def test_version_reporting__wrong_build_number_specified_stack_root_absent(self, pass # Expected self.assertTrue(put_structured_out_mock.called) - self.assertEquals(put_structured_out_mock.call_args[0][0], + self.assertEqual(put_structured_out_mock.call_args[0][0], {'package_installation_result': 'FAIL', 'repository_version_id': 1, 'actual_version': VERSION_STUB}) @@ -1174,12 +1174,12 @@ def test_version_reporting_with_repository_version(self, os_type=('Redhat', '6.4', 'Final'), ) self.assertTrue(put_structured_out_mock.called) - self.assertEquals(put_structured_out_mock.call_args[0][0], + self.assertEqual(put_structured_out_mock.call_args[0][0], {'package_installation_result': 'SUCCESS', 'repository_version_id': 1, 'actual_version': VERSION_STUB}) self.assertTrue(write_actual_version_to_history_file_mock.called) - self.assertEquals(write_actual_version_to_history_file_mock.call_args[0], (VERSION_STUB_WITHOUT_BUILD_NUMBER, VERSION_STUB)) + self.assertEqual(write_actual_version_to_history_file_mock.call_args[0], (VERSION_STUB_WITHOUT_BUILD_NUMBER, VERSION_STUB)) stack_versions_mock.reset_mock() write_actual_version_to_history_file_mock.reset_mock() @@ -1210,7 +1210,7 @@ def test_version_reporting_with_repository_version(self, os_type=('Redhat', '6.4', 'Final'), ) self.assertTrue(put_structured_out_mock.called) - self.assertEquals(put_structured_out_mock.call_args[0][0], + self.assertEqual(put_structured_out_mock.call_args[0][0], {'package_installation_result': 'SUCCESS', 'repository_version_id': 1, 'actual_version': VERSION_STUB}) @@ -1261,23 +1261,23 @@ def test_normal_flow_rhel_with_command_repo(self, os_type=('Redhat', '6.4', 'Final'), ) self.assertTrue(put_structured_out_mock.called) - self.assertEquals(put_structured_out_mock.call_args[0][0], + self.assertEqual(put_structured_out_mock.call_args[0][0], {'package_installation_result': 'SUCCESS', 'repository_version_id': 4, 'actual_version': VERSION_STUB}) self.assertResourceCalled('Repository', 'HDP-UTILS-1.1.0.20-repo-4', - base_url=u'http://repo1/HDP-UTILS/centos5/2.x/updates/2.2.0.0', + base_url='http://repo1/HDP-UTILS/centos5/2.x/updates/2.2.0.0', action=['prepare'], - components=[u'HDP-UTILS', 'main'], + components=['HDP-UTILS', 'main'], repo_template='[{{repo_id}}]\nname={{repo_id}}\n{% if mirror_list %}mirrorlist={{mirror_list}}{% else %}baseurl={{base_url}}{% endif %}\n\npath=/\nenabled=1\ngpgcheck=0', repo_file_name=repo_file_name, mirror_list=None, ) self.assertResourceCalled('Repository', 'HDP-2.2-repo-4', - base_url=u'http://repo1/HDP/centos5/2.x/updates/2.2.0.0', + base_url='http://repo1/HDP/centos5/2.x/updates/2.2.0.0', action=['prepare'], - components=[u'HDP', 'main'], + components=['HDP', 'main'], repo_template='[{{repo_id}}]\nname={{repo_id}}\n{% if mirror_list %}mirrorlist={{mirror_list}}{% else %}baseurl={{base_url}}{% endif %}\n\npath=/\nenabled=1\ngpgcheck=0', repo_file_name=repo_file_name, mirror_list=None, @@ -1290,6 +1290,6 @@ def test_normal_flow_rhel_with_command_repo(self, def test_os_family_check_with_inheritance(self): from ambari_commons.os_check import OSConst from ambari_commons.repo_manager import ManagerFactory - self.assertEquals( + self.assertEqual( ManagerFactory.get_new_instance(OSConst.DEBIAN_FAMILY).__class__, ManagerFactory.get_new_instance(OSConst.UBUNTU_FAMILY).__class__) \ No newline at end of file diff --git a/ambari-server/src/test/python/custom_actions/TestRemoveBits.py b/ambari-server/src/test/python/custom_actions/TestRemoveBits.py index 3531166eb8a..9f375d4afb3 100644 --- a/ambari-server/src/test/python/custom_actions/TestRemoveBits.py +++ b/ambari-server/src/test/python/custom_actions/TestRemoveBits.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -19,7 +19,7 @@ ''' import json import os -from ambari_commons import subprocess32 +import subprocess import select import install_packages diff --git a/ambari-server/src/test/python/custom_actions/TestRemoveStackVersion.py b/ambari-server/src/test/python/custom_actions/TestRemoveStackVersion.py index 73db1d00a68..4f0076c7e54 100644 --- a/ambari-server/src/test/python/custom_actions/TestRemoveStackVersion.py +++ b/ambari-server/src/test/python/custom_actions/TestRemoveStackVersion.py @@ -65,11 +65,11 @@ def test_normal_flow(self, os_type=('Redhat', '6.4', 'Final') ) self.assertTrue(stack_versions_mock.called) - self.assertEquals(stack_versions_mock.call_args[0][0], '/usr/hdp') + self.assertEqual(stack_versions_mock.call_args[0][0], '/usr/hdp') self.assertResourceCalled('Package', "pkg12_1_0_0_400", action=["remove"]) self.assertTrue(put_structured_out_mock.called) - self.assertEquals(put_structured_out_mock.call_args[0][0], + self.assertEqual(put_structured_out_mock.call_args[0][0], {'remove_previous_stacks': {'exit_code': 0, 'message': 'Stack version 2.1.0.0-400 successfully removed!'}}) self.assertResourceCalled('Execute', ('rm', '-f', '/usr/hdp2.1.0.0-400'), @@ -104,7 +104,7 @@ def test_without_versions(self, os_type=('Redhat', '6.4', 'Final') ) self.assertTrue(stack_versions_mock.called) - self.assertEquals(stack_versions_mock.call_args[0][0], '/usr/hdp') + self.assertEqual(stack_versions_mock.call_args[0][0], '/usr/hdp') self.assertNoMoreResources() @patch("ambari_commons.repo_manager.ManagerFactory.get") @@ -135,10 +135,10 @@ def test_symlink_exist(self, os_type=('Redhat', '6.4', 'Final') ) self.fail("Should throw exception") - except Fail, e: - self.assertEquals(str(e), '/usr/hdp/current/ contains symlink to version for remove! 2.1.0.0-400') + except Fail as e: + self.assertEqual(str(e), '/usr/hdp/current/ contains symlink to version for remove! 2.1.0.0-400') pass # Expected self.assertTrue(stack_versions_mock.called) - self.assertEquals(stack_versions_mock.call_args[0][0], '/usr/hdp') + self.assertEqual(stack_versions_mock.call_args[0][0], '/usr/hdp') self.assertNoMoreResources() \ No newline at end of file diff --git a/ambari-server/src/test/python/custom_actions/TestRepoVersionHistory.py b/ambari-server/src/test/python/custom_actions/TestRepoVersionHistory.py index 1eccb2fc223..21674e8b243 100644 --- a/ambari-server/src/test/python/custom_actions/TestRepoVersionHistory.py +++ b/ambari-server/src/test/python/custom_actions/TestRepoVersionHistory.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -39,33 +39,33 @@ def test_read_and_write_repo_version_history(self): repo_version_history.REPO_VERSION_HISTORY_FILE = filename repo_version_history.Logger = logging.getLogger() result = repo_version_history.read_actual_version_from_history_file('2.3.2.0') - self.assertEquals(result, None) + self.assertEqual(result, None) # Check read of single value repo_version_history.write_actual_version_to_history_file('2.3.2.0', '2.3.2.0-210') result = repo_version_history.read_actual_version_from_history_file('2.3.2.0') - self.assertEquals(result, '2.3.2.0-210') + self.assertEqual(result, '2.3.2.0-210') # Check read after update repo_version_history.write_actual_version_to_history_file('2.3.2.0', '2.3.2.0-2716') result = repo_version_history.read_actual_version_from_history_file('2.3.2.0') - self.assertEquals(result, '2.3.2.0-2716') + self.assertEqual(result, '2.3.2.0-2716') # Check read after update repo_version_history.write_actual_version_to_history_file('2.3.2.0', '2.3.2.0-2758') result = repo_version_history.read_actual_version_from_history_file('2.3.2.0') - self.assertEquals(result, '2.3.2.0-2758') + self.assertEqual(result, '2.3.2.0-2758') # Check read after writing down version for another stack repo_version_history.write_actual_version_to_history_file('2.3.1.0', '2.3.1.0-27') result = repo_version_history.read_actual_version_from_history_file('2.3.1.0') - self.assertEquals(result, '2.3.1.0-27') + self.assertEqual(result, '2.3.1.0-27') result = repo_version_history.read_actual_version_from_history_file('2.3.2.0') - self.assertEquals(result, '2.3.2.0-2758') + self.assertEqual(result, '2.3.2.0-2758') # Check read of another stack result = repo_version_history.read_actual_version_from_history_file('2.3.0.0') - self.assertEquals(result, None) + self.assertEqual(result, None) finally: os.unlink(filename) diff --git a/ambari-server/src/test/python/custom_actions/TestUpdateRepo.py b/ambari-server/src/test/python/custom_actions/TestUpdateRepo.py index 43114ac67c7..2532ae94503 100644 --- a/ambari-server/src/test/python/custom_actions/TestUpdateRepo.py +++ b/ambari-server/src/test/python/custom_actions/TestUpdateRepo.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -59,24 +59,24 @@ def testUpdateRepo(self, structured_out_mock, file_mock, mock_config, is_redhat_ "repoVersion": "2.4.3.0-227", "repositories": [ { - "mirrorsList": None, - "ambariManaged": True, - "baseUrl": "http://public-repo-1.hortonworks.com/HDP/centos6/2.x/updates/2.4.3.0/", - "repoName": "HDP", - "components": None, - "osType": "redhat6", - "distribution": None, - "repoId": "HDP-2.4-repo-1" - }, - { - "mirrorsList": None, - "ambariManaged": True, - "baseUrl": "http://public-repo-1.hortonworks.com/HDP-UTILS-1.1.0.20/repos/centos6", - "repoName": "HDP-UTILS", - "components": None, - "osType": "redhat6", - "distribution": None, + "mirrorsList": None, + "ambariManaged": True, + "baseUrl": "http://public-repo-1.hortonworks.com/HDP-UTILS-1.1.0.20/repos/centos6", + "repoName": "HDP-UTILS", + "components": None, + "osType": "redhat6", + "distribution": None, "repoId": "HDP-UTILS-1.1.0.20-repo-1" + }, + { + "mirrorsList": None, + "ambariManaged": True, + "baseUrl": "http://public-repo-1.hortonworks.com/HDP/centos6/2.x/updates/2.4.3.0/", + "repoName": "HDP", + "components": None, + "osType": "redhat6", + "distribution": None, + "repoId": "HDP-2.4-repo-1" } ], "feature": { @@ -92,8 +92,8 @@ def testUpdateRepo(self, structured_out_mock, file_mock, mock_config, is_redhat_ updateRepo.actionexecute(None) self.assertTrue(file_mock.called) - self.assertEquals(file_mock.call_args[0][0], "/etc/yum.repos.d/HDP.repo") - self.assertEquals(structured_out_mock.call_args[0][0], {'repo_update': {'message': 'Repository files successfully updated!', 'exit_code': 0}}) + self.assertEqual(file_mock.call_args[0][0], "/etc/yum.repos.d/HDP.repo") + self.assertEqual(structured_out_mock.call_args[0][0], {'repo_update': {'message': 'Repository files successfully updated!', 'exit_code': 0}}) ###### invalid repo info file_mock.reset_mock() @@ -109,7 +109,7 @@ def testUpdateRepo(self, structured_out_mock, file_mock, mock_config, is_redhat_ try: with Environment('/') as env: updateRepo.actionexecute(None) - except Exception, exception: + except Exception as exception: failed = True self.assertFalse(file_mock.called) diff --git a/ambari-server/src/test/python/custom_actions/test_stack_select_set_all.py b/ambari-server/src/test/python/custom_actions/test_stack_select_set_all.py index 3bcd0bbd6ce..591c6d5bb40 100644 --- a/ambari-server/src/test/python/custom_actions/test_stack_select_set_all.py +++ b/ambari-server/src/test/python/custom_actions/test_stack_select_set_all.py @@ -107,7 +107,7 @@ def hdp_select_call(command, **kwargs): ru_execute = UpgradeSetAll() ru_execute.actionexecute(None) - call_mock.assert_called_with(('ambari-python-wrap', '/usr/bin/hdp-select', 'set', 'all', u'2.5.9.9-9999'), sudo=True) + call_mock.assert_called_with(('ambari-python-wrap', '/usr/bin/hdp-select', 'set', 'all', '2.5.9.9-9999'), sudo=True) @patch("os.path.exists") @@ -159,7 +159,7 @@ def hdp_select_call(command, **kwargs): ru_execute = UpgradeSetAll() ru_execute.actionexecute(None) - call_mock.assert_called_with(('ambari-python-wrap', u'/usr/bin/hdp-select', 'versions'), sudo = True) + call_mock.assert_called_with(('ambari-python-wrap', '/usr/bin/hdp-select', 'versions'), sudo = True) self.assertEqual(call_mock.call_count, 1) @patch("os.path.exists") @@ -211,7 +211,7 @@ def hdp_select_call(command, **kwargs): ru_execute = UpgradeSetAll() ru_execute.actionexecute(None) - call_mock.assert_called_with(('ambari-python-wrap', u'/usr/bin/hdp-select', 'versions'), sudo = True) + call_mock.assert_called_with(('ambari-python-wrap', '/usr/bin/hdp-select', 'versions'), sudo = True) self.assertEqual(call_mock.call_count, 1) @patch("os.path.exists") diff --git a/ambari-server/src/test/python/host_scripts/TestAlertDiskSpace.py b/ambari-server/src/test/python/host_scripts/TestAlertDiskSpace.py index e6cce98c91c..bbc73cfd18d 100644 --- a/ambari-server/src/test/python/host_scripts/TestAlertDiskSpace.py +++ b/ambari-server/src/test/python/host_scripts/TestAlertDiskSpace.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -38,8 +38,8 @@ def test_linux_flow(self, isdir_mock, disk_usage_mock): # / OK disk_usage_mock.return_value = alert_disk_space.DiskInfo( - total = 21673930752L, used = 5695861760L, - free = 15978068992L, path="/") + total = 21673930752, used = 5695861760, + free = 15978068992, path="/") configurations = {'{{cluster-env/stack_name}}': 'HDP', '{{cluster-env/stack_root}}': '{"HDP":"/usr/hdp"}'} @@ -51,8 +51,8 @@ def test_linux_flow(self, isdir_mock, disk_usage_mock): # / WARNING disk_usage_mock.return_value = alert_disk_space.DiskInfo( - total = 21673930752L, used = 14521533603L, - free = 7152397149L, path="/") + total = 21673930752, used = 14521533603, + free = 7152397149, path="/") res = alert_disk_space.execute(configurations = configurations) self.assertEqual(res, ( @@ -61,7 +61,7 @@ def test_linux_flow(self, isdir_mock, disk_usage_mock): # / CRITICAL disk_usage_mock.return_value = alert_disk_space.DiskInfo( - total = 21673930752L, used = 20590234214L, + total = 21673930752, used = 20590234214, free = 1083696538, path="/") res = alert_disk_space.execute(configurations = configurations) @@ -70,8 +70,8 @@ def test_linux_flow(self, isdir_mock, disk_usage_mock): # / OK but < 5GB disk_usage_mock.return_value = alert_disk_space.DiskInfo( - total = 5418482688L, used = 1625544806L, - free = 3792937882L, path="/") + total = 5418482688, used = 1625544806, + free = 3792937882, path="/") res = alert_disk_space.execute(configurations = configurations) self.assertEqual(res, ('WARNING', [ @@ -82,8 +82,8 @@ def test_linux_flow(self, isdir_mock, disk_usage_mock): # / OK disk_usage_mock.return_value = alert_disk_space.DiskInfo( - total = 21673930752L, used = 5695861760L, - free = 15978068992L, path="/usr/hdp") + total = 21673930752, used = 5695861760, + free = 15978068992, path="/usr/hdp") res = alert_disk_space.execute(configurations = configurations) self.assertEqual(res, @@ -91,8 +91,8 @@ def test_linux_flow(self, isdir_mock, disk_usage_mock): # < 5GB disk_usage_mock.return_value = alert_disk_space.DiskInfo( - total = 5418482688L, used = 1625544806L, - free = 3792937882L, path="/usr/hdp") + total = 5418482688, used = 1625544806, + free = 3792937882, path="/usr/hdp") res = alert_disk_space.execute(configurations = configurations) self.assertEqual(res, ( diff --git a/ambari-server/src/test/python/host_scripts/TestAlertUlimit.py b/ambari-server/src/test/python/host_scripts/TestAlertUlimit.py index 09bf4e63b45..a6785bdcc4a 100644 --- a/ambari-server/src/test/python/host_scripts/TestAlertUlimit.py +++ b/ambari-server/src/test/python/host_scripts/TestAlertUlimit.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -31,14 +31,14 @@ def test_ulimits(self, ulimit_mock): # OK ulimit_mock.return_value = 1024, 1024 res = alert_ulimit.execute() - self.assertEquals(res, ('OK', ['Ulimit for open files (-n) is 1024'])) + self.assertEqual(res, ('OK', ['Ulimit for open files (-n) is 1024'])) # WARNING ulimit_mock.return_value = 200000, 200000 res = alert_ulimit.execute() - self.assertEquals(res, ('WARNING', ['Ulimit for open files (-n) is 200000 which is higher or equal than warning value of 200000'])) + self.assertEqual(res, ('WARNING', ['Ulimit for open files (-n) is 200000 which is higher or equal than warning value of 200000'])) # OK ulimit_mock.return_value = 1000000, 1000000 res = alert_ulimit.execute() - self.assertEquals(res, ('CRITICAL', ['Ulimit for open files (-n) is 1000000 which is higher or equal than critical value of 800000'])) \ No newline at end of file + self.assertEqual(res, ('CRITICAL', ['Ulimit for open files (-n) is 1000000 which is higher or equal than critical value of 800000'])) \ No newline at end of file diff --git a/ambari-server/src/test/python/mpacks/mystack-ambari-mpack-1.0.0.0/hooks/after_install.py b/ambari-server/src/test/python/mpacks/mystack-ambari-mpack-1.0.0.0/hooks/after_install.py index 9ad0eaeec60..280aaf81b7d 100644 --- a/ambari-server/src/test/python/mpacks/mystack-ambari-mpack-1.0.0.0/hooks/after_install.py +++ b/ambari-server/src/test/python/mpacks/mystack-ambari-mpack-1.0.0.0/hooks/after_install.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one diff --git a/ambari-server/src/test/python/mpacks/mystack-ambari-mpack-1.0.0.0/hooks/before_install.py b/ambari-server/src/test/python/mpacks/mystack-ambari-mpack-1.0.0.0/hooks/before_install.py index 9ad0eaeec60..280aaf81b7d 100644 --- a/ambari-server/src/test/python/mpacks/mystack-ambari-mpack-1.0.0.0/hooks/before_install.py +++ b/ambari-server/src/test/python/mpacks/mystack-ambari-mpack-1.0.0.0/hooks/before_install.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one diff --git a/ambari-server/src/test/python/mpacks/mystack-ambari-mpack-1.0.0.1/hooks/after_install.py b/ambari-server/src/test/python/mpacks/mystack-ambari-mpack-1.0.0.1/hooks/after_install.py index 9ad0eaeec60..280aaf81b7d 100644 --- a/ambari-server/src/test/python/mpacks/mystack-ambari-mpack-1.0.0.1/hooks/after_install.py +++ b/ambari-server/src/test/python/mpacks/mystack-ambari-mpack-1.0.0.1/hooks/after_install.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one diff --git a/ambari-server/src/test/python/mpacks/mystack-ambari-mpack-1.0.0.1/hooks/after_upgrade.py b/ambari-server/src/test/python/mpacks/mystack-ambari-mpack-1.0.0.1/hooks/after_upgrade.py index 9ad0eaeec60..280aaf81b7d 100644 --- a/ambari-server/src/test/python/mpacks/mystack-ambari-mpack-1.0.0.1/hooks/after_upgrade.py +++ b/ambari-server/src/test/python/mpacks/mystack-ambari-mpack-1.0.0.1/hooks/after_upgrade.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one diff --git a/ambari-server/src/test/python/mpacks/mystack-ambari-mpack-1.0.0.1/hooks/before_install.py b/ambari-server/src/test/python/mpacks/mystack-ambari-mpack-1.0.0.1/hooks/before_install.py index 9ad0eaeec60..280aaf81b7d 100644 --- a/ambari-server/src/test/python/mpacks/mystack-ambari-mpack-1.0.0.1/hooks/before_install.py +++ b/ambari-server/src/test/python/mpacks/mystack-ambari-mpack-1.0.0.1/hooks/before_install.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one diff --git a/ambari-server/src/test/python/mpacks/mystack-ambari-mpack-1.0.0.1/hooks/before_upgrade.py b/ambari-server/src/test/python/mpacks/mystack-ambari-mpack-1.0.0.1/hooks/before_upgrade.py index 9ad0eaeec60..280aaf81b7d 100644 --- a/ambari-server/src/test/python/mpacks/mystack-ambari-mpack-1.0.0.1/hooks/before_upgrade.py +++ b/ambari-server/src/test/python/mpacks/mystack-ambari-mpack-1.0.0.1/hooks/before_upgrade.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one diff --git a/ambari-server/src/test/python/stacks/__init__.py b/ambari-server/src/test/python/stacks/__init__.py index 9ad0eaeec60..280aaf81b7d 100644 --- a/ambari-server/src/test/python/stacks/__init__.py +++ b/ambari-server/src/test/python/stacks/__init__.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one diff --git a/ambari-server/src/test/python/stacks/stack-hooks/after-INSTALL/test_after_install.py b/ambari-server/src/test/python/stacks/stack-hooks/after-INSTALL/test_after_install.py index 283dd1d21b7..16e8dd74f74 100644 --- a/ambari-server/src/test/python/stacks/stack-hooks/after-INSTALL/test_after_install.py +++ b/ambari-server/src/test/python/stacks/stack-hooks/after-INSTALL/test_after_install.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' @@ -59,7 +59,7 @@ def test_hook_default(self): xml_include_file=None) self.assertResourceCalled('Directory', '/usr/lib/ambari-logsearch-logfeeder/conf', - mode = 0755, + mode = 0o755, cd_access = 'a', create_parents = True) self.assertNoMoreResources() @@ -107,12 +107,12 @@ def mocked_conf_select(arg1, arg2, arg3, dry_run = False): self.assertResourceCalled('Directory', '/usr/lib/ambari-logsearch-logfeeder/conf', - mode = 0755, + mode = 0o755, cd_access = 'a', create_parents = True) package_dirs = conf_select.get_package_dirs(); - for package, dir_defs in package_dirs.iteritems(): + for package, dir_defs in package_dirs.items(): for dir_def in dir_defs: conf_dir = dir_def['conf_dir'] conf_backup_dir = conf_dir + ".backup" @@ -175,12 +175,12 @@ def mocked_conf_select(arg1, arg2, arg3, dry_run = False, ignore_errors = False) self.assertResourceCalled('Directory', '/usr/lib/ambari-logsearch-logfeeder/conf', - mode = 0755, + mode = 0o755, cd_access = 'a', create_parents = True) package_dirs = conf_select.get_package_dirs(); - for package, dir_defs in package_dirs.iteritems(): + for package, dir_defs in package_dirs.items(): for dir_def in dir_defs: conf_dir = dir_def['conf_dir'] conf_backup_dir = conf_dir + ".backup" @@ -277,12 +277,12 @@ def mocked_conf_select(arg1, arg2, arg3, dry_run = False): self.assertResourceCalled('Directory', '/usr/lib/ambari-logsearch-logfeeder/conf', - mode = 0755, + mode = 0o755, cd_access = 'a', create_parents = True) package_dirs = conf_select.get_package_dirs(); - for package, dir_defs in package_dirs.iteritems(): + for package, dir_defs in package_dirs.items(): for dir_def in dir_defs: conf_dir = dir_def['conf_dir'] conf_backup_dir = conf_dir + ".backup" diff --git a/ambari-server/src/test/python/stacks/stack-hooks/before-ANY/test_before_any.py b/ambari-server/src/test/python/stacks/stack-hooks/before-ANY/test_before_any.py index a490debdbdd..93d58b9447d 100644 --- a/ambari-server/src/test/python/stacks/stack-hooks/before-ANY/test_before_any.py +++ b/ambari-server/src/test/python/stacks/stack-hooks/before-ANY/test_before_any.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -57,96 +57,96 @@ def side_effect(path): self.assertResourceCalled('User', 'hive', gid = 'hadoop', uid = None, - groups = [u'hadoop'], + groups = ['hadoop'], fetch_nonlocal_groups = True, ) self.assertResourceCalled('User', 'oozie', gid = 'hadoop', uid = None, - groups = [u'hadoop',u'users'], + groups = ['hadoop','users'], fetch_nonlocal_groups = True, ) self.assertResourceCalled('User', 'nobody', gid = 'hadoop', uid = None, - groups = [u'hadoop',u'nobody'], + groups = ['hadoop','nobody'], fetch_nonlocal_groups = True, ) self.assertResourceCalled('User', 'ambari-qa', gid = 'hadoop', uid = None, - groups = [u'hadoop',u'users'], + groups = ['hadoop','users'], fetch_nonlocal_groups = True, ) self.assertResourceCalled('User', 'flume', gid = 'hadoop', uid = None, - groups = [u'hadoop'], + groups = ['hadoop'], fetch_nonlocal_groups = True, ) self.assertResourceCalled('User', 'hdfs', gid = 'hadoop', uid = None, - groups = [u'hadoop'], + groups = ['hadoop'], fetch_nonlocal_groups = True, ) self.assertResourceCalled('User', 'storm', gid = 'hadoop', uid = None, - groups = [u'hadoop'], + groups = ['hadoop'], fetch_nonlocal_groups = True, ) self.assertResourceCalled('User', 'mapred', gid = 'hadoop', uid = None, - groups = [u'hadoop'], + groups = ['hadoop'], fetch_nonlocal_groups = True, ) self.assertResourceCalled('User', 'hbase', gid = 'hadoop', uid = None, - groups = [u'hadoop'], + groups = ['hadoop'], fetch_nonlocal_groups = True, ) self.assertResourceCalled('User', 'tez', gid = 'hadoop', uid = None, - groups = [u'hadoop',u'users'], + groups = ['hadoop','users'], fetch_nonlocal_groups = True, ) self.assertResourceCalled('User', 'zookeeper', gid = 'hadoop', uid = None, - groups = [u'hadoop'], + groups = ['hadoop'], fetch_nonlocal_groups = True, ) self.assertResourceCalled('User', 'falcon', gid = 'hadoop', uid = None, - groups = [u'hadoop',u'users'], + groups = ['hadoop','users'], fetch_nonlocal_groups = True, ) self.assertResourceCalled('User', 'sqoop', gid = 'hadoop', uid = None, - groups = [u'hadoop'], + groups = ['hadoop'], fetch_nonlocal_groups = True, ) self.assertResourceCalled('User', 'yarn', gid = 'hadoop', uid = None, - groups = [u'hadoop'], + groups = ['hadoop'], fetch_nonlocal_groups = True, ) self.assertResourceCalled('User', 'hcat', gid = 'hadoop', uid = None, - groups = [u'hadoop'], + groups = ['hadoop'], fetch_nonlocal_groups = True, ) self.assertResourceCalled('File', '/tmp/changeUid.sh', content = StaticFile('changeToSecureUid.sh'), - mode = 0555, + mode = 0o555, ) self.assertResourceCalled('Execute', '/tmp/changeUid.sh ambari-qa /tmp/hadoop-ambari-qa,/tmp/hsperfdata_ambari-qa,/home/ambari-qa,/tmp/ambari-qa,/tmp/sqoop-ambari-qa 0', not_if = '(test $(id -u ambari-qa) -gt 1000) || (false)', @@ -154,16 +154,16 @@ def side_effect(path): self.assertResourceCalled('Directory', '/tmp/hbase-hbase', owner = 'hbase', create_parents = True, - mode = 0775, + mode = 0o775, cd_access = 'a', ) self.assertResourceCalled('File', '/tmp/changeUid.sh', content = StaticFile('changeToSecureUid.sh'), - mode = 0555, + mode = 0o555, ) self.assertResourceCalled('File', '/tmp/changeUid.sh', content = StaticFile('changeToSecureUid.sh'), - mode = 0555, + mode = 0o555, ) self.assertResourceCalled('Execute', '/tmp/changeUid.sh hbase /home/hbase,/tmp/hbase,/usr/bin/hbase,/var/log/hbase,/tmp/hbase-hbase 1000', not_if = '(test $(id -u hbase) -gt 1000) || (false)', @@ -178,10 +178,10 @@ def side_effect(path): self.assertResourceCalled('Group', 'test_group',) self.assertResourceCalled('User', 'hdfs', fetch_nonlocal_groups = True, - groups = [u'hadoop', u'hdfs', u'test_group'], + groups = ['hadoop', 'hdfs', 'test_group'], ) self.assertResourceCalled('Directory', '/etc/hadoop', - mode = 0755, + mode = 0o755, ) self.assertResourceCalled('File', '/etc/hadoop/conf/hadoop-env.sh', content = InlineTemplate(self.getConfig()['configurations']['hadoop-env']['content']), @@ -191,7 +191,7 @@ def side_effect(path): self.assertResourceCalled('Directory', '/tmp/hadoop_java_io_tmpdir', owner = 'hdfs', group = 'hadoop', - mode = 01777, + mode = 0o1777, ) self.assertResourceCalled('Directory', '/tmp/AMBARI-artifacts/', create_parents = True, @@ -201,10 +201,10 @@ def side_effect(path): not_if = 'test -f /tmp/jdk-7u67-linux-x64.tar.gz', ) self.assertResourceCalled('File', '/tmp/jdk-7u67-linux-x64.tar.gz', - mode = 0755, + mode = 0o755, ) self.assertResourceCalled('Directory', '/usr/jdk64',) - self.assertResourceCalled('Execute', ('chmod', 'a+x', u'/usr/jdk64'), + self.assertResourceCalled('Execute', ('chmod', 'a+x', '/usr/jdk64'), sudo = True, ) self.assertResourceCalled('Execute', 'cd /tmp/jdk_tmp_dir && tar -xf /tmp/jdk-7u67-linux-x64.tar.gz && ambari-sudo.sh cp -rp /tmp/jdk_tmp_dir/* /usr/jdk64',) @@ -212,10 +212,10 @@ def side_effect(path): action = ['delete'], ) self.assertResourceCalled('File', '/usr/jdk64/jdk1.7.0_45/bin/java', - mode = 0755, + mode = 0o755, cd_access = 'a', ) - self.assertResourceCalled('Execute', ('chmod', '-R', '755', u'/usr/jdk64/jdk1.7.0_45'), + self.assertResourceCalled('Execute', ('chmod', '-R', '755', '/usr/jdk64/jdk1.7.0_45'), sudo = True, ) self.assertNoMoreResources() diff --git a/ambari-server/src/test/python/stacks/stack-hooks/before-INSTALL/test_before_install.py b/ambari-server/src/test/python/stacks/stack-hooks/before-INSTALL/test_before_install.py index b3d9f8f3190..c668e1412b6 100644 --- a/ambari-server/src/test/python/stacks/stack-hooks/before-INSTALL/test_before_install.py +++ b/ambari-server/src/test/python/stacks/stack-hooks/before-INSTALL/test_before_install.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -38,7 +38,7 @@ def test_hook_default(self): self.assertResourceCalled('Repository', 'HDP-2.6-repo-1', base_url = 'http://s3.amazonaws.com/dev.hortonworks.com/HDP/centos6/2.x/BUILDS/2.6.4.0-60', action = ['prepare'], - components = [u'HDP', 'main'], + components = ['HDP', 'main'], repo_template = '[{{repo_id}}]\nname={{repo_id}}\n{% if mirror_list %}mirrorlist={{mirror_list}}{% else %}baseurl={{base_url}}{% endif %}\n\npath=/\nenabled=1\ngpgcheck=0', repo_file_name = None, mirror_list = None, @@ -46,7 +46,7 @@ def test_hook_default(self): self.assertResourceCalled('Repository', 'HDP-2.6-GPL-repo-1', base_url = 'http://s3.amazonaws.com/dev.hortonworks.com/HDP-GPL/centos6/2.x/BUILDS/2.6.4.0-60', action = ['prepare'], - components = [u'HDP-GPL', 'main'], + components = ['HDP-GPL', 'main'], repo_template = '[{{repo_id}}]\nname={{repo_id}}\n{% if mirror_list %}mirrorlist={{mirror_list}}{% else %}baseurl={{base_url}}{% endif %}\n\npath=/\nenabled=1\ngpgcheck=0', repo_file_name = None, mirror_list = None, @@ -54,7 +54,7 @@ def test_hook_default(self): self.assertResourceCalled('Repository', 'HDP-UTILS-1.1.0.22-repo-1', base_url = 'http://s3.amazonaws.com/dev.hortonworks.com/HDP-UTILS-1.1.0.22/repos/centos6', action = ['prepare'], - components = [u'HDP-UTILS', 'main'], + components = ['HDP-UTILS', 'main'], repo_template = '[{{repo_id}}]\nname={{repo_id}}\n{% if mirror_list %}mirrorlist={{mirror_list}}{% else %}baseurl={{base_url}}{% endif %}\n\npath=/\nenabled=1\ngpgcheck=0', repo_file_name = None, mirror_list = None, diff --git a/ambari-server/src/test/python/stacks/stack-hooks/before-SET_KEYTAB/test_before_set_keytab.py b/ambari-server/src/test/python/stacks/stack-hooks/before-SET_KEYTAB/test_before_set_keytab.py index 7d0395b318a..91a7c5bdee5 100644 --- a/ambari-server/src/test/python/stacks/stack-hooks/before-SET_KEYTAB/test_before_set_keytab.py +++ b/ambari-server/src/test/python/stacks/stack-hooks/before-SET_KEYTAB/test_before_set_keytab.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -23,7 +23,7 @@ from resource_management import Hook import itertools -@patch("platform.linux_distribution", new = MagicMock(return_value="Linux")) +@patch("distro.linux_distribution", new = MagicMock(return_value="Linux")) @patch("os.path.exists", new = MagicMock(return_value=True)) @patch.object(Hook, "run_custom_hook") class TestHookBeforeSetKeytab(RMFTestCase): diff --git a/ambari-server/src/test/python/stacks/stack-hooks/before-START/test_before_start.py b/ambari-server/src/test/python/stacks/stack-hooks/before-START/test_before_start.py index a7e857733de..08c5d8515af 100644 --- a/ambari-server/src/test/python/stacks/stack-hooks/before-START/test_before_start.py +++ b/ambari-server/src/test/python/stacks/stack-hooks/before-START/test_before_start.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -24,7 +24,7 @@ from resource_management.core.exceptions import Fail import json -@patch("platform.linux_distribution", new = MagicMock(return_value="Linux")) +@patch("distro.linux_distribution", new = MagicMock(return_value="Linux")) @patch("os.path.exists", new = MagicMock(return_value=True)) @patch.object(Hook, "run_custom_hook", new = MagicMock()) class TestHookBeforeStart(RMFTestCase): @@ -43,7 +43,7 @@ def test_hook_default(self): self.assertResourceCalled('Directory', '/var/log/hadoop', owner = 'root', group = 'hadoop', - mode = 0775, + mode = 0o775, create_parents = True, cd_access = 'a', ) @@ -72,14 +72,14 @@ def test_hook_default(self): ) self.assertResourceCalled('File', '/etc/hadoop/conf/log4j.properties', - mode=0644, + mode=0o644, group='hadoop', owner='hdfs', content=InlineTemplate('log4jproperties\nline2log4jproperties\nline2') ) self.assertResourceCalled('File', '/var/lib/ambari-agent/lib/fast-hdfs-resource.jar', content = StaticFile('fast-hdfs-resource.jar'), - mode = 0644, + mode = 0o644, ) self.assertResourceCalled('File', '/etc/hadoop/conf/hadoop-metrics2.properties', content = InlineTemplate(self.getConfig()['configurations']['hadoop-metrics2.properties']['content']), @@ -88,7 +88,7 @@ def test_hook_default(self): ) self.assertResourceCalled('File', '/etc/hadoop/conf/task-log4j.properties', content = StaticFile('task-log4j.properties'), - mode = 0755, + mode = 0o755, ) self.assertResourceCalled('File', '/etc/hadoop/conf/configuration.xsl', owner = 'hdfs', @@ -101,13 +101,13 @@ def test_hook_default(self): self.assertResourceCalled('File', '/etc/hadoop/conf/topology_mappings.data', owner = 'hdfs', content = Template('topology_mappings.data.j2'), - mode = 0644, + mode = 0o644, group = 'hadoop', only_if = 'test -d /etc/hadoop/conf', ) self.assertResourceCalled('File', '/etc/hadoop/conf/topology_script.py', content = StaticFile('topology_script.py'), - mode = 0755, + mode = 0o755, only_if = 'test -d /etc/hadoop/conf', ) self.assertNoMoreResources() @@ -127,7 +127,7 @@ def test_hook_secured(self): self.assertResourceCalled('Directory', '/var/log/hadoop', owner = 'root', group = 'hadoop', - mode = 0775, + mode = 0o775, create_parents = True, cd_access = 'a', ) @@ -156,14 +156,14 @@ def test_hook_secured(self): ) self.assertResourceCalled('File', '/etc/hadoop/conf/log4j.properties', - mode=0644, + mode=0o644, group='hadoop', owner='hdfs', content=InlineTemplate('log4jproperties\nline2log4jproperties\nline2') ) self.assertResourceCalled('File', '/var/lib/ambari-agent/lib/fast-hdfs-resource.jar', content = StaticFile('fast-hdfs-resource.jar'), - mode = 0644, + mode = 0o644, ) self.assertResourceCalled('File', '/etc/hadoop/conf/hadoop-metrics2.properties', content = InlineTemplate(self.getConfig()['configurations']['hadoop-metrics2.properties']['content']), @@ -172,7 +172,7 @@ def test_hook_secured(self): ) self.assertResourceCalled('File', '/etc/hadoop/conf/task-log4j.properties', content = StaticFile('task-log4j.properties'), - mode = 0755, + mode = 0o755, ) self.assertResourceCalled('File', '/etc/hadoop/conf/configuration.xsl', owner = 'hdfs', @@ -186,12 +186,12 @@ def test_hook_secured(self): owner = 'hdfs', content = Template('topology_mappings.data.j2'), group = 'hadoop', - mode = 0644, + mode = 0o644, only_if = 'test -d /etc/hadoop/conf', ) self.assertResourceCalled('File', '/etc/hadoop/conf/topology_script.py', content = StaticFile('topology_script.py'), - mode = 0755, + mode = 0o755, only_if = 'test -d /etc/hadoop/conf', ) self.assertNoMoreResources() @@ -216,7 +216,7 @@ def test_hook_default_hdfs(self): self.assertResourceCalled('Directory', '/var/log/hadoop', owner = 'root', group = 'hadoop', - mode = 0775, + mode = 0o775, create_parents = True, cd_access = 'a', ) @@ -245,14 +245,14 @@ def test_hook_default_hdfs(self): ) self.assertResourceCalled('File', '/etc/hadoop/conf/log4j.properties', - mode=0644, + mode=0o644, group='hadoop', owner='hdfs', content=InlineTemplate('log4jproperties\nline2log4jproperties\nline2') ) self.assertResourceCalled('File', '/var/lib/ambari-agent/lib/fast-hdfs-resource.jar', content = StaticFile('fast-hdfs-resource.jar'), - mode = 0644, + mode = 0o644, ) self.assertResourceCalled('File', '/etc/hadoop/conf/hadoop-metrics2.properties', content = InlineTemplate(self.getConfig()['configurations']['hadoop-metrics2.properties']['content']), @@ -261,7 +261,7 @@ def test_hook_default_hdfs(self): ) self.assertResourceCalled('File', '/etc/hadoop/conf/task-log4j.properties', content = StaticFile('task-log4j.properties'), - mode = 0755, + mode = 0o755, ) self.assertResourceCalled('File', '/etc/hadoop/conf/configuration.xsl', owner = 'hdfs', @@ -275,12 +275,12 @@ def test_hook_default_hdfs(self): owner = 'hdfs', content = Template('topology_mappings.data.j2'), group = 'hadoop', - mode = 0644, + mode = 0o644, only_if = 'test -d /etc/hadoop/conf', ) self.assertResourceCalled('File', '/etc/hadoop/conf/topology_script.py', content = StaticFile('topology_script.py'), - mode = 0755, + mode = 0o755, only_if = 'test -d /etc/hadoop/conf', ) self.assertNoMoreResources() @@ -307,7 +307,7 @@ def test_hook_refresh_topology_custom_directories(self): self.assertResourceCalled('Directory', '/var/log/hadoop', owner = 'root', group = 'hadoop', - mode = 0775, + mode = 0o775, create_parents = True, cd_access = 'a', ) @@ -336,14 +336,14 @@ def test_hook_refresh_topology_custom_directories(self): ) self.assertResourceCalled('File', '/etc/hadoop/conf/log4j.properties', - mode=0644, + mode=0o644, group='hadoop', owner='hdfs', content=InlineTemplate('log4jproperties\nline2log4jproperties\nline2') ) self.assertResourceCalled('File', '/var/lib/ambari-agent/lib/fast-hdfs-resource.jar', content = StaticFile('fast-hdfs-resource.jar'), - mode = 0644, + mode = 0o644, ) self.assertResourceCalled('File', '/etc/hadoop/conf/hadoop-metrics2.properties', content = InlineTemplate(self.getConfig()['configurations']['hadoop-metrics2.properties']['content']), @@ -352,7 +352,7 @@ def test_hook_refresh_topology_custom_directories(self): ) self.assertResourceCalled('File', '/etc/hadoop/conf/task-log4j.properties', content = StaticFile('task-log4j.properties'), - mode = 0755, + mode = 0o755, ) self.assertResourceCalled('File', '/etc/hadoop/conf/configuration.xsl', owner = 'hdfs', @@ -366,12 +366,12 @@ def test_hook_refresh_topology_custom_directories(self): owner = 'hdfs', content = Template('topology_mappings.data.j2'), group = 'hadoop', - mode = 0644, + mode = 0o644, only_if = 'test -d /etc/hadoop/conf', ) self.assertResourceCalled('File', '/etc/hadoop/conf/topology_script.py', content = StaticFile('topology_script.py'), - mode = 0755, + mode = 0o755, only_if = 'test -d /etc/hadoop/conf', ) self.assertNoMoreResources() diff --git a/ambari-server/src/test/python/stacks/test_stack_adviser.py b/ambari-server/src/test/python/stacks/test_stack_adviser.py index cdfaba2a465..f7a16bc88e2 100644 --- a/ambari-server/src/test/python/stacks/test_stack_adviser.py +++ b/ambari-server/src/test/python/stacks/test_stack_adviser.py @@ -104,7 +104,7 @@ def test_filterHostMounts(self): filtered_hosts = self.stackAdvisor.filterHostMounts(hosts, services) for host in filtered_hosts["items"]: - self.assertEquals(False, filtered_mount in host["Hosts"]["disk_info"]) + self.assertEqual(False, filtered_mount in host["Hosts"]["disk_info"]) def test_getMountPathVariations(self): @@ -169,9 +169,9 @@ def test_getMountPathVariations(self): hosts = self.stackAdvisor.filterHostMounts(hosts, services) avail_mounts = self.stackAdvisor.getMountPathVariations("/test/folder", "DATANODE", services, hosts) - self.assertEquals(True, avail_mounts is not None) - self.assertEquals(1, len(avail_mounts)) - self.assertEquals("/test/folder", avail_mounts[0]) + self.assertEqual(True, avail_mounts is not None) + self.assertEqual(1, len(avail_mounts)) + self.assertEqual("/test/folder", avail_mounts[0]) def test_updateMountProperties(self): hosts = { @@ -242,4 +242,4 @@ def test_updateMountProperties(self): self.stackAdvisor.updateMountProperties("some-site", pathProperties, configurations, services, hosts) - self.assertEquals("/test,/data/test", configurations["some-site"]["properties"]["path_prop"]) + self.assertEqual("/test,/data/test", configurations["some-site"]["properties"]["path_prop"]) diff --git a/ambari-server/src/test/python/stacks/utils/RMFTestCase.py b/ambari-server/src/test/python/stacks/utils/RMFTestCase.py index 579f3c89858..a1ebd29bd17 100644 --- a/ambari-server/src/test/python/stacks/utils/RMFTestCase.py +++ b/ambari-server/src/test/python/stacks/utils/RMFTestCase.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one @@ -28,10 +28,10 @@ import pprint import itertools from mock.mock import MagicMock, patch -import platform +import distro import re -with patch("platform.linux_distribution", return_value = ('Suse','11','Final')): +with patch("distro.linux_distribution", return_value = ('Suse','11','Final')): with patch("os.geteuid", return_value=45000): # required to mock sudo and run tests with right scenario from resource_management.core import sudo from resource_management.core.environment import Environment @@ -110,7 +110,7 @@ def executeScript(self, path, classname=None, command=None, config_file=None, self.config_dict["configurations"]["cluster-env"]["stack_packages"] = RMFTestCase.get_stack_packages() if config_overrides: - for key, value in config_overrides.iteritems(): + for key, value in config_overrides.items(): self.config_dict[key] = value self.config_dict = ConfigDictionary(self.config_dict) @@ -122,7 +122,7 @@ def executeScript(self, path, classname=None, command=None, config_file=None, # get method to execute try: - with patch.object(platform, 'linux_distribution', return_value=os_type): + with patch.object(distro, 'linux_distribution', return_value=os_type): script_module = imp.load_source(classname, script_path) Script.instance = None script_class_inst = RMFTestCase._get_attr(script_module, classname)() @@ -130,7 +130,7 @@ def executeScript(self, path, classname=None, command=None, config_file=None, script_class_inst.available_packages_in_repos = available_packages_in_repos Script.repository_util = RepositoryUtil(self.config_dict) method = RMFTestCase._get_attr(script_class_inst, command) - except IOError, err: + except IOError as err: raise RuntimeError("Cannot load class %s from %s: %s" % (classname, norm_path, err.message)) # Reload params import, otherwise it won't change properties during next import @@ -154,7 +154,7 @@ def executeScript(self, path, classname=None, command=None, config_file=None, with patch.object(Script, 'get_tmp_dir', return_value="/tmp") as mocks_dict['get_tmp_dir']: with patch.object(Script, 'post_start') as mocks_dict['post_start']: with patch('resource_management.libraries.functions.get_kinit_path', return_value=kinit_path_local) as mocks_dict['get_kinit_path']: - with patch.object(platform, 'linux_distribution', return_value=os_type) as mocks_dict['linux_distribution']: + with patch.object(distro, 'linux_distribution', return_value=os_type) as mocks_dict['linux_distribution']: with patch('resource_management.libraries.functions.stack_select.is_package_supported', return_value=True): with patch('resource_management.libraries.functions.stack_select.get_supported_packages', return_value=MagicMock()): with patch.object(os, "environ", new=os_env) as mocks_dict['environ']: @@ -288,7 +288,7 @@ def printResources(self, intendation=4): s = "'{0}', {1},".format( resource.__class__.__name__, self._ppformat(resource.name)) has_arguments = False - for k,v in resource.arguments.iteritems(): + for k,v in resource.arguments.items(): has_arguments = True # correctly output octal mode numbers if k == 'mode' and isinstance( v, int ): @@ -317,7 +317,7 @@ def printResources(self, intendation=4): s = "self.assertResourceCalled({0}{1})".format(s, before_bracket) # Intendation s = self.reindent(s, intendation) - print s + print(s) print(self.reindent("self.assertNoMoreResources()", intendation)) def assertResourceCalledIgnoreEarlier(self, resource_type, name, **kwargs): @@ -334,9 +334,9 @@ def assertResourceCalledIgnoreEarlier(self, resource_type, name, **kwargs): # take the next resource and try it out resource = RMFTestCase.env.resource_list.pop(0) try: - self.assertEquals(resource_type, resource.__class__.__name__) - self.assertEquals(name, resource.name) - self.assertEquals(kwargs, resource.arguments) + self.assertEqual(resource_type, resource.__class__.__name__) + self.assertEqual(name, resource.name) + self.assertEqual(kwargs, resource.arguments) break except AssertionError: pass @@ -346,43 +346,44 @@ def assertResourceCalled(self, resource_type, name, **kwargs): self.assertNotEqual(len(RMFTestCase.env.resource_list), 0, "There were no more resources executed!") resource = RMFTestCase.env.resource_list.pop(0) - self.assertEquals(resource_type, resource.__class__.__name__) - self.assertEquals(name, resource.name) - self.assertEquals(kwargs, resource.arguments) + self.assertEqual(resource_type, resource.__class__.__name__) + self.assertEqual(name, resource.name) + self.assertEqual(kwargs, resource.arguments) def assertResourceCalledRegexp(self, resource_type, name, **kwargs): with patch.object(UnknownConfiguration, '__getattr__', return_value=lambda: "UnknownConfiguration()"): self.assertNotEqual(len(RMFTestCase.env.resource_list), 0, "There were no more resources executed!") resource = RMFTestCase.env.resource_list.pop(0) - self.assertRegexpMatches(resource.__class__.__name__, resource_type) - self.assertRegexpMatches(resource.name, name) + self.assertRegex(resource.__class__.__name__, resource_type) + self.assertRegex(resource.name, name) for key in set(resource.arguments.keys()) | set(kwargs.keys()): resource_value = resource.arguments.get(key, '') actual_value = kwargs.get(key, '') if self.isstring(resource_value): - self.assertRegexpMatches(resource_value, actual_value, + self.assertRegex(resource_value, actual_value, msg="Key '%s': '%s' does not match with '%s'" % (key, resource_value, actual_value)) else: # check only the type of a custom object - self.assertEquals(resource_value.__class__.__name__, actual_value.__class__.__name__) + self.assertEqual(resource_value.__class__.__name__, actual_value.__class__.__name__) def assertRegexpMatches(self, value, pattern, msg=None): if not re.match(pattern, value): - raise AssertionError, msg or 'pattern %s does not match %s' % (pattern, value) + if msg is None: + raise AssertionError('pattern %s does not match %s' % (pattern, value)) def isstring(self, s): if (sys.version_info[0] == 3): return isinstance(s, str) - return isinstance(s, basestring) + return isinstance(s, str) def assertNoMoreResources(self): - self.assertEquals(len(RMFTestCase.env.resource_list), 0, "There were other resources executed!") + self.assertEqual(len(RMFTestCase.env.resource_list), 0, "There were other resources executed!") def assertResourceCalledByIndex(self, index, resource_type, name, **kwargs): resource = RMFTestCase.env.resource_list[index] - self.assertEquals(resource_type, resource.__class__.__name__) - self.assertEquals(name, resource.name) - self.assertEquals(kwargs, resource.arguments) + self.assertEqual(resource_type, resource.__class__.__name__) + self.assertEqual(name, resource.name) + self.assertEqual(kwargs, resource.arguments) # HACK: This is used to check Templates, StaticFile, InlineTemplate in testcases diff --git a/ambari-server/src/test/python/stacks/utils/__init__.py b/ambari-server/src/test/python/stacks/utils/__init__.py index 9ad0eaeec60..280aaf81b7d 100644 --- a/ambari-server/src/test/python/stacks/utils/__init__.py +++ b/ambari-server/src/test/python/stacks/utils/__init__.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one diff --git a/ambari-server/src/test/python/unitTests.py b/ambari-server/src/test/python/unitTests.py index b95b36f2b25..8c0d59a1575 100644 --- a/ambari-server/src/test/python/unitTests.py +++ b/ambari-server/src/test/python/unitTests.py @@ -22,7 +22,7 @@ import sys import re import traceback -from Queue import Empty +from queue import Empty from random import shuffle import fnmatch import tempfile @@ -147,7 +147,7 @@ def resolve_paths_to_import_from_common_services(metainfo_file, base_stack_folde if os.path.isdir(inherited_from_older_version_path): paths_to_import += resolve_paths_to_import_from_common_services(metainfo_file, inherited_from_older_version_path, common_services_parent_dir, service) else: - print "Service %s. Could not get extract from metainfo file: %s. This may prevent modules from being imported." % (service, str(metainfo_file)) + print("Service %s. Could not get extract from metainfo file: %s. This may prevent modules from being imported." % (service, str(metainfo_file))) return paths_to_import diff --git a/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/__init__.py b/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/__init__.py index 5561e1087b2..152033a3be5 100644 --- a/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/__init__.py +++ b/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/__init__.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/hcat.py b/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/hcat.py index 29de1c07ddc..675a89a48e4 100644 --- a/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/hcat.py +++ b/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/hcat.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -23,7 +23,7 @@ def hcat(): - import params + from scripts import params Directory(params.hcat_conf_dir, owner=params.hcat_user, @@ -39,7 +39,7 @@ def hcat(): def hcat_TemplateConfig(name): - import params + from scripts import params TemplateConfig(format("{hcat_conf_dir}/{name}"), owner=params.hcat_user, diff --git a/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/hcat_client.py b/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/hcat_client.py index 8b5921a75e3..fd2098271b1 100644 --- a/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/hcat_client.py +++ b/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/hcat_client.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -20,7 +20,7 @@ import sys from resource_management import * -from hcat import hcat +from scripts.hcat import hcat class HCatClient(Script): def install(self, env): @@ -28,7 +28,7 @@ def install(self, env): self.configure(env) def configure(self, env): - import params + from scripts import params env.set_params(params) diff --git a/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/hcat_service_check.py b/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/hcat_service_check.py index 5112e99d279..f270bab35bd 100644 --- a/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/hcat_service_check.py +++ b/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/hcat_service_check.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -21,7 +21,7 @@ from resource_management import * def hcat_service_check(): - import params + from scripts import params unique = get_unique_id_and_date() output_file = format("/apps/hive/warehouse/hcatsmoke{unique}") @@ -35,7 +35,7 @@ def hcat_service_check(): File('/tmp/hcatSmoke.sh', content=StaticFile("hcatSmoke.sh"), - mode=0755 + mode=0o755 ) prepare_cmd = format("{kinit_cmd}sh /tmp/hcatSmoke.sh hcatsmoke{unique} prepare") diff --git a/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/hive.py b/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/hive.py index 4bfc7c8c881..6f55af3d7e1 100644 --- a/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/hive.py +++ b/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/hive.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -23,15 +23,15 @@ def hive(name=None): - import params + from scripts import params if name == 'metastore' or name == 'hiveserver2': hive_config_dir = params.hive_server_conf_dir - config_file_mode = 0600 + config_file_mode = 0o600 jdbc_connector() else: hive_config_dir = params.hive_conf_dir - config_file_mode = 0644 + config_file_mode = 0o644 Directory(hive_config_dir, owner=params.hive_user, @@ -56,13 +56,13 @@ def hive(name=None): if name == 'metastore': File(params.start_metastore_path, - mode=0755, + mode=0o755, content=StaticFile('startMetastore.sh') ) elif name == 'hiveserver2': File(params.start_hiveserver2_path, - mode=0755, + mode=0o755, content=StaticFile('startHiveserver2.sh') ) @@ -84,17 +84,17 @@ def hive(name=None): def crt_directory(name): - import params + from scripts import params Directory(name, create_parents = True, owner=params.hive_user, group=params.user_group, - mode=0755) + mode=0o755) def crt_file(name): - import params + from scripts import params File(name, owner=params.hive_user, @@ -103,7 +103,7 @@ def crt_file(name): def jdbc_connector(): - import params + from scripts import params if params.hive_jdbc_driver == "com.mysql.jdbc.Driver": cmd = format("hive mkdir -p {artifact_dir} ; cp /usr/share/java/{jdbc_jar_name} {target}") diff --git a/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/hive_client.py b/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/hive_client.py index 0a5fb2b9a49..2dba0f61038 100644 --- a/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/hive_client.py +++ b/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/hive_client.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -20,7 +20,7 @@ import sys from resource_management import * -from hive import hive +from scripts.hive import hive class HiveClient(Script): def install(self, env): @@ -28,7 +28,7 @@ def install(self, env): self.configure(env) def configure(self, env): - import params + from scripts import params env.set_params(params) hive(name='client') diff --git a/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/hive_metastore.py b/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/hive_metastore.py index c741174660d..0ac74a9f2ee 100644 --- a/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/hive_metastore.py +++ b/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/hive_metastore.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -21,8 +21,8 @@ import sys from resource_management import * -from hive import hive -from hive_service import hive_service +from scripts.hive import hive +from scripts.hive_service import hive_service class HiveMetastore(Script): @@ -31,13 +31,13 @@ def install(self, env): self.configure(env) def configure(self, env): - import params + from scripts import params env.set_params(params) hive(name='metastore') def start(self, env): - import params + from scripts import params env.set_params(params) self.configure(env) # FOR SECURITY hive_service( 'metastore', @@ -45,7 +45,7 @@ def start(self, env): ) def stop(self, env): - import params + from scripts import params env.set_params(params) hive_service( 'metastore', @@ -53,7 +53,7 @@ def stop(self, env): ) def status(self, env): - import status_params + from scripts import status_params env.set_params(status_params) pid_file = format("{hive_pid_dir}/{hive_metastore_pid}") # Recursively check all existing gmetad pid files diff --git a/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/hive_server.py b/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/hive_server.py index 3ad81a1b729..93b658abc85 100644 --- a/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/hive_server.py +++ b/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/hive_server.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -21,8 +21,8 @@ import sys from resource_management import * -from hive import hive -from hive_service import hive_service +from scripts.hive import hive +from scripts.hive_service import hive_service class HiveServer(Script): @@ -30,13 +30,13 @@ def install(self, env): self.install_packages(env) self.configure(env) def configure(self, env): - import params + from scripts import params env.set_params(params) hive(name='hiveserver2') def start(self, env): - import params + from scripts import params env.set_params(params) self.configure(env) # FOR SECURITY hive_service( 'hiveserver2', @@ -44,7 +44,7 @@ def start(self, env): ) def stop(self, env): - import params + from scripts import params env.set_params(params) hive_service( 'hiveserver2', @@ -53,7 +53,7 @@ def stop(self, env): def status(self, env): - import status_params + from scripts import status_params env.set_params(status_params) pid_file = format("{hive_pid_dir}/{hive_pid}") # Recursively check all existing gmetad pid files diff --git a/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/hive_service.py b/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/hive_service.py index b4afb66388f..5c4bdaf04fc 100644 --- a/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/hive_service.py +++ b/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/hive_service.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -25,7 +25,7 @@ def hive_service( name, action='start'): - import params + from scripts import params if name == 'metastore': pid_file = format("{hive_pid_dir}/{hive_metastore_pid}") diff --git a/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/mysql_server.py b/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/mysql_server.py index a160d4bd12d..6690d81a46c 100644 --- a/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/mysql_server.py +++ b/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/mysql_server.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -21,7 +21,7 @@ import sys from resource_management import * -from mysql_service import mysql_service +from scripts.mysql_service import mysql_service class MysqlServer(Script): @@ -35,13 +35,13 @@ def install(self, env): self.configure(env) def configure(self, env): - import params + from scripts import params env.set_params(params) mysql_service(daemon_name=self.daemon_name, action='start') File(params.mysql_adduser_path, - mode=0755, + mode=0o755, content=StaticFile('addMysqlUser.sh') ) @@ -59,13 +59,13 @@ def configure(self, env): mysql_service(daemon_name=self.daemon_name, action='stop') def start(self, env): - import params + from scripts import params env.set_params(params) mysql_service(daemon_name=self.daemon_name, action = 'start') def stop(self, env): - import params + from scripts import params env.set_params(params) mysql_service(daemon_name=self.daemon_name, action = 'stop') diff --git a/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/mysql_service.py b/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/mysql_service.py index 4716343fb21..b9622b3ad62 100644 --- a/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/mysql_service.py +++ b/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/mysql_service.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/params.py b/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/params.py index c27f79bbcd9..45ba1ff9fd8 100644 --- a/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/params.py +++ b/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/params.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -19,7 +19,7 @@ """ from resource_management import * -import status_params +from scripts import status_params # server configurations config = Script.get_config() diff --git a/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/service_check.py b/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/service_check.py index 111e8a164a6..b3b83c9e672 100644 --- a/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/service_check.py +++ b/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/service_check.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -20,11 +20,11 @@ from resource_management import * -from hcat_service_check import hcat_service_check +from scripts.hcat_service_check import hcat_service_check class HiveServiceCheck(Script): def service_check(self, env): - import params + from scripts import params env.set_params(params) if params.security_enabled: kinit_cmd = format("{kinit_path_local} -kt {smoke_user_keytab} {smokeuser};") @@ -36,7 +36,7 @@ def service_check(self, env): File(params.smoke_test_path, content=StaticFile('hiveserver2Smoke.sh'), - mode=0755 + mode=0o755 ) File(params.smoke_test_sql, diff --git a/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/status_params.py b/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/status_params.py index 77709755861..6d1fe3e5c35 100644 --- a/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/status_params.py +++ b/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/status_params.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_extension/HIVE/package/scripts/status_params.py b/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_extension/HIVE/package/scripts/status_params.py index 77709755861..6d1fe3e5c35 100644 --- a/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_extension/HIVE/package/scripts/status_params.py +++ b/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_extension/HIVE/package/scripts/status_params.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/__init__.py b/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/__init__.py index 5561e1087b2..152033a3be5 100644 --- a/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/__init__.py +++ b/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/__init__.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/hcat.py b/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/hcat.py index 29de1c07ddc..675a89a48e4 100644 --- a/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/hcat.py +++ b/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/hcat.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -23,7 +23,7 @@ def hcat(): - import params + from scripts import params Directory(params.hcat_conf_dir, owner=params.hcat_user, @@ -39,7 +39,7 @@ def hcat(): def hcat_TemplateConfig(name): - import params + from scripts import params TemplateConfig(format("{hcat_conf_dir}/{name}"), owner=params.hcat_user, diff --git a/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/hcat_client.py b/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/hcat_client.py index 8b5921a75e3..fd2098271b1 100644 --- a/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/hcat_client.py +++ b/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/hcat_client.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -20,7 +20,7 @@ import sys from resource_management import * -from hcat import hcat +from scripts.hcat import hcat class HCatClient(Script): def install(self, env): @@ -28,7 +28,7 @@ def install(self, env): self.configure(env) def configure(self, env): - import params + from scripts import params env.set_params(params) diff --git a/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/hcat_service_check.py b/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/hcat_service_check.py index 5112e99d279..f270bab35bd 100644 --- a/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/hcat_service_check.py +++ b/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/hcat_service_check.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -21,7 +21,7 @@ from resource_management import * def hcat_service_check(): - import params + from scripts import params unique = get_unique_id_and_date() output_file = format("/apps/hive/warehouse/hcatsmoke{unique}") @@ -35,7 +35,7 @@ def hcat_service_check(): File('/tmp/hcatSmoke.sh', content=StaticFile("hcatSmoke.sh"), - mode=0755 + mode=0o755 ) prepare_cmd = format("{kinit_cmd}sh /tmp/hcatSmoke.sh hcatsmoke{unique} prepare") diff --git a/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/hive.py b/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/hive.py index 4bfc7c8c881..6f55af3d7e1 100644 --- a/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/hive.py +++ b/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/hive.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -23,15 +23,15 @@ def hive(name=None): - import params + from scripts import params if name == 'metastore' or name == 'hiveserver2': hive_config_dir = params.hive_server_conf_dir - config_file_mode = 0600 + config_file_mode = 0o600 jdbc_connector() else: hive_config_dir = params.hive_conf_dir - config_file_mode = 0644 + config_file_mode = 0o644 Directory(hive_config_dir, owner=params.hive_user, @@ -56,13 +56,13 @@ def hive(name=None): if name == 'metastore': File(params.start_metastore_path, - mode=0755, + mode=0o755, content=StaticFile('startMetastore.sh') ) elif name == 'hiveserver2': File(params.start_hiveserver2_path, - mode=0755, + mode=0o755, content=StaticFile('startHiveserver2.sh') ) @@ -84,17 +84,17 @@ def hive(name=None): def crt_directory(name): - import params + from scripts import params Directory(name, create_parents = True, owner=params.hive_user, group=params.user_group, - mode=0755) + mode=0o755) def crt_file(name): - import params + from scripts import params File(name, owner=params.hive_user, @@ -103,7 +103,7 @@ def crt_file(name): def jdbc_connector(): - import params + from scripts import params if params.hive_jdbc_driver == "com.mysql.jdbc.Driver": cmd = format("hive mkdir -p {artifact_dir} ; cp /usr/share/java/{jdbc_jar_name} {target}") diff --git a/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/hive_client.py b/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/hive_client.py index 0a5fb2b9a49..2dba0f61038 100644 --- a/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/hive_client.py +++ b/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/hive_client.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -20,7 +20,7 @@ import sys from resource_management import * -from hive import hive +from scripts.hive import hive class HiveClient(Script): def install(self, env): @@ -28,7 +28,7 @@ def install(self, env): self.configure(env) def configure(self, env): - import params + from scripts import params env.set_params(params) hive(name='client') diff --git a/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/hive_metastore.py b/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/hive_metastore.py index c741174660d..0ac74a9f2ee 100644 --- a/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/hive_metastore.py +++ b/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/hive_metastore.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -21,8 +21,8 @@ import sys from resource_management import * -from hive import hive -from hive_service import hive_service +from scripts.hive import hive +from scripts.hive_service import hive_service class HiveMetastore(Script): @@ -31,13 +31,13 @@ def install(self, env): self.configure(env) def configure(self, env): - import params + from scripts import params env.set_params(params) hive(name='metastore') def start(self, env): - import params + from scripts import params env.set_params(params) self.configure(env) # FOR SECURITY hive_service( 'metastore', @@ -45,7 +45,7 @@ def start(self, env): ) def stop(self, env): - import params + from scripts import params env.set_params(params) hive_service( 'metastore', @@ -53,7 +53,7 @@ def stop(self, env): ) def status(self, env): - import status_params + from scripts import status_params env.set_params(status_params) pid_file = format("{hive_pid_dir}/{hive_metastore_pid}") # Recursively check all existing gmetad pid files diff --git a/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/hive_server.py b/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/hive_server.py index 3ad81a1b729..93b658abc85 100644 --- a/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/hive_server.py +++ b/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/hive_server.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -21,8 +21,8 @@ import sys from resource_management import * -from hive import hive -from hive_service import hive_service +from scripts.hive import hive +from scripts.hive_service import hive_service class HiveServer(Script): @@ -30,13 +30,13 @@ def install(self, env): self.install_packages(env) self.configure(env) def configure(self, env): - import params + from scripts import params env.set_params(params) hive(name='hiveserver2') def start(self, env): - import params + from scripts import params env.set_params(params) self.configure(env) # FOR SECURITY hive_service( 'hiveserver2', @@ -44,7 +44,7 @@ def start(self, env): ) def stop(self, env): - import params + from scripts import params env.set_params(params) hive_service( 'hiveserver2', @@ -53,7 +53,7 @@ def stop(self, env): def status(self, env): - import status_params + from scripts import status_params env.set_params(status_params) pid_file = format("{hive_pid_dir}/{hive_pid}") # Recursively check all existing gmetad pid files diff --git a/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/hive_service.py b/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/hive_service.py index e869bc8863a..bf79c0209d2 100644 --- a/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/hive_service.py +++ b/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/hive_service.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -25,7 +25,7 @@ def hive_service( name, action='start'): - import params + from scripts import params if name == 'metastore': pid_file = format("{hive_pid_dir}/{hive_metastore_pid}") diff --git a/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/mysql_server.py b/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/mysql_server.py index a160d4bd12d..6690d81a46c 100644 --- a/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/mysql_server.py +++ b/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/mysql_server.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -21,7 +21,7 @@ import sys from resource_management import * -from mysql_service import mysql_service +from scripts.mysql_service import mysql_service class MysqlServer(Script): @@ -35,13 +35,13 @@ def install(self, env): self.configure(env) def configure(self, env): - import params + from scripts import params env.set_params(params) mysql_service(daemon_name=self.daemon_name, action='start') File(params.mysql_adduser_path, - mode=0755, + mode=0o755, content=StaticFile('addMysqlUser.sh') ) @@ -59,13 +59,13 @@ def configure(self, env): mysql_service(daemon_name=self.daemon_name, action='stop') def start(self, env): - import params + from scripts import params env.set_params(params) mysql_service(daemon_name=self.daemon_name, action = 'start') def stop(self, env): - import params + from scripts import params env.set_params(params) mysql_service(daemon_name=self.daemon_name, action = 'stop') diff --git a/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/mysql_service.py b/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/mysql_service.py index 4716343fb21..b9622b3ad62 100644 --- a/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/mysql_service.py +++ b/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/mysql_service.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/params.py b/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/params.py index c27f79bbcd9..45ba1ff9fd8 100644 --- a/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/params.py +++ b/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/params.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -19,7 +19,7 @@ """ from resource_management import * -import status_params +from scripts import status_params # server configurations config = Script.get_config() diff --git a/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/service_check.py b/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/service_check.py index 111e8a164a6..b3b83c9e672 100644 --- a/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/service_check.py +++ b/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/service_check.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -20,11 +20,11 @@ from resource_management import * -from hcat_service_check import hcat_service_check +from scripts.hcat_service_check import hcat_service_check class HiveServiceCheck(Script): def service_check(self, env): - import params + from scripts import params env.set_params(params) if params.security_enabled: kinit_cmd = format("{kinit_path_local} -kt {smoke_user_keytab} {smokeuser};") @@ -36,7 +36,7 @@ def service_check(self, env): File(params.smoke_test_path, content=StaticFile('hiveserver2Smoke.sh'), - mode=0755 + mode=0o755 ) File(params.smoke_test_sql, diff --git a/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/status_params.py b/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/status_params.py index 77709755861..6d1fe3e5c35 100644 --- a/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/status_params.py +++ b/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/status_params.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/__init__.py b/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/__init__.py index 5561e1087b2..152033a3be5 100644 --- a/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/__init__.py +++ b/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/__init__.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hcat.py b/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hcat.py index 29de1c07ddc..d7fdf128029 100644 --- a/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hcat.py +++ b/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hcat.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hcat_client.py b/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hcat_client.py index 8b5921a75e3..6a1d237edfc 100644 --- a/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hcat_client.py +++ b/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hcat_client.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hcat_service_check.py b/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hcat_service_check.py index 5112e99d279..9e4e932cb18 100644 --- a/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hcat_service_check.py +++ b/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hcat_service_check.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -35,7 +35,7 @@ def hcat_service_check(): File('/tmp/hcatSmoke.sh', content=StaticFile("hcatSmoke.sh"), - mode=0755 + mode=0o755 ) prepare_cmd = format("{kinit_cmd}sh /tmp/hcatSmoke.sh hcatsmoke{unique} prepare") diff --git a/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive.py b/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive.py index 3957ba92f19..27775239e59 100644 --- a/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive.py +++ b/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -27,11 +27,11 @@ def hive(name=None): if name == 'metastore' or name == 'hiveserver2': hive_config_dir = params.hive_server_conf_dir - config_file_mode = 0600 + config_file_mode = 0o600 jdbc_connector() else: hive_config_dir = params.hive_conf_dir - config_file_mode = 0644 + config_file_mode = 0o644 Directory(hive_config_dir, owner=params.hive_user, @@ -56,13 +56,13 @@ def hive(name=None): if name == 'metastore': File(params.start_metastore_path, - mode=0755, + mode=0o755, content=StaticFile('startMetastore.sh') ) elif name == 'hiveserver2': File(params.start_hiveserver2_path, - mode=0755, + mode=0o755, content=StaticFile('startHiveserver2.sh') ) @@ -90,7 +90,7 @@ def crt_directory(name): create_parents = True, owner=params.hive_user, group=params.user_group, - mode=0755) + mode=0o755) def crt_file(name): diff --git a/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive_client.py b/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive_client.py index 0a5fb2b9a49..cfa6f60feaf 100644 --- a/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive_client.py +++ b/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive_client.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive_metastore.py b/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive_metastore.py index c741174660d..d4918182b4d 100644 --- a/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive_metastore.py +++ b/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive_metastore.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive_server.py b/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive_server.py index 3ad81a1b729..9f78bb33bf0 100644 --- a/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive_server.py +++ b/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive_server.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive_service.py b/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive_service.py index 64199147fdb..b990eb2b32a 100644 --- a/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive_service.py +++ b/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive_service.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/mysql_server.py b/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/mysql_server.py index a160d4bd12d..8799addb19d 100644 --- a/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/mysql_server.py +++ b/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/mysql_server.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -41,7 +41,7 @@ def configure(self, env): mysql_service(daemon_name=self.daemon_name, action='start') File(params.mysql_adduser_path, - mode=0755, + mode=0o755, content=StaticFile('addMysqlUser.sh') ) diff --git a/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/mysql_service.py b/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/mysql_service.py index 4716343fb21..b9622b3ad62 100644 --- a/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/mysql_service.py +++ b/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/mysql_service.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/params.py b/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/params.py index 8cb4bd23520..c6a834d9209 100644 --- a/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/params.py +++ b/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/params.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/service_check.py b/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/service_check.py index 111e8a164a6..5fa338c5723 100644 --- a/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/service_check.py +++ b/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/service_check.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -36,7 +36,7 @@ def service_check(self, env): File(params.smoke_test_path, content=StaticFile('hiveserver2Smoke.sh'), - mode=0755 + mode=0o755 ) File(params.smoke_test_sql, diff --git a/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/status_params.py b/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/status_params.py index 77709755861..6d1fe3e5c35 100644 --- a/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/status_params.py +++ b/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/status_params.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/ambari-server/src/test/resources/stacks/old_stack_advisor.py b/ambari-server/src/test/resources/stacks/old_stack_advisor.py index ee5674b8659..64f726497c7 100644 --- a/ambari-server/src/test/resources/stacks/old_stack_advisor.py +++ b/ambari-server/src/test/resources/stacks/old_stack_advisor.py @@ -539,7 +539,7 @@ def getHostForComponent(self, component, hostsList): scheme = self.getComponentLayoutScheme(componentName) if scheme is not None: for key in scheme.keys(): - if isinstance(key, ( int, long )): + if isinstance(key, int): if len(hostsList) < key: return hostsList[scheme[key]] return hostsList[scheme['else']] diff --git a/ambari-web/app/assets/data/services/ambari.json b/ambari-web/app/assets/data/services/ambari.json index 2597dcc79e6..51cb5cbcf42 100644 --- a/ambari-web/app/assets/data/services/ambari.json +++ b/ambari-web/app/assets/data/services/ambari.json @@ -26,8 +26,8 @@ "agent.threadpool.size.max" : "25", "ambari-server.user" : "root", "bootstrap.dir" : "/var/run/ambari-server/bootstrap", - "bootstrap.script" : "/usr/lib/python2.6/site-packages/ambari_server/bootstrap.py", - "bootstrap.setup_agent.script" : "/usr/lib/python2.6/site-packages/ambari_server/setupAgent.py", + "bootstrap.script" : "/usr/lib/python3.9/site-packages/ambari_server/bootstrap.py", + "bootstrap.setup_agent.script" : "/usr/lib/python3.9/site-packages/ambari_server/setupAgent.py", "client.threadpool.size.max" : "25", "custom.action.definitions" : "/var/lib/ambari-server/resources/custom_action_definitions", "java.home" : "/usr/jdk64/jdk1.7.0_67", diff --git a/contrib/utils/perf/deploy-gce-perf-cluster.py b/contrib/utils/perf/deploy-gce-perf-cluster.py index e34b07ce7ab..841545d9bf0 100644 --- a/contrib/utils/perf/deploy-gce-perf-cluster.py +++ b/contrib/utils/perf/deploy-gce-perf-cluster.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file diff --git a/contrib/utils/preinstall-check/src/main/python/preinstall_checker.py b/contrib/utils/preinstall-check/src/main/python/preinstall_checker.py index 1fffe101973..e5018ffaa9e 100644 --- a/contrib/utils/preinstall-check/src/main/python/preinstall_checker.py +++ b/contrib/utils/preinstall-check/src/main/python/preinstall_checker.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one diff --git a/dev-support/config-utils/diff_stack_properties.py b/dev-support/config-utils/diff_stack_properties.py index beef608e113..60f314a558a 100644 --- a/dev-support/config-utils/diff_stack_properties.py +++ b/dev-support/config-utils/diff_stack_properties.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -35,13 +35,13 @@ def main(): """ Parse arguments from user, check that all required args are passed in and start work.""" if len(sys.argv) != 3: - print "usage: diff_stack_properties.py [first_stack_dir] [second_stack_dir]" + print("usage: diff_stack_properties.py [first_stack_dir] [second_stack_dir]") sys.exit(-1) args = sys.argv[1:] if not os.path.exists(args[0]) or not os.path.exists(args[1]): - print "usage: diff_stack_properties.py [first_stack_dir] [second_stack_dir]" + print("usage: diff_stack_properties.py [first_stack_dir] [second_stack_dir]") sys.exit(-1) args = sys.argv[1:] @@ -63,7 +63,7 @@ def do_work(args): def compare_stacks(new_stacks, old_stacks): - print "#############[{}]#############".format(STACKS) + print("#############[{}]#############".format(STACKS)) for stack in [stack for stack in os.listdir(os.path.join(new_stacks, STACKS)) if os.path.isdir(os.path.join(new_stacks, STACKS, stack))]: for version in os.listdir(os.path.join(new_stacks, STACKS, stack)): @@ -71,29 +71,29 @@ def compare_stacks(new_stacks, old_stacks): diff = compare_config_dirs(os.path.join(new_stacks, STACKS, stack, version, CONFIG_DIR), os.path.join(old_stacks, STACKS, stack, version, CONFIG_DIR)) if diff != "": - print "#############{}.{}#############".format(stack, version) - print diff + print("#############{}.{}#############".format(stack, version)) + print(diff) if os.path.exists(os.path.join(new_stacks, STACKS, stack, version, SERVICES_DIR)): - print "#############{}.{}#############".format(stack, version) + print("#############{}.{}#############".format(stack, version)) for service_name in os.listdir(os.path.join(new_stacks, STACKS, stack, version, SERVICES_DIR)): new_configs_dir = os.path.join(new_stacks, STACKS, stack, version, SERVICES_DIR, service_name, CONFIG_DIR) old_configs_dir = os.path.join(old_stacks, STACKS, stack, version, SERVICES_DIR, service_name, CONFIG_DIR) diff = compare_config_dirs(new_configs_dir, old_configs_dir) if diff != "": - print "=========={}==========".format(service_name) - print diff + print("=========={}==========".format(service_name)) + print(diff) def compare_common(new_stacks, old_stacks): - print "#############[{}]#############".format(COMMON) + print("#############[{}]#############".format(COMMON)) for service_name in os.listdir(os.path.join(new_stacks, COMMON)): for version in os.listdir(os.path.join(new_stacks, COMMON, service_name)): new_configs_dir = os.path.join(new_stacks, COMMON, service_name, version, CONFIG_DIR) old_configs_dir = os.path.join(old_stacks, COMMON, service_name, version, CONFIG_DIR) diff = compare_config_dirs(new_configs_dir, old_configs_dir) if diff != "": - print "=========={}.{}==========".format(service_name, version) - print diff + print("=========={}.{}==========".format(service_name, version)) + print(diff) def compare_config_dirs(new_configs_dir, old_configs_dir): diff --git a/dev-support/docker/docker/bin/ambaribuild.py b/dev-support/docker/docker/bin/ambaribuild.py index dfb7d60a765..7cadb2f3e63 100755 --- a/dev-support/docker/docker/bin/ambaribuild.py +++ b/dev-support/docker/docker/bin/ambaribuild.py @@ -90,7 +90,7 @@ def start_ambari_agent(wait_until_registered = True): retcode += proc.wait() if wait_until_registered: if not wait_until_ambari_agent_registered(): - print "ERROR: ambari-agent was not registered." + print("ERROR: ambari-agent was not registered.") sys.exit(1) return retcode @@ -133,9 +133,9 @@ def create_cluster(): # Loop to not to exit Docker container def no_exit(): - print "" - print "loop to not to exit docker container..." - print "" + print("") + print("loop to not to exit docker container...") + print("") while True: time.sleep(NO_EXIT_SLEEP_TIME) @@ -205,7 +205,7 @@ def parse(argv): if __name__ == "__main__": if len(sys.argv) == 1: - print "specify one of test, server, agent or deploy" + print("specify one of test, server, agent or deploy") sys.exit(1) start = datetime.datetime.utcnow() @@ -227,8 +227,8 @@ def parse(argv): if parsed_args.is_test: retcode = ambariUnitTest() end = datetime.datetime.utcnow() - print "" - print "Duration: " + str((end-start).seconds) + " seconds" + print("") + print("Duration: " + str((end-start).seconds) + " seconds") sys.exit(retcode) if parsed_args.is_rebuild: @@ -261,7 +261,7 @@ def parse(argv): end = datetime.datetime.utcnow() - print "" - print "Duration: " + str((end-start).seconds) + " seconds" - print "Parameters: " + str(sys.argv) + print("") + print("Duration: " + str((end-start).seconds) + " seconds") + print("Parameters: " + str(sys.argv)) no_exit() diff --git a/setup.py b/setup.py index 9fa4856c373..0d54ebea309 100755 --- a/setup.py +++ b/setup.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ''' Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file