diff --git a/0001-init.patch b/0001-init.patch new file mode 100644 index 0000000000000000000000000000000000000000..c5addc127ac78e6e820a2b1cceee86337e94f916 --- /dev/null +++ b/0001-init.patch @@ -0,0 +1,112712 @@ +diff -Naur ambari-release-2.7.6-origin/ambari-admin/src/main/resources/ui/admin-web/.gitignore apache-ambari-2.7.6-change/ambari-admin/src/main/resources/ui/admin-web/.gitignore +--- ambari-release-2.7.6-origin/ambari-admin/src/main/resources/ui/admin-web/.gitignore 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-admin/src/main/resources/ui/admin-web/.gitignore 1970-01-01 08:00:00.000000000 +0800 +@@ -1,10 +0,0 @@ +-node_modules +-public +-.tmp +-.sass-cache +-app/bower_components +-test/bower_components +-heroku +-/views +-dist +-node +\ 文件尾没有换行符 +diff -Naur ambari-release-2.7.6-origin/ambari-admin/src/main/resources/ui/admin-web/package.json apache-ambari-2.7.6-change/ambari-admin/src/main/resources/ui/admin-web/package.json +--- ambari-release-2.7.6-origin/ambari-admin/src/main/resources/ui/admin-web/package.json 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-admin/src/main/resources/ui/admin-web/package.json 2022-07-14 16:06:01.000000000 +0800 +@@ -23,8 +23,6 @@ + "karma-chrome-launcher": "0.1.4", + "karma-jasmine": "0.1.5", + "karma-ng-html2js-preprocessor": "^0.1.0", +- "karma-phantomjs-launcher": "0.1", +- "phantomjs": "^2.1.7", + "protractor": "1.0.0" + }, + "scripts": { +diff -Naur ambari-release-2.7.6-origin/ambari-agent/conf/unix/agent-multiplier.py apache-ambari-2.7.6-change/ambari-agent/conf/unix/agent-multiplier.py +--- ambari-release-2.7.6-origin/ambari-agent/conf/unix/agent-multiplier.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/conf/unix/agent-multiplier.py 2022-07-11 00:52:30.000000000 +0800 +@@ -76,18 +76,18 @@ + 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 @@ + 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 @@ + 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 @@ + 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. +@@ -237,7 +237,7 @@ + # 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,8 +249,8 @@ + configs_found = set() + configs_changed = set() + for line in lines: +- for config, value in config_dict.iteritems(): +- p = re.compile(config + "\s?=") ++ for config, value in config_dict.items(): ++ p = re.compile(config + r"\s?=") + if p.match(line): + configs_found.add(config) + new_value = config + "=" + str(value) + "\n" +@@ -262,13 +262,13 @@ + new_lines.append(line) + + # TODO, if can append configs, then this is not needed. +- if len(configs_found) < len(config_dict.keys()): ++ if len(configs_found) < len(list(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 @@ + """ + 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 @@ + 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 @@ + 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) + + 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) + + 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) + + 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 -Naur ambari-release-2.7.6-origin/ambari-agent/conf/unix/install-helper.sh apache-ambari-2.7.6-change/ambari-agent/conf/unix/install-helper.sh +--- ambari-release-2.7.6-origin/ambari-agent/conf/unix/install-helper.sh 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/conf/unix/install-helper.sh 2022-07-13 20:29:41.000000000 +0800 +@@ -41,11 +41,11 @@ + + CLEANUP_MODULES="resource_management;ambari_commons;ambari_agent;ambari_ws4py;ambari_stomp;ambari_jinja2;ambari_simplejson" + +-OLD_COMMON_DIR="/usr/lib/python2.6/site-packages/ambari_commons" +-OLD_RESOURCE_MANAGEMENT_DIR="/usr/lib/python2.6/site-packages/resource_management" +-OLD_JINJA_DIR="/usr/lib/python2.6/site-packages/ambari_jinja2" +-OLD_SIMPLEJSON_DIR="/usr/lib/python2.6/site-packages/ambari_simplejson" +-OLD_AMBARI_AGENT_DIR="/usr/lib/python2.6/site-packages/ambari_agent" ++OLD_COMMON_DIR="/usr/lib/python3.9/site-packages/ambari_commons" ++OLD_RESOURCE_MANAGEMENT_DIR="/usr/lib/python3.9/site-packages/resource_management" ++OLD_JINJA_DIR="/usr/lib/python3.9/site-packages/ambari_jinja2" ++OLD_SIMPLEJSON_DIR="/usr/lib/python3.9/site-packages/ambari_simplejson" ++OLD_AMBARI_AGENT_DIR="/usr/lib/python3.9/site-packages/ambari_agent" + + + resolve_log_file(){ +@@ -128,10 +128,10 @@ + } + + 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/python2;/usr/bin/python2.7" + + 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 >= (2,7)))" 1>>${LOG_FILE} 2>/dev/null + + if [ $? -eq 0 ]; then + echo "${python_binary}" +diff -Naur ambari-release-2.7.6-origin/ambari-agent/conf/unix/upgrade_agent_configs.py apache-ambari-2.7.6-change/ambari-agent/conf/unix/upgrade_agent_configs.py +--- ambari-release-2.7.6-origin/ambari-agent/conf/unix/upgrade_agent_configs.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/conf/unix/upgrade_agent_configs.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,24 +1,7 @@ + #!/usr/bin/ambari-python-wrap +-''' +-Licensed to the Apache Software Foundation (ASF) under one +-or more contributor license agreements. See the NOTICE file +-distributed with this work for additional information +-regarding copyright ownership. The ASF licenses this file +-to you under the Apache License, Version 2.0 (the +-"License"); you may not use this file except in compliance +-with the License. You may obtain a copy of the License at +- +- http://www.apache.org/licenses/LICENSE-2.0 +- +-Unless required by applicable law or agreed to in writing, software +-distributed under the License is distributed on an "AS IS" BASIS, +-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-See the License for the specific language governing permissions and +-limitations under the License. +-''' + + import os +-import ConfigParser ++import configparser + + PROPERTIES_TO_REWRITE = [ + ('heartbeat', 'dirs'), +@@ -33,13 +16,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 {}".format(CONFIG_FILE))) ++ print(("Values will be updated from {} except the following list: {}, {}".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 +30,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: + 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 {} is not found".format(CONFIG_FILE))) + else: +- print "Values are not updated, backup {0} is not found".format(CONFIG_FILE_BACKUP) +\ 文件尾没有换行符 ++ print(("Values are not updated, backup {} is not found".format(CONFIG_FILE_BACKUP))) +diff -Naur ambari-release-2.7.6-origin/ambari-agent/conf/windows/service_wrapper.py apache-ambari-2.7.6-change/ambari-agent/conf/windows/service_wrapper.py +--- ambari-release-2.7.6-origin/ambari-agent/conf/windows/service_wrapper.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/conf/windows/service_wrapper.py 2022-07-11 00:52:30.000000000 +0800 +@@ -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 @@ + 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 @@ + options.exit_message = None + + statusStr = AmbariAgentService.QueryStatus() +- print "Ambari Agent is " + statusStr ++ print("Ambari Agent is " + statusStr) + + + def svcdebug(options): +@@ -201,7 +201,7 @@ + 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 @@ + 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) + +@@ -239,7 +239,7 @@ + pass + except FatalException as e: + if e.reason is not None: +- print_error_msg("Exiting with exit code {0}. \nREASON: {1}".format(e.code, e.reason)) ++ print_error_msg("Exiting with exit code {}. \nREASON: {}".format(e.code, e.reason)) + sys.exit(e.code) + except NonFatalException as e: + options.exit_message = "Ambari Agent '%s' completed with warnings." % action +@@ -247,7 +247,7 @@ + print_warning_msg(e.reason) + + if options.exit_message is not None: +- print options.exit_message ++ print(options.exit_message) + + + if __name__ == '__main__': +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/main/package/dependencies.properties apache-ambari-2.7.6-change/ambari-agent/src/main/package/dependencies.properties +--- ambari-release-2.7.6-origin/ambari-agent/src/main/package/dependencies.properties 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/main/package/dependencies.properties 2022-06-24 23:15:29.000000000 +0800 +@@ -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 +-deb.dependency.list=openssl, python (>= 2.6) +\ 文件尾没有换行符 ++rpm.dependency.list=openssl\nRequires: zlib,\nRequires: python >= 2.6 ++deb.dependency.list=openssl, python (>= 2.6) +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/ActionQueue.py apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/ActionQueue.py +--- ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/ActionQueue.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/ActionQueue.py 2022-07-11 00:52:30.000000000 +0800 +@@ -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 +@@ -43,7 +43,7 @@ + + def hide_passwords(text): + """ Replaces the matching passwords with **** in the given text """ +- return None if text is None else PASSWORD_PATTERN.sub(r'\1{}\3'.format(PASSWORD_REPLACEMENT), text) ++ return None if text is None else PASSWORD_PATTERN.sub(fr'\1{PASSWORD_REPLACEMENT}\3', text) + + + class ActionQueue(threading.Thread): +@@ -62,9 +62,9 @@ + IS_RECOVERY_COMMAND = "isRecoveryCommand" + + def __init__(self, initializer_module): +- super(ActionQueue, self).__init__() +- self.commandQueue = Queue.Queue() +- self.backgroundCommandQueue = Queue.Queue() ++ super().__init__() ++ 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 +@@ -109,7 +109,7 @@ + + # Remove from the command queue by task_id + queue = self.commandQueue +- self.commandQueue = Queue.Queue() ++ self.commandQueue = queue.Queue() + + while not queue.empty(): + queued_command = queue.get(False) +@@ -163,7 +163,7 @@ + break + pass + pass +- except Queue.Empty: ++ except queue.Empty: + pass + except Exception: + logger.exception("ActionQueue thread failed with exception. Re-running it") +@@ -185,7 +185,7 @@ + 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): +@@ -213,7 +213,7 @@ + else: + logger.error("Unrecognized command %s", pprint.pformat(command)) + except Exception: +- logger.exception("Exception while processing {0} command".format(command_type)) ++ logger.exception(f"Exception while processing {command_type} command") + + def tasks_in_progress_or_pending(self): + return not self.commandQueue.empty() or self.recovery_manager.has_active_command() +@@ -280,7 +280,7 @@ + + while retry_duration >= 0: + if taskId in self.taskIdsToCancel: +- logger.info('Command with taskId = {0} canceled'.format(taskId)) ++ logger.info(f'Command with taskId = {taskId} canceled') + command_canceled = True + + self.taskIdsToCancel.discard(taskId) +@@ -312,7 +312,7 @@ + else: + status = CommandStatus.failed + if (command_result['exitcode'] == -signal.SIGTERM) or (command_result['exitcode'] == -signal.SIGKILL): +- logger.info('Command with taskId = {cid} was canceled!'.format(cid=taskId)) ++ logger.info(f'Command with taskId = {taskId} was canceled!') + command_canceled = True + self.taskIdsToCancel.discard(taskId) + break +@@ -323,7 +323,7 @@ + delay = retry_duration + retry_duration -= delay # allow one last attempt + command_result['stderr'] += "\n\nCommand failed. Retrying command execution ...\n\n" +- logger.info("Retrying command with taskId = {cid} after a wait of {delay}".format(cid=taskId, delay=delay)) ++ logger.info(f"Retrying command with taskId = {taskId} after a wait of {delay}") + if 'agentLevelParams' not in command: + command['agentLevelParams'] = {} + +@@ -350,7 +350,7 @@ + + # final result to stdout + command_result['stdout'] += '\n\nCommand completed successfully!\n' if status == CommandStatus.completed else '\n\nCommand failed after ' + str(num_attempts) + ' tries\n' +- logger.info('Command with taskId = {cid} completed successfully!'.format(cid=taskId) if status == CommandStatus.completed else 'Command with taskId = {cid} failed after {attempts} tries'.format(cid=taskId, attempts=num_attempts)) ++ logger.info(f'Command with taskId = {taskId} completed successfully!' if status == CommandStatus.completed else f'Command with taskId = {taskId} failed after {num_attempts} tries') + + role_result = self.commandStatuses.generate_report_template(command) + role_result.update({ +@@ -385,7 +385,7 @@ + + # 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: +@@ -414,9 +414,9 @@ + chunks = split_on_chunks(hide_passwords(text), MAX_SYMBOLS_PER_LOG_MESSAGE) + if len(chunks) > 1: + for i in range(len(chunks)): +- logger.info("Cmd log for taskId={0} and chunk {1}/{2} of log for command: \n".format(taskId, i+1, len(chunks)) + chunks[i]) ++ logger.info(f"Cmd log for taskId={taskId} and chunk {i+1}/{len(chunks)} of log for command: \n" + chunks[i]) + else: +- logger.info("Cmd log for taskId={0}: ".format(taskId) + chunks[0]) ++ logger.info(f"Cmd log for taskId={taskId}: " + chunks[0]) + + def get_retry_delay(self, last_delay): + """ +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/ActualConfigHandler.py apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/ActualConfigHandler.py +--- ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/ActualConfigHandler.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/ActualConfigHandler.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +@@ -48,7 +48,7 @@ + self.write_file(filename, tags) + + def write_client_components(self, serviceName, tags, components): +- from LiveStatus import LiveStatus ++ from .LiveStatus import LiveStatus + for comp in LiveStatus.CLIENT_COMPONENTS: + if comp['serviceName'] == serviceName: + componentName = comp['componentName'] +@@ -69,12 +69,12 @@ + fullname = os.path.join(runDir, filename) + if os.path.isfile(fullname): + res = None +- conf_file = open(os.path.join(runDir, filename), 'r') ++ conf_file = open(os.path.join(runDir, filename)) + try: + 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 +@@ -87,7 +87,7 @@ + return self.read_file(self.CONFIG_NAME) + + def read_actual_component(self, componentName): +- if componentName not in self.configTags.keys(): ++ if componentName not in list(self.configTags.keys()): + self.configTags[componentName] = \ + self.read_file(componentName + "_" + self.CONFIG_NAME) + return self.configTags[componentName] +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/alerts/ams_alert.py apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/alerts/ams_alert.py +--- ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/alerts/ams_alert.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/alerts/ams_alert.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + """ + Licensed to the Apache Software Foundation (ASF) under one +@@ -17,11 +17,11 @@ + 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 ++import urllib.request, urllib.parse, urllib.error + from alerts.metric_alert import MetricAlert + import ambari_simplejson as json + import logging +@@ -42,7 +42,7 @@ + grown beyond the specified threshold within a given time interval. + """ + def __init__(self, alert_meta, alert_source_meta, config): +- super(AmsAlert, self).__init__(alert_meta, alert_source_meta, config) ++ super().__init__(alert_meta, alert_source_meta, config) + + self.metric_info = None + if 'ams' in alert_source_meta: +@@ -65,7 +65,7 @@ + alert_uri = self._get_uri_from_structure(self.uri_property_keys) + + if logger.isEnabledFor(logging.DEBUG): +- logger.debug("[Alert][{0}] Calculated metric URI to be {1} (ssl={2})".format( ++ logger.debug("[Alert][{}] Calculated metric URI to be {} (ssl={})".format( + self.get_name(), alert_uri.uri, str(alert_uri.is_ssl_enabled))) + + host = inet_utils.get_host_from_url(alert_uri.uri) +@@ -84,9 +84,9 @@ + raw_data_points, http_code = self._load_metric(alert_uri.is_ssl_enabled, host, port, self.metric_info) + if not raw_data_points and http_code not in [200, 307]: + collect_result = self.RESULT_UNKNOWN +- value_list.append('HTTP {0} response (metrics unavailable)'.format(str(http_code))) ++ value_list.append('HTTP {} response (metrics unavailable)'.format(str(http_code))) + elif not raw_data_points and http_code in [200, 307]: +- raise Exception("[Alert][{0}] Unable to extract JSON from HTTP response".format(self.get_name())) ++ raise Exception("[Alert][{}] Unable to extract JSON from HTTP response".format(self.get_name())) + else: + + data_points = self.metric_info.calculate_value(raw_data_points) +@@ -96,7 +96,7 @@ + collect_result = self._get_result(value_list[0] if compute_result is None else compute_result) + + if logger.isEnabledFor(logging.DEBUG): +- logger.debug("[Alert][{0}] Computed result = {1}".format(self.get_name(), str(value_list))) ++ logger.debug("[Alert][{}] Computed result = {}".format(self.get_name(), str(value_list))) + + return (collect_result, value_list) + +@@ -118,38 +118,38 @@ + "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))) ++ logger.exception("[Alert][{}] Unable to retrieve metrics from AMS: {}".format(self.get_name(), str(exception))) + status = response.status if 'response' in vars() else None + return (None, status) + finally: + if logger.isEnabledFor(logging.DEBUG): + logger.debug(""" +- AMS request parameters - {0} +- AMS response - {1} ++ AMS request parameters - {} ++ AMS response - {} + """.format(encoded_get_metrics_parameters, data)) + # explicitely close the connection as we've seen python hold onto these + if conn is not None: + try: + conn.close() + except: +- logger.debug("[Alert][{0}] Unable to close URL connection to {1}".format(self.get_name(), url)) ++ logger.debug("[Alert][{}] Unable to close URL connection to {}".format(self.get_name(), url)) + 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}". +@@ -212,17 +212,17 @@ + self.minimum_value = metric_info['minimum_value'] + + if 'value' in metric_info: +- realcode = re.sub('(\{(\d+)\})', 'args[\g<2>][k]', metric_info['value']) ++ realcode = re.sub(r'(\{(\d+)\})', r'args[\g<2>][k]', metric_info['value']) + + 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 -Naur ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/alerts/base_alert.py apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/alerts/base_alert.py +--- ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/alerts/base_alert.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/alerts/base_alert.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + """ + Licensed to the Apache Software Foundation (ASF) under one +@@ -28,7 +28,7 @@ + # create a named tuple to return both the concrete URI and SSL flag + AlertUri = namedtuple('AlertUri', 'uri is_ssl_enabled') + +-class BaseAlert(object): ++class BaseAlert: + # will force a kinit even if klist says there are valid tickets (4 hour default) + _DEFAULT_KINIT_TIMEOUT = 14400000 + +@@ -52,7 +52,7 @@ + + 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'] +@@ -108,7 +108,7 @@ + """ + 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 +@@ -136,7 +136,7 @@ + res_base_text = self._get_reporting_text(result_state) + + except Exception as exception: +- message = "[Alert][{0}] Unable to execute alert. {1}".format( ++ message = "[Alert][{}] Unable to execute alert. {}".format( + self.get_name(), str(exception)) + + # print the exception if in DEBUG, otherwise just log the warning +@@ -150,12 +150,12 @@ + + + if logger.isEnabledFor(logging.DEBUG): +- logger.debug("[Alert][{0}] result = {1}".format(self.get_name(), str(res))) ++ logger.debug("[Alert][{}] result = {}".format(self.get_name(), str(res))) + + 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: +@@ -165,24 +165,24 @@ + # flatten the array and then try formatting it + try: + data['text'] = res_base_text.format(*res[1]) +- except ValueError, value_error: +- logger.warn("[Alert][{0}] - {1}".format(self.get_name(), str(value_error))) ++ except ValueError as value_error: ++ logger.warn("[Alert][{}] - {}".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: +- logger.exception("[Alert][{0}] - The alert's data is not properly formatted".format(self.get_name())) ++ logger.debug("[Alert][{}] text = {}".format(self.get_name(), data['text'])) ++ except Exception as exception: ++ logger.exception("[Alert][{}] - 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 + # alert as UNKNOWN + data['state'] = self.RESULT_UNKNOWN +- data['text'] = "There is a problem with the alert definition: {0}".format(str(exception)) ++ data['text'] = "There is a problem with the alert definition: {}".format(str(exception)) + finally: + # put the alert into the collector so it can be collected on the next run + data['text'] = data['text'].replace('\x00', '') +@@ -215,7 +215,7 @@ + # parse {{foo-bar/baz}}/whatever/{{foobar-site/blah}} + # into + # ['foo-bar/baz', 'foobar-site/blah'] +- placeholder_keys = re.findall("{{(\S+?)}}", key) ++ placeholder_keys = re.findall(r"{{(\S+?)}}", key) + + # if none found, then return the original + if placeholder_keys is None or len(placeholder_keys) == 0: +@@ -255,14 +255,14 @@ + + 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] + + return curr_dict + except KeyError: +- logger.debug("Cache miss for configuration property {0}".format(key)) ++ logger.debug("Cache miss for configuration property {}".format(key)) + return None + + +@@ -428,7 +428,7 @@ + if alert_uri_lookup_keys is None: + return None + +- logger.debug("[Alert][{0}] HA URI structure detected in definition, attempting to lookup dynamic HA properties".format(self.get_name())) ++ logger.debug("[Alert][{}] HA URI structure detected in definition, attempting to lookup dynamic HA properties".format(self.get_name())) + + ha_nameservice = self._get_configuration_value(configurations, alert_uri_lookup_keys.ha_nameservice) + ha_alias_key = alert_uri_lookup_keys.ha_alias_key +@@ -446,7 +446,7 @@ + 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) +@@ -457,7 +457,7 @@ + ha_nameservice_aliases[nameservice] = ha_nameservice_alias + + if not ha_nameservice_aliases: +- logger.warning("[Alert][{0}] HA nameservice value is present but there are no aliases for {1}".format( ++ logger.warning("[Alert][{}] HA nameservice value is present but there are no aliases for {}".format( + self.get_name(), ha_alias_key)) + return None + else: +@@ -475,19 +475,19 @@ + + # no pattern found + if ha_pattern is None: +- logger.warning("[Alert][{0}] There is no matching http(s) pattern for the HA URI".format( ++ logger.warning("[Alert][{}] There is no matching http(s) pattern for the HA URI".format( + self.get_name())) + + return None + + if self.HA_NAMESERVICE_PARAM in ha_pattern and ha_nameservice is None: +- logger.warning("[Alert][{0}] An HA URI pattern of {1} was detected, but there is no nameservice key".format( ++ logger.warning("[Alert][{}] An HA URI pattern of {} was detected, but there is no nameservice key".format( + self.get_name(), ha_pattern)) + + 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 list(ha_nameservice_aliases.items()): + for alias in aliases.split(','): + + # convert dfs.namenode.http-address.{{ha-nameservice}}.{{alias}} into +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/alerts/collector.py apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/alerts/collector.py +--- ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/alerts/collector.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/alerts/collector.py 2022-07-11 00:52:30.000000000 +0800 +@@ -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 @@ + """ + self.__lock.acquire() + try: +- for cluster,alert_map in self.__buckets.iteritems(): +- for alert_name in alert_map.keys(): ++ for cluster,alert_map in list(self.__buckets.items()): ++ for alert_name in list(alert_map.keys()): + alert = alert_map[alert_name] + if alert['uuid'] == alert_uuid: + self.remove(cluster, alert_name) +@@ -80,8 +80,8 @@ + 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 +@@ -89,4 +89,3 @@ + self.__lock.release() + + +- +\ 文件尾没有换行符 +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/alerts/metric_alert.py apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/alerts/metric_alert.py +--- ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/alerts/metric_alert.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/alerts/metric_alert.py 2022-07-11 00:52:30.000000000 +0800 +@@ -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 +@@ -43,7 +43,7 @@ + class MetricAlert(BaseAlert): + + def __init__(self, alert_meta, alert_source_meta, config): +- super(MetricAlert, self).__init__(alert_meta, alert_source_meta, config) ++ super().__init__(alert_meta, alert_source_meta, config) + + connection_timeout = DEFAULT_CONNECTION_TIMEOUT + +@@ -65,7 +65,7 @@ + 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): +@@ -78,7 +78,7 @@ + # use the URI lookup keys to get a final URI value to query + alert_uri = self._get_uri_from_structure(self.uri_property_keys) + +- logger.debug("[Alert][{0}] Calculated metric URI to be {1} (ssl={2})".format( ++ logger.debug("[Alert][{}] Calculated metric URI to be {} (ssl={})".format( + self.get_name(), alert_uri.uri, str(alert_uri.is_ssl_enabled))) + + host = inet_utils.get_host_from_url(alert_uri.uri) +@@ -98,9 +98,9 @@ + jmx_property_values, http_code = self._load_jmx(alert_uri.is_ssl_enabled, host, port, self.metric_info) + if not jmx_property_values and http_code in [200, 307]: + collect_result = self.RESULT_UNKNOWN +- value_list.append('HTTP {0} response (metrics unavailable)'.format(str(http_code))) ++ value_list.append('HTTP {} response (metrics unavailable)'.format(str(http_code))) + elif not jmx_property_values and http_code not in [200, 307]: +- raise Exception("[Alert][{0}] Unable to extract JSON from JMX response".format(self.get_name())) ++ raise Exception("[Alert][{}] Unable to extract JSON from JMX response".format(self.get_name())) + else: + value_list.extend(jmx_property_values) + check_value = self.metric_info.calculate(value_list) +@@ -109,7 +109,7 @@ + collect_result = self._get_result(value_list[0] if check_value is None else check_value) + + if logger.isEnabledFor(logging.DEBUG): +- logger.debug("[Alert][{0}] Resolved values = {1}".format(self.get_name(), str(value_list))) ++ logger.debug("[Alert][{}] Resolved values = {}".format(self.get_name(), str(value_list))) + return (collect_result, value_list) + + +@@ -193,8 +193,8 @@ + 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(): +- url = "{0}://{1}:{2}/jmx?qry={3}".format( ++ for jmx_property_key, jmx_property_value in list(jmx_metric.property_map.items()): ++ url = "{}://{}:{}/jmx?qry={}".format( + "https" if ssl else "http", host, str(port), jmx_property_key) + + # use a customer header processor that will look for the non-standard +@@ -216,26 +216,26 @@ + + 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))) ++ logger.exception("[Alert][{}] Unable to make a web request: {}".format(self.get_name(), str(exception))) + finally: + # explicitely close the connection as we've seen python hold onto these + if response is not None: + try: + response.close() + except: +- logger.debug("[Alert][{0}] Unable to close JMX URL connection to {1}".format ++ logger.debug("[Alert][{}] Unable to close JMX URL connection to {}".format + (self.get_name(), url)) + + json_is_valid = True + 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}". +@@ -248,7 +248,7 @@ + for jmx_prop_list_item in beans: + if "name" in jmx_prop_list_item and jmx_prop_list_item["name"] == jmx_property_key: + if attr not in jmx_prop_list_item: +- raise Exception("Unable to find {0} in JSON from {1} ".format(attr, url)) ++ raise Exception("Unable to find {} in JSON from {} ".format(attr, url)) + json_data = jmx_prop_list_item + + value_list.append(json_data[attr]) +@@ -289,11 +289,11 @@ + self.property_map = {} + + if 'value' in jmx_info: +- realcode = re.sub('(\{(\d+)\})', 'args[\g<2>]', jmx_info['value']) ++ realcode = re.sub(r'(\{(\d+)\})', r'args[\g<2>]', jmx_info['value']) + + 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 -Naur ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/alerts/port_alert.py apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/alerts/port_alert.py +--- ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/alerts/port_alert.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/alerts/port_alert.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + """ + Licensed to the Apache Software Foundation (ASF) under one +@@ -34,7 +34,7 @@ + class PortAlert(BaseAlert): + + def __init__(self, alert_meta, alert_source_meta, config): +- super(PortAlert, self).__init__(alert_meta, alert_source_meta, config) ++ super().__init__(alert_meta, alert_source_meta, config) + + self.uri = None + self.default_port = None +@@ -72,7 +72,7 @@ + + # check warning threshold for sanity + if self.warning_timeout >= 30: +- logger.warn("[Alert][{0}] The warning threshold of {1}s is too large, resetting to {2}s".format( ++ logger.warn("[Alert][{}] The warning threshold of {}s is too large, resetting to {}s".format( + self.get_name(), str(self.warning_timeout), str(DEFAULT_WARNING_TIMEOUT))) + + self.warning_timeout = DEFAULT_WARNING_TIMEOUT +@@ -80,7 +80,7 @@ + + # check critical threshold for sanity + if self.critical_timeout >= 30: +- logger.warn("[Alert][{0}] The critical threshold of {1}s is too large, resetting to {2}s".format( ++ logger.warn("[Alert][{}] The critical threshold of {}s is too large, resetting to {}s".format( + self.get_name(), str(self.critical_timeout), str(DEFAULT_CRITICAL_TIMEOUT))) + + self.critical_timeout = DEFAULT_CRITICAL_TIMEOUT +@@ -96,7 +96,7 @@ + if uri_value is None: + host_not_specified = True + uri_value = self.host_name +- logger.debug("[Alert][{0}] Setting the URI to this host since it wasn't specified".format( ++ logger.debug("[Alert][{}] Setting the URI to this host since it wasn't specified".format( + self.get_name())) + + # in some cases, a single property is a comma-separated list like +@@ -107,7 +107,7 @@ + if self.host_name in item: + uri_value = item + if logger.isEnabledFor(logging.DEBUG): +- logger.debug("[Alert][{0}] Extracted {1} as the host name while parsing the CSV URI {2}".format( ++ logger.debug("[Alert][{}] Extracted {} as the host name while parsing the CSV URI {}".format( + self.get_name(), uri_value, str(uri_value_array))) + break + +@@ -124,13 +124,13 @@ + and self.host_name.lower() != self.public_host_name.lower(): + hosts.append(self.public_host_name) + if logger.isEnabledFor(logging.DEBUG): +- logger.debug("[Alert][{0}] List of hosts = {1}".format(self.get_name(), hosts)) ++ logger.debug(f"[Alert][{self.get_name()}] List of hosts = {hosts}") + + try: + port = int(get_port_from_url(uri_value)) + except: + if self.default_port is None: +- label = 'Unable to determine port from URI {0}'.format(uri_value) ++ label = f'Unable to determine port from URI {uri_value}' + return (self.RESULT_UNKNOWN, [label]) + + port = self.default_port +@@ -139,7 +139,7 @@ + + for host in hosts: + if logger.isEnabledFor(logging.DEBUG): +- logger.debug("[Alert][{0}] Checking {1} on port {2}".format( ++ logger.debug("[Alert][{}] Checking {} on port {}".format( + self.get_name(), host, str(port))) + + s = None +@@ -157,7 +157,7 @@ + s.sendall(self.socket_command) + data = s.recv(1024) + if self.socket_command_response is not None and data != self.socket_command_response: +- raise Exception("Expected response {0}, Actual response {1}".format( ++ raise Exception("Expected response {}, Actual response {}".format( + self.socket_command_response, data)) + end_time = time.time() + milliseconds = end_time - start_time +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/alerts/recovery_alert.py apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/alerts/recovery_alert.py +--- ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/alerts/recovery_alert.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/alerts/recovery_alert.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + """ + Licensed to the Apache Software Foundation (ASF) under one +@@ -31,7 +31,7 @@ + class RecoveryAlert(BaseAlert): + + def __init__(self, alert_meta, alert_source_meta, config, recovery_manager): +- super(RecoveryAlert, self).__init__(alert_meta, alert_source_meta, config) ++ super().__init__(alert_meta, alert_source_meta, config) + + self.recovery_manager = recovery_manager + self.warning_count = DEFAULT_WARNING_RECOVERIES_COUNT +@@ -51,7 +51,7 @@ + self.critical_count = reporting[reporting_state_critical]['count'] + if self.critical_count <= self.warning_count: + if logger.isEnabledFor(logging.DEBUG): +- logger.debug("[Alert][{0}] The CRITICAL value of {1} must be greater than the WARNING value of {2}".format( ++ logger.debug("[Alert][{}] The CRITICAL value of {} must be greater than the WARNING value of {}".format( + self.get_name(), self.critical_count, self.warning_count)) + + def _collect(self): +@@ -61,7 +61,7 @@ + component = self.alert_meta['componentName'] + + if logger.isEnabledFor(logging.DEBUG): +- logger.debug("[Alert][{0}] Checking recovery operations for {1}".format( ++ logger.debug("[Alert][{}] Checking recovery operations for {}".format( + self.get_name(), component)) + + recovery_action_info = {} +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/alerts/script_alert.py apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/alerts/script_alert.py +--- ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/alerts/script_alert.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/alerts/script_alert.py 2022-07-11 00:52:30.000000000 +0800 +@@ -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 @@ + 'unknown': { 'text': '{0}' } + } + +- super(ScriptAlert, self).__init__(alert_meta, alert_source_meta, config) ++ super().__init__(alert_meta, alert_source_meta, config) + + self.path = None + self.stacks_dir = None +@@ -54,7 +54,7 @@ + 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'] +@@ -106,7 +106,7 @@ + except AttributeError: + # it's OK if the module doesn't have get_tokens() ; no tokens will + # be passed in so hopefully the script doesn't need any +- logger.debug("The script {0} does not have a get_tokens() function".format(str(cmd_module))) ++ logger.debug(f"The script {str(cmd_module)} does not have a get_tokens() function") + + Script.config = full_configurations + +@@ -130,7 +130,7 @@ + + return result + else: +- return (self.RESULT_UNKNOWN, ["Unable to execute script {0}".format(self.path)]) ++ return (self.RESULT_UNKNOWN, [f"Unable to execute script {self.path}"]) + + + def _load_source(self): +@@ -159,16 +159,16 @@ + # if the path can't be evaluated, throw exception + if not os.path.exists(self.path_to_script) or not os.path.isfile(self.path_to_script): + raise Exception( +- "Unable to find '{0}' as an absolute path or part of {1} or {2}".format(self.path, ++ "Unable to find '{}' as an absolute path or part of {} or {}".format(self.path, + self.stacks_dir, self.host_scripts_dir)) + + if logger.isEnabledFor(logging.DEBUG): +- logger.debug("[Alert][{0}] Executing script check {1}".format( ++ logger.debug("[Alert][{}] Executing script check {}".format( + self.get_name(), self.path_to_script)) + + + if (not self.path_to_script.endswith('.py')): +- logger.error("[Alert][{0}] Unable to execute script {1}".format( ++ logger.error("[Alert][{}] Unable to execute script {}".format( + self.get_name(), self.path_to_script)) + + return None +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/alerts/web_alert.py apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/alerts/web_alert.py +--- ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/alerts/web_alert.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/alerts/web_alert.py 2022-07-11 00:52:30.000000000 +0800 +@@ -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 +@@ -50,7 +50,7 @@ + class WebAlert(BaseAlert): + + def __init__(self, alert_meta, alert_source_meta, config): +- super(WebAlert, self).__init__(alert_meta, alert_source_meta, config) ++ super().__init__(alert_meta, alert_source_meta, config) + + connection_timeout = DEFAULT_CONNECTION_TIMEOUT + +@@ -68,7 +68,7 @@ + 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): +@@ -78,7 +78,7 @@ + # use the URI lookup keys to get a final URI value to query + alert_uri = self._get_uri_from_structure(self.uri_property_keys) + +- logger.debug("[Alert][{0}] Calculated web URI to be {1} (ssl={2})".format( ++ logger.debug("[Alert][{}] Calculated web URI to be {} (ssl={})".format( + self.get_name(), alert_uri.uri, str(alert_uri.is_ssl_enabled))) + + url = self._build_web_query(alert_uri) +@@ -146,9 +146,9 @@ + host = resolve_address(host) + + if uri_path: +- return "{0}://{1}:{2}/{3}".format(scheme, host, str(port), uri_path) ++ return "{}://{}:{}/{}".format(scheme, host, str(port), uri_path) + else: +- return "{0}://{1}:{2}".format(scheme, host, str(port)) ++ return "{}://{}:{}".format(scheme, host, str(port)) + + def _make_web_request(self, url): + """ +@@ -197,9 +197,9 @@ + 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())) ++ logger.exception("[Alert][{}] Unable to make a web request.".format(self.get_name())) + + return WebResponse(status_code=0, time_millis=0, error_msg=str(exception)) + +@@ -216,12 +216,12 @@ + 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,9 +230,9 @@ + 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())) ++ logger.exception("[Alert][{}] Unable to close socket connection".format(self.get_name())) + + + def _get_reporting_text(self, state): +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/AlertSchedulerHandler.py apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/AlertSchedulerHandler.py +--- ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/AlertSchedulerHandler.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/AlertSchedulerHandler.py 2022-07-11 00:52:30.000000000 +0800 +@@ -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 .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.ExitHelper import ExitHelper + from ambari_agent.FileCache import FileCache + from ambari_agent.Utils import Utils +@@ -113,7 +113,7 @@ + """ + # 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 list(self.alert_definitions_cache.items()): + command_copy = Utils.get_mutable_copy(command) + alert_definitions.append(command_copy) + +@@ -145,7 +145,7 @@ + for _callable in alert_callables: + self.schedule_definition(_callable) + +- logger.info("[AlertScheduler] Starting {0}; currently running: {1}".format( ++ logger.info("[AlertScheduler] Starting {}; currently running: {}".format( + str(self.__scheduler), str(self.__scheduler.running))) + + self.__scheduler.start() +@@ -184,7 +184,7 @@ + # jobs without valid UUIDs should be unscheduled + if uuid_valid is False: + jobs_removed += 1 +- logger.info("[AlertScheduler] Unscheduling {0}".format(scheduled_job.name)) ++ logger.info("[AlertScheduler] Unscheduling {}".format(scheduled_job.name)) + self._collector.remove_by_uuid(scheduled_job.name) + self.__scheduler.unschedule_job(scheduled_job) + +@@ -202,7 +202,7 @@ + jobs_scheduled += 1 + self.schedule_definition(definition) + +- logger.info("[AlertScheduler] Reschedule Summary: {0} rescheduled, {1} unscheduled".format( ++ logger.info("[AlertScheduler] Reschedule Summary: {} rescheduled, {} unscheduled".format( + str(jobs_scheduled), str(jobs_removed))) + + +@@ -222,7 +222,7 @@ + # unschedule all scheduled jobs + for scheduled_job in scheduled_jobs: + jobs_removed += 1 +- logger.info("[AlertScheduler] Unscheduling {0}".format(scheduled_job.name)) ++ logger.info("[AlertScheduler] Unscheduling {}".format(scheduled_job.name)) + self._collector.remove_by_uuid(scheduled_job.name) + self.__scheduler.unschedule_job(scheduled_job) + +@@ -247,7 +247,7 @@ + :return: + """ + definitions = [] +- for cluster_id, command_json in self.alert_definitions_cache.iteritems(): ++ for cluster_id, command_json in list(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'] +@@ -255,7 +255,7 @@ + + # cache the cluster and cluster hash after loading the JSON + if clusterName != '' and clusterHash is not None: +- logger.info('[AlertScheduler] Caching cluster {0} with alert hash {1}'.format(clusterName, clusterHash)) ++ logger.info('[AlertScheduler] Caching cluster {} with alert hash {}'.format(clusterName, clusterHash)) + + for definition in command_json['alertDefinitions']: + alert = self.__json_to_callable(clusterName, hostName, publicHostName, Utils.get_mutable_copy(definition)) +@@ -282,7 +282,7 @@ + source_type = source.get('type', '') + + if logger.isEnabledFor(logging.DEBUG): +- logger.debug("[AlertScheduler] Creating job type {0} with {1}".format(source_type, str(json_definition))) ++ logger.debug("[AlertScheduler] Creating job type {} with {}".format(source_type, str(json_definition))) + + + if source_type == AlertSchedulerHandler.TYPE_METRIC: +@@ -305,7 +305,7 @@ + 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 +@@ -321,7 +321,7 @@ + """ + # NOOP if the definition is disabled; don't schedule it + if not definition.is_enabled(): +- logger.info("[AlertScheduler] The alert {0} with UUID {1} is disabled and will not be scheduled".format( ++ logger.info("[AlertScheduler] The alert {} with UUID {} is disabled and will not be scheduled".format( + definition.get_name(),definition.get_uuid())) + return + +@@ -339,7 +339,7 @@ + if job is not None: + job.name = definition.get_uuid() + +- logger.info("[AlertScheduler] Scheduling {0} with UUID {1}".format( ++ logger.info("[AlertScheduler] Scheduling {} with UUID {}".format( + definition.get_name(), definition.get_uuid())) + + +@@ -376,7 +376,7 @@ + if alert is None: + continue + +- logger.info("[AlertScheduler] Executing on-demand alert {0} ({1})".format(alert.get_name(), ++ logger.info("[AlertScheduler] Executing on-demand alert {} ({})".format(alert.get_name(), + alert.get_uuid())) + + alert.set_helpers(self._collector, self._cluster_configuration, self.configuration_builder) +@@ -401,7 +401,7 @@ + except KeyboardInterrupt: + pass + +- print str(ash.collector().alerts()) ++ print((str(ash.collector().alerts()))) + + ash.stop() + +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/AlertStatusReporter.py apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/AlertStatusReporter.py +--- ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/AlertStatusReporter.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/AlertStatusReporter.py 2022-07-11 00:52:30.000000000 +0800 +@@ -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 @@ + 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'] +@@ -114,7 +113,7 @@ + elif self.alert_repeats[cluster_id][alert_name] < alert_tolerance and alert_state != 'OK': + changed_alerts.append(alert) + else: +- logger.warn("Cannot find alert definition for alert='{0}', alert_state='{1}'." ++ logger.warn("Cannot find alert definition for alert='{}', alert_state='{}'." + .format(alert_name, alert_state)) + + return changed_alerts +@@ -124,7 +123,7 @@ + """ + This needs to be done to remove information about clusters which where deleted (e.g. ambari-server reset) + """ +- for cluster_id in self.reported_alerts.keys(): ++ for cluster_id in list(self.reported_alerts.keys()): + if not cluster_id in self.alert_definitions_cache.get_cluster_ids(): + del self.reported_alerts[cluster_id] + +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/AmbariAgent.py apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/AmbariAgent.py +--- ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/AmbariAgent.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/AmbariAgent.py 2022-07-11 00:52:30.000000000 +0800 +@@ -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 @@ + + AGENT_AUTO_RESTART_EXIT_CODE = 77 + +-if os.environ.has_key("PYTHON_BIN"): ++if "PYTHON_BIN" in os.environ: + AGENT_SCRIPT = os.path.join(os.environ["PYTHON_BIN"],"site-packages/ambari_agent/main.py") + else: + AGENT_SCRIPT = "/usr/lib/ambari-agent/lib/ambari_agent/main.py" +-if os.environ.has_key("AMBARI_PID_DIR"): ++if "AMBARI_PID_DIR" in os.environ: + AGENT_PID_FILE = os.path.join(os.environ["AMBARI_PID_DIR"],"ambari-agent.pid") + else: + AGENT_PID_FILE = "/var/run/ambari-agent/ambari-agent.pid" +@@ -39,7 +39,7 @@ + def main(): + global status + +- if (os.environ.has_key("PYTHON")): ++ if ("PYTHON" in os.environ): + PYTHON = os.environ["PYTHON"] + else: + print("Key 'PYTHON' is not defined in environment variables") +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/AmbariConfig.py apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/AmbariConfig.py +--- ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/AmbariConfig.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/AmbariConfig.py 2022-07-11 00:52:30.000000000 +0800 +@@ -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 . import hostname + import ambari_simplejson as json + import os + import ssl +@@ -105,13 +105,13 @@ + + 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)) + + 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 +@@ -141,9 +141,9 @@ + if os.path.exists(configPath): + config.read(configPath) + else: +- raise Exception("No config found at {0}, use default".format(configPath)) ++ raise Exception("No config found at {}, use default".format(configPath)) + +- except Exception, err: ++ except Exception as err: + logger.warn(err) + setattr(cls, "_conf_cache", config) + return config +@@ -315,7 +315,7 @@ + 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) +@@ -333,7 +333,7 @@ + return default + + def get_api_url(self, server_hostname): +- return "%s://%s:%s" % (self.CONNECTION_PROTOCOL, ++ return "{}://{}:{}".format(self.CONNECTION_PROTOCOL, + server_hostname, + self.get('server', 'url_port')) + +@@ -374,7 +374,7 @@ + if reg_resp and AmbariConfig.AMBARI_PROPERTIES_CATEGORY in reg_resp: + if not self.has_section(AmbariConfig.AMBARI_PROPERTIES_CATEGORY): + self.add_section(AmbariConfig.AMBARI_PROPERTIES_CATEGORY) +- for k, v in reg_resp[AmbariConfig.AMBARI_PROPERTIES_CATEGORY].items(): ++ for k, v in list(reg_resp[AmbariConfig.AMBARI_PROPERTIES_CATEGORY].items()): + self.set(AmbariConfig.AMBARI_PROPERTIES_CATEGORY, k, v) + logger.info("Updating config property (%s) with value (%s)", k, v) + pass +@@ -432,19 +432,19 @@ + + 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 ++ 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) + + def main(): +- print AmbariConfig().config ++ print((AmbariConfig().config)) + + if __name__ == "__main__": + main() +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/apscheduler/events.py apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/apscheduler/events.py +--- ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/apscheduler/events.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/apscheduler/events.py 2022-07-11 00:52:30.000000000 +0800 +@@ -20,7 +20,7 @@ + EVENT_JOB_EXECUTED | EVENT_JOB_ERROR | EVENT_JOB_MISSED) + + +-class SchedulerEvent(object): ++class SchedulerEvent: + """ + An event that concerns the scheduler itself. + +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/apscheduler/job.py apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/apscheduler/job.py +--- ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/apscheduler/job.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/apscheduler/job.py 2022-07-11 00:52:30.000000000 +0800 +@@ -13,7 +13,7 @@ + pass + + +-class Job(object): ++class Job: + """ + Encapsulates the actual Job along with its metadata. Job instances + are created by the scheduler when adding jobs, and should not be +@@ -130,8 +130,8 @@ + return NotImplemented + + def __repr__(self): +- return '' % (self.name, repr(self.trigger)) ++ return f'' + + def __str__(self): +- return '%s (trigger: %s, next run at: %s)' % ( ++ return '{} (trigger: {}, next run at: {})'.format( + self.name, str(self.trigger), str(self.next_run_time)) +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/apscheduler/jobstores/base.py apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/apscheduler/jobstores/base.py +--- ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/apscheduler/jobstores/base.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/apscheduler/jobstores/base.py 2022-07-11 00:52:30.000000000 +0800 +@@ -4,7 +4,7 @@ + """ + + +-class JobStore(object): ++class JobStore: + def add_job(self, job): + """Adds the given job from this store.""" + raise NotImplementedError +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/apscheduler/jobstores/mongodb_store.py apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/apscheduler/jobstores/mongodb_store.py +--- ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/apscheduler/jobstores/mongodb_store.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/apscheduler/jobstores/mongodb_store.py 2022-07-11 00:52:30.000000000 +0800 +@@ -7,7 +7,7 @@ + from apscheduler.job import Job + + try: +- import cPickle as pickle ++ import pickle as pickle + except ImportError: # pragma: nocover + import pickle + +@@ -81,4 +81,4 @@ + + def __repr__(self): + connection = self.collection.database.connection +- return '<%s (connection=%s)>' % (self.__class__.__name__, connection) ++ return f'<{self.__class__.__name__} (connection={connection})>' +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/apscheduler/jobstores/redis_store.py apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/apscheduler/jobstores/redis_store.py +--- ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/apscheduler/jobstores/redis_store.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/apscheduler/jobstores/redis_store.py 2022-07-11 00:52:30.000000000 +0800 +@@ -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 + +@@ -66,9 +66,9 @@ + job_state = {} + try: + job = Job.__new__(Job) +- job_state = pickle.loads(job_dict['job_state'.encode()]) +- job_state['runs'] = long(job_dict['runs'.encode()]) +- dateval = job_dict['next_run_time'.encode()].decode() ++ job_state = pickle.loads(job_dict[b'job_state']) ++ job_state['runs'] = int(job_dict[b'runs']) ++ dateval = job_dict[b'next_run_time'].decode() + job_state['next_run_time'] = datetime.strptime( + dateval, '%Y-%m-%dT%H:%M:%S') + job.__setstate__(job_state) +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/apscheduler/jobstores/shelve_store.py apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/apscheduler/jobstores/shelve_store.py +--- ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/apscheduler/jobstores/shelve_store.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/apscheduler/jobstores/shelve_store.py 2022-07-11 00:52:30.000000000 +0800 +@@ -71,4 +71,4 @@ + self.store.close() + + def __repr__(self): +- return '<%s (path=%s)>' % (self.__class__.__name__, self.path) ++ return f'<{self.__class__.__name__} (path={self.path})>' +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/apscheduler/jobstores/sqlalchemy_store.py apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/apscheduler/jobstores/sqlalchemy_store.py +--- ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/apscheduler/jobstores/sqlalchemy_store.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/apscheduler/jobstores/sqlalchemy_store.py 2022-07-11 00:52:30.000000000 +0800 +@@ -69,7 +69,7 @@ + for row in self.engine.execute(select([self.jobs_t])): + try: + job = Job.__new__(Job) +- job_dict = dict(row.items()) ++ job_dict = dict(list(row.items())) + job.__setstate__(job_dict) + jobs.append(job) + except Exception: +@@ -88,4 +88,4 @@ + self.engine.dispose() + + def __repr__(self): +- return '<%s (url=%s)>' % (self.__class__.__name__, self.engine.url) ++ return f'<{self.__class__.__name__} (url={self.engine.url})>' +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/apscheduler/scheduler.py apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/apscheduler/scheduler.py +--- ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/apscheduler/scheduler.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/apscheduler/scheduler.py 2022-07-11 00:52:30.000000000 +0800 +@@ -29,7 +29,7 @@ + return 'Scheduler is already running' + + +-class Scheduler(object): ++class Scheduler: + """ + This class is responsible for scheduling jobs and triggering + their execution. +@@ -72,12 +72,12 @@ + # Configure job stores + jobstore_opts = combine_opts(config, 'jobstore.') + jobstores = {} +- for key, value in jobstore_opts.items(): ++ for key, value in list(jobstore_opts.items()): + store_name, option = key.split('.', 1) + opts_dict = jobstores.setdefault(store_name, {}) + opts_dict[option] = value + +- for alias, opts in jobstores.items(): ++ for alias, opts in list(jobstores.items()): + classname = opts.pop('class') + cls = maybe_ref(classname) + jobstore = cls(**opts) +@@ -589,7 +589,7 @@ + next_wakeup_time, wait_seconds) + try: + self._wakeup.wait(wait_seconds) +- except IOError: # Catch errno 514 on some Linux kernels ++ except OSError: # Catch errno 514 on some Linux kernels + pass + self._wakeup.clear() + elif self.standalone: +@@ -600,7 +600,7 @@ + logger.debug('No jobs; waiting until a job is added') + try: + self._wakeup.wait() +- except IOError: # Catch errno 514 on some Linux kernels ++ except OSError: # Catch errno 514 on some Linux kernels + pass + self._wakeup.clear() + +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/apscheduler/threadpool.py apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/apscheduler/threadpool.py +--- ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/apscheduler/threadpool.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/apscheduler/threadpool.py 2022-07-11 00:52:30.000000000 +0800 +@@ -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() +@@ -30,7 +30,7 @@ + ExitHelper().register(_shutdown_all) + + +-class ThreadPool(object): ++class ThreadPool: + def __init__(self, core_threads=0, max_threads=20, keepalive=1, context_injector=None, agent_config=None): + """ + :param core_threads: maximum number of persistent threads in the pool +@@ -140,4 +140,4 @@ + else: + threadcount = '%d' % self.num_threads + +- return '' % (id(self), threadcount) ++ return f'' +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/apscheduler/triggers/cron/expressions.py apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/apscheduler/triggers/cron/expressions.py +--- ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/apscheduler/triggers/cron/expressions.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/apscheduler/triggers/cron/expressions.py 2022-07-11 00:52:30.000000000 +0800 +@@ -14,7 +14,7 @@ + WEEKDAYS = ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun'] + + +-class AllExpression(object): ++class AllExpression: + value_re = re.compile(r'\*(?:/(?P\d+))?$') + + def __init__(self, step=None): +@@ -43,7 +43,7 @@ + return '*' + + def __repr__(self): +- return "%s(%s)" % (self.__class__.__name__, self.step) ++ return f"{self.__class__.__name__}({self.step})" + + + class RangeExpression(AllExpression): +@@ -98,7 +98,7 @@ + args.append(str(self.last)) + if self.step: + args.append(str(self.step)) +- return "%s(%s)" % (self.__class__.__name__, ', '.join(args)) ++ return "{}({})".format(self.__class__.__name__, ', '.join(args)) + + + class WeekdayRangeExpression(RangeExpression): +@@ -123,14 +123,14 @@ + + def __str__(self): + if self.last != self.first and self.last is not None: +- return '%s-%s' % (WEEKDAYS[self.first], WEEKDAYS[self.last]) ++ return f'{WEEKDAYS[self.first]}-{WEEKDAYS[self.last]}' + return WEEKDAYS[self.first] + + def __repr__(self): + args = ["'%s'" % WEEKDAYS[self.first]] + if self.last != self.first and self.last is not None: + args.append("'%s'" % WEEKDAYS[self.last]) +- return "%s(%s)" % (self.__class__.__name__, ', '.join(args)) ++ return "{}({})".format(self.__class__.__name__, ', '.join(args)) + + + class WeekdayPositionExpression(AllExpression): +@@ -169,11 +169,11 @@ + return target_day + + def __str__(self): +- return '%s %s' % (self.options[self.option_num], ++ return '{} {}'.format(self.options[self.option_num], + WEEKDAYS[self.weekday]) + + def __repr__(self): +- return "%s('%s', '%s')" % (self.__class__.__name__, ++ return "{}('{}', '{}')".format(self.__class__.__name__, + self.options[self.option_num], + WEEKDAYS[self.weekday]) + +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/apscheduler/triggers/cron/fields.py apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/apscheduler/triggers/cron/fields.py +--- ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/apscheduler/triggers/cron/fields.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/apscheduler/triggers/cron/fields.py 2022-07-11 00:52:30.000000000 +0800 +@@ -19,7 +19,7 @@ + 'day_of_week': '*', 'hour': 0, 'minute': 0, 'second': 0} + + +-class BaseField(object): ++class BaseField: + REAL = True + COMPILERS = [AllExpression, RangeExpression] + +@@ -73,7 +73,7 @@ + return ','.join(expr_strings) + + def __repr__(self): +- return "%s('%s', '%s')" % (self.__class__.__name__, self.name, ++ return "{}('{}', '{}')".format(self.__class__.__name__, self.name, + str(self)) + + +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/apscheduler/triggers/cron/__init__.py apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/apscheduler/triggers/cron/__init__.py +--- ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/apscheduler/triggers/cron/__init__.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/apscheduler/triggers/cron/__init__.py 2022-07-11 00:52:30.000000000 +0800 +@@ -4,7 +4,7 @@ + from apscheduler.util import datetime_ceil, convert_to_datetime, iteritems + + +-class CronTrigger(object): ++class CronTrigger: + FIELD_NAMES = ('year', 'month', 'day', 'week', 'day_of_week', 'hour', + 'minute', 'second') + FIELDS_MAP = {'year': BaseField, +@@ -132,13 +132,13 @@ + return next_date + + def __str__(self): +- options = ["%s='%s'" % (f.name, str(f)) for f in self.fields ++ options = [f"{f.name}='{str(f)}'" for f in self.fields + if not f.is_default] + return 'cron[%s]' % (', '.join(options)) + + def __repr__(self): +- options = ["%s='%s'" % (f.name, str(f)) for f in self.fields ++ options = [f"{f.name}='{str(f)}'" for f in self.fields + if not f.is_default] + if self.start_date: + options.append("start_date='%s'" % self.start_date.isoformat(' ')) +- return '<%s (%s)>' % (self.__class__.__name__, ', '.join(options)) ++ return '<{} ({})>'.format(self.__class__.__name__, ', '.join(options)) +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/apscheduler/triggers/interval.py apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/apscheduler/triggers/interval.py +--- ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/apscheduler/triggers/interval.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/apscheduler/triggers/interval.py 2022-07-11 00:52:30.000000000 +0800 +@@ -4,7 +4,7 @@ + from apscheduler.util import convert_to_datetime, timedelta_seconds + + +-class IntervalTrigger(object): ++class IntervalTrigger: + def __init__(self, interval, start_date=None): + if not isinstance(interval, timedelta): + raise TypeError('interval must be a timedelta') +@@ -34,6 +34,6 @@ + return 'interval[%s]' % str(self.interval) + + def __repr__(self): +- return "<%s (interval=%s, start_date=%s)>" % ( ++ return "<{} (interval={}, start_date={})>".format( + self.__class__.__name__, repr(self.interval), + repr(self.start_date)) +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/apscheduler/triggers/simple.py apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/apscheduler/triggers/simple.py +--- ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/apscheduler/triggers/simple.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/apscheduler/triggers/simple.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,7 +1,7 @@ + from apscheduler.util import convert_to_datetime + + +-class SimpleTrigger(object): ++class SimpleTrigger: + def __init__(self, run_date): + self.run_date = convert_to_datetime(run_date) + +@@ -13,5 +13,5 @@ + return 'date[%s]' % str(self.run_date) + + def __repr__(self): +- return '<%s (run_date=%s)>' % ( ++ return '<{} (run_date={})>'.format( + self.__class__.__name__, repr(self.run_date)) +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/apscheduler/util.py apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/apscheduler/util.py +--- ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/apscheduler/util.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/apscheduler/util.py 2022-07-11 00:52:30.000000000 +0800 +@@ -63,11 +63,11 @@ + 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') +- values = [(k, int(v or 0)) for k, v in m.groupdict().items()] ++ values = [(k, int(v or 0)) for k, v in list(m.groupdict().items())] + values = dict(values) + return datetime(**values) + raise TypeError('Unsupported input type: %s' % type(input)) +@@ -125,7 +125,7 @@ + """ + prefixlen = len(prefix) + subconf = {} +- for key, value in global_config.items(): ++ for key, value in list(global_config.items()): + if key.startswith(prefix): + key = key[prefixlen:] + subconf[key] = value +@@ -143,9 +143,9 @@ + if isinstance(f_self, type): + # class method + clsname = getattr(f_self, '__qualname__', None) or f_self.__name__ +- return '%s.%s' % (clsname, func.__name__) ++ return f'{clsname}.{func.__name__}' + # bound method +- return '%s.%s' % (f_self.__class__.__name__, func.__name__) ++ return f'{f_self.__class__.__name__}.{func.__name__}' + + if hasattr(func, '__call__'): + if hasattr(func, '__name__'): +@@ -162,7 +162,7 @@ + """ + Returns the path to the given object. + """ +- ref = '%s:%s' % (obj.__module__, get_callable_name(obj)) ++ ref = f'{obj.__module__}:{get_callable_name(obj)}' + try: + obj2 = ref_to_obj(ref) + if obj != obj2: +@@ -177,7 +177,7 @@ + """ + 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') +@@ -218,13 +218,7 @@ + return string # pragma: nocover + + +-if sys.version_info < (3, 0): # pragma: nocover +- iteritems = lambda d: d.iteritems() +- itervalues = lambda d: d.itervalues() +- xrange = xrange +- basestring = basestring +-else: # pragma: nocover +- iteritems = lambda d: d.items() +- itervalues = lambda d: d.values() +- xrange = range +- basestring = str ++iteritems = lambda d: list(d.items()) ++itervalues = lambda d: list(d.values()) ++xrange = range ++str = str +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/BackgroundCommandExecutionHandle.py apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/BackgroundCommandExecutionHandle.py +--- ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/BackgroundCommandExecutionHandle.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/BackgroundCommandExecutionHandle.py 2022-07-11 00:52:30.000000000 +0800 +@@ -38,4 +38,4 @@ + self.on_background_command_complete_callback = on_background_command_complete_callback + + def __str__(self): +- return "[BackgroundHandle: pid='{0}', status='{1}', exitCode='{2}', commandId='{3}']".format(self.pid, self.status, self.exitCode, self.commandId) ++ return f"[BackgroundHandle: pid='{self.pid}', status='{self.status}', exitCode='{self.exitCode}', commandId='{self.commandId}']" +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/client_example.py apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/client_example.py +--- ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/client_example.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/client_example.py 2022-07-11 00:52:30.000000000 +0800 +@@ -35,17 +35,17 @@ + + class MyListener(ambari_stomp.ConnectionListener): + def on_message(self, headers, message): +- print('MyListener:\nreceived a message "{0}"\n'.format(message)) ++ print(('MyListener:\nreceived a message "{}"\n'.format(message))) + global read_messages +- print headers +- print message ++ print(headers) ++ print(message) + read_messages.append({'id': headers['message-id'], 'subscription':headers['subscription']}) + + + class MyStatsListener(ambari_stomp.StatsListener): + def on_disconnected(self): +- super(MyStatsListener, self).on_disconnected() +- print('MyStatsListener:\n{0}\n'.format(self)) ++ super().on_disconnected() ++ print(('MyStatsListener:\n{}\n'.format(self))) + + read_messages = [] + +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/ClusterAlertDefinitionsCache.py apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/ClusterAlertDefinitionsCache.py +--- ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/ClusterAlertDefinitionsCache.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/ClusterAlertDefinitionsCache.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + """ + Licensed to the Apache Software Foundation (ASF) under one +@@ -39,11 +39,11 @@ + :param cluster_cache_dir: + :return: + """ +- super(ClusterAlertDefinitionsCache, self).__init__(cluster_cache_dir) ++ super().__init__(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 @@ + 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 list(cache_update[cluster_id].items()): + if property == 'alertDefinitions': + continue + +@@ -81,7 +81,7 @@ + + for cluster_id in cache_update: + if not cluster_id in mutable_dict: +- logger.error("Cannot do alert_definitions delete for cluster cluster_id={0}, because do not have information about the cluster".format(cluster_id)) ++ logger.error(f"Cannot do alert_definitions delete for cluster cluster_id={cluster_id}, because do not have information about the cluster") + continue + + # deleting whole cluster +@@ -95,7 +95,7 @@ + index_of_alert = self.get_alert_definition_index_by_id(mutable_dict, cluster_id, id_to_update) + + if index_of_alert == None: +- raise Exception("Cannot delete an alert with id={0}".format(id_to_update)) ++ raise Exception(f"Cannot delete an alert with id={id_to_update}") + + del mutable_dict[cluster_id]['alertDefinitions'][index_of_alert] + +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/ClusterCache.py apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/ClusterCache.py +--- ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/ClusterCache.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/ClusterCache.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + """ + Licensed to the Apache Software Foundation (ASF) under one +@@ -58,14 +58,14 @@ + try: + with self.__file_lock: + if os.path.isfile(self.__current_cache_json_file): +- with open(self.__current_cache_json_file, 'r') as fp: ++ with open(self.__current_cache_json_file) as fp: + cache_dict = json.load(fp) + + if os.path.isfile(self.__current_cache_hash_file): +- with open(self.__current_cache_hash_file, 'r') as fp: ++ with open(self.__current_cache_hash_file) as fp: + self.hash = fp.read() +- except (IOError,ValueError): +- logger.exception("Cannot load data from {0} and {1}".format(self.__current_cache_json_file, self.__current_cache_hash_file)) ++ except (OSError, ValueError): ++ logger.exception(f"Cannot load data from {self.__current_cache_json_file} and {self.__current_cache_hash_file}") + self.hash = None + cache_dict = {} + +@@ -73,7 +73,7 @@ + self.rewrite_cache(cache_dict, self.hash) + except: + # Example: hostname change and restart causes old topology loading to fail with exception +- logger.exception("Loading saved cache for {0} failed".format(self.__class__.__name__)) ++ logger.exception(f"Loading saved cache for {self.__class__.__name__} failed") + self.rewrite_cache({}, None) + os.remove(self.__current_cache_hash_file) + +@@ -81,7 +81,7 @@ + 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 +@@ -92,7 +92,7 @@ + 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 list(cache.items()): + self.rewrite_cluster_cache(cluster_id, cluster_cache) + + with self._cache_lock: +@@ -123,7 +123,7 @@ + :param cache: + :return: + """ +- logger.info("Rewriting cache {0} for cluster {1}".format(self.__class__.__name__, cluster_id)) ++ logger.info(f"Rewriting cache {self.__class__.__name__} for cluster {cluster_id}") + + # The cache should contain exactly the data received from server. + # Modifications on agent-side will lead to unnecessary cache sync every agent registration. Which is a big concern on perf clusters! +@@ -151,9 +151,9 @@ + + def __getitem__(self, key): + try: +- return super(ClusterCache, self).__getitem__(key) ++ return super().__getitem__(key) + except KeyError: +- raise KeyError("{0} for cluster_id={1} is missing. Check if server sent it.".format(self.get_cache_name().title(), key)) ++ raise KeyError(f"{self.get_cache_name().title()} for cluster_id={key} is missing. Check if server sent it.") + + def on_cache_update(self): + """ +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/ClusterConfigurationCache.py apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/ClusterConfigurationCache.py +--- ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/ClusterConfigurationCache.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/ClusterConfigurationCache.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + """ + Licensed to the Apache Software Foundation (ASF) under one +@@ -37,10 +37,10 @@ + :return: + """ + self.initializer_module = initializer_module +- super(ClusterConfigurationCache, self).__init__(cluster_cache_dir) ++ super().__init__(cluster_cache_dir) + + def on_cache_update(self): +- for cluster_id, configurations in self.iteritems(): ++ for cluster_id, configurations in list(self.items()): + # FIXME: Recovery manager does not support multiple cluster as of now. + self.initializer_module.recovery_manager.cluster_id = cluster_id + self.initializer_module.recovery_manager.on_config_update(configurations) +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/ClusterHostLevelParamsCache.py apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/ClusterHostLevelParamsCache.py +--- ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/ClusterHostLevelParamsCache.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/ClusterHostLevelParamsCache.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + """ + Licensed to the Apache Software Foundation (ASF) under one +@@ -40,10 +40,10 @@ + :return: + """ + self.initializer_module = initializer_module +- super(ClusterHostLevelParamsCache, self).__init__(cluster_cache_dir) ++ super().__init__(cluster_cache_dir) + + def on_cache_update(self): +- for cluster_id, host_level_params in self.iteritems(): ++ for cluster_id, host_level_params in list(self.items()): + # FIXME: Recovery manager does not support multiple cluster as of now. + if 'recoveryConfig' in host_level_params: + logger.info("Updating recoveryConfig from hostLevelParams") +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/ClusterMetadataCache.py apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/ClusterMetadataCache.py +--- ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/ClusterMetadataCache.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/ClusterMetadataCache.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + """ + Licensed to the Apache Software Foundation (ASF) under one +@@ -36,7 +36,7 @@ + :param cluster_cache_dir: + :return: + """ +- super(ClusterMetadataCache, self).__init__(cluster_cache_dir) ++ super().__init__(cluster_cache_dir) + + def cache_delete(self, cache_update, cache_hash): + """ +@@ -45,7 +45,7 @@ + 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 list(cache_update.items()): + if cluster_updates_dict != {}: + raise Exception("Deleting cluster subvalues is not supported") + +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/ClusterTopologyCache.py apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/ClusterTopologyCache.py +--- ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/ClusterTopologyCache.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/ClusterTopologyCache.py 2022-07-11 00:52:30.000000000 +0800 +@@ -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 @@ + self.cluster_local_components = {} + self.cluster_host_info = None + self.component_version_map = {} +- super(ClusterTopologyCache, self).__init__(cluster_cache_dir) ++ super().__init__(cluster_cache_dir) + + def get_cache_name(self): + return 'topology' +@@ -62,7 +62,7 @@ + hosts_to_id = defaultdict(lambda:{}) + components_by_key = defaultdict(lambda:{}) + +- for cluster_id, cluster_topology in self.iteritems(): ++ for cluster_id, cluster_topology in list(self.items()): + self.current_host_ids_to_cluster[cluster_id] = None + if 'hosts' in cluster_topology: + for host_dict in cluster_topology.hosts: +@@ -73,10 +73,10 @@ + + if 'components' in cluster_topology: + for component_dict in cluster_topology.components: +- key = "{0}/{1}".format(component_dict.serviceName, component_dict.componentName) ++ key = f"{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 list(self.items()): + self.cluster_local_components[cluster_id] = [] + self.component_version_map[cluster_id] = defaultdict(lambda:defaultdict(lambda: {})) + +@@ -115,7 +115,7 @@ + hostnames.append(self.hosts_to_id[cluster_id][host_id].hostName) + else: + # In theory this should never happen. But in practice it happened when ambari-server had corrupt DB cache. +- logger.warning("Cannot find host_id={} in cluster_id={}".format(host_id, cluster_id)) ++ logger.warning(f"Cannot find host_id={host_id} in cluster_id={cluster_id}") + + cluster_host_info[component_name.lower()+"_hosts"] += hostnames + +@@ -140,7 +140,7 @@ + """ + Find component by service_name and component_name in list of component dictionaries. + """ +- key = "{0}/{1}".format(service_name, component_name) ++ key = f"{service_name}/{component_name}" + + try: + return self.components_by_key[cluster_id][key] +@@ -203,7 +203,7 @@ + """ + mutable_dict = self._get_mutable_copy() + +- for cluster_id, cluster_updates_dict in cache_update.iteritems(): ++ for cluster_id, cluster_updates_dict in list(cache_update.items()): + # adding a new cluster via UPDATE + if not cluster_id in mutable_dict: + mutable_dict[cluster_id] = cluster_updates_dict +@@ -253,9 +253,9 @@ + 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 list(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)) ++ logger.error(f"Cannot do topology delete for cluster cluster_id={cluster_id}, because do not have information about the cluster") + continue + + if 'hosts' in cluster_updates_dict: +@@ -265,7 +265,7 @@ + if host_to_delete is not None: + mutable_dict[cluster_id]['hosts'] = [host_dict for host_dict in hosts_mutable_list if host_dict != host_to_delete] + else: +- logger.error("Cannot do topology delete for cluster_id={0}, host_id={1}, because cannot find the host in cache".format(cluster_id, host_updates_dict['hostId'])) ++ logger.error("Cannot do topology delete for cluster_id={}, host_id={}, because cannot find the host in cache".format(cluster_id, host_updates_dict['hostId'])) + + if 'components' in cluster_updates_dict: + components_mutable_list = mutable_dict[cluster_id]['components'] +@@ -278,7 +278,7 @@ + if component_mutable_dict is not None: + mutable_dict[cluster_id]['components'] = [component_dict for component_dict in components_mutable_list if component_dict != component_mutable_dict] + else: +- logger.error("Cannot do component delete for cluster_id={0}, serviceName={1}, componentName={2}, because cannot find the host in cache".format(cluster_id, component_updates_dict['serviceName'], component_updates_dict['componentName'])) ++ logger.error("Cannot do component delete for cluster_id={}, serviceName={}, componentName={}, because cannot find the host in cache".format(cluster_id, component_updates_dict['serviceName'], component_updates_dict['componentName'])) + + if cluster_updates_dict == {}: + clusters_ids_to_delete.append(cluster_id) +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/CommandHooksOrchestrator.py apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/CommandHooksOrchestrator.py +--- ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/CommandHooksOrchestrator.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/CommandHooksOrchestrator.py 2022-07-11 00:52:30.000000000 +0800 +@@ -19,13 +19,13 @@ + import os + import logging + +-from models.commands import AgentCommand +-from models.hooks import HookPrefix ++from .models.commands import AgentCommand ++from .models.hooks import HookPrefix + + __all__ = ["ResolvedHooks", "HooksOrchestrator"] + + +-class ResolvedHooks(object): ++class ResolvedHooks: + """ + Hooks sequence holder + """ +@@ -66,7 +66,7 @@ + return self._post_hooks + + +-class HookSequenceBuilder(object): ++class HookSequenceBuilder: + """ + Sequence builder according to passed definition + """ +@@ -96,19 +96,19 @@ + :rtype types.GeneratorType + """ + if prefix not in self._hooks_sequences: +- raise TypeError("Unable to locate hooks sequence definition for '{}' prefix".format(prefix)) ++ raise TypeError(f"Unable to locate hooks sequence definition for '{prefix}' prefix") + + for hook_definition in self._hooks_sequences[prefix]: + if "service" in hook_definition and service is None: + continue + +- if "role" is hook_definition and role is None: ++ if "role" == hook_definition and role is None: + continue + + yield hook_definition.format(prefix=prefix, command=command, service=service, role=role) + + +-class HooksOrchestrator(object): ++class HooksOrchestrator: + """ + Resolving hooks according to HookSequenceBuilder definitions + """ +@@ -162,7 +162,7 @@ + hook_script_path = os.path.join(hook_base_dir, "scripts", "hook.py") + + if not os.path.isfile(hook_script_path): +- self._logger.debug("Hook script {0} not found, skipping".format(hook_script_path)) ++ self._logger.debug(f"Hook script {hook_script_path} not found, skipping") + continue + + yield hook_script_path, hook_base_dir +\ 文件尾没有换行符 +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/CommandStatusDict.py apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/CommandStatusDict.py +--- ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/CommandStatusDict.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/CommandStatusDict.py 2022-07-11 00:52:30.000000000 +0800 +@@ -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 .Grep import Grep + + from ambari_agent import Constants + from ambari_agent.models.commands import CommandStatus, AgentCommand +@@ -108,7 +108,7 @@ + def split_reports(self, result_reports, size): + part = defaultdict(lambda:[]) + prev_part = defaultdict(lambda:[]) +- for cluster_id, cluster_reports in result_reports.items(): ++ for cluster_id, cluster_reports in list(result_reports.items()): + for report in cluster_reports: + prev_part[cluster_id].append(report) + if self.size_approved(prev_part, size): +@@ -140,7 +140,7 @@ + + with self.lock: + result_reports = defaultdict(lambda:[]) +- for key, item in self.current_state.items(): ++ for key, item in list(self.current_state.items()): + command = item[0] + report = item[1] + cluster_id = report['clusterId'] +@@ -168,7 +168,7 @@ + self.reported_reports = self.reported_reports.difference(keys_to_remove) + + def has_report_with_taskid(self, task_id, result_reports): +- for cluster_reports in result_reports.values(): ++ for cluster_reports in list(result_reports.values()): + for report in cluster_reports: + if report['taskId'] == task_id: + return True +@@ -182,10 +182,10 @@ + 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: ++ with open(filename) as fp: + files_content[i] = fp.read() + + tmpout, tmperr, tmpstructuredout = files_content +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/CommandStatusReporter.py apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/CommandStatusReporter.py +--- ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/CommandStatusReporter.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/CommandStatusReporter.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/ComponentStatusExecutor.py apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/ComponentStatusExecutor.py +--- ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/ComponentStatusExecutor.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/ComponentStatusExecutor.py 2022-07-11 00:52:30.000000000 +0800 +@@ -104,7 +104,7 @@ + + # do not run status commands for the component which is starting/stopping or doing other action + if self.customServiceOrchestrator.commandsRunningForComponent(cluster_id, component_name): +- self.logger.info("Skipping status command for {0}. Since command for it is running".format(component_name)) ++ self.logger.info(f"Skipping status command for {component_name}. Since command for it is running") + continue + + result = self.check_component_status(cluster_id, service_name, component_name, command_name) +@@ -135,11 +135,11 @@ + 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 list(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']): +- self.logger.info("Discarding outdated status {0} before sending".format(cluster_report)) ++ self.logger.info(f"Discarding outdated status {cluster_report} before sending") + break + else: + new_cluster_reports[cluster_id].append(cluster_report) +@@ -169,7 +169,7 @@ + if status == LiveStatus.DEAD_STATUS: + stderr = component_status_result['stderr'] + if "ComponentIsNotRunning" not in stderr and "ClientComponentHasNoStatus" not in stderr: +- self.logger.info("Status command for {0} failed:\n{1}".format(component_name, stderr)) ++ self.logger.info(f"Status command for {component_name} failed:\n{stderr}") + + result = { + 'serviceName': service_name, +@@ -179,8 +179,8 @@ + 'clusterId': cluster_id, + } + +- if status != self.reported_component_status[cluster_id]["{0}/{1}".format(service_name, component_name)][command_name]: +- logging.info("Status for {0} has changed to {1}".format(component_name, status)) ++ if status != self.reported_component_status[cluster_id][f"{service_name}/{component_name}"][command_name]: ++ logging.info(f"Status for {component_name} has changed to {status}") + self.recovery_manager.handle_status_change(component_name, status) + + if report: +@@ -199,10 +199,10 @@ + 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 list(self.reported_component_status.items()): ++ for service_and_component_name, commands_status in list(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 list(commands_status.items()): + report = { + 'serviceName': service_name, + 'componentName': component_name, +@@ -224,20 +224,20 @@ + + 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 list(cluster_reports.items()): + for report in reports: + component_name = report['componentName'] + service_name = report['serviceName'] + command = report['command'] + status = report['status'] + +- self.reported_component_status[cluster_id]["{0}/{1}".format(service_name, component_name)][command] = status ++ self.reported_component_status[cluster_id][f"{service_name}/{component_name}"][command] = status + + 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 -Naur ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/ComponentVersionReporter.py apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/ComponentVersionReporter.py +--- ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/ComponentVersionReporter.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/ComponentVersionReporter.py 2022-07-11 00:52:30.000000000 +0800 +@@ -88,7 +88,7 @@ + version_result = self.customServiceOrchestrator.requestComponentStatus(command_dict, command_name=AgentCommand.get_version) + + if version_result['exitcode'] or not 'structuredOut' in version_result or not 'version' in version_result['structuredOut']: +- logger.error("Could not get version for component {0} of {1} service cluster_id={2}. Command returned: {3}".format(component_name, service_name, cluster_id, version_result)) ++ logger.error(f"Could not get version for component {component_name} of {service_name} service cluster_id={cluster_id}. Command returned: {version_result}") + return None + + # TODO: check if no strout or version if not there +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/ConfigurationBuilder.py apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/ConfigurationBuilder.py +--- ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/ConfigurationBuilder.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/ConfigurationBuilder.py 2022-07-11 00:52:30.000000000 +0800 +@@ -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 . import hostname + + class ConfigurationBuilder: + def __init__(self, initializer_module): +@@ -31,7 +31,7 @@ + def get_configuration(self, cluster_id, service_name, component_name, configurations_timestamp=None): + if cluster_id: + if configurations_timestamp and self.configurations_cache.timestamp < configurations_timestamp: +- raise Exception("Command requires configs with timestamp={0} but configs on agent have timestamp={1}".format(configurations_timestamp, self.configurations_cache.timestamp)) ++ raise Exception(f"Command requires configs with timestamp={configurations_timestamp} but configs on agent have timestamp={self.configurations_cache.timestamp}") + + metadata_cache = self.metadata_cache[cluster_id] + configurations_cache = self.configurations_cache[cluster_id] +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/Constants.py apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/Constants.py +--- ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/Constants.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/Constants.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/Controller.py apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/Controller.py +--- ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/Controller.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/Controller.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +@@ -26,17 +26,17 @@ + import socket + import time + import threading +-import urllib2 ++import urllib.request, urllib.error, urllib.parse + import pprint + from random import randint + import re + from ambari_commons import subprocess32 + import functools + +-import hostname +-import security ++from . import hostname ++from . import security + import ssl +-import AmbariConfig ++from . import AmbariConfig + + from ambari_agent.Heartbeat import Heartbeat + from ambari_agent.Register import Register +@@ -122,7 +122,7 @@ + self.heartbeat_idle_interval_max = int(self.config.get('heartbeat', 'idle_interval_max')) if self.config.get('heartbeat', 'idle_interval_max') else self.netutil.HEARTBEAT_IDLE_INTERVAL_DEFAULT_MAX_SEC + + if self.heartbeat_idle_interval_min > self.heartbeat_idle_interval_max: +- raise Exception("Heartbeat minimum interval={0} seconds can not be greater than the maximum interval={1} seconds !".format(self.heartbeat_idle_interval_min, self.heartbeat_idle_interval_max)) ++ raise Exception(f"Heartbeat minimum interval={self.heartbeat_idle_interval_min} seconds can not be greater than the maximum interval={self.heartbeat_idle_interval_max} seconds !") + + self.get_heartbeat_interval = functools.partial(self.netutil.get_agent_heartbeat_idle_interval_sec, self.heartbeat_idle_interval_min, self.heartbeat_idle_interval_max) + +@@ -147,7 +147,7 @@ + def read_agent_version(self, config): + data_dir = config.get('agent', 'prefix') + ver_file = os.path.join(data_dir, 'version') +- f = open(ver_file, "r") ++ f = open(ver_file) + version = f.read().strip() + f.close() + return version +@@ -172,7 +172,7 @@ + try: + server_ip = socket.gethostbyname(self.hostname) + logger.info("Registering with %s (%s) (agent=%s)", self.hostname, server_ip, data) +- except socket.error: ++ except OSError: + logger.warn("Unable to determine the IP address of '%s', agent registration may fail (agent=%s)", + self.hostname, data) + +@@ -185,12 +185,12 @@ + # exitstatus = 0 (OK - Default) + # exitstatus = 1 (Registration failed because different version of agent and server) + exitstatus = 0 +- if 'exitstatus' in ret.keys(): ++ if 'exitstatus' in list(ret.keys()): + exitstatus = int(ret['exitstatus']) + + if exitstatus == 1: + # log - message, which will be printed to agents log +- if 'log' in ret.keys(): ++ if 'log' in list(ret.keys()): + log = ret['log'] + logger.error(log) + self.isRegistered = False +@@ -213,7 +213,7 @@ + # in order to receive up to date agent config. + self.statusCommandsExecutor.relaunch("REGISTER_WITH_SERVER") + +- if 'statusCommands' in ret.keys(): ++ if 'statusCommands' in list(ret.keys()): + logger.debug("Got status commands on registration.") + self.addToStatusQueue(ret['statusCommands']) + else: +@@ -225,18 +225,18 @@ + self.repeatRegistration = False + self.isRegistered = False + return +- except Exception, ex: ++ except Exception as ex: + # try a reconnect only after a certain amount of random time + delay = randint(0, self.max_reconnect_retry_delay) + logger.error("Unable to connect to: " + self.registerUrl, exc_info=True) + logger.error("Error:" + str(ex)) +- logger.warn(""" Sleeping for {0} seconds and then trying again """.format(delay,)) ++ logger.warn(f""" Sleeping for {delay} seconds and then trying again """) + time.sleep(delay) + + return ret + + def update_caches_from_heartbeat(self, heartbeat): +- heartbeat_keys = heartbeat.keys() ++ heartbeat_keys = list(heartbeat.keys()) + + if self.EXECUTION_COMMANDS in heartbeat_keys: + execution_commands = heartbeat[self.EXECUTION_COMMANDS] +@@ -269,7 +269,7 @@ + if commands: + try: + self.actionQueue.cancel(commands) +- except Exception, err: ++ except Exception as err: + logger.error("Exception occurred on commands cancel: %s", err.message) + + def addToQueue(self, commands): +@@ -281,7 +281,7 @@ + else: + """Only add to the queue if not empty list """ + logger.info("Adding %s commands. Heartbeat id = %s", len(commands), self.responseId) +- if 'clusterName' in commands[0].keys(): ++ if 'clusterName' in list(commands[0].keys()): + self.updateComponents(commands[0]['clusterName']) + self.actionQueue.put(commands) + +@@ -290,7 +290,7 @@ + logger.debug("No status commands received from %s", self.serverHostname) + else: + logger.info("Adding %s status commands. Heartbeat id = %s", len(commands), self.responseId) +- if 'clusterName' in commands[0].keys(): ++ if 'clusterName' in list(commands[0].keys()): + self.updateComponents(commands[0]['clusterName']) + self.recovery_manager.process_status_commands(commands) + self.actionQueue.put_status(commands) +@@ -356,7 +356,7 @@ + response = self.sendRequest(self.heartbeatUrl, data) + + exitStatus = 0 +- if 'exitstatus' in response.keys(): ++ if 'exitstatus' in list(response.keys()): + exitStatus = int(response['exitstatus']) + + if exitStatus != 0: +@@ -366,7 +366,7 @@ + + logger.log(logging_level, 'Heartbeat response received (id = %s)', serverId) + +- cluster_size = int(response['clusterSize']) if 'clusterSize' in response.keys() else -1 ++ cluster_size = int(response['clusterSize']) if 'clusterSize' in list(response.keys()) else -1 + + # TODO: this needs to be revised if hosts can be shared across multiple clusters + heartbeat_interval = self.get_heartbeat_interval(cluster_size) \ +@@ -375,14 +375,14 @@ + + logger.log(logging_level, "Heartbeat interval is %s seconds", heartbeat_interval) + +- if 'hasMappedComponents' in response.keys(): ++ if 'hasMappedComponents' in list(response.keys()): + self.hasMappedComponents = response['hasMappedComponents'] is not False + +- if 'hasPendingTasks' in response.keys(): ++ if 'hasPendingTasks' in list(response.keys()): + has_pending_tasks = bool(response['hasPendingTasks']) + self.recovery_manager.set_paused(has_pending_tasks) + +- if 'registrationCommand' in response.keys(): ++ if 'registrationCommand' in list(response.keys()): + # check if the registration command is None. If none skip + if response['registrationCommand'] is not None: + logger.info("RegistrationCommand received - repeat agent registration") +@@ -400,7 +400,7 @@ + self.restartAgent() + + if serverId != self.responseId + 1: +- logger.error("Error in responseId sequence - received responseId={0} from server while expecting {1} - restarting..." ++ logger.error("Error in responseId sequence - received responseId={} from server while expecting {} - restarting..." + .format(serverId, self.responseId + 1)) + + self.restartAgent() +@@ -414,7 +414,7 @@ + logger.log(logging_level, "Updating configurations from heartbeat") + self.update_caches_from_heartbeat(response) + +- response_keys = response.keys() ++ response_keys = list(response.keys()) + + # there's case when canceled task can be processed in Action Queue.execute before adding rescheduled task to queue + # this can cause command failure instead result suppression +@@ -476,7 +476,7 @@ + self.isRegistered = False + logger.exception("SSLError while trying to heartbeat.") + return +- except Exception, err: ++ except Exception as err: + if "code" in err: + logger.error(err.code) + else: +@@ -485,10 +485,10 @@ + logException = True + + exceptionMessage = str(err) +- errorMessage = "Unable to reconnect to {0} (attempts={1}, details={2})".format(self.heartbeatUrl, self.DEBUG_HEARTBEAT_RETRIES, exceptionMessage) ++ errorMessage = f"Unable to reconnect to {self.heartbeatUrl} (attempts={self.DEBUG_HEARTBEAT_RETRIES}, details={exceptionMessage})" + + if not retry: +- errorMessage = "Connection to {0} was lost (details={1})".format(self.serverHostname, exceptionMessage) ++ errorMessage = f"Connection to {self.serverHostname} was lost (details={exceptionMessage})" + + logger.error(errorMessage, exc_info=logException) + +@@ -501,7 +501,7 @@ + + #randomize the heartbeat + delay = randint(0, self.max_reconnect_retry_delay) +- logger.info("Waiting {0} seconds before reconnecting to {1}".format(delay, self.heartbeatUrl)) ++ logger.info(f"Waiting {delay} seconds before reconnecting to {self.heartbeatUrl}") + time.sleep(delay) + + # Sleep for some time +@@ -527,8 +527,8 @@ + self.register = Register(self.config) + self.heartbeat = Heartbeat(self.actionQueue, self.config, self.alert_scheduler_handler.collector()) + +- opener = urllib2.build_opener() +- urllib2.install_opener(opener) ++ opener = urllib.request.build_opener() ++ urllib.request.install_opener(opener) + + while True: + self.repeatRegistration = False +@@ -562,7 +562,7 @@ + time.sleep(self.netutil.HEARTBEAT_IDLE_INTERVAL_DEFAULT_MAX_SEC) + self.heartbeatWithServer() + else: +- logger.info("Registration response from %s didn't contain 'response' as a key".format(self.serverHostname)) ++ logger.info(f"Registration response from %s didn't contain 'response' as a key") + + def restartAgent(self): + ExitHelper().exit(AGENT_AUTO_RESTART_EXIT_CODE) +@@ -574,15 +574,15 @@ + try: + if self.cachedconnect is None: # Lazy initialization + self.cachedconnect = security.CachedHTTPSConnection(self.config, self.serverHostname) +- req = urllib2.Request(url, data, {'Content-Type': 'application/json', ++ req = urllib.request.Request(url, data, {'Content-Type': 'application/json', + 'Accept-encoding': 'gzip'}) + response = self.cachedconnect.request(req) + return json.loads(response) +- except Exception, exception: ++ except Exception as exception: + if response is None: +- raise IOError('Request to {0} failed due to {1}'.format(url, str(exception))) ++ raise OSError(f'Request to {url} failed due to {str(exception)}') + else: +- raise IOError('Response parsing failed! Request data: ' + str(data) ++ raise OSError('Response parsing failed! Request data: ' + str(data) + + '; Response: ' + str(response)) + + +@@ -597,9 +597,9 @@ + logger.debug("Response from %s was %s", self.serverHostname, response) + + services, client_components, server_components = [], [], [] +- for service, components in response['components'].items(): ++ for service, components in list(response['components'].items()): + services.append(service) +- for component, category in components.items(): ++ for component, category in list(components.items()): + service_component = {"serviceName": service, "componentName": component} + if category == 'CLIENT': + client_components.append(service_component) +@@ -626,7 +626,7 @@ + """ + try: + version = self.get_version() +- logger.debug("Ambari Agent version {0}".format(version)) ++ logger.debug(f"Ambari Agent version {version}") + if compare_versions(version, "2.1.2") >= 0: + source_file = "/etc/hadoop/conf/dfs_data_dir_mount.hist" + destination_file = "/var/lib/ambari-agent/data/datanode/dfs_data_dir_mount.hist" +@@ -636,18 +636,18 @@ + return_code = subprocess32.call(command, shell=True) + logger.info("Return code: %d" % return_code) + +- command = "mv %s %s" % (source_file, destination_file) ++ command = "mv {} {}".format(source_file, destination_file) + logger.info("Moving Data Dir Mount History file. Executing command: %s" % command) + return_code = subprocess32.call(command, shell=True) + logger.info("Return code: %d" % return_code) +- except Exception, e: +- logger.error("Exception in move_data_dir_mount_file(). Error: {0}".format(str(e))) ++ except Exception as e: ++ logger.error(f"Exception in move_data_dir_mount_file(). Error: {str(e)}") + + def get_version(self): + version = self.version + matches = re.findall(r"[\d+.]+",version) + if not matches: +- logger.warning("No version match result, use original version {0}".format(version)) ++ logger.warning(f"No version match result, use original version {version}") + return version + else: + return matches[0] +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/CustomServiceOrchestrator.py apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/CustomServiceOrchestrator.py +--- ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/CustomServiceOrchestrator.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/CustomServiceOrchestrator.py 2022-07-11 00:52:30.000000000 +0800 +@@ -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 logging + import os +-from ConfigParser import NoOptionError ++from configparser import NoOptionError + + import ambari_simplejson as json + import sys +@@ -31,8 +31,8 @@ + import threading + from collections import defaultdict + +-from AgentException import AgentException +-from PythonExecutor import PythonExecutor ++from .AgentException import AgentException ++from .PythonExecutor import PythonExecutor + from resource_management.libraries.functions.log_process_information import log_process_information + from resource_management.core.utils import PasswordString + from ambari_commons import subprocess32 +@@ -43,7 +43,7 @@ + logger = logging.getLogger() + + +-class CustomServiceOrchestrator(object): ++class CustomServiceOrchestrator: + """ + Executes a command for custom service. stdout and stderr are written to + tmpoutfile and to tmperrfile respectively. +@@ -117,7 +117,7 @@ + + def cancel_command(self, task_id, reason): + with self.commands_in_progress_lock: +- if task_id in self.commands_in_progress.keys(): ++ if task_id in list(self.commands_in_progress.keys()): + pid = self.commands_in_progress.get(task_id) + self.commands_in_progress[task_id] = reason + logger.info("Canceling command with taskId = {tid}, " \ +@@ -212,12 +212,12 @@ + """ + configtype_credentials = {} + if 'serviceLevelParams' in commandJson and 'configuration_credentials' in commandJson['serviceLevelParams']: +- for config_type, password_properties in commandJson['serviceLevelParams']['configuration_credentials'].items(): ++ for config_type, password_properties in list(commandJson['serviceLevelParams']['configuration_credentials'].items()): + if config_type in commandJson['configurations']: + value_names = [] + config = commandJson['configurations'][config_type] + credentials = {} +- for key_name, value_name in password_properties.items(): ++ for key_name, value_name in list(password_properties.items()): + if key_name == value_name: + if value_name in config: + # password name is the alias +@@ -240,7 +240,7 @@ + value_names.append(value_name) # Gather the value_name for deletion + if len(credentials) > 0: + configtype_credentials[config_type] = credentials +- logger.info("Identifying config {0} for CS: ".format(config_type)) ++ logger.info(f"Identifying config {config_type} for CS: ") + for value_name in value_names: + # Remove the clear text password + config.pop(value_name, None) +@@ -262,11 +262,11 @@ + if 'taskId' in commandJson: + task_id = commandJson['taskId'] + +- logger.info('Generating the JCEKS file: roleCommand={0} and taskId = {1}'.format(roleCommand, task_id)) ++ logger.info(f'Generating the JCEKS file: roleCommand={roleCommand} and taskId = {task_id}') + + # Set up the variables for the external command to generate a JCEKS file + java_home = commandJson['ambariLevelParams']['java_home'] +- java_bin = '{java_home}/bin/java'.format(java_home=java_home) ++ java_bin = f'{java_home}/bin/java' + + cs_lib_path = self.credential_shell_lib_path + serviceName = commandJson['serviceName'] +@@ -282,27 +282,27 @@ + 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'] +- file_path = os.path.join(self.getProviderDirectory(roleName), "{0}.jceks".format(config_type)) ++ file_path = os.path.join(self.getProviderDirectory(roleName), f"{config_type}.jceks") + else: +- file_path = os.path.join(self.getProviderDirectory(serviceName), "{0}.jceks".format(config_type)) ++ file_path = os.path.join(self.getProviderDirectory(serviceName), f"{config_type}.jceks") + if os.path.exists(file_path): + os.remove(file_path) +- provider_path = 'jceks://file{file_path}'.format(file_path=file_path) +- logger.info('provider_path={0}'.format(provider_path)) +- for alias, pwd in credentials.items(): +- logger.debug("config={0}".format(config)) ++ provider_path = f'jceks://file{file_path}' ++ logger.info(f'provider_path={provider_path}') ++ for alias, pwd in list(credentials.items()): ++ logger.debug(f"config={config}") + protected_pwd = PasswordString(pwd) + # Generate the JCEKS file + cmd = (java_bin, '-cp', cs_lib_path, self.credential_shell_cmd, 'create', + alias, '-value', protected_pwd, '-provider', provider_path) + logger.info(cmd) + cmd_result = subprocess32.call(cmd) +- logger.info('cmd_result = {0}'.format(cmd_result)) +- os.chmod(file_path, 0644) # group and others should have read access so that the service user can read ++ logger.info(f'cmd_result = {cmd_result}') ++ 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 +@@ -353,11 +353,11 @@ + script_tuple = (script_path, base_dir) + + if not tmpstrucoutfile: +- tmpstrucoutfile = os.path.join(self.tmp_dir, "structured-out-{0}.json".format(task_id)) ++ tmpstrucoutfile = os.path.join(self.tmp_dir, f"structured-out-{task_id}.json") + + # We don't support anything else yet + if script_type.upper() != self.SCRIPT_TYPE_PYTHON: +- message = "Unknown script type {0}".format(script_type) ++ message = f"Unknown script type {script_type}" + raise AgentException(message) + + # Execute command using proper interpreter +@@ -455,7 +455,7 @@ + + except Exception as e: + exc_type, exc_obj, exc_tb = sys.exc_info() +- message = "Caught an exception while executing custom service command: {0}: {1}; {2}".format(exc_type, exc_obj, e) ++ message = f"Caught an exception while executing custom service command: {exc_type}: {exc_obj}; {e}" + logger.exception(message) + ret = { + 'stdout': message, +@@ -483,10 +483,10 @@ + 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) ++ return f"\nCommand aborted. Reason: '{reason}'" + else: + return "\nCommand aborted." + return None +@@ -554,7 +554,7 @@ + """ + path = os.path.join(base_dir, script) + if not os.path.exists(path): +- message = "Script {0} does not exist".format(path) ++ message = f"Script {path} does not exist" + raise AgentException(message) + return path + +@@ -567,12 +567,12 @@ + + if is_status_command: + # make sure status commands that run in parallel don't use the same files +- file_path = os.path.join(self.tmp_dir, "status_command_{0}.json".format(uuid.uuid4())) ++ file_path = os.path.join(self.tmp_dir, f"status_command_{uuid.uuid4()}.json") + else: + task_id = command['taskId'] +- file_path = os.path.join(self.tmp_dir, "command-{0}.json".format(task_id)) ++ file_path = os.path.join(self.tmp_dir, f"command-{task_id}.json") + if command_type == AgentCommand.auto_execution: +- file_path = os.path.join(self.tmp_dir, "auto_command-{0}.json".format(task_id)) ++ file_path = os.path.join(self.tmp_dir, f"auto_command-{task_id}.json") + + # Json may contain passwords, that's why we need proper permissions + if os.path.isfile(file_path): +@@ -595,7 +595,7 @@ + + decompressed_map = {} + +- for k, v in info.items(): ++ for k, v in list(info.items()): + # Convert from 1-3,5,6-8 to [1,2,3,5,6,7,8] + indexes = self.convert_range_to_list(v) + # Convert from [1,2,3,5,6,7,8] to [host1,host2,host3...] +@@ -606,7 +606,7 @@ + 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 +@@ -636,9 +636,9 @@ + 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]))) ++ result_list.append(int(range_bounds[0])) + else: + raise AgentException("Broken data in given range, expected - ""m-n"" or ""m"", got: " + str(r)) + +@@ -677,7 +677,7 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/DataCleaner.py apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/DataCleaner.py +--- ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/DataCleaner.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/DataCleaner.py 2022-07-11 00:52:30.000000000 +0800 +@@ -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 . import AmbariConfig + import threading + import os + import time +@@ -28,9 +28,9 @@ + logger = logging.getLogger(__name__) + + class DataCleaner(threading.Thread): +- COMMAND_FILE_NAMES_PATTERN = 'errors-\d+.txt|output-\d+.txt|site-\d+.pp|structured-out-\d+.json|command-\d+.json' ++ COMMAND_FILE_NAMES_PATTERN = r'errors-\d+.txt|output-\d+.txt|site-\d+.pp|structured-out-\d+.json|command-\d+.json' + AUTO_COMMAND_FILE_NAMES_PATTERN = \ +- 'auto_command-\d+.json|auto_errors-\d+.txt|auto_output-\d+.txt|auto_structured-out-\d+.json' ++ r'auto_command-\d+.json|auto_errors-\d+.txt|auto_output-\d+.txt|auto_structured-out-\d+.json' + FILE_NAME_PATTERN = AUTO_COMMAND_FILE_NAMES_PATTERN + "|" + COMMAND_FILE_NAMES_PATTERN + + def __init__(self, config): +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/debug.py apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/debug.py +--- ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/debug.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/debug.py 2022-07-11 00:52:30.000000000 +0800 +@@ -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 .RemoteDebugUtils import NamedPipe ++from .RemoteDebugUtils import pipename + + def debug_process(pid): + """Interrupt a running process and debug it.""" +@@ -33,7 +33,7 @@ + pipe = NamedPipe(pipename(pid), 1) + try: + while pipe.is_open(): +- txt=raw_input(pipe.get()) + '\n' ++ txt=eval(input(pipe.get())) + '\n' + pipe.put(txt) + except EOFError: + pass # Exit. +@@ -48,4 +48,3 @@ + + if __name__=='__main__': + main() +- +\ 文件尾没有换行符 +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/ExitHelper.py apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/ExitHelper.py +--- ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/ExitHelper.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/ExitHelper.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +@@ -31,11 +31,11 @@ + + def __call__(cls, *args, **kwargs): + if cls not in cls._instances: +- cls._instances[cls] = super(_singleton, cls).__call__(*args, **kwargs) ++ cls._instances[cls] = super().__call__(*args, **kwargs) + return cls._instances[cls] + + +-class ExitHelper(object): ++class ExitHelper(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 @@ + 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 @@ + + if __name__ == '__main__': + def func1(): +- print "1" ++ print("1") + + def func2(): +- print "2" ++ print("2") + + ExitHelper().register(func1) + ExitHelper().register(func2) +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/Facter.py apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/Facter.py +--- ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/Facter.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/Facter.py 2022-07-11 00:52:30.000000000 +0800 +@@ -22,7 +22,7 @@ + import os + import getpass + import platform +-import hostname ++from . import hostname + import re + import shlex + import socket +@@ -33,7 +33,7 @@ + import uuid + import json + import glob +-from AmbariConfig import AmbariConfig ++from .AmbariConfig import AmbariConfig + from ambari_commons import OSCheck, OSConst + from ambari_commons.os_family_impl import OsFamilyImpl + +@@ -49,10 +49,11 @@ + stderr=subprocess32.PIPE + ) + (stdoutdata, stderrdata) = process.communicate() ++ stdoutdata = str(stdoutdata, encoding='utf-8') + return process.returncode, stdoutdata, stderrdata + + +-class Facter(object): ++class Facter: + def __init__(self, config): + """ + Initialize the configs, which can be provided if using multiple Agents per host. +@@ -72,7 +73,7 @@ + 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 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 +@@ -192,7 +193,7 @@ + for filename in glob.glob('%s/*.json' % systemResourceDir): + with open(filename) as fp: + data = json.loads(fp.read()) +- for (key, value) in data.items(): ++ for (key, value) in list(data.items()): + systemResources[key] = data[key] + except: + log.warn( +@@ -360,7 +361,7 @@ + return 0 + + def facterInfo(self): +- facterInfo = super(FacterWindows, self).facterInfo() ++ facterInfo = super().facterInfo() + systemResourceOverrides = self.getSystemResourceOverrides() + facterInfo = self.replaceFacterInfoWithSystemResources(systemResourceOverrides, facterInfo) + facterInfo['swapsize'] = Facter.convertSizeMbToGb( +@@ -380,7 +381,7 @@ + GET_MEMINFO_CMD = "cat /proc/meminfo" + + def __init__(self, config): +- super(FacterLinux,self).__init__(config) ++ super().__init__(config) + self.DATA_IFCONFIG_SHORT_OUTPUT = FacterLinux.setDataIfConfigShortOutput() + self.DATA_IP_LINK_OUTPUT = FacterLinux.setDataIpLinkOutput() + self.DATA_UPTIME_OUTPUT = FacterLinux.setDataUpTimeOutput() +@@ -394,7 +395,7 @@ + return_code, stdout, stderr = run_os_command(FacterLinux.GET_IFCONFIG_SHORT_CMD) + return stdout + except OSError: +- log.warn("Can't execute {0}".format(FacterLinux.GET_IFCONFIG_SHORT_CMD)) ++ log.warn("Can't execute {}".format(FacterLinux.GET_IFCONFIG_SHORT_CMD)) + return "" + + # Returns the output of `ip link` command +@@ -405,7 +406,7 @@ + return_code, stdout, stderr = run_os_command(FacterLinux.GET_IP_LINK_CMD) + return stdout + except OSError: +- log.warn("Can't execute {0}".format(FacterLinux.GET_IP_LINK_CMD)) ++ log.warn("Can't execute {}".format(FacterLinux.GET_IP_LINK_CMD)) + return "" + + @staticmethod +@@ -415,7 +416,7 @@ + return_code, stdout, stderr = run_os_command(FacterLinux.GET_UPTIME_CMD) + return stdout + except OSError: +- log.warn("Can't execute {0}".format(FacterLinux.GET_UPTIME_CMD)) ++ log.warn("Can't execute {}".format(FacterLinux.GET_UPTIME_CMD)) + return "" + + @staticmethod +@@ -425,7 +426,7 @@ + return_code, stdout, stderr = run_os_command(FacterLinux.GET_MEMINFO_CMD) + return stdout + except OSError: +- log.warn("Can't execute {0}".format(FacterLinux.GET_MEMINFO_CMD)) ++ log.warn("Can't execute {}".format(FacterLinux.GET_MEMINFO_CMD)) + return "" + + # Returns the FQDN of the host +@@ -436,16 +437,18 @@ + + try: + retcode, out, err = run_os_command(FacterLinux.GET_SE_LINUX_ST_CMD) ++ out = str(out,encoding='utf-8') + se_status = re.search('(enforcing|permissive|enabled)', out) + if se_status: + return True + except OSError: +- log.warn("Could not run {0}: OK".format(FacterLinux.GET_SE_LINUX_ST_CMD)) ++ log.warn("Could not run {}: OK".format(FacterLinux.GET_SE_LINUX_ST_CMD)) + return False + + def return_first_words_from_list(self, list): + result = "" + for i in list: ++ i = str(i,encoding='utf-8') + if i.strip(): + result = result + i.split()[0].strip() + "," + +@@ -454,7 +457,7 @@ + + def return_ifnames_from_ip_link(self, ip_link_output): + list = [] +- prog = re.compile("^\d") ++ prog = re.compile(r"^\d") + for line in ip_link_output.splitlines(): + if prog.match(line): + list.append(line.split()[1].rstrip(":")) +@@ -495,8 +498,8 @@ + 0x8915, # SIOCGIFADDR + struct.pack('256s', ifname[:15]) + )[20:24]) +- except Exception, err: +- log.warn("Can't get the IP address for {0}".format(ifname)) ++ except Exception as err: ++ log.warn("Can't get the IP address for {}".format(ifname)) + + return ip_address_by_ifname + +@@ -512,63 +515,63 @@ + if result != '': + return result + # If the host has neither `ifocnfig` command nor `ip` command, then return "OS NOT SUPPORTED" +- log.warn("Can't get a network interfaces list from {0}".format(self.DATA_IFCONFIG_SHORT_OUTPUT)) ++ log.warn("Can't get a network interfaces list from {}".format(self.DATA_IFCONFIG_SHORT_OUTPUT)) + return 'OS NOT SUPPORTED' + + # Return uptime seconds + def getUptimeSeconds(self): + try: +- return int(self.data_return_first("\d+", self.DATA_UPTIME_OUTPUT)) ++ return int(self.data_return_first(r"\d+", self.DATA_UPTIME_OUTPUT)) + except ValueError: +- log.warn("Can't get an uptime value from {0}".format(self.DATA_UPTIME_OUTPUT)) ++ log.warn("Can't get an uptime value from {}".format(self.DATA_UPTIME_OUTPUT)) + return 0 + + # Return memoryfree + def getMemoryFree(self): + #:memoryfree_mb => "MemFree", + try: +- return int(self.data_return_first("MemFree:.*?(\d+) .*", self.DATA_MEMINFO_OUTPUT)) ++ return int(self.data_return_first(r"MemFree:.*?(\d+) .*", self.DATA_MEMINFO_OUTPUT)) + except ValueError: +- log.warn("Can't get free memory size from {0}".format(self.DATA_MEMINFO_OUTPUT)) ++ log.warn("Can't get free memory size from {}".format(self.DATA_MEMINFO_OUTPUT)) + return 0 + + # Return memorytotal + def getMemoryTotal(self): + try: +- return int(self.data_return_first("MemTotal:.*?(\d+) .*", self.DATA_MEMINFO_OUTPUT)) ++ return int(self.data_return_first(r"MemTotal:.*?(\d+) .*", self.DATA_MEMINFO_OUTPUT)) + except ValueError: +- log.warn("Can't get total memory size from {0}".format(self.DATA_MEMINFO_OUTPUT)) ++ log.warn("Can't get total memory size from {}".format(self.DATA_MEMINFO_OUTPUT)) + return 0 + + # Return swapfree + def getSwapFree(self): + #:swapfree_mb => "SwapFree" + try: +- return int(self.data_return_first("SwapFree:.*?(\d+) .*", self.DATA_MEMINFO_OUTPUT)) ++ return int(self.data_return_first(r"SwapFree:.*?(\d+) .*", self.DATA_MEMINFO_OUTPUT)) + except ValueError: +- log.warn("Can't get free swap memory size from {0}".format(self.DATA_MEMINFO_OUTPUT)) ++ log.warn("Can't get free swap memory size from {}".format(self.DATA_MEMINFO_OUTPUT)) + return 0 + + # Return swapsize + def getSwapSize(self): + #:swapsize_mb => "SwapTotal", + try: +- return int(self.data_return_first("SwapTotal:.*?(\d+) .*", self.DATA_MEMINFO_OUTPUT)) ++ return int(self.data_return_first(r"SwapTotal:.*?(\d+) .*", self.DATA_MEMINFO_OUTPUT)) + except ValueError: +- log.warn("Can't get total swap memory size from {0}".format(self.DATA_MEMINFO_OUTPUT)) ++ log.warn("Can't get total swap memory size from {}".format(self.DATA_MEMINFO_OUTPUT)) + return 0 + + # Return memorysize + def getMemorySize(self): + #:memorysize_mb => "MemTotal" + try: +- return int(self.data_return_first("MemTotal:.*?(\d+) .*", self.DATA_MEMINFO_OUTPUT)) ++ return int(self.data_return_first(r"MemTotal:.*?(\d+) .*", self.DATA_MEMINFO_OUTPUT)) + except ValueError: +- log.warn("Can't get memory size from {0}".format(self.DATA_MEMINFO_OUTPUT)) ++ log.warn("Can't get memory size from {}".format(self.DATA_MEMINFO_OUTPUT)) + return 0 + + def facterInfo(self): +- facterInfo = super(FacterLinux, self).facterInfo() ++ facterInfo = super().facterInfo() + systemResourceOverrides = self.getSystemResourceOverrides() + facterInfo = self.replaceFacterInfoWithSystemResources(systemResourceOverrides, facterInfo) + +@@ -582,7 +585,7 @@ + + def main(argv=None): + config = None +- print Facter(config).facterInfo() ++ print((Facter(config).facterInfo())) + + + if __name__ == '__main__': +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/FileCache.py apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/FileCache.py +--- ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/FileCache.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/FileCache.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +@@ -17,14 +17,14 @@ + 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 urllib.request, urllib.parse, urllib.error + import time + import threading + +@@ -134,7 +134,7 @@ + self.get_server_url_prefix(command)) + + def auto_cache_update_enabled(self): +- from AmbariConfig import AmbariConfig ++ from .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": +@@ -151,7 +151,7 @@ + server_url_prefix: url of "resources" folder at the server + """ + full_path = os.path.join(cache_path, subdirectory) +- logger.debug("Trying to provide directory {0}".format(subdirectory)) ++ logger.debug(f"Trying to provide directory {subdirectory}") + + if not self.auto_cache_update_enabled(): + logger.debug("Auto cache update is disabled.") +@@ -171,7 +171,7 @@ + try: + if full_path not in self.uptodate_paths: + logger.debug("Checking if update is available for " +- "directory {0}".format(full_path)) ++ "directory {}".format(full_path)) + # Need to check for updates at server + remote_url = self.build_download_url(server_url_prefix, + subdirectory, self.HASH_SUM_FILE) +@@ -179,7 +179,7 @@ + remote_hash = memory_buffer.getvalue().strip() + local_hash = self.read_hash_sum(full_path) + if not local_hash or local_hash != remote_hash: +- logger.debug("Updating directory {0}".format(full_path)) ++ logger.debug(f"Updating directory {full_path}") + download_url = self.build_download_url(server_url_prefix, + subdirectory, self.ARCHIVE_NAME) + membuffer = self.fetch_url(download_url) +@@ -188,9 +188,9 @@ + self.invalidate_directory(full_path) + self.unpack_archive(membuffer, full_path) + self.write_hash_sum(full_path, remote_hash) +- logger.info("Updated directory {0}".format(full_path)) ++ logger.info(f"Updated directory {full_path}") + else: +- logger.warn("Skipping empty archive: {0}. " ++ logger.warn("Skipping empty archive: {}. " + "Expected archive was not found. Cached copy will be used.".format(download_url)) + pass + # Finally consider cache directory up-to-date +@@ -201,7 +201,7 @@ + logger.warn("Error occurred during cache update. " + "Error tolerate setting is set to true, so" + " ignoring this error and continuing with current cache. " +- "Error details: {0}".format(str(e))) ++ "Error details: {}".format(str(e))) + else: + raise # we are not tolerant to exceptions, command execution will fail + finally: +@@ -218,21 +218,21 @@ + directory - relative path + filename - file inside directory we are trying to fetch + """ +- return "{0}/{1}/{2}".format(server_url_prefix, +- urllib.pathname2url(directory), filename) ++ return "{}/{}/{}".format(server_url_prefix, ++ urllib.request.pathname2url(directory), filename) + + def fetch_url(self, url): + """ + Fetches content on url to in-memory buffer and returns the resulting buffer. + May throw exceptions because of various reasons + """ +- logger.debug("Trying to download {0}".format(url)) ++ logger.debug(f"Trying to download {url}") + try: +- memory_buffer = StringIO.StringIO() +- proxy_handler = urllib2.ProxyHandler({}) +- opener = urllib2.build_opener(proxy_handler) ++ memory_buffer = io.StringIO() ++ 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(), ++ logger.debug("Connected with {} with code {}".format(u.geturl(), + u.getcode())) + buff = u.read(self.BLOCK_SIZE) + while buff: +@@ -242,7 +242,7 @@ + break + return memory_buffer + except Exception as err: +- raise CachingException("Can not download file from url {0} : {1}".format(url, str(err))) ++ raise CachingException(f"Can not download file from url {url} : {str(err)}") + + def read_hash_sum(self, directory): + """ +@@ -267,7 +267,7 @@ + fh.write(new_hash) + os.chmod(hash_file, 0o644) + except Exception as err: +- raise CachingException("Can not write to file {0} : {1}".format(hash_file, str(err))) ++ raise CachingException(f"Can not write to file {hash_file} : {str(err)}") + + def invalidate_directory(self, directory): + """ +@@ -278,7 +278,7 @@ + CLEAN_DIRECTORY_TRIES = 5 + CLEAN_DIRECTORY_TRY_SLEEP = 0.25 + +- logger.debug("Invalidating directory {0}".format(directory)) ++ logger.debug(f"Invalidating directory {directory}") + try: + if os.path.exists(directory): + if os.path.isfile(directory): # It would be a strange situation +@@ -293,7 +293,7 @@ + # create directory itself and any parent directories + os.makedirs(directory) + except Exception as err: +- logger.exception("Can not invalidate cache directory {0}".format(directory)) ++ logger.exception(f"Can not invalidate cache directory {directory}") + raise CachingException("Can not invalidate cache directory {0}: {1}", + directory, str(err)) + +@@ -309,8 +309,8 @@ + concrete_dir=os.path.abspath(os.path.join(target_directory, dirname)) + if not os.path.isdir(concrete_dir): + os.makedirs(concrete_dir) +- logger.debug("Unpacking file {0} to {1}".format(name, concrete_dir)) ++ logger.debug(f"Unpacking file {name} to {concrete_dir}") + if filename != '': + zfile.extract(name, target_directory) + except Exception as err: +- raise CachingException("Can not unpack zip file to directory {0} : {1}".format(target_directory, str(err))) ++ raise CachingException(f"Can not unpack zip file to directory {target_directory} : {str(err)}") +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/Hardware.py apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/Hardware.py +--- ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/Hardware.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/Hardware.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + """ + Licensed to the Apache Software Foundation (ASF) under one +@@ -23,12 +23,12 @@ + from ambari_commons import subprocess32 + from resource_management.core import shell + from resource_management.core.shell import call +-from resource_management.core.exceptions import ExecuteTimeoutException, Fail ++from resource_management.core.exceptions import ExecuteTimeoutException as Fail + from ambari_commons.shell import shellRunner +-from Facter import Facter ++from .Facter import Facter + from ambari_commons.os_check import OSConst + from ambari_commons.os_family_impl import OsFamilyFuncImpl, OsFamilyImpl +-from AmbariConfig import AmbariConfig ++from .AmbariConfig import AmbariConfig + from resource_management.core.sudo import path_isfile + + logger = logging.getLogger() +@@ -89,7 +89,7 @@ + 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""" +@@ -185,7 +185,7 @@ + + if len(ignored_mounts) > 0: + ignore_list = [el["mountpoint"] for el in ignored_mounts] +- logger.info("Some mount points were ignored: {0}".format(', '.join(ignore_list))) ++ logger.info("Some mount points were ignored: {}".format(', '.join(ignore_list))) + + return result_mounts + +@@ -201,10 +201,10 @@ + quiet=not logger.isEnabledFor(logging.DEBUG)) + return call_result and call_result[0] == 0 + except ExecuteTimeoutException: +- logger.exception("Exception happened while checking mount {0}".format(mount_point)) ++ logger.exception("Exception happened while checking mount {}".format(mount_point)) + return False + except Fail: +- logger.exception("Exception happened while checking mount {0}".format(mount_point)) ++ logger.exception("Exception happened while checking mount {}".format(mount_point)) + return False + + @OsFamilyFuncImpl(OSConst.WINSRV_FAMILY) +@@ -246,7 +246,7 @@ + from resource_management.core.logger import Logger + Logger.initialize_logger() + +- print Hardware().get() ++ print((Hardware().get())) + + + if __name__ == '__main__': +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/HeartbeatHandlers.py apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/HeartbeatHandlers.py +--- ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/HeartbeatHandlers.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/HeartbeatHandlers.py 2022-07-11 00:52:30.000000000 +0800 +@@ -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 @@ + + _handler = None + +-class HeartbeatStopHandlers(object):pass ++class HeartbeatStopHandlers:pass + + # windows impl + +@@ -79,7 +79,7 @@ + # linux impl + + def signal_handler(signum, frame): +- logger.info("Ambari-agent received {0} signal, stopping...".format(signum)) ++ logger.info(f"Ambari-agent received {signum} signal, stopping...") + _handler.set() + + +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/Heartbeat.py apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/Heartbeat.py +--- ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/Heartbeat.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/Heartbeat.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +@@ -118,7 +118,7 @@ + ctl = Controller(cfg) + actionQueue = ActionQueue(cfg, ctl) + heartbeat = Heartbeat(actionQueue) +- print json.dumps(heartbeat.build('3',3)) ++ print((json.dumps(heartbeat.build('3',3)))) + + + if __name__ == '__main__': +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/HeartbeatThread.py apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/HeartbeatThread.py +--- ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/HeartbeatThread.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/HeartbeatThread.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +@@ -101,15 +101,15 @@ + self.check_for_memory_leak() + + heartbeat_body = self.get_heartbeat_body() +- logger.debug("Heartbeat body is {0}".format(heartbeat_body)) ++ logger.debug(f"Heartbeat body is {heartbeat_body}") + response = self.blocking_request(heartbeat_body, Constants.HEARTBEAT_ENDPOINT) +- logger.debug("Heartbeat response is {0}".format(response)) ++ logger.debug(f"Heartbeat response is {response}") + self.handle_heartbeat_reponse(response) + except Exception as ex: + if isinstance(ex, (ConnectionIsAlreadyClosed)): + logger.info("Connection was closed. Re-running the registration") + elif isinstance(ex, (socket_error)): +- logger.info("Connection error \"{0}\". Re-running the registration".format(str(ex))) ++ logger.info(f"Connection error \"{str(ex)}\". Re-running the registration") + else: + logger.exception("Exception in HeartbeatThread. Re-running the registration") + +@@ -131,12 +131,12 @@ + + registration_request = self.registration_builder.build() + logger.info("Sending registration request") +- logger.debug("Registration request is {0}".format(registration_request)) ++ logger.debug(f"Registration request is {registration_request}") + + response = self.blocking_request(registration_request, Constants.REGISTRATION_ENDPOINT) + + logger.info("Registration response received") +- logger.debug("Registration response is {0}".format(response)) ++ logger.debug(f"Registration response is {response}") + + self.handle_registration_response(response) + +@@ -149,7 +149,7 @@ + try: + listener.on_event({}, response) + except: +- logger.exception("Exception while handing response to request at {0}. {1}".format(endpoint, response)) ++ logger.exception(f"Exception while handing response to request at {endpoint}. {response}") + raise + finally: + with listener.event_queue_lock: +@@ -202,13 +202,13 @@ + # exitstatus = 0 (OK - Default) + # exitstatus = 1 (Registration failed because different version of agent and server) + exitstatus = 0 +- if 'exitstatus' in response.keys(): ++ if 'exitstatus' in list(response.keys()): + exitstatus = int(response['exitstatus']) + + if exitstatus != 0: + # log - message, which will be printed to agents log +- if 'log' in response.keys(): +- error_message = "Registration failed due to: {0}".format(response['log']) ++ if 'log' in list(response.keys()): ++ error_message = "Registration failed due to: {}".format(response['log']) + else: + error_message = "Registration failed" + +@@ -248,7 +248,7 @@ + """ + Create a stomp connection + """ +- connection_url = 'wss://{0}:{1}/agent/stomp/v1'.format(self.config.server_hostname, self.config.secured_url_port) ++ connection_url = f'wss://{self.config.server_hostname}:{self.config.secured_url_port}/agent/stomp/v1' + connection_helper = security.VerifiedHTTPSConnection(self.config.server_hostname, connection_url, self.config) + self.connection = connection_helper.connect() + +@@ -275,13 +275,13 @@ + correlation_id = self.connection.send(message=message, destination=destination, presend_hook=presend_hook) + except ConnectionIsAlreadyClosed: + # this happens when trying to connect to broken connection. Happens if ambari-server is restarted. +- logger.warn("Connection failed while trying to connect to {0}".format(destination)) ++ logger.warn(f"Connection failed while trying to connect to {destination}") + raise + + try: + return self.server_responses_listener.responses.blocking_pop(correlation_id, timeout=timeout) + except BlockingDictionary.DictionaryPopTimeout: +- raise Exception("{0} seconds timeout expired waiting for response from server at {1} to message from {2}".format(timeout, Constants.SERVER_RESPONSES_TOPIC, destination)) ++ raise Exception(f"{timeout} seconds timeout expired waiting for response from server at {Constants.SERVER_RESPONSES_TOPIC} to message from {destination}") + + def check_for_memory_leak(self): + used_ram = get_used_ram()/1000 +@@ -292,4 +292,3 @@ + if self.config.max_ram_hard and used_ram >= self.config.max_ram_hard: + logger.error(AGENT_RAM_OVERUSE_MESSAGE.format(used_ram=used_ram, config_name="memory_threshold_hard_mb", max_ram=self.config.max_ram_hard)) + Utils.restartAgent(self.stop_event) +- +\ 文件尾没有换行符 +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/HostCheckReportFileHandler.py apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/HostCheckReportFileHandler.py +--- ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/HostCheckReportFileHandler.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/HostCheckReportFileHandler.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + """ + Licensed to the Apache Software Foundation (ASF) under one +@@ -23,12 +23,12 @@ + import logging + import re + import traceback +-from AmbariConfig import AmbariConfig +-import ConfigParser ++from .AmbariConfig import AmbariConfig ++import configparser + + HADOOP_ROOT_DIR = "/usr/hdp" + HADOOP_PERM_REMOVE_LIST = ["current"] +-HADOOP_ITEMDIR_REGEX = "(\d\.){3}\d-\d{4}" ++HADOOP_ITEMDIR_REGEX = r"(\d\.){3}\d-\d{4}" + logger = logging.getLogger(__name__) + + class HostCheckReportFileHandler: +@@ -54,7 +54,7 @@ + else: + raise Exception("No config found, use default") + +- except Exception, err: ++ except Exception as err: + logger.warn(err) + return config + +@@ -64,18 +64,18 @@ + + 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())) + +- if 'installed_packages' in structuredOutput.keys(): ++ if 'installed_packages' in list(structuredOutput.keys()): + items = [] + for itemDetail in structuredOutput['installed_packages']: + items.append(itemDetail['name']) + config.add_section('packages') + config.set('packages', 'pkg_list', ','.join(map(str, items))) + +- if 'existing_repos' in structuredOutput.keys(): ++ if 'existing_repos' in list(structuredOutput.keys()): + config.add_section('repositories') + config.set('repositories', 'repo_list', ','.join(structuredOutput['existing_repos'])) + +@@ -83,8 +83,8 @@ + self.touchFile(self.hostCheckCustomActionsFilePath) + with open(self.hostCheckCustomActionsFilePath, 'wb') as configfile: + config.write(configfile) +- except Exception, err: +- logger.error("Can't write host check file at %s :%s " % (self.hostCheckCustomActionsFilePath, err.message)) ++ except Exception as err: ++ logger.error("Can't write host check file at {} :{} ".format(self.hostCheckCustomActionsFilePath, err.message)) + traceback.print_exc() + + def _stack_list_directory(self): +@@ -103,7 +103,7 @@ + remlist_items_count = 0 + + for item in folder_content: +- full_path = "%s%s%s" % (HADOOP_ROOT_DIR, os.path.sep, item) ++ full_path = "{}{}{}".format(HADOOP_ROOT_DIR, os.path.sep, item) + if item in HADOOP_PERM_REMOVE_LIST: + remove_list.append(full_path) + remlist_items_count += 1 +@@ -124,11 +124,11 @@ + + 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())) + +- if 'existingUsers' in hostInfo.keys(): ++ if 'existingUsers' in list(hostInfo.keys()): + items = [] + items2 = [] + for itemDetail in hostInfo['existingUsers']: +@@ -138,7 +138,7 @@ + config.set('users', 'usr_list', ','.join(items)) + config.set('users', 'usr_homedir_list', ','.join(items2)) + +- if 'alternatives' in hostInfo.keys(): ++ if 'alternatives' in list(hostInfo.keys()): + items = [] + items2 = [] + for itemDetail in hostInfo['alternatives']: +@@ -148,7 +148,7 @@ + config.set('alternatives', 'symlink_list', ','.join(items)) + config.set('alternatives', 'target_list', ','.join(items2)) + +- if 'stackFoldersAndFiles' in hostInfo.keys(): ++ if 'stackFoldersAndFiles' in list(hostInfo.keys()): + items = [] + for itemDetail in hostInfo['stackFoldersAndFiles']: + items.append(itemDetail['name']) +@@ -156,8 +156,8 @@ + config.add_section('directories') + config.set('directories', 'dir_list', ','.join(items)) + +- if 'hostHealth' in hostInfo.keys(): +- if 'activeJavaProcs' in hostInfo['hostHealth'].keys(): ++ if 'hostHealth' in list(hostInfo.keys()): ++ if 'activeJavaProcs' in list(hostInfo['hostHealth'].keys()): + items = [] + for itemDetail in hostInfo['hostHealth']['activeJavaProcs']: + items.append(itemDetail['pid']) +@@ -168,8 +168,8 @@ + self.touchFile(self.hostCheckFilePath) + with open(self.hostCheckFilePath, 'wb') as configfile: + config.write(configfile) +- except Exception, err: +- logger.error("Can't write host check file at %s :%s " % (self.hostCheckFilePath, err.message)) ++ except Exception as err: ++ logger.error("Can't write host check file at {} :{} ".format(self.hostCheckFilePath, err.message)) + traceback.print_exc() + + def removeFile(self, path): +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/HostCleanup.py apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/HostCleanup.py +--- ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/HostCleanup.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/HostCleanup.py 2022-07-11 00:52:30.000000000 +0800 +@@ -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 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 .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 +@@ -102,7 +102,7 @@ + elif OSCheck.is_ubuntu_family(): + return "/usr/bin/apt-get -y -q remove {0}" + else: +- raise Exception("Unsupported OS family '{0}', cannot remove package. ".format(OSCheck.get_os_family())) ++ raise Exception("Unsupported OS family '{}', cannot remove package. ".format(OSCheck.get_os_family())) + + + class HostCleanup: +@@ -115,7 +115,7 @@ + else: + raise Exception("No config found, use default") + +- except Exception, err: ++ except Exception as err: + logger.warn(err) + return config + +@@ -190,16 +190,16 @@ + def read_host_check_file(self, config_file_path): + propertyMap = {} + try: +- with open(config_file_path, 'r'): ++ with open(config_file_path): + 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 + +@@ -294,9 +294,9 @@ + for folder in file_map: + if isinstance(file_map[folder], list): # here is list of file masks/files + for mask in file_map[folder]: +- remList += self.get_files_in_dir("%s/%s" % (cache_root, folder), mask) ++ remList += self.get_files_in_dir("{}/{}".format(cache_root, folder), mask) + elif isinstance(file_map[folder], dict): # here described sub-folder +- remList += self.do_clear_cache("%s/%s" % (cache_root, folder), file_map[folder]) ++ remList += self.do_clear_cache("{}/{}".format(cache_root, folder), file_map[folder]) + + if dir_map is not None: # push result list back as this is call from stack + return remList +@@ -358,7 +358,7 @@ + for pid in pids: + logger.debug("Checking " + str(pid)) + try: +- with open(os.path.join('/proc', pid, 'status'), 'r') as f: ++ with open(os.path.join('/proc', pid, 'status')) as f: + for line in f: + if line.startswith('Uid:'): + uid = int(line.split()[1]) +@@ -389,7 +389,7 @@ + identifier = identifier.strip() + if identifier in line: + logger.debug("Found " + line + " for " + identifier); +- line = re.sub("\s\s+" , " ", line) #replace multi spaces with single space before calling the split ++ line = re.sub(r"\s\s+" , " ", line) #replace multi spaces with single space before calling the split + tokens = line.split(' ') + logger.debug(tokens) + logger.debug(len(tokens)) +@@ -441,7 +441,7 @@ + + if fileList: + for filePath in fileList: +- with open(filePath, 'r') as file: ++ with open(filePath) as file: + content = file.readline() + while (content != "" ): + for repoName in repoNameList: +@@ -473,7 +473,7 @@ + if pathList: + for aPath in pathList: + pathArr = glob.glob(aPath) +- logger.debug("Resolved {0} to {1}".format(aPath, ','.join(pathArr))) ++ logger.debug("Resolved {} to {}".format(aPath, ','.join(pathArr))) + for path in pathArr: + if path: + if os.path.exists(path): +@@ -481,15 +481,15 @@ + try: + shutil.rmtree(path) + except: +- logger.warn("Failed to remove dir {0} , error: {1}".format(path, str(sys.exc_info()[0]))) ++ logger.warn("Failed to remove dir {} , error: {}".format(path, str(sys.exc_info()[0]))) + else: +- logger.info("{0} is a file, deleting file".format(path)) ++ logger.info("{} is a file, deleting file".format(path)) + self.do_erase_files_silent([path]) + elif os.path.islink(path): +- logger.info("Deleting broken symbolic link {0}".format(path)) ++ logger.info("Deleting broken symbolic link {}".format(path)) + self.do_erase_files_silent([path]) + else: +- logger.info("Path doesn't exists: {0}".format(path)) ++ logger.info("Path doesn't exists: {}".format(path)) + return 0 + + def do_erase_files_silent(self, pathList): +@@ -499,9 +499,9 @@ + try: + os.remove(path) + except: +- logger.warn("Failed to delete file: {0}, error: {1}".format(path, str(sys.exc_info()[0]))) ++ logger.warn("Failed to delete file: {}, error: {}".format(path, str(sys.exc_info()[0]))) + else: +- logger.info("File doesn't exists: {0}".format(path)) ++ logger.info("File doesn't exists: {}".format(path)) + return 0 + + def do_delete_group(self): +@@ -598,27 +598,27 @@ + 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 + + + def get_YN_input(prompt, default): +- yes = set(['yes', 'ye', 'y']) +- no = set(['no', 'n']) ++ yes = {'yes', 'ye', 'y'} ++ no = {'no', 'n'} + return get_choice_string_input(prompt, default, yes, no) + + + 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: + return False +- elif choice is "": # Just enter pressed ++ elif choice == "": # 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 + +@@ -679,7 +679,7 @@ + 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(",") +@@ -687,10 +687,10 @@ + # 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 {}. 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) ++ run_check_hosts_input = get_YN_input('Host Check results not found. There is no {}. Do you want to run host checks [y/n] (y)'.format(hostcheckfileca), True) + if run_check_hosts_input: + h.run_check_hosts() + +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/HostInfo.py apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/HostInfo.py +--- ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/HostInfo.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/HostInfo.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +@@ -34,9 +34,9 @@ + from resource_management.core import shell + + from ambari_agent.HostCheckReportFileHandler import HostCheckReportFileHandler +-from AmbariConfig import AmbariConfig ++from .AmbariConfig import AmbariConfig + from resource_management.core.resources.jcepolicyinfo import JcePolicyInfo +-import Hardware ++from . import Hardware + + logger = logging.getLogger() + +@@ -44,7 +44,7 @@ + SERVICE_CMD = "service" + + +-class HostInfo(object): ++class HostInfo: + # Filters used to identify processed + PROC_FILTER = [ + "hadoop", "zookeeper" +@@ -107,7 +107,7 @@ + svcCheckResult['desc'] = err + else: + svcCheckResult['status'] = "Healthy" +- except Exception, e: ++ except Exception as e: + svcCheckResult['status'] = "Unhealthy" + svcCheckResult['desc'] = repr(e) + result.append(svcCheckResult) +@@ -136,7 +136,7 @@ + host_fqdn = socket.getfqdn().lower() + fqdn_ip = socket.gethostbyname(host_fqdn) + return host_ip == fqdn_ip +- except socket.error: ++ except OSError: + pass + return False + +@@ -190,14 +190,14 @@ + ] + + DEFAULT_SERVICE_NAME = "ntpd" +- SERVICE_STATUS_CMD = "%s %s status" % (SERVICE_CMD, DEFAULT_SERVICE_NAME) ++ SERVICE_STATUS_CMD = "{} {} status".format(SERVICE_CMD, DEFAULT_SERVICE_NAME) + SERVICE_STATUS_CMD_LIST = shlex.split(SERVICE_STATUS_CMD) + + THP_FILE_REDHAT = "/sys/kernel/mm/redhat_transparent_hugepage/enabled" + THP_FILE_UBUNTU = "/sys/kernel/mm/transparent_hugepage/enabled" + + def __init__(self, config=None): +- super(HostInfoLinux, self).__init__(config) ++ super().__init__(config) + + def checkUsers(self, users, results): + for user in users: +@@ -243,7 +243,7 @@ + for pid in pids: + try: + fp = open(os.path.join('/proc', pid, 'cmdline'), 'rb') +- except IOError: ++ except OSError: + continue # avoid race condition if this process already died, since the moment we got pids list. + + cmd = fp.read() +@@ -266,7 +266,7 @@ + logger.exception("Checking java processes failed") + + def getTransparentHugePage(self): +- thp_regex = "\[(.+)\]" ++ thp_regex = r"\[(.+)\]" + file_name = None + if OSCheck.is_ubuntu_family(): + file_name = self.THP_FILE_UBUNTU +@@ -372,7 +372,7 @@ + code, out, err = shell.call(service_check_live, stdout = subprocess32.PIPE, stderr = subprocess32.PIPE, timeout = 5, quiet = True) + return out, err, code + except Exception as ex: +- logger.warn("Checking service {0} status failed".format(service_name)) ++ logger.warn("Checking service {} status failed".format(service_name)) + return '', str(ex), 1 + + +@@ -380,7 +380,7 @@ + @OsFamilyImpl(os_family=OSConst.WINSRV_FAMILY) + class HostInfoWindows(HostInfo): + SERVICE_STATUS_CMD = 'If ((Get-Service | Where-Object {{$_.Name -eq \'{0}\'}}).Status -eq \'Running\') {{echo "Running"; $host.SetShouldExit(0)}} Else {{echo "Stopped"; $host.SetShouldExit(1)}}' +- GET_USERS_CMD = '$accounts=(Get-WmiObject -Class Win32_UserAccount -Namespace "root\cimv2" -Filter "name = \'{0}\' and Disabled=\'False\'" -ErrorAction Stop); foreach ($acc in $accounts) {{Write-Host ($acc.Domain + "\\" + $acc.Name)}}' ++ GET_USERS_CMD = '$accounts=(Get-WmiObject -Class Win32_UserAccount -Namespace "root\\cimv2" -Filter "name = \'{0}\' and Disabled=\'False\'" -ErrorAction Stop); foreach ($acc in $accounts) {{Write-Host ($acc.Domain + "\\" + $acc.Name)}}' + GET_JAVA_PROC_CMD = 'foreach ($process in (gwmi Win32_Process -Filter "name = \'java.exe\'")){{echo $process.ProcessId;echo $process.CommandLine; echo $process.GetOwner().User}}' + DEFAULT_LIVE_SERVICES = [ + ("W32Time",) +@@ -475,7 +475,7 @@ + h = HostInfo() + struct = {} + h.register(struct) +- print struct ++ print(struct) + + + if __name__ == '__main__': +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/hostname.py apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/hostname.py +--- ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/hostname.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/hostname.py 2022-07-11 00:52:30.000000000 +0800 +@@ -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 socket + from ambari_commons import subprocess32 +-import urllib2 ++import urllib.request, urllib.error, urllib.parse + import logging + import traceback + import sys +@@ -53,18 +53,18 @@ + out, err = osStat.communicate() + if (0 == osStat.returncode and 0 != len(out.strip())): + cached_hostname = out.strip() +- logger.info("Read hostname '{0}' using agent:hostname_script '{1}'".format(cached_hostname, scriptname)) ++ logger.info("Read hostname '{}' using agent:hostname_script '{}'".format(cached_hostname, scriptname)) + else: +- logger.warn("Execution of '{0}' failed with exit code {1}. err='{2}'\nout='{3}'".format(scriptname, osStat.returncode, err.strip(), out.strip())) ++ logger.warn("Execution of '{}' failed with exit code {}. err='{}'\nout='{}'".format(scriptname, osStat.returncode, err.strip(), out.strip())) + cached_hostname = socket.getfqdn() +- logger.info("Read hostname '{0}' using socket.getfqdn() as '{1}' failed".format(cached_hostname, scriptname)) ++ logger.info("Read hostname '{}' using socket.getfqdn() as '{}' failed".format(cached_hostname, scriptname)) + except: + cached_hostname = socket.getfqdn() +- logger.warn("Unexpected error while retrieving hostname: '{0}', defaulting to socket.getfqdn()".format(sys.exc_info())) +- logger.info("Read hostname '{0}' using socket.getfqdn().".format(cached_hostname)) ++ logger.warn("Unexpected error while retrieving hostname: '{}', defaulting to socket.getfqdn()".format(sys.exc_info())) ++ logger.info("Read hostname '{}' using socket.getfqdn().".format(cached_hostname)) + except: + cached_hostname = socket.getfqdn() +- logger.info("agent:hostname_script configuration not defined thus read hostname '{0}' using socket.getfqdn().".format(cached_hostname)) ++ logger.info("agent:hostname_script configuration not defined thus read hostname '{}' using socket.getfqdn().".format(cached_hostname)) + + cached_hostname = cached_hostname.lower() + return cached_hostname +@@ -87,7 +87,7 @@ + logger.info("Read public hostname '" + cached_public_hostname + "' using agent:public_hostname_script") + return cached_public_hostname + else: +- logger.warn("Execution of '{0}' returned {1}. {2}\n{3}".format(scriptname, output.returncode, err.strip(), out.strip())) ++ logger.warn("Execution of '{}' returned {}. {}\n{}".format(scriptname, output.returncode, err.strip(), out.strip())) + except: + #ignore for now. + trace_info = traceback.format_exc() +@@ -96,7 +96,7 @@ + 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() +@@ -122,7 +122,7 @@ + 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 main(argv=None): +- print hostname() +- print public_hostname() +- print server_hostname() ++ print((hostname())) ++ print((public_hostname())) ++ print((server_hostname())) + + if __name__ == '__main__': + main() +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/InitializerModule.py apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/InitializerModule.py +--- ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/InitializerModule.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/InitializerModule.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/__init__.py apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/__init__.py +--- ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/__init__.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/__init__.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/listeners/AgentActionsListener.py apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/listeners/AgentActionsListener.py +--- ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/listeners/AgentActionsListener.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/listeners/AgentActionsListener.py 2022-07-11 00:52:30.000000000 +0800 +@@ -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 @@ + RESTART_AGENT_ACTION = 'RESTART_AGENT' + + def __init__(self, initializer_module): +- super(AgentActionsListener, self).__init__(initializer_module) ++ super().__init__(initializer_module) + self.stop_event = initializer_module.stop_event + + def on_event(self, headers, message): +@@ -54,7 +54,7 @@ + if action_name == self.RESTART_AGENT_ACTION: + self.restart_agent() + else: +- logger.warn("Unknown action '{0}' requested by server. Ignoring it".format(action_name)) ++ logger.warn(f"Unknown action '{action_name}' requested by server. Ignoring it") + + def restart_agent(self): + logger.warn("Restarting the agent by the request from server") +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/listeners/AlertDefinitionsEventListener.py apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/listeners/AlertDefinitionsEventListener.py +--- ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/listeners/AlertDefinitionsEventListener.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/listeners/AlertDefinitionsEventListener.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +@@ -31,7 +31,7 @@ + Listener of Constants.ALERTS_DEFINITIONS_TOPIC events from server. + """ + def __init__(self, initializer_module): +- super(AlertDefinitionsEventListener, self).__init__(initializer_module) ++ super().__init__(initializer_module) + self.alert_definitions_cache = initializer_module.alert_definitions_cache + self.alert_scheduler_handler = initializer_module.alert_scheduler_handler + +@@ -75,4 +75,4 @@ + except KeyError: + pass + +- return super(AlertDefinitionsEventListener, self).get_log_message(headers, message_json) ++ return super().get_log_message(headers, message_json) +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/listeners/CommandsEventListener.py apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/listeners/CommandsEventListener.py +--- ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/listeners/CommandsEventListener.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/listeners/CommandsEventListener.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +@@ -31,7 +31,7 @@ + Listener of Constants.CONFIGURATIONS_TOPIC events from server. + """ + def __init__(self, initializer_module): +- super(CommandsEventListener, self).__init__(initializer_module) ++ super().__init__(initializer_module) + self.action_queue = initializer_module.action_queue + + def on_event(self, headers, message): +@@ -44,7 +44,7 @@ + "" + commands = [] + cancel_commands = [] +- for cluster_id in message['clusters'].keys(): ++ for cluster_id in list(message['clusters'].keys()): + cluster_dict = message['clusters'][cluster_id] + + if 'commands' in cluster_dict: +@@ -77,4 +77,4 @@ + except KeyError: + pass + +- return super(CommandsEventListener, self).get_log_message(headers, message_json) +\ 文件尾没有换行符 ++ return super().get_log_message(headers, message_json) +\ 文件尾没有换行符 +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/listeners/ConfigurationEventListener.py apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/listeners/ConfigurationEventListener.py +--- ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/listeners/ConfigurationEventListener.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/listeners/ConfigurationEventListener.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +@@ -31,7 +31,7 @@ + Listener of Constants.CONFIGURATIONS_TOPIC events from server. + """ + def __init__(self, initializer_module): +- super(ConfigurationEventListener, self).__init__(initializer_module) ++ super().__init__(initializer_module) + self.configurations_cache = initializer_module.configurations_cache + self.recovery_manager = initializer_module.recovery_manager + +@@ -65,4 +65,4 @@ + except KeyError: + pass + +- return super(ConfigurationEventListener, self).get_log_message(headers, message_json) +\ 文件尾没有换行符 ++ return super().get_log_message(headers, message_json) +\ 文件尾没有换行符 +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/listeners/HostLevelParamsEventListener.py apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/listeners/HostLevelParamsEventListener.py +--- ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/listeners/HostLevelParamsEventListener.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/listeners/HostLevelParamsEventListener.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +@@ -31,7 +31,7 @@ + Listener of Constants.HOST_LEVEL_PARAMS_TOPIC events from server. + """ + def __init__(self, initializer_module): +- super(HostLevelParamsEventListener, self).__init__(initializer_module) ++ super().__init__(initializer_module) + self.host_level_params_cache = initializer_module.host_level_params_cache + self.recovery_manager = initializer_module.recovery_manager + +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/listeners/__init__.py apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/listeners/__init__.py +--- ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/listeners/__init__.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/listeners/__init__.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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__) +@@ -46,7 +46,7 @@ + while not self.unprocessed_messages_queue.empty(): + payload = self.unprocessed_messages_queue.get_nowait() + if payload: +- logger.info("Processing event from unprocessed queue {0} {1}".format(payload[0], payload[1])) ++ logger.info(f"Processing event from unprocessed queue {payload[0]} {payload[1]}") + destination = payload[0] + headers = payload[1] + message_json = payload[2] +@@ -54,7 +54,7 @@ + try: + self.on_event(headers, message_json) + except Exception as ex: +- logger.exception("Exception while handing event from {0} {1} {2}".format(destination, headers, message)) ++ logger.exception(f"Exception while handing event from {destination} {headers} {message}") + self.report_status_to_sender(headers, message, ex) + else: + self.report_status_to_sender(headers, message) +@@ -75,28 +75,28 @@ + try: + message_json = json.loads(message) + except ValueError as ex: +- logger.exception("Received from server event is not a valid message json. Message is:\n{0}".format(message)) ++ logger.exception(f"Received from server event is not a valid message json. Message is:\n{message}") + self.report_status_to_sender(headers, message, ex) + return + +- logger.info("Event from server at {0}{1}".format(destination, self.get_log_message(headers, copy.deepcopy(message_json)))) ++ logger.info(f"Event from server at {destination}{self.get_log_message(headers, copy.deepcopy(message_json))}") + + if not self.enabled: + with self.event_queue_lock: + if not self.enabled: +- logger.info("Queuing event as unprocessed {0} since event " ++ logger.info("Queuing event as unprocessed {} since event " + "listener is disabled".format(destination)) + try: + self.unprocessed_messages_queue.put_nowait((destination, headers, message_json, message)) + except Exception as ex: + logger.warning("Cannot queue any more unprocessed events since " +- "queue is full! {0} {1}".format(destination, message)) ++ "queue is full! {} {}".format(destination, message)) + return + + try: + self.on_event(headers, message_json) + except Exception as ex: +- logger.exception("Exception while handing event from {0} {1} {2}".format(destination, headers, message)) ++ logger.exception(f"Exception while handing event from {destination} {headers} {message}") + self.report_status_to_sender(headers, message, ex) + else: + self.report_status_to_sender(headers, message) +@@ -126,7 +126,7 @@ + try: + connection.send(message=confirmation_of_received, destination=Constants.AGENT_RESPONSES_TOPIC) + except: +- logger.exception("Could not send a confirmation '{0}' to server".format(confirmation_of_received)) ++ logger.exception(f"Could not send a confirmation '{confirmation_of_received}' to server") + + def on_event(self, headers, message): + """ +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/listeners/MetadataEventListener.py apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/listeners/MetadataEventListener.py +--- ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/listeners/MetadataEventListener.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/listeners/MetadataEventListener.py 2022-07-11 00:52:30.000000000 +0800 +@@ -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 @@ + Listener of Constants.METADATA_TOPIC events from server. + """ + def __init__(self, initializer_module): +- super(MetadataEventListener, self).__init__(initializer_module) ++ super().__init__(initializer_module) + self.metadata_cache = initializer_module.metadata_cache + self.config = initializer_module.config + +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/listeners/ServerResponsesListener.py apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/listeners/ServerResponsesListener.py +--- ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/listeners/ServerResponsesListener.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/listeners/ServerResponsesListener.py 2022-07-11 00:52:30.000000000 +0800 +@@ -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 @@ + RESPONSE_STATUS_SUCCESS = 'OK' + + def __init__(self, initializer_module): +- super(ServerResponsesListener, self).__init__(initializer_module) ++ super().__init__(initializer_module) + self.reset_responses() + + def on_event(self, headers, message): +@@ -64,7 +64,7 @@ + self.listener_functions_on_error[correlation_id](headers, message) + del self.listener_functions_on_error[correlation_id] + else: +- logger.warn("Received a message from server without a '{0}' header. Ignoring the message".format(Constants.CORRELATION_ID_STRING)) ++ logger.warn(f"Received a message from server without a '{Constants.CORRELATION_ID_STRING}' header. Ignoring the message") + + def get_handled_path(self): + return Constants.SERVER_RESPONSES_TOPIC +@@ -82,7 +82,7 @@ + message_json = message_json[2:] + del self.logging_handlers[correlation_id] + +- return " (correlation_id={0}): {1}".format(correlation_id, message_json) ++ return f" (correlation_id={correlation_id}): {message_json}" + return str(message_json) + + def reset_responses(self): +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/listeners/TopologyEventListener.py apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/listeners/TopologyEventListener.py +--- ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/listeners/TopologyEventListener.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/listeners/TopologyEventListener.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +@@ -31,7 +31,7 @@ + Listener of Constants.TOPOLOGIES_TOPIC events from server. + """ + def __init__(self, initializer_module): +- super(TopologyEventListener, self).__init__(initializer_module) ++ super().__init__(initializer_module) + self.topology_cache = initializer_module.topology_cache + + def on_event(self, headers, message): +@@ -74,4 +74,4 @@ + except KeyError: + pass + +- return super(TopologyEventListener, self).get_log_message(headers, message_json) +\ 文件尾没有换行符 ++ return super().get_log_message(headers, message_json) +\ 文件尾没有换行符 +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/LiveStatus.py apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/LiveStatus.py +--- ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/LiveStatus.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/LiveStatus.py 2022-07-11 00:52:30.000000000 +0800 +@@ -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 .ActualConfigHandler import ActualConfigHandler + + + class LiveStatus: +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/main.py apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/main.py +--- ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/main.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/main.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +@@ -34,15 +34,14 @@ + !!! 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 ++ #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 sys ++ #del sys.modules['gc'] + import gc + +- + """ + # this might cause some unexcepted problems + def fix_subprocess_popen(): +@@ -87,20 +86,20 @@ + import time + import locale + import platform +-import ConfigParser ++import configparser + import resource + from logging.handlers import SysLogHandler +-import AmbariConfig +-from NetUtil import NetUtil +-from PingPortListener import PingPortListener +-import hostname +-from DataCleaner import DataCleaner ++from ambari_agent.AmbariConfig 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 +@@ -125,7 +124,7 @@ + agent_piddir = os.environ['AMBARI_PID_DIR'] if 'AMBARI_PID_DIR' in os.environ else "/var/run/ambari-agent" + agent_pidfile = os.path.join(agent_piddir, "ambari-agent.pid") + +-config = AmbariConfig.AmbariConfig() ++config = AmbariConfig() + + # TODO AMBARI-18733, remove this global variable and calculate it based on home_dir once it is set. + configFile = config.getConfigFile() +@@ -152,7 +151,7 @@ + + 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.{}".format(logging._levelToName[logging_level])) + + GRACEFUL_STOP_TRIES = 300 + GRACEFUL_STOP_TRIES_SLEEP = 0.1 +@@ -175,7 +174,7 @@ + # Setting loglevel based on config file + global logger + global home_dir +- log_cfg_file = os.path.join(os.path.dirname(AmbariConfig.AmbariConfig.getConfigFile(home_dir)), "logging.conf") ++ log_cfg_file = os.path.join(os.path.dirname(AmbariConfig.getConfigFile(home_dir)), "logging.conf") + if os.path.exists(log_cfg_file): + logging.config.fileConfig(log_cfg_file) + # create logger +@@ -186,14 +185,14 @@ + loglevel = config.get('agent', 'loglevel') + if loglevel is not None: + if loglevel == 'DEBUG': +- logging.basicConfig(format=formatstr, level=logging.DEBUG, filename=AmbariConfig.AmbariConfig.getLogFile()) ++ logging.basicConfig(format=formatstr, level=logging.DEBUG, filename=AmbariConfig.getLogFile()) + logger.setLevel(logging.DEBUG) + logger.info("Newloglevel=logging.DEBUG") + else: +- logging.basicConfig(format=formatstr, level=logging.INFO, filename=AmbariConfig.AmbariConfig.getLogFile()) ++ logging.basicConfig(format=formatstr, level=logging.INFO, filename=AmbariConfig.getLogFile()) + logger.setLevel(logging.INFO) + logger.debug("Newloglevel=logging.INFO") +- except Exception, err: ++ except Exception as err: + logger.info("Default loglevel=DEBUG") + + +@@ -205,14 +204,14 @@ + """ + global config + global home_dir +- configPath = os.path.abspath(AmbariConfig.AmbariConfig.getConfigFile(home_dir)) ++ configPath = os.path.abspath(AmbariConfig.getConfigFile(home_dir)) + try: + if os.path.exists(configPath): + config.read(configPath) + else: +- raise Exception("No config found at {0}, use default".format(configPath)) ++ raise Exception("No config found at {}, use default".format(configPath)) + +- except Exception, err: ++ except Exception as err: + logger.warn(err) + + def check_sudo(): +@@ -247,10 +246,10 @@ + if open_files_ulimit >= soft_limit: + try: + resource.setrlimit(resource.RLIMIT_NOFILE, (soft_limit, open_files_ulimit)) +- logger.info('open files ulimit = {0}'.format(open_files_ulimit)) +- except ValueError, 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)) ++ logger.info('open files ulimit = {}'.format(open_files_ulimit)) ++ except ValueError as err: ++ logger.error('Unable to set open files ulimit to {}: {}'.format(open_files_ulimit, str(err))) ++ logger.info('open files ulimit = {}'.format(hard_limit)) + + def perform_prestart_checks(expected_hostname): + # Check if current hostname is equal to expected one (got from the server +@@ -262,15 +261,15 @@ + if current_hostname != expected_hostname: + print("Determined hostname does not match expected. Please check agent " + "log for details") +- msg = "Ambari agent machine hostname ({0}) does not match expected ambari " \ +- "server hostname ({1}). Aborting registration. Please check hostname, " \ ++ msg = "Ambari agent machine hostname ({}) does not match expected ambari " \ ++ "server hostname ({}). Aborting registration. Please check hostname, " \ + "hostname -f and /etc/hosts file to confirm your " \ + "hostname is setup correctly".format(current_hostname, expected_hostname) + logger.error(msg) + 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'))): +@@ -290,14 +289,14 @@ + + def daemonize(): + pid = str(os.getpid()) +- file(agent_pidfile, 'w').write(pid) ++ open(agent_pidfile, 'w').write(pid) + + def stop_agent(): + # stop existing Ambari agent + pid = -1 + runner = shellRunner() + try: +- with open(agent_pidfile, 'r') as f: ++ with open(agent_pidfile) as f: + pid = f.read() + pid = int(pid) + +@@ -310,7 +309,7 @@ + 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") +@@ -326,27 +325,27 @@ + 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: +- print("A problem occurred while trying to reset the agent: " + str(err)) ++ except Exception as err: ++ print(("A problem occurred while trying to reset the agent: " + str(err))) + sys.exit(1) + + sys.exit(0) +@@ -392,13 +391,13 @@ + + logging_level = logging.DEBUG if options.verbose else logging.INFO + +- setup_logging(logger, AmbariConfig.AmbariConfig.getLogFile(), logging_level) ++ setup_logging(logger, AmbariConfig.getLogFile(), logging_level) + global is_logger_setup + is_logger_setup = True +- setup_logging(alerts_logger, AmbariConfig.AmbariConfig.getAlertsLogFile(), logging_level) +- setup_logging(alerts_logger_global, AmbariConfig.AmbariConfig.getAlertsLogFile(), logging_level) +- setup_logging(apscheduler_logger, AmbariConfig.AmbariConfig.getAlertsLogFile(), logging_level) +- setup_logging(apscheduler_logger_global, AmbariConfig.AmbariConfig.getAlertsLogFile(), logging_level) ++ setup_logging(alerts_logger, AmbariConfig.getAlertsLogFile(), logging_level) ++ setup_logging(alerts_logger_global, AmbariConfig.getAlertsLogFile(), logging_level) ++ setup_logging(apscheduler_logger, AmbariConfig.getAlertsLogFile(), logging_level) ++ setup_logging(apscheduler_logger_global, AmbariConfig.getAlertsLogFile(), logging_level) + Logger.initialize_logger('resource_management', logging_level=logging_level) + #with Environment() as env: + # File("/abc") +@@ -414,7 +413,7 @@ + try: + locale.setlocale(locale.LC_ALL, '') + except locale.Error as ex: +- logger.warning("Cannot set locale for ambari-agent. Please check your systemwide locale settings. Failed due to: {0}.".format(str(ex))) ++ logger.warning("Cannot set locale for ambari-agent. Please check your systemwide locale settings. Failed due to: {}.".format(str(ex))) + + default_cfg = {'agent': {'prefix': '/home/ambari'}} + config.load(default_cfg) +@@ -479,7 +478,7 @@ + try: + server_ip = socket.gethostbyname(server_hostname) + logger.info('Connecting to Ambari server at %s (%s)', server_url, server_ip) +- except socket.error: ++ except OSError: + logger.warn("Unable to determine the IP address of the Ambari server '%s'", server_hostname) + + # Wait until MAX_RETRIES to see if server is reachable +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/models/commands.py apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/models/commands.py +--- ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/models/commands.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/models/commands.py 2022-07-11 00:52:30.000000000 +0800 +@@ -17,7 +17,7 @@ + """ + + +-class AgentCommand(object): ++class AgentCommand: + status = "STATUS_COMMAND" + get_version = "GET_VERSION" + execution = "EXECUTION_COMMAND" +@@ -28,20 +28,20 @@ + EXECUTION_COMMAND_GROUP = [execution, background_execution] + + +-class RoleCommand(object): ++class RoleCommand: + install = 'INSTALL' + start = 'START' + stop = 'STOP' + custom_command = 'CUSTOM_COMMAND' + + +-class CustomCommand(object): ++class CustomCommand: + restart = 'RESTART' + reconfigure = 'RECONFIGURE' + start = RoleCommand.start + + +-class CommandStatus(object): ++class CommandStatus: + in_progress = 'IN_PROGRESS' + completed = 'COMPLETED' + failed = 'FAILED' +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/models/hooks.py apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/models/hooks.py +--- ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/models/hooks.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/models/hooks.py 2022-07-11 00:52:30.000000000 +0800 +@@ -17,6 +17,6 @@ + """ + + +-class HookPrefix(object): ++class HookPrefix: + pre = "before" + post = "after" +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/NetUtil.py apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/NetUtil.py +--- ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/NetUtil.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/NetUtil.py 2022-07-11 00:52:30.000000000 +0800 +@@ -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 @@ + + # 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 @@ + 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 + +@@ -111,7 +111,7 @@ + break + else: + if logger is not None: +- logger.warn('Server at {0} is not reachable, sleeping for {1} seconds...'.format(server_url, ++ logger.warn('Server at {} is not reachable, sleeping for {} seconds...'.format(server_url, + self.connect_retry_delay)) + retries += 1 + +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/PingPortListener.py apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/PingPortListener.py +--- ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/PingPortListener.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/PingPortListener.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/PythonExecutor.py apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/PythonExecutor.py +--- ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/PythonExecutor.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/PythonExecutor.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + """ + Licensed to the Apache Software Foundation (ASF) under one +@@ -29,11 +29,11 @@ + from ambari_commons import subprocess32 + from ambari_commons import shell + +-from Grep import Grep +-from BackgroundCommandExecutionHandle import BackgroundCommandExecutionHandle ++from .Grep import Grep ++from .BackgroundCommandExecutionHandle import BackgroundCommandExecutionHandle + + +-class PythonExecutor(object): ++class PythonExecutor: + """ + Performs functionality for executing python scripts. + Warning: class maintains internal state. As a result, instances should not be +@@ -149,7 +149,7 @@ + if self.python_process_has_been_killed: + error = "{error}\nPython script has been killed due to timeout{timeout_details}".format( + error=error, +- timeout_details="" if not timeout else " after waiting {} secs".format(timeout) ++ timeout_details="" if not timeout else f" after waiting {timeout} secs" + ) + returncode = 999 + result = self.condense_output(out, error, returncode, structured_out) +@@ -157,17 +157,17 @@ + return result + + def read_result_from_files(self, out_path, err_path, structured_out_path): +- out = open(out_path, 'r').read() +- error = open(err_path, 'r').read() ++ out = open(out_path).read() ++ error = open(err_path).read() + try: +- with open(structured_out_path, 'r') as fp: ++ with open(structured_out_path) as fp: + structured_out = json.load(fp) + except (TypeError, ValueError): + structured_out = { + "msg": "Unable to read structured output from " + structured_out_path + } + self.logger.warn(structured_out) +- except (OSError, IOError): ++ except OSError: + structured_out = {} + return out, error, structured_out + +@@ -202,6 +202,6 @@ + def python_watchdog_func(self, process, timeout): + self.event.wait(timeout) + if process.returncode is None: +- self.logger.error("Executed command with pid {} timed out and will be killed".format(process.pid)) ++ self.logger.error(f"Executed command with pid {process.pid} timed out and will be killed") + shell.kill_process_with_children(process.pid) + self.python_process_has_been_killed = True +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/PythonReflectiveExecutor.py apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/PythonReflectiveExecutor.py +--- ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/PythonReflectiveExecutor.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/PythonReflectiveExecutor.py 2022-07-11 00:52:30.000000000 +0800 +@@ -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 PythonExecutor import PythonExecutor ++from .PythonExecutor import PythonExecutor + from resource_management.core.exceptions import ClientComponentHasNoStatus, ComponentIsNotRunning + + import imp +@@ -39,7 +39,7 @@ + """ + + def __init__(self, tmp_dir, config): +- super(PythonReflectiveExecutor, self).__init__(tmp_dir, config) ++ super().__init__(tmp_dir, config) + + def run_file(self, script, script_params, tmp_out_file, tmp_err_file, + timeout, tmp_structed_outfile, callback, task_id, +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/RecoveryManager.py apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/RecoveryManager.py +--- ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/RecoveryManager.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/RecoveryManager.py 2022-07-11 00:52:30.000000000 +0800 +@@ -248,7 +248,7 @@ + report["componentReports"] = recovery_states + self.__status_lock.acquire() + try: +- for component in self.actions.keys(): ++ for component in list(self.actions.keys()): + action = self.actions[component] + recovery_state = { + "name": component, +@@ -281,7 +281,7 @@ + return [] + + commands = [] +- for component in self.statuses.keys(): ++ for component in list(self.statuses.keys()): + if self.configured_for_recovery(component) and self.requires_recovery(component) and self.may_execute(component): + status = copy.deepcopy(self.statuses[component]) + command = None +@@ -453,7 +453,7 @@ + if seconds_since_last_attempt > self.retry_gap_in_sec: + return True + else: +- logger.info("Not running recovery command due to retry_gap = {0} (seconds)".format(self.retry_gap_in_sec)) ++ logger.info(f"Not running recovery command due to retry_gap = {self.retry_gap_in_sec} (seconds)") + else: + sec_since_last_reset = now - action_counter["lastReset"] + if sec_since_last_reset > self.window_in_sec: +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/Register.py apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/Register.py +--- ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/Register.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/Register.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/RemoteDebugUtils.py apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/RemoteDebugUtils.py +--- ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/RemoteDebugUtils.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/RemoteDebugUtils.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +@@ -21,16 +21,16 @@ + 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(): ++ for threadId, stack in list(sys._current_frames().items()): + code.append("\n# ThreadID: %s" % threadId) + for filename, lineno, name, line in traceback.extract_stack(stack): + code.append('File: "%s", line %d, in %s' % (filename, +@@ -39,15 +39,15 @@ + 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): ++class NamedPipe: ++ 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.""" +@@ -60,11 +60,11 @@ + # NOTE: The order the ends are opened in is important - both ends + # of pipe 1 must be opened before the second pipe can be opened. + if end: +- self.inp = open(self.out_name,'r') ++ self.inp = open(self.out_name) + self.out = open(self.in_name,'w') + else: + self.out = open(self.out_name,'w') +- self.inp = open(self.in_name,'r') ++ self.inp = open(self.in_name) + self._open = True + + def is_open(self): +@@ -72,7 +72,7 @@ + + 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 @@ + 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 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/security.py apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/security.py +--- ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/security.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/security.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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,10 +15,10 @@ + # 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 +@@ -28,7 +28,7 @@ + import ambari_simplejson as json + import pprint + import traceback +-import hostname ++from . import hostname + import platform + import ambari_stomp + import threading +@@ -58,7 +58,7 @@ + logger.info( + 'Server require two-way SSL authentication. Use it instead of one-way...') + +- logging.info("Connecting to {0}".format(self.connection_url)) ++ logging.info(f"Connecting to {self.connection_url}") + + + if not self.two_way_ssl_required: +@@ -113,7 +113,7 @@ + logger.exception("Exception during conn.disconnect()") + + if isinstance(ex, socket_error): +- logger.warn("Could not connect to {0}. {1}".format(self.connection_url, str(ex))) ++ logger.warn(f"Could not connect to {self.connection_url}. {str(ex)}") + + raise + +@@ -132,7 +132,7 @@ + presend_hook(self.correlation_id) + + logged_message = log_message_function(copy.deepcopy(message)) +- logger.info("Event to server at {0} (correlation_id={1}): {2}".format(destination, correlation_id, logged_message)) ++ logger.info(f"Event to server at {destination} (correlation_id={correlation_id}): {logged_message}") + + body = json.dumps(message) + WsConnection.send(self, destination, body, content_type=content_type, headers=headers, correlationId=correlation_id, **keyword_headers) +@@ -182,7 +182,7 @@ + traceback.format_exc()) + logger.info("Encountered communication error. Details: " + repr(ex)) + self.connected = False +- raise IOError("Error occured during connecting to the server: " + str(ex)) ++ raise OSError("Error occured during connecting to the server: " + str(ex)) + return readResponse + + +@@ -242,8 +242,8 @@ + 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 @@ + 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: +@@ -307,7 +307,7 @@ + stdout=subprocess32.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 -Naur ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/StaleAlertsMonitor.py apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/StaleAlertsMonitor.py +--- ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/StaleAlertsMonitor.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/StaleAlertsMonitor.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + if not self.alert_definitions_cache: + return [] + +- for cluster_id, command in self.alert_definitions_cache.iteritems(): ++ for cluster_id, command in list(self.alert_definitions_cache.items()): + # the cluster has not yet initialized staleAlertsAlert + if not 'staleIntervalMultiplier' in command: + continue +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/StatusCommandsExecutor.py apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/StatusCommandsExecutor.py +--- ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/StatusCommandsExecutor.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/StatusCommandsExecutor.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 Queue ++import queue + import logging + import multiprocessing + import os +@@ -31,7 +31,7 @@ + + logger = logging.getLogger(__name__) + +-class StatusCommandsExecutor(object): ++class StatusCommandsExecutor: + def put_commands(self, commands): + raise NotImplemented() + +@@ -48,7 +48,7 @@ + def __init__(self, config, actionQueue): + self.config = config + self.actionQueue = actionQueue +- self.statusCommandQueue = Queue.Queue() ++ self.statusCommandQueue = queue.Queue() + self.need_relaunch = (False, None) # tuple (bool, str|None) with flag to relaunch and reason of relaunch + + def put_commands(self, commands): +@@ -75,7 +75,7 @@ + try: + command = self.statusCommandQueue.get(False) + self.actionQueue.process_status_command_result(self.actionQueue.execute_status_command_and_security_status(command)) +- except Queue.Empty: ++ except queue.Empty: + pass + + def relaunch(self, reason=None): +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/Utils.py apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/Utils.py +--- ambari-release-2.7.6-origin/ambari-agent/src/main/python/ambari_agent/Utils.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/main/python/ambari_agent/Utils.py 2022-07-11 00:52:30.000000000 +0800 +@@ -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 @@ + class DictionaryPopTimeout(Exception): + pass + +-class Utils(object): ++class Utils: + @staticmethod + def are_dicts_equal(d1, d2, keys_to_skip=[]): + """ +@@ -87,11 +87,11 @@ + Check if d1 has all the same keys and their values as d2 + including nested dictionaries + """ +- for k in d1.keys(): ++ for k in list(d1.keys()): + 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 @@ + """ + 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 list(u.items()): + if isinstance(d, collections.Mapping): + if isinstance(v, collections.Mapping): + r = Utils.update_nested(d.get(k, {}), v) +@@ -128,7 +128,7 @@ + if isinstance(value, dict): + return ImmutableDictionary(value) + if isinstance(value, (list, tuple)): +- return tuple([Utils.make_immutable(x) for x in value]) ++ return tuple(Utils.make_immutable(x) for x in value) + + return value + +@@ -137,7 +137,7 @@ + if isinstance(param, dict): + mutable_dict = {} + +- for k, v in param.iteritems(): ++ for k, v in list(param.items()): + mutable_dict[k] = Utils.get_mutable_copy(v) + + return mutable_dict +@@ -150,7 +150,7 @@ + def read_agent_version(config): + data_dir = config.get('agent', 'prefix') + ver_file = os.path.join(data_dir, 'version') +- with open(ver_file, "r") as f: ++ with open(ver_file) as f: + version = f.read().strip() + return version + +@@ -172,10 +172,10 @@ + Recursively turn dict to ImmutableDictionary + """ + if not isinstance(dictionary, ImmutableDictionary): +- for k, v in dictionary.iteritems(): ++ for k, v in list(dictionary.items()): + dictionary[k] = Utils.make_immutable(v) + +- super(ImmutableDictionary, self).__init__(dictionary) ++ super().__init__(dictionary) + + def __getattr__(self, name): + """ +@@ -187,7 +187,7 @@ + try: + return self[name] + except KeyError: +- raise AttributeError("'%s' object has no attribute '%s'" % (self.__class__.__name__, name)) ++ raise AttributeError(f"'{self.__class__.__name__}' object has no attribute '{name}'") + + def raise_immutable_error(*args, **kwargs): + """ +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/BaseStompServerTestCase.py apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/BaseStompServerTestCase.py +--- ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/BaseStompServerTestCase.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/BaseStompServerTestCase.py 2022-07-11 00:52:30.000000000 +0800 +@@ -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 +@@ -175,9 +175,9 @@ + + def assertDictEqual(self, d1, d2): + try: +- super(BaseStompServerTestCase, self).assertDictEqual(d1, d2) ++ super().assertDictEqual(d1, d2) + except AttributeError: +- super(BaseStompServerTestCase, self).assertEqual(d1, d2) # Python 2.6 compatibility ++ super().assertEqual(d1, d2) # Python 2.6 compatibility + + + +@@ -206,7 +206,7 @@ + StompServer.server_activate(self) + + +-class TestStompClient(object): ++class TestStompClient: + """ + A stomp client for use in testing. + This client spawns a listener thread and pushes anything that comes in onto the +@@ -222,7 +222,7 @@ + @param connect: Whether to connect socket to specified addr. + @type connect: C{bool} + """ +- self.log = logging.getLogger('%s.%s' % ( ++ self.log = logging.getLogger('{}.{}'.format( + self.__module__, self.__class__.__name__)) + self.sock = None + self.addr = addr +@@ -297,7 +297,7 @@ + with self.lock: + self.correlation_id += 1 + +- logger.info("Event to server at {0} (correlation_id={1}): {2}".format(destination, self.correlation_id, message)) ++ logger.info("Event to server at {} (correlation_id={}): {}".format(destination, self.correlation_id, message)) + + body = json.dumps(message) + ambari_stomp.Connection.send(self, destination, body, content_type=content_type, headers=headers, correlationId=self.correlation_id, **keyword_headers) +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/dummy_files/test_script.py apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/dummy_files/test_script.py +--- ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/dummy_files/test_script.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/dummy_files/test_script.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +@@ -45,5 +45,5 @@ + if '{{foo-site/skip}}' in configurations: + return ('SKIPPED', ['This alert is skipped and will not be in the collector']) + +- label = "bar is {0}, baz is {1}".format(bar, baz) ++ label = "bar is {}, baz is {}".format(bar, baz) + return ('WARNING', [label]) +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/examples/ControllerTester.py apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/examples/ControllerTester.py +--- ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/examples/ControllerTester.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/examples/ControllerTester.py 2022-07-11 00:52:30.000000000 +0800 +@@ -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 mock.mock import patch, MagicMock, call ++from urllib.request import Request, urlopen ++from urllib.error import URLError ++from unittest.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 +@@ -96,7 +97,7 @@ + """ + ] + +-class Int(object): ++class Int: + def __init__(self, value): + self.value = value + +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/examples/debug_testcase_example.py apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/examples/debug_testcase_example.py +--- ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/examples/debug_testcase_example.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/examples/debug_testcase_example.py 2022-07-11 00:52:30.000000000 +0800 +@@ -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 -Naur ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/TestActionQueue.py apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/TestActionQueue.py +--- ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/TestActionQueue.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/TestActionQueue.py 2022-07-11 00:52:30.000000000 +0800 +@@ -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 +@@ -30,7 +30,7 @@ + import signal + + from ambari_agent.models.commands import CommandStatus, AgentCommand +-from mock.mock import patch, MagicMock, call ++from unittest.mock import patch, MagicMock, call + from ambari_agent.CustomServiceOrchestrator import CustomServiceOrchestrator + from ambari_agent.PythonExecutor import PythonExecutor + from ambari_agent.ActualConfigHandler import ActualConfigHandler +@@ -59,12 +59,12 @@ + + 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 @@ + + 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 @@ + + 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 @@ + + 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 @@ + + 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 @@ + + 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 @@ + + 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 @@ + 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 @@ + + 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 @@ + '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 @@ + '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} +@@ -628,13 +628,13 @@ + if len(reports) != 0: + break + expected = {'status': 'IN_PROGRESS', +- 'stderr': 'Read from {0}'.format(os.path.join(tempdir, "errors-3.txt")), +- '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")), ++ 'stderr': 'Read from {}'.format(os.path.join(tempdir, "errors-3.txt")), ++ 'stdout': 'Read from {}'.format(os.path.join(tempdir, "output-3.txt")), ++ 'structuredOut' : 'Read from {}'.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 @@ + '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 @@ + '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 @@ + '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 @@ + '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 @@ + '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 @@ + '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 @@ + + 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': {}, +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/TestActualConfigHandler.py apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/TestActualConfigHandler.py +--- ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/TestActualConfigHandler.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/TestActualConfigHandler.py 2022-07-11 00:52:30.000000000 +0800 +@@ -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 + import os + import logging +-from mock.mock import patch, MagicMock, call ++from unittest.mock import patch, MagicMock, call + from ambari_agent.LiveStatus import LiveStatus + from ambari_commons import OSCheck + from only_for_platform import os_distro_value +@@ -144,7 +144,7 @@ + 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 @@ + 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 @@ + 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 @@ + 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 @@ + 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 @@ + 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 @@ + + 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 -Naur ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/TestAgentActions.py apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/TestAgentActions.py +--- ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/TestAgentActions.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/TestAgentActions.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/TestAgentStompResponses.py apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/TestAgentStompResponses.py +--- ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/TestAgentStompResponses.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/TestAgentStompResponses.py 2022-07-11 00:52:30.000000000 +0800 +@@ -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 @@ + from ambari_agent.CustomServiceOrchestrator import CustomServiceOrchestrator + from ambari_agent.Utils import Utils + +-from mock.mock import MagicMock, patch ++from unittest.mock import MagicMock, patch + + @patch("socket.gethostbyname", new=MagicMock(return_value="192.168.64.101")) + @patch("ambari_agent.hostname.hostname", new=MagicMock(return_value="c6401.ambari.apache.org")) +@@ -52,13 +52,13 @@ + with open("/tmp/ambari-agent/version", "w") as fp: + fp.write("2.5.0.0") + +- return super(TestAgentStompResponses, self).setUp() ++ return super().setUp() + + def tearDown(self): + if self.initializer_module: + self.initializer_module.stop_event.set() + +- return super(TestAgentStompResponses, self).tearDown() ++ return super().tearDown() + + @patch.object(CustomServiceOrchestrator, "runCommand") + def test_mock_server_can_start(self, runCommand_mock): +@@ -149,16 +149,16 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/TestAlertCollector.py apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/TestAlertCollector.py +--- ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/TestAlertCollector.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/TestAlertCollector.py 2022-07-11 00:52:30.000000000 +0800 +@@ -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 ambari_agent.alerts.collector import AlertCollector + +-from mock.mock import patch ++from unittest.mock import patch + from unittest import TestCase + + class TestAlertCollector(TestCase): +@@ -37,7 +37,7 @@ + } + 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 @@ + } + 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 @@ + } + 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 @@ + } + 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 @@ + } + 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 @@ + } + 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 @@ + } + 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 @@ + } + 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 @@ + } + 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(), [alert1, alert2, alert3, alert4].sort()) + + + +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/TestAlertSchedulerHandler.py apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/TestAlertSchedulerHandler.py +--- ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/TestAlertSchedulerHandler.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/TestAlertSchedulerHandler.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +@@ -31,7 +31,7 @@ + + from AmbariConfig import AmbariConfig + +-from mock.mock import Mock, MagicMock, patch ++from unittest.mock import Mock, MagicMock, patch + from unittest import TestCase + + TEST_PATH = os.path.join('ambari_agent', 'dummy_files') +@@ -83,8 +83,8 @@ + + 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 @@ + + 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 @@ + + 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 @@ + + 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 @@ + + definitions = scheduler._AlertSchedulerHandler__load_definitions() + +- self.assertEquals(definitions, []) ++ self.assertEqual(definitions, []) + + def __test_start(self): + execution_commands = [ +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/TestAlerts.py apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/TestAlerts.py +--- ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/TestAlerts.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/TestAlerts.py 2022-07-11 00:52:30.000000000 +0800 +@@ -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 +@@ -40,7 +40,7 @@ + from ambari_commons.urllib_handlers import RefreshHeaderProcessor + + from collections import namedtuple +-from mock.mock import MagicMock, patch ++from unittest.mock import MagicMock, patch + from unittest import TestCase + + from AmbariConfig import AmbariConfig +@@ -117,13 +117,13 @@ + 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 @@ + } + 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 @@ + } + 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 @@ + + 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 @@ + # 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 @@ + 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 @@ + 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 @@ + 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 @@ + + 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 @@ + + 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 @@ + + 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 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 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 MB.', alerts[0]['text']) + + @patch.object(ConfigurationBuilder, "get_configuration") + @patch.object(MetricAlert, "_load_jmx") +@@ -466,7 +466,7 @@ + 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 @@ + 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 @@ + 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 @@ + 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 @@ + 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() +@@ -576,10 +576,10 @@ + 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") +@@ -590,10 +590,10 @@ + 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') +@@ -605,11 +605,11 @@ + 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', +@@ -628,11 +628,11 @@ + 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)) +@@ -644,10 +644,10 @@ + 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') +@@ -676,9 +676,9 @@ + + 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): +@@ -698,18 +698,18 @@ + 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): +@@ -745,28 +745,28 @@ + 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') +@@ -795,8 +795,8 @@ + + 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", +@@ -806,7 +806,7 @@ + + # 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): +@@ -834,49 +834,49 @@ + + 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") +@@ -908,10 +908,10 @@ + 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 +@@ -926,10 +926,10 @@ + 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") +@@ -1108,7 +1108,7 @@ + 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) +@@ -1147,7 +1147,7 @@ + + + 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" +@@ -1227,13 +1227,13 @@ + # 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): +@@ -1267,21 +1267,21 @@ + 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") +@@ -1306,9 +1306,9 @@ + + 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']) + + + +@@ -1341,16 +1341,16 @@ + # 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']) + + +@@ -1383,16 +1383,16 @@ + # 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): +@@ -1764,7 +1764,7 @@ + Mock class for testing + """ + def __init__(self): +- super(MockAlert, self).__init__(None, None, AmbariConfig()) ++ super().__init__(None, None, AmbariConfig()) + + def get_name(self): + return "mock_alert" +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/TestAmbariAgent.py apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/TestAmbariAgent.py +--- ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/TestAmbariAgent.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/TestAmbariAgent.py 2022-07-11 00:52:30.000000000 +0800 +@@ -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 os + import sys + import AmbariConfig +-from mock.mock import MagicMock, patch, ANY ++from unittest.mock import MagicMock, patch, ANY + with patch("platform.linux_distribution", return_value = ('Suse','11','Final')): + from ambari_agent.Controller import AGENT_AUTO_RESTART_EXIT_CODE + from ambari_agent import AmbariAgent +@@ -42,7 +42,7 @@ + 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() +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/TestAmbariConfig.py apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/TestAmbariConfig.py +--- ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/TestAmbariConfig.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/TestAmbariConfig.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/TestAmsAlert.py apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/TestAmsAlert.py +--- ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/TestAmsAlert.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/TestAmsAlert.py 2022-07-11 00:52:30.000000000 +0800 +@@ -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.ams_alert import AmsAlert +-from mock.mock import Mock, MagicMock, patch ++from unittest.mock import Mock, MagicMock, patch + from AmbariConfig import AmbariConfig + + class TestAmsAlert(TestCase): +@@ -73,15 +73,15 @@ + 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() +@@ -146,10 +146,10 @@ + expected_text = 'Warn: 4' + + 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() +@@ -214,10 +214,10 @@ + expected_text = 'Crit: 10' + + 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 -Naur ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/TestBaseAlert.py apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/TestBaseAlert.py +--- ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/TestBaseAlert.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/TestBaseAlert.py 2022-07-11 00:52:30.000000000 +0800 +@@ -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 @@ + + 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 @@ + + 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 @@ + + 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 @@ + + 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 @@ + + 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 @@ + + 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 @@ + + 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 -Naur ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/TestCertGeneration.py apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/TestCertGeneration.py +--- ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/TestCertGeneration.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/TestCertGeneration.py 2022-07-11 00:52:30.000000000 +0800 +@@ -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 @@ + + from ambari_agent.security import CertificateManager + from ambari_agent import AmbariConfig +-from mock.mock import patch, MagicMock ++from unittest.mock import patch, MagicMock + from ambari_commons import OSCheck + from only_for_platform import os_distro_value + +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/TestCheckWebUI.py apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/TestCheckWebUI.py +--- ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/TestCheckWebUI.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/TestCheckWebUI.py 2022-07-11 00:52:30.000000000 +0800 +@@ -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 unittest +-import StringIO ++import io + import sys + + from mock.mock import MagicMock, patch +@@ -32,7 +32,7 @@ + + def setUp(self): + # disable stdout +- out = StringIO.StringIO() ++ out = io.StringIO() + sys.stdout = out + + +@@ -67,7 +67,7 @@ + + try: + checkWebUI.main() +- except SystemExit, e: ++ except SystemExit as e: + self.assertEqual(e.code, 1) + + self.assertTrue(http_conn.request.called) +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/TestClusterConfigurationCache.py apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/TestClusterConfigurationCache.py +--- ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/TestClusterConfigurationCache.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/TestClusterConfigurationCache.py 2022-07-11 00:52:30.000000000 +0800 +@@ -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 ambari_agent.ClusterConfigurationCache import ClusterConfigurationCache + +-from mock.mock import MagicMock, patch, mock_open, ANY ++from unittest.mock import MagicMock, patch, mock_open, ANY + from unittest import TestCase + + class TestClusterConfigurationCache:#(TestCase): +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/TestCommandHooksOrchestrator.py apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/TestCommandHooksOrchestrator.py +--- ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/TestCommandHooksOrchestrator.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/TestCommandHooksOrchestrator.py 2022-07-11 00:52:30.000000000 +0800 +@@ -20,7 +20,7 @@ + from unittest import TestCase + + from ambari_agent.models.hooks import HookPrefix +-from mock.mock import patch ++from unittest.mock import patch + from ambari_agent.CommandHooksOrchestrator import HookSequenceBuilder, ResolvedHooks, HooksOrchestrator + + +@@ -48,8 +48,8 @@ + }, "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,17 +68,15 @@ + "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(): +- for i in range(1, 5): +- yield i ++ yield from list(range(1, 5)) + + def post(): +- for i in range(1, 3): +- yield i ++ yield from list(range(1, 3)) + + ret = ResolvedHooks(pre(), post()) + +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/TestCommandStatusDict.py apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/TestCommandStatusDict.py +--- ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/TestCommandStatusDict.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/TestCommandStatusDict.py 2022-07-11 00:52:30.000000000 +0800 +@@ -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 os + import logging + import json, pprint +-from mock.mock import patch, MagicMock, call ++from unittest.mock import patch, MagicMock, call + + class TestCommandStatusDict:#(TestCase): + +@@ -33,11 +33,11 @@ + 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 @@ + 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 @@ + 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 @@ + } + 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 @@ + } + 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,24 +128,24 @@ + '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") + def test_structured_output(self, open_mock): +@@ -158,11 +158,11 @@ + 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 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/TestConfigurationBuilder.py apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/TestConfigurationBuilder.py +--- ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/TestConfigurationBuilder.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/TestConfigurationBuilder.py 2022-07-11 00:52:30.000000000 +0800 +@@ -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 mock.mock import MagicMock, patch ++from unittest.mock import MagicMock, patch + from unittest import TestCase + + from ambari_agent.ConfigurationBuilder import ConfigurationBuilder +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/TestController.py apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/TestController.py +--- ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/TestController.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/TestController.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,5 +1,4 @@ +-#!/usr/bin/env python +-# -*- coding: utf-8 -*- ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +@@ -19,7 +18,7 @@ + limitations under the License. + ''' + +-import StringIO ++import io + import os + import ssl + import tempfile +@@ -94,7 +93,7 @@ + def test_registerWithServer(self, LiveStatus_mock, randintMock, pformatMock, sleepMock, + dumpsMock): + +- out = StringIO.StringIO() ++ out = io.StringIO() + sys.stdout = out + + LiveStatus_mock.SERVICES = ["foo"] +@@ -109,7 +108,7 @@ + dumpsMock.return_value = '{"valid_object": true}' + self.controller.sendRequest.return_value = {"log":"Error text", "exitstatus":"1"} + +- self.assertEqual({u'exitstatus': u'1', u'log': u'Error text'}, self.controller.registerWithServer()) ++ self.assertEqual({'exitstatus': '1', 'log': 'Error text'}, self.controller.registerWithServer()) + self.assertEqual(LiveStatus_mock.SERVICES, []) + self.assertEqual(LiveStatus_mock.CLIENT_COMPONENTS, []) + self.assertEqual(LiveStatus_mock.COMPONENTS, []) +@@ -402,8 +401,8 @@ + try: + self.controller.sendRequest(url, data) + self.fail("Should throw exception!") +- except IOError, e: # Expected +- self.assertEquals('Response parsing failed! Request data: ' + data + ++ except IOError as e: # Expected ++ self.assertEqual('Response parsing failed! Request data: ' + data + + '; Response: {invalid_object}', str(e)) + + exceptionMessage = "Connection Refused" +@@ -411,31 +410,31 @@ + try: + self.controller.sendRequest(url, data) + self.fail("Should throw exception!") +- except IOError, e: # Expected +- self.assertEquals('Request to ' + url + ' failed due to ' + ++ except IOError as e: # Expected ++ self.assertEqual('Request to ' + url + ' failed due to ' + + exceptionMessage, str(e)) + + + def test_getVersion(self): + self.controller.version = "1.2.3.4_MyAgent" + version = self.controller.get_version() +- self.assertEquals('1.2.3.4', version) ++ self.assertEqual('1.2.3.4', version) + self.controller.version = "1.2.3-MyAgent" + version = self.controller.get_version() +- self.assertEquals('1.2.3', version) ++ self.assertEqual('1.2.3', version) + self.controller.version = "11.2.3-MyAgent" + version = self.controller.get_version() +- self.assertEquals('11.2.3', version) ++ self.assertEqual('11.2.3', version) + self.controller.version = "11.2.13.10_MyAgent" + version = self.controller.get_version() +- self.assertEquals('11.2.13.10', version) ++ self.assertEqual('11.2.13.10', version) + + @patch.object(ExitHelper, "exit") + @patch.object(threading._Event, "wait") + @patch("time.sleep") + @patch("ambari_simplejson.dumps") + def test_heartbeatWithServer(self, dumpsMock, sleepMock, event_mock, exit_mock): +- out = StringIO.StringIO() ++ out = io.StringIO() + sys.stdout = out + + hearbeat = MagicMock() +@@ -628,18 +627,18 @@ + "JOBTRACKER":"MASTER","TASKTRACKER":"SLAVE"}}} + self.controller.updateComponents("dummy_cluster_name") + sendRequest.assert_called_with('foo_url/dummy_cluster_name', None) +- services_expected = [u'MAPREDUCE', u'PIG'] ++ services_expected = ['MAPREDUCE', 'PIG'] + client_components_expected = [ +- {'serviceName':u'MAPREDUCE','componentName':u'MAPREDUCE_CLIENT'}, +- {'serviceName':u'PIG','componentName':u'PIG'} ++ {'serviceName':'MAPREDUCE','componentName':'MAPREDUCE_CLIENT'}, ++ {'serviceName':'PIG','componentName':'PIG'} + ] + components_expected = [ +- {'serviceName':u'MAPREDUCE','componentName':u'TASKTRACKER'}, +- {'serviceName':u'MAPREDUCE','componentName':u'JOBTRACKER'} ++ {'serviceName':'MAPREDUCE','componentName':'TASKTRACKER'}, ++ {'serviceName':'MAPREDUCE','componentName':'JOBTRACKER'} + ] +- self.assertEquals(LiveStatus_mock.SERVICES, services_expected) +- self.assertEquals(LiveStatus_mock.CLIENT_COMPONENTS, client_components_expected) +- self.assertEquals(LiveStatus_mock.COMPONENTS, components_expected) ++ self.assertEqual(LiveStatus_mock.SERVICES, services_expected) ++ self.assertEqual(LiveStatus_mock.CLIENT_COMPONENTS, client_components_expected) ++ self.assertEqual(LiveStatus_mock.COMPONENTS, components_expected) + + @patch("socket.gethostbyname") + @patch("ambari_simplejson.dumps") +@@ -649,13 +648,13 @@ + @patch.object(Controller, "LiveStatus") + def test_recoveryRegConfig(self, LiveStatus_mock, randintMock, pformatMock, sleepMock, + dumpsMock, socketGhbnMock): +- self.assertEquals(self.controller.recovery_manager.recovery_enabled, False) +- self.assertEquals(self.controller.recovery_manager.auto_start_only, False) +- self.assertEquals(self.controller.recovery_manager.max_count, 6) +- self.assertEquals(self.controller.recovery_manager.window_in_min, 60) +- self.assertEquals(self.controller.recovery_manager.retry_gap, 5) ++ self.assertEqual(self.controller.recovery_manager.recovery_enabled, False) ++ self.assertEqual(self.controller.recovery_manager.auto_start_only, False) ++ self.assertEqual(self.controller.recovery_manager.max_count, 6) ++ self.assertEqual(self.controller.recovery_manager.window_in_min, 60) ++ self.assertEqual(self.controller.recovery_manager.retry_gap, 5) + +- out = StringIO.StringIO() ++ out = io.StringIO() + sys.stdout = out + + +@@ -681,12 +680,12 @@ + self.controller.isRegistered = False + self.controller.registerWithServer() + +- self.assertEquals(self.controller.recovery_manager.recovery_enabled, True) +- self.assertEquals(self.controller.recovery_manager.auto_start_only, False) +- self.assertEquals(self.controller.recovery_manager.max_count, 5) +- self.assertEquals(self.controller.recovery_manager.window_in_min, 50) +- self.assertEquals(self.controller.recovery_manager.retry_gap, 3) +- self.assertEquals(self.controller.recovery_manager.max_lifetime_count, 7) ++ self.assertEqual(self.controller.recovery_manager.recovery_enabled, True) ++ self.assertEqual(self.controller.recovery_manager.auto_start_only, False) ++ self.assertEqual(self.controller.recovery_manager.max_count, 5) ++ self.assertEqual(self.controller.recovery_manager.window_in_min, 50) ++ self.assertEqual(self.controller.recovery_manager.retry_gap, 3) ++ self.assertEqual(self.controller.recovery_manager.max_lifetime_count, 7) + + sys.stdout = sys.__stdout__ + +@@ -700,7 +699,7 @@ + @patch("ambari_simplejson.dumps") + def test_recoveryHbCmd(self, dumpsMock, sleepMock, event_mock, exit_mock): + +- out = StringIO.StringIO() ++ out = io.StringIO() + sys.stdout = out + + hearbeat = MagicMock() +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/TestCustomServiceOrchestrator.py apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/TestCustomServiceOrchestrator.py +--- ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/TestCustomServiceOrchestrator.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/TestCustomServiceOrchestrator.py 2022-07-11 00:52:30.000000000 +0800 +@@ -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 @@ + + 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 @@ + 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 @@ + 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 @@ + 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 @@ + 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 @@ + 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 @@ + complete_done.notifyAll() + + with lock: +- self.assertTrue(complete_was_called.has_key('visited')) ++ self.assertTrue('visited' in complete_was_called) + + time.sleep(.1) + +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/TestDataCleaner.py apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/TestDataCleaner.py +--- ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/TestDataCleaner.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/TestDataCleaner.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,5 +1,4 @@ +-#!/usr/bin/env python +-# -*- coding: utf-8 -*- ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +@@ -20,7 +19,7 @@ + ''' + + import unittest +-from mock.mock import patch, MagicMock, call, Mock ++from unittest.mock import patch, MagicMock, call, Mock + from ambari_agent import DataCleaner + from ambari_agent import AmbariConfig + import os +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/TestFileCache.py apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/TestFileCache.py +--- ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/TestFileCache.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/TestFileCache.py 2022-07-11 00:52:30.000000000 +0800 +@@ -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 +@@ -30,8 +30,8 @@ + + from ambari_agent.FileCache import FileCache, CachingException + from ambari_agent.AmbariConfig import AmbariConfig +-from mock.mock import MagicMock, patch +-import StringIO ++from unittest.mock import MagicMock, patch ++import io + import sys + import shutil + +@@ -40,11 +40,11 @@ + + 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 @@ + } + } + 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" ++ "{},\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 @@ + 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 @@ + '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 @@ + } + + 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 @@ + 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 @@ + "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 @@ + "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 @@ + "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 @@ + 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 @@ + 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 @@ + 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 + + +@@ -308,14 +308,14 @@ + remote_url = "http://dummy-url/" + # Test normal download + test_str = 'abc' * 100000 # Very long string +- test_string_io = StringIO.StringIO(test_str) ++ test_string_io = io.StringIO(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,7 +324,7 @@ + self.fail('CachingException not thrown') + except CachingException: + pass # Expected +- except Exception, e: ++ except Exception as e: + self.fail('Unexpected exception thrown:' + str(e)) + + +@@ -334,11 +334,11 @@ + 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: + open_mock.side_effect = self.exc_side_effect +@@ -347,7 +347,7 @@ + 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 @@ + 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 @@ + 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 @@ + self.fail('CachingException not thrown') + except CachingException: + pass # Expected +- except Exception, e: ++ except Exception as e: + self.fail('Unexpected exception thrown:' + str(e)) + + +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/TestGrep.py apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/TestGrep.py +--- ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/TestGrep.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/TestGrep.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +@@ -32,14 +32,14 @@ + grep = Grep() + + def setUp(self): +- self.string_good = open('ambari_agent' + os.sep + 'dummy_puppet_output_good.txt', 'r').read().replace("\n", os.linesep) +- self.string_bad = open('ambari_agent' + os.sep + 'dummy_puppet_output_error.txt', 'r').read().replace("\n", os.linesep) ++ self.string_good = open('ambari_agent' + os.sep + 'dummy_puppet_output_good.txt').read().replace("\n", os.linesep) ++ self.string_bad = open('ambari_agent' + os.sep + 'dummy_puppet_output_error.txt').read().replace("\n", os.linesep) + pass + + 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 @@ + 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 @@ + 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 @@ + 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 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/TestHardware.py apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/TestHardware.py +--- ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/TestHardware.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/TestHardware.py 2022-07-11 00:52:30.000000000 +0800 +@@ -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 ambari_agent import main + main.MEMORY_LEAK_DEBUG_FILEPATH = "/tmp/memory_leak_debug.out" + from unittest import TestCase +-from mock.mock import patch, MagicMock, Mock ++from unittest.mock import patch, MagicMock, Mock + import unittest + import platform + import socket +@@ -113,12 +113,12 @@ + + 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 @@ + 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") +@@ -189,7 +189,7 @@ + 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 @@ + + 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: '{}', expected: {}, got: {}".format( + sample["sample"], + sample["expected"], + result +@@ -230,9 +230,9 @@ + 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 @@ + 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 @@ + 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.04 GB') ++ self.assertEqual(result['swapfree'], '1.52 GB') + + @patch("fcntl.ioctl") + @patch("socket.socket") +@@ -303,9 +303,9 @@ + 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') + + @patch("fcntl.ioctl") + @patch("socket.socket") +@@ -328,7 +328,7 @@ + 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,23 +341,23 @@ + + 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") +@@ -400,10 +400,10 @@ + 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,12 +460,12 @@ + + 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'))) +@@ -504,9 +504,9 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/TestHeartbeat.py apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/TestHeartbeat.py +--- ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/TestHeartbeat.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/TestHeartbeat.py 2022-07-11 00:52:30.000000000 +0800 +@@ -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 + import tempfile + from mock.mock import patch, MagicMock, call +-import StringIO ++import io + import sys + import multiprocessing + from ambari_agent.RecoveryManager import RecoveryManager +@@ -43,7 +43,7 @@ + + def setUp(self): + # disable stdout +- out = StringIO.StringIO() ++ out = io.StringIO() + sys.stdout = out + + +@@ -62,19 +62,19 @@ + actionQueue = ActionQueue(config, dummy_controller) + heartbeat = Heartbeat(actionQueue) + result = heartbeat.build(100) +- print "Heartbeat: " + str(result) +- self.assertEquals(result['hostname'] != '', True, "hostname should not be empty") +- self.assertEquals(result['responseId'], 100) +- self.assertEquals(result['componentStatus'] is not None, True, "Heartbeat should contain componentStatus") +- self.assertEquals(result['reports'] is not None, True, "Heartbeat should contain reports") +- self.assertEquals(result['timestamp'] >= 1353679373880L, True) +- self.assertEquals(result['recoveryTimestamp'], -1) +- self.assertEquals(len(result['nodeStatus']), 2) +- self.assertEquals(result['nodeStatus']['cause'], "NONE") +- self.assertEquals(result['nodeStatus']['status'], "HEALTHY") ++ print("Heartbeat: " + str(result)) ++ self.assertEqual(result['hostname'] != '', True, "hostname should not be empty") ++ self.assertEqual(result['responseId'], 100) ++ self.assertEqual(result['componentStatus'] is not None, True, "Heartbeat should contain componentStatus") ++ self.assertEqual(result['reports'] is not None, True, "Heartbeat should contain reports") ++ self.assertEqual(result['timestamp'] >= 1353679373880, True) ++ self.assertEqual(result['recoveryTimestamp'], -1) ++ self.assertEqual(len(result['nodeStatus']), 2) ++ self.assertEqual(result['nodeStatus']['cause'], "NONE") ++ self.assertEqual(result['nodeStatus']['status'], "HEALTHY") + # result may or may NOT have an agentEnv structure in it +- self.assertEquals((len(result) is 7) or (len(result) is 8), True) +- self.assertEquals(not heartbeat.reports, True, "Heartbeat should not contain task in progress") ++ self.assertEqual((len(result) is 7) or (len(result) is 8), True) ++ self.assertEqual(not heartbeat.reports, True, "Heartbeat should not contain task in progress") + + @patch("subprocess.Popen") + @patch.object(Hardware, "_chk_writable_mount", new = MagicMock(return_value=True)) +@@ -85,10 +85,10 @@ + 'reports': [{'status': 'IN_PROGRESS', + 'stderr': 'Read from /tmp/errors-3.txt', + 'stdout': 'Read from /tmp/output-3.txt', +- 'clusterName': u'cc', +- 'roleCommand': u'INSTALL', +- 'serviceName': u'HDFS', +- 'role': u'DATANODE', ++ 'clusterName': 'cc', ++ 'roleCommand': 'INSTALL', ++ 'serviceName': 'HDFS', ++ 'role': 'DATANODE', + 'actionId': '1-1', + 'taskId': 3, + 'exitCode': 777}], +@@ -121,10 +121,10 @@ + 'reports': [{'status': 'IN_PROGRESS', + 'stderr': 'Read from /tmp/errors-3.txt', + 'stdout': 'Read from /tmp/output-3.txt', +- 'clusterName': u'cc', +- 'roleCommand': u'INSTALL', +- 'serviceName': u'HDFS', +- 'role': u'DATANODE', ++ 'clusterName': 'cc', ++ 'roleCommand': 'INSTALL', ++ 'serviceName': 'HDFS', ++ 'role': 'DATANODE', + 'actionId': '1-1', + 'taskId': 3, + 'exitCode': 777}, +@@ -143,10 +143,10 @@ + {'status': 'FAILED', + 'stderr': 'stderr', + 'stdout': 'out', +- 'clusterName': u'cc', +- 'roleCommand': u'INSTALL', +- 'serviceName': u'HDFS', +- 'role': u'DATANODE', ++ 'clusterName': 'cc', ++ 'roleCommand': 'INSTALL', ++ 'serviceName': 'HDFS', ++ 'role': 'DATANODE', + 'actionId': '1-1', + 'taskId': 3, + 'exitCode': 13}, +@@ -154,11 +154,11 @@ + {'status': 'COMPLETED', + 'stderr': 'stderr', + 'stdout': 'out', +- 'clusterName': u'cc', ++ 'clusterName': 'cc', + 'configurationTags': {'global': {'tag': 'v1'}}, +- 'roleCommand': u'INSTALL', +- 'serviceName': u'HDFS', +- 'role': u'DATANODE', ++ 'roleCommand': 'INSTALL', ++ 'serviceName': 'HDFS', ++ 'role': 'DATANODE', + 'actionId': '1-1', + 'taskId': 3, + 'exitCode': 0} +@@ -180,27 +180,27 @@ + 'recoveryTimestamp': -1, + 'timestamp': 'timestamp', 'hostname': 'hostname', + 'responseId': 10, 'reports': [ +- {'status': 'IN_PROGRESS', 'roleCommand': u'INSTALL', +- 'serviceName': u'HDFS', 'role': u'DATANODE', 'actionId': '1-1', ++ {'status': 'IN_PROGRESS', 'roleCommand': 'INSTALL', ++ 'serviceName': 'HDFS', 'role': 'DATANODE', 'actionId': '1-1', + 'stderr': 'Read from /tmp/errors-3.txt', +- 'stdout': 'Read from /tmp/output-3.txt', 'clusterName': u'cc', ++ 'stdout': 'Read from /tmp/output-3.txt', 'clusterName': 'cc', + 'taskId': 3, 'exitCode': 777}, + {'status': 'COMPLETED', 'roleCommand': 'UPGRADE', + 'serviceName': 'serviceName', 'role': 'role', 'actionId': 17, + 'stderr': 'stderr', 'stdout': 'out', 'clusterName': 'clusterName', + 'taskId': 'taskId', 'exitCode': 0}, +- {'status': 'FAILED', 'roleCommand': u'INSTALL', 'serviceName': u'HDFS', +- 'role': u'DATANODE', 'actionId': '1-1', 'stderr': 'stderr', +- 'stdout': 'out', 'clusterName': u'cc', 'taskId': 3, 'exitCode': 13}, ++ {'status': 'FAILED', 'roleCommand': 'INSTALL', 'serviceName': 'HDFS', ++ 'role': 'DATANODE', 'actionId': '1-1', 'stderr': 'stderr', ++ 'stdout': 'out', 'clusterName': 'cc', 'taskId': 3, 'exitCode': 13}, + {'status': 'COMPLETED', 'stdout': 'out', + 'configurationTags': {'global': {'tag': 'v1'}}, 'taskId': 3, +- 'exitCode': 0, 'roleCommand': u'INSTALL', 'clusterName': u'cc', +- 'serviceName': u'HDFS', 'role': u'DATANODE', 'actionId': '1-1', ++ 'exitCode': 0, 'roleCommand': 'INSTALL', 'clusterName': 'cc', ++ 'serviceName': 'HDFS', 'role': 'DATANODE', 'actionId': '1-1', + 'stderr': 'stderr'}], 'componentStatus': [ + {'status': 'HEALTHY', 'componentName': 'DATANODE'}, + {'status': 'UNHEALTHY', 'componentName': 'NAMENODE'}]} + self.assertEqual.__self__.maxDiff = None +- self.assertEquals(hb, expected) ++ self.assertEqual(hb, expected) + + @patch("subprocess.Popen") + @patch.object(Hardware, "_chk_writable_mount", new = MagicMock(return_value=True)) +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/TestHostCheckReportFileHandler.py apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/TestHostCheckReportFileHandler.py +--- ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/TestHostCheckReportFileHandler.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/TestHostCheckReportFileHandler.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +@@ -20,12 +20,12 @@ + + from unittest import TestCase + import unittest +-from mock.mock import patch ++from unittest.mock import patch + import os + import tempfile + from ambari_agent.HostCheckReportFileHandler import HostCheckReportFileHandler + import logging +-import ConfigParser ++import configparser + + class TestHostCheckReportFileHandler(TestCase): + +@@ -34,7 +34,7 @@ + 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 @@ + 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 @@ + 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 @@ + + 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 @@ + 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 @@ + ] + 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 @@ + 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 @@ + + 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 @@ + + 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 @@ + items.sort() + items1Str = ','.join(items1) + items2Str = ','.join(items) +- self.assertEquals(items2Str, items1Str) ++ self.assertEqual(items2Str, items1Str) + + if __name__ == "__main__": + unittest.main(verbosity=2) +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/TestHostCleanup.py apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/TestHostCleanup.py +--- ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/TestHostCleanup.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/TestHostCleanup.py 2022-07-11 00:52:30.000000000 +0800 +@@ -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 @@ + + from unittest import TestCase + import unittest +-from mock.mock import patch, Mock, MagicMock, call, create_autospec ++from unittest.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 @@ + HostCleanup.logger = MagicMock() + self.hostcleanup = HostCleanup.HostCleanup() + # disable stdout +- out = StringIO.StringIO() ++ out = io.StringIO() + sys.stdout = out + + +@@ -89,7 +89,7 @@ + + @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 @@ + # 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 @@ + # 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 @@ + 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 @@ + 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 @@ + 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 @@ + + @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 @@ + + 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 @@ + @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' +@@ -391,9 +391,9 @@ + + self.assertTrue(get_os_type_method.called) + self.assertTrue(run_os_command_method.called) +- run_os_command_method.assert_called_with("yum erase -y {0}".format(' ' ++ run_os_command_method.assert_called_with("yum erase -y {}".format(' ' + .join(['abcd', 'wxyz']))) +- self.assertEquals(0, retval) ++ self.assertEqual(0, retval) + + get_os_type_method.reset() + run_os_command_method.reset() +@@ -405,9 +405,9 @@ + + self.assertTrue(get_os_type_method.called) + self.assertTrue(run_os_command_method.called) +- run_os_command_method.assert_called_with("zypper -n -q remove {0}" ++ run_os_command_method.assert_called_with("zypper -n -q remove {}" + .format(' '.join(['abcd', 'wxyz']))) +- self.assertEquals(0, retval) ++ self.assertEqual(0, retval) + + sys.stdout = sys.__stdout__ + +@@ -416,7 +416,7 @@ + @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 @@ + 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 @@ + @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 -Naur ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/TestHostInfo.py apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/TestHostInfo.py +--- ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/TestHostInfo.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/TestHostInfo.py 2022-07-11 00:52:30.000000000 +0800 +@@ -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 @@ + 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 @@ + + 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 @@ + 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,11 +220,11 @@ + 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) +@@ -242,10 +242,10 @@ + 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 @@ + 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{}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 @@ + 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 @@ + 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") +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/TestHostname.py apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/TestHostname.py +--- ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/TestHostname.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/TestHostname.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +@@ -28,7 +28,7 @@ + import tempfile + import shutil + import os, pprint, json,stat +-from mock.mock import patch, MagicMock ++from unittest.mock import patch, MagicMock + from ambari_commons import OSCheck + from only_for_platform import not_for_platform, os_distro_value, PLATFORM_WINDOWS + +@@ -39,7 +39,7 @@ + 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,8 +49,8 @@ + 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, +- "expected host name ['ambari-host']; got {0}".format(server_hostnames)) ++ self.assertEqual(['ambari-host'], server_hostnames, ++ "expected host name ['ambari-host']; got {}".format(server_hostnames)) + config.set('server', 'hostname', default_server_hostname) + pass + +@@ -60,9 +60,9 @@ + 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, +- "expected host name ['ambari-host']; got {0}".format(server_hostnames)) ++ self.assertEqual(len(server_hostnames), 3) ++ self.assertEqual(['ambari-host', 'ambari-host2', 'ambari-host3'], server_hostnames, ++ "expected host name ['ambari-host']; got {}".format(server_hostnames)) + config.set('server', 'hostname', default_server_hostname) + pass + +@@ -83,7 +83,7 @@ + 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 {}".format(server_hostnames)) + finally: + os.remove(tmpname) + config.remove_option('server', 'hostname_script') +@@ -108,7 +108,7 @@ + + 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 {}; got {}".format(expected_hostnames, server_hostnames)) + finally: + os.remove(tmpname) + config.remove_option('server', 'hostname_script') +@@ -131,7 +131,7 @@ + + 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') +@@ -155,7 +155,7 @@ + + 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 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/TestLiveStatus.py apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/TestLiveStatus.py +--- ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/TestLiveStatus.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/TestLiveStatus.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +@@ -21,9 +21,9 @@ + 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 ++from unittest.mock import patch, MagicMock + import pprint + from ambari_commons import OSCheck + from only_for_platform import os_distro_value +@@ -33,7 +33,7 @@ + + def setUp(self): + # disable stdout +- out = StringIO.StringIO() ++ out = io.StringIO() + sys.stdout = out + + def tearDown(self): +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/TestMain.py apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/TestMain.py +--- ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/TestMain.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/TestMain.py 2022-07-11 00:52:30.000000000 +0800 +@@ -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,14 +25,14 @@ + import os + import socket + import tempfile +-import ConfigParser ++import configparser + import ambari_agent.hostname as hostname + import resource + + from ambari_commons import OSCheck + from ambari_commons.os_family_impl import OsFamilyFuncImpl, OsFamilyImpl + from only_for_platform import get_platform, not_for_platform, os_distro_value, PLATFORM_WINDOWS +-from mock.mock import MagicMock, patch, ANY, Mock, call ++from unittest.mock import MagicMock, patch, ANY, Mock, call + + with patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)): + from ambari_agent import NetUtil, security +@@ -50,7 +50,7 @@ + + def setUp(self): + # disable stdout +- out = StringIO.StringIO() ++ out = io.StringIO() + sys.stdout = out + + +@@ -141,7 +141,7 @@ + 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") +@@ -230,7 +230,7 @@ + + # Test daemonization + main.daemonize() +- saved = open(main.agent_pidfile, 'r').read() ++ saved = open(main.agent_pidfile).read() + self.assertEqual(pid, saved) + + main.GRACEFUL_STOP_TRIES = 1 +@@ -244,7 +244,7 @@ + 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])]) +@@ -261,7 +261,7 @@ + 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]), +@@ -405,6 +405,6 @@ + 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 +\ 文件尾没有换行符 +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/TestMetricAlert.py apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/TestMetricAlert.py +--- ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/TestMetricAlert.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/TestMetricAlert.py 2022-07-11 00:52:30.000000000 +0800 +@@ -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.metric_alert import MetricAlert +-from mock.mock import Mock, MagicMock, patch ++from unittest.mock import Mock, MagicMock, patch + from AmbariConfig import AmbariConfig + + class TestMetricAlert(TestCase): +@@ -68,15 +68,15 @@ + 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 +@@ -130,15 +130,15 @@ + 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 +@@ -194,9 +194,9 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/TestNetUtil.py apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/TestNetUtil.py +--- ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/TestNetUtil.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/TestNetUtil.py 2022-07-11 00:52:30.000000000 +0800 +@@ -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 @@ + ''' + + from ambari_agent import NetUtil +-from mock.mock import MagicMock, patch ++from unittest.mock import MagicMock, patch + import unittest + import threading + from ambari_commons import OSCheck +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/TestPingPortListener.py apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/TestPingPortListener.py +--- ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/TestPingPortListener.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/TestPingPortListener.py 2022-07-11 00:52:30.000000000 +0800 +@@ -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 unittest +-from mock.mock import patch, MagicMock, call, Mock ++from unittest.mock import patch, MagicMock, call, Mock + from ambari_agent import PingPortListener + from ambari_commons import subprocess32 + import socket +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/TestPortAlert.py apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/TestPortAlert.py +--- ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/TestPortAlert.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/TestPortAlert.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +@@ -55,11 +55,11 @@ + 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 @@ + 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 @@ + 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 @@ + 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 @@ + 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 @@ + 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 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 @@ + 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 @@ + 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 @@ + 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 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/TestPythonExecutor.py apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/TestPythonExecutor.py +--- ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/TestPythonExecutor.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/TestPythonExecutor.py 2022-07-11 00:52:30.000000000 +0800 +@@ -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.PythonExecutor import PythonExecutor + from ambari_agent.AmbariConfig import AmbariConfig +-from mock.mock import MagicMock, patch ++from unittest.mock import MagicMock, patch + from ambari_commons import OSCheck + from only_for_platform import os_distro_value + +@@ -66,7 +66,7 @@ + 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, "subprocess32 should be terminated due to timeout") + self.assertTrue(callback_method.called) + + +@@ -100,8 +100,8 @@ + 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, "subprocess32 should not be terminated before timeout") ++ self.assertEqual(subproc_mock.returncode, 0, "subprocess32 should not be terminated before timeout") + self.assertTrue(callback_method.called) + + @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) +@@ -131,7 +131,7 @@ + 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 @@ + 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 @@ + 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,9 +176,9 @@ + 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 + + +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/TestRecoveryManager.py apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/TestRecoveryManager.py +--- ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/TestRecoveryManager.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/TestRecoveryManager.py 2022-07-11 00:52:30.000000000 +0800 +@@ -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 copy + import tempfile + from ambari_agent.RecoveryManager import RecoveryManager +-from mock.mock import patch, MagicMock, call ++from unittest.mock import patch, MagicMock, call + + + class _TestRecoveryManager(TestCase): +@@ -302,21 +302,21 @@ + + 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} +@@ -327,7 +327,7 @@ + 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} +@@ -335,7 +335,7 @@ + + 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} +@@ -435,14 +435,14 @@ + + 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 -Naur ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/TestRegistration.py apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/TestRegistration.py +--- ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/TestRegistration.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/TestRegistration.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +@@ -20,8 +20,8 @@ + + from unittest import TestCase + import tempfile +-from mock.mock import patch +-from mock.mock import MagicMock ++from unittest.mock import patch ++from unittest.mock import MagicMock + from only_for_platform import not_for_platform, PLATFORM_WINDOWS + from ambari_commons.os_check import OSCheck + from ambari_agent.AmbariConfig import AmbariConfig +@@ -52,14 +52,14 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/TestScriptAlert.py apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/TestScriptAlert.py +--- ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/TestScriptAlert.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/TestScriptAlert.py 2022-07-11 00:52:30.000000000 +0800 +@@ -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.script_alert import ScriptAlert +-from mock.mock import Mock, MagicMock, patch ++from unittest.mock import Mock, MagicMock, patch + import os + + from AmbariConfig import AmbariConfig +@@ -54,9 +54,9 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/TestSecurity.py apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/TestSecurity.py +--- ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/TestSecurity.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/TestSecurity.py 2022-07-11 00:52:30.000000000 +0800 +@@ -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 +-from mock.mock import MagicMock, patch, ANY +-import mock.mock ++from unittest.mock import MagicMock, patch, ANY ++from unittest import mock + import unittest + import logging + import signal +-import ConfigParser ++import configparser + import ssl + import os + import tempfile +@@ -40,13 +40,13 @@ + from ambari_agent.Controller import Controller + from ambari_agent import security + +-aa = mock.mock.mock_open() ++aa = mock.mock_open() + 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() +@@ -115,7 +115,7 @@ + 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 + +@@ -129,7 +129,7 @@ + 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") +@@ -138,7 +138,7 @@ + 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") +@@ -147,14 +147,14 @@ + 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") +@@ -217,7 +217,7 @@ + man.loadSrvrCrt() + + # Checking file contents +- saved = open(tmpoutfile, 'r').read() ++ saved = open(tmpoutfile).read() + self.assertEqual(saved, read_mock.read.return_value) + try: + os.unlink(tmpoutfile) +@@ -277,7 +277,7 @@ + try: + man.reqSignCrt() + self.fail("Expected exception here") +- except Exception, err: ++ except Exception as err: + # expected + pass + +@@ -321,7 +321,7 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/TestShell.py apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/TestShell.py +--- ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/TestShell.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/TestShell.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,5 +1,4 @@ +-#!/usr/bin/env python +-# -*- coding: utf-8 -*- ++#!/usr/bin/env python3 + + """ + Licensed to the Apache Software Foundation (ASF) under one +@@ -20,10 +19,10 @@ + + import unittest + import signal +-from mock.mock import patch, MagicMock, call ++from unittest.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] +@@ -68,7 +67,7 @@ + shell.wait_for_process_list_kill = __wait_for_process_list_kill + + +-class FakeSignals(object): ++class FakeSignals: + SIGTERM = signal.SIG_IGN + SIGKILL = signal.SIG_IGN + +@@ -96,11 +95,11 @@ + + 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.object(OSCheck, "get_os_family", new=MagicMock(return_value="redhat")) +@@ -117,8 +116,8 @@ + + # 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,8 +127,8 @@ + + # 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.object(OSCheck, "get_os_family", new=MagicMock(return_value="redhat")) +@@ -142,5 +141,5 @@ + + # 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 -Naur ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/winpwd.py apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/winpwd.py +--- ambari-release-2.7.6-origin/ambari-agent/src/test/python/ambari_agent/winpwd.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/test/python/ambari_agent/winpwd.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/test/python/resource_management/TestContentSources.py apache-ambari-2.7.6-change/ambari-agent/src/test/python/resource_management/TestContentSources.py +--- ambari-release-2.7.6-origin/ambari-agent/src/test/python/resource_management/TestContentSources.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/test/python/resource_management/TestContentSources.py 2022-07-11 00:52:30.000000000 +0800 +@@ -17,15 +17,16 @@ + ''' + + from unittest import TestCase +-from mock.mock import patch, MagicMock ++from unittest.mock import patch, MagicMock + 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)) +@@ -229,7 +230,7 @@ + content = template.get_content() + self.assertEqual(open_mock.call_count, 1) + +- self.assertEqual(u'test template content', content) ++ self.assertEqual('test template content', content) + open_mock.assert_called_with('/absolute/path/test.j2', 'rb') + self.assertEqual(getmtime_mock.call_count, 1) + getmtime_mock.assert_called_with('/absolute/path/test.j2') +@@ -242,7 +243,7 @@ + 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): + """ +@@ -258,4 +259,4 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-agent/src/test/python/resource_management/TestDatanodeHelper.py apache-ambari-2.7.6-change/ambari-agent/src/test/python/resource_management/TestDatanodeHelper.py +--- ambari-release-2.7.6-origin/ambari-agent/src/test/python/resource_management/TestDatanodeHelper.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/test/python/resource_management/TestDatanodeHelper.py 2022-07-11 00:52:30.000000000 +0800 +@@ -43,14 +43,14 @@ + name = self.__class__.__name__ + mocks = set(dir(self)) + mocks = [x for x in mocks if not str(x).startswith("__")] # Exclude private methods +- return "".format(name, str(mocks)) ++ return "".format(name, str(mocks)) + + + 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 {}".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}}})) +@@ -66,7 +66,7 @@ + + params = StubParams() + params.data_dir_mount_file = "/var/lib/ambari-agent/data/datanode/dfs_data_dir_mount.hist" +- params.dfs_data_dir = "{0},{1},{2}".format(grid0, grid1, grid2) ++ params.dfs_data_dir = "{},{},{}".format(grid0, grid1, grid2) + params.hdfs_user = "hdfs_test" + params.user_group = "hadoop_test" + +@@ -87,15 +87,15 @@ + 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 @@ + # 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 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-agent/src/test/python/resource_management/TestDataStructureUtils.py apache-ambari-2.7.6-change/ambari-agent/src/test/python/resource_management/TestDataStructureUtils.py +--- ambari-release-2.7.6-origin/ambari-agent/src/test/python/resource_management/TestDataStructureUtils.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/test/python/resource_management/TestDataStructureUtils.py 2022-07-11 00:52:30.000000000 +0800 +@@ -28,20 +28,20 @@ + 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])) +\ 文件尾没有换行符 ++ self.assertEqual(KeyNotFound, get_from_dict(empty_dict, [1])) +\ 文件尾没有换行符 +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/test/python/resource_management/TestDirectoryResource.py apache-ambari-2.7.6-change/ambari-agent/src/test/python/resource_management/TestDirectoryResource.py +--- ambari-release-2.7.6-origin/ambari-agent/src/test/python/resource_management/TestDirectoryResource.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/test/python/resource_management/TestDirectoryResource.py 2022-07-11 00:52:30.000000000 +0800 +@@ -18,7 +18,7 @@ + from ambari_agent import main + main.MEMORY_LEAK_DEBUG_FILEPATH = "/tmp/memory_leak_debug.out" + from unittest import TestCase +-from mock.mock import patch, MagicMock ++from unittest.mock import patch, MagicMock + from only_for_platform import get_platform, not_for_platform, os_distro_value, PLATFORM_WINDOWS + + from ambari_commons.os_check import OSCheck +@@ -56,19 +56,19 @@ + 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 @@ + 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 @@ + with Environment('/') as env: + Directory('/a/b/c/d', + action='create', +- mode=0777, ++ mode=0o777, + owner="hdfs", + group="hadoop" + ) +@@ -138,7 +138,7 @@ + with Environment('/') as env: + Directory('/a/b/c/d', + action='create', +- mode=0777, ++ mode=0o777, + owner="hdfs", + group="hadoop" + ) +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/test/python/resource_management/TestExecuteHadoopResource.py apache-ambari-2.7.6-change/ambari-agent/src/test/python/resource_management/TestExecuteHadoopResource.py +--- ambari-release-2.7.6-origin/ambari-agent/src/test/python/resource_management/TestExecuteHadoopResource.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/test/python/resource_management/TestExecuteHadoopResource.py 2022-07-11 00:52:30.000000000 +0800 +@@ -19,7 +19,7 @@ + import os + + from unittest import TestCase +-from mock.mock import patch, MagicMock ++from unittest.mock import patch, MagicMock + from only_for_platform import get_platform, not_for_platform, os_distro_value, PLATFORM_WINDOWS + + from ambari_commons.os_check import OSCheck +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/test/python/resource_management/TestExecuteResource.py apache-ambari-2.7.6-change/ambari-agent/src/test/python/resource_management/TestExecuteResource.py +--- ambari-release-2.7.6-origin/ambari-agent/src/test/python/resource_management/TestExecuteResource.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/test/python/resource_management/TestExecuteResource.py 2022-07-11 00:52:30.000000000 +0800 +@@ -18,7 +18,7 @@ + from ambari_agent import main + main.MEMORY_LEAK_DEBUG_FILEPATH = "/tmp/memory_leak_debug.out" + from unittest import TestCase +-from mock.mock import patch, MagicMock, call ++from unittest.mock import patch, MagicMock, call + from only_for_platform import get_platform, not_for_platform, os_distro_value, PLATFORM_WINDOWS + + from ambari_commons.os_check import OSCheck +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/test/python/resource_management/TestFcntlBasedProcessLock.py apache-ambari-2.7.6-change/ambari-agent/src/test/python/resource_management/TestFcntlBasedProcessLock.py +--- ambari-release-2.7.6-origin/ambari-agent/src/test/python/resource_management/TestFcntlBasedProcessLock.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/test/python/resource_management/TestFcntlBasedProcessLock.py 2022-07-11 00:52:30.000000000 +0800 +@@ -56,7 +56,7 @@ + + 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 -Naur ambari-release-2.7.6-origin/ambari-agent/src/test/python/resource_management/TestFileResource.py apache-ambari-2.7.6-change/ambari-agent/src/test/python/resource_management/TestFileResource.py +--- ambari-release-2.7.6-origin/ambari-agent/src/test/python/resource_management/TestFileResource.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/test/python/resource_management/TestFileResource.py 2022-07-11 00:52:30.000000000 +0800 +@@ -18,7 +18,7 @@ + + + from unittest import TestCase +-from mock.mock import patch, MagicMock ++from unittest.mock import patch, MagicMock + from only_for_platform import get_platform, not_for_platform, os_distro_value, PLATFORM_WINDOWS + + from ambari_commons.os_check import OSCheck +@@ -52,7 +52,7 @@ + with Environment('/') as env: + File('/existent_directory', + action='create', +- mode=0777, ++ mode=0o777, + content='file-content' + ) + +@@ -75,7 +75,7 @@ + with Environment('/') as env: + File('/non_existent_directory/file', + action='create', +- mode=0777, ++ mode=0o777, + content='file-content' + ) + +@@ -100,7 +100,7 @@ + with Environment('/') as env: + File('/directory/file', + action='create', +- mode=0777, ++ mode=0o777, + content='file-content' + ) + +@@ -125,7 +125,7 @@ + with Environment('/') as env: + File('/directory/file', + action='create', +- mode=0777, ++ mode=0o777, + backup=False, + content='new-content' + ) +@@ -147,7 +147,7 @@ + with Environment('/') as env: + File('/directory/file', + action='delete', +- mode=0777, ++ mode=0o777, + backup=False, + content='new-content' + ) +@@ -172,7 +172,7 @@ + with Environment('/') as env: + File('/directory/file', + action='delete', +- mode=0777, ++ mode=0o777, + backup=False, + content='new-content' + ) +@@ -194,7 +194,7 @@ + with Environment('/') as env: + File('/existent_directory', + action='create', +- mode=0777, ++ mode=0o777, + content='file-content' + ) + +@@ -220,7 +220,7 @@ + with Environment('/') as env: + File('/directory/file', + action='create', +- mode=0777, ++ mode=0o777, + backup=False, + content='new-content' + ) +@@ -231,7 +231,7 @@ + with Environment('/') as env: + File('/directory/file', + action='create', +- mode=0777, ++ mode=0o777, + backup=True, + content='new-content' + ) +@@ -258,7 +258,7 @@ + with Environment('/') as env: + File('/directory/file', + action='create', +- mode=0777, ++ mode=0o777, + backup=False, + content='new-content', + replace=False +@@ -289,7 +289,7 @@ + + class stat(): + def __init__(self): +- self.st_mode = 0666 ++ self.st_mode = 0o666 + self.st_uid = 1 + self.st_gid = 1 + +@@ -302,7 +302,7 @@ + with Environment('/') as env: + File('/directory/file', + action='create', +- mode=0777, ++ mode=0o777, + content='file-content', + owner='root', + group='hdfs' +@@ -327,7 +327,7 @@ + with Environment('/') as env: + File('/directory/file', + action='create', +- mode=0777, ++ mode=0o777, + content='file-content', + owner='root', + group='hdfs' +@@ -354,7 +354,7 @@ + with Environment('/') as env: + File('/directory/file', + action='create', +- mode=0777, ++ mode=0o777, + content='file-content', + encoding = "UTF-8" + ) +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/test/python/resource_management/TestFileSystem.py apache-ambari-2.7.6-change/ambari-agent/src/test/python/resource_management/TestFileSystem.py +--- ambari-release-2.7.6-origin/ambari-agent/src/test/python/resource_management/TestFileSystem.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/test/python/resource_management/TestFileSystem.py 2022-07-11 00:52:30.000000000 +0800 +@@ -18,7 +18,7 @@ + + import os + from unittest import TestCase +-from mock.mock import patch ++from unittest.mock import patch + + from resource_management.libraries.functions import file_system + import resource_management.core.providers.mount +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/test/python/resource_management/TestGetPathFromUrl.py apache-ambari-2.7.6-change/ambari-agent/src/test/python/resource_management/TestGetPathFromUrl.py +--- ambari-release-2.7.6-origin/ambari-agent/src/test/python/resource_management/TestGetPathFromUrl.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/test/python/resource_management/TestGetPathFromUrl.py 2022-07-11 00:52:30.000000000 +0800 +@@ -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 -Naur ambari-release-2.7.6-origin/ambari-agent/src/test/python/resource_management/TestGroupResource.py apache-ambari-2.7.6-change/ambari-agent/src/test/python/resource_management/TestGroupResource.py +--- ambari-release-2.7.6-origin/ambari-agent/src/test/python/resource_management/TestGroupResource.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/test/python/resource_management/TestGroupResource.py 2022-07-11 00:52:30.000000000 +0800 +@@ -17,7 +17,7 @@ + ''' + + from unittest import TestCase +-from mock.mock import patch, MagicMock ++from unittest.mock import patch, MagicMock + from only_for_platform import get_platform, not_for_platform, os_distro_value, PLATFORM_WINDOWS + + from ambari_commons.os_check import OSCheck +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/test/python/resource_management/TestLinkResource.py apache-ambari-2.7.6-change/ambari-agent/src/test/python/resource_management/TestLinkResource.py +--- ambari-release-2.7.6-origin/ambari-agent/src/test/python/resource_management/TestLinkResource.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/test/python/resource_management/TestLinkResource.py 2022-07-11 00:52:30.000000000 +0800 +@@ -18,7 +18,7 @@ + from ambari_agent import main + main.MEMORY_LEAK_DEBUG_FILEPATH = "/tmp/memory_leak_debug.out" + from unittest import TestCase +-from mock.mock import patch, MagicMock ++from unittest.mock import patch, MagicMock + from only_for_platform import get_platform, not_for_platform, os_distro_value, PLATFORM_WINDOWS + + from ambari_commons.os_check import OSCheck +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/test/python/resource_management/TestListAmbariManagedRepos.py apache-ambari-2.7.6-change/ambari-agent/src/test/python/resource_management/TestListAmbariManagedRepos.py +--- ambari-release-2.7.6-origin/ambari-agent/src/test/python/resource_management/TestListAmbariManagedRepos.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/test/python/resource_management/TestListAmbariManagedRepos.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +@@ -17,9 +17,9 @@ + See the License for the specific language governing permissions and + limitations under the License. + ''' +-from mock.mock import patch +-from mock.mock import MagicMock +-from mock.mock import patch, MagicMock ++from unittest.mock import patch ++from unittest.mock import MagicMock ++from unittest.mock import patch, MagicMock + import glob + from ambari_commons.os_check import OSCheck + from resource_management.libraries.functions.list_ambari_managed_repos import * +@@ -52,8 +52,8 @@ + [] + ] + res = list_ambari_managed_repos('HDP') +- self.assertEquals(glob_mock.call_args_list[0][0][0], "/etc/apt/sources.list.d/HDP*") +- self.assertEquals(res, ['HDP-1.1.1', 'HDP-1.1.2', 'HDP-1.1.3', 'HDP-UTILS-1.1.3']) ++ self.assertEqual(glob_mock.call_args_list[0][0][0], "/etc/apt/sources.list.d/HDP*") ++ self.assertEqual(res, ['HDP-1.1.1', 'HDP-1.1.2', 'HDP-1.1.3', 'HDP-UTILS-1.1.3']) + self.assertTrue(glob_mock.call_count > 1) + + @patch("glob.glob") +@@ -79,8 +79,8 @@ + [] + ] + res = list_ambari_managed_repos('HDP') +- self.assertEquals(glob_mock.call_args_list[0][0][0], "/etc/yum.repos.d/HDP*") +- self.assertEquals(res, ['HDP-1.1.1', 'HDP-1.1.2', 'HDP-1.1.3', 'HDP-UTILS-1.1.3']) ++ self.assertEqual(glob_mock.call_args_list[0][0][0], "/etc/yum.repos.d/HDP*") ++ self.assertEqual(res, ['HDP-1.1.1', 'HDP-1.1.2', 'HDP-1.1.3', 'HDP-UTILS-1.1.3']) + self.assertTrue(glob_mock.call_count > 1) + + +@@ -107,8 +107,8 @@ + [] + ] + res = list_ambari_managed_repos('HDP') +- self.assertEquals(glob_mock.call_args_list[0][0][0], "/etc/zypp/repos.d/HDP*") +- self.assertEquals(res, ['HDP-1.1.1', 'HDP-1.1.2', 'HDP-1.1.3', 'HDP-UTILS-1.1.3']) ++ self.assertEqual(glob_mock.call_args_list[0][0][0], "/etc/zypp/repos.d/HDP*") ++ self.assertEqual(res, ['HDP-1.1.1', 'HDP-1.1.2', 'HDP-1.1.3', 'HDP-UTILS-1.1.3']) + self.assertTrue(glob_mock.call_count > 1) + + +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/test/python/resource_management/TestMonitorWebserverResource.py apache-ambari-2.7.6-change/ambari-agent/src/test/python/resource_management/TestMonitorWebserverResource.py +--- ambari-release-2.7.6-origin/ambari-agent/src/test/python/resource_management/TestMonitorWebserverResource.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/test/python/resource_management/TestMonitorWebserverResource.py 2022-07-11 00:52:30.000000000 +0800 +@@ -17,7 +17,7 @@ + ''' + + from unittest import TestCase +-from mock.mock import patch, MagicMock ++from unittest.mock import patch, MagicMock + from resource_management import * + from resource_management.libraries.providers.monitor_webserver\ + import MonitorWebserverProvider +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/test/python/resource_management/TestNamenodeHaUtils.py apache-ambari-2.7.6-change/ambari-agent/src/test/python/resource_management/TestNamenodeHaUtils.py +--- ambari-release-2.7.6-origin/ambari-agent/src/test/python/resource_management/TestNamenodeHaUtils.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/test/python/resource_management/TestNamenodeHaUtils.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/test/python/resource_management/TestPackageResource.py apache-ambari-2.7.6-change/ambari-agent/src/test/python/resource_management/TestPackageResource.py +--- ambari-release-2.7.6-origin/ambari-agent/src/test/python/resource_management/TestPackageResource.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/test/python/resource_management/TestPackageResource.py 2022-07-11 00:52:30.000000000 +0800 +@@ -19,7 +19,7 @@ + import os + import sys + from unittest import TestCase +-from mock.mock import patch, MagicMock, call ++from unittest.mock import patch, MagicMock, call + from ambari_commons.os_check import OSConst + from ambari_commons.repo_manager import ManagerFactory + +@@ -46,7 +46,7 @@ + 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))) +@@ -71,7 +71,7 @@ + ) + 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))) +@@ -117,7 +117,7 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-agent/src/test/python/resource_management/TestPropertiesFileResource.py apache-ambari-2.7.6-change/ambari-agent/src/test/python/resource_management/TestPropertiesFileResource.py +--- ambari-release-2.7.6-origin/ambari-agent/src/test/python/resource_management/TestPropertiesFileResource.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/test/python/resource_management/TestPropertiesFileResource.py 2022-07-11 00:52:30.000000000 +0800 +@@ -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 os + import time + from unittest import TestCase +-from mock.mock import patch, MagicMock ++from unittest.mock import patch, MagicMock + from only_for_platform import get_platform, not_for_platform, os_distro_value, PLATFORM_WINDOWS + + from ambari_commons.os_check import OSCheck +@@ -69,7 +69,7 @@ + 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") ++ create_file_mock.assert_called_with('/somewhere_in_system/one_file.properties', '# Generated by Apache Ambari. Today is Wednesday\n \n ', encoding="UTF-8") + ensure_mock.assert_called() + + +@@ -102,7 +102,7 @@ + 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") ++ create_file_mock.assert_called_with('/dir/and/dir/file.txt', '# Generated by Apache Ambari. Some other day\n \n ', encoding="UTF-8") + ensure_mock.assert_called() + + +@@ -135,7 +135,7 @@ + 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") ++ create_file_mock.assert_called_with('/dir/new_file', '# Generated by Apache Ambari. 777\n \nproperty1=value1\n ', encoding="UTF-8") + ensure_mock.assert_called() + + +@@ -173,7 +173,7 @@ + }, + ) + +- 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") ++ 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") + ensure_mock.assert_called() + + +@@ -210,5 +210,5 @@ + ) + + 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") ++ create_file_mock.assert_called_with('/dir1/new_file', '# Generated by Apache Ambari. 777\n \nproperty_1=value1\n ', encoding="UTF-8") + ensure_mock.assert_called() +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/test/python/resource_management/TestRepositoryResource.py apache-ambari-2.7.6-change/ambari-agent/src/test/python/resource_management/TestRepositoryResource.py +--- ambari-release-2.7.6-origin/ambari-agent/src/test/python/resource_management/TestRepositoryResource.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/test/python/resource_management/TestRepositoryResource.py 2022-07-11 00:52:30.000000000 +0800 +@@ -19,7 +19,7 @@ + import os, sys + import tempfile + from unittest import TestCase +-from mock.mock import patch, MagicMock ++from unittest.mock import patch, MagicMock + from only_for_platform import get_platform, not_for_platform, PLATFORM_WINDOWS + + from ambari_commons.os_check import OSCheck +@@ -32,7 +32,7 @@ + if get_platform() != PLATFORM_WINDOWS: + from resource_management.libraries.providers import repository + +-class DummyTemplate(object): ++class DummyTemplate: + + def __init__(self, name, extra_imports=[], **kwargs): + self._template = InlineTemplate(DummyTemplate._inline_text, extra_imports, **kwargs) +@@ -219,8 +219,8 @@ + 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, '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]) +@@ -263,8 +263,8 @@ + 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, '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]) +@@ -300,8 +300,8 @@ + 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, '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 -Naur ambari-release-2.7.6-origin/ambari-agent/src/test/python/resource_management/TestScript.py apache-ambari-2.7.6-change/ambari-agent/src/test/python/resource_management/TestScript.py +--- ambari-release-2.7.6-origin/ambari-agent/src/test/python/resource_management/TestScript.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/test/python/resource_management/TestScript.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +@@ -17,19 +17,19 @@ + 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 + from resource_management.core.logger import Logger +-from mock.mock import patch, MagicMock ++from unittest.mock import patch, MagicMock + from stacks.utils.RMFTestCase import * + + class TestScript(RMFTestCase): + + def setUp(self): + # disable stdout +- out = StringIO.StringIO() ++ out = io.StringIO() + sys.stdout = out + + @patch("__builtin__.open") +@@ -58,7 +58,7 @@ + :param open_mock: + :return: + """ +- class MagicFile(object): ++ class MagicFile: + def read(self): + return "{}" + +@@ -83,7 +83,7 @@ + pass + + self.assertTrue(open_mock.called) +- self.assertEquals({}, Script.structuredOut) ++ self.assertEqual({}, Script.structuredOut) + + + @patch.object(Logger, "error", new = MagicMock()) +@@ -104,7 +104,7 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-agent/src/test/python/resource_management/TestSecurityCommons.py apache-ambari-2.7.6-change/ambari-agent/src/test/python/resource_management/TestSecurityCommons.py +--- ambari-release-2.7.6-origin/ambari-agent/src/test/python/resource_management/TestSecurityCommons.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/test/python/resource_management/TestSecurityCommons.py 2022-07-11 00:52:30.000000000 +0800 +@@ -43,27 +43,27 @@ + 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 @@ + # 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 @@ + # 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 @@ + 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 @@ + + 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 @@ + } + } + +- 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 @@ + 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 @@ + + 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() +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/test/python/resource_management/TestServiceResource.py apache-ambari-2.7.6-change/ambari-agent/src/test/python/resource_management/TestServiceResource.py +--- ambari-release-2.7.6-origin/ambari-agent/src/test/python/resource_management/TestServiceResource.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/test/python/resource_management/TestServiceResource.py 2022-07-11 00:52:30.000000000 +0800 +@@ -17,7 +17,7 @@ + ''' + + from unittest import TestCase +-from mock.mock import patch, MagicMock ++from unittest.mock import patch, MagicMock + from only_for_platform import get_platform, not_for_platform, os_distro_value, PLATFORM_WINDOWS + + from ambari_commons.os_check import OSCheck +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/test/python/resource_management/TestSubstituteVars.py apache-ambari-2.7.6-change/ambari-agent/src/test/python/resource_management/TestSubstituteVars.py +--- ambari-release-2.7.6-origin/ambari-agent/src/test/python/resource_management/TestSubstituteVars.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/test/python/resource_management/TestSubstituteVars.py 2022-07-11 00:52:30.000000000 +0800 +@@ -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): +@@ -65,7 +65,7 @@ + 'fail.inf.loop' : '${fail.inf.loop}' + } + +- for key in raw_config.keys(): ++ for key in list(raw_config.keys()): + actual_value = substitute_vars(raw_config[key], raw_config) + expected_value = expected_config[key] + +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/test/python/resource_management/TestTarArchive.py apache-ambari-2.7.6-change/ambari-agent/src/test/python/resource_management/TestTarArchive.py +--- ambari-release-2.7.6-origin/ambari-agent/src/test/python/resource_management/TestTarArchive.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/test/python/resource_management/TestTarArchive.py 2022-07-11 00:52:30.000000000 +0800 +@@ -16,7 +16,7 @@ + limitations under the License. + ''' + +-from mock.mock import patch, MagicMock ++from unittest.mock import patch, MagicMock + from unittest import TestCase + + from ambari_commons.os_check import OSCheck +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/test/python/resource_management/TestTemplateConfigResource.py apache-ambari-2.7.6-change/ambari-agent/src/test/python/resource_management/TestTemplateConfigResource.py +--- ambari-release-2.7.6-origin/ambari-agent/src/test/python/resource_management/TestTemplateConfigResource.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/test/python/resource_management/TestTemplateConfigResource.py 2022-07-11 00:52:30.000000000 +0800 +@@ -17,7 +17,7 @@ + ''' + + from unittest import TestCase +-from mock.mock import patch, MagicMock ++from unittest.mock import patch, MagicMock + + from only_for_platform import get_platform, not_for_platform, os_distro_value, PLATFORM_WINDOWS + +@@ -36,18 +36,18 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-agent/src/test/python/resource_management/TestUserResource.py apache-ambari-2.7.6-change/ambari-agent/src/test/python/resource_management/TestUserResource.py +--- ambari-release-2.7.6-origin/ambari-agent/src/test/python/resource_management/TestUserResource.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/test/python/resource_management/TestUserResource.py 2022-07-11 00:52:30.000000000 +0800 +@@ -17,7 +17,7 @@ + ''' + + from unittest import TestCase +-from mock.mock import patch, MagicMock, PropertyMock ++from unittest.mock import patch, MagicMock, PropertyMock + + from only_for_platform import get_platform, not_for_platform, os_distro_value, PLATFORM_WINDOWS + +@@ -221,7 +221,7 @@ + """ + Tests that parsing users out of /etc/groups can tolerate some bad lines + """ +- class MagicFile(object): ++ class MagicFile: + def read(self): + return """ + group1:x:1: +@@ -247,7 +247,7 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-agent/src/test/python/resource_management/TestUtils.py apache-ambari-2.7.6-change/ambari-agent/src/test/python/resource_management/TestUtils.py +--- ambari-release-2.7.6-origin/ambari-agent/src/test/python/resource_management/TestUtils.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/test/python/resource_management/TestUtils.py 2022-07-11 00:52:30.000000000 +0800 +@@ -35,5 +35,5 @@ + 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 \"{}\" failed, expected: {} but got {}".format( + test_pattern, expected, bitmask)) +diff -Naur ambari-release-2.7.6-origin/ambari-agent/src/test/python/resource_management/TestXmlConfigResource.py apache-ambari-2.7.6-change/ambari-agent/src/test/python/resource_management/TestXmlConfigResource.py +--- ambari-release-2.7.6-origin/ambari-agent/src/test/python/resource_management/TestXmlConfigResource.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/test/python/resource_management/TestXmlConfigResource.py 2022-07-11 00:52:30.000000000 +0800 +@@ -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 os + import time + from unittest import TestCase +-from mock.mock import patch, MagicMock ++from unittest.mock import patch, MagicMock + + from only_for_platform import get_platform, not_for_platform, os_distro_value, PLATFORM_WINDOWS + +@@ -68,7 +68,7 @@ + configuration_attributes={} + ) + +- create_file_mock.assert_called_with('/dir/conf/file.xml', u' \n \n ', encoding='UTF-8') ++ create_file_mock.assert_called_with('/dir/conf/file.xml', ' \n \n ', encoding='UTF-8') + + + @patch("resource_management.core.providers.system._ensure_metadata") +@@ -97,7 +97,7 @@ + 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 ', encoding='UTF-8') ++ 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') + + @patch("resource_management.core.providers.system._ensure_metadata") + @patch("resource_management.core.sudo.create_file") +@@ -126,7 +126,7 @@ + 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 ', encoding='UTF-8') ++ 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') + + @patch("resource_management.core.providers.system._ensure_metadata") + @patch("resource_management.core.sudo.create_file") +@@ -178,7 +178,7 @@ + } + }) + +- 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 ', encoding='UTF-8') ++ 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 \n value4\n \n \n \n prop.empty\n \n \n \n \n ', encoding='UTF-8') + + @patch("resource_management.core.providers.system._ensure_metadata") + @patch("resource_management.core.sudo.create_file") +@@ -211,7 +211,7 @@ + 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 ', encoding='UTF-8') ++ 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') + + @patch("resource_management.libraries.providers.xml_config.File") + @patch("resource_management.core.sudo.path_exists") +@@ -226,7 +226,7 @@ + conf_dir='/dir/conf', + configurations={'property1': 'value1'}, + configuration_attributes={'attr': {'property1': 'attr_value'}}, +- mode = 0755, ++ mode = 0o755, + owner = "hdfs", + group = "hadoop", + encoding = "Code" +@@ -235,4 +235,4 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-agent/src/test/python/unitTests.py apache-ambari-2.7.6-change/ambari-agent/src/test/python/unitTests.py +--- ambari-release-2.7.6-origin/ambari-agent/src/test/python/unitTests.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-agent/src/test/python/unitTests.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_commons/aggregate_functions.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_commons/aggregate_functions.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_commons/aggregate_functions.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_commons/aggregate_functions.py 2022-07-11 00:52:28.000000000 +0800 +@@ -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 @@ + """calculates standard deviation""" + if len(lst) < 2: + return 0 +- variance = sum([(element-mean(lst))**2 for element in lst]) / (len(lst) - 1) ++ variance = sum((element-mean(lst))**2 for element in lst) / (len(lst) - 1) + return sqrt(variance) + + def mean(lst): +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_commons/ambari_metrics_helper.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_commons/ambari_metrics_helper.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_commons/ambari_metrics_helper.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_commons/ambari_metrics_helper.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +@@ -45,25 +45,25 @@ + try: + hadoop_conf_dir = conf_select.get_hadoop_conf_dir() + except Exception as e: +- raise Exception("Couldn't define hadoop_conf_dir: {0}".format(e)) ++ raise Exception("Couldn't define hadoop_conf_dir: {}".format(e)) + properties_filepath = os.path.join(hadoop_conf_dir, DEFAULT_METRICS2_PROPERTIES_FILE_NAME) + + if not os.path.exists(properties_filepath): +- raise Exception("Properties file doesn't exist : {0}. Can't define metric collector hosts".format(properties_filepath)) ++ raise Exception("Properties file doesn't exist : {}. Can't define metric collector hosts".format(properties_filepath)) + props = load_properties_from_file(properties_filepath) + + property_key = sink_name + DEFAULT_COLLECTOR_SUFFIX + if property_key in props: + return props.get(property_key) + else: +- raise Exception("Properties file doesn't contain {0}. Can't define metric collector hosts".format(property_key)) ++ raise Exception("Properties file doesn't contain {}. Can't define metric collector hosts".format(property_key)) + + def load_properties_from_file(filepath, sep='=', comment_char='#'): + """ + Read the file passed as parameter as a properties file. + """ + props = {} +- with open(filepath, "rt") as f: ++ with open(filepath) as f: + for line in f: + l = line.strip() + if l and not l.startswith(comment_char): +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_commons/buffered_queue.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_commons/buffered_queue.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_commons/buffered_queue.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_commons/buffered_queue.py 2022-07-11 00:52:28.000000000 +0800 +@@ -21,7 +21,7 @@ + from threading import Event + + +-class BufferedQueue(object): ++class BufferedQueue: + """ + Thread safe buffered queue + """ +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_commons/constants.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_commons/constants.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_commons/constants.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_commons/constants.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_commons/credential_store_helper.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_commons/credential_store_helper.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_commons/credential_store_helper.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_commons/credential_store_helper.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_commons/exceptions.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_commons/exceptions.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_commons/exceptions.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_commons/exceptions.py 2022-07-11 00:52:28.000000000 +0800 +@@ -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 @@ + self.reason = reason + + def __str__(self): +- return repr("Fatal exception: %s, exit code %s" % (self.reason, self.code)) ++ return repr("Fatal exception: {}, exit code {}".format(self.reason, self.code)) + + + class NonFatalException(Exception): +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_commons/firewall.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_commons/firewall.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_commons/firewall.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_commons/firewall.py 2022-07-11 00:52:28.000000000 +0800 +@@ -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 ambari_commons.os_family_impl import OsFamilyImpl + from resource_management.core import shell + +-class Firewall(object): ++class Firewall: + def __init__(self): + # OS info + self.OS_VERSION = OSCheck().get_os_major_version() +@@ -53,7 +53,7 @@ + else: + return FirewallChecks() + +-class FirewallChecks(object): ++class FirewallChecks: + def __init__(self): + self.FIREWALL_SERVICE_NAME = "iptables" + self.SERVICE_SUBCMD = "status" +@@ -69,7 +69,7 @@ + return self.FIREWALL_SERVICE_NAME + + def get_command(self): +- return "%s %s %s" % (self.SERVICE_CMD, self.FIREWALL_SERVICE_NAME, self.SERVICE_SUBCMD) ++ return "{} {} {}".format(self.SERVICE_CMD, self.FIREWALL_SERVICE_NAME, self.SERVICE_SUBCMD) + + def check_result(self): + result = False +@@ -87,7 +87,7 @@ + self.stdoutdata = out + self.stderrdata = err + except Exception as ex: +- print_warning_msg("Unable to check firewall status: {0}".format(ex)) ++ print_warning_msg("Unable to check firewall status: {}".format(ex)) + + def check_firewall(self): + try: +@@ -99,11 +99,11 @@ + + class UbuntuFirewallChecks(FirewallChecks): + def __init__(self): +- super(UbuntuFirewallChecks, self).__init__() ++ super().__init__() + self.FIREWALL_SERVICE_NAME = "ufw" + + def get_command(self): +- return "%s %s" % (self.FIREWALL_SERVICE_NAME, self.SERVICE_SUBCMD) ++ return "{} {}".format(self.FIREWALL_SERVICE_NAME, self.SERVICE_SUBCMD) + + def check_result(self): + # On ubuntu, the status command returns 0 whether running or not +@@ -117,7 +117,7 @@ + + class RedHat7FirewallChecks(FirewallChecks): + def __init__(self): +- super(RedHat7FirewallChecks, self).__init__() ++ super().__init__() + self.SERVICE_CMD = "systemctl" + + #firewalld added to support default firewall (started from RHEL7/CentOS7) +@@ -137,7 +137,7 @@ + + class Fedora18FirewallChecks(FirewallChecks): + def __init__(self): +- super(Fedora18FirewallChecks, self).__init__() ++ super().__init__() + + def get_command(self): + return "systemctl is-active %s" % (self.FIREWALL_SERVICE_NAME) +@@ -151,11 +151,11 @@ + + class SuseFirewallChecks(FirewallChecks): + def __init__(self): +- super(SuseFirewallChecks, self).__init__() ++ super().__init__() + self.FIREWALL_SERVICE_NAME = "rcSuSEfirewall2" + + def get_command(self): +- return "%s %s" % (self.FIREWALL_SERVICE_NAME, self.SERVICE_SUBCMD) ++ return "{} {}".format(self.FIREWALL_SERVICE_NAME, self.SERVICE_SUBCMD) + + def check_result(self): + result = False +@@ -169,7 +169,7 @@ + + class WindowsFirewallChecks(FirewallChecks): + def __init__(self): +- super(WindowsFirewallChecks, self).__init__() ++ super().__init__() + self.FIREWALL_SERVICE_NAME = "MpsSvc" + + def run_command(self): +@@ -187,7 +187,7 @@ + + def check_result(self): + if self.returncode != 0: +- print_warning_msg("Unable to check firewall status:{0}".format(self.stderrdata)) ++ print_warning_msg("Unable to check firewall status:{}".format(self.stderrdata)) + return False + profiles_status = [i for i in self.stdoutdata.split("\n") if not i == ""] + if "1" in profiles_status: +@@ -199,7 +199,7 @@ + if profiles_status[2] == "1": + enabled_profiles.append("PublicProfile") + print_warning_msg( +- "Following firewall profiles are enabled:{0}. Make sure that the firewall is properly configured.".format( ++ "Following firewall profiles are enabled:{}. Make sure that the firewall is properly configured.".format( + ",".join(enabled_profiles))) + return True + return False +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_commons/get_ambari_version.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_commons/get_ambari_version.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_commons/get_ambari_version.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_commons/get_ambari_version.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + 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: ++ with open(ver_file) 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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_commons/inet_utils.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_commons/inet_utils.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_commons/inet_utils.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_commons/inet_utils.py 2022-07-11 00:52:28.000000000 +0800 +@@ -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 @@ + :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) +@@ -60,36 +60,36 @@ + + + def download_file(link, destination, chunk_size=16 * 1024, progress_func = None): +- print_info_msg("Downloading {0} to {1}".format(link, destination)) ++ print_info_msg("Downloading {} to {}".format(link, destination)) + if os.path.exists(destination): +- print_warning_msg("File {0} already exists, assuming it was downloaded before".format(destination)) ++ print_warning_msg("File {} already exists, assuming it was downloaded before".format(destination)) + return + + force_download_file(link, destination, chunk_size, progress_func = progress_func) + + + def download_file_anyway(link, destination, chunk_size=16 * 1024, progress_func = None): +- print_info_msg("Trying to download {0} to {1} with python lib [urllib2].".format(link, destination)) ++ print_info_msg("Trying to download {} to {} with python lib [urllib2].".format(link, destination)) + if os.path.exists(destination): +- print_warning_msg("File {0} already exists, assuming it was downloaded before".format(destination)) ++ print_warning_msg("File {} already exists, assuming it was downloaded before".format(destination)) + return + try: + force_download_file(link, destination, chunk_size, progress_func = progress_func) + except: +- print_error_msg("Download {0} with python lib [urllib2] failed with error: {1}".format(link, str(sys.exc_info()))) ++ print_error_msg("Download {} with python lib [urllib2] failed with error: {}".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 {} to {} 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) ++ curl_command = "curl --fail -k -o {} {}".format(destination, link) + retcode, out, err = os_run_os_command(curl_command) + if retcode != 0: +- print_error_msg("Download file {0} with [curl] command failed with error: {1}".format(link, out + err)) ++ print_error_msg("Download file {} with [curl] command failed with error: {}".format(link, out + err)) + + + 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_msg("Unable to download file {}!".format(link)) ++ print(("ERROR: unable to donwload file %s!" % (link))) + + + def download_progress(file_name, downloaded_size, blockSize, totalSize): +@@ -142,7 +142,7 @@ + + + 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,10 +168,10 @@ + 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)) ++ print_info_msg("Downloading to: {} Bytes: {}".format(destination, file_size)) + + if partial_size < file_size: + if seek_pos == 0: +@@ -203,11 +203,11 @@ + sys.stdout.write('\n') + sys.stdout.flush() + +- print_info_msg("Finished downloading {0} to {1}".format(link, destination)) ++ print_info_msg("Finished downloading {} to {}".format(link, destination)) + + downloaded_size = os.stat(temp_dest).st_size + if downloaded_size != file_size: +- err = 'Size of downloaded file {0} is {1} bytes, it is probably damaged or incomplete' % (destination, downloaded_size) ++ err = 'Size of downloaded file {{0}} is {{1}} bytes, it is probably damaged or incomplete'.format(destination, downloaded_size) + raise FatalException(1, err) + + # when download is complete -> mv temp_dest destination +@@ -267,11 +267,11 @@ + return None + + # if not a string, return None +- if not isinstance(uri, basestring): ++ if not isinstance(uri, str): + return None + + # RFC3986, Appendix B +- parts = re.findall('^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?', uri) ++ parts = re.findall(r'^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?', uri) + + # index of parts + # scheme = 1 +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_commons/__init__.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_commons/__init__.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_commons/__init__.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_commons/__init__.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python2.6 ++#!/usr/bin/env python32.6 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_commons/kerberos/__init__.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_commons/kerberos/__init__.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_commons/kerberos/__init__.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_commons/kerberos/__init__.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python2.6 ++#!/usr/bin/env python32.6 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_commons/kerberos/kerberos_common.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_commons/kerberos/kerberos_common.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_commons/kerberos/kerberos_common.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_commons/kerberos/kerberos_common.py 2022-07-11 00:52:28.000000000 +0800 +@@ -39,7 +39,7 @@ + ] + + +-class MissingKeytabs(object): ++class MissingKeytabs: + class Identity(namedtuple('Identity', ['principal', 'keytab_file_path'])): + @staticmethod + def from_kerberos_record(item, hostname): +@@ -48,7 +48,7 @@ + get_property_value(item, 'keytab_file_path')) + + def __str__(self): +- return "Keytab: %s Principal: %s" % (self.keytab_file_path, self.principal) ++ return "Keytab: {} Principal: {}".format(self.keytab_file_path, self.principal) + + @classmethod + def from_kerberos_records(self, kerberos_record, hostname): +@@ -56,7 +56,7 @@ + with_missing_keytab = (each for each in kerberos_record \ + if not self.keytab_exists(each) or not self.keytab_has_principal(each, hostname)) + return MissingKeytabs( +- set(MissingKeytabs.Identity.from_kerberos_record(each, hostname) for each in with_missing_keytab)) ++ {MissingKeytabs.Identity.from_kerberos_record(each, hostname) for each in with_missing_keytab}) + else: + return MissingKeytabs(None) + +@@ -86,7 +86,7 @@ + owner='root', + create_parents=True, + group='root', +- mode=0755 ++ mode=0o755 + ) + + content = InlineTemplate(params.krb5_conf_template) +@@ -95,7 +95,7 @@ + content=content, + owner='root', + group='root', +- mode=0644 ++ mode=0o644 + ) + + +@@ -116,7 +116,7 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_commons/kerberos/utils.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_commons/kerberos/utils.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_commons/kerberos/utils.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_commons/kerberos/utils.py 2022-07-11 00:52:28.000000000 +0800 +@@ -49,7 +49,7 @@ + # 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_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 {k[prefix_len:]: v for k, v in list(dictionary.items()) if k.startswith(prefix)} + + + def split_host_and_port(host): +@@ -104,6 +104,6 @@ + host_and_port = split_host_and_port(host) + + if (host_and_port is not None) and ('host' in host_and_port): +- return "%s:%s" % (host_and_port['host'], port) ++ return "{}:{}".format(host_and_port['host'], port) + else: + return host +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_commons/libs/__init__.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_commons/libs/__init__.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_commons/libs/__init__.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_commons/libs/__init__.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python2.6 ++#!/usr/bin/env python32.6 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_commons/libs/ppc64le/__init__.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_commons/libs/ppc64le/__init__.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_commons/libs/ppc64le/__init__.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_commons/libs/ppc64le/__init__.py 1970-01-01 08:00:00.000000000 +0800 +@@ -1,19 +0,0 @@ +-#!/usr/bin/env python2.6 +- +-''' +-Licensed to the Apache Software Foundation (ASF) under one +-or more contributor license agreements. See the NOTICE file +-distributed with this work for additional information +-regarding copyright ownership. The ASF licenses this file +-to you under the Apache License, Version 2.0 (the +-"License"); you may not use this file except in compliance +-with the License. You may obtain a copy of the License at +- +- http://www.apache.org/licenses/LICENSE-2.0 +- +-Unless required by applicable law or agreed to in writing, software +-distributed under the License is distributed on an "AS IS" BASIS, +-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-See the License for the specific language governing permissions and +-limitations under the License. +-''' +\ 文件尾没有换行符 +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_commons/libs/ppc64le/_posixsubprocess.so apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_commons/libs/ppc64le/_posixsubprocess.so +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_commons/libs/ppc64le/_posixsubprocess.so 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_commons/libs/ppc64le/_posixsubprocess.so 1970-01-01 08:00:00.000000000 +0800 +@@ -1,449 +0,0 @@ +-ELF @@8@#"$8$8$$Ptd666LLQtdRtd  GNU-cNn5x +->0@ >ACBE|qX 98 rR" ?(-u h3aSm+ CO&Ua ?N 8 F]` +-2X` ` 3__gmon_start___init_fini_ITM_deregisterTMCloneTable_ITM_registerTMCloneTable__cxa_finalize_Jv_RegisterClassesPyExc_OSErrorPyEval_SaveThreadpipe2PyEval_RestoreThread_Py_BuildValue_SizeT__errno_locationPyErr_SetFromErrnofcntlclosepipe__stack_chk_failPy_FileSystemDefaultEncodingPyExc_TypeErrorstrlenPyErr_SetStringPyUnicodeUCS4_FromObjectPyUnicodeUCS4_AsEncodedStringPyUnicodeUCS4_EncodeUTF8PySequence_SizemallocPySequence_GetItemPyString_AsString__strdupfreePyErr_NoMemoryPyExc_ValueError_Py_NoneStructPyExc_RuntimeError_PyArg_ParseTuple_SizeTPyObject_IsTruePyLong_AsLongPyTuple_NewPyImport_ImportModule_PyObject_CallMethod_SizeTPySequence_Fast_PyImport_AcquireLockfork_PyImport_ReleaseLockPyLong_FromLongPyErr_OccurredPyOS_AfterForkdup2chdirPyObject_Callexecveexecvwrite_exitopen64syscallsetsidsysconfinit_posixsubprocessPy_InitModule4_64libpython2.7.so.1.0libpthread.so.0libc.so.6_edata__bss_start_endGLIBC_2.17 h5p P6&&&: & +-(&40&8&@&H&P&)X& (08 @ +-H P X `hpx !"#$%&'(*+ ,(-0.8/@0H1P2X3`5h6p7x89;<=A} NL<0kB8|!`/ AKA`!8| NA} NA} NA} NA} NAȁ} NA} NAX} NAH} NA} NA} NA`} NAЁ} NA@} NA} NA聂} NAP} NA} NA8} NA} NAX} NA} NA0} NAH} NA } NA} NA0} NA } NA؁} NA} NA`} NA8} NAp} NAP} NA} NA(} NA} NA} NAp} NAx} NA} NAh} NA} NA@} NAh} NAx} NA} NA} NA} NA(} NL/@x1KA/A@ؽ@/>dxA8KxKA/$@ba88KA/xi|Aba%a8|KA/@fa88KA/xi|Afa%a8|]KA/@ K`B`tamKA/x||AxaUKA/x||DAx88KA/xz|Ae`8x|KAxz|Kxz|KKAB`L< cB8|y|x#|!A?)/(yA?)9?$85KA?4@?@!8x| N`B``@")9/>@>x0)A)}xK,}!NA@: 9xC9`!8!Aa| NB`${*:}/A>)9/>Azx_/$A``B`KA /@xCKA`!8`8!Aa| NAKApKB`>x0)A)}xK,}!NAdK`8KKA`8K`B`L<`^B8&}|pxx#|!= 3cannot get length of fds_to_keepgcisenableddisableargv must be a tuple/proc/self/fdOSError::noexecRuntimeError:0:not holding the import lockenablebad value(s) in fds_to_keep0123456789ABCDEF_posixsubprocessfork_execcloexec_pipe;Lh`0zRxA @4L@A ADA4d(LA~` +-IAC DD ACC@A~Q +-FAC M +-GAD z +-FAD L((E AH`A~x +-IAB Y +-JAA l4\A~ FGH +-  +-MAEFAGAHDA XM A~CBA  3o0 +- p3p0  o oof o A POSIX helper for the subprocess module.cloexec_pipe() -> (read_end, write_end) +- +-Create a pipe whose ends have the cloexec flag set; write_end will be >= 3.fork_exec(args, executable_list, close_fds, cwd, env, +- p2cread, p2cwrite, c2pread, c2pwrite, +- errread, errwrite, errpipe_read, errpipe_write, +- restore_signals, call_setsid, preexec_fn) +- +-Forks a child process, closes parent file descriptors as appropriate in the +-child and dups the few that are needed before calling exec() in the child +-process. +- +-The preexec_fn, if supplied, will be called immediately before exec. +-WARNING: preexec_fn is NOT SAFE if your application uses threads. +- It may trigger infrequent, difficult to debug deadlocks. +- +-If an error occurs in the child process before the exec, it is +-serialized and written to the errpipe_write fd per subprocess.py. +- +-Returns: the child process's PID. +- +-Raises: Only on an error in the parent process. +-5 P6GCC: (GNU) 4.8.5 20150623 (Red Hat 4.8.5-28),:%u8{!tintBiBibb:iO0 KN +-4 b +-  +- +-! +-7 !( q0 8 q@ H P uX  `  h  bp bt bpx F cT  | f&{ (/ /0 61 =2 D3- 5b 7 +-  +-< +-n +- bUN fbb ITk8! " +-   Y Cu~Mg'?FS7 u +- r!"# $% &'(!)& *U+; ,- .A#/0t 123E4756`7~89:; < <=1 >B?$OFe"-$-vg#0"fn%%q }Y +-   o@ +-iW W"    .".z"O "@  @Q *  +-R vL X_6 7 U! "m N!4  0  J \ /% .  n  +-j +- +-k +-i! +-kx  +-Dx  +-E i! +-Ex   +-E V +-F  +-G  +-G(  +-K0  +-L8 f +-M'@  +-NYH  +-OP  +-PX  +-T`  +-Uh +-Vp  +-Zx 8 +-[ } +-\ y +-]M  +-^  +-a 7 +-di  +-f u +-j\  +-m6 +-q % +-t 8 +-x  +-y  +-|  +-} X +-~0 +-x / +- ! +-  +-3# +- < +-$( +-[0 +-08 +-@ +-6 H +- P +- X +- `" +- h +- pn +-xW +-M +-l +-n +- +-o +-i! +-ox  +- +-o +-p k +-    ~ + +-      +-   6     +-A G bV   +-a g v  v +-  b     +-     +-     +- +-  b    +- +-% + bI    +-T Z bs    N# +-    s , +- r +-     " +-    y m` +-buf +-obj +- len +- +- +- +-V +-b +-L +-b$ +- +-( +- +- 0 +- +- 8 +- +- @ +-T +-H +-Y +-X +-  +-b b +- w +-#b7   +- +-BHb\  +-gmb 78 +-w +- +- +- +-  +- +-  +- +-  +-! +- +- +- +- ( +-F" +- 0 +-C +- 8 +-b +- @ +- +- H +- +-6 P +- +- X +-V +- ` +- +- h +-h +- p +- +- x +-x +- +-] +-v +- +- +- +- +-~ +- +- +- +- +- +-@ +- +-` +- +-^ +- +- +- +-  +- +-  +-  +-  +-  +- T +-  +- +-  +-   +-  g +-  (e +- 0 +-P +- +-! +-V C +-  ! +-   +-  +- +- +- ( H +- 0 8 +-8  +- @  +- H +- +-!L +-"V  +-#   +-$I O +-%0 +-' W +-( . +- +-)   +-*   +-+  L +- +-, a +--(_ +-.X +-1m +-2 & +-3b! !bZ +-439 M  +-5  +-6ekb  M +-7T ] +-8 +-9  +-:i Y +-;   b +-< \ +-=  +-> K +-?T 9 +-@T  +-A<B [x    +-Bgm x wL % +-# & +-i ' +-2 (b +- * e( 0 +- get set  doc  +-B  i +- M =0    i! x  str   i   (H* S(# +-$ +-i!$x  +-$ +-%i +-&b +- '$ +-1 R +- +-i!x  +- +-R bh ( +- +-i!x  +- +-  +-& 'mw   ,    b3  _isP +-= +- +-m  +-  +- +-! ( +-  0 +-a  8 +-} @ +-% bH3_ts8 +-=; +-r< +-> +-?b +-Cb +-Db +- F( +-"G0 +-H 8 +-I @ +-K H +- L P +-M X +- +-O ` +- P h +-Q p +-2 S x +-J[b +-]b +- +-_ +-]#`i +- bb +-qc  %39"-b b g%Fސ +- +-4 +-DF +- ? +- 6i i![)b"p)"~)b#Ob" O$numQb%& v'` v'w' x(cwdy'ozb'Tzb' {b'{b'|b'|b'}b' +-#}b'K!~b'0~b'b'@ 'j +- ' )ib*b*O b* +-b*w *J*+b,T)oldb,f)oldb,x)oldb,*-)cur .#" b"@ q!b-* +-#*  b-*:4*gb-)fdb4/F0 1 1! 92fds3resbr4bT4biw5,0"4w0)6467L6 8T@?$8S9\68S:-4b;,"4by5\446b978S78&78U38T +-6LA77\L78S7tL78S7&78U8T18S9&78T28S7b7L8S (46A76x777~8S7&78U08T17&78T27&78U08T17<&78T267bn "  <+bs =arg+ >r+?c +-- ?.d?"/@@<A%778U 048S9X78U 04747 8S$7 8" 8T X468BdC 8S7 8b 8T 84C08S.T "e T$iVDgp(9">g ?e iy Eij?@j% ?k F:p!?"w> +-758C!8T8S7P8[!8S6$e8Bh|!8S6H {8Gs <!H I<J t +-689 88S78!8S78"8SBp +"8S6 {8ub""u w 0!w O"xi- z ~{i. +-"" i"@ bi   b-  bbI#Kfdb"  "- i <iBbp#" +-B wD LD  }51 +-1  +-4 +-  ;$  {;H! {;@ {; |;j +- |;L |4  4 4 ;obz;Tbz; bz;bz;bz;b{;b{; +-#b{4K!b;0b{;b{;: |;! |3cwdP3pid4@ bB4` !4!4 !4"BM"N9"!8?&AI"yI!JT"J_"Jj":)&Jv"J"56$"86d"89!88SOs "&H PJ k6"89#88SNs ,#4&H I,#4J 6H#89`#88SNs `#0I'H I`#0J 6x#89#88S:0'4w? 7%8'8S 57 %8'8U08T 58S70%9'8S7h%8'8U08T 58SC`&8S:p(4,`F:U(4k ;k |9&8T:(4"s C)8S:@(4"t C)8S7%%9(8T  57%@9(8S9|& 8SNI#&T\)AY#1I&TJd#T9&88U08T 58SNs '<)H I'<J w6'89'88SNs '8*H I'8J 6(890(88SNs 0(0v*H I0(0J 6H(89`(88SNI#)T*AY#I)TJd#9)88U08T 58SOH+p2A)AcAQhAAHAAA|aQpaAd/AXAL7A@mA4Q(kAqQlPpJ JO RJ +- Jq!J"!S.|T:X-:#,J}M"7-U9,8U8T6-A76@-u95l-,J"7-9k,8U88T H58S7-9,8S7.9,8U18T X58S9 .98U68T `58SOx./A"A#PJd#@x.0]-A#A8$9.98U08T@?$8S 85:`.S|J$:y.J$J.%PJw%O.-A%PJ%O"`00R.A#&A#?&P0J#b&J%#&:`<.J1#&J<#'6089l088S707j.8S60A77.9.8V +-8U8T8S7P/7.8S6`/A7U"/A"P'A"'PJ"'J"(J"O(J"(G/c/I/J(9/98S4:/J"*)J"M)6087,07/8S6<0A77/8/8S7P17/8S6`1A7514E0JY)71&7,08T18S192&78T28S15240JG)7,2&708T18S09L2&78T28S05P240Jk)7`2&708T18S292&78T28S26x+77+718S7+7(18S~7+9E18T08S7,9b18T18S70,918T28S7\,718S7,:18S7,-:18U08T8S6P-A76`-A77D.928U?8T h58S7P.7.28S7d.9L28T8S64/M:7|/7q28S6/A771728S71L728S61791L78S07!Y:38Z|8Y|8X{8W{8V{8U|8T 48ST8q|8q{8q{8q{8q{8q{8qz8qz8qz8qz8qz6!96!87" 838T 56" 7"@938S0B#38SB$48SB`$48S6% 6('t:7@'O48T|6T'P86`'{:6':7(:48SB(48SB)48S7H) 848T 47|) 848T 4Bx*58S6*x76*:7* 8A58T x56*76* 6+:9p.:8SVo2X5)mq 92:8W +-8V08U 8T h8S 55/;5 P6t;!6 D6); +- c46 j6;:gZ6 hW WU X" +-F~ W\ ;W W W( W  Y^u0Zb6b['v70Z3"ab&7b\#bA7bb#Y! 2]dupbb7b\y x7#\ # 7 Zb7^Z:  7 Z  777 HZf- 8["N8 Z ( 58 Z> P8 \Ee8 Z.{8Yt _ 8Z8 Z58-\Ki8 \  8Zb 9 #Z +-b%9 Z ~ @9 \ ( U9ZD'bu9Z3b9Z#n9b-` b9b#ZV8i9i#Zki9bZb:bbZb-:ZI0 M:   a\>bt: #ba +-Y` b\G :iY O bx  +-_[:bcu  b% : ; I$ > $ > I!I/   I  : ;  +- : ; I8 : ;I8 : ; &I& : ; (  : ; : ;I8 : ; 'II : ; I8 ' : ; : ;I : ;< : ;I8  : ;  : ; .: ; 'I  4: ; I!.?: ; 'I 4": ; I#$4: ; I%.: ; ' &.: ;' ': ;I(: ;I)4: ;I*4: ;I+ +-: ;, - ..: ; ' /!I/0.: ;'I@B1: ;I24: ;I34: ;I44: ;I5 61718B91: U;4: ;I<.: ; 'I@B=: ; I>: ; I?4: ; I@1RUX Y A1BCD.: ; 'I@BE4: ; IF +-: ; G1X Y H1I J41K: ; IL.: ;'I@BM +-: ;N1X YO1RUX YP UQ1R41S41T +-1U1RUX YV.?: ;'@BW4: ; I?<X4: ;I?<Y.?: ; 'I<Z.?: ;'I<[.?: ; '<\.?: ; 'I<].?: ;'I<^.?'4<_.?: ;'<`.?: ; n'I<a.?: ;'I<b.?: ; '<c.?: ; 'I<bW /usr/include/bits/usr/lib/gcc/ppc64le-redhat-linux/4.8.5/include/usr/include/usr/include/sys/usr/include/python2.7_posixsubprocess.c_posixsubprocess_helpers.cfcntl2.hstddef.htypes.hstdio.hlibio.htypes.hpyport.hobject.hmethodobject.hdescrobject.hunicodeobject.hstringobject.htupleobject.hlistobject.hpystate.hfileobject.hpyerrors.hunistd.hfcntl.hceval.herrno.hmodsupport.hstring.habstract.hstring2.hstdlib.hlongobject.himport.hintrcheck.hconfname.h A/-!K=.)JYXX\t@$8?!/! i!!.<V6!1G.>/[#!h/[#!jX!/!!4z &"Y!"yfN\$L1*!#H=/GYY/.ug. =!2==<{.g-?{.Y-?9K-?<.  [0.!X~ZK0Y2/!K2g2[/6@K>!=>.L/G%)%)"X].X| =~J=A>v0!#.y. 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 +@@ -259,7 +259,7 @@ + + return os_version.dwMajorVersion, os_version.dwMinorVersion, os_version.dwBuildNumber + +-CHECK_FIREWALL_SCRIPT = """[string]$CName = $env:computername ++CHECK_FIREWALL_SCRIPT = r"""[string]$CName = $env:computername + $reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey("LocalMachine",$computer) + $domain = $reg.OpenSubKey("System\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\DomainProfile").GetValue("EnableFirewall") + $standart = $reg.OpenSubKey("System\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\StandardProfile").GetValue("EnableFirewall") +@@ -338,7 +338,7 @@ + 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, +@@ -360,7 +360,7 @@ + script_file = open(os.path.join(tmp_dir,random_filename+".ps1"),"w") + script_file.write(script_content) + script_file.close() +- result = os_run_os_command("powershell -ExecutionPolicy unrestricted -File {0}".format(script_file.name)) ++ result = os_run_os_command("powershell -ExecutionPolicy unrestricted -File {}".format(script_file.name)) + os.remove(script_file.name) + return result + +@@ -379,7 +379,7 @@ + retcode, out, err = os_run_os_command(WHOAMI_GROUPS) + if retcode != 0: + err_msg = "Unable to check the current user's group memberships. " \ +- "Command {0} returned exit code {1} with message: {2}".format(WHOAMI_GROUPS, retcode, err) ++ "Command {} returned exit code {} with message: {}".format(WHOAMI_GROUPS, retcode, err) + print_warning_msg(err_msg) + raise FatalException(retcode, err_msg) + +@@ -482,7 +482,7 @@ + return True + + #need this for redirecting output form python process to file +-class SyncStreamWriter(object): ++class SyncStreamWriter: + def __init__(self, stream, hMutexWrite): + self.stream = stream + self.hMutexWrite = hMutexWrite +@@ -501,7 +501,7 @@ + return getattr(self.stream, attr) + + +-class SvcStatusCallback(object): ++class SvcStatusCallback: + def __init__(self, svc): + self.svc = svc + +@@ -527,7 +527,7 @@ + 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 +544,7 @@ + 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 +581,7 @@ + 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 +602,7 @@ + try: + self.ReportServiceStatus(win32service.SERVICE_RUNNING) + self.ServiceMain() +- except Exception, x: ++ except Exception as x: + #TODO: Log exception + self.SvcStop() + +@@ -689,13 +689,13 @@ + #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 + + return True + +-class SystemWideLock(object): ++class SystemWideLock: + + def __init__(self, name): + self._mutex = win32event.CreateMutex(None, 0, name) +@@ -717,7 +717,7 @@ + def __del__(self): + win32api.CloseHandle(self._mutex) + +-class UserHelper(object): ++class UserHelper: + ACTION_OK = 0 + USER_EXISTS = 1 + ACTION_FAILED = -1 +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_commons/parallel_processing.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_commons/parallel_processing.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_commons/parallel_processing.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_commons/parallel_processing.py 2022-07-11 00:52:28.000000000 +0800 +@@ -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 @@ + SUCCESS = "SUCCESS" + FAILED = "FAILED" + +-class PrallelProcessResult(object): ++class PrallelProcessResult: + def __init__(self, element, status, result): + self.result = result + self.status = status +@@ -40,11 +40,11 @@ + self.element = element + self.params = params + self.queue = queue +- super(ParallelProcess, self).__init__() ++ super().__init__() + + def return_name(self): + ## NOTE: self.name is an attribute of multiprocessing.Process +- return "Process running function '%s' for element '%s'" % (self.function, self.element) ++ return "Process running function '{}' for element '{}'".format(self.function, self.element) + + def run(self): + try: +@@ -52,11 +52,11 @@ + self.queue.put(PrallelProcessResult(self.element, SUCCESS, result)) + except Exception as e: + self.queue.put(PrallelProcessResult(self.element, FAILED, +- "Exception while running function '%s' for '%s'. Reason : %s" % (self.function, self.element, str(e)))) ++ "Exception while running function '{}' for '{}'. Reason : {}".format(self.function, self.element, str(e)))) + return + + def execute_in_parallel(function, array, params, wait_for_all = False): +- logger.info("Started running %s for %s" % (function, array)) ++ logger.info("Started running {} for {}".format(function, array)) + processs = [] + q = Queue() + counter = len(array) +@@ -77,7 +77,7 @@ + for process in processs: + process.terminate() + +- logger.info("Finished running %s for %s" % (function, array)) ++ logger.info("Finished running {} for {}".format(function, array)) + + return results + +@@ -90,6 +90,6 @@ + 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 +\ 文件尾没有换行符 ++ print((results[result].element)) ++ print((results[result].status)) ++ print((results[result].result)) +\ 文件尾没有换行符 +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_commons/repo_manager/apt_manager.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_commons/repo_manager/apt_manager.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_commons/repo_manager/apt_manager.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_commons/repo_manager/apt_manager.py 2022-07-11 00:52:28.000000000 +0800 +@@ -185,7 +185,7 @@ + repo_ids.append(self.transform_baseurl_to_repoid(repo.base_url)) + + if repos.feat.scoped: +- Logger.info("Looking for matching packages in the following repositories: {0}".format(", ".join(repo_ids))) ++ Logger.info("Looking for matching packages in the following repositories: {}".format(", ".join(repo_ids))) + for repo_id in repo_ids: + for package in packages: + if repo_id in package[2]: +@@ -232,7 +232,7 @@ + pattern = re.compile("has missing dependency|E:") + + if r.code or (r.out and pattern.search(r.out)): +- err_msg = Logger.filter_text("Failed to verify package dependencies. Execution of '%s' returned %s. %s" % (self.properties.verify_dependency_cmd, r.code, r.out)) ++ err_msg = Logger.filter_text("Failed to verify package dependencies. Execution of '{}' returned {}. {}".format(self.properties.verify_dependency_cmd, r.code, r.out)) + Logger.error(err_msg) + return False + +@@ -260,9 +260,9 @@ + is_tmp_dir_created = False + if context.use_repos: + if 'base' in context.use_repos: +- use_repos = set([v for k, v in context.use_repos.items() if k != 'base']) ++ use_repos = {v for k, v in list(context.use_repos.items()) if k != 'base'} + else: +- cmd = cmd + ['-o', 'Dir::Etc::SourceList={0}'.format(self.properties.empty_file)] ++ cmd = cmd + ['-o', 'Dir::Etc::SourceList={}'.format(self.properties.empty_file)] + use_repos = set(context.use_repos.values()) + + if use_repos: +@@ -272,24 +272,24 @@ + + for repo in use_repos: + new_sources_file = os.path.join(apt_sources_list_tmp_dir, repo + '.list') +- Logger.info("Temporary sources file will be copied: {0}".format(new_sources_file)) ++ Logger.info("Temporary sources file will be copied: {}".format(new_sources_file)) + sudo.copy(os.path.join(self.properties.repo_definition_location, repo + '.list'), new_sources_file) + copied_sources_files.append(new_sources_file) + cmd = cmd + ['-o', 'Dir::Etc::SourceParts='.format(apt_sources_list_tmp_dir)] + + cmd = cmd + [name] +- Logger.info("Installing package {0} ('{1}')".format(name, shell.string_cmd_from_args_list(cmd))) ++ Logger.info("Installing package {} ('{}')".format(name, shell.string_cmd_from_args_list(cmd))) + shell.repository_manager_executor(cmd, self.properties, context, env=self.properties.install_cmd_env) + + if is_tmp_dir_created: + for temporary_sources_file in copied_sources_files: +- Logger.info("Removing temporary sources file: {0}".format(temporary_sources_file)) ++ Logger.info("Removing temporary sources file: {}".format(temporary_sources_file)) + os.remove(temporary_sources_file) + if apt_sources_list_tmp_dir: +- Logger.info("Removing temporary sources directory: {0}".format(apt_sources_list_tmp_dir)) ++ Logger.info("Removing temporary sources directory: {}".format(apt_sources_list_tmp_dir)) + os.rmdir(apt_sources_list_tmp_dir) + else: +- Logger.info("Skipping installation of existing package {0}".format(name)) ++ Logger.info("Skipping installation of existing package {}".format(name)) + + @replace_underscores + def upgrade_package(self, name, context): +@@ -319,10 +319,10 @@ + raise ValueError("Installation command were executed with no package name passed") + elif self._check_existence(name): + cmd = self.properties.remove_cmd[context.log_output] + [name] +- Logger.info("Removing package {0} ('{1}')".format(name, shell.string_cmd_from_args_list(cmd))) ++ Logger.info("Removing package {} ('{}')".format(name, shell.string_cmd_from_args_list(cmd))) + shell.repository_manager_executor(cmd, self.properties, context) + else: +- Logger.info("Skipping removal of non-existing package {0}".format(name)) ++ Logger.info("Skipping removal of non-existing package {}".format(name)) + + @replace_underscores + def _check_existence(self, name): +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_commons/repo_manager/apt_parser.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_commons/repo_manager/apt_parser.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_commons/repo_manager/apt_parser.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_commons/repo_manager/apt_parser.py 2022-07-11 00:52:28.000000000 +0800 +@@ -77,7 +77,7 @@ + MD5: 000000000000000000000000000 + """ + fields = {"Package": 0, "Version": 1, "File": 2} +- field_names = fields.keys() ++ field_names = list(fields.keys()) + field_count = len(field_names) + item_set = [None] * field_count + +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_commons/repo_manager/choco_manager.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_commons/repo_manager/choco_manager.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_commons/repo_manager/choco_manager.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_commons/repo_manager/choco_manager.py 2022-07-11 00:52:28.000000000 +0800 +@@ -63,7 +63,7 @@ + cmd = cmd + [enable_repo_option] + cmd = cmd + [name] + cmdString = " ".join(cmd) +- Logger.info("Installing package %s ('%s')" % (name, cmdString)) ++ Logger.info("Installing package {} ('{}')".format(name, cmdString)) + runner = shellRunner() + res = runner.run(cmd) + if res['exitCode'] != 0: +@@ -84,7 +84,7 @@ + cmd = cmd + [enable_repo_option] + cmd = cmd + [name] + cmdString = " ".join(cmd) +- Logger.info("Upgrading package %s ('%s')" % (name, cmdString)) ++ Logger.info("Upgrading package {} ('{}')".format(name, cmdString)) + runner = shellRunner() + res = runner.run(cmd) + if res['exitCode'] != 0: +@@ -101,7 +101,7 @@ + if self._check_existence(name, context): + cmd = REMOVE_CMD[context.log_output] + [name] + cmdString = " ".join(cmd) +- Logger.info("Removing package %s ('%s')" % (name, " ".join(cmd))) ++ Logger.info("Removing package {} ('{}')".format(name, " ".join(cmd))) + runner = shellRunner() + res = runner.run(cmd) + if res['exitCode'] != 0: +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_commons/repo_manager/generic_manager.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_commons/repo_manager/generic_manager.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_commons/repo_manager/generic_manager.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_commons/repo_manager/generic_manager.py 2022-07-11 00:52:28.000000000 +0800 +@@ -22,7 +22,7 @@ + from resource_management.core.logger import Logger + + +-class GenericManagerProperties(object): ++class GenericManagerProperties: + """ + Class to keep all Package-manager depended properties. Each non-generic implementation should override properties + declared here +@@ -54,7 +54,7 @@ + verify_dependency_cmd = None + + +-class GenericManager(object): ++class GenericManager: + """ + Interface for all custom implementations. Provides the required base for any custom manager, to be smoothly integrated + """ +@@ -247,5 +247,5 @@ + if isinstance(command, (list, tuple)): + command = " ".join(command) + +- Logger.error("Command execution error: command = \"{0}\", exit code = {1}, stderr = {2}".format( ++ Logger.error("Command execution error: command = \"{}\", exit code = {}, stderr = {}".format( + command, exit_code, "\n".join(error_log))) +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_commons/repo_manager/generic_parser.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_commons/repo_manager/generic_parser.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_commons/repo_manager/generic_parser.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_commons/repo_manager/generic_parser.py 2022-07-11 00:52:28.000000000 +0800 +@@ -25,7 +25,7 @@ + REMOVE_CHARS = "".join([chr(i) for i in range(0, 31) if i not in EXCLUDE_CHARS]) # exclude control characters + + +-class GenericParser(object): ++class GenericParser: + """ + Base for the any custom parser. New parser rules: + - no subprocess calls +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_commons/repo_manager/__init__.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_commons/repo_manager/__init__.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_commons/repo_manager/__init__.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_commons/repo_manager/__init__.py 2022-07-11 00:52:28.000000000 +0800 +@@ -28,7 +28,7 @@ + from .choco_manager import ChocoManager + + +-class ManagerFactory(object): ++class ManagerFactory: + __lock = threading.Lock() + + __repo_manager = None +@@ -68,4 +68,4 @@ + if OSCheck.is_in_family(os_family, OSConst.WINSRV_FAMILY): + return ChocoManager() + +- raise RuntimeError("Not able to create Repository Manager object for unsupported OS family {0}".format(os_family)) +\ 文件尾没有换行符 ++ raise RuntimeError("Not able to create Repository Manager object for unsupported OS family {}".format(os_family)) +\ 文件尾没有换行符 +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_commons/repo_manager/yum_manager.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_commons/repo_manager/yum_manager.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_commons/repo_manager/yum_manager.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_commons/repo_manager/yum_manager.py 2022-07-11 00:52:28.000000000 +0800 +@@ -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 +@@ -86,7 +86,7 @@ + repo_ids = [repo.repo_id for repo in repos.items] + + if repos.feat.scoped: +- Logger.info("Looking for matching packages in the following repositories: {0}".format(", ".join(repo_ids))) ++ Logger.info("Looking for matching packages in the following repositories: {}".format(", ".join(repo_ids))) + else: + Logger.info("Packages will be queried using all available repositories on the system.") + +@@ -100,7 +100,7 @@ + if repos.feat.scoped: + fallback_repo_ids = set(repo_ids) ^ self._build_repos_ids(repos) # no reason to scan the same repos again + if fallback_repo_ids: +- Logger.info("Adding fallback repositories: {0}".format(", ".join(fallback_repo_ids))) ++ Logger.info("Adding fallback repositories: {}".format(", ".join(fallback_repo_ids))) + + for repo in fallback_repo_ids: + available_packages.extend(self.available_packages(repo_filter=repo)) +@@ -189,7 +189,7 @@ + pattern = re.compile("has missing requires|Error:") + + if ret.code or (ret.out and pattern.search(ret.out)): +- err_msg = Logger.filter_text("Failed to verify package dependencies. Execution of '{0}' returned {1}. {2}".format( ++ err_msg = Logger.filter_text("Failed to verify package dependencies. Execution of '{}' returned {}. {}".format( + self.properties.verify_dependency_cmd, ret.code, ret.out)) + Logger.error(err_msg) + return False +@@ -215,10 +215,10 @@ + disable_repo_option = '--disablerepo=' + "*" if not context.skip_repos or len(context.skip_repos) == 0 else ','.join(context.skip_repos) + cmd = cmd + [disable_repo_option, enable_repo_option] + cmd = cmd + [name] +- Logger.info("Installing package {0} ('{1}')".format(name, shell.string_cmd_from_args_list(cmd))) ++ Logger.info("Installing package {} ('{}')".format(name, shell.string_cmd_from_args_list(cmd))) + shell.repository_manager_executor(cmd, self.properties, context) + else: +- Logger.info("Skipping installation of existing package {0}".format(name)) ++ Logger.info("Skipping installation of existing package {}".format(name)) + + def upgrade_package(self, name, context): + """ +@@ -249,10 +249,10 @@ + cmd = self.properties.remove_without_dependencies_cmd + [name] + else: + cmd = self.properties.remove_cmd[context.log_output] + [name] +- Logger.info("Removing package {0} ('{1}')".format(name, shell.string_cmd_from_args_list(cmd))) ++ Logger.info("Removing package {} ('{}')".format(name, shell.string_cmd_from_args_list(cmd))) + shell.repository_manager_executor(cmd, self.properties, context) + else: +- Logger.info("Skipping removal of non-existing package {0}".format(name)) ++ Logger.info("Skipping removal of non-existing package {}".format(name)) + + def _check_existence(self, name): + """ +@@ -325,7 +325,7 @@ + # 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: +@@ -406,7 +406,7 @@ + elif RPMTransactions.done in item: + transactions[tr_id].pkgs_done = pkgs_in_transaction + +- for tr in transactions.values(): ++ for tr in list(transactions.values()): + if len(tr.pkgs_all) == 0: + continue + +@@ -423,9 +423,9 @@ + transactions = list(self.uncomplete_transactions()) + + if len(transactions) > 0: +- Logger.info("Yum non-completed transactions check failed, found {0} non-completed transaction(s):".format(len(transactions))) ++ Logger.info("Yum non-completed transactions check failed, found {} non-completed transaction(s):".format(len(transactions))) + for tr in transactions: +- Logger.info("[{0}] Packages broken: {1}; Packages not-installed {2}".format( ++ Logger.info("[{}] Packages broken: {}; Packages not-installed {}".format( + tr.transaction_id, + ", ".join(tr.pkgs_done), + ", ".join(tr.pkgs_aborted) +@@ -454,7 +454,7 @@ + Logger.error(line) + + +-class YumTransactionItem(object): ++class YumTransactionItem: + def __init__(self, transaction_id, pkgs_done=None, pkgs_all=None): + self.transaction_id = transaction_id + self.pkgs_done = pkgs_done if pkgs_done else [] +@@ -465,7 +465,7 @@ + return set(self.pkgs_all) ^ set(self.pkgs_done) + + +-class RPMTransactions(object): ++class RPMTransactions: + all = "all" + done = "done" + aborted = "aborted" # custom one +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_commons/repo_manager/zypper_manager.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_commons/repo_manager/zypper_manager.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_commons/repo_manager/zypper_manager.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_commons/repo_manager/zypper_manager.py 2022-07-11 00:52:28.000000000 +0800 +@@ -75,7 +75,7 @@ + # as result repository would be matched if it contains package with same meta info + + if repos.feat.scoped: +- Logger.info("Looking for matching packages in the following repositories: {0}".format(", ".join(repo_ids))) ++ Logger.info("Looking for matching packages in the following repositories: {}".format(", ".join(repo_ids))) + for repo in repo_ids: + available_packages.extend(self.all_packages(repo_filter=repo)) + else: +@@ -162,10 +162,10 @@ + :rtype bool + """ + r = shell.subprocess_executor(self.properties.verify_dependency_cmd) +- pattern = re.compile("\d+ new package(s)? to install") ++ pattern = re.compile(r"\d+ new package(s)? to install") + + if r.code or (r.out and pattern.search(r.out)): +- err_msg = Logger.filter_text("Failed to verify package dependencies. Execution of '{0}' returned {1}. {2}".format( ++ err_msg = Logger.filter_text("Failed to verify package dependencies. Execution of '{}' returned {}. {}".format( + self.properties.verify_dependency_cmd, r.code, r.out)) + Logger.error(err_msg) + return False +@@ -190,7 +190,7 @@ + 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): +@@ -198,11 +198,11 @@ + cmd = cmd + use_repos_options + + cmd = cmd + [name] +- Logger.info("Installing package {0} ('{1}')".format(name, shell.string_cmd_from_args_list(cmd))) ++ Logger.info("Installing package {} ('{}')".format(name, shell.string_cmd_from_args_list(cmd))) + + shell.repository_manager_executor(cmd, self.properties, context) + else: +- Logger.info("Skipping installation of existing package {0}".format(name)) ++ Logger.info("Skipping installation of existing package {}".format(name)) + + def upgrade_package(self, name, context): + """ +@@ -230,10 +230,10 @@ + raise ValueError("Installation command were executed with no package name passed") + elif self._check_existence(name): + cmd = self.properties.remove_cmd[context.log_output] + [name] +- Logger.info("Removing package {0} ('{1}')".format(name, shell.string_cmd_from_args_list(cmd))) ++ Logger.info("Removing package {} ('{}')".format(name, shell.string_cmd_from_args_list(cmd))) + shell.repository_manager_executor(cmd, self.properties, context) + else: +- Logger.info("Skipping removal of non-existing package {0}".format(name)) ++ Logger.info("Skipping removal of non-existing package {}".format(name)) + + def get_active_base_repos(self): + enabled_repos = [] +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_commons/shell.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_commons/shell.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_commons/shell.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_commons/shell.py 2022-07-11 00:52:28.000000000 +0800 +@@ -61,12 +61,12 @@ + """ + + +-class ReaderStrategy(object): ++class ReaderStrategy: + BufferedQueue = 0 + BufferedChunks = 1 + + +-class SubprocessCallResult(object): ++class SubprocessCallResult: + """ + Holds response from subprocess call + """ +@@ -91,7 +91,7 @@ + return r + + +-class RepoCallContext(object): ++class RepoCallContext: + ignore_errors = True + __retry_count = 2 + retry_sleep = 30 +@@ -199,7 +199,7 @@ + tty.setraw(fd_write) # do not interpret control characters + stdout = fd_write + +- handles = super(PopenEx, self)._get_handles(stdin, stdout, stderr) ++ handles = super()._get_handles(stdin, stdout, stderr) + if len(handles) == 2: # python 2.7+ + handles, to_close = handles + else: +@@ -227,8 +227,8 @@ + if not command: + return "''" + +- if not isinstance(command, basestring): +- raise ValueError("Command should be a list of strings, found '{0}' in command list elements".format(str(command))) ++ if not isinstance(command, str): ++ raise ValueError("Command should be a list of strings, found '{}' in command list elements".format(str(command))) + + valid = set(string.ascii_letters + string.digits + '@%_-+=:,./') + for char in command: +@@ -278,9 +278,9 @@ + + # no way to execute shell command with bash pipes under sudo, it is fully dev responsibility + if not is_under_root() and not isinstance(command, str): +- command = "{0} -H -E {1}".format(AMBARI_SUDO_BINARY, string_cmd_from_args_list(command)) # core.shell.as_sudo ++ command = "{} -H -E {}".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)) ++ _logger.debug("Warning, command \"{}\" doesn't support sudo appending".format(command)) + + is_shell = not isinstance(command, (list, tuple)) + environ = copy.deepcopy(os.environ) +@@ -315,8 +315,7 @@ + ready, _, _ = select.select(read_queue, [], [], 1) + + if not is_cmd_up and not ready: +- for line in str_buffer.strip(os.linesep).split(os.linesep): +- yield line ++ yield from str_buffer.strip(os.linesep).split(os.linesep) + break + + # process one chunk of the data +@@ -333,8 +332,7 @@ + copy_offset = str_buffer.rindex(os.linesep) + buff_lines = str_buffer[:copy_offset] + str_buffer = str_buffer[copy_offset:] +- for line in buff_lines.strip(os.linesep).split(os.linesep): +- yield line ++ yield from buff_lines.strip(os.linesep).split(os.linesep) + + kill_timer.cancel() + +@@ -369,13 +367,13 @@ + if not data_chunk: + break + q.put(data_chunk) +- except IOError: ++ except OSError: + pass + finally: + q.notify_end() + try: + cmd.stdout.close() # close stdout if any exception appear before, triggering by this parent process shutdown +- except (IOError, OSError): ++ except OSError: + pass + + reader_th = threading.Thread(target=_reader) +@@ -506,7 +504,7 @@ + elif strategy == ReaderStrategy.BufferedChunks: + yield chunks_reader(cmd, kill_timer) + else: +- raise TypeError("Unknown reader strategy selected: {0}".format(strategy)) ++ raise TypeError("Unknown reader strategy selected: {}".format(strategy)) + + _exit_code = cmd.poll() + if _exit_code is None: +@@ -515,7 +513,7 @@ + if error_callback and cmd.returncode and cmd.returncode > 0: + error_callback(command, cmd.stderr.readlines(), cmd.returncode) + except Exception as e: +- _logger.error("Exception during command '{0}' execution: {1}".format(command, str(e))) ++ _logger.error("Exception during command '{}' execution: {}".format(command, str(e))) + if error_callback: + error_callback(command, [str(e)], -1) + +@@ -542,23 +540,23 @@ + + def read_children(pid): + try: +- with open(parent_pid_path_pattern.format(pid), "r") as f: ++ with open(parent_pid_path_pattern.format(pid)) as f: + return [int(item) for item in f.readline().strip().split(" ")] +- except (IOError, ValueError): ++ except (OSError, ValueError): + return [] + + def read_command(pid): + try: +- with open(comm_path_pattern.format(pid), "r") as f: ++ with open(comm_path_pattern.format(pid)) as f: + return f.readline().strip() +- except IOError: ++ except OSError: + return "" + + def read_cmdline(pid): + try: +- with open(cmdline_path_pattern.format(pid), "r") as f: ++ with open(cmdline_path_pattern.format(pid)) as f: + return f.readline().strip() +- except IOError: ++ except OSError: + return "" + + pids = [] +@@ -588,7 +586,7 @@ + + try: + all_existing_pid_list = [int(item) for item in os.listdir("/proc") if item.isdigit()] +- except (OSError, IOError): ++ except OSError: + _logger.debug("Failed to check PIDs existence") + return existing_pid_list + +@@ -649,7 +647,7 @@ + all_child_pids = [item[0] for item in full_child_pids if item[1].lower() not in exception_list and item[0] != os.getpid()] + error_log = [] + +- for sig_name, sig in signals_to_post.items(): ++ for sig_name, sig in list(signals_to_post.items()): + # we need to kill processes from the bottom of the tree + pids_to_kill = sorted(get_existing_pids(all_child_pids), reverse=True) + for pid in pids_to_kill: +@@ -662,7 +660,7 @@ + wait_for_process_list_kill(pids_to_kill) + still_existing_pids = get_existing_pids(pids_to_kill) + if still_existing_pids: +- _logger.warning("These PIDs {0} did not respond to {1} signal. Detailed commands list:\n {2}".format( ++ _logger.warning("These PIDs {} did not respond to {} signal. Detailed commands list:\n {}".format( + ", ".join([str(i) for i in still_existing_pids]), + sig_name, + "\n".join([i[2] for i in full_child_pids if i[0] in still_existing_pids]) +@@ -671,7 +669,7 @@ + if get_existing_pids(all_child_pids) and error_log: # we're unable to kill all requested PIDs + _logger.warn("Process termination error log:\n") + for error_item in error_log: +- _logger.warn("PID: {0}, Process: {1}, Exception message: {2}".format(*error_item)) ++ _logger.warn("PID: {}, Process: {}, Exception message: {}".format(*error_item)) + + + def __handle_retries(cmd, repo_properties, context, call_result, is_first_time, is_last_time): +@@ -743,7 +741,7 @@ + + should_stop_retries = __handle_retries(cmd, repo_properties, context, call_result, is_first_time, is_last_time) + if (is_last_time or should_stop_retries) and call_result.code != 0: +- message = "Failed to execute command '{0}', exited with code '{1}', message: '{2}'".format( ++ message = "Failed to execute command '{}', exited with code '{}', message: '{}'".format( + cmd if not isinstance(cmd, (list, tuple)) else " ".join(cmd), + call_result.code, call_result.error) + +@@ -759,7 +757,7 @@ + return call_result + + +-class shellRunner(object): ++class shellRunner: + def run(self, script, user=None): + pass + +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_commons/str_utils.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_commons/str_utils.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_commons/str_utils.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_commons/str_utils.py 2022-07-11 00:52:28.000000000 +0800 +@@ -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 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_commons/subprocess32.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_commons/subprocess32.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_commons/subprocess32.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_commons/subprocess32.py 2022-07-11 00:52:28.000000000 +0800 +@@ -5,7 +5,7 @@ + # 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. ++# See http://www.python.org/2.4/license for licensing details. + + r"""Subprocesses with accessible I/O streams + +@@ -35,21 +35,71 @@ + if return code is not 0 + check_output(...): Same as check_call() but returns the contents of + stdout instead of a return code ++getoutput(...): Runs a command in the shell, waits for it to complete, ++ then returns the output ++getstatusoutput(...): Runs a command in the shell, waits for it to complete, ++ then returns a (exitcode, output) tuple + """ + +-# because ambari_commons also has 'exceptions' module +-from __future__ import absolute_import +- +-import sys +-mswindows = (sys.platform == "win32") +- ++import builtins ++import errno ++import io + import os +-import exceptions +-import types + import time +-import traceback +-import gc + import signal ++import sys ++import threading ++import warnings ++import contextlib ++from time import monotonic as _time ++import types ++ ++try: ++ import pwd ++except ImportError: ++ pwd = None ++try: ++ import grp ++except ImportError: ++ grp = None ++ ++__all__ = ["Popen", "PIPE", "STDOUT", "call", "check_call", "getstatusoutput", ++ "getoutput", "check_output", "run", "CalledProcessError", "DEVNULL", ++ "SubprocessError", "TimeoutExpired", "CompletedProcess"] ++ # NOTE: We intentionally exclude list2cmdline as it is ++ # considered an internal implementation detail. issue10838. ++ ++try: ++ import msvcrt ++ import _winapi ++ _mswindows = True ++except ModuleNotFoundError: ++ _mswindows = False ++ import _posixsubprocess ++ import select ++ import selectors ++else: ++ from _winapi import (CREATE_NEW_CONSOLE, CREATE_NEW_PROCESS_GROUP, ++ STD_INPUT_HANDLE, STD_OUTPUT_HANDLE, ++ STD_ERROR_HANDLE, SW_HIDE, ++ STARTF_USESTDHANDLES, STARTF_USESHOWWINDOW, ++ ABOVE_NORMAL_PRIORITY_CLASS, BELOW_NORMAL_PRIORITY_CLASS, ++ HIGH_PRIORITY_CLASS, IDLE_PRIORITY_CLASS, ++ NORMAL_PRIORITY_CLASS, REALTIME_PRIORITY_CLASS, ++ CREATE_NO_WINDOW, DETACHED_PROCESS, ++ CREATE_DEFAULT_ERROR_MODE, CREATE_BREAKAWAY_FROM_JOB) ++ ++ __all__.extend(["CREATE_NEW_CONSOLE", "CREATE_NEW_PROCESS_GROUP", ++ "STD_INPUT_HANDLE", "STD_OUTPUT_HANDLE", ++ "STD_ERROR_HANDLE", "SW_HIDE", ++ "STARTF_USESTDHANDLES", "STARTF_USESHOWWINDOW", ++ "STARTUPINFO", ++ "ABOVE_NORMAL_PRIORITY_CLASS", "BELOW_NORMAL_PRIORITY_CLASS", ++ "HIGH_PRIORITY_CLASS", "IDLE_PRIORITY_CLASS", ++ "NORMAL_PRIORITY_CLASS", "REALTIME_PRIORITY_CLASS", ++ "CREATE_NO_WINDOW", "DETACHED_PROCESS", ++ "CREATE_DEFAULT_ERROR_MODE", "CREATE_BREAKAWAY_FROM_JOB"]) ++ + + # Exception classes used by this module. + class SubprocessError(Exception): pass +@@ -71,7 +121,7 @@ + def __str__(self): + if self.returncode and self.returncode < 0: + try: +- return "Command '%s' died with %r." % ( ++ return "Command '{}' died with {!r}.".format( + self.cmd, signal.Signals(-self.returncode)) + except ValueError: + return "Command '%s' died with unknown signal %d." % ( +@@ -80,19 +130,17 @@ + return "Command '%s' returned non-zero exit status %d." % ( + self.cmd, self.returncode) + +- #@property +- def __stdout_getter(self): ++ @property ++ def stdout(self): + """Alias for output attribute, to match stderr""" + return self.output + +- #@stdout.setter # Required Python 2.6 +- def __stdout_setter(self, value): ++ @stdout.setter ++ def stdout(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 +@@ -111,177 +159,186 @@ + return ("Command '%s' timed out after %s seconds" % + (self.cmd, self.timeout)) + +- #@property +- def __stdout_getter(self): ++ @property ++ def stdout(self): + return self.output + +- #@stdout.setter # Required Python 2.6 +- def __stdout_setter(self, value): ++ @stdout.setter ++ def stdout(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 ++if _mswindows: + 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 ++ def __init__(self, *, dwFlags=0, hStdInput=None, hStdOutput=None, ++ hStdError=None, wShowWindow=0, lpAttributeList=None): ++ self.dwFlags = dwFlags ++ self.hStdInput = hStdInput ++ self.hStdOutput = hStdOutput ++ self.hStdError = hStdError ++ self.wShowWindow = wShowWindow ++ self.lpAttributeList = lpAttributeList or {"handle_list": []} ++ ++ def copy(self): ++ attr_list = self.lpAttributeList.copy() ++ if 'handle_list' in attr_list: ++ attr_list['handle_list'] = list(attr_list['handle_list']) ++ ++ return STARTUPINFO(dwFlags=self.dwFlags, ++ hStdInput=self.hStdInput, ++ hStdOutput=self.hStdOutput, ++ hStdError=self.hStdError, ++ wShowWindow=self.wShowWindow, ++ lpAttributeList=attr_list) ++ ++ ++ class Handle(int): ++ closed = False ++ ++ def Close(self, CloseHandle=_winapi.CloseHandle): ++ if not self.closed: ++ self.closed = True ++ CloseHandle(self) ++ ++ def Detach(self): ++ if not self.closed: ++ self.closed = True ++ return int(self) ++ raise ValueError("already closed") + +- 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 ++ def __repr__(self): ++ return "%s(%d)" % (self.__class__.__name__, int(self)) + ++ __del__ = Close ++else: + # 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) ++ # poll/select have the advantage of not requiring any extra file ++ # descriptor, contrarily to epoll/kqueue (also, they require a single ++ # syscall). ++ if hasattr(selectors, 'PollSelector'): ++ _PopenSelector = selectors.PollSelector ++ else: ++ _PopenSelector = selectors.SelectSelector + +- 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 ++if _mswindows: ++ # On Windows we just need to close `Popen._handle` when we no longer need ++ # it, so that the kernel can free it. `Popen._handle` gets closed ++ # implicitly when the `Popen` instance is finalized (see `Handle.__del__`, ++ # which is calling `CloseHandle` as requested in [1]), so there is nothing ++ # for `_cleanup` to do. ++ # ++ # [1] https://docs.microsoft.com/en-us/windows/desktop/ProcThread/ ++ # creating-processes ++ _active = None + +- __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 ++ def _cleanup(): ++ pass ++else: ++ # 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(): ++ if _active is None: ++ return ++ for inst in _active[:]: ++ res = inst._internal_poll(_deadstate=sys.maxsize) ++ 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. ++ ++# XXX This function is only used by multiprocessing and the test suite, ++# but it's here so that it can be imported when Python is compiled without ++# threads. ++ ++def _optim_args_from_interpreter_flags(): ++ """Return a list of command-line arguments reproducing the current ++ optimization settings in sys.flags.""" ++ args = [] ++ value = sys.flags.optimize ++ if value > 0: ++ args.append('-' + 'O' * value) ++ return args ++ + + def _args_from_interpreter_flags(): + """Return a list of command-line arguments reproducing the current +- settings in sys.flags and sys.warnoptions.""" ++ settings in sys.flags, sys.warnoptions and sys._xoptions.""" + 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', ++ 'quiet': 'q', ++ # -O is handled in _optim_args_from_interpreter_flags() + } +- args = [] +- for flag, opt in flag_opt_map.items(): ++ args = _optim_args_from_interpreter_flags() ++ for flag, opt in list(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 + ++ if sys.flags.isolated: ++ args.append('-I') ++ else: ++ if sys.flags.ignore_environment: ++ args.append('-E') ++ if sys.flags.no_user_site: ++ args.append('-s') ++ ++ # -W options ++ warnopts = sys.warnoptions[:] ++ bytes_warning = sys.flags.bytes_warning ++ xoptions = getattr(sys, '_xoptions', {}) ++ dev_mode = ('dev' in xoptions) ++ ++ if bytes_warning > 1: ++ warnopts.remove("error::BytesWarning") ++ elif bytes_warning: ++ warnopts.remove("default::BytesWarning") ++ if dev_mode: ++ warnopts.remove('default') ++ for opt in warnopts: ++ args.append('-W' + opt) + +-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) +- ++ # -X options ++ if dev_mode: ++ args.extend(('-X', 'dev')) ++ for opt in ('faulthandler', 'tracemalloc', 'importtime', ++ 'showrefcount', 'utf8', 'oldparser'): ++ if opt in xoptions: ++ value = xoptions[opt] ++ if value is True: ++ arg = opt ++ else: ++ arg = '{}={}'.format(opt, value) ++ args.extend(('-X', arg)) + +-if hasattr(os, 'get_exec_path'): +- _get_exec_path = os.get_exec_path ++ return args + + +-def call(*popenargs, **kwargs): ++def call(*popenargs, timeout=None, **kwargs): + """Run command with arguments. Wait for command to complete or + timeout, then return the returncode attribute. + +@@ -289,14 +346,13 @@ + + 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 ++ with Popen(*popenargs, **kwargs) as p: ++ try: ++ return p.wait(timeout=timeout) ++ except: # Including KeyboardInterrupt, wait handled that. ++ p.kill() ++ # We don't call p.wait() again as p.__exit__ does that for us. ++ raise + + + def check_call(*popenargs, **kwargs): +@@ -318,8 +374,8 @@ + return 0 + + +-def check_output(*popenargs, **kwargs): +- r"""Run command with arguments and return its output as a byte string. ++def check_output(*popenargs, timeout=None, **kwargs): ++ r"""Run command with arguments and return its output. + + If the exit code was non-zero it raises a CalledProcessError. The + CalledProcessError object will have the return code in the returncode +@@ -328,7 +384,7 @@ + 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' ++ b'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. +@@ -336,27 +392,44 @@ + >>> check_output(["/bin/sh", "-c", + ... "ls -l non_existent_file ; exit 0"], + ... stderr=STDOUT) +- 'ls: non_existent_file: No such file or directory\n' ++ b'ls: non_existent_file: No such file or directory\n' ++ ++ There is an additional 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 too will be used internally. Example: ++ ++ >>> check_output(["sed", "-e", "s/foo/bar/"], ++ ... input=b"when in the course of fooman events\n") ++ b'when in the course of barman events\n' ++ ++ By default, all communication is in bytes, and therefore any "input" ++ should be bytes, and the return value will be bytes. If in text mode, ++ any "input" should be a string, and the return value will be a string ++ decoded according to locale encoding, or by "encoding" if set. Text mode ++ is triggered by setting any of text, encoding, errors or universal_newlines. + """ +- 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 ++ ++ if 'input' in kwargs and kwargs['input'] is None: ++ # Explicitly passing input=None was previously equivalent to passing an ++ # empty string. That is maintained here for backwards compatibility. ++ if kwargs.get('universal_newlines') or kwargs.get('text'): ++ empty = '' ++ else: ++ empty = b'' ++ kwargs['input'] = empty ++ ++ return run(*popenargs, stdout=PIPE, timeout=timeout, check=True, ++ **kwargs).stdout + + +-class CompletedProcess(object): ++class CompletedProcess: + """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. +@@ -378,6 +451,9 @@ + args.append('stderr={!r}'.format(self.stderr)) + return "{}({})".format(type(self).__name__, ', '.join(args)) + ++ __class_getitem__ = classmethod(types.GenericAlias) ++ ++ + def check_returncode(self): + """Raise CalledProcessError if the exit code is non-zero.""" + if self.returncode: +@@ -385,55 +461,72 @@ + self.stderr) + + +-def run(*popenargs, **kwargs): ++def run(*popenargs, ++ input=None, capture_output=False, timeout=None, check=False, **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 ++ pass bytes or 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. ++ ++ By default, all communication is in bytes, and therefore any "input" should ++ be bytes, and the stdout and stderr will be bytes. If in text mode, any ++ "input" should be a string, and stdout and stderr will be strings decoded ++ according to locale encoding, or by "encoding" if set. Text mode is ++ triggered by setting any of text, encoding, errors or universal_newlines. ++ + 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: ++ if kwargs.get('stdin') is not None: + 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" ++ if capture_output: ++ if kwargs.get('stdout') is not None or kwargs.get('stderr') is not None: ++ raise ValueError('stdout and stderr arguments may not be used ' ++ 'with capture_output.') ++ kwargs['stdout'] = PIPE ++ kwargs['stderr'] = PIPE ++ ++ with Popen(*popenargs, **kwargs) as process: + try: + stdout, stderr = process.communicate(input, timeout=timeout) +- except TimeoutExpired: ++ except TimeoutExpired as exc: + process.kill() +- stdout, stderr = process.communicate() +- raise TimeoutExpired(process.args, timeout, output=stdout, +- stderr=stderr) +- except: ++ if _mswindows: ++ # Windows accumulates the output in a single blocking ++ # read() call run on child threads, with the timeout ++ # being done in a join() on those threads. communicate() ++ # _after_ kill() is required to collect that and add it ++ # to the exception. ++ exc.stdout, exc.stderr = process.communicate() ++ else: ++ # POSIX _communicate already populated the output so ++ # far into the TimeoutExpired exception. ++ process.wait() ++ raise ++ except: # Including KeyboardInterrupt, communicate handled that. + process.kill() +- process.wait() ++ # We don't call process.wait() as .__exit__ does that for us. + 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) + + +@@ -469,7 +562,7 @@ + # "Parsing C++ Command-Line Arguments" + result = [] + needquote = False +- for arg in seq: ++ for arg in map(os.fsdecode, seq): + bs_buf = [] + + # Add a space to separate this argument from the others +@@ -507,17 +600,167 @@ + return ''.join(result) + + +-_PLATFORM_DEFAULT_CLOSE_FDS = object() ++# Various tools for executing commands and looking at their output and status. ++# ++ ++def getstatusoutput(cmd): ++ """Return (exitcode, output) of executing cmd in a shell. ++ ++ Execute the string 'cmd' in a shell with 'check_output' and ++ return a 2-tuple (status, output). The locale encoding is used ++ to decode the output and process newlines. ++ ++ A trailing newline is stripped from the output. ++ The exit status for the command can be interpreted ++ according to the rules for the function 'wait'. Example: ++ ++ >>> import subprocess ++ >>> subprocess.getstatusoutput('ls /bin/ls') ++ (0, '/bin/ls') ++ >>> subprocess.getstatusoutput('cat /bin/junk') ++ (1, 'cat: /bin/junk: No such file or directory') ++ >>> subprocess.getstatusoutput('/bin/junk') ++ (127, 'sh: /bin/junk: not found') ++ >>> subprocess.getstatusoutput('/bin/kill $$') ++ (-15, '') ++ """ ++ try: ++ data = check_output(cmd, shell=True, text=True, stderr=STDOUT) ++ exitcode = 0 ++ except CalledProcessError as ex: ++ data = ex.output ++ exitcode = ex.returncode ++ if data[-1:] == '\n': ++ data = data[:-1] ++ return exitcode, data ++ ++def getoutput(cmd): ++ """Return output (stdout or stderr) of executing cmd in a shell. ++ ++ Like getstatusoutput(), except the exit status is ignored and the return ++ value is a string containing the command's output. Example: ++ ++ >>> import subprocess ++ >>> subprocess.getoutput('ls /bin/ls') ++ '/bin/ls' ++ """ ++ return getstatusoutput(cmd)[1] ++ ++ ++def _use_posix_spawn(): ++ """Check if posix_spawn() can be used for subprocess. ++ ++ subprocess requires a posix_spawn() implementation that properly reports ++ errors to the parent process, & sets errno on the following failures: ++ ++ * Process attribute actions failed. ++ * File actions failed. ++ * exec() failed. ++ ++ Prefer an implementation which can use vfork() in some cases for best ++ performance. ++ """ ++ if _mswindows or not hasattr(os, 'posix_spawn'): ++ # os.posix_spawn() is not available ++ return False ++ ++ if sys.platform == 'darwin': ++ # posix_spawn() is a syscall on macOS and properly reports errors ++ return True ++ ++ # Check libc name and runtime libc version ++ try: ++ ver = os.confstr('CS_GNU_LIBC_VERSION') ++ # parse 'glibc 2.28' as ('glibc', (2, 28)) ++ parts = ver.split(maxsplit=1) ++ if len(parts) != 2: ++ # reject unknown format ++ raise ValueError ++ libc = parts[0] ++ version = tuple(map(int, parts[1].split('.'))) ++ ++ if sys.platform == 'linux' and libc == 'glibc' and version >= (2, 24): ++ # glibc 2.24 has a new Linux posix_spawn implementation using vfork ++ # which properly reports errors to the parent process. ++ return True ++ # Note: Don't use the implementation in earlier glibc because it doesn't ++ # use vfork (even if glibc 2.26 added a pipe to properly report errors ++ # to the parent process). ++ except (AttributeError, ValueError, OSError): ++ # os.confstr() or CS_GNU_LIBC_VERSION value not available ++ pass ++ ++ # By default, assume that posix_spawn() does not properly report errors. ++ return False ++ ++ ++_USE_POSIX_SPAWN = _use_posix_spawn() ++ ++ ++class Popen: ++ """ Execute a child program in a new process. ++ ++ For a complete description of the arguments see the Python documentation. ++ ++ Arguments: ++ args: A string, or a sequence of program arguments. ++ ++ bufsize: supplied as the buffering argument to the open() function when ++ creating the stdin/stdout/stderr pipe file objects ++ ++ executable: A replacement program to execute. ++ ++ stdin, stdout and stderr: These specify the executed programs' standard ++ input, standard output and standard error file handles, respectively. ++ ++ preexec_fn: (POSIX only) An object to be called in the child process ++ just before the child is executed. ++ ++ close_fds: Controls closing or inheriting of file descriptors. ++ ++ shell: If true, the command will be executed through the shell. ++ ++ cwd: Sets the current directory before the child is executed. ++ ++ env: Defines the environment variables for the new process. ++ ++ text: If true, decode stdin, stdout and stderr using the given encoding ++ (if set) or the system default otherwise. ++ ++ universal_newlines: Alias of text, provided for backwards compatibility. ++ ++ startupinfo and creationflags (Windows only) ++ ++ restore_signals (POSIX only) ++ ++ start_new_session (POSIX only) ++ ++ group (POSIX only) + ++ extra_groups (POSIX only) + +-class Popen(object): +- def __init__(self, args, bufsize=0, executable=None, ++ user (POSIX only) ++ ++ umask (POSIX only) ++ ++ pass_fds (POSIX only) ++ ++ encoding and errors: Text mode encoding and error handling to use for ++ file objects stdin, stdout and stderr. ++ ++ Attributes: ++ stdin, stdout, stderr, pid, returncode ++ """ ++ _child_created = False # Set here since __del__ checks it ++ ++ def __init__(self, args, bufsize=-1, 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, ++ preexec_fn=None, close_fds=True, ++ shell=False, cwd=None, env=None, universal_newlines=None, + startupinfo=None, creationflags=0, + restore_signals=True, start_new_session=False, +- pass_fds=()): ++ pass_fds=(), *, user=None, group=None, extra_groups=None, ++ encoding=None, errors=None, text=None, umask=-1): + """Create new Popen instance.""" + _cleanup() + # Held while anything is calling waitpid before returncode has been +@@ -527,31 +770,19 @@ + # 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)): ++ if bufsize is None: ++ bufsize = -1 # Restore default ++ if not isinstance(bufsize, int): + raise TypeError("bufsize must be an integer") + +- if mswindows: ++ 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 +@@ -568,7 +799,15 @@ + self.stderr = None + self.pid = None + self.returncode = None +- self.universal_newlines = universal_newlines ++ self.encoding = encoding ++ self.errors = errors ++ ++ # Validate the combinations of text and universal_newlines ++ if (text is not None and universal_newlines is not None ++ and bool(universal_newlines) != bool(text)): ++ raise SubprocessError('Cannot disambiguate when both text ' ++ 'and universal_newlines are supplied but ' ++ 'different. Pass one or the other.') + + # Input and output objects. The general principle is like + # this: +@@ -589,7 +828,11 @@ + c2pread, c2pwrite, + errread, errwrite) = self._get_handles(stdin, stdout, stderr) + +- if mswindows: ++ # We wrap OS handles *before* launching the child, otherwise a ++ # quickly terminating child could make our fds unwrappable ++ # (see #8458). ++ ++ if _mswindows: + if p2cwrite != -1: + p2cwrite = msvcrt.open_osfhandle(p2cwrite.Detach(), 0) + if c2pread != -1: +@@ -597,149 +840,324 @@ + 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.text_mode = encoding or errors or text or universal_newlines ++ ++ # How long to resume waiting on a child after the first ^C. ++ # There is no right value for this. The purpose is to be polite ++ # yet remain good for interactive users trying to exit a tool. ++ self._sigint_wait_secs = 0.25 # 1/xkcd221.getRandomNumber() + + self._closed_child_pipe_fds = False +- exception_cleanup_needed = False ++ ++ if self.text_mode: ++ if bufsize == 1: ++ line_buffering = True ++ # Use the default buffer size for the underlying binary streams ++ # since they don't support line buffering. ++ bufsize = -1 ++ else: ++ line_buffering = False ++ ++ gid = None ++ if group is not None: ++ if not hasattr(os, 'setregid'): ++ raise ValueError("The 'group' parameter is not supported on the " ++ "current platform") ++ ++ elif isinstance(group, str): ++ if grp is None: ++ raise ValueError("The group parameter cannot be a string " ++ "on systems without the grp module") ++ ++ gid = grp.getgrnam(group).gr_gid ++ elif isinstance(group, int): ++ gid = group ++ else: ++ raise TypeError("Group must be a string or an integer, not {}" ++ .format(type(group))) ++ ++ if gid < 0: ++ raise ValueError(f"Group ID cannot be negative, got {gid}") ++ ++ gids = None ++ if extra_groups is not None: ++ if not hasattr(os, 'setgroups'): ++ raise ValueError("The 'extra_groups' parameter is not " ++ "supported on the current platform") ++ ++ elif isinstance(extra_groups, str): ++ raise ValueError("Groups must be a list, not a string") ++ ++ gids = [] ++ for extra_group in extra_groups: ++ if isinstance(extra_group, str): ++ if grp is None: ++ raise ValueError("Items in extra_groups cannot be " ++ "strings on systems without the " ++ "grp module") ++ ++ gids.append(grp.getgrnam(extra_group).gr_gid) ++ elif isinstance(extra_group, int): ++ gids.append(extra_group) ++ else: ++ raise TypeError("Items in extra_groups must be a string " ++ "or integer, not {}" ++ .format(type(extra_group))) ++ ++ # make sure that the gids are all positive here so we can do less ++ # checking in the C code ++ for gid_check in gids: ++ if gid_check < 0: ++ raise ValueError(f"Group ID cannot be negative, got {gid_check}") ++ ++ uid = None ++ if user is not None: ++ if not hasattr(os, 'setreuid'): ++ raise ValueError("The 'user' parameter is not supported on " ++ "the current platform") ++ ++ elif isinstance(user, str): ++ if pwd is None: ++ raise ValueError("The user parameter cannot be a string " ++ "on systems without the pwd module") ++ ++ uid = pwd.getpwnam(user).pw_uid ++ elif isinstance(user, int): ++ uid = user ++ else: ++ raise TypeError("User must be a string or an integer") ++ ++ if uid < 0: ++ raise ValueError(f"User ID cannot be negative, got {uid}") ++ + 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)): ++ if p2cwrite != -1: ++ self.stdin = open(p2cwrite, 'wb', bufsize) ++ if self.text_mode: ++ self.stdin = io.TextIOWrapper(self.stdin, write_through=True, ++ line_buffering=line_buffering, ++ encoding=encoding, errors=errors) ++ if c2pread != -1: ++ self.stdout = open(c2pread, 'rb', bufsize) ++ if self.text_mode: ++ self.stdout = io.TextIOWrapper(self.stdout, ++ encoding=encoding, errors=errors) ++ if errread != -1: ++ self.stderr = open(errread, 'rb', bufsize) ++ if self.text_mode: ++ self.stderr = io.TextIOWrapper(self.stderr, ++ encoding=encoding, errors=errors) ++ ++ self._execute_child(args, executable, preexec_fn, close_fds, ++ pass_fds, cwd, env, ++ startupinfo, creationflags, shell, ++ p2cread, p2cwrite, ++ c2pread, c2pwrite, ++ errread, errwrite, ++ restore_signals, ++ gid, gids, uid, umask, ++ start_new_session) ++ except: ++ # Cleanup if the child failed starting. ++ for f in [_f for _f in (self.stdin, self.stdout, self.stderr) if _f]: ++ try: ++ f.close() ++ except OSError: ++ 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: +- 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: ++ if _mswindows and isinstance(fd, Handle): ++ fd.Close() ++ else: + os.close(fd) +- except EnvironmentError: +- pass ++ except OSError: ++ pass ++ ++ raise ++ ++ def __repr__(self): ++ obj_repr = ( ++ f"<{self.__class__.__name__}: " ++ f"returncode: {self.returncode} args: {self.args!r}>" ++ ) ++ if len(obj_repr) > 80: ++ obj_repr = obj_repr[:76] + "...>" ++ return obj_repr ++ ++ __class_getitem__ = classmethod(types.GenericAlias) ++ ++ @property ++ def universal_newlines(self): ++ # universal_newlines as retained as an alias of text_mode for API ++ # compatibility. bpo-31756 ++ return self.text_mode ++ ++ @universal_newlines.setter ++ def universal_newlines(self, universal_newlines): ++ self.text_mode = bool(universal_newlines) ++ ++ def _translate_newlines(self, data, encoding, errors): ++ data = data.decode(encoding, errors) ++ return data.replace("\r\n", "\n").replace("\r", "\n") + + def __enter__(self): + return self + +- def __exit__(self, type, value, traceback): ++ def __exit__(self, exc_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 ++ try: # Flushing a BufferedWriter may raise an error ++ if self.stdin: ++ self.stdin.close() ++ finally: ++ if exc_type == KeyboardInterrupt: ++ # https://bugs.python.org/issue25942 ++ # In the case of a KeyboardInterrupt we assume the SIGINT ++ # was also already sent to our child processes. We can't ++ # block indefinitely as that is not user friendly. ++ # If we have not already waited a brief amount of time in ++ # an interrupted .wait() or .communicate() call, do so here ++ # for consistency. ++ if self._sigint_wait_secs > 0: ++ try: ++ self._wait(timeout=self._sigint_wait_secs) ++ except TimeoutExpired: ++ pass ++ self._sigint_wait_secs = 0 # Note that this has been done. ++ return # resume the KeyboardInterrupt + ++ # Wait for the process to terminate, to avoid zombies. ++ self.wait() + +- 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): ++ def __del__(self, _maxsize=sys.maxsize, _warn=warnings.warn): ++ if not self._child_created: + # We didn't get to successfully create a child process. + return ++ if self.returncode is None: ++ # Not reading subprocess exit status creates a zombie process which ++ # is only destroyed at the parent python process exit ++ _warn("subprocess %s is still running" % self.pid, ++ ResourceWarning, source=self) + # In case the child hasn't been waited on, check if it's done. +- self._internal_poll(_deadstate=_maxint) ++ self._internal_poll(_deadstate=_maxsize) + 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 _stdin_write(self, input): ++ if input: ++ try: ++ self.stdin.write(input) ++ except BrokenPipeError: ++ pass # communicate() must ignore broken pipe errors. ++ except OSError as exc: ++ if exc.errno == errno.EINVAL: ++ # bpo-19612, bpo-30418: On Windows, stdin.write() fails ++ # with EINVAL if the child process exited or if the child ++ # process is still running but closed the pipe. ++ pass ++ else: ++ raise + +- 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. ++ try: ++ self.stdin.close() ++ except BrokenPipeError: ++ pass # communicate() must ignore broken pipe errors. ++ except OSError as exc: ++ if exc.errno == errno.EINVAL: ++ pass ++ else: ++ raise + +- communicate() returns a tuple (stdout, stderr).""" ++ def communicate(self, input=None, timeout=None): ++ """Interact with process: Send data to stdin and close it. ++ Read data from stdout and stderr, until end-of-file is ++ reached. Wait for process to terminate. ++ ++ The optional "input" argument should be data to be sent to the ++ child process, or None, if no data should be sent to the child. ++ communicate() returns a tuple (stdout, stderr). ++ ++ By default, all communication is in bytes, and therefore any ++ "input" should be bytes, and the (stdout, stderr) will be bytes. ++ If in text mode (indicated by self.text_mode), any "input" should ++ be a string, and (stdout, stderr) will be strings decoded ++ according to locale encoding, or by "encoding" if set. Text mode ++ is triggered by setting any of text, encoding, errors or ++ universal_newlines. ++ """ + + 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 ++ if (timeout 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() ++ self._stdin_write(input) + elif self.stdout: +- stdout = _eintr_retry_call(self.stdout.read) ++ stdout = self.stdout.read() + self.stdout.close() + elif self.stderr: +- stderr = _eintr_retry_call(self.stderr.read) ++ stderr = self.stderr.read() + self.stderr.close() + self.wait() +- return (stdout, stderr) ++ else: ++ if timeout is not None: ++ endtime = _time() + timeout ++ else: ++ endtime = None + +- try: +- stdout, stderr = self._communicate(input, endtime, timeout) +- finally: +- self._communication_started = True ++ try: ++ stdout, stderr = self._communicate(input, endtime, timeout) ++ except KeyboardInterrupt: ++ # https://bugs.python.org/issue25942 ++ # See the detailed comment in .wait(). ++ if timeout is not None: ++ sigint_timeout = min(self._sigint_wait_secs, ++ self._remaining_time(endtime)) ++ else: ++ sigint_timeout = self._sigint_wait_secs ++ self._sigint_wait_secs = 0 # nothing else should wait. ++ try: ++ self._wait(timeout=sigint_timeout) ++ except TimeoutExpired: ++ pass ++ raise # resume the KeyboardInterrupt ++ ++ finally: ++ self._communication_started = True + +- sts = self.wait(timeout=self._remaining_time(endtime)) ++ sts = self.wait(timeout=self._remaining_time(endtime)) + + return (stdout, stderr) + + + def poll(self): ++ """Check if child process has terminated. Set and return returncode ++ attribute.""" + return self._internal_poll() + + +@@ -748,18 +1166,74 @@ + if endtime is None: + return None + else: +- return endtime - time.time() ++ return endtime - _time() + + +- def _check_timeout(self, endtime, orig_timeout): ++ def _check_timeout(self, endtime, orig_timeout, stdout_seq, stderr_seq, ++ skip_check_and_raise=False): + """Convenience for checking if a timeout has expired.""" + if endtime is None: + return +- if time.time() > endtime: +- raise TimeoutExpired(self.args, orig_timeout) ++ if skip_check_and_raise or _time() > endtime: ++ raise TimeoutExpired( ++ self.args, orig_timeout, ++ output=b''.join(stdout_seq) if stdout_seq else None, ++ stderr=b''.join(stderr_seq) if stderr_seq else None) ++ ++ ++ def wait(self, timeout=None): ++ """Wait for child process to terminate; returns self.returncode.""" ++ if timeout is not None: ++ endtime = _time() + timeout ++ try: ++ return self._wait(timeout=timeout) ++ except KeyboardInterrupt: ++ # https://bugs.python.org/issue25942 ++ # The first keyboard interrupt waits briefly for the child to ++ # exit under the common assumption that it also received the ^C ++ # generated SIGINT and will exit rapidly. ++ if timeout is not None: ++ sigint_timeout = min(self._sigint_wait_secs, ++ self._remaining_time(endtime)) ++ else: ++ sigint_timeout = self._sigint_wait_secs ++ self._sigint_wait_secs = 0 # nothing else should wait. ++ try: ++ self._wait(timeout=sigint_timeout) ++ except TimeoutExpired: ++ pass ++ raise # resume the KeyboardInterrupt ++ ++ def _close_pipe_fds(self, ++ p2cread, p2cwrite, ++ c2pread, c2pwrite, ++ errread, errwrite): ++ # self._devnull is not always defined. ++ devnull_fd = getattr(self, '_devnull', None) ++ ++ with contextlib.ExitStack() as stack: ++ if _mswindows: ++ if p2cread != -1: ++ stack.callback(p2cread.Close) ++ if c2pwrite != -1: ++ stack.callback(c2pwrite.Close) ++ if errwrite != -1: ++ stack.callback(errwrite.Close) ++ else: ++ if p2cread != -1 and p2cwrite != -1 and p2cread != devnull_fd: ++ stack.callback(os.close, p2cread) ++ if c2pwrite != -1 and c2pread != -1 and c2pwrite != devnull_fd: ++ stack.callback(os.close, c2pwrite) ++ if errwrite != -1 and errread != -1 and errwrite != devnull_fd: ++ stack.callback(os.close, errwrite) ++ ++ if devnull_fd is not None: ++ stack.callback(os.close, devnull_fd) + ++ # Prevent a double close of these handles/fds from __init__ on error. ++ self._closed_child_pipe_fds = True + +- if mswindows: ++ if _mswindows: + # + # Windows methods + # +@@ -775,11 +1249,14 @@ + errread, errwrite = -1, -1 + + if stdin is None: +- p2cread = _subprocess.GetStdHandle(_subprocess.STD_INPUT_HANDLE) ++ p2cread = _winapi.GetStdHandle(_winapi.STD_INPUT_HANDLE) + if p2cread is None: +- p2cread, _ = _subprocess.CreatePipe(None, 0) ++ p2cread, _ = _winapi.CreatePipe(None, 0) ++ p2cread = Handle(p2cread) ++ _winapi.CloseHandle(_) + elif stdin == PIPE: +- p2cread, p2cwrite = _subprocess.CreatePipe(None, 0) ++ p2cread, p2cwrite = _winapi.CreatePipe(None, 0) ++ p2cread, p2cwrite = Handle(p2cread), Handle(p2cwrite) + elif stdin == DEVNULL: + p2cread = msvcrt.get_osfhandle(self._get_devnull()) + elif isinstance(stdin, int): +@@ -790,11 +1267,14 @@ + p2cread = self._make_inheritable(p2cread) + + if stdout is None: +- c2pwrite = _subprocess.GetStdHandle(_subprocess.STD_OUTPUT_HANDLE) ++ c2pwrite = _winapi.GetStdHandle(_winapi.STD_OUTPUT_HANDLE) + if c2pwrite is None: +- _, c2pwrite = _subprocess.CreatePipe(None, 0) ++ _, c2pwrite = _winapi.CreatePipe(None, 0) ++ c2pwrite = Handle(c2pwrite) ++ _winapi.CloseHandle(_) + elif stdout == PIPE: +- c2pread, c2pwrite = _subprocess.CreatePipe(None, 0) ++ c2pread, c2pwrite = _winapi.CreatePipe(None, 0) ++ c2pread, c2pwrite = Handle(c2pread), Handle(c2pwrite) + elif stdout == DEVNULL: + c2pwrite = msvcrt.get_osfhandle(self._get_devnull()) + elif isinstance(stdout, int): +@@ -805,11 +1285,14 @@ + c2pwrite = self._make_inheritable(c2pwrite) + + if stderr is None: +- errwrite = _subprocess.GetStdHandle(_subprocess.STD_ERROR_HANDLE) ++ errwrite = _winapi.GetStdHandle(_winapi.STD_ERROR_HANDLE) + if errwrite is None: +- _, errwrite = _subprocess.CreatePipe(None, 0) ++ _, errwrite = _winapi.CreatePipe(None, 0) ++ errwrite = Handle(errwrite) ++ _winapi.CloseHandle(_) + elif stderr == PIPE: +- errread, errwrite = _subprocess.CreatePipe(None, 0) ++ errread, errwrite = _winapi.CreatePipe(None, 0) ++ errread, errwrite = Handle(errread), Handle(errwrite) + elif stderr == STDOUT: + errwrite = c2pwrite + elif stderr == DEVNULL: +@@ -828,89 +1311,120 @@ + + 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 ++ h = _winapi.DuplicateHandle( ++ _winapi.GetCurrentProcess(), handle, ++ _winapi.GetCurrentProcess(), 0, 1, ++ _winapi.DUPLICATE_SAME_ACCESS) ++ return Handle(h) ++ ++ ++ def _filter_handle_list(self, handle_list): ++ """Filter out console handles that can't be used ++ in lpAttributeList["handle_list"] and make sure the list ++ isn't empty. This also removes duplicate handles.""" ++ # An handle with it's lowest two bits set might be a special console ++ # handle that if passed in lpAttributeList["handle_list"], will ++ # cause it to fail. ++ return list({handle for handle in handle_list ++ if handle & 0x3 != 0x3 ++ or _winapi.GetFileType(handle) != ++ _winapi.FILE_TYPE_CHAR}) + + + def _execute_child(self, args, executable, preexec_fn, close_fds, +- pass_fds, cwd, env, universal_newlines, ++ pass_fds, cwd, env, + startupinfo, creationflags, shell, + p2cread, p2cwrite, + c2pread, c2pwrite, + errread, errwrite, +- unused_restore_signals, unused_start_new_session): ++ unused_restore_signals, ++ unused_gid, unused_gids, unused_uid, ++ unused_umask, ++ 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): ++ if isinstance(args, str): ++ pass ++ elif isinstance(args, bytes): ++ if shell: ++ raise TypeError('bytes args is not allowed on Windows') ++ args = list2cmdline([args]) ++ elif isinstance(args, os.PathLike): ++ if shell: ++ raise TypeError('path-like args is not allowed when ' ++ 'shell is true') ++ args = list2cmdline([args]) ++ else: + args = list2cmdline(args) + ++ if executable is not None: ++ executable = os.fsdecode(executable) ++ + # Process startup details + if startupinfo is None: + startupinfo = STARTUPINFO() +- if -1 not in (p2cread, c2pwrite, errwrite): +- startupinfo.dwFlags |= _subprocess.STARTF_USESTDHANDLES ++ else: ++ # bpo-34044: Copy STARTUPINFO since it is modified above, ++ # so the caller can reuse it multiple times. ++ startupinfo = startupinfo.copy() ++ ++ use_std_handles = -1 not in (p2cread, c2pwrite, errwrite) ++ if use_std_handles: ++ startupinfo.dwFlags |= _winapi.STARTF_USESTDHANDLES + startupinfo.hStdInput = p2cread + startupinfo.hStdOutput = c2pwrite + startupinfo.hStdError = errwrite + ++ attribute_list = startupinfo.lpAttributeList ++ have_handle_list = bool(attribute_list and ++ "handle_list" in attribute_list and ++ attribute_list["handle_list"]) ++ ++ # If we were given an handle_list or need to create one ++ if have_handle_list or (use_std_handles and close_fds): ++ if attribute_list is None: ++ attribute_list = startupinfo.lpAttributeList = {} ++ handle_list = attribute_list["handle_list"] = \ ++ list(attribute_list.get("handle_list", [])) ++ ++ if use_std_handles: ++ handle_list += [int(p2cread), int(c2pwrite), int(errwrite)] ++ ++ handle_list[:] = self._filter_handle_list(handle_list) ++ ++ if handle_list: ++ if not close_fds: ++ warnings.warn("startupinfo.lpAttributeList['handle_list'] " ++ "overriding close_fds", RuntimeWarning) ++ ++ # When using the handle_list we always request to inherit ++ # handles but the only handles that will be inherited are ++ # the ones in the handle_list ++ close_fds = False ++ + if shell: +- startupinfo.dwFlags |= _subprocess.STARTF_USESHOWWINDOW +- startupinfo.wShowWindow = _subprocess.SW_HIDE ++ startupinfo.dwFlags |= _winapi.STARTF_USESHOWWINDOW ++ startupinfo.wShowWindow = _winapi.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 ++ args = '{} /c "{}"'.format (comspec, args) ++ ++ if cwd is not None: ++ cwd = os.fsdecode(cwd) ++ ++ sys.audit("subprocess.Popen", executable, args, cwd, env) + + # 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) ++ hp, ht, pid, tid = _winapi.CreateProcess(executable, args, ++ # no special security ++ None, None, ++ int(not close_fds), ++ creationflags, ++ env, ++ cwd, ++ startupinfo) + finally: + # Child is launched. Close the parent's copy of those pipe + # handles that only the child should have open. You need +@@ -918,25 +1432,20 @@ + # 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) ++ self._close_pipe_fds(p2cread, p2cwrite, ++ c2pread, c2pwrite, ++ errread, errwrite) + + # Retain the process handle, but close the thread handle + self._child_created = True +- self._handle = hp ++ self._handle = Handle(hp) + self.pid = pid +- ht.Close() ++ _winapi.CloseHandle(ht) + + def _internal_poll(self, _deadstate=None, +- _WaitForSingleObject=_subprocess.WaitForSingleObject, +- _WAIT_OBJECT_0=_subprocess.WAIT_OBJECT_0, +- _GetExitCodeProcess=_subprocess.GetExitCodeProcess): ++ _WaitForSingleObject=_winapi.WaitForSingleObject, ++ _WAIT_OBJECT_0=_winapi.WAIT_OBJECT_0, ++ _GetExitCodeProcess=_winapi.GetExitCodeProcess): + """Check if child process has terminated. Returns returncode + attribute. + +@@ -950,20 +1459,19 @@ + 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) ++ def _wait(self, timeout): ++ """Internal implementation of wait() on Windows.""" + if timeout is None: +- timeout = _subprocess.INFINITE ++ timeout_millis = _winapi.INFINITE + else: +- timeout = int(timeout * 1000) ++ timeout_millis = int(timeout * 1000) + if self.returncode is None: +- result = _subprocess.WaitForSingleObject(self._handle, timeout) +- if result == _WAIT_TIMEOUT: ++ # API note: Returns immediately if timeout_millis == 0. ++ result = _winapi.WaitForSingleObject(self._handle, ++ timeout_millis) ++ if result == _winapi.WAIT_TIMEOUT: + raise TimeoutExpired(self.args, timeout) +- self.returncode = _subprocess.GetExitCodeProcess(self._handle) ++ self.returncode = _winapi.GetExitCodeProcess(self._handle) + return self.returncode + + +@@ -991,20 +1499,18 @@ + self.stderr_thread.start() + + if self.stdin: +- if input is not None: +- self.stdin.write(input) +- self.stdin.close() ++ self._stdin_write(input) + + # 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(): ++ if self.stdout_thread.is_alive(): + 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(): ++ if self.stderr_thread.is_alive(): + raise TimeoutExpired(self.args, orig_timeout) + + # Collect the output from and close both pipes, now that we know +@@ -1019,20 +1525,8 @@ + 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) ++ stdout = stdout[0] if stdout else None ++ stderr = stderr[0] if stderr else None + + return (stdout, stderr) + +@@ -1048,14 +1542,22 @@ + elif sig == signal.CTRL_BREAK_EVENT: + os.kill(self.pid, signal.CTRL_BREAK_EVENT) + else: +- raise ValueError("Unsupported signal: %s" % sig) ++ raise ValueError("Unsupported signal: {}".format(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) ++ try: ++ _winapi.TerminateProcess(self._handle, 1) ++ except PermissionError: ++ # ERROR_ACCESS_DENIED (winerror 5) is received when the ++ # process already died. ++ rc = _winapi.GetExitCodeProcess(self._handle) ++ if rc == _winapi.STILL_ACTIVE: ++ raise ++ self.returncode = rc + + kill = terminate + +@@ -1074,7 +1576,7 @@ + if stdin is None: + pass + elif stdin == PIPE: +- p2cread, p2cwrite = _create_pipe() ++ p2cread, p2cwrite = os.pipe() + elif stdin == DEVNULL: + p2cread = self._get_devnull() + elif isinstance(stdin, int): +@@ -1086,7 +1588,7 @@ + if stdout is None: + pass + elif stdout == PIPE: +- c2pread, c2pwrite = _create_pipe() ++ c2pread, c2pwrite = os.pipe() + elif stdout == DEVNULL: + c2pwrite = self._get_devnull() + elif isinstance(stdout, int): +@@ -1098,7 +1600,7 @@ + if stderr is None: + pass + elif stderr == PIPE: +- errread, errwrite = _create_pipe() ++ errread, errwrite = os.pipe() + elif stderr == STDOUT: + if c2pwrite != -1: + errwrite = c2pwrite +@@ -1117,251 +1619,162 @@ + 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 _posix_spawn(self, args, executable, env, restore_signals, ++ p2cread, p2cwrite, ++ c2pread, c2pwrite, ++ errread, errwrite): ++ """Execute program using os.posix_spawn().""" ++ if env is None: ++ env = os.environ ++ ++ kwargs = {} ++ if restore_signals: ++ # See _Py_RestoreSignals() in Python/pylifecycle.c ++ sigset = [] ++ for signame in ('SIGPIPE', 'SIGXFZ', 'SIGXFSZ'): ++ signum = getattr(signal, signame, None) ++ if signum is not None: ++ sigset.append(signum) ++ kwargs['setsigdef'] = sigset ++ ++ file_actions = [] ++ for fd in (p2cwrite, c2pread, errread): ++ if fd != -1: ++ file_actions.append((os.POSIX_SPAWN_CLOSE, fd)) ++ for fd, fd2 in ( ++ (p2cread, 0), ++ (c2pwrite, 1), ++ (errwrite, 2), ++ ): ++ if fd != -1: ++ file_actions.append((os.POSIX_SPAWN_DUP2, fd, fd2)) ++ if file_actions: ++ kwargs['file_actions'] = file_actions + ++ self.pid = os.posix_spawn(executable, args, env, **kwargs) ++ self._child_created = True ++ ++ self._close_pipe_fds(p2cread, p2cwrite, ++ c2pread, c2pwrite, ++ errread, errwrite) + + def _execute_child(self, args, executable, preexec_fn, close_fds, +- pass_fds, cwd, env, universal_newlines, ++ pass_fds, cwd, env, + startupinfo, creationflags, shell, + p2cread, p2cwrite, + c2pread, c2pwrite, + errread, errwrite, +- restore_signals, start_new_session): ++ restore_signals, ++ gid, gids, uid, umask, ++ start_new_session): + """Execute program (POSIX version)""" + +- if isinstance(args, types.StringTypes): ++ if isinstance(args, (str, bytes)): ++ args = [args] ++ elif isinstance(args, os.PathLike): ++ if shell: ++ raise TypeError('path-like args is not allowed when ' ++ 'shell is true') + args = [args] + else: + args = list(args) + + if shell: +- args = ["/bin/sh", "-c"] + args ++ # On Android the default shell is at '/system/bin/sh'. ++ unix_shell = ('/system/bin/sh' if ++ hasattr(sys, 'getandroidapilevel') else '/bin/sh') ++ args = [unix_shell, "-c"] + args + if executable: + args[0] = executable + + if executable is None: + executable = args[0] ++ ++ sys.audit("subprocess.Popen", executable, args, cwd, env) ++ ++ if (_USE_POSIX_SPAWN ++ and os.path.dirname(executable) ++ and preexec_fn is None ++ and not close_fds ++ and not pass_fds ++ and cwd is None ++ and (p2cread == -1 or p2cread > 2) ++ and (c2pwrite == -1 or c2pwrite > 2) ++ and (errwrite == -1 or errwrite > 2) ++ and not start_new_session ++ and gid is None ++ and gids is None ++ and uid is None ++ and umask < 0): ++ self._posix_spawn(args, executable, env, restore_signals, ++ p2cread, p2cwrite, ++ c2pread, c2pwrite, ++ errread, errwrite) ++ return ++ + 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() ++ errpipe_read, errpipe_write = os.pipe() ++ # errpipe_write must not be in the standard io 0, 1, or 2 fd range. ++ low_fds_to_close = [] ++ while errpipe_write < 3: ++ low_fds_to_close.append(errpipe_write) ++ errpipe_write = os.dup(errpipe_write) ++ for low_fd in low_fds_to_close: ++ os.close(low_fd) + 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 ++ # 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 = [] ++ for k, v in list(env.items()): ++ k = os.fsencode(k) ++ if b'=' in k: ++ raise ValueError("illegal environment variable name") ++ env_list.append(k + b'=' + os.fsencode(v)) + 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() ++ env_list = None # Use execv instead of execve. ++ executable = os.fsencode(executable) ++ if os.path.dirname(executable): ++ executable_list = (executable,) ++ else: ++ # This matches the behavior of os._execvpe(). ++ executable_list = tuple( ++ os.path.join(os.fsencode(dir), executable) ++ for dir in os.get_exec_path(env)) ++ fds_to_keep = set(pass_fds) ++ fds_to_keep.add(errpipe_write) ++ self.pid = _posixsubprocess.fork_exec( ++ args, executable_list, ++ close_fds, tuple(sorted(map(int, fds_to_keep))), ++ cwd, env_list, ++ p2cread, p2cwrite, c2pread, c2pwrite, ++ errread, errwrite, ++ errpipe_read, errpipe_write, ++ restore_signals, start_new_session, ++ gid, gids, uid, umask, ++ preexec_fn) ++ self._child_created = True + 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 ++ self._close_pipe_fds(p2cread, p2cwrite, ++ c2pread, c2pwrite, ++ errread, errwrite) + +- # Wait for exec to fail or succeed; possibly raising exception ++ # Wait for exec to fail or succeed; possibly raising an + # exception (limited in size) +- errpipe_data = '' ++ errpipe_data = bytearray() + while True: +- part = _eintr_retry_call(os.read, errpipe_read, 50000) ++ part = os.read(errpipe_read, 50000) + errpipe_data += part + if not part or len(errpipe_data) > 50000: + break +@@ -1369,66 +1782,60 @@ + # be sure the FD is closed no matter what + os.close(errpipe_read) + +- if errpipe_data != "": ++ if errpipe_data: + try: +- _eintr_retry_call(os.waitpid, self.pid, 0) +- except OSError, e: +- if e.errno != errno.ECHILD: +- raise ++ pid, sts = os.waitpid(self.pid, 0) ++ if pid == self.pid: ++ self._handle_exitstatus(sts) ++ else: ++ self.returncode = sys.maxsize ++ except ChildProcessError: ++ pass ++ + try: + exception_name, hex_errno, err_msg = ( +- errpipe_data.split(':', 2)) ++ errpipe_data.split(b':', 2)) ++ # The encoding here should match the encoding ++ # written in by the subprocess implementations ++ # like _posixsubprocess ++ err_msg = err_msg.decode() + except ValueError: +- exception_name = 'RuntimeError' +- hex_errno = '0' +- err_msg = ('Bad exception data from child: ' + +- repr(errpipe_data)) ++ exception_name = b'SubprocessError' ++ hex_errno = b'0' ++ err_msg = 'Bad exception data from child: {!r}'.format( ++ bytes(errpipe_data)) + child_exception_type = getattr( +- exceptions, exception_name, RuntimeError) ++ builtins, exception_name.decode('ascii'), ++ SubprocessError) + 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 = "" ++ # The error must be from chdir(cwd). ++ err_filename = cwd ++ else: ++ err_filename = orig_executable + 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 ++ raise child_exception_type(errno_num, err_msg, err_filename) ++ raise child_exception_type(err_msg) + + +- def _handle_exitstatus(self, sts, _WIFSIGNALED=os.WIFSIGNALED, +- _WTERMSIG=os.WTERMSIG, _WIFEXITED=os.WIFEXITED, +- _WEXITSTATUS=os.WEXITSTATUS, _WIFSTOPPED=os.WIFSTOPPED, +- _WSTOPSIG=os.WSTOPSIG): ++ def _handle_exitstatus(self, sts, ++ waitstatus_to_exitcode=os.waitstatus_to_exitcode, ++ _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): ++ # refer to anything outside of its local scope. ++ if _WIFSTOPPED(sts): + self.returncode = -_WSTOPSIG(sts) + else: +- # Should never happen +- raise RuntimeError("Unknown child exit status!") +- ++ self.returncode = waitstatus_to_exitcode(sts) + + def _internal_poll(self, _deadstate=None, _waitpid=os.waitpid, +- _WNOHANG=os.WNOHANG, _os_error=os.error, _ECHILD=errno.ECHILD): ++ _WNOHANG=os.WNOHANG, _ECHILD=errno.ECHILD): + """Check if child process has terminated. Returns returncode + attribute. + +@@ -1442,22 +1849,21 @@ + # 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 ++ 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 OSError as 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 +@@ -1466,10 +1872,8 @@ + 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 ++ (pid, sts) = os.waitpid(self.pid, wait_flags) ++ except ChildProcessError: + # 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. +@@ -1478,21 +1882,13 @@ + return (pid, sts) + + +- def wait(self, timeout=None, endtime=None): +- """Wait for child process to terminate. Returns returncode +- attribute.""" ++ def _wait(self, timeout): ++ """Internal implementation of wait() on POSIX.""" + 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: ++ if timeout is not None: ++ endtime = _time() + timeout + # 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 +@@ -1515,8 +1911,7 @@ + time.sleep(delay) + else: + while self.returncode is None: +- self._waitpid_lock.acquire() +- try: ++ with self._waitpid_lock: + if self.returncode is not None: + break # Another thread waited. + (pid, sts) = self._try_wait(0) +@@ -1525,8 +1920,6 @@ + # http://bugs.python.org/issue14396. + if pid == self.pid: + self._handle_exitstatus(sts) +- finally: +- self._waitpid_lock.release() + return self.returncode + + +@@ -1534,190 +1927,147 @@ + 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() ++ try: ++ self.stdin.flush() ++ except BrokenPipeError: ++ pass # communicate() must ignore BrokenPipeError. + 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) ++ try: ++ self.stdin.close() ++ except BrokenPipeError: ++ pass # communicate() must ignore BrokenPipeError. + +- if self.stdin and input: +- register_and_append(self.stdin, select.POLLOUT) ++ stdout = None ++ stderr = None + + # Only create this mapping if we haven't already. + if not self._communication_started: +- self._fd2output = {} ++ self._fileobj2output = {} + if self.stdout: +- self._fd2output[self.stdout.fileno()] = [] ++ self._fileobj2output[self.stdout] = [] + if self.stderr: +- self._fd2output[self.stderr.fileno()] = [] ++ self._fileobj2output[self.stderr] = [] + +- select_POLLIN_POLLPRI = select.POLLIN | select.POLLPRI + if self.stdout: +- register_and_append(self.stdout, select_POLLIN_POLLPRI) +- stdout = self._fd2output[self.stdout.fileno()] ++ stdout = self._fileobj2output[self.stdout] + 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) ++ stderr = self._fileobj2output[self.stderr] + +- 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) ++ self._save_input(input) + +- return (stdout, stderr) ++ if self._input: ++ input_view = memoryview(self._input) + +- +- def _communicate_with_select(self, input, endtime, orig_timeout): +- if not self._communication_started: +- self._read_set = [] +- self._write_set = [] ++ with _PopenSelector() as selector: + 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) ++ selector.register(self.stdin, selectors.EVENT_WRITE) ++ if self.stdout and not self.stdout.closed: ++ selector.register(self.stdout, selectors.EVENT_READ) ++ if self.stderr and not self.stderr.closed: ++ selector.register(self.stderr, selectors.EVENT_READ) + +- 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 ++ while selector.get_map(): ++ timeout = self._remaining_time(endtime) ++ if timeout is not None and timeout < 0: ++ self._check_timeout(endtime, orig_timeout, ++ stdout, stderr, ++ skip_check_and_raise=True) ++ raise RuntimeError( # Impossible :) ++ '_check_timeout(..., skip_check_and_raise=True) ' ++ 'failed to raise TimeoutExpired.') ++ ++ ready = selector.select(timeout) ++ self._check_timeout(endtime, orig_timeout, stdout, stderr) ++ ++ # XXX Rewrite these to use non-blocking I/O on the file ++ # objects; they are no longer using C stdio! ++ ++ for key, events in ready: ++ if key.fileobj is self.stdin: ++ chunk = input_view[self._input_offset : ++ self._input_offset + _PIPE_BUF] ++ try: ++ self._input_offset += os.write(key.fd, chunk) ++ except BrokenPipeError: ++ selector.unregister(key.fileobj) ++ key.fileobj.close() ++ else: ++ if self._input_offset >= len(self._input): ++ selector.unregister(key.fileobj) ++ key.fileobj.close() ++ elif key.fileobj in (self.stdout, self.stderr): ++ data = os.read(key.fd, 32768) ++ if not data: ++ selector.unregister(key.fileobj) ++ key.fileobj.close() ++ self._fileobj2output[key.fileobj].append(data) + +- 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 ++ self.wait(timeout=self._remaining_time(endtime)) + +- 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 ++ # All data exchanged. Translate lists into strings. ++ if stdout is not None: ++ stdout = b''.join(stdout) ++ if stderr is not None: ++ stderr = b''.join(stderr) + +- # 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) ++ # Translate newlines, if requested. ++ # This also turns bytes into strings. ++ if self.text_mode: ++ if stdout is not None: ++ stdout = self._translate_newlines(stdout, ++ self.stdout.encoding, ++ self.stdout.errors) ++ if stderr is not None: ++ stderr = self._translate_newlines(stderr, ++ self.stderr.encoding, ++ self.stderr.errors) + +- 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) ++ return (stdout, stderr) + +- 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 _save_input(self, input): ++ # This method is called from the _communicate_with_*() methods ++ # 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 input is not None and self.text_mode: ++ self._input = self._input.encode(self.stdin.encoding, ++ self.stdin.errors) + + + 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: ++ """Send a signal to the process.""" ++ # bpo-38630: Polling reduces the risk of sending a signal to the ++ # wrong process if the process completed, the Popen.returncode ++ # attribute is still None, and the pid has been reassigned ++ # (recycled) to a new different process. This race condition can ++ # happens in two cases. ++ # ++ # Case 1. Thread A calls Popen.poll(), thread B calls ++ # Popen.send_signal(). In thread A, waitpid() succeed and returns ++ # the exit status. Thread B calls kill() because poll() in thread A ++ # did not set returncode yet. Calling poll() in thread B prevents ++ # the race condition thanks to Popen._waitpid_lock. ++ # ++ # Case 2. waitpid(pid, 0) has been called directly, without ++ # using Popen methods: returncode is still None is this case. ++ # Calling Popen.poll() will set returncode to a default value, ++ # since waitpid() fails with ProcessLookupError. ++ self.poll() ++ if self.returncode is not None: ++ # Skip signalling a process that we know has already died. ++ return ++ ++ # The race condition can still happen if the race condition ++ # described above happens between the returncode test ++ # and the kill() call. ++ try: + os.kill(self.pid, sig) ++ except ProcessLookupError: ++ # Supress the race condition error; bpo-40550. ++ pass + + def terminate(self): + """Terminate the process with SIGTERM +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_commons/unicode_tolerant_fs.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_commons/unicode_tolerant_fs.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_commons/unicode_tolerant_fs.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_commons/unicode_tolerant_fs.py 2022-07-11 00:52:28.000000000 +0800 +@@ -38,7 +38,7 @@ + # 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 +@@ -57,7 +57,6 @@ + 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): +- yield x ++ yield from unicode_walk(new_path, topdown, onerror, followlinks) + if not topdown: + yield top, dirs, nondirs +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_commons/urllib_handlers.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_commons/urllib_handlers.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_commons/urllib_handlers.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_commons/urllib_handlers.py 2022-07-11 00:52:28.000000000 +0800 +@@ -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() + +@@ -67,7 +67,7 @@ + response_headers = response.info() + refresh_header = None + +- for response_header_key in response_headers.keys(): ++ for response_header_key in list(response_headers.keys()): + if response_header_key.lower() == REFRESH_HEADER.lower(): + refresh_header = response_headers.getheader(response_header_key) + break +@@ -91,7 +91,7 @@ + redirect_url = redirect_url_key_value_pair[equals_index+1:] + + if key.strip().lower() != REFRESH_HEADER_URL_KEY: +- logger.warning("Unable to parse refresh header {0}".format(refresh_header)) ++ logger.warning("Unable to parse refresh header {}".format(refresh_header)) + return response + + # extract out just host:port +@@ -109,8 +109,8 @@ + + # follow the new new and return the response + return self.parent.open(redirect_url) +- except Exception,exception: +- logger.error("Unable to follow refresh header {0}. {1}".format( ++ except Exception as exception: ++ logger.error("Unable to follow refresh header {}. {}".format( + refresh_header, str(exception))) + + # return the original response +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_commons/yaml_utils.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_commons/yaml_utils.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_commons/yaml_utils.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_commons/yaml_utils.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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,10 +20,10 @@ + import re + + # [a,b,c] +-REGEX_LIST = '^\w*\[.+\]\w*$' ++REGEX_LIST = r'^\w*\[.+\]\w*$' + + # {a: v, b: v2, c: v3} +-REGEX_DICTIONARY = '^\w*\{.+\}\w*$' ++REGEX_DICTIONARY = r'^\w*\{.+\}\w*$' + + """ + storm-cluster: +@@ -32,14 +32,14 @@ + groups: + [hadoop, hadoop-secure] + +-^\s* - allow any whitespace or newlines to start +-\S+ - at least 1 word character (including dashes) ++^\\s* - allow any whitespace or newlines to start ++\\S+ - at least 1 word character (including dashes) + [ ]*:[ ]* - followed by a colon (allowing spaces around the colon) + [\r\n\f]+ - at least 1 newline + +-\s*\S+[ ]*:[ ]*[\r\n\f] - follow with the same basically to ensure a map of maps ++\\s*\\S+[ ]*:[ ]*[\r\n\f] - follow with the same basically to ensure a map of maps + """ +-REGEX_NESTED_MAPS = "^\s*\S+[ ]*:[ ]*[\r\n\f]+\s*\S+[ ]*:[ ]*[\r\n\f]" ++REGEX_NESTED_MAPS = "^\\s*\\S+[ ]*:[ ]*[\r\n\f]+\\s*\\S+[ ]*:[ ]*[\r\n\f]" + + + def escape_yaml_property(value): +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/bccache.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/bccache.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/bccache.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/bccache.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,3 @@ +-# -*- coding: utf-8 -*- + """ + ambari_jinja2.bccache + ~~~~~~~~~~~~~~ +@@ -17,9 +16,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: +@@ -28,10 +27,10 @@ + + + bc_version = 1 +-bc_magic = 'j2'.encode('ascii') + pickle.dumps(bc_version, 2) ++bc_magic = b'j2' + pickle.dumps(bc_version, 2) + + +-class Bucket(object): ++class Bucket: + """Buckets are used to store the bytecode for one template. It's created + and initialized by the bytecode cache and passed to the loading functions. + +@@ -91,7 +90,7 @@ + return out.getvalue() + + +-class BytecodeCache(object): ++class BytecodeCache: + """To implement your own bytecode cache you have to subclass this class + and override :meth:`load_bytecode` and :meth:`dump_bytecode`. Both of + these methods are passed a :class:`~ambari_jinja2.bccache.Bucket`. +@@ -144,7 +143,7 @@ + """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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/compiler.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/compiler.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/compiler.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/compiler.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,3 @@ +-# -*- coding: utf-8 -*- + """ + ambari_jinja2.compiler + ~~~~~~~~~~~~~~~ +@@ -8,7 +7,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 +29,7 @@ + } + + try: +- exec '(0 if 0 else 0)' ++ exec ('(0 if 0 else 0)') + except SyntaxError: + have_condexpr = False + else: +@@ -51,7 +50,7 @@ + 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,7 +68,7 @@ + """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, ++ if isinstance(value, (bool, int, float, complex, str, + xrange, Markup)): + return True + if isinstance(value, (tuple, list, set, frozenset)): +@@ -78,7 +77,7 @@ + return False + return True + elif isinstance(value, dict): +- for key, value in value.iteritems(): ++ for key, value in list(value.items()): + if not has_safe_repr(key): + return False + if not has_safe_repr(value): +@@ -100,7 +99,7 @@ + return visitor.undeclared + + +-class Identifiers(object): ++class Identifiers: + """Tracks the status of identifiers in frames.""" + + def __init__(self): +@@ -139,7 +138,7 @@ + return deepcopy(self) + + +-class Frame(object): ++class Frame: + """Holds compile time information for us.""" + + def __init__(self, eval_ctx, parent=None): +@@ -209,7 +208,7 @@ + i = self.identifiers + return (i.declared | i.outer_undeclared) & \ + (i.declared_locally | i.declared_parameter) | \ +- set(x for x in extra if i.is_declared(x)) ++ {x for x in extra if i.is_declared(x)} + + def inner(self): + """Return an inner frame.""" +@@ -545,8 +544,8 @@ + self.write(', ') + self.visit(kwarg, frame) + if extra_kwargs is not None: +- for key, value in extra_kwargs.iteritems(): +- self.write(', %s=%s' % (key, value)) ++ for key, value in list(extra_kwargs.items()): ++ self.write(', {}={}'.format(key, value)) + if node.dyn_args: + self.write(', *') + self.visit(node.dyn_args, frame) +@@ -561,8 +560,8 @@ + self.visit(kwarg.value, frame) + self.write(', ') + if extra_kwargs is not None: +- for key, value in extra_kwargs.iteritems(): +- self.write('%r: %s, ' % (key, value)) ++ for key, value in list(extra_kwargs.items()): ++ self.write('{!r}: {}, '.format(key, value)) + if node.dyn_kwargs is not None: + self.write('}, **') + self.visit(node.dyn_kwargs, frame) +@@ -577,7 +576,7 @@ + def pull_locals(self, frame): + """Pull all the references identifiers into the local scope.""" + for name in frame.identifiers.undeclared: +- self.writeline('l_%s = context.resolve(%r)' % (name, name)) ++ self.writeline('l_{} = context.resolve({!r})'.format(name, name)) + + def pull_dependencies(self, nodes): + """Pull all the dependencies.""" +@@ -599,7 +598,7 @@ + # is removed. If that breaks we have to add a dummy function + # that just accepts the arguments and does nothing. + if frame.identifiers.declared: +- self.writeline('%sdummy(%s)' % ( ++ self.writeline('{}dummy({})'.format( + unoptimize_before_dead_code and 'if 0: ' or '', + ', '.join('l_' + name for name in frame.identifiers.declared) + )) +@@ -617,7 +616,7 @@ + aliases = {} + for name in frame.find_shadowed(extra_vars): + aliases[name] = ident = self.temporary_identifier() +- self.writeline('%s = l_%s' % (ident, name)) ++ self.writeline('{} = l_{}'.format(ident, name)) + to_declare = set() + for name in frame.identifiers.declared_locally: + if name not in aliases: +@@ -628,8 +627,8 @@ + + def pop_scope(self, aliases, frame): + """Restore all aliases and delete unused variables.""" +- for name, alias in aliases.iteritems(): +- self.writeline('l_%s = %s' % (name, alias)) ++ for name, alias in list(aliases.items()): ++ self.writeline('l_{} = {}'.format(name, alias)) + to_delete = set() + for name in frame.identifiers.declared_locally: + if name not in aliases: +@@ -744,7 +743,7 @@ + for arg in node.defaults: + self.visit(arg, frame) + self.write(', ') +- self.write('), %r, %r, %r)' % ( ++ self.write('), {!r}, {!r}, {!r})'.format( + bool(frame.accesses_kwargs), + bool(frame.accesses_varargs), + bool(frame.accesses_caller) +@@ -793,7 +792,7 @@ + self.writeline('from %s import %s as %s' % + (module, obj, alias)) + else: +- self.writeline('import %s as %s' % (imp, alias)) ++ self.writeline('import {} as {}'.format(imp, alias)) + + # add the load name + self.writeline('name = %r' % self.name) +@@ -830,11 +829,11 @@ + 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 list(self.blocks.items()): + block_frame = Frame(eval_ctx) + block_frame.inspect(block.body) + block_frame.block = name +- self.writeline('def block_%s(context%s):' % (name, envenv), ++ self.writeline('def block_{}(context{}):'.format(name, envenv), + block, 1) + self.indent() + undeclared = find_undeclared(block.body, ('self', 'super')) +@@ -850,7 +849,7 @@ + self.blockvisit(block.body, block_frame) + self.outdent() + +- self.writeline('blocks = {%s}' % ', '.join('%r: block_%s' % (x, x) ++ self.writeline('blocks = {%s}' % ', '.join('{!r}: block_{}'.format(x, x) + for x in self.blocks), + extra=1) + +@@ -871,7 +870,7 @@ + self.indent() + level += 1 + context = node.scoped and 'context.derived(locals())' or 'context' +- self.writeline('for event in context.blocks[%r][0](%s):' % ( ++ self.writeline('for event in context.blocks[{!r}][0]({}):'.format( + node.name, context), node) + self.indent() + self.simple_write('event', frame) +@@ -933,7 +932,7 @@ + + 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' +@@ -1024,10 +1023,10 @@ + if var_names: + if len(var_names) == 1: + name = var_names[0] +- self.writeline('context.vars[%r] = l_%s' % (name, name)) ++ self.writeline('context.vars[{!r}] = l_{}'.format(name, name)) + else: + self.writeline('context.vars.update({%s})' % ', '.join( +- '%r: l_%s' % (name, name) for name in var_names ++ '{!r}: l_{}'.format(name, name) for name in var_names + )) + if discarded_names: + if len(discarded_names) == 1: +@@ -1219,9 +1218,9 @@ + 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 +@@ -1356,13 +1355,13 @@ + if not x.startswith('_')] + if len(assignment_frame.toplevel_assignments) == 1: + name = next(iter(assignment_frame.toplevel_assignments)) +- self.writeline('context.vars[%r] = l_%s' % (name, name)) ++ self.writeline('context.vars[{!r}] = l_{}'.format(name, name)) + else: + self.writeline('context.vars.update({') + for idx, name in enumerate(assignment_frame.toplevel_assignments): + if idx: + self.write(', ') +- self.write('%r: l_%s' % (name, name)) ++ self.write('{!r}: l_{}'.format(name, name)) + self.write('})') + if public_names: + if len(public_names) == 1: +@@ -1593,7 +1592,7 @@ + self.write('environment.' + node.name) + + def visit_ExtensionAttribute(self, node, frame): +- self.write('environment.extensions[%r].%s' % (node.identifier, node.name)) ++ self.write('environment.extensions[{!r}].{}'.format(node.identifier, node.name)) + + def visit_ImportedName(self, node, frame): + self.write(self.import_aliases[node.importname]) +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/constants.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/constants.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/constants.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/constants.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,3 @@ +-# -*- coding: utf-8 -*- + """ + jinja.constants + ~~~~~~~~~~~~~~~ +@@ -11,7 +10,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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/debug.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/debug.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/debug.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/debug.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,3 @@ +-# -*- coding: utf-8 -*- + """ + ambari_jinja2.debug + ~~~~~~~~~~~~ +@@ -18,14 +17,14 @@ + + # 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: + raise_helper = 'raise __jinja_exception__[0], __jinja_exception__[1]' + + +-class TracebackFrameProxy(object): ++class TracebackFrameProxy: + """Proxies a traceback frame.""" + + def __init__(self, tb): +@@ -50,7 +49,7 @@ + return getattr(self.tb, name) + + +-class ProcessedTraceback(object): ++class ProcessedTraceback: + """Holds a Jinja preprocessed traceback for priting or reraising.""" + + def __init__(self, exc_type, exc_value, frames): +@@ -77,7 +76,7 @@ + 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 '{}\n\n'.format( + render_traceback(self, full=full), + self.render_as_text().decode('utf-8', 'replace') + ) +@@ -128,7 +127,7 @@ + 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 +158,7 @@ + # 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 +178,7 @@ + locals = ctx.get_all() + else: + locals = {} +- for name, value in real_locals.iteritems(): ++ for name, value in list(real_locals.items()): + if name.startswith('l_') and value is not missing: + locals[name[2:]] = value + +@@ -227,7 +226,7 @@ + + # 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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/defaults.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/defaults.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/defaults.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/defaults.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,3 @@ +-# -*- coding: utf-8 -*- + """ + ambari_jinja2.defaults + ~~~~~~~~~~~~~~~ +@@ -28,7 +27,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, +@@ -37,4 +36,4 @@ + + + # export all constants +-__all__ = tuple(x for x in locals().keys() if x.isupper()) ++__all__ = tuple(x for x in list(locals().keys()) if x.isupper()) +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/environment.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/environment.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/environment.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/environment.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,3 @@ +-# -*- coding: utf-8 -*- + """ + ambari_jinja2.environment + ~~~~~~~~~~~~~~~~~~ +@@ -21,6 +20,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 +71,7 @@ + """ + result = {} + for extension in extensions: +- if isinstance(extension, basestring): ++ if isinstance(extension, str): + extension = import_string(extension) + result[extension.identifier] = extension(environment) + return result +@@ -90,7 +90,7 @@ + return environment + + +-class Environment(object): ++class Environment: + r"""The core component of Jinja is the `Environment`. It contains + important shared variables like configuration, filters, tests, + globals and others. Instances of this class may be modified if +@@ -291,7 +291,7 @@ + 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 +322,7 @@ + rv.overlayed = True + rv.linked_to = self + +- for key, value in args.iteritems(): ++ for key, value in list(args.items()): + if value is not missing: + setattr(rv, key, value) + +@@ -332,7 +332,7 @@ + rv.cache = copy_cache(self.cache) + + rv.extensions = {} +- for key, value in self.extensions.iteritems(): ++ for key, value in list(self.extensions.items()): + rv.extensions[key] = value.bind(rv) + if extensions is not missing: + rv.extensions.update(load_extensions(rv, extensions)) +@@ -343,7 +343,7 @@ + + def iter_extensions(self): + """Iterates over the extensions by priority.""" +- return iter(sorted(self.extensions.values(), ++ return iter(sorted(list(self.extensions.values()), + key=lambda x: x.priority)) + + def getitem(self, obj, argument): +@@ -351,7 +351,7 @@ + try: + return obj[argument] + except (TypeError, LookupError): +- if isinstance(argument, basestring): ++ if isinstance(argument, str): + try: + attr = str(argument) + except: +@@ -406,7 +406,7 @@ + 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 +419,7 @@ + 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 +473,7 @@ + """ + 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 +567,12 @@ + 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,10 +596,10 @@ + 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)) ++ log_function('Could not compile "{}": {}'.format(name, e)) + continue + + filename = ModuleLoader.get_module_filename(name) +@@ -612,7 +612,7 @@ + (name, filename + 'c')) + else: + write_file(filename, code, 'w') +- log_function('Compiled "%s" as %s' % (name, filename)) ++ log_function('Compiled "{}" as {}'.format(name, filename)) + finally: + if zip: + zip_file.close() +@@ -641,7 +641,7 @@ + filter_func = lambda x: '.' in x and \ + x.rsplit('.', 1)[1] in extensions + if filter_func is not None: +- x = filter(filter_func, x) ++ x = list(filter(filter_func, x)) + return x + + def handle_exception(self, exc_info=None, rendered=False, source_hint=None): +@@ -664,7 +664,7 @@ + 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 +728,8 @@ + 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 +751,7 @@ + + .. 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 +@@ -772,7 +772,7 @@ + return dict(self.globals, **d) + + +-class Template(object): ++class Template: + """The central template object. This class represents a compiled template + and is used to evaluate it. + +@@ -836,7 +836,7 @@ + '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 +@@ -906,8 +906,7 @@ + """ + vars = dict(*args, **kwargs) + try: +- for event in self.root_render_func(self.new_context(vars)): +- yield event ++ yield from self.root_render_func(self.new_context(vars)) + except: + exc_info = sys.exc_info() + else: +@@ -978,10 +977,10 @@ + name = 'memory:%x' % id(self) + else: + name = repr(self.name) +- return '<%s %s>' % (self.__class__.__name__, name) ++ return '<{} {}>'.format(self.__class__.__name__, name) + + +-class TemplateModule(object): ++class TemplateModule: + """Represents an imported template. All the exported names of the + template are available as attributes on this object. Additionally + converting it into an unicode- or bytestrings renders the contents. +@@ -996,7 +995,7 @@ + return Markup(concat(self._body_stream)) + + def __str__(self): +- return unicode(self).encode('utf-8') ++ return str(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 +@@ -1010,10 +1009,10 @@ + name = 'memory:%x' % id(self) + else: + name = repr(self.__name__) +- return '<%s %s>' % (self.__class__.__name__, name) ++ return '<{} {}>'.format(self.__class__.__name__, name) + + +-class TemplateExpression(object): ++class TemplateExpression: + """The :meth:`ambari_jinja2.Environment.compile_expression` method returns an + instance of this object. It encapsulates the expression-like access + to the template with an expression it wraps. +@@ -1032,7 +1031,7 @@ + return rv + + +-class TemplateStream(object): ++class TemplateStream: + """A template stream works pretty much like an ordinary python generator + but it can buffer multiple items to reduce the number of total iterations. + Per default the output is unbuffered which means that for every unbuffered +@@ -1057,7 +1056,7 @@ + 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 +1075,7 @@ + + 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 +1103,12 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/exceptions.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/exceptions.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/exceptions.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/exceptions.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,3 @@ +-# -*- coding: utf-8 -*- + """ + ambari_jinja2.exceptions + ~~~~~~~~~~~~~~~~~ +@@ -15,7 +14,7 @@ + + 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 +61,8 @@ + + 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,7 +82,7 @@ + self.translated = False + + def __str__(self): +- return unicode(self).encode('utf-8') ++ return str(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 +@@ -98,7 +97,7 @@ + location = 'line %d' % self.lineno + name = self.filename or self.name + if name: +- location = 'File "%s", %s' % (name, location) ++ location = 'File "{}", {}'.format(name, location) + lines = [self.message, ' ' + location] + + # if the source is set, add the line to the output +@@ -110,7 +109,7 @@ + if line: + lines.append(' ' + line.strip()) + +- return u'\n'.join(lines) ++ return '\n'.join(lines) + + + class TemplateAssertionError(TemplateSyntaxError): +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/ext.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/ext.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/ext.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/ext.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,3 @@ +-# -*- coding: utf-8 -*- + """ + ambari_jinja2.ext + ~~~~~~~~~~ +@@ -34,7 +33,7 @@ + return rv + + +-class Extension(object): ++class Extension(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 +51,6 @@ + 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() +@@ -82,7 +80,7 @@ + return source + + def filter_stream(self, stream): +- """It's passed a :class:`~ambari_jinja2.lexer.TokenStream` that can be used ++ r"""It's passed a :class:`~ambari_jinja2.lexer.TokenStream` that can be used + to filter tokens returned. This method has to return an iterable of + :class:`~ambari_jinja2.lexer.Token`\s, but it doesn't have to return a + :class:`~ambari_jinja2.lexer.TokenStream`. +@@ -150,7 +148,7 @@ + + class InternationalizationExtension(Extension): + """This extension adds gettext support to Jinja2.""" +- tags = set(['trans']) ++ tags = {'trans'} + + # TODO: the i18n extension is currently reevaluating values in a few + # situations. Take this example: +@@ -203,7 +201,7 @@ + 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 +350,7 @@ + # 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 list(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': +@@ -367,7 +365,7 @@ + if variables: + node = nodes.Mod(node, nodes.Dict([ + nodes.Pair(nodes.Const(key), value) +- for key, value in variables.items() ++ for key, value in list(variables.items()) + ])) + return nodes.Output([node]) + +@@ -376,7 +374,7 @@ + """Adds a `do` tag to Jinja2 that works like the print statement just + that it doesn't print the return value. + """ +- tags = set(['do']) ++ tags = {'do'} + + def parse(self, parser): + node = nodes.ExprStmt(lineno=next(parser.stream).lineno) +@@ -386,7 +384,7 @@ + + class LoopControlExtension(Extension): + """Adds break and continue to the template engine.""" +- tags = set(['break', 'continue']) ++ tags = {'break', 'continue'} + + def parse(self, parser): + token = next(parser.stream) +@@ -397,7 +395,7 @@ + + class WithExtension(Extension): + """Adds support for a django-like with block.""" +- tags = set(['with']) ++ tags = {'with'} + + def parse(self, parser): + node = nodes.Scope(lineno=next(parser.stream).lineno) +@@ -418,7 +416,7 @@ + + class AutoEscapeExtension(Extension): + """Changes auto escape rules for a scope.""" +- tags = set(['autoescape']) ++ tags = {'autoescape'} + + def parse(self, parser): + node = nodes.ScopedEvalContextModifier(lineno=next(parser.stream).lineno) +@@ -474,7 +472,7 @@ + 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) +@@ -498,7 +496,7 @@ + yield node.lineno, node.node.name, strings + + +-class _CommentFinder(object): ++class _CommentFinder: + """Helper class to find comments in a token stream. Can only + find comments for gettext calls forwards. Once the comment + from line 4 is found, a comment for line 1 will not return a +@@ -593,7 +591,7 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/filters.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/filters.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/filters.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/filters.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,3 @@ +-# -*- coding: utf-8 -*- + """ + ambari_jinja2.filters + ~~~~~~~~~~~~~~ +@@ -12,7 +11,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 +51,7 @@ + """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 +73,7 @@ + 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 +116,13 @@ + 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( ++ '{}="{}"'.format(escape(key), escape(value)) ++ for key, value in list(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,11 +168,11 @@ + '"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 + +- return sorted(value.items(), key=sort_func) ++ return sorted(list(value.items()), key=sort_func) + + + def do_sort(value, reverse=False, case_sensitive=False): +@@ -192,7 +191,7 @@ + """ + if not case_sensitive: + def sort_func(item): +- if isinstance(item, basestring): ++ if isinstance(item, str): + item = item.lower() + return item + else: +@@ -200,7 +199,7 @@ + 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 +222,7 @@ + + + @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 +237,7 @@ + """ + # 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 +248,27 @@ + 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 +277,7 @@ + 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.') + +@@ -304,10 +303,10 @@ + if bytes < base: + return "%d Byte%s" % (bytes, bytes != 1 and 's' or '') + elif bytes < base * base: +- return "%.1f K%sB" % (bytes / base, middle) ++ return "{:.1f} K{}B".format(bytes / base, middle) + elif bytes < base * base * base: +- return "%.1f M%sB" % (bytes / (base * base), middle) +- return "%.1f G%sB" % (bytes / (base * base * base), middle) ++ return "{:.1f} M{}B".format(bytes / (base * base), middle) ++ return "{:.1f} G{}B".format(bytes / (base * base * base), middle) + + + def do_pprint(value, verbose=False): +@@ -349,8 +348,8 @@ + {{ 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 +383,7 @@ + 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 +394,7 @@ + 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 +455,7 @@ + """ + 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 +483,7 @@ + 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 +604,8 @@ + 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 +625,14 @@ + + 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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/__init__.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/__init__.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/__init__.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/__init__.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,3 @@ +-# -*- coding: utf-8 -*- + """ + ambari_jinja2 + ~~~~~~ +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/lexer.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/lexer.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/lexer.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/lexer.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,3 @@ +-# -*- coding: utf-8 -*- + """ + ambari_jinja2.lexer + ~~~~~~~~~~~~ +@@ -19,6 +18,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 +@@ -39,62 +39,62 @@ + name_re = re.compile(r'\b[a-zA-Z_][a-zA-Z0-9_]*\b') + else: + from ambari_jinja2 import _stringdefs +- name_re = re.compile(r'[%s][%s]*' % (_stringdefs.xid_start, ++ name_re = re.compile(r'[{}][{}]*'.format(_stringdefs.xid_start, + _stringdefs.xid_continue)) + + float_re = re.compile(r'(?(?:\s*%s\-|%s)\s*raw\s*(?:\-%s\s*|%s))' % ( ++ [r'(?P(?:\s*{}\-|{})\s*raw\s*(?:\-{}\s*|{}))'.format( + e(environment.block_start_string), + e(environment.block_start_string), + e(environment.block_end_string), + e(environment.block_end_string) + )] + [ +- r'(?P<%s_begin>\s*%s\-|%s)' % (n, r, r) ++ r'(?P<{}_begin>\s*{}\-|{})'.format(n, r, r) + for n, r in root_tag_rules + ])), (TOKEN_DATA, '#bygroup'), '#bygroup'), + # data +@@ -446,7 +446,7 @@ + ], + # comments + TOKEN_COMMENT_BEGIN: [ +- (c(r'(.*?)((?:\-%s\s*|%s)%s)' % ( ++ (c(r'(.*?)((?:\-{}\s*|{}){})'.format( + e(environment.comment_end_string), + e(environment.comment_end_string), + block_suffix_re +@@ -455,7 +455,7 @@ + ], + # blocks + TOKEN_BLOCK_BEGIN: [ +- (c('(?:\-%s\s*|%s)%s' % ( ++ (c(r'(?:\-{}\s*|{}){}'.format( + e(environment.block_end_string), + e(environment.block_end_string), + block_suffix_re +@@ -463,14 +463,14 @@ + ] + tag_rules, + # variables + TOKEN_VARIABLE_BEGIN: [ +- (c('\-%s\s*|%s' % ( ++ (c(r'\-{}\s*|{}'.format( + e(environment.variable_end_string), + e(environment.variable_end_string) + )), TOKEN_VARIABLE_END, '#pop') + ] + tag_rules, + # raw block + TOKEN_RAW_BEGIN: [ +- (c('(.*?)((?:\s*%s\-|%s)\s*endraw\s*(?:\-%s\s*|%s%s))' % ( ++ (c(r'(.*?)((?:\s*{}\-|{})\s*endraw\s*(?:\-{}\s*|{}{}))'.format( + e(environment.block_start_string), + e(environment.block_start_string), + e(environment.block_end_string), +@@ -526,7 +526,7 @@ + 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 +549,7 @@ + """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 +590,7 @@ + # 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 list(m.groupdict().items()): + if value is not None: + yield lineno, key, value + lineno += value.count('\n') +@@ -647,7 +647,7 @@ + stack.pop() + # resolve the new state by group checking + elif new_state == '#bygroup': +- for key, value in m.groupdict().iteritems(): ++ for key, value in list(m.groupdict().items()): + if value is not None: + stack.append(key) + break +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/loaders.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/loaders.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/loaders.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/loaders.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,3 @@ +-# -*- coding: utf-8 -*- + """ + ambari_jinja2.loaders + ~~~~~~~~~~~~~~ +@@ -36,7 +35,7 @@ + return pieces + + +-class BaseLoader(object): ++class BaseLoader: + """Baseclass for all loaders. Subclass this and override `get_source` to + implement a custom loading mechanism. The environment provides a + `get_template` method that calls the loader's `load` method to get the +@@ -153,7 +152,7 @@ + """ + + 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 +306,7 @@ + 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 +345,7 @@ + + def list_templates(self): + result = [] +- for prefix, loader in self.mapping.iteritems(): ++ for prefix, loader in list(self.mapping.items()): + for template in loader.list_templates(): + result.append(prefix + self.delimiter + template) + return result +@@ -407,7 +406,7 @@ + # 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) +@@ -433,7 +432,7 @@ + @internalcode + def load(self, environment, name, globals=None): + key = self.get_template_key(name) +- module = '%s.%s' % (self.package_name, key) ++ module = '{}.{}'.format(self.package_name, key) + mod = getattr(self.module, module, None) + if mod is None: + try: +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/_markupsafe/_bundle.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/_markupsafe/_bundle.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/_markupsafe/_bundle.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/_markupsafe/_bundle.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,3 @@ +-# -*- coding: utf-8 -*- + """ + ambari_jinja2._markupsafe._bundle + ~~~~~~~~~~~~~~~~~~~~~~~~~~ +@@ -25,7 +24,7 @@ + + 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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/_markupsafe/_constants.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/_markupsafe/_constants.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/_markupsafe/_constants.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/_markupsafe/_constants.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,3 @@ +-# -*- coding: utf-8 -*- + """ + markupsafe._constants + ~~~~~~~~~~~~~~~~~~~~~ +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/_markupsafe/__init__.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/_markupsafe/__init__.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/_markupsafe/__init__.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/_markupsafe/__init__.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,3 @@ +-# -*- coding: utf-8 -*- + """ + markupsafe + ~~~~~~~~~~ +@@ -9,7 +8,7 @@ + :license: BSD, see LICENSE for more details. + """ + import re +-from itertools import imap ++ + + + __all__ = ['Markup', 'soft_unicode', 'escape', 'escape_silent'] +@@ -19,7 +18,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 +63,60 @@ + """ + __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)' % ( ++ return '{}({})'.format( + 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 list(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 list(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 list(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 +129,16 @@ + 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 +148,7 @@ + >>> 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 +163,10 @@ + 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, iter(list(kwargs.items()))) + return self.__class__(orig(self, *args, **kwargs)) + func.__name__ = orig.__name__ + func.__doc__ = orig.__doc__ +@@ -180,16 +179,16 @@ + 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,12 +197,12 @@ + 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 + + +-class _MarkupEscapeHelper(object): ++class _MarkupEscapeHelper: + """Helper for Markup.__mod__""" + + def __init__(self, obj): +@@ -211,7 +210,7 @@ + + __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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/_markupsafe/_native.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/_markupsafe/_native.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/_markupsafe/_native.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/_markupsafe/_native.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,3 @@ +-# -*- coding: utf-8 -*- + """ + markupsafe._native + ~~~~~~~~~~~~~~~~~~ +@@ -18,7 +17,7 @@ + """ + if hasattr(s, '__html__'): + return s.__html__() +- return Markup(unicode(s) ++ return Markup(str(s) + .replace('&', '&') + .replace('>', '>') + .replace('<', '<') +@@ -40,6 +39,6 @@ + """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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/_markupsafe/tests.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/_markupsafe/tests.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/_markupsafe/tests.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/_markupsafe/tests.py 2022-07-11 00:52:29.000000000 +0800 +@@ -9,7 +9,7 @@ + # 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') % '' == \ +@@ -26,7 +26,7 @@ + assert x.__html__() is x + + # it also knows how to treat __html__ objects +- class Foo(object): ++ class Foo: + def __html__(self): + return 'awesome' + def __unicode__(self): +@@ -48,19 +48,19 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/meta.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/meta.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/meta.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/meta.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,3 @@ +-# -*- coding: utf-8 -*- + """ + ambari_jinja2.meta + ~~~~~~~~~~~ +@@ -77,7 +76,7 @@ + # 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 +86,7 @@ + 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 +94,7 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/nodes.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/nodes.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/nodes.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/nodes.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,3 @@ +-# -*- coding: utf-8 -*- + """ + ambari_jinja2.nodes + ~~~~~~~~~~~~ +@@ -13,7 +12,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 + +@@ -71,7 +70,7 @@ + return type.__new__(cls, name, bases, d) + + +-class EvalContext(object): ++class EvalContext: + """Holds evaluation time information. Custom attributes can be attached + to it in extensions. + """ +@@ -101,7 +100,7 @@ + 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 +116,6 @@ + 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 +133,13 @@ + 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 +@@ -186,8 +184,7 @@ + for child in self.iter_child_nodes(): + if isinstance(child, node_type): + yield child +- for result in child.find_all(node_type): +- yield result ++ yield from child.find_all(node_type) + + def set_ctx(self, ctx): + """Reset the context of a node and all child nodes. Per default the +@@ -231,9 +228,9 @@ + return not self.__eq__(other) + + def __repr__(self): +- return '%s(%s)' % ( ++ return '{}({})'.format( + self.__class__.__name__, +- ', '.join('%s=%r' % (arg, getattr(self, arg, None)) for ++ ', '.join('{}={!r}'.format(arg, getattr(self, arg, None)) for + arg in self.fields) + ) + +@@ -431,7 +428,7 @@ + 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,11 +675,11 @@ + + 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): +- """Compares an expression with some other expressions. `ops` must be a ++ r"""Compares an expression with some other expressions. `ops` must be a + list of :class:`Operand`\s. + """ + fields = ('expr', 'ops') +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/optimizer.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/optimizer.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/optimizer.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/optimizer.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,3 @@ +-# -*- coding: utf-8 -*- + """ + ambari_jinja2.optimizer + ~~~~~~~~~~~~~~~~ +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/parser.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/parser.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/parser.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/parser.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,3 @@ +-# -*- coding: utf-8 -*- + """ + ambari_jinja2.parser + ~~~~~~~~~~~~~ +@@ -21,7 +20,7 @@ + _compare_operators = frozenset(['eq', 'ne', 'lt', 'lteq', 'gt', 'gteq']) + + +-class Parser(object): ++class Parser: + """This is the central parsing class Jinja2 uses. It's passed to + extensions and can be used to parse expressions or statements. + """ +@@ -53,7 +52,7 @@ + def _fail_ut_eof(self, name, end_token_stack, lineno): + expected = [] + for exprs in end_token_stack: +- expected.extend(map(describe_token_expr, exprs)) ++ expected.extend(list(map(describe_token_expr, exprs))) + if end_token_stack: + currently_looking = ' or '.join( + "'%s'" % describe_token_expr(expr) +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/runtime.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/runtime.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/runtime.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/runtime.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,3 @@ +-# -*- coding: utf-8 -*- + """ + ambari_jinja2.runtime + ~~~~~~~~~~~~~~ +@@ -9,7 +8,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 +25,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 +34,17 @@ + def markup_join(seq): + """Concatenation that escapes if necessary and converts to unicode.""" + buf = [] +- iterator = imap(soft_unicode, seq) ++ iterator = list(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(list(map(str, seq))) + + + def new_context(environment, template_name, blocks, vars=None, +@@ -62,13 +61,13 @@ + # we don't want to modify the dict passed + if shared: + parent = dict(parent) +- for key, value in locals.iteritems(): ++ for key, value in list(locals.items()): + if key[:2] == 'l_' and value is not missing: + parent[key[2:]] = value + return Context(environment, parent, template_name, blocks) + + +-class TemplateReference(object): ++class TemplateReference: + """The `self` in templates.""" + + def __init__(self, context): +@@ -81,14 +80,14 @@ + return BlockReference(name, self.__context, blocks, 0) + + def __repr__(self): +- return '<%s %r>' % ( ++ return '<{} {!r}>'.format( + self.__class__.__name__, + self.__context.name + ) + + +-class Context(object): +- """The template context holds the variables of a template. It stores the ++class Context: ++ r"""The template context holds the variables of a template. It stores the + values passed to the template and also the names the template exports. + Creating instances is neither supported nor useful as it's created + automatically at various stages of the template evaluation and should not +@@ -120,7 +119,7 @@ + # 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 = {k: [v] for k, v in list(blocks.items())} + + def super(self, name, current): + """Render a parent block.""" +@@ -155,7 +154,7 @@ + + def get_exported(self): + """Get a new dict with the exported variables.""" +- return dict((k, self.vars[k]) for k in self.exported_vars) ++ return {k: self.vars[k] for k in self.exported_vars} + + def get_all(self): + """Return a copy of the complete context as dict including the +@@ -191,7 +190,7 @@ + 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 list(self.blocks.items())) + return context + + def _all(meth): +@@ -224,7 +223,7 @@ + return item + + def __repr__(self): +- return '<%s %s of %r>' % ( ++ return '<{} {} of {!r}>'.format( + self.__class__.__name__, + repr(self.get_all()), + self.name +@@ -239,7 +238,7 @@ + pass + + +-class BlockReference(object): ++class BlockReference: + """One block on a template reference.""" + + def __init__(self, name, context, stack, depth): +@@ -266,7 +265,7 @@ + return rv + + +-class LoopContext(object): ++class LoopContext: + """A loop context for dynamic iteration.""" + + def __init__(self, iterable, recurse=None): +@@ -326,14 +325,14 @@ + return self._length + + def __repr__(self): +- return '<%s %r/%r>' % ( ++ return '<{} {!r}/{!r}>'.format( + self.__class__.__name__, + self.index, + self.length + ) + + +-class LoopContextIterator(object): ++class LoopContextIterator: + """The iterator for a loop context.""" + __slots__ = ('context',) + +@@ -343,13 +342,13 @@ + def __iter__(self): + return self + +- def next(self): ++ def __next__(self): + ctx = self.context + ctx.index0 += 1 + return next(ctx._iterator), ctx + + +-class Macro(object): ++class Macro: + """Wraps a macro function.""" + + def __init__(self, environment, func, name, arguments, defaults, +@@ -407,13 +406,13 @@ + return self._func(*arguments) + + def __repr__(self): +- return '<%s %s>' % ( ++ return '<{} {}>'.format( + self.__class__.__name__, + self.name is None and 'anonymous' or repr(self.name) + ) + + +-class Undefined(object): ++class Undefined: + """The default undefined type. This undefined type can be printed and + iterated over, but every other access will raise an :exc:`UndefinedError`: + +@@ -444,13 +443,13 @@ + 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): +- hint = '%s has no element %r' % ( ++ elif not isinstance(self._undefined_name, str): ++ hint = '{} has no element {!r}'.format( + object_type_repr(self._undefined_obj), + self._undefined_name + ) + else: +- hint = '%r has no attribute %r' % ( ++ hint = '{!r} has no attribute {!r}'.format( + object_type_repr(self._undefined_obj), + self._undefined_name + ) +@@ -466,14 +465,14 @@ + _fail_with_undefined_error + + def __str__(self): +- return unicode(self).encode('utf-8') ++ return str(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 +481,7 @@ + if 0: + yield None + +- def __nonzero__(self): ++ def __bool__(self): + return False + + def __repr__(self): +@@ -507,12 +506,12 @@ + def __unicode__(self): + if self._undefined_hint is None: + if self._undefined_obj is missing: +- return u'{{ %s }}' % self._undefined_name +- return '{{ no such element: %s[%r] }}' % ( ++ return '{{ %s }}' % self._undefined_name ++ return '{{{{ no such element: {}[{!r}] }}}}'.format( + 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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/sandbox.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/sandbox.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/sandbox.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/sandbox.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,3 @@ +-# -*- coding: utf-8 -*- + """ + ambari_jinja2.sandbox + ~~~~~~~~~~~~~~ +@@ -24,11 +23,11 @@ + MAX_RANGE = 100000 + + #: attributes of function objects that are considered unsafe. +-UNSAFE_FUNCTION_ATTRIBUTES = set(['func_closure', 'func_code', 'func_dict', +- 'func_defaults', 'func_globals']) ++UNSAFE_FUNCTION_ATTRIBUTES = {'func_closure', 'func_code', 'func_dict', ++ 'func_defaults', 'func_globals'} + + #: unsafe method attributes. function attributes are unsafe for methods too +-UNSAFE_METHOD_ATTRIBUTES = set(['im_class', 'im_func', 'im_self']) ++UNSAFE_METHOD_ATTRIBUTES = {'im_class', 'im_func', 'im_self'} + + + import warnings +@@ -47,7 +46,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 +90,7 @@ + """A range that can't generate ranges with a length of more than + MAX_RANGE items. + """ +- rng = xrange(*args) ++ rng = list(range(*args)) + if len(rng) > MAX_RANGE: + raise OverflowError('range too big, maximum size for range is %d' % + MAX_RANGE) +@@ -209,7 +208,7 @@ + try: + return obj[argument] + except (TypeError, LookupError): +- if isinstance(argument, basestring): ++ if isinstance(argument, str): + try: + attr = str(argument) + except: +@@ -255,7 +254,7 @@ + # the double prefixes are to avoid double keyword argument + # errors when proxying the call. + if not __self.is_safe_callable(__obj): +- raise SecurityError('%r is not safely callable' % (__obj,)) ++ raise SecurityError('{!r} is not safely callable'.format(__obj)) + return __context.call(__obj, *args, **kwargs) + + +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/_stringdefs.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/_stringdefs.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/_stringdefs.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/_stringdefs.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,3 @@ +-# -*- coding: utf-8 -*- + """ + ambari_jinja2._stringdefs + ~~~~~~~~~~~~~~~~~~ +@@ -13,83 +12,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 +105,7 @@ + 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 +113,7 @@ + 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("""\ +@@ -123,7 +122,7 @@ + except UnicodeDecodeError: + Cs = '' # Jython can't handle isolated surrogates\n\n""" % val) + else: +- f.write('%s = %r\n\n' % (cat, val)) ++ f.write('{} = {!r}\n\n'.format(cat, val)) + f.write('cats = %r\n\n' % sorted(categories.keys())) + + f.write(footer) +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/tests.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/tests.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/tests.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/tests.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,3 @@ +-# -*- coding: utf-8 -*- + """ + ambari_jinja2.tests + ~~~~~~~~~~~~ +@@ -70,22 +69,22 @@ + + 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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/api.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/api.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/api.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/api.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,3 @@ +-# -*- coding: utf-8 -*- + """ + ambari_jinja2.testsuite.api + ~~~~~~~~~~~~~~~~~~~~ +@@ -40,7 +39,7 @@ + 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 +52,8 @@ + 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 +@@ -99,19 +98,19 @@ + def test_find_undeclared_variables(self): + ast = env.parse('{% set foo = 42 %}{{ bar + foo }}') + x = meta.find_undeclared_variables(ast) +- assert x == set(['bar']) ++ assert x == {'bar'} + + ast = env.parse('{% set foo = 42 %}{{ bar + foo }}' + '{% macro meh(x) %}{{ x }}{% endmacro %}' + '{% for item in seq %}{{ muh(item) + meh(seq) }}{% endfor %}') + x = meta.find_undeclared_variables(ast) +- assert x == set(['bar', 'seq', 'muh']) ++ assert x == {'bar', 'seq', 'muh'} + + 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" %}' +@@ -144,21 +143,21 @@ + 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(), '
') ++ stream = tmpl.stream(seq=list(range(4))) ++ 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 = tmpl.stream(seq=list(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 +181,7 @@ + + 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 +197,7 @@ + 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 +216,7 @@ + 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 +224,7 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/core_tags.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/core_tags.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/core_tags.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/core_tags.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,3 @@ +-# -*- coding: utf-8 -*- + """ + ambari_jinja2.testsuite.core_tags + ~~~~~~~~~~~~~~~~~~~~~~~~~~ +@@ -23,7 +22,7 @@ + + def test_simple(self): + tmpl = env.from_string('{% for item in seq %}{{ item }}{% endfor %}') +- assert tmpl.render(seq=range(10)) == '0123456789' ++ assert tmpl.render(seq=list(range(10))) == '0123456789' + + def test_else(self): + tmpl = env.from_string('{% for item in seq %}XXX{% else %}...{% endfor %}') +@@ -56,18 +55,17 @@ + tmpl = env.from_string('''{% for item in seq %}{{ + loop.cycle('<1>', '<2>') }}{% endfor %}{% + for item in seq %}{{ loop.cycle(*through) }}{% endfor %}''') +- output = tmpl.render(seq=range(4), through=('<1>', '<2>')) ++ output = tmpl.render(seq=list(range(4)), through=('<1>', '<2>')) + assert output == '<1><2>' * 4 + + def test_scope(self): + tmpl = env.from_string('{% for item in seq %}{% endfor %}{{ item }}') +- output = tmpl.render(seq=range(10)) ++ output = tmpl.render(seq=list(range(10))) + assert not output + + def test_varlen(self): + def inner(): +- for item in range(5): +- yield item ++ yield from list(range(5)) + tmpl = env.from_string('{% for item in iter %}{{ item }}{% endfor %}') + output = tmpl.render(iter=inner()) + assert output == '01234' +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/debug.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/debug.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/debug.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/debug.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,3 @@ +-# -*- coding: utf-8 -*- + """ + ambari_jinja2.testsuite.debug + ~~~~~~~~~~~~~~~~~~~~~~ +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/doctests.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/doctests.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/doctests.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/doctests.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,3 @@ +-# -*- coding: utf-8 -*- + """ + ambari_jinja2.testsuite.doctests + ~~~~~~~~~~~~~~~~~~~~~~~~~ +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/ext.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/ext.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/ext.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/ext.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,3 @@ +-# -*- coding: utf-8 -*- + """ + ambari_jinja2.testsuite.ext + ~~~~~~~~~~~~~~~~~~~~ +@@ -23,7 +22,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 +62,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' + } + } + +@@ -106,7 +105,7 @@ + newstyle_i18n_env.install_gettext_callables(gettext, ngettext, newstyle=True) + + class TestExtension(Extension): +- tags = set(['test']) ++ tags = {'test'} + ext_attr = 42 + + def parse(self, parser): +@@ -118,7 +117,7 @@ + ])]).set_lineno(next(parser.stream).lineno) + + def _dump(self, sandboxed, ext_attr, imported_object, context): +- return '%s|%s|%s|%s' % ( ++ return '{}|{}|{}|{}'.format( + sandboxed, + ext_attr, + imported_object, +@@ -137,8 +136,7 @@ + def filter_stream(self, stream): + for token in stream: + if token.type == 'data': +- for t in self.interpolate(token): +- yield t ++ yield from self.interpolate(token) + else: + yield token + +@@ -222,7 +220,7 @@ + original = Environment(extensions=[TestExtension]) + overlay = original.overlay() + for env in original, overlay: +- for ext in env.extensions.itervalues(): ++ for ext in list(env.extensions.values()): + assert ext.environment is env + + def test_preprocessor_extension(self): +@@ -272,30 +270,30 @@ + + def test_extract(self): + from ambari_jinja2.ext import babel_extract +- source = BytesIO(''' ++ source = BytesIO(b''' + {{ gettext('Hello World') }} + {% trans %}Hello World{% endtrans %} + {% trans %}{{ users }} user{% pluralize %}{{ users }} users{% endtrans %} +- '''.encode('ascii')) # make python 3 happy ++ ''') # 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): + from ambari_jinja2.ext import babel_extract +- source = BytesIO(''' ++ source = BytesIO(b''' + {# trans first #} + {{ gettext('Hello World') }} + {% trans %}Hello World{% endtrans %}{# trans second #} + {#: third #} + {% trans %}{{ users }} user{% pluralize %}{{ users }} users{% endtrans %} +- '''.encode('utf-8')) # make python 3 happy ++ ''') # 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 +322,12 @@ + 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 +336,7 @@ + + 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 +380,7 @@ + {{ "" }} + ''') + assert tmpl.render().split() == \ +- [u'<HelloWorld>', u'', u'<HelloWorld>'] ++ ['<HelloWorld>', '', '<HelloWorld>'] + + env = Environment(extensions=['ambari_jinja2.ext.autoescape'], + autoescape=False) +@@ -394,7 +392,7 @@ + {{ "" }} + ''') + assert tmpl.render().split() == \ +- [u'', u'<HelloWorld>', u''] ++ ['', '<HelloWorld>', ''] + + def test_nonvolatile(self): + env = Environment(extensions=['ambari_jinja2.ext.autoescape'], +@@ -432,7 +430,7 @@ + ''' + 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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/filters.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/filters.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/filters.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/filters.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,3 @@ +-# -*- coding: utf-8 -*- + """ + ambari_jinja2.testsuite.filters + ~~~~~~~~~~~~~~~~~~~~~~~~ +@@ -47,14 +46,14 @@ + def test_batch(self): + tmpl = env.from_string("{{ foo|batch(3)|list }}|" + "{{ foo|batch(3, 'X')|list }}") +- out = tmpl.render(foo=range(10)) ++ out = tmpl.render(foo=list(range(10))) + assert out == ("[[0, 1, 2], [3, 4, 5], [6, 7, 8], [9]]|" + "[[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 'X', 'X']]") + + def test_slice(self): + tmpl = env.from_string('{{ foo|slice(3)|list }}|' + '{{ foo|slice(3, "X")|list }}') +- out = tmpl.render(foo=range(10)) ++ out = tmpl.render(foo=list(range(10))) + assert out == ("[[0, 1, 2, 3], [4, 5, 6], [7, 8, 9]]|" + "[[0, 1, 2, 3], [4, 5, 6, 'X'], [7, 8, 9, 'X']]") + +@@ -91,7 +90,7 @@ + + def test_first(self): + tmpl = env.from_string('{{ foo|first }}') +- out = tmpl.render(foo=range(10)) ++ out = tmpl.render(foo=list(range(10))) + assert out == '0' + + def test_float(self): +@@ -130,7 +129,7 @@ + + def test_last(self): + tmpl = env.from_string('''{{ foo|last }}''') +- out = tmpl.render(foo=range(10)) ++ out = tmpl.render(foo=list(range(10))) + assert out == '9' + + def test_length(self): +@@ -146,12 +145,12 @@ + def test_pprint(self): + from pprint import pformat + tmpl = env.from_string('''{{ data|pprint }}''') +- data = range(1000) ++ data = list(range(1000)) + assert tmpl.render(data=data) == pformat(data) + + def test_random(self): + tmpl = env.from_string('''{{ seq|random }}''') +- seq = range(100) ++ seq = list(range(100)) + for _ in range(10): + assert int(tmpl.render(seq=seq)) in seq + +@@ -163,7 +162,7 @@ + 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 +270,7 @@ + + 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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/imports.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/imports.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/imports.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/imports.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,3 @@ +-# -*- coding: utf-8 -*- + """ + ambari_jinja2.testsuite.imports + ~~~~~~~~~~~~~~~~~~~~~~~~ +@@ -86,7 +85,7 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/inheritance.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/inheritance.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/inheritance.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/inheritance.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,3 @@ +-# -*- coding: utf-8 -*- + """ + ambari_jinja2.testsuite.inheritance + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +@@ -152,7 +151,7 @@ + })) + t = env.from_string('{% extends "master.html" %}{% block item %}' + '{{ item }}{% endblock %}') +- assert t.render(seq=range(5)) == '[0][1][2][3][4]' ++ assert t.render(seq=list(range(5))) == '[0][1][2][3][4]' + + def test_super_in_scoped_block(self): + env = Environment(loader=DictLoader({ +@@ -161,7 +160,7 @@ + })) + t = env.from_string('{% extends "master.html" %}{% block item %}' + '{{ super() }}|{{ item * 2 }}{% endblock %}') +- assert t.render(seq=range(5)) == '[0|0][1|2][2|4][3|6][4|8]' ++ assert t.render(seq=list(range(5))) == '[0|0][1|2][2|4][3|6][4|8]' + + + class BugFixTestCase(JinjaTestCase): +@@ -198,7 +197,7 @@ + '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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/__init__.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/__init__.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/__init__.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/__init__.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,3 @@ +-# -*- coding: utf-8 -*- + """ + ambari_jinja2.testsuite + ~~~~~~~~~~~~~~~~ +@@ -59,7 +58,7 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/lexnparse.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/lexnparse.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/lexnparse.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/lexnparse.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,3 @@ +-# -*- coding: utf-8 -*- + """ + ambari_jinja2.testsuite.lexnparse + ~~~~~~~~~~~~~~~~~~~~~~~~~~ +@@ -23,11 +22,7 @@ + + + # how does a string look like in jinja syntax? +-if sys.version_info < (3, 0): +- def jinja_string_repr(string): +- return repr(string)[1:] +-else: +- jinja_string_repr = repr ++jinja_string_repr = repr + + + class LexerTestCase(JinjaTestCase): +@@ -45,7 +40,7 @@ + env = Environment('{%', '%}', '${', '}') + tmpl = env.from_string('''{% for item in seq + %}${{'foo': item}|upper}{% endfor %}''') +- assert tmpl.render(seq=range(3)) == "{'FOO': 0}{'FOO': 1}{'FOO': 2}" ++ assert tmpl.render(seq=list(range(3))) == "{'FOO': 0}{'FOO': 1}{'FOO': 2}" + + def test_comments(self): + env = Environment('', '{', '}') +@@ -55,27 +50,27 @@ +
  • {item}
  • + + ''') +- assert tmpl.render(seq=range(3)) == ("
      \n
    • 0
    • \n " ++ assert tmpl.render(seq=list(range(3))) == ("
        \n
      • 0
      • \n " + "
      • 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 list(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 +90,7 @@ + + + ''') +- assert tmpl.render(seq=range(5)) == '01234' ++ assert tmpl.render(seq=list(range(5))) == '01234' + + def test_erb_syntax(self): + env = Environment('<%', '%>', '<%=', '%>', '<%#', '%>') +@@ -104,7 +99,7 @@ + <% for item in seq -%> + <%= item %> + <%- endfor %>''') +- assert tmpl.render(seq=range(5)) == '01234' ++ assert tmpl.render(seq=list(range(5))) == '01234' + + def test_comment_syntax(self): + env = Environment('', '${', '}', '') +@@ -113,7 +108,7 @@ + + ${item} + ''') +- assert tmpl.render(seq=range(5)) == '01234' ++ assert tmpl.render(seq=list(range(5))) == '01234' + + def test_balancing(self): + tmpl = env.from_string('''{{{'foo':'bar'}.foo}}''') +@@ -133,8 +128,8 @@ + % for item in seq: + ${item} + % endfor''') +- assert [int(x.strip()) for x in tmpl.render(seq=range(5)).split()] == \ +- range(5) ++ assert [int(x.strip()) for x in tmpl.render(seq=list(range(5))).split()] == \ ++ list(range(5)) + + env = Environment('<%', '%>', '${', '}', '<%#', '%>', '%', '##') + tmpl = env.from_string('''\ +@@ -142,8 +137,8 @@ + % for item in seq: + ${item} ## the rest of the stuff + % endfor''') +- assert [int(x.strip()) for x in tmpl.render(seq=range(5)).split()] == \ +- range(5) ++ assert [int(x.strip()) for x in tmpl.render(seq=list(range(5))).split()] == \ ++ list(range(5)) + + def test_line_syntax_priority(self): + # XXX: why is the whitespace there in front of the newline? +@@ -169,7 +164,7 @@ + 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' +@@ -322,10 +317,10 @@ + + def test_contant_casing(self): + for const in True, False, None: +- tmpl = env.from_string('{{ %s }}|{{ %s }}|{{ %s }}' % ( ++ tmpl = env.from_string('{{{{ {} }}}}|{{{{ {} }}}}|{{{{ {} }}}}'.format( + str(const), str(const).lower(), str(const).upper() + )) +- assert tmpl.render() == '%s|%s|' % (const, const) ++ assert tmpl.render() == '{}|{}|'.format(const, const) + + def test_test_chaining(self): + self.assert_raises(TemplateSyntaxError, env.from_string, +@@ -338,16 +333,16 @@ + assert tmpl.render() == 'foobarbaz' + + def test_notin(self): +- bar = xrange(100) ++ bar = list(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): ++ class Foo: + 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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/loader.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/loader.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/loader.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/loader.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,3 @@ +-# -*- coding: utf-8 -*- + """ + ambari_jinja2.testsuite.loader + ~~~~~~~~~~~~~~~~~~~~~~~ +@@ -72,7 +71,7 @@ + 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') +@@ -104,7 +103,7 @@ + archive = None + + def compile_down(self, zip='deflated', py_compile=False): +- super(ModuleLoaderTestCase, self).setup() ++ super().setup() + log = [] + self.reg_env = Environment(loader=prefix_loader) + if zip is not None: +@@ -118,7 +117,7 @@ + return ''.join(log) + + def teardown(self): +- super(ModuleLoaderTestCase, self).teardown() ++ super().teardown() + if hasattr(self, 'mod_env'): + if os.path.isfile(self.archive): + os.remove(self.archive) +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/regression.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/regression.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/regression.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/regression.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,3 @@ +-# -*- coding: utf-8 -*- + """ + ambari_jinja2.testsuite.regression + ~~~~~~~~~~~~~~~~~~~~~~~~~~~ +@@ -121,7 +120,7 @@ + + ''') + +- assert tmpl.render().split() == map(unicode, range(1, 11)) * 5 ++ assert tmpl.render().split() == list(map(str, list(range(1, 11)))) * 5 + + def test_weird_inline_comment(self): + env = Environment(line_statement_prefix='%') +@@ -173,7 +172,7 @@ + {{ 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 +197,13 @@ + '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 +244,7 @@ + })) + 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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/security.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/security.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/security.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/security.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,3 @@ +-# -*- coding: utf-8 -*- + """ + ambari_jinja2.testsuite.security + ~~~~~~~~~~~~~~~~~~~~~~~~~ +@@ -22,7 +21,7 @@ + from ambari_jinja2.exceptions import SecurityError, TemplateSyntaxError + + +-class PrivateStuff(object): ++class PrivateStuff: + + def bar(self): + return 23 +@@ -35,7 +34,7 @@ + return 'PrivateStuff' + + +-class PublicStuff(object): ++class PublicStuff: + bar = lambda self: 23 + _foo = lambda self: 42 + +@@ -77,7 +76,7 @@ + # 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') % '' == \ +@@ -94,7 +93,7 @@ + assert x.__html__() is x + + # it also knows how to treat __html__ objects +- class Foo(object): ++ class Foo: + def __html__(self): + return 'awesome' + def __unicode__(self): +@@ -116,7 +115,7 @@ + '{{ 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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/tests.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/tests.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/tests.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/tests.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,3 @@ +-# -*- coding: utf-8 -*- + """ + ambari_jinja2.testsuite.tests + ~~~~~~~~~~~~~~~~~~~~~~ +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/utils.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/utils.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/utils.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/testsuite/utils.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,3 @@ +-# -*- coding: utf-8 -*- + """ + ambari_jinja2.testsuite.utils + ~~~~~~~~~~~~~~~~~~~~~~ +@@ -49,7 +48,7 @@ + class HelpersTestCase(JinjaTestCase): + + def test_object_type_repr(self): +- class X(object): ++ class X: + pass + self.assert_equal(object_type_repr(42), 'int object') + self.assert_equal(object_type_repr([]), 'list object') +@@ -63,12 +62,12 @@ + + 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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/utils.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/utils.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/utils.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/utils.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,3 @@ +-# -*- coding: utf-8 -*- + """ + ambari_jinja2.utils + ~~~~~~~~~~~~ +@@ -12,18 +11,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', '>'))) ++ '^(?P(?:{})*)(?P.*?)(?P(?:{})*)$'.format( ++ '|'.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 +41,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 +56,7 @@ + # 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 +68,7 @@ + next = next + except NameError: + def next(x): +- return x.next() ++ return x.__next__() + + + # if this python version is unable to deal with unicode filenames +@@ -77,16 +76,10 @@ + # This is used in a couple of places. As far as Jinja is concerned + # filenames are unicode *or* bytestrings in 2.x and unicode only in + # 3.x because compile cannot handle bytes +-if sys.version_info < (3, 0): +- def _encode_filename(filename): +- if isinstance(filename, unicode): +- return filename.encode('utf-8') +- return filename +-else: +- def _encode_filename(filename): +- assert filename is None or isinstance(filename, str), \ ++def _encode_filename(filename): ++ assert filename is None or isinstance(filename, str), \ + 'filenames must be strings' +- return filename ++ return filename + + from keyword import iskeyword as is_python_keyword + +@@ -94,14 +87,14 @@ + # common types. These do exist in the special types module too which however + # does not exist in IronPython out of the box. Also that way we don't have + # to deal with implementation specific stuff here +-class _C(object): ++class _C: + def method(self): pass + def _func(): + yield None + 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 +145,7 @@ + + def internalcode(f): + """Marks the function as internally used""" +- internal_code.add(f.func_code) ++ internal_code.add(f.__code__) + return f + + +@@ -222,7 +215,7 @@ + """ + try: + return open(filename, mode) +- except IOError, e: ++ except OSError as e: + if e.errno not in (errno.ENOENT, errno.EISDIR): + raise + +@@ -271,7 +264,7 @@ + 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) +@@ -286,18 +279,18 @@ + middle.endswith('.net') or + middle.endswith('.com') + )): +- middle = '%s' % (middle, ++ middle = '{}'.format(middle, + nofollow_attr, trim_url(middle)) + if middle.startswith('http://') or \ + middle.startswith('https://'): +- middle = '%s' % (middle, ++ middle = '{}'.format(middle, + nofollow_attr, trim_url(middle)) + if '@' in middle and not middle.startswith('www.') and \ + not ':' in middle and _simple_email_re.match(middle): +- middle = '%s' % (middle, middle) ++ middle = '{}'.format(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 +300,7 @@ + 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 +308,7 @@ + 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 +330,7 @@ + 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,11 +338,11 @@ + 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): ++class LRUCache: + """A simple LRU Cache implementation.""" + + # this is fast for small capacities (something below 1000) but doesn't +@@ -434,7 +427,7 @@ + return len(self._mapping) + + def __repr__(self): +- return '<%s %r>' % ( ++ return '<{} {!r}>'.format( + self.__class__.__name__, + self._mapping + ) +@@ -499,15 +492,15 @@ + + def iteritems(self): + """Iterate over all items.""" +- return iter(self.items()) ++ return iter(list(self.items())) + + def values(self): + """Return a list of all values.""" +- return [x[1] for x in self.items()] ++ return [x[1] for x in list(self.items())] + + def itervalue(self): + """Iterate over all values.""" +- return iter(self.values()) ++ return iter(list(self.values())) + + def keys(self): + """Return a list of all keys ordered by most recent usage.""" +@@ -538,7 +531,7 @@ + pass + + +-class Cycler(object): ++class Cycler: + """A cycle helper for templates.""" + + def __init__(self, *items): +@@ -556,24 +549,24 @@ + """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) + return rv + + +-class Joiner(object): ++class Joiner: + """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 + + +@@ -591,7 +584,7 @@ + try: + from functools import partial + except ImportError: +- class partial(object): ++ class partial: + def __init__(self, _func, *args, **kwargs): + self._func = _func + self._args = args +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/visitor.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/visitor.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/visitor.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ambari_jinja2/visitor.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,3 @@ +-# -*- coding: utf-8 -*- + """ + ambari_jinja2.visitor + ~~~~~~~~~~~~~~ +@@ -11,7 +10,7 @@ + from ambari_jinja2.nodes import Node + + +-class NodeVisitor(object): ++class NodeVisitor: + """Walks the abstract syntax tree and call visitor functions for every + node found. The visitor functions may return values which will be + forwarded by the `visit` method. +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/docs/cache_extension.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/docs/cache_extension.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/docs/cache_extension.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/docs/cache_extension.py 2022-07-11 00:52:29.000000000 +0800 +@@ -4,10 +4,10 @@ + + class FragmentCacheExtension(Extension): + # a set of names that trigger the extension. +- tags = set(['cache']) ++ tags = {'cache'} + + def __init__(self, environment): +- super(FragmentCacheExtension, self).__init__(environment) ++ super().__init__(environment) + + # add the defaults to the environment + environment.extend( +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/docs/conf.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/docs/conf.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/docs/conf.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/docs/conf.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,3 @@ +-# -*- coding: utf-8 -*- + # + # Jinja2 documentation build configuration file, created by + # sphinx-quickstart on Sun Apr 27 21:42:41 2008. +@@ -126,12 +125,12 @@ + + # Additional stuff for the LaTeX preamble. + latex_preamble = ''' +-\usepackage{palatino} +-\definecolor{TitleColor}{rgb}{0.7,0,0} +-\definecolor{InnerLinkColor}{rgb}{0.7,0,0} +-\definecolor{OuterLinkColor}{rgb}{0.8,0,0} +-\definecolor{VerbatimColor}{rgb}{0.985,0.985,0.985} +-\definecolor{VerbatimBorderColor}{rgb}{0.8,0.8,0.8} ++\\usepackage{palatino} ++\\definecolor{TitleColor}{rgb}{0.7,0,0} ++\\definecolor{InnerLinkColor}{rgb}{0.7,0,0} ++\\definecolor{OuterLinkColor}{rgb}{0.8,0,0} ++\\definecolor{VerbatimColor}{rgb}{0.985,0.985,0.985} ++\\definecolor{VerbatimBorderColor}{rgb}{0.8,0.8,0.8} + ''' + + # Documents to append as an appendix to all manuals. +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/docs/jinjaext.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/docs/jinjaext.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/docs/jinjaext.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/docs/jinjaext.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,3 @@ +-# -*- coding: utf-8 -*- + """ + Jinja Documentation Extensions + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +@@ -97,7 +96,7 @@ + signature = inspect.formatargspec(*argspec) + except: + pass +- result = ['.. function:: %s%s' % (name, signature), ''] ++ result = ['.. function:: {}{}'.format(name, signature), ''] + result.extend(' ' + line for line in lines) + if aliases: + result.extend(('', ' :aliases: %s' % ', '.join( +@@ -109,10 +108,10 @@ + 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)) +@@ -141,16 +140,16 @@ + def walk(node, indent): + p = ' ' * indent + sig = ', '.join(node.fields) +- doc.append(p + '.. autoclass:: %s(%s)' % (node.__name__, sig), '') ++ doc.append(p + '.. autoclass:: {}({})'.format(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) + if members: + members.sort() +- doc.append('%s :members: %s' % (p, ', '.join(members)), '') ++ doc.append('{} :members: {}'.format(p, ', '.join(members)), '') + if node.__base__ != object: + doc.append('', '') + doc.append('%s :Node type: :class:`%s`' % +@@ -168,10 +167,10 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/examples/basic/cycle.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/examples/basic/cycle.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/examples/basic/cycle.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/examples/basic/cycle.py 2022-07-11 00:52:29.000000000 +0800 +@@ -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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/examples/basic/debugger.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/examples/basic/debugger.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/examples/basic/debugger.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/examples/basic/debugger.py 2022-07-11 00:52:29.000000000 +0800 +@@ -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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/examples/basic/inheritance.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/examples/basic/inheritance.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/examples/basic/inheritance.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/examples/basic/inheritance.py 2022-07-11 00:52:29.000000000 +0800 +@@ -9,4 +9,4 @@ + })) + + +-print env.get_template('c').render() ++print(env.get_template('c').render()) +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/examples/basic/test_filter_and_linestatements.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/examples/basic/test_filter_and_linestatements.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/examples/basic/test_filter_and_linestatements.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/examples/basic/test_filter_and_linestatements.py 2022-07-11 00:52:29.000000000 +0800 +@@ -22,4 +22,4 @@ + % endfilter + """) + +-print tmpl.render(seq=range(10)) ++print(tmpl.render(seq=list(range(10)))) +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/examples/basic/test_loop_filter.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/examples/basic/test_loop_filter.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/examples/basic/test_loop_filter.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/examples/basic/test_loop_filter.py 2022-07-11 00:52:29.000000000 +0800 +@@ -9,4 +9,4 @@ + if condition: {{ 1 if foo else 0 }} + """) + +-print tmpl.render(foo=True) ++print(tmpl.render(foo=True)) +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/examples/basic/test.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/examples/basic/test.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/examples/basic/test.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/examples/basic/test.py 2022-07-11 00:52:29.000000000 +0800 +@@ -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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/examples/basic/translate.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/examples/basic/translate.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/examples/basic/translate.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/examples/basic/translate.py 2022-07-11 00:52:29.000000000 +0800 +@@ -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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/examples/bench.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/examples/bench.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/examples/bench.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/examples/bench.py 2022-07-11 00:52:29.000000000 +0800 +@@ -248,7 +248,7 @@ + """, searchList=[dict(context)]) + + def test_cheetah(): +- unicode(cheetah_template) ++ str(cheetah_template) + + try: + import tenjin +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/examples/profile.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/examples/profile.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/examples/profile.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/examples/profile.py 2022-07-11 00:52:29.000000000 +0800 +@@ -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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/examples/rwbench/djangoext.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/examples/rwbench/djangoext.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/examples/rwbench/djangoext.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/examples/rwbench/djangoext.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,3 @@ +-# -*- coding: utf-8 -*- + from rwbench import ROOT + from os.path import join + from django.conf import settings +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/examples/rwbench/rwbench.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/examples/rwbench/rwbench.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/examples/rwbench/rwbench.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/examples/rwbench/rwbench.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,3 @@ +-# -*- coding: utf-8 -*- + """ + RealWorldish Benchmark + ~~~~~~~~~~~~~~~~~~~~~~ +@@ -56,8 +55,8 @@ + self.username = username + + +-users = map(User, [u'John Doe', u'Jane Doe', u'Peter Somewhat']) +-articles = map(Article, range(20)) ++users = list(map(User, ['John Doe', 'Jane Doe', 'Peter Somewhat'])) ++articles = list(map(Article, list(range(20)))) + navigation = [ + ('index', 'Index'), + ('about', 'About'), +@@ -104,7 +103,7 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ext/django2jinja/django2jinja.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ext/django2jinja/django2jinja.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ext/django2jinja/django2jinja.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ext/django2jinja/django2jinja.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,3 @@ +-# -*- coding: utf-8 -*- + """ + Django to Jinja + ~~~~~~~~~~~~~~~ +@@ -40,26 +39,26 @@ + import re + # List of tuple (Match pattern, Replace pattern, Exclusion pattern) + +- var_re = ((re.compile(r"(u|user)\.is_authenticated"), r"\1.is_authenticated()", None), +- (re.compile(r"\.non_field_errors"), r".non_field_errors()", None), +- (re.compile(r"\.label_tag"), r".label_tag()", None), +- (re.compile(r"\.as_dl"), r".as_dl()", None), +- (re.compile(r"\.as_table"), r".as_table()", None), +- (re.compile(r"\.as_widget"), r".as_widget()", None), +- (re.compile(r"\.as_hidden"), r".as_hidden()", None), ++ var_re = ((re.compile(r"(u|user)\\.is_authenticated"), r"\1.is_authenticated()", None), ++ (re.compile(r"\\.non_field_errors"), r".non_field_errors()", None), ++ (re.compile(r"\\.label_tag"), r".label_tag()", None), ++ (re.compile(r"\\.as_dl"), r".as_dl()", None), ++ (re.compile(r"\\.as_table"), r".as_table()", None), ++ (re.compile(r"\\.as_widget"), r".as_widget()", None), ++ (re.compile(r"\\.as_hidden"), r".as_hidden()", None), + +- (re.compile(r"\.get_([0-9_\w]+)_url"), r".get_\1_url()", None), +- (re.compile(r"\.url"), r".url()", re.compile(r"(form|calendar).url")), +- (re.compile(r"\.get_([0-9_\w]+)_display"), r".get_\1_display()", None), +- (re.compile(r"loop\.counter"), r"loop.index", None), +- (re.compile(r"loop\.revcounter"), r"loop.revindex", None), +- (re.compile(r"request\.GET\.([0-9_\w]+)"), r"request.GET.get('\1', '')", None), +- (re.compile(r"request\.get_host"), r"request.get_host()", None), ++ (re.compile(r"\\.get_([0-9_\\w]+)_url"), r".get_\1_url()", None), ++ (re.compile(r"\\.url"), r".url()", re.compile(r"(form|calendar).url")), ++ (re.compile(r"\\.get_([0-9_\\w]+)_display"), r".get_\1_display()", None), ++ (re.compile(r"loop\\.counter"), r"loop.index", None), ++ (re.compile(r"loop\\.revcounter"), r"loop.revindex", None), ++ (re.compile(r"request\\.GET\\.([0-9_\\w]+)"), r"request.GET.get('\1', '')", None), ++ (re.compile(r"request\\.get_host"), r"request.get_host()", None), + +- (re.compile(r"\.all(?!_)"), r".all()", None), +- (re.compile(r"\.all\.0"), r".all()[0]", None), +- (re.compile(r"\.([0-9])($|\s+)"), r"[\1]\2", None), +- (re.compile(r"\.items"), r".items()", None), ++ (re.compile(r"\\.all(?!_)"), r".all()", None), ++ (re.compile(r"\\.all\\.0"), r".all()[0]", None), ++ (re.compile(r"\\.([0-9])($|\\s+)"), r"[\1]\2", None), ++ (re.compile(r"\\.items"), r".items()", None), + ) + writer = Writer(var_re=var_re) + +@@ -78,7 +77,7 @@ + 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 = {} +@@ -92,7 +91,7 @@ + # call from it. + _old_cycle_init = core_tags.CycleNode.__init__ + def _fixed_cycle_init(self, cyclevars, variable_name=None): +- self.raw_cycle_vars = map(Variable, cyclevars) ++ self.raw_cycle_vars = list(map(Variable, cyclevars)) + _old_cycle_init(self, cyclevars, variable_name) + core_tags.CycleNode.__init__ = _fixed_cycle_init + +@@ -128,7 +127,7 @@ + + 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 +307,7 @@ + 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.""" +@@ -327,14 +326,14 @@ + is no such filter. + """ + if filter not in _resolved_filters: +- for library in libraries.values(): +- for key, value in library.filters.iteritems(): ++ for library in list(libraries.values()): ++ 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 +@@ -581,7 +580,7 @@ + for arg in node.args: + writer.write(', ') + writer.node(arg) +- for key, arg in node.kwargs.items(): ++ for key, arg in list(node.kwargs.items()): + writer.write(', %s=' % key) + writer.node(arg) + writer.write(')') +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ext/djangojinja2.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ext/djangojinja2.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ext/djangojinja2.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ext/djangojinja2.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,3 @@ +-# -*- coding: utf-8 -*- + """ + djangoambari_jinja2 + ~~~~~~~~~~~~ +@@ -53,7 +52,7 @@ + """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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ext/inlinegettext.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ext/inlinegettext.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/ext/inlinegettext.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/ext/inlinegettext.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,3 @@ +-# -*- coding: utf-8 -*- + """ + Inline Gettext + ~~~~~~~~~~~~~~ +@@ -32,7 +31,7 @@ + paren_stack = 0 + + for token in stream: +- if token.type is not 'data': ++ if token.type != 'data': + yield token + continue + +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/jinja2-debug.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/jinja2-debug.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/jinja2-debug.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/jinja2-debug.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,5 +1,4 @@ +-#!/usr/bin/env python +-# -*- coding: utf-8 -*- ++#!/usr/bin/env python3 + """ + Jinja2 Debug Interface + ~~~~~~~~~~~~~~~~~~~~~~ +@@ -18,7 +17,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 +30,7 @@ + + + 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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/setup.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/setup.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_jinja2/setup.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_jinja2/setup.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,3 @@ +-# -*- coding: utf-8 -*- + """ + Jinja2 + ~~~~~~ +@@ -50,11 +49,10 @@ + + # tell distribute to use 2to3 with our own fixers. + extra = {} +-if sys.version_info >= (3, 0): +- extra.update( +- use_2to3=True, +- use_2to3_fixers=['custom_fixers'] +- ) ++extra.update( ++ use_2to3=True, ++ use_2to3_fixers=['custom_fixers'] ++) + + # ignore the old '--with-speedups' flag + try: +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_simplejson/decoder.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_simplejson/decoder.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_simplejson/decoder.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_simplejson/decoder.py 2022-07-11 00:52:29.000000000 +0800 +@@ -15,7 +15,7 @@ + FLAGS = re.VERBOSE | re.MULTILINE | re.DOTALL + + def _floatconstants(): +- _BYTES = '7FF80000000000007FF0000000000000'.decode('hex') ++ _BYTES = bytes.fromhex('7FF80000000000007FF0000000000000') + if sys.byteorder != 'big': + _BYTES = _BYTES[:8][::-1] + _BYTES[8:][::-1] + nan, inf = struct.unpack('dd', _BYTES) +@@ -56,8 +56,8 @@ + + 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" +@@ -85,8 +85,8 @@ + content, terminator = chunk.groups() + # Content is contains zero or more unescaped string characters + if content: +- if not isinstance(content, unicode): +- content = unicode(content, encoding) ++ if 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 +@@ -94,7 +94,7 @@ + break + elif terminator != '\\': + if strict: +- msg = "Invalid control character %r at" % (terminator,) ++ msg = "Invalid control character {!r} at".format(terminator) + #msg = "Invalid control character {0!r} at".format(terminator) + raise ValueError(errmsg(msg, s, end)) + else: +@@ -132,11 +132,11 @@ + uni2 = int(esc2, 16) + uni = 0x10000 + (((uni - 0xd800) << 10) | (uni2 - 0xdc00)) + next_end += 6 +- char = unichr(uni) ++ char = chr(uni) + end = next_end + # Append the unescaped character + _append(char) +- return u''.join(chunks), end ++ return ''.join(chunks), end + + + # Use speedup if available +@@ -145,7 +145,8 @@ + WHITESPACE = re.compile(r'[ \t\n\r]*', FLAGS) + WHITESPACE_STR = ' \t\n\r' + +-def JSONObject((s, end), encoding, strict, scan_once, object_hook, _w=WHITESPACE.match, _ws=WHITESPACE_STR): ++def JSONObject(xxx_todo_changeme, encoding, strict, scan_once, object_hook, _w=WHITESPACE.match, _ws=WHITESPACE_STR): ++ (s, end) = xxx_todo_changeme + pairs = {} + # Use a slice to prevent IndexError from being raised, the following + # check will raise a more specific ValueError if the string is empty +@@ -220,7 +221,8 @@ + pairs = object_hook(pairs) + return pairs, end + +-def JSONArray((s, end), scan_once, _w=WHITESPACE.match, _ws=WHITESPACE_STR): ++def JSONArray(xxx_todo_changeme1, scan_once, _w=WHITESPACE.match, _ws=WHITESPACE_STR): ++ (s, end) = xxx_todo_changeme1 + values = [] + nextchar = s[end:end + 1] + if nextchar in _ws: +@@ -256,7 +258,7 @@ + + return values, end + +-class JSONDecoder(object): ++class JSONDecoder: + """Simple JSON decoder + + Performs the following translations in decoding by default: +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_simplejson/encoder.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_simplejson/encoder.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_simplejson/encoder.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_simplejson/encoder.py 2022-07-11 00:52:29.000000000 +0800 +@@ -25,7 +25,7 @@ + } + for i in range(0x20): + #ESCAPE_DCT.setdefault(chr(i), '\\u{0:04x}'.format(i)) +- ESCAPE_DCT.setdefault(chr(i), '\\u%04x' % (i,)) ++ ESCAPE_DCT.setdefault(chr(i), '\\u{:04x}'.format(i)) + + # Assume this produces an infinity on all machines (probably not guaranteed) + INFINITY = float('1e66666') +@@ -54,20 +54,20 @@ + n = ord(s) + if n < 0x10000: + #return '\\u{0:04x}'.format(n) +- return '\\u%04x' % (n,) ++ return '\\u{:04x}'.format(n) + else: + # surrogate pair + n -= 0x10000 + s1 = 0xd800 | ((n >> 10) & 0x3ff) + s2 = 0xdc00 | (n & 0x3ff) + #return '\\u{0:04x}\\u{1:04x}'.format(s1, s2) +- return '\\u%04x\\u%04x' % (s1, s2) ++ return '\\u{:04x}\\u{:04x}'.format(s1, s2) + return '"' + str(ESCAPE_ASCII.sub(replace, s)) + '"' + + + encode_basestring_ascii = c_encode_basestring_ascii or py_encode_basestring_ascii + +-class JSONEncoder(object): ++class JSONEncoder: + """Extensible JSON encoder for Python data structures. + + Supports the following objects and types by default: +@@ -184,7 +184,7 @@ + + """ + # This is for extremely simple cases and benchmarks. +- if isinstance(o, basestring): ++ if isinstance(o, str): + if isinstance(o, str): + _encoding = self.encoding + if (_encoding is not None +@@ -261,19 +261,20 @@ + + def _make_iterencode(markers, _default, _encoder, _indent, _floatstr, _key_separator, _item_separator, _sort_keys, _skipkeys, _one_shot, + ## HACK: hand-optimized bytecode; turn globals into locals +- False=False, +- True=True, +- ValueError=ValueError, +- basestring=basestring, +- dict=dict, +- float=float, +- id=id, +- int=int, +- isinstance=isinstance, +- list=list, +- long=long, +- str=str, +- tuple=tuple, ++ ## HACK: hand-optimized bytecode; turn globals into locals ++ # False=False, ++ # True=True, ++ # ValueError=ValueError, ++ # str=str, ++ # dict=dict, ++ # float=float, ++ # id=id, ++ # int=int, ++ # isinstance=isinstance, ++ # list=list, ++ # long=int, ++ # str=str, ++ # tuple=tuple, + ): + + def _iterencode_list(lst, _current_indent_level): +@@ -300,7 +301,7 @@ + first = False + else: + buf = separator +- if isinstance(value, basestring): ++ if isinstance(value, str): + yield buf + _encoder(value) + elif value is None: + yield buf + 'null' +@@ -308,7 +309,7 @@ + yield buf + 'true' + elif value is False: + yield buf + 'false' +- elif isinstance(value, (int, long)): ++ elif isinstance(value, int): + yield buf + str(value) + elif isinstance(value, float): + yield buf + _floatstr(value) +@@ -320,8 +321,7 @@ + chunks = _iterencode_dict(value, _current_indent_level) + else: + chunks = _iterencode(value, _current_indent_level) +- for chunk in chunks: +- yield chunk ++ yield from chunks + if newline_indent is not None: + _current_indent_level -= 1 + yield '\n' + (' ' * (_indent * _current_indent_level)) +@@ -349,12 +349,12 @@ + item_separator = _item_separator + first = True + if _sort_keys: +- items = dct.items() ++ items = list(dct.items()) + items.sort(key=lambda kv: kv[0]) + else: +- items = dct.iteritems() ++ items = iter(list(dct.items())) + for key, value in items: +- if isinstance(key, basestring): ++ if isinstance(key, str): + pass + # JavaScript is weakly typed for these, so it makes sense to + # also allow them. Many encoders seem to do something like this. +@@ -366,7 +366,7 @@ + key = 'false' + elif key is None: + key = 'null' +- elif isinstance(key, (int, long)): ++ elif isinstance(key, int): + key = str(key) + elif _skipkeys: + continue +@@ -378,7 +378,7 @@ + yield item_separator + yield _encoder(key) + yield _key_separator +- if isinstance(value, basestring): ++ if isinstance(value, str): + yield _encoder(value) + elif value is None: + yield 'null' +@@ -386,7 +386,7 @@ + yield 'true' + elif value is False: + yield 'false' +- elif isinstance(value, (int, long)): ++ elif isinstance(value, int): + yield str(value) + elif isinstance(value, float): + yield _floatstr(value) +@@ -397,8 +397,7 @@ + chunks = _iterencode_dict(value, _current_indent_level) + else: + chunks = _iterencode(value, _current_indent_level) +- for chunk in chunks: +- yield chunk ++ yield from chunks + if newline_indent is not None: + _current_indent_level -= 1 + yield '\n' + (' ' * (_indent * _current_indent_level)) +@@ -407,7 +406,7 @@ + del markers[markerid] + + def _iterencode(o, _current_indent_level): +- if isinstance(o, basestring): ++ if isinstance(o, str): + yield _encoder(o) + elif o is None: + yield 'null' +@@ -415,16 +414,14 @@ + yield 'true' + elif o is False: + yield 'false' +- elif isinstance(o, (int, long)): ++ elif isinstance(o, int): + yield str(o) + elif isinstance(o, float): + yield _floatstr(o) + elif isinstance(o, (list, tuple)): +- for chunk in _iterencode_list(o, _current_indent_level): +- yield chunk ++ yield from _iterencode_list(o, _current_indent_level) + elif isinstance(o, dict): +- for chunk in _iterencode_dict(o, _current_indent_level): +- yield chunk ++ yield from _iterencode_dict(o, _current_indent_level) + else: + if markers is not None: + markerid = id(o) +@@ -432,8 +429,7 @@ + raise ValueError("Circular reference detected") + markers[markerid] = o + o = _default(o) +- for chunk in _iterencode(o, _current_indent_level): +- yield chunk ++ yield from _iterencode(o, _current_indent_level) + if markers is not None: + del markers[markerid] + +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_simplejson/__init__.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_simplejson/__init__.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_simplejson/__init__.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_simplejson/__init__.py 2022-07-11 00:52:29.000000000 +0800 +@@ -105,8 +105,8 @@ + + __author__ = 'Bob Ippolito ' + +-from decoder import JSONDecoder +-from encoder import JSONEncoder ++from .decoder import JSONDecoder ++from .encoder import JSONEncoder + + _default_encoder = JSONEncoder( + skipkeys=False, +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_stomp/adapter/multicast.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_stomp/adapter/multicast.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_stomp/adapter/multicast.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_stomp/adapter/multicast.py 2022-07-11 00:52:29.000000000 +0800 +@@ -75,7 +75,7 @@ + + if frame_type in ['connected', 'message', 'receipt', 'error', 'heartbeat']: + if frame_type == 'message': +- if f.headers['destination'] not in self.subscriptions.values(): ++ if f.headers['destination'] not in list(self.subscriptions.values()): + return + (f.headers, f.body) = self.notify('before_message', f.headers, f.body) + self.notify(frame_type, f.headers, f.body) +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_stomp/adapter/websocket.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_stomp/adapter/websocket.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_stomp/adapter/websocket.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_stomp/adapter/websocket.py 2022-07-11 00:52:29.000000000 +0800 +@@ -19,7 +19,7 @@ + import copy + import logging + +-from Queue import Queue ++import queue + + from ambari_stomp.connect import BaseConnection + from ambari_stomp.protocol import Protocol12 +@@ -35,7 +35,7 @@ + class QueuedWebSocketClient(WebSocketClient): + def __init__(self, *args, **kwargs): + WebSocketClient.__init__(self, *args, **kwargs) +- self.messages = Queue() ++ self.messages = queue.Queue() + + def received_message(self, message): + """ +@@ -99,7 +99,7 @@ + try: + msg = self.ws.receive() + msg = str(msg) if msg is not None else msg +- logger.debug("Incoming STOMP message:\n<<< {0}".format(msg)) ++ logger.debug("Incoming STOMP message:\n<<< {}".format(msg)) + return msg + except: + # exceptions from this method are hidden by the framework so implementing logging by ourselves +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_stomp/backward2.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_stomp/backward2.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_stomp/backward2.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_stomp/backward2.py 2022-07-11 00:52:29.000000000 +0800 +@@ -11,7 +11,7 @@ + + :rtype: str + """ +- return raw_input(prompt) ++ return input(prompt) + + + def decode(byte_data): +@@ -33,7 +33,7 @@ + + :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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_stomp/backward3.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_stomp/backward3.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_stomp/backward3.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_stomp/backward3.py 2022-07-11 00:52:29.000000000 +0800 +@@ -13,7 +13,7 @@ + + :rtype: str + """ +- return input(prompt) ++ return eval(input(prompt)) + + + def decode(byte_data): +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_stomp/backwardsock25.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_stomp/backwardsock25.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_stomp/backwardsock25.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_stomp/backwardsock25.py 2022-07-11 00:52:29.000000000 +0800 +@@ -25,8 +25,8 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_stomp/exception.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_stomp/exception.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_stomp/exception.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_stomp/exception.py 2022-07-11 00:52:29.000000000 +0800 +@@ -4,7 +4,7 @@ + class StompException(Exception): + """ + Common exception class. All specific stomp.py exceptions are subclasses +- of StompException, allowing the library user to catch all current and ++ of StompException as allowing the library user to catch all current and + future library exceptions. + """ + +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_stomp/listener.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_stomp/listener.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_stomp/listener.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_stomp/listener.py 2022-07-11 00:52:29.000000000 +0800 +@@ -15,7 +15,7 @@ + log = logging.getLogger('stomp.py') + + +-class Publisher(object): ++class Publisher: + """ + Simply a registry of listeners. + """ +@@ -48,7 +48,7 @@ + return None + + +-class ConnectionListener(object): ++class ConnectionListener: + """ + This class should be used as a base class for objects registered + using Connection.set_listener(). +@@ -287,7 +287,7 @@ + self.transport.set_connected(False) + self.transport.disconnect_socket() + self.transport.stop() +- for listener in self.transport.listeners.values(): ++ for listener in list(self.transport.listeners.values()): + listener.on_heartbeat_timeout() + self.heartbeat_thread = None + +@@ -407,11 +407,11 @@ + Return a string containing the current statistics (messages sent and received, + errors, etc) + """ +- return '''Connections: %s +-Messages sent: %s +-Messages received: %s +-Heartbeats received: %s +-Errors: %s''' % (self.connections, self.messages_sent, self.messages, self.heartbeat_count, self.errors) ++ return '''Connections: {} ++Messages sent: {} ++Messages received: {} ++Heartbeats received: {} ++Errors: {}'''.format(self.connections, self.messages_sent, self.messages, self.heartbeat_count, self.errors) + + + class PrintingListener(ConnectionListener): +@@ -419,14 +419,14 @@ + """ + :param (str,int) host_and_port: + """ +- print('on_connecting %s %s' % host_and_port) ++ print(('on_connecting %s %s' % host_and_port)) + + def on_connected(self, headers, body): + """ + :param dict headers: + :param body: + """ +- print('on_connected %s %s' % (headers, body)) ++ print(('on_connected {} {}'.format(headers, body))) + + def on_disconnected(self): + print('on_disconnected') +@@ -439,7 +439,7 @@ + :param dict headers: + :param body: + """ +- print('on_before_message %s %s' % (headers, body)) ++ print(('on_before_message {} {}'.format(headers, body))) + return headers, body + + def on_message(self, headers, body): +@@ -447,27 +447,27 @@ + :param dict headers: + :param body: + """ +- print('on_message %s %s' % (headers, body)) ++ print(('on_message {} {}'.format(headers, body))) + + def on_receipt(self, headers, body): + """ + :param dict headers: + :param body: + """ +- print('on_receipt %s %s' % (headers, body)) ++ print(('on_receipt {} {}'.format(headers, body))) + + def on_error(self, headers, body): + """ + :param dict headers: + :param body: + """ +- print('on_error %s %s' % (headers, body)) ++ print(('on_error {} {}'.format(headers, body))) + + def on_send(self, frame): + """ + :param Frame frame: + """ +- print('on_send %s %s %s' % (frame.cmd, frame.headers, frame.body)) ++ print(('on_send {} {} {}'.format(frame.cmd, frame.headers, frame.body))) + + def on_heartbeat(self): + print('on_heartbeat') +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_stomp/__main__.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_stomp/__main__.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_stomp/__main__.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_stomp/__main__.py 2022-07-11 00:52:29.000000000 +0800 +@@ -27,10 +27,10 @@ + try: + import uuid + except ImportError: +- from backward import uuid ++ from .backward import uuid + + +-class SubscriptionInfo(object): ++class SubscriptionInfo: + """ + Used to store info about a subscription. + """ +@@ -87,8 +87,8 @@ + self.__sysout("\r \r", end='') + if self.verbose: + self.__sysout(frame_type) +- for k, v in headers.items(): +- self.__sysout('%s: %s' % (k, v)) ++ for k, v in list(headers.items()): ++ self.__sysout('{}: {}'.format(k, v)) + if self.prompt != '': + self.__sysout('') + self.__sysout(body) +@@ -123,7 +123,7 @@ + if 'filename' in headers: + content = base64.b64decode(body.encode()) + if os.path.exists(headers['filename']): +- fname = '%s.%s' % (headers['filename'], int(time.time())) ++ fname = '{}.{}'.format(headers['filename'], int(time.time())) + else: + fname = headers['filename'] + with open(fname, 'wb') as f: +@@ -219,7 +219,7 @@ + sid = self.__subscription_id + self.__subscription_id += 1 + +- self.__sysout('Subscribing to "%s" with acknowledge set to "%s", id set to "%s"' % (name, ack_mode, sid)) ++ self.__sysout('Subscribing to "{}" with acknowledge set to "{}", id set to "{}"'.format(name, ack_mode, sid)) + self.conn.subscribe(destination=name, ack=ack_mode, id=sid) + self.__subscriptions[name] = SubscriptionInfo(sid, ack_mode) + +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_stomp/protocol.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_stomp/protocol.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_stomp/protocol.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_stomp/protocol.py 2022-07-11 00:52:29.000000000 +0800 +@@ -224,7 +224,7 @@ + """ + :param dict(str,str) headers: + """ +- for key, val in headers.items(): ++ for key, val in list(headers.items()): + try: + val = val.replace('\\', '\\\\').replace('\n', '\\n').replace(':', '\\c') + except: +@@ -442,7 +442,7 @@ + """ + :param dict(str,str) headers: + """ +- for key, val in headers.items(): ++ for key, val in list(headers.items()): + try: + val = val.replace('\\', '\\\\').replace('\n', '\\n').replace(':', '\\c').replace('\r', '\\r') + except: +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_stomp/transport.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_stomp/transport.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_stomp/transport.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_stomp/transport.py 2022-07-11 00:52:29.000000000 +0800 +@@ -21,7 +21,7 @@ + except (ImportError, AttributeError): # python version < 2.6 without the backported ssl module + ssl = None + +- class SSLError(object): ++ class SSLError: + pass + + DEFAULT_SSL_VERSION = None +@@ -222,7 +222,7 @@ + elif frame_type == 'disconnected': + self.set_connected(False) + +- for listener in self.listeners.values(): ++ for listener in list(self.listeners.values()): + if not listener: + continue + +@@ -253,7 +253,7 @@ + + :param Frame frame: the Frame object to transmit + """ +- for listener in self.listeners.values(): ++ for listener in list(self.listeners.values()): + if not listener: + continue + try: +@@ -569,7 +569,7 @@ + """ + try: + return self.socket is not None and self.socket.getsockname()[1] != 0 and BaseTransport.is_connected(self) +- except socket.error: ++ except OSError: + return False + + def disconnect_socket(self): +@@ -594,7 +594,7 @@ + elif hasattr(socket, 'SHUT_RDWR'): + try: + self.socket.shutdown(socket.SHUT_RDWR) +- except socket.error: ++ except OSError: + _, e, _ = sys.exc_info() + # ignore when socket already closed + if get_errno(e) != errno.ENOTCONN: +@@ -606,7 +606,7 @@ + if self.socket is not None: + try: + self.socket.close() +- except socket.error: ++ except OSError: + _, e, _ = sys.exc_info() + log.warning("Unable to close socket because of error '%s'", e) + self.current_host_and_port = None +@@ -634,7 +634,7 @@ + """ + try: + return self.socket.recv(1024) +- except socket.error: ++ except OSError: + _, e, _ = sys.exc_info() + if get_errno(e) in (errno.EAGAIN, errno.EINTR): + log.debug("socket read interrupted, restarting") +@@ -769,7 +769,7 @@ + self.current_host_and_port = host_and_port + log.info("Established connection to host %s, port %s", host_and_port[0], host_and_port[1]) + break +- except socket.error: ++ except OSError: + self.socket = None + connect_count += 1 + log.warning("Could not connect to host %s, port %s", host_and_port[0], host_and_port[1], exc_info=1) +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_stomp/utils.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_stomp/utils.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_stomp/utils.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_stomp/utils.py 2022-07-11 00:52:29.000000000 +0800 +@@ -80,7 +80,7 @@ + ':': '\\c', + '\\': '\\\\', + } +-_HEADER_UNESCAPES = dict((value, key) for (key, value) in _HEADER_ESCAPES.items()) ++_HEADER_UNESCAPES = {value: key for (key, value) in list(_HEADER_ESCAPES.items())} + + + def _unescape_header(matchobj): +@@ -210,7 +210,7 @@ + if type(vals) != tuple: + vals = (vals,) + for val in vals: +- lines.append("%s:%s\n" % (key, val)) ++ lines.append("{}:{}\n".format(key, val)) + lines.append("\n") + if frame.body: + lines.append(frame.body) +@@ -233,7 +233,7 @@ + return 0 + + +-class Frame(object): ++class Frame: + """ + A STOMP frame (or message). + +@@ -247,4 +247,4 @@ + self.body = body + + def __str__(self): +- return '{cmd=%s,headers=[%s],body=%s}' % (self.cmd, self.headers, self.body) ++ return '{{cmd={},headers=[{}],body={}}}'.format(self.cmd, self.headers, self.body) +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_ws4py/client/geventclient.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_ws4py/client/geventclient.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_ws4py/client/geventclient.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_ws4py/client/geventclient.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,3 @@ +-# -*- coding: utf-8 -*- + import copy + + import gevent +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_ws4py/client/__init__.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_ws4py/client/__init__.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_ws4py/client/__init__.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_ws4py/client/__init__.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,3 @@ +-# -*- coding: utf-8 -*- + from base64 import b64encode + from hashlib import sha1 + import os +@@ -115,7 +114,7 @@ + self.host.startswith('::'): + try: + sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_V6ONLY, 0) +- except (AttributeError, socket.error): ++ except (AttributeError, OSError): + pass + + WebSocket.__init__(self, sock, protocols=protocols, +@@ -254,7 +253,7 @@ + handshake. + """ + headers = [ +- ('Host', '%s:%s' % (self.host, self.port)), ++ ('Host', '{}:{}'.format(self.host, self.port)), + ('Connection', 'Upgrade'), + ('Upgrade', 'websocket'), + ('Sec-WebSocket-Key', self.key.decode('utf-8')), +@@ -293,7 +292,7 @@ + headers = self.handshake_headers + request = [("GET %s HTTP/1.1" % self.resource).encode('utf-8')] + for header, value in headers: +- request.append(("%s: %s" % (header, value)).encode('utf-8')) ++ request.append(("{}: {}".format(header, value)).encode('utf-8')) + request.append(b'\r\n') + + return b'\r\n'.join(request) +@@ -305,7 +304,7 @@ + """ + protocol, code, status = response_line.split(b' ', 2) + if code != b'101': +- raise HandshakeError("Invalid response status: %s %s" % (code, status)) ++ raise HandshakeError("Invalid response status: {} {}".format(code, status)) + + def process_handshake_header(self, headers): + """ +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_ws4py/client/threadedclient.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_ws4py/client/threadedclient.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_ws4py/client/threadedclient.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_ws4py/client/threadedclient.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,3 @@ +-# -*- coding: utf-8 -*- + import threading + + from ambari_ws4py.client import WebSocketBaseClient +@@ -85,7 +84,7 @@ + print(("Closed down", code, reason)) + + def received_message(self, m): +- print("#%d" % len(m)) ++ print(("#%d" % len(m))) + if len(m) == 175: + self.close(reason='bye bye') + +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_ws4py/client/tornadoclient.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_ws4py/client/tornadoclient.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_ws4py/client/tornadoclient.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_ws4py/client/tornadoclient.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,3 @@ +-# -*- coding: utf-8 -*- + import ssl + + from tornado import iostream, escape +@@ -141,7 +140,7 @@ + self.send("*" * i) + + def received_message(self, m): +- print("#%d" % len(m)) ++ print(("#%d" % len(m))) + if len(m) == 175: + self.close() + +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_ws4py/compat.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_ws4py/compat.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_ws4py/compat.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_ws4py/compat.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,3 @@ +-# -*- coding: utf-8 -*- + __doc__ = """ + This compatibility module is inspired by the one found + in CherryPy. It provides a common entry point for the various +@@ -13,34 +12,20 @@ + """ + import sys + +-if sys.version_info >= (3, 0): +- py3k = True +- from urllib.parse import urlsplit +- range = range +- unicode = str +- basestring = (bytes, str) +- _ord = ord +- +- def get_connection(fileobj): +- return fileobj.raw._sock +- +- def detach_connection(fileobj): +- fileobj.detach() +- +- def ord(c): +- if isinstance(c, int): +- return c +- return _ord(c) +-else: +- py3k = False +- from urlparse import urlsplit +- range = xrange +- unicode = unicode +- basestring = basestring +- ord = ord +- +- def get_connection(fileobj): +- return fileobj._sock +- +- def detach_connection(fileobj): +- fileobj._sock = None ++py3k = True ++from urllib.parse import urlsplit ++range = range ++str = str ++str = (bytes, str) ++_ord = ord ++ ++def get_connection(fileobj): ++ return fileobj.raw._sock ++ ++def detach_connection(fileobj): ++ fileobj.detach() ++ ++def ord(c): ++ if isinstance(c, int): ++ return c ++ return _ord(c) +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_ws4py/exc.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_ws4py/exc.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_ws4py/exc.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_ws4py/exc.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,5 +1,3 @@ +-# -*- coding: utf-8 -*- +- + __all__ = ['WebSocketException', 'FrameTooLargeException', 'ProtocolException', + 'UnsupportedFrameTypeException', 'TextFrameEncodingException', + 'UnsupportedFrameTypeException', 'TextFrameEncodingException', +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_ws4py/framing.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_ws4py/framing.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_ws4py/framing.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_ws4py/framing.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,7 +1,6 @@ +-# -*- coding: utf-8 -*- + from struct import pack, unpack + +-from ambari_ws4py.exc import FrameTooLargeException, ProtocolException ++from ambari_ws4py.exc import FrameTooLargeException as ProtocolException + from ambari_ws4py.compat import py3k, ord, range + + # Frame opcodes defined in the spec. +@@ -14,7 +13,7 @@ + + __all__ = ['Frame'] + +-class Frame(object): ++class Frame: + def __init__(self, opcode=None, body=b'', masking_key=None, fin=0, rsv1=0, rsv2=0, rsv3=0): + """ + Implements the framing protocol as defined by RFC 6455. +@@ -266,7 +265,7 @@ + """ + masked = bytearray(data) + if py3k: key = self.masking_key +- else: key = map(ord, self.masking_key) ++ else: key = list(map(ord, self.masking_key)) + for i in range(len(data)): + masked[i] = masked[i] ^ key[i%4] + return masked +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_ws4py/__init__.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_ws4py/__init__.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_ws4py/__init__.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_ws4py/__init__.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,3 @@ +-# -*- coding: utf-8 -*- + # + # Redistribution and use in source and binary forms, with or without + # modification, are permitted provided that the following conditions are +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_ws4py/manager.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_ws4py/manager.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_ws4py/manager.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_ws4py/manager.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,3 @@ +-# -*- coding: utf-8 -*- + __doc__ = """ + The manager module provides a selected classes to + handle websocket's execution. +@@ -51,7 +50,7 @@ + + logger = logging.getLogger('ambari_ws4py') + +-class SelectPoller(object): ++class SelectPoller: + def __init__(self, timeout=0.1): + """ + A socket poller that uses the `select` +@@ -94,11 +93,11 @@ + return [] + try: + r, w, x = select.select(self._fds, [], [], self.timeout) +- except IOError as e: ++ except OSError as e: + return [] + return r + +-class EPollPoller(object): ++class EPollPoller: + def __init__(self, timeout=0.1): + """ + An epoll poller that uses the ``epoll`` +@@ -123,7 +122,7 @@ + """ + try: + self.poller.register(fd, select.EPOLLIN | select.EPOLLPRI) +- except IOError: ++ except OSError: + pass + + def unregister(self, fd): +@@ -139,14 +138,14 @@ + """ + try: + events = self.poller.poll(timeout=self.timeout) +- except IOError: ++ except OSError: + events = [] + + for fd, event in events: + if event | select.EPOLLIN | select.EPOLLPRI: + yield fd + +-class KQueuePoller(object): ++class KQueuePoller: + def __init__(self, timeout=0.1): + """ + An epoll poller that uses the ``epoll`` +@@ -171,7 +170,7 @@ + """ + try: + self.poller.register(fd, select.EPOLLIN | select.EPOLLPRI) +- except IOError: ++ except OSError: + pass + + def unregister(self, fd): +@@ -187,7 +186,7 @@ + """ + try: + events = self.poller.poll(timeout=self.timeout) +- except IOError: ++ except OSError: + events = [] + for fd, event in events: + if event | select.EPOLLIN | select.EPOLLPRI: +@@ -228,9 +227,9 @@ + + def __iter__(self): + if py3k: +- return iter(self.websockets.values()) ++ return iter(list(self.websockets.values())) + else: +- return self.websockets.itervalues() ++ return iter(self.websockets.values()) + + def __contains__(self, ws): + fd = ws.sock.fileno() +@@ -322,7 +321,7 @@ + # Treat the error as if once() had returned None + except Exception as e: + x = None +- logger.error("Terminating websocket %s due to exception: %s in once method" % (format_addresses(ws), repr(e)) ) ++ logger.error("Terminating websocket {} due to exception: {} in once method".format(format_addresses(ws), repr(e)) ) + if not x: + with self.lock: + self.websockets.pop(fd, None) +@@ -356,9 +355,9 @@ + with self.lock: + websockets = self.websockets.copy() + if py3k: +- ws_iter = iter(websockets.values()) ++ ws_iter = iter(list(websockets.values())) + else: +- ws_iter = websockets.itervalues() ++ ws_iter = iter(websockets.values()) + + for ws in ws_iter: + if not ws.terminated: +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_ws4py/messaging.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_ws4py/messaging.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_ws4py/messaging.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_ws4py/messaging.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,15 +1,14 @@ +-# -*- coding: utf-8 -*- + import os + import struct + + from ambari_ws4py.framing import Frame, OPCODE_CONTINUATION, OPCODE_TEXT, \ + OPCODE_BINARY, OPCODE_CLOSE, OPCODE_PING, OPCODE_PONG +-from ambari_ws4py.compat import unicode, py3k ++from ambari_ws4py.compat import str, py3k + + __all__ = ['Message', 'TextMessage', 'BinaryMessage', 'CloseControlMessage', + 'PingControlMessage', 'PongControlMessage'] + +-class Message(object): ++class Message: + def __init__(self, opcode, data=b'', encoding='utf-8'): + """ + A message is a application level entity. It's usually built +@@ -32,7 +31,7 @@ + self._completed = False + self.encoding = encoding + +- if isinstance(data, unicode): ++ if isinstance(data, str): + if not encoding: + raise TypeError("unicode data without an encoding") + data = data.encode(encoding) +@@ -95,7 +94,7 @@ + self.data += data + elif isinstance(data, bytearray): + self.data += bytes(data) +- elif isinstance(data, unicode): ++ elif isinstance(data, str): + self.data += data.encode(self.encoding) + else: + raise TypeError("%s is not a supported data type" % type(data)) +@@ -144,7 +143,7 @@ + if code: + data += struct.pack("!H", code) + if reason is not None: +- if isinstance(reason, unicode): ++ if isinstance(reason, str): + reason = reason.encode('utf-8') + data += reason + +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_ws4py/server/cherrypyserver.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_ws4py/server/cherrypyserver.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_ws4py/server/cherrypyserver.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_ws4py/server/cherrypyserver.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,3 @@ +-# -*- coding: utf-8 -*- + __doc__ = """ + WebSocket within CherryPy is a tricky bit since CherryPy is + a threaded server which would choke quickly if each thread +@@ -336,7 +335,7 @@ + WebSocketPlugin(cherrypy.engine).subscribe() + cherrypy.tools.websocket = WebSocketTool() + +- class Root(object): ++ class Root: + @cherrypy.expose + @cherrypy.tools.websocket(on=False) + def ws(self): +@@ -344,35 +343,35 @@ + + + + + +
      + +
      +- ++ + +
      + + +- """ % {'username': "User%d" % random.randint(0, 100)} ++ """.format(username="User%d" % random.randint(0, 100)) + + @cherrypy.expose + def index(self): +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_ws4py/server/geventserver.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_ws4py/server/geventserver.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_ws4py/server/geventserver.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_ws4py/server/geventserver.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,3 @@ +-# -*- coding: utf-8 -*- + __doc__ = """ + WSGI entities to support WebSocket from within gevent. + +@@ -80,7 +79,7 @@ + logger.info("Terminating server and all connected websockets") + for greenlet in list(self): + try: +- websocket = greenlet._run.im_self ++ websocket = greenlet._run.__self__ + if websocket: + websocket.close(1001, 'Server is shutting down') + except: +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_ws4py/server/wsgirefserver.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_ws4py/server/wsgirefserver.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_ws4py/server/wsgirefserver.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_ws4py/server/wsgirefserver.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,3 @@ +-# -*- coding: utf-8 -*- + __doc__ = """ + Add WebSocket support to the built-in WSGI server + provided by the :py:mod:`wsgiref`. This is clearly not +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_ws4py/server/wsgiutils.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_ws4py/server/wsgiutils.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_ws4py/server/wsgiutils.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_ws4py/server/wsgiutils.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,3 @@ +-# -*- coding: utf-8 -*- + __doc__ = """ + This module provides a WSGI application suitable + for a WSGI server such as gevent or wsgiref for instance. +@@ -53,14 +52,14 @@ + + from ambari_ws4py.websocket import WebSocket + from ambari_ws4py.exc import HandshakeError +-from ambari_ws4py.compat import unicode, py3k ++from ambari_ws4py.compat import str, py3k + from ambari_ws4py import WS_VERSION, WS_KEY, format_addresses + + logger = logging.getLogger('ambari_ws4py') + + __all__ = ['WebSocketWSGIApplication'] + +-class WebSocketWSGIApplication(object): ++class WebSocketWSGIApplication: + def __init__(self, protocols=None, extensions=None, handler_cls=WebSocket): + """ + WSGI application usable to complete the upgrade handshake +@@ -110,7 +109,7 @@ + raise HandshakeError("WebSocket key's length is invalid") + + version = environ.get('HTTP_SEC_WEBSOCKET_VERSION') +- supported_versions = b', '.join([unicode(v).encode('utf-8') for v in WS_VERSION]) ++ supported_versions = b', '.join([str(v).encode('utf-8') for v in WS_VERSION]) + version_is_valid = False + if version: + try: version = int(version) +@@ -118,7 +117,7 @@ + else: version_is_valid = version in WS_VERSION + + if not version_is_valid: +- environ['websocket.version'] = unicode(version).encode('utf-8') ++ environ['websocket.version'] = str(version).encode('utf-8') + raise HandshakeError('Unhandled or missing WebSocket version') + + ws_protocols = [] +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_ws4py/streaming.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_ws4py/streaming.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_ws4py/streaming.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_ws4py/streaming.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,3 @@ +-# -*- coding: utf-8 -*- + import struct + from struct import unpack + +@@ -7,13 +6,13 @@ + PingControlMessage, PongControlMessage + from ambari_ws4py.framing import Frame, OPCODE_CONTINUATION, OPCODE_TEXT, \ + OPCODE_BINARY, OPCODE_CLOSE, OPCODE_PING, OPCODE_PONG +-from ambari_ws4py.exc import FrameTooLargeException, ProtocolException, InvalidBytesError,\ +- TextFrameEncodingException, UnsupportedFrameTypeException, StreamClosed ++from ambari_ws4py.exc import FrameTooLargeException , ProtocolException , InvalidBytesError,\ ++ TextFrameEncodingException , UnsupportedFrameTypeException , StreamClosed + from ambari_ws4py.compat import py3k + + VALID_CLOSING_CODES = [1000, 1001, 1002, 1003, 1007, 1008, 1009, 1010, 1011] + +-class Stream(object): ++class Stream: + def __init__(self, always_mask=False, expect_masking=True): + """ Represents a websocket stream of bytes flowing in and out. + +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_ws4py/utf8validator.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_ws4py/utf8validator.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_ws4py/utf8validator.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_ws4py/utf8validator.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,5 +1,3 @@ +-# coding=utf-8 +- + ############################################################################### + ## + ## Copyright 2011 Tavendo GmbH +@@ -30,7 +28,7 @@ + ############################################################################### + + +-class Utf8Validator(object): ++class Utf8Validator: + """ + Incremental UTF-8 validator with constant memory consumption (minimal state). + +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_ws4py/websocket.py apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_ws4py/websocket.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/ambari_ws4py/websocket.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/ambari_ws4py/websocket.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,3 @@ +-# -*- coding: utf-8 -*- + import logging + import socket + import ssl +@@ -18,7 +17,7 @@ + from ambari_ws4py.streaming import Stream + from ambari_ws4py.messaging import Message, PingControlMessage,\ + PongControlMessage +-from ambari_ws4py.compat import basestring, unicode ++from ambari_ws4py.compat import str, str + + DEFAULT_READING_SIZE = 2 + +@@ -62,13 +61,13 @@ + + try: + self.websocket.send(PongControlMessage(data='beep')) +- except socket.error: ++ except OSError: + logger.info("Heartbeat failed") + self.websocket.server_terminated = True + self.websocket.close_connection() + break + +-class WebSocket(object): ++class WebSocket: + """ Represents a websocket endpoint and provides a high level interface to drive the endpoint. """ + + def __init__(self, sock, protocols=None, extensions=None, environ=None, heartbeat_freq=None): +@@ -308,7 +307,7 @@ + """ + message_sender = self.stream.binary_message if binary else self.stream.text_message + +- if isinstance(payload, basestring) or isinstance(payload, bytearray): ++ if isinstance(payload, str) or isinstance(payload, bytearray): + m = message_sender(payload).single(mask=self.stream.always_mask) + with self.lock: + self._write(m) +@@ -413,7 +412,7 @@ + if not b and not self.buf: + return False + self.buf += b +- except (socket.error, OSError, pyOpenSSLError) as e: ++ except (OSError, pyOpenSSLError) as e: + if hasattr(e, "errno") and e.errno == errno.EINTR: + pass + else: +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/pluggable_stack_definition/GenerateStackDefinition.py apache-ambari-2.7.6-change/ambari-common/src/main/python/pluggable_stack_definition/GenerateStackDefinition.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/pluggable_stack_definition/GenerateStackDefinition.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/pluggable_stack_definition/GenerateStackDefinition.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + 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 @@ + # 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 @@ + 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'] +@@ -282,7 +282,7 @@ + new_file_path = file_path + if target_version in stack_version_changes: + new_file_path = os.path.join(os.path.dirname(file_path), +- 'upgrade-{0}.xml'.format(stack_version_changes[target_version])) ++ 'upgrade-{}.xml'.format(stack_version_changes[target_version])) + os.rename(file_path, new_file_path) + return new_file_path + +@@ -315,7 +315,7 @@ + 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: +@@ -503,7 +503,7 @@ + # process configuration xml + target = process_config_xml(target, self.config_data) + # process upgrade-x.x.xml +- _upgrade_re = re.compile('upgrade-(.*)\.xml') ++ _upgrade_re = re.compile(r'upgrade-(.*)\.xml') + result = re.search(_upgrade_re, target) + if result: + target_version = result.group(1) +@@ -656,11 +656,11 @@ + 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 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/core/base.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/core/base.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/core/base.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/core/base.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + from resource_management.core.logger import Logger + from resource_management.core.utils import PasswordString + +-class ResourceArgument(object): ++class ResourceArgument: + def __init__(self, default=None, required=False): + self.required = False # Prevents the initial validate from failing + if hasattr(default, '__call__'): +@@ -44,7 +44,7 @@ + + class ForcedListArgument(ResourceArgument): + def validate(self, value): +- value = super(ForcedListArgument, self).validate(value) ++ value = super().validate(value) + if not isinstance(value, (tuple, list)): + value = [value] + return value +@@ -52,10 +52,10 @@ + + class BooleanArgument(ResourceArgument): + def validate(self, value): +- value = super(BooleanArgument, self).validate(value) ++ value = super().validate(value) + if not value in (True, False): + raise InvalidArgument( +- "Expected a boolean for %s received %r" % (self.name, value)) ++ "Expected a boolean for {} received {!r}".format(self.name, value)) + return value + + class IntegerArgument(ResourceArgument): +@@ -63,10 +63,10 @@ + if value is None: + return value + +- value = super(IntegerArgument, self).validate(value) ++ value = super().validate(value) + if not isinstance( value, int ): + raise InvalidArgument( +- "Expected an integer for %s received %r" % (self.name, value)) ++ "Expected an integer for {} received {!r}".format(self.name, value)) + return value + + +@@ -76,7 +76,7 @@ + return repr(PasswordString(value)) + + +-class Accessor(object): ++class Accessor: + def __init__(self, name): + self.name = name + +@@ -107,9 +107,7 @@ + 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') +@@ -133,7 +131,7 @@ + if r_type not in env.resources: + env.resources[r_type] = {} + +- obj = super(Resource, cls).__new__(cls) ++ obj = super().__new__(cls) + env.resources[r_type][name] = obj + env.resource_list.append(obj) + return obj +@@ -151,16 +149,16 @@ + self.provider = provider or getattr(self, 'provider', None) + + self.arguments = {} +- for key, value in kwargs.items(): ++ for key, value in list(kwargs.items()): + try: + arg = self._arguments[key] + except KeyError: +- raise Fail("%s received unsupported argument %s" % (self, key)) ++ raise Fail("{} received unsupported argument {}".format(self, key)) + else: + try: + self.arguments[key] = arg.validate(value) +- except InvalidArgument, exc: +- raise InvalidArgument("%s %s" % (self, exc)) ++ except InvalidArgument as exc: ++ raise InvalidArgument("{} {}".format(self, exc)) + + if not self.env.test_mode: + self.env.run() +@@ -169,10 +167,10 @@ + 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)) ++ return "{}[{}]".format(self.__class__.__name__, Logger._get_resource_name_repr(self.name)) + + def __getstate__(self): + return dict( +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/core/environment.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/core/environment.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/core/environment.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/core/environment.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + _local_data = local() + _instance_name = 'instance' + +-class Environment(object): ++class Environment: + + def __init__(self, basedir=None, tmp_dir=None, test_mode=False, logger=None, logging_level=logging.INFO): + """ +@@ -80,14 +80,14 @@ + 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)) ++ Logger.info("backing up {} to {}".format(path, backup_path)) + shutil.copy(path, backup_path) + + def update_config(self, attributes, overwrite=True): +- for key, value in attributes.items(): ++ for key, value in list(attributes.items()): + attr = self.config + path = key.split('.') + for pth in path[:-1]: +@@ -104,9 +104,9 @@ + if isinstance(arg, dict): + variables = arg + else: +- variables = dict((var, getattr(arg, var)) for var in dir(arg)) ++ variables = {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 \ +@@ -120,17 +120,17 @@ + try: + provider_action = getattr(provider, 'action_%s' % action) + except AttributeError: +- raise Fail("%r does not implement action %s" % (provider, action)) ++ raise Fail("{!r} does not implement action {}".format(provider, 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 + +@@ -147,12 +147,12 @@ + + if resource.not_if is not None and self._check_condition( + resource.not_if): +- Logger.info("Skipping {0} due to not_if".format(resource)) ++ Logger.info("Skipping {} due to not_if".format(resource)) + continue + + if resource.only_if is not None and not self._check_condition( + resource.only_if): +- Logger.info("Skipping {0} due to only_if".format(resource)) ++ Logger.info("Skipping {} due to only_if".format(resource)) + continue + + for action in resource.action: +@@ -162,7 +162,7 @@ + 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 {} due to ignore_failures. Failure reason: {}".format(resource, ex.message)) + pass + + # Run delayed actions +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/core/exceptions.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/core/exceptions.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/core/exceptions.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/core/exceptions.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + self.print_cause = print_cause + self.cause_traceback = traceback.format_exc() + +- super(Fail, self).__init__(message) ++ super().__init__(message) + + def pre_raise(self): + if self.print_cause and self.cause_traceback != 'None\n': +@@ -69,4 +69,4 @@ + self.out = out + self.err = err + +- super(ExecutionFailed, self).__init__(exception_message) ++ super().__init__(exception_message) +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/core/global_lock.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/core/global_lock.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/core/global_lock.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/core/global_lock.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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,6 @@ + :rtype: threading.RLock() + """ + if lock_type not in __GLOBAL_LOCKS: +- raise Fail("There is no global lock associated with {0}".format(str(lock_type))) ++ raise Fail("There is no global lock associated with {}".format(str(lock_type))) + + return __GLOBAL_LOCKS[lock_type] +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/core/__init__.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/core/__init__.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/core/__init__.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/core/__init__.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/core/logger.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/core/logger.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/core/logger.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/core/logger.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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,10 +101,10 @@ + """ + 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 list(Logger.sensitive_strings.items()): + text = text.replace(unprotected_string, protected_string) + +- for placeholder in PLACEHOLDERS_TO_STR.keys(): ++ for placeholder in list(PLACEHOLDERS_TO_STR.keys()): + text = text.replace(placeholder, '') + + return text +@@ -115,7 +115,7 @@ + + @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 @@ + + @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 list(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 +@@ -176,9 +176,9 @@ + else: + val = repr(y) + +- arguments_str += "'{0}': {1}, ".format(x, val) ++ arguments_str += "'{}': {}, ".format(x, val) + + if arguments_str: + arguments_str = arguments_str[:-2] + +- return unicode("{0} {{{1}}}", 'UTF-8').format(name, arguments_str) ++ return str("{0} {{{1}}}", 'UTF-8').format(name, arguments_str) +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/core/providers/accounts.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/core/providers/accounts.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/core/providers/accounts.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/core/providers/accounts.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 with_statement + + import grp + import pwd +@@ -52,7 +51,7 @@ + creating_user = False + command = ['usermod'] + +- for option_name, attributes in self.options.iteritems(): ++ for option_name, attributes in list(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 +65,7 @@ + if self.resource.system and not self.user: + command.append("--system") + +- for option_name, attributes in self.options.iteritems(): ++ for option_name, attributes in list(self.options.items()): + if attributes[1] == "-G": + groups = self.resource.groups + if self.user and self.user_groups: +@@ -145,7 +144,7 @@ + else: + command = ['groupmod'] + +- for option_name, attributes in self.options.iteritems(): ++ for option_name, attributes in list(self.options.items()): + if getattr(self.resource, option_name) != None and getattr(self.resource, option_name) != attributes[0](self): + break + else: +@@ -153,7 +152,7 @@ + + Logger.info("Modifying group %s" % (self.resource.group_name)) + +- for option_name, attributes in self.options.iteritems(): ++ for option_name, attributes in list(self.options.items()): + option_value = getattr(self.resource, option_name) + if attributes[1] and option_value: + command += [attributes[1], str(option_value)] +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/core/providers/__init__.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/core/providers/__init__.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/core/providers/__init__.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/core/providers/__init__.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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,7 +27,7 @@ + from ambari_commons.os_check import OSCheck + + +-class Provider(object): ++class Provider: + def __init__(self, resource): + self.resource = resource + +@@ -38,7 +38,7 @@ + return self.__unicode__() + + def __unicode__(self): +- return u"%s[%s]" % (self.__class__.__name__, self.resource) ++ return "{}[{}]".format(self.__class__.__name__, self.resource) + + + PROVIDERS = dict( +@@ -90,6 +90,6 @@ + try: + mod_path, class_name = class_path.rsplit('.', 1) + except ValueError: +- raise Fail("Unable to find provider for %s as %s" % (resource, class_path)) ++ raise Fail("Unable to find provider for {} as {}".format(resource, class_path)) + mod = __import__(mod_path, {}, {}, [class_name]) + return getattr(mod, class_name) +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/core/providers/mount.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/core/providers/mount.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/core/providers/mount.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/core/providers/mount.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 with_statement + + import os + import re +@@ -64,10 +63,10 @@ + :return: Return a list of objects (dictionary type) representing the file systems table. + """ + mounts = [] +- with open("/etc/fstab", "r") as fp: ++ with open("/etc/fstab") as fp: + for line in fp: + line = line.split('#', 1)[0].strip() +- mount = re.split('\s+', line) ++ mount = re.split(r'\s+', line) + if len(mount) == 6: + mounts.append(dict( + device=mount[0], +@@ -138,7 +137,7 @@ + return False + + if self.resource.device and not os.path.exists(self.resource.device): +- raise Fail("%s Device %s does not exist" % (self, self.resource.device)) ++ raise Fail("{} Device {} does not exist".format(self, self.resource.device)) + + mounts = get_mounted() + for m in mounts: +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/core/providers/packaging.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/core/providers/packaging.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/core/providers/packaging.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/core/providers/packaging.py 2022-07-11 00:52:28.000000000 +0800 +@@ -22,7 +22,7 @@ + + class PackageProvider(Provider): + def __init__(self, *args, **kwargs): +- super(PackageProvider, self).__init__(*args, **kwargs) ++ super().__init__(*args, **kwargs) + self._pkg_manager = ManagerFactory.get() + + def action_install(self): +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/core/providers/service.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/core/providers/service.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/core/providers/service.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/core/providers/service.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 _exec_cmd(self, command, expect=None): + if command != "status": +- Logger.info("%s command '%s'" % (self.resource, command)) ++ Logger.info("{} command '{}'".format(self.resource, command)) + + custom_cmd = getattr(self.resource, "%s_command" % command, None) + if custom_cmd: +- Logger.debug("%s executing '%s'" % (self.resource, custom_cmd)) ++ Logger.debug("{} executing '{}'".format(self.resource, custom_cmd)) + if hasattr(custom_cmd, "__call__"): + if custom_cmd(): + ret = 0 +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/core/providers/system.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/core/providers/system.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/core/providers/system.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/core/providers/system.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 with_statement + + import re + import os +@@ -50,7 +49,7 @@ + try: + _user_entity = pwd.getpwnam(user) + except KeyError: +- raise Fail("User '{0}' doesn't exist".format(user)) ++ raise Fail("User '{}' doesn't exist".format(user)) + + if stat.st_uid != _user_entity.pw_uid: + user_entity = _user_entity +@@ -61,7 +60,7 @@ + try: + _group_entity = grp.getgrnam(group) + except KeyError: +- raise Fail("Group '{0}' doesn't exist".format(group)) ++ raise Fail("Group '{}' doesn't exist".format(group)) + + if stat.st_gid != _group_entity.gr_gid: + group_entity = _group_entity +@@ -79,9 +78,9 @@ + 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 list(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))) ++ raise Fail("'recursive_mode_flags' with value '{}' has unknown key '{}', only keys 'f' and 'd' are valid".format(str(recursive_mode_flags), str(key))) + + if not re.match(regexp_to_match, flags): + raise Fail("'recursive_mode_flags' found '%s', but should value format have the following format: [ugoa...][[+-=][perms...]...]." % (str(flags))) +@@ -92,7 +91,7 @@ + if mode: + stat = sudo.stat(path) + if stat.st_mode != mode: +- Logger.info("Changing permission for %s from %o to %o" % ( ++ Logger.info("Changing permission for {} from {:o} to {:o}".format( + path, stat.st_mode, mode)) + sudo.chmod(path, mode) + +@@ -113,11 +112,11 @@ + path = self.resource.path + + if sudo.path_isdir(path): +- raise Fail("Applying %s failed, directory with name %s exists" % (self.resource, path)) ++ raise Fail("Applying {} failed, directory with name {} exists".format(self.resource, path)) + + 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)) ++ raise Fail("Applying {} failed, parent directory {} doesn't exist".format(self.resource, dirname)) + + write = False + content = self._get_content() +@@ -134,7 +133,7 @@ + self.resource.env.backup_file(path) + + if write: +- Logger.info("Writing %s because %s" % (self.resource, reason)) ++ Logger.info("Writing {} because {}".format(self.resource, reason)) + sudo.create_file(path, content, encoding=self.resource.encoding) + + _ensure_metadata(self.resource.path, self.resource.owner, +@@ -144,7 +143,7 @@ + path = self.resource.path + + if sudo.path_isdir(path): +- raise Fail("Applying %s failed, %s is directory not file!" % (self.resource, path)) ++ raise Fail("Applying {} failed, {} is directory not file!".format(self.resource, path)) + + if sudo.path_exists(path): + Logger.info("Deleting %s" % self.resource) +@@ -154,11 +153,11 @@ + 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() +- raise Fail("Unknown source type for %s: %r" % (self, content)) ++ raise Fail("Unknown source type for {}: {!r}".format(self, content)) + + + class DirectoryProvider(Provider): +@@ -174,24 +173,24 @@ + followed_links = set() + while sudo.path_lexists(path): + if path in followed_links: +- raise Fail("Applying %s failed, looped symbolic links found while resolving %s" % (self.resource, path)) ++ raise Fail("Applying {} failed, looped symbolic links found while resolving {}".format(self.resource, path)) + followed_links.add(path) + path = sudo.readlink(path) + + if path != self.resource.path: +- Logger.info("Following the link {0} to {1} to create the directory".format(self.resource.path, path)) ++ Logger.info("Following the link {} to {} 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)) ++ raise Fail("Applying {} failed, parent directory {} doesn't exist".format(self.resource, dirname)) + +- sudo.makedir(path, self.resource.mode or 0755) ++ sudo.makedir(path, self.resource.mode or 0o755) + + if not sudo.path_isdir(path): +- raise Fail("Applying %s failed, file %s already exists" % (self.resource, path)) ++ raise Fail("Applying {} failed, file {} already exists".format(self.resource, path)) + + _ensure_metadata(path, self.resource.owner, self.resource.group, + mode=self.resource.mode, cd_access=self.resource.cd_access, +@@ -202,7 +201,7 @@ + path = self.resource.path + if sudo.path_exists(path): + if not sudo.path_isdir(path): +- raise Fail("Applying %s failed, %s is not a directory" % (self.resource, path)) ++ raise Fail("Applying {} failed, {} is not a directory".format(self.resource, path)) + + Logger.info("Removing directory %s and all its content" % self.resource) + sudo.rmtree(path) +@@ -219,14 +218,14 @@ + if not sudo.path_lexists(path): + raise Fail( + "%s trying to create a symlink with the same name as an existing file or directory" % self.resource) +- Logger.info("%s replacing old symlink to %s" % (self.resource, oldpath)) ++ Logger.info("{} replacing old symlink to {}".format(self.resource, oldpath)) + sudo.unlink(path) + + if self.resource.hard: + if not sudo.path_exists(self.resource.to): +- raise Fail("Failed to apply %s, linking to nonexistent location %s" % (self.resource, self.resource.to)) ++ raise Fail("Failed to apply {}, linking to nonexistent location {}".format(self.resource, self.resource.to)) + if sudo.path_isdir(self.resource.to): +- raise Fail("Failed to apply %s, cannot create hard link to a directory (%s)" % (self.resource, self.resource.to)) ++ raise Fail("Failed to apply {}, cannot create hard link to a directory ({})".format(self.resource, self.resource.to)) + + Logger.info("Creating hard %s" % self.resource) + sudo.link(self.resource.to, path) +@@ -234,7 +233,7 @@ + if not sudo.path_exists(self.resource.to): + Logger.info("Warning: linking to nonexistent location %s" % self.resource.to) + +- Logger.info("Creating symbolic %s to %s" % (self.resource, self.resource.to)) ++ Logger.info("Creating symbolic {} to {}".format(self.resource, self.resource.to)) + sudo.symlink(self.resource.to, path) + + def action_delete(self): +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/core/providers/windows/service.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/core/providers/windows/service.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/core/providers/windows/service.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/core/providers/windows/service.py 2022-07-11 00:52:28.000000000 +0800 +@@ -34,8 +34,8 @@ + def safe_open_scmanager(): + try: + _schSCManager = win32service.OpenSCManager(None, None, win32service.SC_MANAGER_ALL_ACCESS) +- except win32api.error, details: +- raise Fail("Error opening Service Control Manager on the local machine: {0}".format(details.winerror)) ++ except win32api.error as details: ++ raise Fail("Error opening Service Control Manager on the local machine: {}".format(details.winerror)) + + return _schSCManager + +@@ -43,11 +43,11 @@ + 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) ++ err_msg = "Invalid service name: {}".format(service_name) + else: +- err_msg = "Error configuring service {0}: {1}".format(service_name, details.winerror) ++ err_msg = "Error configuring service {}: {}".format(service_name, details.winerror) + raise Fail(err_msg) + + return hSvc +@@ -95,8 +95,8 @@ + None, + None) + win32service.CloseServiceHandle(hSvc) +- except win32api.error, details: +- raise Fail("Error enabling service {0}: {1}".format(self.resource.service_name, details.winerror)) ++ except win32api.error as details: ++ raise Fail("Error enabling service {}: {}".format(self.resource.service_name, details.winerror)) + finally: + win32service.CloseServiceHandle(hSCM) + +@@ -145,8 +145,8 @@ + pass ## ChangeServiceConfig2 and description do not exist on NT + + win32service.CloseServiceHandle(hSvc) +- except win32api.error, details: +- raise Fail("Error creating service {0}: {1}".format(self.resource.service_name, details.winerror)) ++ except win32api.error as details: ++ raise Fail("Error creating service {}: {}".format(self.resource.service_name, details.winerror)) + finally: + win32service.CloseServiceHandle(hSCM) + +@@ -175,8 +175,8 @@ + 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: +- raise Fail("Error configuring service {0}: {1}".format(self.resource.service_name, details.winerror)) ++ except win32api.error as details: ++ raise Fail("Error configuring service {}: {}".format(self.resource.service_name, details.winerror)) + finally: + win32service.CloseServiceHandle(hSvc) + finally: +@@ -202,8 +202,8 @@ + self.resource.username, + self.resource.password, + None) +- except win32api.error, details: +- raise Fail("Error changing user for service {0}: {1}".format(self.resource.service_name, details.winerror)) ++ except win32api.error as details: ++ raise Fail("Error changing user for service {}: {}".format(self.resource.service_name, details.winerror)) + finally: + win32service.CloseServiceHandle(hSvc) + finally: +@@ -216,12 +216,12 @@ + 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 + else: +- raise Fail("Error removing service {0}: {1}".format(self.resource.service_name, details.winerror)) ++ raise Fail("Error removing service {}: {}".format(self.resource.service_name, details.winerror)) + + try: + win32service.DeleteService(hSvc) +@@ -234,13 +234,13 @@ + win32service.CloseServiceHandle(hSCM) + + def _fix_start_type(self): +- if self.resource.start_type in ServiceConfigProvider.str_start_types.keys(): ++ if self.resource.start_type in list(ServiceConfigProvider.str_start_types.keys()): + self.resource.start_type = ServiceConfigProvider.str_start_types[self.resource.start_type] + elif (not self.resource.start_type or self.resource.start_type not in [ + win32service.SERVICE_AUTO_START, + win32service.SERVICE_DISABLED, + win32service.SERVICE_DEMAND_START]): +- Logger.warning("Invalid service start type specified: service='{0}', start type='{1}'. Ignoring.".format( ++ Logger.warning("Invalid service start type specified: service='{}', start type='{}'. Ignoring.".format( + self.resource.service_name, str(self.resource.start_type))) + self.resource.start_type = win32service.SERVICE_NO_CHANGE + +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/core/providers/windows/system.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/core/providers/windows/system.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/core/providers/windows/system.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/core/providers/windows/system.py 2022-07-11 00:52:28.000000000 +0800 +@@ -46,7 +46,7 @@ + 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 @@ + """ + 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 list(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 list(env1.items()): + if not key in merge_keys: + result_env[str(key)] = str(value) + #merge keys from merge_keys +@@ -141,7 +141,7 @@ + for (id, attr) in privList: + if id == privId: + privState = attr +- Logger.debug('Privilege state: {0}={1} ({2}) Enabled={3}'.format(privId, priv, LookupPrivilegeDisplayName(None, priv), privState)) ++ Logger.debug('Privilege state: {}={} ({}) Enabled={}'.format(privId, priv, LookupPrivilegeDisplayName(None, priv), privState)) + return privState + + # Execute command. As windows hdp stack heavily relies on proper environment it is better to reload fresh environment +@@ -185,7 +185,7 @@ + if not ok: + raise Exception("Unable to create StdErr for child process") + +- Logger.debug("Redirecting stdout to '{0}', stderr to '{1}'".format(out_file.name, err_file.name)) ++ Logger.debug("Redirecting stdout to '{}', stderr to '{}'".format(out_file.name, err_file.name)) + + si.dwFlags = win32con.STARTF_USESTDHANDLES + si.lpDesktop = "" +@@ -224,14 +224,14 @@ + + # see msdn Icacls doc for rights + def _set_file_acl(file, user, rights): +- acls_modify_cmd = "icacls {0} /grant {1}:{2}".format(file, user, rights) +- acls_remove_cmd = "icacls {0} /remove {1}".format(file, user) ++ acls_modify_cmd = "icacls {} /grant {}:{}".format(file, user, rights) ++ acls_remove_cmd = "icacls {} /remove {}".format(file, user) + code, out, err = _call_command(acls_remove_cmd) + if code != 0: +- raise Fail("Can not remove rights for path {0} and user {1}".format(file, user)) ++ raise Fail("Can not remove rights for path {} and user {}".format(file, user)) + code, out, err = _call_command(acls_modify_cmd) + if code != 0: +- raise Fail("Can not set rights {0} for path {1} and user {2}".format(file, user)) ++ raise Fail("Can not set rights {} for path {} and user {}".format(file, user)) + else: + return + +@@ -241,11 +241,11 @@ + path = self.resource.path + + if os.path.isdir(path): +- raise Fail("Applying %s failed, directory with name %s exists" % (self.resource, path)) ++ raise Fail("Applying {} failed, directory with name {} exists".format(self.resource, path)) + + dirname = os.path.dirname(path) + if not os.path.isdir(dirname): +- raise Fail("Applying %s failed, parent directory %s doesn't exist" % (self.resource, dirname)) ++ raise Fail("Applying {} failed, parent directory {} doesn't exist".format(self.resource, dirname)) + + write = False + content = self._get_content() +@@ -263,7 +263,7 @@ + self.resource.env.backup_file(path) + + if write: +- Logger.info("Writing %s because %s" % (self.resource, reason)) ++ Logger.info("Writing {} because {}".format(self.resource, reason)) + with open(path, "wb") as fp: + if content: + fp.write(content) +@@ -275,7 +275,7 @@ + path = self.resource.path + + if os.path.isdir(path): +- raise Fail("Applying %s failed, %s is directory not file!" % (self.resource, path)) ++ raise Fail("Applying {} failed, {} is directory not file!".format(self.resource, path)) + + if os.path.exists(path): + Logger.info("Deleting %s" % self.resource) +@@ -285,11 +285,11 @@ + 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() +- raise Fail("Unknown source type for %s: %r" % (self, content)) ++ raise Fail("Unknown source type for {}: {!r}".format(self, content)) + + + class ExecuteProvider(Provider): +@@ -326,7 +326,7 @@ + self.resource.command, self.resource.timeout) + + if self.resource.on_timeout: +- Logger.info("Executing '%s'. Reason: %s" % (self.resource.on_timeout, err_msg)) ++ Logger.info("Executing '{}'. Reason: {}".format(self.resource.on_timeout, err_msg)) + _call_command(self.resource.on_timeout) + else: + raise Fail(err_msg) +@@ -342,12 +342,12 @@ + else: + dirname = os.path.dirname(path) + if not os.path.isdir(dirname): +- raise Fail("Applying %s failed, parent directory %s doesn't exist" % (self.resource, dirname)) ++ raise Fail("Applying {} failed, parent directory {} doesn't exist".format(self.resource, dirname)) + + os.mkdir(path) + + if not os.path.isdir(path): +- raise Fail("Applying %s failed, file %s already exists" % (self.resource, path)) ++ raise Fail("Applying {} failed, file {} already exists".format(self.resource, path)) + + if self.resource.owner and self.resource.mode: + _set_file_acl(path, self.resource.owner, self.resource.mode) +@@ -356,7 +356,7 @@ + path = self.resource.path + if os.path.exists(path): + if not os.path.isdir(path): +- raise Fail("Applying %s failed, %s is not a directory" % (self.resource, path)) ++ raise Fail("Applying {} failed, {} is not a directory".format(self.resource, path)) + + Logger.info("Removing directory %s and all its content" % self.resource) + shutil.rmtree(path) +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/core/resources/accounts.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/core/resources/accounts.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/core/resources/accounts.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/core/resources/accounts.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/core/resources/__init__.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/core/resources/__init__.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/core/resources/__init__.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/core/resources/__init__.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/core/resources/jcepolicyinfo.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/core/resources/jcepolicyinfo.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/core/resources/jcepolicyinfo.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/core/resources/jcepolicyinfo.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + """ + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file +@@ -39,4 +39,4 @@ + quiet = True)[0] == 0 + + def _command(self, options): +- return '{0}/bin/java -jar /var/lib/ambari-agent/tools/jcepolicyinfo.jar {1}'.format(self.java_home, options) ++ return '{}/bin/java -jar /var/lib/ambari-agent/tools/jcepolicyinfo.jar {}'.format(self.java_home, options) +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/core/resources/klist.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/core/resources/klist.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/core/resources/klist.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/core/resources/klist.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + """ + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file +@@ -37,7 +37,7 @@ + code, out, err = shell.call(self._command('-k', keytab_path), stdout = PIPE, stderr = PIPE, timeout = 5, sudo=True) + if code != 0 or (not out.startswith("Keytab name")): + raise Exception('Cannot run klist: %s. Exit code: %d. Error: %s' % (self.klist_cmd, code, err)) +- return set(line.split()[1] for line in out.split("\n")[3:]) ++ return {line.split()[1] for line in out.split("\n")[3:]} + + def _command(self, *args): + cmd = [self.klist_cmd] +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/core/resources/packaging.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/core/resources/packaging.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/core/resources/packaging.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/core/resources/packaging.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/core/resources/service.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/core/resources/service.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/core/resources/service.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/core/resources/service.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/core/resources/system.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/core/resources/system.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/core/resources/system.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/core/resources/system.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/core/resources/zkmigrator.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/core/resources/zkmigrator.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/core/resources/zkmigrator.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/core/resources/zkmigrator.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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,9 +52,9 @@ + tries=tries) + + def _acl_command(self, znode, acl): +- return "{0} -Djava.security.auth.login.config={1} -jar {2} -connection-string {3} -znode {4} -acl {5}".format( \ ++ return "{} -Djava.security.auth.login.config={} -jar {} -connection-string {} -znode {} -acl {}".format( \ + self.java_exec, self.jaas_file, self.zkmigrator_jar, self.zk_host, znode, acl) + + def _delete_command(self, znode): +- return "{0} -Djava.security.auth.login.config={1} -jar {2} -connection-string {3} -znode {4} -delete".format( \ ++ return "{} -Djava.security.auth.login.config={} -jar {} -connection-string {} -znode {} -delete".format( \ + self.java_exec, self.jaas_file, self.zkmigrator_jar, self.zk_host, znode) +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/core/shell.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/core/shell.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/core/shell.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/core/shell.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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,11 +32,12 @@ + from ambari_commons import subprocess32 + 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' +@@ -57,14 +58,14 @@ + + if quiet == False or (quiet == None and not is_internal_call): + command_repr = Logger._get_resource_name_repr(command) +- log_msg = Logger.get_function_repr("{0}[{1}]".format(function.__name__, command_repr), kwargs) ++ log_msg = Logger.get_function_repr("{}[{}]".format(function.__name__, command_repr), kwargs) + Logger.info(log_msg) + + # logoutput=False - never log + # 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)) +@@ -72,7 +73,7 @@ + result = function(command, **kwargs) + + if quiet == False or (quiet == None and not is_internal_call): +- log_msg = "{0} returned {1}".format(function.__name__, result) ++ log_msg = "{} returned {}".format(function.__name__, result) + Logger.info(log_msg) + + return result +@@ -151,7 +152,7 @@ + break + except ExecuteTimeoutException as ex: + if on_timeout: +- Logger.info("Executing '{0}'. Reason: {1}".format(on_timeout, str(ex))) ++ Logger.info("Executing '{}'. Reason: {}".format(on_timeout, str(ex))) + result = checked_call(on_timeout) + else: + raise +@@ -159,7 +160,7 @@ + if is_last_try: # last try + raise + else: +- Logger.info("Retrying after {0} seconds. Reason: {1}".format(try_sleep, str(ex))) ++ Logger.info("Retrying after {} seconds. Reason: {}".format(try_sleep, str(ex))) + time.sleep(try_sleep) + + return result +@@ -207,7 +208,7 @@ + + # 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 list(PLACEHOLDERS_TO_STR.items()): + command = command.replace(placeholder, replacement.format(env_str=env_str)) + + # --noprofile is used to preserve PATH set for ambari-agent +@@ -220,10 +221,10 @@ + 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) + +@@ -266,6 +267,7 @@ + for out_fd in read_set: + if out_fd in ready: + line = os.read(out_fd.fileno(), 1024) ++ line = str(line,encoding='utf-8') + + if not line: + read_set = copy.copy(read_set) +@@ -280,7 +282,7 @@ + try: + on_new_line(line, out_fd == proc.stderr) + except Exception: +- err_msg = "Caused by on_new_line function failed with exception for input argument '{0}':\n{1}".format(line, traceback.format_exc()) ++ err_msg = "Caused by on_new_line function failed with exception for input argument '{}':\n{}".format(line, traceback.format_exc()) + raise Fail(err_msg) + + if logoutput: +@@ -304,13 +306,13 @@ + timer.cancel() + # timeout occurred + else: +- err_msg = "Execution of '{0}' was killed due timeout after {1} seconds".format(command, timeout) ++ err_msg = "Execution of '{}' was killed due timeout after {} seconds".format(command, timeout) + raise ExecuteTimeoutException(err_msg) + + code = proc.returncode + + if throw_on_failure and not code in returns: +- err_msg = Logger.filter_text("Execution of '{0}' returned {1}. {2}".format(command_alias, code, all_output)) ++ err_msg = Logger.filter_text("Execution of '{}' returned {}. {}".format(command_alias, code, all_output)) + raise ExecutionFailed(err_msg, code, out, err) + + # if separate stderr is enabled (by default it's redirected to out) +@@ -335,27 +337,27 @@ + # + # In that case while passing string, + # any bash symbols eventually added to command like && || ; < > | << >> would cause problems. +- err_msg = Logger.filter_text("String command '{0}' cannot be run as sudo. Please supply the command as a tuple of arguments".format(command)) ++ err_msg = Logger.filter_text("String command '{}' cannot be run as sudo. Please supply the command as a tuple of arguments".format(command)) + raise Fail(err_msg) + + env = _get_environment_str(_add_current_path_to_env(env)) if env else ENV_PLACEHOLDER +- return "{0} {1} -H -E {2}".format(_get_sudo_binary(), env, command) ++ return "{} {} -H -E {}".format(_get_sudo_binary(), env, command) + + + def as_user(command, user, env=None, auto_escape=True): + if isinstance(command, (list, tuple)): + command = string_cmd_from_args_list(command, auto_escape=auto_escape) + +- export_env = "export {0} ; ".format(_get_environment_str(_add_current_path_to_env(env))) if env else EXPORT_PLACEHOLDER +- return "{0} su {1} -l -s /bin/bash -c {2}".format(_get_sudo_binary(), user, quote_bash_args(export_env + command)) ++ export_env = "export {} ; ".format(_get_environment_str(_add_current_path_to_env(env))) if env else EXPORT_PLACEHOLDER ++ return "{} su {} -l -s /bin/bash -c {}".format(_get_sudo_binary(), user, quote_bash_args(export_env + command)) + + + def quote_bash_args(command): + if not command: + return "''" + +- if not isinstance(command, basestring): +- raise Fail("Command should be a list of strings, found '{0}' in command list elements".format(str(command))) ++ if not isinstance(command, str): ++ raise Fail("Command should be a list of strings, found '{}' in command list elements".format(str(command))) + + valid = set(string.ascii_letters + string.digits + '@%_-+=:,./') + for char in command: +@@ -379,7 +381,7 @@ + return AMBARI_SUDO_BINARY + + def _get_environment_str(env): +- return reduce(lambda str,x: '{0} {1}={2}'.format(str,x,quote_bash_args(env[x])), env, '') ++ return reduce(lambda str,x: '{} {}={}'.format(str,x,quote_bash_args(env[x])), env, '') + + def string_cmd_from_args_list(command, auto_escape=True): + if auto_escape: +@@ -390,4 +392,4 @@ + + def _on_timeout(proc, timeout_event, terminate_strategy): + timeout_event.set() +- terminate_process(proc, terminate_strategy) +\ 文件尾没有换行符 ++ terminate_process(proc, terminate_strategy) +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/core/signal_utils.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/core/signal_utils.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/core/signal_utils.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/core/signal_utils.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + elif terminate_strategy == TerminateStrategy.KILL_PROCESS_TREE: + kill_process_tree(proc) + else: +- raise Fail("Invalid timeout_kill_strategy = '{0}'. Use TerminateStrategy class constants as a value.".format(terminate_strategy)) ++ raise Fail("Invalid timeout_kill_strategy = '{}'. Use TerminateStrategy class constants as a value.".format(terminate_strategy)) + + def killpg_gracefully(proc, timeout=GRACEFUL_PG_KILL_TIMEOUT_SECONDS): + """ +@@ -62,12 +62,12 @@ + pgid = os.getpgid(proc.pid) + sudo.kill(-pgid, signal.SIGTERM) + +- 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)) ++ Logger.info("Cannot gracefully kill process group {}. Resorting to SIGKILL.".format(pgid)) + sudo.kill(-pgid, signal.SIGKILL) + proc.wait() + # catch race condition if proc already dead +@@ -86,7 +86,6 @@ + def kill_process_tree(proc): + from resource_management.core import shell + current_directory = os.path.dirname(os.path.abspath(__file__)) +- kill_tree_script = "{0}/files/killtree.sh".format(current_directory) ++ kill_tree_script = "{}/files/killtree.sh".format(current_directory) + if proc.poll() == None: + shell.checked_call(["bash", kill_tree_script, str(proc.pid), str(signal.SIGKILL)]) +- +\ 文件尾没有换行符 +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/core/source.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/core/source.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/core/source.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/core/source.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 with_statement + from resource_management.core.environment import Environment + from resource_management.core.logger import Logger + from resource_management.core.exceptions import Fail +@@ -31,13 +30,13 @@ + + import os + import time +-import urllib2 +-import urlparse ++import urllib.request, urllib.error, urllib.parse ++import urllib.parse + + from ambari_commons.os_family_impl import OsFamilyFuncImpl, OsFamilyImpl + from ambari_commons import OSConst + +-class Source(object): ++class Source: + def __init__(self, name): + self.env = Environment.get_instance() + self.name = name +@@ -61,7 +60,7 @@ + + class StaticFile(Source): + def __init__(self, name): +- super(StaticFile, self).__init__(name) ++ super().__init__(name) + + def get_content(self): + # absolute path +@@ -73,7 +72,7 @@ + path = os.path.join(basedir, "files", self.name) + + if not sudo.path_isfile(path) and not sudo.path_lexists(path): +- raise Fail("{0} Source file {1} is not found".format(repr(self), path)) ++ raise Fail("{} Source file {} is not found".format(repr(self), path)) + + return self.read_file(path) + +@@ -114,7 +113,7 @@ + path = os.path.join(basedir, "templates", template_name) + + if not os.path.exists(path): +- raise TemplateNotFound("%s at %s" % (template_name, path)) ++ raise TemplateNotFound("{} at {}".format(template_name, path)) + mtime = os.path.getmtime(path) + with open(path, "rb") as fp: + source = fp.read().decode('utf-8') +@@ -125,10 +124,10 @@ + """ + @param kwargs: Additional variables passed to template + """ +- super(Template, self).__init__(name) ++ super().__init__(name) + params = self.env.config.params + variables = checked_unite(params, kwargs) +- self.imports_dict = dict((module.__name__, module) for module in extra_imports) ++ self.imports_dict = {module.__name__: module for module in extra_imports} + self.context = variables.copy() if variables else {} + if not hasattr(self, 'template_env'): + self.template_env = JinjaEnvironment(loader=TemplateLoader(self.env), +@@ -137,7 +136,7 @@ + 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) + +@@ -147,7 +146,7 @@ + class InlineTemplate(Template): + def __init__(self, name, extra_imports=[], **kwargs): + self.template_env = JinjaEnvironment(loader=FunctionLoader(lambda text: text)) +- super(InlineTemplate, self).__init__(name, extra_imports, **kwargs) ++ super().__init__(name, extra_imports, **kwargs) + + def __repr__(self): + return "InlineTemplate(...)" +@@ -163,7 +162,7 @@ + """ + + def __init__(self, name, redownload_files=False, ignore_proxy=True): +- super(DownloadSource, self).__init__(name) ++ super().__init__(name) + + self.url = self.name + self.cache = not redownload_files and bool(self.env.tmp_dir) +@@ -172,36 +171,36 @@ + + 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)) ++ raise Fail("Directory {} 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()) ++ filename = 'index.html.{}'.format(time.time()) + + filepath = os.path.join(self.download_path, filename) + + if not self.cache or not os.path.exists(filepath): +- Logger.info("Downloading the file from {0}".format(self.url)) ++ Logger.info("Downloading the file from {}".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: +- raise Fail("Failed to download file from {0} due to HTTP error: {1}".format(self.url, str(ex))) ++ except urllib.error.HTTPError as ex: ++ raise Fail("Failed to download file from {} due to HTTP error: {}".format(self.url, str(ex))) + + content = web_file.read() + + if self.cache: + sudo.create_file(filepath, content) + else: +- Logger.info("Not downloading the file from {0}, because {1} already exists".format(self.url, filepath)) ++ Logger.info("Not downloading the file from {}, because {} already exists".format(self.url, filepath)) + content = sudo.read_file(filepath) + + return content +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/core/sudo.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/core/sudo.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/core/sudo.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/core/sudo.py 2022-07-11 00:52:28.000000000 +0800 +@@ -111,15 +111,15 @@ + if ex.errno == errno.ENOENT: + dirname = os.path.dirname(ex.filename) + if os.path.islink(dirname) and not os.path.exists(dirname): +- raise Fail("Cannot create directory '{0}' as '{1}' is a broken symlink".format(path, dirname)) ++ raise Fail("Cannot create directory '{}' as '{}' is a broken symlink".format(path, dirname)) + elif ex.errno == errno.ENOTDIR: + dirname = os.path.dirname(ex.filename) + if os.path.isfile(dirname): +- raise Fail("Cannot create directory '{0}' as '{1}' is a file".format(path, dirname)) ++ raise Fail("Cannot create directory '{}' as '{}' is a file".format(path, dirname)) + elif ex.errno == errno.ELOOP: + dirname = os.path.dirname(ex.filename) + if os.path.islink(dirname) and not os.path.exists(dirname): +- raise Fail("Cannot create directory '{0}' as '{1}' is a looped symlink".format(path, dirname)) ++ raise Fail("Cannot create directory '{}' as '{}' is a looped symlink".format(path, dirname)) + + raise + +@@ -142,13 +142,13 @@ + """ + if content is None, create empty file + """ +- with open(filename, "wb") as fp: ++ with open(filename, "w") as fp: + if content: + content = content.encode(encoding) if encoding else content + fp.write(content) + + def read_file(filename, encoding=None): +- with open(filename, "rb") as fp: ++ with open(filename, "r") as fp: + content = fp.read() + + content = content.decode(encoding) if encoding else content +@@ -173,7 +173,7 @@ + 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): +@@ -308,7 +308,7 @@ + # os.listdir replacement + def listdir(path): + if not path_isdir(path): +- raise Fail("{0} is not a directory. Cannot list files of it.".format(path)) ++ raise Fail("{} is not a directory. Cannot list files of it.".format(path)) + + code, out, err = shell.checked_call(["ls", path], sudo=True, stderr=subprocess32.PIPE) + files = out.splitlines() +@@ -320,5 +320,5 @@ + if recursion_follow_links: + find_flags.append('-L') + +- for key, flags in recursive_mode_flags.iteritems(): ++ for key, flags in list(recursive_mode_flags.items()): + shell.checked_call(["find"] + find_flags + [path, "-type", key, "-exec" , "chmod", flags ,"{}" ,";"]) +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/core/system.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/core/system.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/core/system.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/core/system.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + from resource_management.core.exceptions import Fail + from ambari_commons import OSCheck + +-class System(object): ++class System: + @lazy_property + def os(self): + """ +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/core/utils.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/core/utils.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/core/utils.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/core/utils.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 +@@ -38,12 +38,12 @@ + PERM_REGISTER = {"u": 0o100, "g": 0o010, "o": 0o001} + PERM_BITS = {"r": 0o004, "w": 0o002, "x": 0o001} + +-class AttributeDictionary(object): ++class AttributeDictionary: + def __init__(self, *args, **kwargs): + d = kwargs + if args: + d = args[0] +- super(AttributeDictionary, self).__setattr__("_dict", d) ++ super().__setattr__("_dict", d) + + def __setattr__(self, name, value): + self[name] = value +@@ -54,7 +54,7 @@ + try: + return self[name] + except KeyError: +- raise AttributeError("'%s' object has no attribute '%s'" % (self.__class__.__name__, name)) ++ raise AttributeError("'{}' object has no attribute '{}'".format(self.__class__.__name__, name)) + + def __setitem__(self, name, value): + self._dict[name] = self._convert_value(value) +@@ -74,16 +74,16 @@ + self._dict.update(*args, **kwargs) + + def items(self): +- return self._dict.items() ++ return list(self._dict.items()) + + def iteritems(self): +- return self._dict.iteritems() ++ return iter(list(self._dict.items())) + + def values(self): +- return self._dict.values() ++ return list(self._dict.values()) + + def keys(self): +- return self._dict.keys() ++ return list(self._dict.keys()) + + def pop(self, *args, **kwargs): + return self._dict.pop(*args, **kwargs) +@@ -110,7 +110,7 @@ + return self._dict + + def __setstate__(self, state): +- super(AttributeDictionary, self).__setattr__("_dict", state) ++ super().__setattr__("_dict", state) + + def checked_unite(dict1, dict2): + for key in dict1: +@@ -126,11 +126,11 @@ + @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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/__init__.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/__init__.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/__init__.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/__init__.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/check_process_status.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/check_process_status.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/check_process_status.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/check_process_status.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + """ + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file +@@ -39,13 +39,13 @@ + from resource_management.core import sudo + + if not pid_file or not os.path.isfile(pid_file): +- Logger.info("Pid file {0} is empty or does not exist".format(str(pid_file))) ++ Logger.info("Pid file {} is empty or does not exist".format(str(pid_file))) + raise ComponentIsNotRunning() + + try: + pid = int(sudo.read_file(pid_file)) + except: +- Logger.info("Pid file {0} does not exist or does not contain a process id number".format(pid_file)) ++ Logger.info("Pid file {} does not exist or does not contain a process id number".format(pid_file)) + raise ComponentIsNotRunning() + + try: +@@ -56,8 +56,8 @@ + # process ID or process group ID. + sudo.kill(pid, 0) + except OSError: +- Logger.info("Process with pid {0} is not running. Stale pid file" +- " at {1}".format(pid, pid_file)) ++ Logger.info("Process with pid {} is not running. Stale pid file" ++ " at {}".format(pid, pid_file)) + raise ComponentIsNotRunning() + + +@@ -76,6 +76,6 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/component_version.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/component_version.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/component_version.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/component_version.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + 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): +@@ -64,7 +64,7 @@ + :config: the configuration dictionary + :return: + """ +- if "componentVersionMap" not in config or config["componentVersionMap"] is "": ++ if "componentVersionMap" not in config or config["componentVersionMap"] == "": + return None + + return config["componentVersionMap"] +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/conf_select.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/conf_select.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/conf_select.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/conf_select.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + """ + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file +@@ -66,18 +66,18 @@ + + if stack_name not in data: + raise Fail( +- "Cannot find conf-select packages for the {0} stack".format(stack_name)) ++ "Cannot find conf-select packages for the {} stack".format(stack_name)) + + conf_select_key = "conf-select" + data = data[stack_name] + if conf_select_key not in data: + raise Fail( +- "There are no conf-select packages defined for this command for the {0} stack".format(stack_name)) ++ "There are no conf-select packages defined for this command for the {} stack".format(stack_name)) + + 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 list(package_dirs.items()): + for dir in directories: + current_dir = dir['current_dir'] + current_dir = current_dir.format(stack_root) +@@ -101,9 +101,9 @@ + # clarify the logging of what we're doing ... + if dry_run: + Logger.info( +- "Checking to see which directories will be created for {0} on version {1}".format(package, version)) ++ "Checking to see which directories will be created for {} on version {}".format(package, version)) + else: +- Logger.info("Creating /etc/{0}/{1}/0 if it does not exist".format(package, version)) ++ Logger.info("Creating /etc/{}/{}/0 if it does not exist".format(package, version)) + + command = "dry-run-create" if dry_run else "create-conf-dir" + +@@ -123,7 +123,7 @@ + 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,9 +147,9 @@ + + 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, ++ Logger.warning("Could not select the directory for package {}. Error: {}".format(package, + str(exception))) + else: + raise +@@ -176,7 +176,7 @@ + if version is None or sudo.path_isdir(hadoop_conf_dir) is False: + hadoop_conf_dir = os.path.join(stack_root, "current", "hadoop-client", "conf") + +- Logger.info("Using hadoop conf dir: {0}".format(hadoop_conf_dir)) ++ Logger.info("Using hadoop conf dir: {}".format(hadoop_conf_dir)) + + return hadoop_conf_dir + +@@ -203,7 +203,7 @@ + stack_name = Script.get_stack_name() + for directory_struct in dirs: + if not os.path.exists(directory_struct['conf_dir']): +- Logger.info("Skipping the conf-select tool on {0} since {1} does not exist.".format( ++ Logger.info("Skipping the conf-select tool on {} since {} does not exist.".format( + package, directory_struct['conf_dir'])) + + return +@@ -214,7 +214,7 @@ + # if the dry run reported an error, then we must assume that the package does not exist in + # the conf-select tool + if len(dry_run_directory) == 0: +- Logger.info("The conf-select tool reported an error for the package {0}. The configuration linking will be skipped.".format(package)) ++ Logger.info("The conf-select tool reported an error for the package {}. The configuration linking will be skipped.".format(package)) + return + + +@@ -225,7 +225,7 @@ + + # log that we'll actually be creating some directories soon + if len(need_dirs) > 0: +- Logger.info("Package {0} will have the following new configuration directories created: {1}".format( ++ Logger.info("Package {} will have the following new configuration directories created: {}".format( + package, ", ".join(dry_run_directory))) + + # Create the versioned /etc/[component]/[version]/0 folder (using create-conf-dir) and then +@@ -244,17 +244,17 @@ + # it's already a link; make sure it's a link to where we want it + if os.readlink(old_conf) != current_dir: + # the link isn't to the right spot; re-link it +- Logger.info("Re-linking symlink {0} to {1}".format(old_conf, current_dir)) ++ Logger.info("Re-linking symlink {} to {}".format(old_conf, current_dir)) + Link(old_conf, action = "delete") + Link(old_conf, to = current_dir) + else: +- Logger.info("{0} is already linked to {1}".format(old_conf, current_dir)) ++ Logger.info("{} is already linked to {}".format(old_conf, current_dir)) + elif os.path.isdir(old_conf): + # the /etc//conf directory is not a link, so turn it into one +- Logger.info("{0} is a directory - it must be converted into a symlink".format(old_conf)) ++ Logger.info("{} is a directory - it must be converted into a symlink".format(old_conf)) + + backup_dir = _get_backup_conf_directory(old_conf) +- Logger.info("Backing up {0} to {1} if destination doesn't exist already.".format(old_conf, backup_dir)) ++ Logger.info("Backing up {} to {} if destination doesn't exist already.".format(old_conf, backup_dir)) + Execute(("cp", "-R", "-p", old_conf, backup_dir), + not_if = format("test -e {backup_dir}"), sudo = True) + +@@ -287,18 +287,18 @@ + Link(old_conf, to = current_dir) + else: + Logger.info( +- "Will not create symlink from {0} to {1} because the destination's parent dir does not exist.".format( ++ "Will not create symlink from {} to {} because the destination's parent dir does not exist.".format( + old_conf, current_dir)) + else: + Logger.info( +- "Will not create symlink from {0} to {1} because Atlas is not installed on this host.".format( ++ "Will not create symlink from {} to {} because Atlas is not installed on this host.".format( + old_conf, current_dir)) + else: + # Normal path for other packages + Link(old_conf, to = current_dir) + +- except Exception, e: +- Logger.warning("Could not change symlink for package {0} to point to current directory. Error: {1}".format(package, e)) ++ except Exception as e: ++ Logger.warning("Could not change symlink for package {} to point to current directory. Error: {}".format(package, e)) + + + def get_restricted_packages(): +@@ -321,7 +321,7 @@ + service_names = [] + + # pick out the services that are targeted +- for servicename, servicedetail in cluster_version_summary.iteritems(): ++ for servicename, servicedetail in list(cluster_version_summary.items()): + if servicedetail['upgrade']: + service_names.append(servicename) + +@@ -342,12 +342,12 @@ + data = json.loads(stack_packages_config) + + if stack_name not in data: +- Logger.info("Cannot find conf-select packages for the {0} stack".format(stack_name)) ++ Logger.info("Cannot find conf-select packages for the {} stack".format(stack_name)) + return package_names + + conf_select_key = "conf-select-patching" + if conf_select_key not in data[stack_name]: +- Logger.info("There are no conf-select-patching elements defined for this command for the {0} stack".format(stack_name)) ++ Logger.info("There are no conf-select-patching elements defined for this command for the {} stack".format(stack_name)) + return package_names + + service_dict = data[stack_name][conf_select_key] +@@ -376,18 +376,18 @@ + """ + package_dirs = get_package_dirs() + if package not in package_dirs: +- Logger.warning("Unable to seed newly created configuration directories for {0} because it is an unknown component".format(package)) ++ Logger.warning("Unable to seed newly created configuration directories for {} because it is an unknown component".format(package)) + return + + # seed the directories with any existing configurations + # this allows files which are not tracked by Ambari to be available after an upgrade +- Logger.info("Seeding versioned configuration directories for {0}".format(package)) ++ Logger.info("Seeding versioned configuration directories for {}".format(package)) + expected_directories = package_dirs[package] + + try: + # if the expected directories don't match those created, we can't seed them + if len(created_directories) != len(expected_directories): +- Logger.warning("The known configuration directories for {0} do not match those created by conf-select: {1}".format( ++ Logger.warning("The known configuration directories for {} do not match those created by conf-select: {}".format( + package, str(created_directories))) + + return +@@ -408,8 +408,8 @@ + target_seed_directory = created_directory + _copy_configurations(source_seed_directory, target_seed_directory) + +- except Exception, e: +- Logger.warning("Unable to seed new configuration directories for {0}. {1}".format(package, str(e))) ++ except Exception as e: ++ Logger.warning("Unable to seed new configuration directories for {}. {}".format(package, str(e))) + + + def _copy_configurations(source_directory, target_directory): +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/constants.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/constants.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/constants.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/constants.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/copy_tarball.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/copy_tarball.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/copy_tarball.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/copy_tarball.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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,23 +63,23 @@ + # 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)) ++ Logger.info("Extracting {} to {}".format(mapreduce_source_file, mapreduce_temp_dir)) + tar_archive.untar_archive(mapreduce_source_file, mapreduce_temp_dir) + +- Logger.info("Extracting {0} to {1}".format(tez_source_file, tez_temp_dir)) ++ Logger.info("Extracting {} to {}".format(tez_source_file, tez_temp_dir)) + tar_archive.untar_archive(tez_source_file, tez_temp_dir) + + hadoop_lib_native_dir = os.path.join(mapreduce_temp_dir, "hadoop", "lib", "native") + tez_lib_dir = os.path.join(tez_temp_dir, "lib") + + if not os.path.exists(hadoop_lib_native_dir): +- raise Fail("Unable to seed the Tez tarball with native libraries since the source Hadoop native lib directory {0} does not exist".format(hadoop_lib_native_dir)) ++ raise Fail("Unable to seed the Tez tarball with native libraries since the source Hadoop native lib directory {} does not exist".format(hadoop_lib_native_dir)) + + if not os.path.exists(tez_lib_dir): +- raise Fail("Unable to seed the Tez tarball with native libraries since the target Tez lib directory {0} does not exist".format(tez_lib_dir)) ++ raise Fail("Unable to seed the Tez tarball with native libraries since the target Tez lib directory {} does not exist".format(tez_lib_dir)) + + # copy native libraries from hadoop to tez + Execute(("cp", "-a", hadoop_lib_native_dir, tez_lib_dir), sudo = True) +@@ -97,18 +97,18 @@ + hadoop_lib_native_lzo_dir = os.path.join(stack_root, service_version, "hadoop", "lib", "native") + + if not sudo.path_isdir(hadoop_lib_native_lzo_dir): +- Logger.warning("Unable to located native LZO libraries at {0}, falling back to hadoop home".format(hadoop_lib_native_lzo_dir)) ++ Logger.warning("Unable to located native LZO libraries at {}, falling back to hadoop home".format(hadoop_lib_native_lzo_dir)) + hadoop_lib_native_lzo_dir = os.path.join(stack_root, "current", "hadoop-client", "lib", "native") + + if not sudo.path_isdir(hadoop_lib_native_lzo_dir): +- raise Fail("Unable to seed the Tez tarball with native libraries since LZO is enabled but the native LZO libraries could not be found at {0}".format(hadoop_lib_native_lzo_dir)) ++ raise Fail("Unable to seed the Tez tarball with native libraries since LZO is enabled but the native LZO libraries could not be found at {}".format(hadoop_lib_native_lzo_dir)) + + Execute(("cp", "-a", hadoop_lib_native_lzo_dir, tez_lib_dir), sudo = True) + + + # 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) + +@@ -116,17 +116,17 @@ + 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) + + tez_tarball_with_native_lib = os.path.join(tez_native_tarball_staging_dir, "tez-native.tar.gz") +- Logger.info("Creating a new Tez tarball at {0}".format(tez_tarball_with_native_lib)) ++ Logger.info("Creating a new Tez tarball at {}".format(tez_tarball_with_native_lib)) + 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) +@@ -155,14 +155,14 @@ + + # 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") + if not sudo.path_exists(hadoop_lib_native_source_dir): +- raise Fail("Unable to seed the mapreduce tarball with native LZO libraries since the source Hadoop native lib directory {0} does not exist".format(hadoop_lib_native_source_dir)) ++ raise Fail("Unable to seed the mapreduce tarball with native LZO libraries since the source Hadoop native lib directory {} does not exist".format(hadoop_lib_native_source_dir)) + +- Logger.info("Extracting {0} to {1}".format(mapreduce_source_file, mapreduce_temp_dir)) ++ Logger.info("Extracting {} to {}".format(mapreduce_source_file, mapreduce_temp_dir)) + tar_archive.untar_archive(mapreduce_source_file, mapreduce_temp_dir) + + mapreduce_lib_dir = os.path.join(mapreduce_temp_dir, "hadoop", "lib") +@@ -172,7 +172,7 @@ + + # 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) + +@@ -180,17 +180,17 @@ + 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) + + mapreduce_tarball_with_native_lib = os.path.join(mapreduce_native_tarball_staging_dir, "mapreduce-native.tar.gz") +- Logger.info("Creating a new mapreduce tarball at {0}".format(mapreduce_tarball_with_native_lib)) ++ Logger.info("Creating a new mapreduce tarball at {}".format(mapreduce_tarball_with_native_lib)) + 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) +@@ -205,74 +205,74 @@ + # complicated to change during a Rolling/Express upgrade. + TARBALL_MAP = { + "slider": { +- "dirs": ("{0}/{1}/slider/lib/slider.tar.gz".format(STACK_ROOT_PATTERN, STACK_VERSION_PATTERN), +- "/{0}/apps/{1}/slider/slider.tar.gz".format(STACK_NAME_PATTERN, STACK_VERSION_PATTERN)), ++ "dirs": ("{}/{}/slider/lib/slider.tar.gz".format(STACK_ROOT_PATTERN, STACK_VERSION_PATTERN), ++ "/{}/apps/{}/slider/slider.tar.gz".format(STACK_NAME_PATTERN, STACK_VERSION_PATTERN)), + "service": "SLIDER" + }, + "yarn": { +- "dirs": ("{0}/{1}/hadoop-yarn/lib/service-dep.tar.gz".format(STACK_ROOT_PATTERN, STACK_VERSION_PATTERN), +- "/{0}/apps/{1}/yarn/service-dep.tar.gz".format(STACK_NAME_PATTERN, STACK_VERSION_PATTERN)), ++ "dirs": ("{}/{}/hadoop-yarn/lib/service-dep.tar.gz".format(STACK_ROOT_PATTERN, STACK_VERSION_PATTERN), ++ "/{}/apps/{}/yarn/service-dep.tar.gz".format(STACK_NAME_PATTERN, STACK_VERSION_PATTERN)), + "service": "YARN" + }, + + "tez": { +- "dirs": ("{0}/{1}/tez/lib/tez.tar.gz".format(STACK_ROOT_PATTERN, STACK_VERSION_PATTERN), +- "/{0}/apps/{1}/tez/tez.tar.gz".format(STACK_NAME_PATTERN, STACK_VERSION_PATTERN)), ++ "dirs": ("{}/{}/tez/lib/tez.tar.gz".format(STACK_ROOT_PATTERN, STACK_VERSION_PATTERN), ++ "/{}/apps/{}/tez/tez.tar.gz".format(STACK_NAME_PATTERN, STACK_VERSION_PATTERN)), + "service": "TEZ", + "prepare_function": _prepare_tez_tarball + }, + + "tez_hive2": { +- "dirs": ("{0}/{1}/tez_hive2/lib/tez.tar.gz".format(STACK_ROOT_PATTERN, STACK_VERSION_PATTERN), +- "/{0}/apps/{1}/tez_hive2/tez.tar.gz".format(STACK_NAME_PATTERN, STACK_VERSION_PATTERN)), ++ "dirs": ("{}/{}/tez_hive2/lib/tez.tar.gz".format(STACK_ROOT_PATTERN, STACK_VERSION_PATTERN), ++ "/{}/apps/{}/tez_hive2/tez.tar.gz".format(STACK_NAME_PATTERN, STACK_VERSION_PATTERN)), + "service": "HIVE" + }, + + "hive": { +- "dirs": ("{0}/{1}/hive/hive.tar.gz".format(STACK_ROOT_PATTERN, STACK_VERSION_PATTERN), +- "/{0}/apps/{1}/hive/hive.tar.gz".format(STACK_NAME_PATTERN, STACK_VERSION_PATTERN)), ++ "dirs": ("{}/{}/hive/hive.tar.gz".format(STACK_ROOT_PATTERN, STACK_VERSION_PATTERN), ++ "/{}/apps/{}/hive/hive.tar.gz".format(STACK_NAME_PATTERN, STACK_VERSION_PATTERN)), + "service": "HIVE" + }, + + "pig": { +- "dirs": ("{0}/{1}/pig/pig.tar.gz".format(STACK_ROOT_PATTERN, STACK_VERSION_PATTERN), +- "/{0}/apps/{1}/pig/pig.tar.gz".format(STACK_NAME_PATTERN, STACK_VERSION_PATTERN)), ++ "dirs": ("{}/{}/pig/pig.tar.gz".format(STACK_ROOT_PATTERN, STACK_VERSION_PATTERN), ++ "/{}/apps/{}/pig/pig.tar.gz".format(STACK_NAME_PATTERN, STACK_VERSION_PATTERN)), + "service": "PIG" + }, + + "hadoop_streaming": { +- "dirs": ("{0}/{1}/hadoop-mapreduce/hadoop-streaming.jar".format(STACK_ROOT_PATTERN, STACK_VERSION_PATTERN), +- "/{0}/apps/{1}/mapreduce/hadoop-streaming.jar".format(STACK_NAME_PATTERN, STACK_VERSION_PATTERN)), ++ "dirs": ("{}/{}/hadoop-mapreduce/hadoop-streaming.jar".format(STACK_ROOT_PATTERN, STACK_VERSION_PATTERN), ++ "/{}/apps/{}/mapreduce/hadoop-streaming.jar".format(STACK_NAME_PATTERN, STACK_VERSION_PATTERN)), + "service": "MAPREDUCE2" + }, + + "sqoop": { +- "dirs": ("{0}/{1}/sqoop/sqoop.tar.gz".format(STACK_ROOT_PATTERN, STACK_VERSION_PATTERN), +- "/{0}/apps/{1}/sqoop/sqoop.tar.gz".format(STACK_NAME_PATTERN, STACK_VERSION_PATTERN)), ++ "dirs": ("{}/{}/sqoop/sqoop.tar.gz".format(STACK_ROOT_PATTERN, STACK_VERSION_PATTERN), ++ "/{}/apps/{}/sqoop/sqoop.tar.gz".format(STACK_NAME_PATTERN, STACK_VERSION_PATTERN)), + "service": "SQOOP" + }, + + "mapreduce": { +- "dirs": ("{0}/{1}/hadoop/mapreduce.tar.gz".format(STACK_ROOT_PATTERN, STACK_VERSION_PATTERN), +- "/{0}/apps/{1}/mapreduce/mapreduce.tar.gz".format(STACK_NAME_PATTERN, STACK_VERSION_PATTERN)), ++ "dirs": ("{}/{}/hadoop/mapreduce.tar.gz".format(STACK_ROOT_PATTERN, STACK_VERSION_PATTERN), ++ "/{}/apps/{}/mapreduce/mapreduce.tar.gz".format(STACK_NAME_PATTERN, STACK_VERSION_PATTERN)), + "service": "MAPREDUCE2", + "prepare_function": _prepare_mapreduce_tarball + }, + + "spark": { +- "dirs": ("{0}/{1}/spark/lib/spark-{2}-assembly.jar".format(STACK_ROOT_PATTERN, STACK_VERSION_PATTERN, STACK_NAME_PATTERN), ++ "dirs": ("{}/{}/spark/lib/spark-{}-assembly.jar".format(STACK_ROOT_PATTERN, STACK_VERSION_PATTERN, STACK_NAME_PATTERN), + "/{0}/apps/{1}/spark/spark-{0}-assembly.jar".format(STACK_NAME_PATTERN, STACK_VERSION_PATTERN)), + "service": "SPARK" + }, + + "spark2": { +- "dirs": ("/tmp/spark2/spark2-{0}-yarn-archive.tar.gz".format(STACK_NAME_PATTERN), ++ "dirs": ("/tmp/spark2/spark2-{}-yarn-archive.tar.gz".format(STACK_NAME_PATTERN), + "/{0}/apps/{1}/spark2/spark2-{0}-yarn-archive.tar.gz".format(STACK_NAME_PATTERN, STACK_VERSION_PATTERN)), + "service": "SPARK2" + }, + + "spark2hive": { +- "dirs": ("/tmp/spark2/spark2-{0}-hive-archive.tar.gz".format(STACK_NAME_PATTERN), ++ "dirs": ("/tmp/spark2/spark2-{}-hive-archive.tar.gz".format(STACK_NAME_PATTERN), + "/{0}/apps/{1}/spark2/spark2-{0}-hive-archive.tar.gz".format(STACK_NAME_PATTERN, STACK_VERSION_PATTERN)), + + "service": "SPARK2" +@@ -315,23 +315,23 @@ + stack_name = Script.get_stack_name() + + if not stack_name: +- Logger.error("Cannot copy {0} tarball to HDFS because stack name could not be determined.".format(str(name))) ++ Logger.error("Cannot copy {} tarball to HDFS because stack name could not be determined.".format(str(name))) + return False, None, None + + if name is None or name.lower() not in TARBALL_MAP: +- Logger.error("Cannot copy tarball to HDFS because {0} is not supported in stack {1} for this operation.".format(str(name), str(stack_name))) ++ Logger.error("Cannot copy tarball to HDFS because {} is not supported in stack {} for this operation.".format(str(name), str(stack_name))) + return False, None, None + + service = TARBALL_MAP[name.lower()]['service'] + + stack_version = get_current_version(service=service, use_upgrading_version_during_upgrade=use_upgrading_version_during_upgrade) + if not stack_version: +- Logger.error("Cannot copy {0} tarball to HDFS because stack version could be be determined.".format(str(name))) ++ Logger.error("Cannot copy {} tarball to HDFS because stack version could be be determined.".format(str(name))) + return False, None, None + + stack_root = Script.get_stack_root() + if not stack_root: +- Logger.error("Cannot copy {0} tarball to HDFS because stack root could be be determined.".format(str(name))) ++ Logger.error("Cannot copy {} tarball to HDFS because stack root could be be determined.".format(str(name))) + return False, None, None + + (source_file, dest_file) = TARBALL_MAP[name.lower()]['dirs'] +@@ -377,7 +377,7 @@ + + # if there is no upgrade, then use the command's version + if not Script.in_stack_upgrade() or use_upgrading_version_during_upgrade: +- Logger.info("Tarball version was calcuated as {0}. Use Command Version: {1}".format( ++ Logger.info("Tarball version was calcuated as {}. Use Command Version: {}".format( + version, use_upgrading_version_during_upgrade)) + + return version +@@ -406,22 +406,22 @@ + + out = None + stack_selector_path = stack_tools.get_stack_tool_path(stack_tools.STACK_SELECTOR_NAME) +- get_stack_versions_cmd = "{0} versions > {1}".format(stack_selector_path, tmp_file) ++ get_stack_versions_cmd = "{} versions > {}".format(stack_selector_path, tmp_file) + try: + code, stdoutdata = shell.call(get_stack_versions_cmd, logoutput=True) + with open(tmp_file, 'r+') as file: + out = file.read() +- except Exception, e: +- Logger.logger.exception("Could not parse output of {0}. Error: {1}".format(str(tmp_file), str(e))) ++ except Exception as e: ++ Logger.logger.exception("Could not parse output of {}. Error: {}".format(str(tmp_file), str(e))) + finally: + try: + if os.path.exists(tmp_file): + os.remove(tmp_file) +- except Exception, e: +- Logger.logger.exception("Could not remove file {0}. Error: {1}".format(str(tmp_file), str(e))) ++ except Exception as e: ++ Logger.logger.exception("Could not remove file {}. Error: {}".format(str(tmp_file), str(e))) + + if code != 0 or out is None or out == "": +- Logger.error("Could not verify stack version by calling '{0}'. Return Code: {1}, Output: {2}.".format(get_stack_versions_cmd, str(code), str(out))) ++ Logger.error("Could not verify stack version by calling '{}'. Return Code: {}, Output: {}.".format(get_stack_versions_cmd, str(code), str(out))) + return None + + matches = re.findall(r"([\d\.]+(?:-\d+)?)", out) +@@ -429,12 +429,12 @@ + if matches and len(matches) == 1: + stack_version = matches[0] + elif matches and len(matches) > 1: +- Logger.error("Found multiple matches for stack version, cannot identify the correct one from: {0}".format(", ".join(matches))) ++ Logger.error("Found multiple matches for stack version, cannot identify the correct one from: {}".format(", ".join(matches))) + + 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. +@@ -452,16 +452,16 @@ + """ + import params + +- Logger.info("Called copy_to_hdfs tarball: {0}".format(name)) ++ Logger.info("Called copy_to_hdfs tarball: {}".format(name)) + (success, source_file, dest_file, prepare_function) = get_tarball_paths(name, use_upgrading_version_during_upgrade, + custom_source_file, custom_dest_file) + + if not success: +- Logger.error("Could not copy tarball {0} due to a missing or incorrect parameter.".format(str(name))) ++ Logger.error("Could not copy tarball {} due to a missing or incorrect parameter.".format(str(name))) + return False + + if skip: +- Logger.warning("Skipping copying {0} to {1} for {2} as it is a sys prepped host.".format(str(source_file), str(dest_file), str(name))) ++ Logger.warning("Skipping copying {} to {} for {} as it is a sys prepped host.".format(str(source_file), str(dest_file), str(name))) + return True + + if not skip_component_check: +@@ -469,13 +469,13 @@ + config_name = SERVICE_TO_CONFIG_MAP.get(name) + config = default("/configurations/"+config_name, None) + if config is None: +- Logger.info("{0} is not present on the cluster. Skip copying {1}".format(config_name, source_file)) ++ Logger.info("{} is not present on the cluster. Skip copying {}".format(config_name, source_file)) + return False + +- Logger.info("Source file: {0} , Dest file in HDFS: {1}".format(source_file, dest_file)) ++ Logger.info("Source file: {} , Dest file in HDFS: {}".format(source_file, dest_file)) + + if not os.path.exists(source_file): +- Logger.error("WARNING. Cannot copy {0} tarball because file does not exist: {1} . " ++ Logger.error("WARNING. Cannot copy {} tarball because file does not exist: {} . " + "It is possible that this component is not installed on this host.".format(str(name), str(source_file))) + return False + +@@ -502,7 +502,7 @@ + type="directory", + action="create_on_execute", + owner=owner, +- mode=0555 ++ mode=0o555 + ) + + # If the file already exists, it is a NO-OP +@@ -512,10 +512,10 @@ + 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)) ++ Logger.info("Will attempt to copy {} tarball from {} to DFS at {}.".format(name, source_file, dest_file)) + + # For improved performance, force_execute should be False so that it is delayed and combined with other calls. + # If still want to run the command now, set force_execute to True +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/curl_krb_request.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/curl_krb_request.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/curl_krb_request.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/curl_krb_request.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 +@@ -98,14 +98,14 @@ + # when executing curl. Use a hash of the combination of the principal and keytab file + # to generate a (relatively) unique cache filename so that we can use it as needed. Scope + # this file by user in order to prevent sharing of cache files by multiple users. +- ccache_file_name = HASH_ALGORITHM("{0}|{1}".format(principal, keytab)).hexdigest() ++ ccache_file_name = HASH_ALGORITHM("{}|{}".format(principal, keytab)).hexdigest() + + 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) ++ ccache_file_path = "{}{}{}_{}_cc_{}".format(curl_krb_cache_path, os.sep, cache_file_prefix, user, ccache_file_name) + kerberos_env = {'KRB5CCNAME': ccache_file_path} + + # concurrent kinit's can cause the following error: +@@ -124,13 +124,13 @@ + # 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 + + # if the time has not expired, double-check that the cache still has a valid ticket + if not is_kinit_required: +- klist_command = "{0} -s {1}".format(klist_path_local, ccache_file_path) ++ klist_command = "{} -s {}".format(klist_path_local, ccache_file_path) + is_kinit_required = (shell.call(klist_command, user=user)[0] != 0) + + # if kinit is required, the perform the kinit +@@ -146,7 +146,7 @@ + # kinit; there's no need to set a ticket timeout as this will use the default invalidation + # configured in the krb5.conf - regenerating keytabs will not prevent an existing cache + # from working correctly +- shell.checked_call("{0} -c {1} -kt {2} {3} > /dev/null".format(kinit_path_local, ++ shell.checked_call("{} -c {} -kt {} {} > /dev/null".format(kinit_path_local, + ccache_file_path, keytab, principal), user=user) + + # record kinit time +@@ -202,7 +202,7 @@ + + except Fail: + if logger.isEnabledFor(logging.DEBUG): +- logger.exception("Unable to make a curl request for {0}.".format(caller_label)) ++ logger.exception("Unable to make a curl request for {}.".format(caller_label)) + raise + finally: + if os.path.isfile(cookie_file): +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/data_structure_utils.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/data_structure_utils.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/data_structure_utils.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/data_structure_utils.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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__ = ['get_from_dict', 'convert_to_list'] + +-class KeyNotFound(object): ++class KeyNotFound: + # Prohibit instantiation + def __new__(cls): + raise AttributeError("Instance creation is not supported.") +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/decorator.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/decorator.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/decorator.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/decorator.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,24 +1,4 @@ +-#!/usr/bin/env python +-""" +-Licensed to the Apache Software Foundation (ASF) under one +-or more contributor license agreements. See the NOTICE file +-distributed with this work for additional information +-regarding copyright ownership. The ASF licenses this file +-to you under the Apache License, Version 2.0 (the +-"License"); you may not use this file except in compliance +-with the License. You may obtain a copy of the License at +- +- http://www.apache.org/licenses/LICENSE-2.0 +- +-Unless required by applicable law or agreed to in writing, software +-distributed under the License is distributed on an "AS IS" BASIS, +-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-See the License for the specific language governing permissions and +-limitations under the License. +- +-Ambari Agent +- +-""" ++#!/usr/bin/env python3 + + import time + __all__ = ['retry', 'safe_retry', 'experimental' ] +@@ -52,7 +32,7 @@ + _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 +73,7 @@ + _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 +81,7 @@ + + try: + return function(*args, **kwargs) +- except _err_class, err: ++ except _err_class as err: + Logger.error(str(err)) + return _return_on_fail + +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/default.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/default.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/default.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/default.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/download_from_hdfs.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/download_from_hdfs.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/download_from_hdfs.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/download_from_hdfs.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 +@@ -47,11 +47,11 @@ + """ + import params + +- Logger.info("Called download_from_hdfs source in HDFS: {0} , local destination path: {1}".format(source_file, dest_path)) ++ Logger.info("Called download_from_hdfs source in HDFS: {} , local destination path: {}".format(source_file, dest_path)) + + # The destination directory must already exist + if not os.path.exists(dest_path): +- Logger.error("Cannot copy {0} because destination directory {1} does not exist.".format(source_file, dest_path)) ++ Logger.error("Cannot copy {} because destination directory {} does not exist.".format(source_file, dest_path)) + return False + + filename = os.path.basename(source_file) +@@ -67,7 +67,7 @@ + replace_existing_files=replace_existing_files, + ) + +- Logger.info("Will attempt to copy from DFS at {0} to local file system {1}.".format(source_file, dest_file)) ++ Logger.info("Will attempt to copy from DFS at {} to local file system {}.".format(source_file, dest_file)) + + # For improved performance, force_execute should be False so that it is delayed and combined with other calls. + if force_execute: +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/dynamic_variable_interpretation.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/dynamic_variable_interpretation.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/dynamic_variable_interpretation.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/dynamic_variable_interpretation.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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,10 +54,10 @@ + :param tarball_prefix: Prefix of the tarball must be one of tez, hive, mr, pig + :return: Returns a tuple of (x, y) after verifying the properties + """ +- component_tar_source_file = default("/configurations/cluster-env/%s%s" % (tarball_prefix.lower(), TAR_SOURCE_SUFFIX), None) ++ component_tar_source_file = default("/configurations/cluster-env/{}{}".format(tarball_prefix.lower(), TAR_SOURCE_SUFFIX), None) + # E.g., /current/hadoop-client/tez-{{ stack_version_formatted }}.tar.gz + +- component_tar_destination_folder = default("/configurations/cluster-env/%s%s" % (tarball_prefix.lower(), TAR_DESTINATION_FOLDER_SUFFIX), None) ++ component_tar_destination_folder = default("/configurations/cluster-env/{}{}".format(tarball_prefix.lower(), TAR_DESTINATION_FOLDER_SUFFIX), None) + # E.g., hdfs:///hdp/apps/{{ stack_version_formatted }}/mapreduce/ + + if not component_tar_source_file or not component_tar_destination_folder: +@@ -100,7 +100,7 @@ + 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 @@ + 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,8 +132,8 @@ + bin_dir=params.hadoop_bin_dir, + conf_dir=params.hadoop_conf_dir + ) +- except Exception, e: +- Logger.error("Failed to copy file. Source: %s, Destination: %s. Error: %s" % (source, destination, e.message)) ++ except Exception as e: ++ Logger.error("Failed to copy file. Source: {}, Destination: {}. Error: {}".format(source, destination, e.message)) + return_value = 1 + return return_value + +@@ -155,7 +155,7 @@ + import params + + if not ignore_sysprep and hasattr(params, "host_sys_prepped") and params.host_sys_prepped: +- Logger.info("Host is sys-prepped. Tarball %s will not be copied for %s." % (tarball_prefix, stack_select_component_name)) ++ Logger.info("Host is sys-prepped. Tarball {} will not be copied for {}.".format(tarball_prefix, stack_select_component_name)) + return 0 + + if not hasattr(params, "stack_version_formatted") or params.stack_version_formatted is None: +@@ -176,7 +176,7 @@ + out = None + (stack_selector_name, stack_selector_path, stack_selector_package) = stack_tools.get_stack_tool(stack_tools.STACK_SELECTOR_NAME) + with open(tmpfile.name, 'r+') as file: +- get_stack_version_cmd = '%s status %s > %s' % (stack_selector_path, stack_select_component_name, tmpfile.name) ++ get_stack_version_cmd = '{} status {} > {}'.format(stack_selector_path, stack_select_component_name, tmpfile.name) + code, stdoutdata = shell.call(get_stack_version_cmd) + out = file.read() + pass +@@ -189,7 +189,7 @@ + stack_version = matches[0] if matches and len(matches) > 0 else None + + if not stack_version: +- Logger.error("Could not parse stack version from output of %s: %s" % (stack_selector_name, str(out))) ++ Logger.error("Could not parse stack version from output of {}: {}".format(stack_selector_name, str(out))) + return 1 + + file_name = os.path.basename(component_tar_source_file) +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/expect.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/expect.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/expect.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/expect.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + + 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,19 +46,19 @@ + 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": + value = False + else: +- raise Fail("Configuration {0} expected to be boolean (true or false), but found '{1}'".format(name, value)) ++ raise Fail("Configuration {} expected to be boolean (true or false), but found '{}'".format(name, value)) + 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]: ++ raise Fail("Configuration {} expected to be boolean (true or false), but found instance of unknown type '{}'".format(name, type_name)) ++ elif expected_type in [int, int, float]: + try: + value = expected_type(value) + except (ValueError, TypeError): +- raise Fail("Configuration {0} expected to be number, but found '{1}'".format(name, value)) ++ raise Fail("Configuration {} expected to be number, but found '{}'".format(name, value)) + return value +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/fcntl_based_process_lock.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/fcntl_based_process_lock.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/fcntl_based_process_lock.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/fcntl_based_process_lock.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + + from resource_management.core.logger import Logger + +-class FcntlBasedProcessLock(object): ++class FcntlBasedProcessLock: + """A file descriptor based lock for interprocess locking. + The lock is automatically released when process dies. + +@@ -61,7 +61,7 @@ + if not self.enabled: + return + import fcntl +- Logger.info("Trying to acquire a lock on {0}".format(self.lock_file_name)) ++ Logger.info("Trying to acquire a lock on {}".format(self.lock_file_name)) + if self.lock_file is None or self.lock_file.closed: + self.lock_file = open(self.lock_file_name, 'a') + try: +@@ -74,7 +74,7 @@ + raise + else: + self.acquired = True +- Logger.info("Acquired the lock on {0}".format(self.lock_file_name)) ++ Logger.info("Acquired the lock on {}".format(self.lock_file_name)) + + def unlock(self): + """ +@@ -83,7 +83,7 @@ + if not self.enabled: + return + import fcntl +- Logger.info("Releasing the lock on {0}".format(self.lock_file_name)) ++ Logger.info("Releasing the lock on {}".format(self.lock_file_name)) + if self.acquired: + try: + fcntl.lockf(self.lock_file, fcntl.LOCK_UN) +@@ -98,8 +98,8 @@ + try: + self.lock_file.close() + self.lock_file = None +- except IOError: +- Logger.warning("Failed to close {0}".format(self.lock_file_name)) ++ except OSError: ++ Logger.warning("Failed to close {}".format(self.lock_file_name)) + + def __enter__(self): + self.blocking_lock() +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/file_system.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/file_system.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/file_system.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/file_system.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + """ + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file +@@ -71,5 +71,5 @@ + elif os.path.join(best_mount_found, "").count(os.path.sep) < os.path.join(m, "").count(os.path.sep): + best_mount_found = m + +- Logger.info("Mount point for directory %s is %s" % (str(dir), str(best_mount_found))) ++ Logger.info("Mount point for directory {} is {}".format(str(dir), str(best_mount_found))) + return best_mount_found +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/find_executable.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/find_executable.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/find_executable.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/find_executable.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 .find_path import find_path + + + def find_executable(search_directories, filename): +@@ -38,10 +38,10 @@ + @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(",")) ++ if isinstance(search_directories, str): ++ search_directories = list(map(str.strip, search_directories.encode("ascii").split(","))) + elif isinstance(search_directories, str): +- search_directories = map(str.strip, search_directories.split(",")) ++ 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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/find_path.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/find_path.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/find_path.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/find_path.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/flume_agent_helper.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/flume_agent_helper.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/flume_agent_helper.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/flume_agent_helper.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + """ + Licensed to the Apache Software Foundation (ASF) under one +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/format_jvm_option.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/format_jvm_option.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/format_jvm_option.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/format_jvm_option.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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,10 +38,9 @@ + 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 + else: + return default_value +- +\ 文件尾没有换行符 +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/format.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/format.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/format.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/format.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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,13 +78,13 @@ + + 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': + return utils.PASSWORDS_HIDE_STRING if is_protected else self._convert_field(value, 'e', is_protected) + +- return super(ConfigurationFormatter, self).convert_field(value, conversion) ++ return super().convert_field(value, conversion) + + + def format(format_string, *args, **kwargs): +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/generate_logfeeder_input_config.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/generate_logfeeder_input_config.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/generate_logfeeder_input_config.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/generate_logfeeder_input_config.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + """ + import params + Directory(LOGFEEDER_CONF_DIR, +- mode=0755, ++ mode=0o755, + cd_access='a', + create_parents=True + ) +@@ -40,5 +40,5 @@ + 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 + ) +\ 文件尾没有换行符 +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/get_architecture.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/get_architecture.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/get_architecture.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/get_architecture.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/get_bare_principal.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/get_bare_principal.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/get_bare_principal.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/get_bare_principal.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/get_config.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/get_config.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/get_config.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/get_config.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + if all_configurations: + config = all_configurations.get(config_type, default) + if not config: +- Logger.warning("No configurations for config type {0}. Use default instead.".format(config_type)) ++ Logger.warning("No configurations for config type {}. Use default instead.".format(config_type)) + return config + else: + Logger.warning("No service configurations available in the \"configurations\" section. Use default instead.".format(config_type)) +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/get_kdestroy_path.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/get_kdestroy_path.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/get_kdestroy_path.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/get_kdestroy_path.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 .find_executable import find_executable + + + def get_kdestroy_path(search_directories=None): +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/get_kinit_path.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/get_kinit_path.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/get_kinit_path.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/get_kinit_path.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 .find_executable import find_executable + + + def get_kinit_path(search_directories=None): +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/get_klist_path.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/get_klist_path.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/get_klist_path.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/get_klist_path.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 .find_executable import find_executable + + + def get_klist_path(search_directories=None): +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/get_not_managed_resources.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/get_not_managed_resources.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/get_not_managed_resources.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/get_not_managed_resources.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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,13 +36,13 @@ + 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) + + if property_value == None: +- Logger.warning(("Property {0} from cluster-env/managed_hdfs_resource_property_names not found in configurations. " ++ Logger.warning(("Property {} from cluster-env/managed_hdfs_resource_property_names not found in configurations. " + "Management of this DFS resource will not be forced.").format(property_name)) + else: + while property_value in not_managed_hdfs_path_list: +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/get_path_from_url.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/get_path_from_url.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/get_path_from_url.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/get_path_from_url.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + if is_empty(address): + return address + +- result = re.findall("^((.+)://)?(([a-zA-Z0-9]|\.|-)*)(:([\d]{2,}))?/(.*)$", address) ++ result = re.findall(r"^((.+)://)?(([a-zA-Z0-9]|\.|-)*)(:([\d]{2,}))?/(.*)$", address) + if result: + return result[0][6] + return None +\ 文件尾没有换行符 +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/get_port_from_url.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/get_port_from_url.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/get_port_from_url.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/get_port_from_url.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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,16 +34,16 @@ + if is_empty(address): + return address + +- if isinstance(address, (int, long)): ++ if isinstance(address, int): + return address + + if address is None or address.strip() == "": + return "" + +- port = re.findall(":([\d]{1,5})(?=/|$)", address) ++ port = re.findall(r":([\d]{1,5})(?=/|$)", address) + if port: + return port[0] + elif address.isdigit(): + return address + +- raise Fail("No port in URL:{0}".format(address)) ++ raise Fail("No port in URL:{}".format(address)) +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/get_stack_version.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/get_stack_version.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/get_stack_version.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/get_stack_version.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + try: + component_home_dir = os.environ[package_name.upper() + "_HOME"] + except KeyError: +- Logger.info('Skipping get_stack_version since the component {0} is not yet available'.format(package_name)) ++ Logger.info('Skipping get_stack_version since the component {} is not yet available'.format(package_name)) + return None # lazy fail + + #As a rule, component_home_dir is of the form \[\][\] +@@ -54,7 +54,7 @@ + # with package_version = #.#.# and stack_version=#.#.#.#- + match = re.findall('[0-9]+.[0-9]+.[0-9]+.[0-9]+-[0-9]+', home_dir_split[iSubdir]) + if not match: +- Logger.info('Failed to get extracted version for component {0}. Home dir not in expected format.'.format(package_name)) ++ Logger.info('Failed to get extracted version for component {}. Home dir not in expected format.'.format(package_name)) + return None # lazy fail + + return match[0] +@@ -75,13 +75,13 @@ + 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.') + + if return_code != 0: + raise Fail( +- 'Unable to determine the current version because of a non-zero return code of {0}'.format(str(return_code))) ++ 'Unable to determine the current version because of a non-zero return code of {}'.format(str(return_code))) + + stack_version = re.sub(package_name + ' - ', '', stack_output) + stack_version = stack_version.rstrip() +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/get_unique_id_and_date.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/get_unique_id_and_date.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/get_unique_id_and_date.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/get_unique_id_and_date.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/get_user_call_output.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/get_user_call_output.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/get_user_call_output.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/get_user_call_output.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + + # 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 +@@ -68,7 +68,7 @@ + caller_filename = sys._getframe(1).f_code.co_filename + is_internal_call = shell.NOT_LOGGED_FOLDER in caller_filename + if quiet == False or (quiet == None and not is_internal_call): +- log_msg = "{0} returned {1}".format(get_user_call_output.__name__, result) ++ log_msg = "{} returned {}".format(get_user_call_output.__name__, result) + Logger.info(log_msg) + + return result +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/hdfs_utils.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/hdfs_utils.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/hdfs_utils.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/hdfs_utils.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/hive_check.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/hive_check.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/hive_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/hive_check.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/__init__.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/__init__.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/__init__.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/__init__.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/install_jdbc_driver.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/install_jdbc_driver.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/install_jdbc_driver.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/install_jdbc_driver.py 2022-07-11 00:52:28.000000000 +0800 +@@ -34,7 +34,7 @@ + #If not, attempt to download it from the server resources URL + for driver_file in driver_files: + dest_path = os.path.join(dest_dir, driver_file) +- Logger.info("JDBC driver file(s) {0}: Attempting to copy from {1} or download from {2} to {3}".format( ++ Logger.info("JDBC driver file(s) {}: Attempting to copy from {} or download from {} to {}".format( + str(driver_files), cache_location, driver_url, dest_dir)) + if not os.path.exists(dest_path): + search_path = os.environ["PATH"] +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/install_windows_msi.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/install_windows_msi.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/install_windows_msi.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/install_windows_msi.py 2022-07-11 00:52:28.000000000 +0800 +@@ -32,7 +32,7 @@ + import socket + import os + import glob +-import urlparse ++import urllib.parse + + + __all__ = ['install_windows_msi'] +@@ -95,7 +95,7 @@ + INSTALL_MSI_CMD = 'cmd /C start /wait msiexec /qn /i {msi_path} /lv {log_path} MSIUSEREALADMINDETECTION=1 ' \ + 'HDP_LAYOUT={layout_path} DESTROY_DATA=yes HDP_USER={hadoop_user} HDP_USER_PASSWORD={hadoop_password_arg} HDP=yes ' \ + 'KNOX=yes KNOX_MASTER_SECRET="AmbariHDP2Windows" FALCON=yes STORM=yes HBase=yes STORM=yes FLUME=yes PHOENIX=no RANGER=no' +-CREATE_SERVICE_SCRIPT = os.path.abspath("sbin\createservice.ps1") ++CREATE_SERVICE_SCRIPT = os.path.abspath(r"sbin\createservice.ps1") + CREATE_SERVICE_CMD = 'cmd /C powershell -ExecutionPolicy Bypass -File "{script}" -username {username} -password "{password}" -servicename ' \ + '{servicename} -hdpresourcesdir "{resourcedir}" -servicecmdpath "{servicecmd}"' + INSTALL_MARKER_OK = "msi.installed" +@@ -133,7 +133,7 @@ + for link_pair in links_pairs: + link, target = link_pair + target = glob.glob(os.path.expandvars(target))[0].replace("\\\\", "\\") +- Execute('cmd /c mklink "{0}" "{1}"'.format(link, target)) ++ Execute('cmd /c mklink "{}" "{}"'.format(link, target)) + + + # check if services exists and marker file present +@@ -182,7 +182,7 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/is_empty.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/is_empty.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/is_empty.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/is_empty.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/jmx.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/jmx.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/jmx.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/jmx.py 2022-07-11 00:52:28.000000000 +0800 +@@ -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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/list_ambari_managed_repos.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/list_ambari_managed_repos.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/list_ambari_managed_repos.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/list_ambari_managed_repos.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/log_process_information.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/log_process_information.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/log_process_information.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/log_process_information.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + """ + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file +@@ -38,4 +38,4 @@ + + for cmd in cmd_list: + ret = shell_runner.run(cmd) +- logger.info("Command '{0}' returned {1}. {2}{3}".format(cmd, ret["exitCode"], ret["error"], ret["output"])) ++ logger.info("Command '{}' returned {}. {}{}".format(cmd, ret["exitCode"], ret["error"], ret["output"])) +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/lzo_utils.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/lzo_utils.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/lzo_utils.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/lzo_utils.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/mounted_dirs_helper.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/mounted_dirs_helper.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/mounted_dirs_helper.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/mounted_dirs_helper.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + """ + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file +@@ -48,7 +48,7 @@ + + if history_filename is not None and os.path.exists(str(history_filename)): + try: +- with open(str(history_filename), "r") as f: ++ with open(str(history_filename)) as f: + for line in f: + # Ignore comments + if line and len(line) > 0 and line[0] == "#": +@@ -57,7 +57,7 @@ + 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 @@ + + 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 +@@ -127,7 +127,7 @@ + if os.path.isdir(dir): + valid_existing_dirs.append(dir) + +- used_mounts = set([get_mount_point_for_dir(dir) for dir in valid_existing_dirs]) ++ used_mounts = {get_mount_point_for_dir(dir) for dir in valid_existing_dirs} + + ignore_bad_mounts = default('/configurations/cluster-env/ignore_bad_mounts', False) + manage_dirs_on_root = default('/configurations/cluster-env/manage_dirs_on_root', True) +@@ -139,8 +139,8 @@ + folder_exists = dir_ in valid_existing_dirs + + if not folder_exists and ignore_bad_mounts: +- Logger.debug("The directory {0} doesn't exist.".format(dir_)) +- Logger.warning("Not creating {0} as cluster-env/ignore_bad_mounts is enabled.".format(dir_)) ++ Logger.debug("The directory {} doesn't exist.".format(dir_)) ++ Logger.warning("Not creating {} as cluster-env/ignore_bad_mounts is enabled.".format(dir_)) + may_manage_this_dir = False + else: + may_manage_this_dir = _may_manage_folder(dir_, last_mount_point_for_dir, is_non_root_dir, dirs_unmounted, error_messages, manage_dirs_on_root, curr_mount_point) +@@ -153,7 +153,7 @@ + Logger.warning("Trying to create another directory on the following mount: " + str(curr_mount_point)) + + if may_manage_this_dir: +- Logger.info("Forcefully ensuring existence and permissions of the directory: {0}".format(dir_)) ++ Logger.info("Forcefully ensuring existence and permissions of the directory: {}".format(dir_)) + # Call the function + func(dir_) + used_mounts.add(curr_mount_point) +@@ -175,11 +175,11 @@ + header = " WARNING ".join(["*****"] * 6) + header = "\n" + "\n".join([header, ] * 3) + "\n" + msg = " ".join(error_messages) + \ +- " Please ensure that mounts are healthy. If the mount change was intentional, you can update the contents of {0}.".format(history_filename) ++ " Please ensure that mounts are healthy. If the mount change was intentional, you can update the contents of {}.".format(history_filename) + Logger.error(header + msg + header) + + dir_to_mount = DIR_TO_MOUNT_HEADER +- for kv in dir_to_mount_point.iteritems(): ++ for kv in list(dir_to_mount_point.items()): + dir_to_mount += kv[0] + "," + kv[1] + "\n" + + return dir_to_mount +@@ -194,24 +194,24 @@ + if manage_dirs_on_root: + may_manage_this_dir = True + else: +- Logger.warning("Will not manage the directory {0} since it's on root mount and cluster-env/manage_dirs_on_root == {1}".format(dir_, str(manage_dirs_on_root))) ++ Logger.warning("Will not manage the directory {} since it's on root mount and cluster-env/manage_dirs_on_root == {}".format(dir_, str(manage_dirs_on_root))) + may_manage_this_dir = False + # Do not add to the history file: + dirs_unmounted.add(dir_) + else: +- Logger.debug("Last mount for {0} in the history file is {1}".format(dir_, str(last_mount_point_for_dir))) ++ Logger.debug("Last mount for {} in the history file is {}".format(dir_, str(last_mount_point_for_dir))) + if last_mount_point_for_dir == curr_mount_point: + if is_non_root_dir or manage_dirs_on_root: +- Logger.debug("Will manage {0} since it's on the same mount point: {1}".format(dir_, str(last_mount_point_for_dir))) ++ Logger.debug("Will manage {} since it's on the same mount point: {}".format(dir_, str(last_mount_point_for_dir))) + may_manage_this_dir = True + else: +- Logger.warning("Will not manage {0} since it's on the root mount point and cluster-env/manage_dirs_on_root == {1}".format(dir_, str(manage_dirs_on_root))) ++ Logger.warning("Will not manage {} since it's on the root mount point and cluster-env/manage_dirs_on_root == {}".format(dir_, str(manage_dirs_on_root))) + may_manage_this_dir = False + else: + may_manage_this_dir = False + dirs_unmounted.add(dir_) + +- msg = "Directory {0} became unmounted from {1} . Current mount point: {2} .".format(dir_, last_mount_point_for_dir, curr_mount_point) ++ msg = "Directory {} became unmounted from {} . Current mount point: {} .".format(dir_, last_mount_point_for_dir, curr_mount_point) + error_messages.append(msg) + Logger.warning(msg) + return may_manage_this_dir +@@ -227,7 +227,7 @@ + mount_dirs[mount_point].append(dir) + + partition_mounts_list = [] +- for mount_point, dir_list in mount_dirs.iteritems(): ++ for mount_point, dir_list in list(mount_dirs.items()): + if len(dir_list) > 1: + partition_mounts_list.append((mount_point, dir_list)) + +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/namenode_ha_utils.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/namenode_ha_utils.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/namenode_ha_utils.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/namenode_ha_utils.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +@@ -59,12 +59,12 @@ + doRetries.attempt += 1 + active_namenodes, standby_namenodes, unknown_namenodes = get_namenode_states_noretries(hdfs_site, security_enabled, run_user, doRetries.attempt == times, name_service=name_service) + Logger.info( +- "NameNode HA states: active_namenodes = {0}, standby_namenodes = {1}, unknown_namenodes = {2}".format( ++ "NameNode HA states: active_namenodes = {}, standby_namenodes = {}, unknown_namenodes = {}".format( + active_namenodes, standby_namenodes, unknown_namenodes)) + if active_namenodes: + return active_namenodes, standby_namenodes, unknown_namenodes + elif doRetries.attempt == times: +- Logger.warning("No active NameNode was found after {0} retries. Will return current NameNode HA states".format(times)) ++ Logger.warning("No active NameNode was found after {} retries. Will return current NameNode HA states".format(times)) + return active_namenodes, standby_namenodes, unknown_namenodes + raise Fail('No active NameNode was found.') + +@@ -103,7 +103,7 @@ + state = get_value_from_jmx(jmx_uri, 'tag.HAState', security_enabled, run_user, is_https_enabled, last_retry) + # If JMX parsing failed + if not state: +- check_service_cmd = "hdfs haadmin -ns {0} -getServiceState {1}".format(name_service, nn_unique_id) ++ check_service_cmd = "hdfs haadmin -ns {} -getServiceState {}".format(name_service, nn_unique_id) + code, out = shell.call(check_service_cmd, logoutput=True, user=run_user) + if code == 0 and out: + if HDFS_NN_STATE_STANDBY in out: +@@ -163,7 +163,7 @@ + if state: + return state + +- Logger.info("Cannot get clusterId from {0}".format(jmx_uri)) ++ Logger.info("Cannot get clusterId from {}".format(jmx_uri)) + + raise Fail("Cannot get clsuterId from jmx, since none of the namenodes is running/accessible via jmx.") + +@@ -378,9 +378,9 @@ + raise ValueError('Host name required when using namenode federation') + + for ns in name_services: +- ha_name_nodes = hdfs_site['dfs.ha.namenodes.{0}'.format(ns)].split(',') ++ ha_name_nodes = hdfs_site['dfs.ha.namenodes.{}'.format(ns)].split(',') + for nn in ha_name_nodes: +- nn_rpc_port = hdfs_site['dfs.namenode.rpc-address.{0}.{1}'.format(ns,nn)] ++ nn_rpc_port = hdfs_site['dfs.namenode.rpc-address.{}.{}'.format(ns,nn)] + nn_rpc = nn_rpc_port.split(':')[0] + if nn_rpc == host_name: + return ns +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/oozie_prepare_war.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/oozie_prepare_war.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/oozie_prepare_war.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/oozie_prepare_war.py 2022-07-11 00:52:28.000000000 +0800 +@@ -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 @@ + run_prepare_war = False + if os.path.exists(prepare_war_cmd_file): + cmd = "" +- with open(prepare_war_cmd_file, "r") as f: ++ with open(prepare_war_cmd_file) as f: + cmd = f.readline().strip() + + if command_to_file != cmd: +@@ -64,7 +64,7 @@ + if run_prepare_war == False: + if os.path.exists(libext_content_file): + old_content = "" +- with open(libext_content_file, "r") as f: ++ with open(libext_content_file) as f: + old_content = f.read().strip() + + if libext_content != old_content: +@@ -82,18 +82,18 @@ + output = "" + + if return_code != 0 or "New Oozie WAR file with added".lower() not in output.lower(): +- message = "Unexpected Oozie WAR preparation output {0}".format(output) ++ message = "Unexpected Oozie WAR preparation output {}".format(output) + Logger.error(message) + raise Fail(message) + + # 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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/package_conditions.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/package_conditions.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/package_conditions.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/package_conditions.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/ranger_functions.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/ranger_functions.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/ranger_functions.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/ranger_functions.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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,11 +68,11 @@ + """ + try: + searchRepoURL = self.urlReposPub + "?name=" + name + "&type=" + component + "&status=" + status +- request = urllib2.Request(searchRepoURL) ++ request = urllib.request.Request(searchRepoURL) + base64string = base64.encodestring(usernamepassword).replace('\n', '') + request.add_header("Content-Type", "application/json") + request.add_header("Accept", "application/json") +- request.add_header("Authorization", "Basic {0}".format(base64string)) ++ request.add_header("Authorization", "Basic {}".format(base64string)) + result = openurl(request, timeout=20) + response_code = result.getcode() + response = json.loads(result.read()) +@@ -84,12 +84,12 @@ + return None + else: + return None +- except urllib2.URLError, e: +- if isinstance(e, urllib2.HTTPError): +- raise Fail("Error getting {0} repository for component {1}. Http status code - {2}. \n {3}".format(name, component, e.code, e.read())) ++ except urllib.error.URLError as e: ++ if isinstance(e, urllib.error.HTTPError): ++ raise Fail("Error getting {} repository for component {}. Http status code - {}. \n {}".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: ++ raise Fail("Error getting {} repository for component {}. Reason - {}.".format(name, component, e.reason)) ++ 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 @@ + """ + 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: +@@ -122,12 +122,12 @@ + while retryCount <= 5: + repo = self.get_repository_by_name_urllib2(repo_name, component, 'true', ambari_username_password_for_ranger) + if repo is not None: +- Logger.info('{0} Repository {1} exist'.format(component.title(), repo['name'])) ++ Logger.info('{} Repository {} exist'.format(component.title(), repo['name'])) + break + else: + response = self.create_repository_urllib2(repo_data, ambari_username_password_for_ranger, policy_user) + if response is not None: +- Logger.info('{0} Repository created in Ranger admin'.format(component.title())) ++ Logger.info('{} Repository created in Ranger admin'.format(component.title())) + break + else: + if retryCount < 5: +@@ -135,7 +135,7 @@ + time.sleep(15) # delay for 15 seconds + retryCount += 1 + else: +- Logger.error('{0} Repository creation failed in Ranger admin'.format(component.title())) ++ Logger.error('{} Repository creation failed in Ranger admin'.format(component.title())) + break + else: + Logger.error('Ambari admin user creation failed') +@@ -152,13 +152,13 @@ + """ + try: + searchRepoURL = self.urlReposPub +- base64string = base64.encodestring('{0}'.format(usernamepassword)).replace('\n', '') ++ base64string = base64.encodestring('{}'.format(usernamepassword)).replace('\n', '') + headers = { + 'Accept': 'application/json', + "Content-Type": "application/json" + } +- request = urllib2.Request(searchRepoURL, data, headers) +- request.add_header("Authorization", "Basic {0}".format(base64string)) ++ request = urllib.request.Request(searchRepoURL, data, headers) ++ request.add_header("Authorization", "Basic {}".format(base64string)) + result = openurl(request, timeout=20) + response_code = result.getcode() + response = json.loads(json.JSONEncoder().encode(result.read())) +@@ -193,12 +193,12 @@ + else: + Logger.info('Repository creation failed') + return None +- except urllib2.URLError, e: +- if isinstance(e, urllib2.HTTPError): +- raise Fail("Error creating repository. Http status code - {0}. \n {1}".format(e.code, e.read())) ++ except urllib.error.URLError as e: ++ if isinstance(e, urllib.error.HTTPError): ++ raise Fail("Error creating repository. Http status code - {}. \n {}".format(e.code, e.read())) + else: +- raise Fail("Error creating repository. Reason - {0}.".format(e.reason)) +- except httplib.BadStatusLine: ++ raise Fail("Error creating repository. Reason - {}.".format(e.reason)) ++ 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 @@ + response = openurl(url, timeout=20) + response_code = response.getcode() + return response_code +- except urllib2.URLError, e: +- if isinstance(e, urllib2.HTTPError): +- raise Fail("Connection to Ranger Admin failed. Http status code - {0}. \n {1}".format(e.code, e.read())) ++ except urllib.error.URLError as e: ++ if isinstance(e, urllib.error.HTTPError): ++ raise Fail("Connection to Ranger Admin failed. Http status code - {}. \n {}".format(e.code, e.read())) + else: +- raise Fail("Connection to Ranger Admin failed. Reason - {0}.".format(e.reason)) +- except httplib.BadStatusLine, e: ++ raise Fail("Connection to Ranger Admin failed. Reason - {}.".format(e.reason)) ++ 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,11 +234,11 @@ + """ + try: + searchPolicyURL = self.urlPolicies + "?repositoryName=" + name + "&repositoryType=" + component + "&isEnabled=" + status +- request = urllib2.Request(searchPolicyURL) ++ request = urllib.request.Request(searchPolicyURL) + base64string = base64.encodestring(usernamepassword).replace('\n', '') + request.add_header("Content-Type", "application/json") + request.add_header("Accept", "application/json") +- request.add_header("Authorization", "Basic {0}".format(base64string)) ++ request.add_header("Authorization", "Basic {}".format(base64string)) + result = openurl(request, timeout=20) + response_code = result.getcode() + response = json.loads(result.read()) +@@ -246,12 +246,12 @@ + return response['vXPolicies'] + else: + return None +- except urllib2.URLError, e: +- if isinstance(e, urllib2.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())) ++ except urllib.error.URLError as e: ++ if isinstance(e, urllib.error.HTTPError): ++ raise Fail("Error getting policy from repository {} for component {}. Http status code - {}. \n {}".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: ++ raise Fail("Error getting policy from repository {} for component {}. Reason - {}.".format(name, component, e.reason)) ++ 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,13 +266,13 @@ + """ + try: + searchRepoURL = self.urlPolicies + "/" + str(policyId) +- base64string = base64.encodestring('{0}'.format(usernamepassword)).replace('\n', '') ++ base64string = base64.encodestring('{}'.format(usernamepassword)).replace('\n', '') + headers = { + 'Accept': 'application/json', + "Content-Type": "application/json" + } +- request = urllib2.Request(searchRepoURL, data, headers) +- request.add_header("Authorization", "Basic {0}".format(base64string)) ++ request = urllib.request.Request(searchRepoURL, data, headers) ++ request.add_header("Authorization", "Basic {}".format(base64string)) + request.get_method = lambda: 'PUT' + result = openurl(request, timeout=20) + response_code = result.getcode() +@@ -283,12 +283,12 @@ + else: + Logger.error('Update Policy failed') + return None +- except urllib2.URLError, e: +- if isinstance(e, urllib2.HTTPError): +- raise Fail("Error updating policy. Http status code - {0}. \n {1}".format(e.code, e.read())) ++ except urllib.error.URLError as e: ++ if isinstance(e, urllib.error.HTTPError): ++ raise Fail("Error updating policy. Http status code - {}. \n {}".format(e.code, e.read())) + else: +- raise Fail("Error updating policy. Reason - {0}.".format(e.reason)) +- except httplib.BadStatusLine: ++ raise Fail("Error updating policy. Reason - {}.".format(e.reason)) ++ 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") +@@ -327,16 +327,16 @@ + :return Returns response code for successful user creation else None + """ + flag_ambari_admin_present = False +- match = re.match('[a-zA-Z0-9_\S]+$', ambari_admin_password) ++ match = re.match(r'[a-zA-Z0-9_\S]+$', ambari_admin_password) + if match is None: + raise Fail('Invalid password given for Ranger Admin user for Ambari') + try: + url = self.urlUsers + '?name=' + str(ambari_admin_username) +- request = urllib2.Request(url) ++ request = urllib.request.Request(url) + base64string = base64.encodestring(usernamepassword).replace('\n', '') + request.add_header("Content-Type", "application/json") + request.add_header("Accept", "application/json") +- request.add_header("Authorization", "Basic {0}".format(base64string)) ++ request.add_header("Authorization", "Basic {}".format(base64string)) + result = openurl(request, timeout=20) + response_code = result.getcode() + response = json.loads(result.read()) +@@ -362,13 +362,13 @@ + 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.encodestring('{}'.format(usernamepassword)).replace('\n', '') + headers = { + 'Accept': 'application/json', + "Content-Type": "application/json" + } +- request = urllib2.Request(url, data, headers) +- request.add_header("Authorization", "Basic {0}".format(base64string)) ++ request = urllib.request.Request(url, data, headers) ++ request.add_header("Authorization", "Basic {}".format(base64string)) + result = openurl(request, timeout=20) + response_code = result.getcode() + response = json.loads(json.JSONEncoder().encode(result.read())) +@@ -380,12 +380,12 @@ + return None + else: + return None +- except urllib2.URLError, e: +- if isinstance(e, urllib2.HTTPError): +- raise Fail("Error creating ambari admin user. Http status code - {0}. \n {1}".format(e.code, e.read())) ++ except urllib.error.URLError as e: ++ if isinstance(e, urllib.error.HTTPError): ++ raise Fail("Error creating ambari admin user. Http status code - {}. \n {}".format(e.code, e.read())) + else: +- raise Fail("Error creating ambari admin user. Reason - {0}.".format(e.reason)) +- except httplib.BadStatusLine: ++ raise Fail("Error creating ambari admin user. Reason - {}.".format(e.reason)) ++ 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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/ranger_functions_v2.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/ranger_functions_v2.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/ranger_functions_v2.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/ranger_functions_v2.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,31 +1,14 @@ +-#!/usr/bin/env python +-""" +-Licensed to the Apache Software Foundation (ASF) under one +-or more contributor license agreements. See the NOTICE file +-distributed with this work for additional information +-regarding copyright ownership. The ASF licenses this file +-to you under the Apache License, Version 2.0 (the +-"License"); you may not use this file except in compliance +-with the License. You may obtain a copy of the License at +- +- http://www.apache.org/licenses/LICENSE-2.0 +- +-Unless required by applicable law or agreed to in writing, software +-distributed under the License is distributed on an "AS IS" BASIS, +-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-See the License for the specific language governing permissions and +-limitations under the License. +-""" ++#!/usr/bin/env python3 + + 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,11 +50,11 @@ + """ + try: + search_repo_url = self.url_repos_pub + "?name=" + name + "&type=" + component + "&status=" + status +- request = urllib2.Request(search_repo_url) ++ request = urllib.request.Request(search_repo_url) + base_64_string = base64.encodestring(usernamepassword).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)) ++ request.add_header("Authorization", "Basic {}".format(base_64_string)) + result = openurl(request, timeout=20) + response_code = result.getcode() + response = json.loads(result.read()) +@@ -83,12 +66,12 @@ + return None + else: + return None +- except urllib2.URLError, e: +- if isinstance(e, urllib2.HTTPError): +- raise Fail("Error getting {0} repository for component {1}. Http status code - {2}. \n {3}".format(name, component, e.code, e.read())) ++ except urllib.error.URLError as e: ++ if isinstance(e, urllib.error.HTTPError): ++ raise Fail("Error getting {} repository for component {}. Http status code - {}. \n {}".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: ++ raise Fail("Error getting {} repository for component {}. Reason - {}.".format(name, component, e.reason)) ++ 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 +83,8 @@ + 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}') + + +@@ -112,12 +95,12 @@ + while retryCount <= 5: + repo = self.get_repository_by_name_urllib2(repo_name, component, 'true', ambari_username_password_for_ranger) + if repo is not None: +- Logger.info('{0} Repository {1} exist'.format(component.title(), repo['name'])) ++ Logger.info('{} Repository {} exist'.format(component.title(), repo['name'])) + break + else: + response = self.create_repository_urllib2(repo_data, ambari_username_password_for_ranger) + if response is not None: +- Logger.info('{0} Repository created in Ranger admin'.format(component.title())) ++ Logger.info('{} Repository created in Ranger admin'.format(component.title())) + break + else: + if retryCount < 5: +@@ -125,7 +108,7 @@ + time.sleep(30) # delay for 30 seconds + retryCount += 1 + else: +- Logger.error('{0} Repository creation failed in Ranger admin'.format(component.title())) ++ Logger.error('{} Repository creation failed in Ranger admin'.format(component.title())) + break + else: + Logger.error('Ambari admin user creation failed') +@@ -140,19 +123,19 @@ + while retryCount <= 5: + response = self.get_repository_by_name_curl(component_user,component_user_keytab,component_user_principal,repo_name, component, 'true') + if response is not None: +- Logger.info('{0} Repository {1} exist'.format(component.title(), (response['name']))) ++ Logger.info('{} Repository {} exist'.format(component.title(), (response['name']))) + break + else: + response = self.create_repository_curl(component_user,component_user_keytab,component_user_principal,repo_name, repo_data,policy_user) + if response and len(response) > 0: +- Logger.info('{0} Repository created in Ranger admin'.format(component.title())) ++ Logger.info('{} Repository created in Ranger admin'.format(component.title())) + break + else: + if retryCount < 5: + time.sleep(30) # delay for 30 seconds + retryCount += 1 + else: +- Logger.error('{0} Repository creation failed in Ranger admin'.format(component.title())) ++ Logger.error('{} Repository creation failed in Ranger admin'.format(component.title())) + break + else: + Logger.error("Connection failed to Ranger Admin !") +@@ -166,13 +149,13 @@ + """ + try: + search_repo_url = self.url_repos_pub +- base_64_string = base64.encodestring('{0}'.format(usernamepassword)).replace('\n', '') ++ base_64_string = base64.encodestring('{}'.format(usernamepassword)).replace('\n', '') + headers = { + 'Accept': 'application/json', + "Content-Type": "application/json" + } +- request = urllib2.Request(search_repo_url, data, headers) +- request.add_header("Authorization", "Basic {0}".format(base_64_string)) ++ request = urllib.request.Request(search_repo_url, data, headers) ++ request.add_header("Authorization", "Basic {}".format(base_64_string)) + result = openurl(request, timeout=20) + response_code = result.getcode() + response = json.loads(json.JSONEncoder().encode(result.read())) +@@ -182,12 +165,12 @@ + return response + else: + raise Fail('Repository creation failed') +- except urllib2.URLError, e: +- if isinstance(e, urllib2.HTTPError): +- raise Fail("Error creating repository. Http status code - {0}. \n {1}".format(e.code, e.read())) ++ except urllib.error.URLError as e: ++ if isinstance(e, urllib.error.HTTPError): ++ raise Fail("Error creating repository. Http status code - {}. \n {}".format(e.code, e.read())) + else: +- raise Fail("Error creating repository. Reason - {0}.".format(e.reason)) +- except httplib.BadStatusLine: ++ raise Fail("Error creating repository. Reason - {}.".format(e.reason)) ++ 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 +186,12 @@ + response = openurl(url, timeout=20) + response_code = response.getcode() + return response_code +- except urllib2.URLError, e: +- if isinstance(e, urllib2.HTTPError): +- raise Fail("Connection failed to Ranger Admin. Http status code - {0}. \n {1}".format(e.code, e.read())) ++ except urllib.error.URLError as e: ++ if isinstance(e, urllib.error.HTTPError): ++ raise Fail("Connection failed to Ranger Admin. Http status code - {}. \n {}".format(e.code, e.read())) + else: +- raise Fail("Connection failed to Ranger Admin. Reason - {0}.".format(e.reason)) +- except httplib.BadStatusLine, e: ++ raise Fail("Connection failed to Ranger Admin. Reason - {}.".format(e.reason)) ++ 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") +@@ -222,16 +205,16 @@ + :return: Returns user credentials if user exist otherwise rerutns credentials of created user. + """ + flag_ambari_admin_present = False +- match = re.match('[a-zA-Z0-9_\S]+$', ambari_admin_password) ++ match = re.match(r'[a-zA-Z0-9_\S]+$', ambari_admin_password) + if match is None: + 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) ++ request = urllib.request.Request(url) + base_64_string = base64.encodestring(usernamepassword).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)) ++ request.add_header("Authorization", "Basic {}".format(base_64_string)) + result = openurl(request, timeout=20) + response_code = result.getcode() + response = json.loads(result.read()) +@@ -257,13 +240,13 @@ + 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.encodestring('{}'.format(usernamepassword)).replace('\n', '') + headers = { + 'Accept': 'application/json', + "Content-Type": "application/json" + } +- request = urllib2.Request(url, data, headers) +- request.add_header("Authorization", "Basic {0}".format(base_64_string)) ++ request = urllib.request.Request(url, data, headers) ++ request.add_header("Authorization", "Basic {}".format(base_64_string)) + result = openurl(request, timeout=20) + response_code = result.getcode() + response = json.loads(json.JSONEncoder().encode(result.read())) +@@ -275,12 +258,12 @@ + return None + else: + return None +- except urllib2.URLError, e: +- if isinstance(e, urllib2.HTTPError): +- raise Fail("Error creating ambari admin user. Http status code - {0}. \n {1}".format(e.code, e.read())) ++ except urllib.error.URLError as e: ++ if isinstance(e, urllib.error.HTTPError): ++ raise Fail("Error creating ambari admin user. Http status code - {}. \n {}".format(e.code, e.read())) + else: +- raise Fail("Error creating ambari admin user. Reason - {0}.".format(e.reason)) +- except httplib.BadStatusLine: ++ raise Fail("Error creating ambari admin user. Reason - {}.".format(e.reason)) ++ 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 +289,7 @@ + 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,bool=True): + """ + :param url: ranger admin host url + :param usernamepassword: user credentials using which repository needs to be searched. +@@ -316,8 +299,8 @@ + error_msg = '' + 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: ++ response,error_msg,time_millis = self.call_curl_request(component_user,component_user_keytab,component_user_principal,base_url,bool) ++ except Fail as fail: + raise Fail(fail.args) + + return response, error_msg,time_millis +@@ -337,7 +320,7 @@ + try: + search_repo_url = self.url_repos_pub + "?serviceName=" + name + "&serviceType=" + component + "&isEnabled=" + status + if is_keyadmin: +- search_repo_url = '{0}&suser=keyadmin'.format(search_repo_url) ++ search_repo_url = '{}&suser=keyadmin'.format(search_repo_url) + response,error_message,time_in_millis = self.call_curl_request(component_user,component_user_keytab,component_user_principal,search_repo_url,False,request_method='GET') + response_stripped = response[1:len(response) - 1] + if response_stripped and len(response_stripped) > 0: +@@ -348,8 +331,8 @@ + return None + else: + return None +- except Exception, err: +- raise Fail('Error in call for getting Ranger service:\n {0}'.format(err)) ++ except Exception as err: ++ raise Fail('Error in call for getting Ranger service:\n {}'.format(err)) + + @safe_retry(times=5, sleep_time=8, backoff_factor=1.5, err_class=Fail, return_on_fail=None) + def create_repository_curl(self, component_user, component_user_keytab, component_user_principal, name, data, policy_user, is_keyadmin = False): +@@ -364,7 +347,7 @@ + try: + search_repo_url = self.url_repos_pub + if is_keyadmin: +- search_repo_url = '{0}?suser=keyadmin'.format(search_repo_url) ++ search_repo_url = '{}?suser=keyadmin'.format(search_repo_url) + header = 'Content-Type: application/json' + method = 'POST' + +@@ -383,8 +366,8 @@ + else: + Logger.info('Repository creation failed') + return None +- except Exception, err: +- raise Fail('Error in call for creating Ranger service:\n {0}'.format(err)) ++ except Exception as err: ++ raise Fail('Error in call for creating Ranger service:\n {}'.format(err)) + + @safe_retry(times=5, sleep_time=8, backoff_factor=1.5, err_class=Fail, return_on_fail=None) + def update_repository_urllib2(self, component, repo_name, repo_properties, admin_user, admin_password, force_rename = False): +@@ -402,30 +385,30 @@ + 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.encodestring("{}".format(usernamepassword)).replace("\n", "") + headers = { + 'Accept': 'application/json', + 'Content-Type': 'application/json' + } +- request = urllib2.Request(update_repo_url, repo_update_data, headers) +- request.add_header("Authorization", "Basic {0}".format(base_64_string)) ++ request = urllib.request.Request(update_repo_url, repo_update_data, headers) ++ request.add_header("Authorization", "Basic {}".format(base_64_string)) + request.get_method = lambda: 'PUT' + result = openurl(request, timeout=20) + response_code = result.getcode() + response = json.loads(json.JSONEncoder().encode(result.read())) + + if response_code == 200: +- Logger.info("Service name {0} updated successfully on Ranger Admin for service {1}".format(repo_name, component)) ++ Logger.info("Service name {} updated successfully on Ranger Admin for service {}".format(repo_name, component)) + 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): +- 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: +- raise Fail("Ranger Admin is not reachable for updating service name {0} for service {1}".format(repo_name, component)) ++ raise Fail("Service name {} updation failed on Ranger Admin for service {}".format(repo_name, component)) ++ except urllib.error.URLError as e: ++ if isinstance(e, urllib.error.HTTPError): ++ raise Fail("Error updating service name {} on Ranger Admin for service {}. Http status code - {} \n {}".format(repo_name, component, e.code, e.read())) ++ else: ++ raise Fail("Error updating service name {} on Ranger Admin for service {}. Reason - {}".format(repo_name, component, e.reason)) ++ except http.client.BadStatusLine: ++ raise Fail("Ranger Admin is not reachable for updating service name {} for service {}".format(repo_name, component)) + except TimeoutError: + raise Fail("Connection to Ranger Admin failed. Reason - timeout") + +@@ -452,13 +435,13 @@ + if response and len(response) > 0: + response_json = json.loads(response) + if "name" in response_json: +- Logger.info("Service name {0} updated successfully on Ranger Admin for service {1}".format(repo_name, component)) ++ Logger.info("Service name {} updated successfully on Ranger Admin for service {}".format(repo_name, component)) + return response_json + else: +- Logger.info("Service name {0} updation failed on Ranger Admin for service {1}".format(repo_name, component)) ++ Logger.info("Service name {} updation failed on Ranger Admin for service {}".format(repo_name, component)) + return None + else: +- Logger.info("Service name {0} updation failed on Ranger Admin for service {1}".format(repo_name, component)) ++ Logger.info("Service name {} updation failed on Ranger Admin for service {}".format(repo_name, component)) + return None +- except Exception, err: +- raise Fail('Error updating service name {0} on Ranger Admin for service {1}.\n Reason - {2}'.format(repo_name, component, err)) ++ except Exception as err: ++ raise Fail('Error updating service name {} on Ranger Admin for service {}.\n Reason - {}'.format(repo_name, component, err)) +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/reload_windows_env.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/reload_windows_env.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/reload_windows_env.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/reload_windows_env.py 2022-07-11 00:52:28.000000000 +0800 +@@ -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", +@@ -43,7 +43,7 @@ + _key, _value, _ = EnumValue(key, index) + if (_key in keys_white_list): + os.environ[_key] = _value +- except WindowsError: ++ except OSError: + finish = True + index += 1 + CloseKey(key) +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/repository_util.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/repository_util.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/repository_util.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/repository_util.py 2022-07-11 00:52:28.000000000 +0800 +@@ -55,22 +55,22 @@ + + if 0 == len(self.command_repository.items): + Logger.warning( +- "Repository for {0}/{1} has no repositories. Ambari may not be managing this version.".format( ++ "Repository for {}/{} has no repositories. Ambari may not be managing this version.".format( + self.command_repository.stack_name, self.command_repository.version_string)) + return {} + + repo_files = {} + for repository in self.command_repository.items: + if repository.repo_id is None: +- raise Fail("Repository with url {0} has no id".format(repository.base_url)) ++ raise Fail("Repository with url {} has no id".format(repository.base_url)) + + if self.tags_to_skip & repository.tags: +- Logger.info("Repository with url {0} is not created due to its tags: {1}".format(repository.base_url, repository.tags)) ++ Logger.info("Repository with url {} is not created due to its tags: {}".format(repository.base_url, repository.tags)) + continue + + if not repository.ambari_managed: + Logger.warning( +- "Repository for {0}/{1}/{2} is not managed by Ambari".format( ++ "Repository for {}/{}/{} is not managed by Ambari".format( + self.command_repository.stack_name, self.command_repository.version_string, repository.repo_id)) + else: + Repository(repository.repo_id, +@@ -105,7 +105,7 @@ + return dictionary[key] + + +-class CommandRepositoryFeature(object): ++class CommandRepositoryFeature: + def __init__(self, feat_dict): + """ + :type feat_dict dict +@@ -114,7 +114,7 @@ + self.scoped = _find_value(feat_dict, "scoped", default=True) + + +-class CommandRepository(object): ++class CommandRepository: + """ + Class that encapsulates the representation of repositories passed in a command. This class + should match the CommandRepository class. +@@ -127,10 +127,10 @@ + + if isinstance(repo_object, dict): + json_dict = dict(repo_object) # strict dict(from ConfigDict) to avoid hidden type conversions +- elif isinstance(repo_object, basestring): ++ elif isinstance(repo_object, str): + json_dict = json.loads(repo_object) + else: +- raise Fail("Cannot deserialize command repository {0}".format(str(repo_object))) ++ raise Fail("Cannot deserialize command repository {}".format(str(repo_object))) + + # version_id is the primary id of the repo_version table in the database + self.version_id = _find_value(json_dict, 'repoVersionId') +@@ -149,7 +149,7 @@ + self.items.append(CommandRepositoryItem(self, repo_def)) + + +-class CommandRepositoryItem(object): ++class CommandRepositoryItem: + """ + Class that represents the entries of a CommandRepository. This isn't meant to be instantiated + outside a CommandRepository +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/repo_version_history.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/repo_version_history.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/repo_version_history.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/repo_version_history.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + """ + actual_version = None + if os.path.isfile(REPO_VERSION_HISTORY_FILE): +- with open(REPO_VERSION_HISTORY_FILE, "r") as f: ++ with open(REPO_VERSION_HISTORY_FILE) as f: + for line in reversed(f.readlines()): + line_parts = line.split(",") + if line_parts and len(line_parts) == 2 and line_parts[0] == repository_version: +@@ -79,7 +79,7 @@ + key_exists = False + try: + if os.path.isfile(REPO_VERSION_HISTORY_FILE): +- with open(REPO_VERSION_HISTORY_FILE, "r") as f: ++ with open(REPO_VERSION_HISTORY_FILE) as f: + for line in f.readlines(): + line_parts = line.split(",") + if line_parts and len(line_parts) == 2 and line_parts[0] == repository_version and line_parts[1] == actual_version: +@@ -91,8 +91,8 @@ + f.write(repository_version + "," + actual_version + "\n") + 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: +- Logger.error("Failed to write to file {0} the value: {1}. Error: {2}".format(REPO_VERSION_HISTORY_FILE, value, str(err))) ++ Logger.info("Appended value \"{}\" to file {} to track this as a new version.".format(value, REPO_VERSION_HISTORY_FILE)) ++ except Exception as err: ++ Logger.error("Failed to write to file {} the value: {}. Error: {}".format(REPO_VERSION_HISTORY_FILE, value, str(err))) + + return wrote_value +\ 文件尾没有换行符 +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/security_commons.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/security_commons.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/security_commons.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/security_commons.py 2022-07-11 00:52:28.000000000 +0800 +@@ -51,16 +51,16 @@ + 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 + config_copy = config.copy() + # overwrite the provider path with the path specified + if use_local_jceks: +- config_copy[HADOOP_CREDENTIAL_PROVIDER_PROPERTY_NAME] = 'localjceks://file{0}'.format(dest_provider_path) ++ config_copy[HADOOP_CREDENTIAL_PROVIDER_PROPERTY_NAME] = 'localjceks://file{}'.format(dest_provider_path) + else: +- config_copy[HADOOP_CREDENTIAL_PROVIDER_PROPERTY_NAME] = 'jceks://file{0}'.format(dest_provider_path) ++ config_copy[HADOOP_CREDENTIAL_PROVIDER_PROPERTY_NAME] = 'jceks://file{}'.format(dest_provider_path) + return config_copy + return config + +@@ -78,7 +78,7 @@ + + issues = {} + +- for config_file, rule_sets in configuration_rules.iteritems(): ++ for config_file, rule_sets in list(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 @@ + # 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 list(rules.items()): + actual_value = get_value(actual_values, property_name, '') + if actual_value != expected_value: + issues[config_file] = "Property %s contains an unexpected value. " \ +@@ -120,7 +120,7 @@ + if not actual_value: + issues[config_file] = "Property %s does not exist" % property_name + elif not os.path.isfile(actual_value): +- issues[config_file] = "Property %s points to an inaccessible file - %s" % (property_name, actual_value) ++ issues[config_file] = "Property {} points to an inaccessible file - {}".format(property_name, actual_value) + except Exception as e: + issues[config_file] = "Exception occurred while validating the config file\nCauses: %s" % str(e) + return issues +@@ -156,10 +156,10 @@ + """ + 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 list(config_files.items()): + file_name, file_ext = os.path.splitext(config_file) + + config_filepath = conf_dir + os.sep + config_file +@@ -176,10 +176,10 @@ + result[config_file_id].update({prop[0].text: prop[1].text}) + + elif file_type == FILE_TYPE_PROPERTIES: +- with open(config_filepath, 'r') as f: ++ with open(config_filepath) 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] = {} +@@ -187,12 +187,12 @@ + result[file_name].update({key : value}) + + elif file_type == FILE_TYPE_JAAS_CONF: +- section_header = re.compile('^(\w+)\s+\{\s*$') +- section_data = re.compile('^\s*([^ \s\=\}\{]+)\s*=?\s*"?([^ ";]+)"?;?\s*$') +- section_footer = re.compile('^\}\s*;?\s*$') ++ section_header = re.compile(r'^(\w+)\s+\{\s*$') ++ section_data = re.compile(r'^\s*([^ \s\=\}\{]+)\s*=?\s*"?([^ ";]+)"?;?\s*$') ++ section_footer = re.compile(r'^\}\s*;?\s*$') + section_name = "root" + result[file_name] = {} +- with open(config_filepath, 'r') as f: ++ with open(config_filepath) as f: + for line in f: + if line: + line = line.strip() +@@ -219,7 +219,7 @@ + Main cached kinit executor - Uses a temporary file on the FS to cache executions. Each command + will have its own file and only one entry (last successful execution) will be stored + """ +- key = str(hash("%s|%s" % (principal, keytab_file))) ++ key = str(hash("{}|{}".format(principal, keytab_file))) + filename = key + "_tmp.txt" + file_path = temp_dir + os.sep + "kinit_executor_cache" + output = None +@@ -235,7 +235,7 @@ + with open(file_path, 'w+') as new_file: + new_file.write("{}") + try: +- with open(file_path, 'r') as cache_file: ++ with open(file_path) as cache_file: + output = json.load(cache_file) + except: + # In the extraordinary case the temporary file gets corrupted the cache should be reset to avoid error loop +@@ -265,7 +265,7 @@ + + 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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/setup_atlas_hook.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/setup_atlas_hook.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/setup_atlas_hook.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/setup_atlas_hook.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + """ + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file +@@ -65,8 +65,7 @@ + If they want to overwrite shared_atlas_hook_prop_d just for Hive, they can add it to hive-atlas-application.properties + ''' + +-SHARED_ATLAS_HOOK_CONFIGS = set( +- [ ++SHARED_ATLAS_HOOK_CONFIGS = { + "atlas.kafka.zookeeper.connect", + "atlas.kafka.bootstrap.servers", + "atlas.kafka.zookeeper.session.timeout.ms", +@@ -88,15 +87,12 @@ + "atlas.kafka.security.protocol", + "atlas.jaas.KafkaClient.loginModuleName", + "atlas.jaas.KafkaClient.loginModuleControlFlag" +- ] +-) ++} + +-SHARED_ATLAS_HOOK_SECURITY_CONFIGS_FOR_NON_CLIENT_SERVICE = set( +- [ ++SHARED_ATLAS_HOOK_SECURITY_CONFIGS_FOR_NON_CLIENT_SERVICE = { + "atlas.jaas.KafkaClient.option.useKeyTab", + "atlas.jaas.KafkaClient.option.storeKey" +- ] +-) ++} + + NON_CLIENT_SERVICES = [SERVICE.HIVE, SERVICE.STORM, SERVICE.FALCON, SERVICE.HBASE] + +@@ -140,7 +136,7 @@ + properties = merged_props, + owner = owner, + group = group, +- mode = 0644) ++ mode = 0o644) + + + def setup_atlas_jar_symlinks(hook_name, jar_source_dir): +@@ -180,7 +176,7 @@ + if os.path.isfile(atlas_hook_file_name): + Link(source_lib_file_name, to=atlas_hook_file_name) + else: +- Logger.info("Atlas hook directory path {0} doesn't exist".format(atlas_hook_dir)) ++ Logger.info("Atlas hook directory path {} doesn't exist".format(atlas_hook_dir)) + + def install_atlas_hook_packages(atlas_plugin_package, atlas_ubuntu_plugin_package, host_sys_prepped, + agent_stack_retry_on_unavailability, agent_stack_retry_count): +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/setup_ranger_plugin.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/setup_ranger_plugin.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/setup_ranger_plugin.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/setup_ranger_plugin.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + + 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 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/setup_ranger_plugin_xml.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/setup_ranger_plugin_xml.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/setup_ranger_plugin_xml.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/setup_ranger_plugin_xml.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + + 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 @@ + 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 @@ + 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 @@ + 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 @@ + 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 @@ + 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 @@ + 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 @@ + 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 @@ + 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 @@ + 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 @@ + configuration_attributes = configuration_attributes, + owner = component_user, + group = component_group, +- mode = 0644, ++ mode = 0o644, + xml_include_file = xml_include_file + ) + +@@ -296,7 +296,7 @@ + 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 list(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 +@@ -313,11 +313,11 @@ + with open(policycache_json_file) as json_file: + json_data = json.load(json_file) + if 'serviceName' in json_data and json_data['serviceName'] == repo_name: +- Logger.info("Skipping Ranger API calls, as policy cache file exists for {0}".format(service_name)) +- 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)) ++ Logger.info("Skipping Ranger API calls, as policy cache file exists for {}".format(service_name)) ++ Logger.warning("If service name for {} is not created on Ranger Admin, then to re-create it delete policy cache file: {}".format(service_name, policycache_json_file)) + service_name_exist_flag = True + break +- except Exception, err: +- Logger.error("Error occurred while fetching service name from policy cache file.\nError: {0}".format(err)) ++ except Exception as err: ++ Logger.error("Error occurred while fetching service name from policy cache file.\nError: {}".format(err)) + + return service_name_exist_flag +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/show_logs.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/show_logs.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/show_logs.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/show_logs.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + Don't forget to call "raise" after using the function or else the original exception will be masked. + """ + +- Execute(format("find {log_dir} -maxdepth 1 -type f -name '{mask}' -exec echo '==> {{}} <==' \; -exec tail -n {lines_count} {{}} \;"), ++ Execute(format(r"find {log_dir} -maxdepth 1 -type f -name '{mask}' -exec echo '==> {{}} <==' \; -exec tail -n {lines_count} {{}} \;"), + logoutput = True, + ignore_failures = True, # if this fails should not overwrite the actual exception + user = user, # need to have permissions to read log files +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/simulate_perf_cluster_alert_behaviour.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/simulate_perf_cluster_alert_behaviour.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/simulate_perf_cluster_alert_behaviour.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/simulate_perf_cluster_alert_behaviour.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + """ + Licensed to the Apache Software Foundation (ASF) under one +@@ -81,8 +81,8 @@ + alert_timeout_secs = configurations[alert_timeout_secs_key] + + 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) ++ logger.info("Sleeping for {} seconds".format(alert_timeout_secs)) ++ print(("Sleeping for {} 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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/solr_cloud_util.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/solr_cloud_util.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/solr_cloud_util.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/solr_cloud_util.py 2022-07-11 00:52:28.000000000 +0800 +@@ -49,9 +49,9 @@ + return solr_cli_prefix + + def __append_flags_if_exists(command, flagsDict): +- for key, value in flagsDict.iteritems(): ++ for key, value in list(flagsDict.items()): + if value is not None: +- command+= " %s %s" % (key, value) ++ command+= " {} {}".format(key, value) + return command + + def upload_configuration_to_zk(zookeeper_quorum, solr_znode, config_set, config_set_dir, tmp_dir, +@@ -215,7 +215,7 @@ + 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: +@@ -233,19 +233,19 @@ + 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: +@@ -264,15 +264,15 @@ + + 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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/stack_features.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/stack_features.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/stack_features.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/stack_features.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + data = json.loads(stack_features_config) + + if stack_name not in data: +- Logger.warning("Cannot find stack features for the stack named {0}".format(stack_name)) ++ Logger.warning("Cannot find stack features for the stack named {}".format(stack_name)) + return False + + data = data[stack_name] +@@ -119,7 +119,7 @@ + # if this is not an upgrade, then we take the simple path + if upgrade_direction is None: + Logger.info( +- "Stack Feature Version Info: Cluster Stack={0}, Command Stack={1}, Command Version={2} -> {3}".format( ++ "Stack Feature Version Info: Cluster Stack={}, Command Stack={}, Command Version={} -> {}".format( + stack_version, command_stack, command_version, version_for_stack_feature_checks)) + + return version_for_stack_feature_checks +@@ -129,7 +129,7 @@ + is_stop_command = _is_stop_command(config) + if not is_stop_command: + Logger.info( +- "Stack Feature Version Info: Cluster Stack={0}, Command Stack={1}, Command Version={2}, Upgrade Direction={3} -> {4}".format( ++ "Stack Feature Version Info: Cluster Stack={}, Command Stack={}, Command Version={}, Upgrade Direction={} -> {}".format( + stack_version, command_stack, command_version, upgrade_direction, + version_for_stack_feature_checks)) + +@@ -145,7 +145,7 @@ + version_for_stack_feature_checks = command_version if command_version is not None else stack_version + + Logger.info( +- "Stack Feature Version Info: Cluster Stack={0}, Command Stack={1}, Command Version={2}, Upgrade Direction={3}, stop_command={4} -> {5}".format( ++ "Stack Feature Version Info: Cluster Stack={}, Command Stack={}, Command Version={}, Upgrade Direction={}, stop_command={} -> {}".format( + stack_version, command_stack, command_version, upgrade_direction, + is_stop_command, version_for_stack_feature_checks)) + +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/stack_select.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/stack_select.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/stack_select.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/stack_select.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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' + +@@ -144,7 +145,7 @@ + code, stdout = shell.call(command, sudo = True, quiet = True) + + if code != 0 or stdout is None: +- raise Fail("Unable to query for supported packages using {0}".format(stack_selector_path)) ++ raise Fail("Unable to query for supported packages using {}".format(stack_selector_path)) + + # turn the output into lines, stripping each line + return [line.strip() for line in stdout.splitlines()] +@@ -164,7 +165,7 @@ + from resource_management.libraries.functions.default import default + + if scope not in _PACKAGE_SCOPES: +- raise Fail("The specified scope of {0} is not valid".format(scope)) ++ raise Fail("The specified scope of {} is not valid".format(scope)) + + config = Script.get_config() + +@@ -188,13 +189,13 @@ + + if stack_name not in data: + raise Fail( +- "Cannot find stack-select packages for the {0} stack".format(stack_name)) ++ "Cannot find stack-select packages for the {} stack".format(stack_name)) + + stack_select_key = "stack-select" + data = data[stack_name] + if stack_select_key not in data: + raise Fail( +- "There are no stack-select packages defined for this command for the {0} stack".format(stack_name)) ++ "There are no stack-select packages defined for this command for the {} stack".format(stack_name)) + + # this should now be the dictionary of role name to package name + data = data[stack_select_key] +@@ -202,13 +203,13 @@ + component_name = component_name.upper() + + if service_name not in data: +- Logger.info("Skipping stack-select on {0} because it does not exist in the stack-select package structure.".format(service_name)) ++ Logger.info("Skipping stack-select on {} because it does not exist in the stack-select package structure.".format(service_name)) + return None + + data = data[service_name] + + if component_name not in data: +- Logger.info("Skipping stack-select on {0} because it does not exist in the stack-select package structure.".format(component_name)) ++ Logger.info("Skipping stack-select on {} because it does not exist in the stack-select package structure.".format(component_name)) + return None + + # this one scope is not an array, so transform it into one for now so we can +@@ -226,12 +227,12 @@ + if _PACKAGE_SCOPE_LEGACY in data[component_name]: + legacy_package = data[component_name][_PACKAGE_SCOPE_LEGACY] + Logger.info( +- "The package {0} is not supported by this version of the stack-select tool, defaulting to the legacy package of {1}".format(package, legacy_package)) ++ "The package {} is not supported by this version of the stack-select tool, defaulting to the legacy package of {}".format(package, legacy_package)) + + # use the legacy package + packages[index] = legacy_package + else: +- raise Fail("The package {0} is not supported by this version of the stack-select tool.".format(package)) ++ raise Fail("The package {} is not supported by this version of the stack-select tool.".format(package)) + + # transform the array bcak to a single element + if scope == PACKAGE_SCOPE_STACK_SELECT: +@@ -255,7 +256,7 @@ + Logger.error(format("Unable to execute {stack_selector_name} after installing because there was no version specified")) + return + +- Logger.info("Executing {0} set all on {1}".format(stack_selector_name, version_to_select)) ++ Logger.info("Executing {} set all on {}".format(stack_selector_name, version_to_select)) + + command = format('{sudo} {stack_selector_path} set all `ambari-python-wrap {stack_selector_path} versions | grep ^{version_to_select} | tail -1`') + only_if_command = format('ls -d {stack_root}/{version_to_select}*') +@@ -287,7 +288,7 @@ + if stack_select_packages is None: + return + +- Logger.info("The following packages will be stack-selected to version {0} using a {1} orchestration and {2} scope: {3}".format( ++ Logger.info("The following packages will be stack-selected to version {} using a {} orchestration and {} scope: {}".format( + version, orchestration.upper(), package_scope, ", ".join(stack_select_packages))) + + for stack_select_package_name in stack_select_packages: +@@ -320,8 +321,8 @@ + for moduleName in param_modules: + if moduleName in modules: + module = modules.get(moduleName) +- reload(module) +- Logger.info("After {0}, reloaded module {1}".format(command, moduleName)) ++ importlib.reload(module) ++ Logger.info("After {}, reloaded module {}".format(command, moduleName)) + + + def get_role_component_current_stack_version(): +@@ -333,7 +334,7 @@ + role_command = default("/roleCommand", "") + + stack_selector_name = stack_tools.get_stack_tool_name(stack_tools.STACK_SELECTOR_NAME) +- Logger.info("Checking version for {0} via {1}".format(role, stack_selector_name)) ++ Logger.info("Checking version for {} via {}".format(role, stack_selector_name)) + if role_command == "SERVICE_CHECK" and role in SERVICE_CHECK_DIRECTORY_MAP: + stack_select_component = SERVICE_CHECK_DIRECTORY_MAP[role] + else: +@@ -343,16 +344,16 @@ + if not role: + Logger.error("No role information available.") + elif not role.lower().endswith("client"): +- Logger.error("Mapping unavailable for role {0}. Skip checking its version.".format(role)) ++ Logger.error("Mapping unavailable for role {}. Skip checking its version.".format(role)) + return None + + current_stack_version = get_stack_version(stack_select_component) + + if current_stack_version is None: +- Logger.warning("Unable to determine {0} version for {1}".format( ++ Logger.warning("Unable to determine {} version for {}".format( + stack_selector_name, stack_select_component)) + else: +- Logger.info("{0} is currently at version {1}".format( ++ Logger.info("{} is currently at version {}".format( + stack_select_component, current_stack_version)) + + return current_stack_version +@@ -370,7 +371,7 @@ + stack_version = Script.get_stack_version() + + if not target in HADOOP_DIR_DEFAULTS: +- raise Fail("Target {0} not defined".format(target)) ++ raise Fail("Target {} not defined".format(target)) + + hadoop_dir = HADOOP_DIR_DEFAULTS[target] + +@@ -405,7 +406,7 @@ + + stack_root = Script.get_stack_root() + if not target in HADOOP_DIR_DEFAULTS: +- raise Fail("Target {0} not defined".format(target)) ++ raise Fail("Target {} not defined".format(target)) + + # home uses a different template + if target == "home": +@@ -479,7 +480,7 @@ + stack_version = os.path.basename(os.path.dirname(os.readlink(component_dir))) + match = re.match('[0-9]+.[0-9]+.[0-9]+.[0-9]+-[0-9]+', stack_version) + if match is None: +- Logger.info('Failed to get extracted version with {0} in method get_stack_version_before_install'.format(stack_selector_name)) ++ Logger.info('Failed to get extracted version with {} in method get_stack_version_before_install'.format(stack_selector_name)) + return None # lazy fail + return stack_version + else: +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/stack_tools.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/stack_tools.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/stack_tools.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/stack_tools.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +@@ -56,14 +56,14 @@ + return None, None, None + + if stack_name not in stack_tools: +- Logger.warning("Cannot find stack tools for the stack named {0}".format(stack_name)) ++ Logger.warning("Cannot find stack tools for the stack named {}".format(stack_name)) + return None, None, None + + # load the stack tooks keyed by the stack name + stack_tools = stack_tools[stack_name] + + if not stack_tools or not name or name.lower() not in stack_tools: +- Logger.warning("Cannot find config for {0} stack tool in {1}".format(str(name), str(stack_tools))) ++ Logger.warning("Cannot find config for {} stack tool in {}".format(str(name), str(stack_tools))) + return None, None, None + + tool_config = stack_tools[name.lower()] +@@ -111,13 +111,13 @@ + from resource_management.libraries.functions.default import default + + if stack_root_json is None: +- return "/usr/{0}".format(stack_name.lower()) ++ return "/usr/{}".format(stack_name.lower()) + + stack_root = json.loads(stack_root_json) + + if stack_name not in stack_root: +- Logger.warning("Cannot determine stack root for stack named {0}".format(stack_name)) +- return "/usr/{0}".format(stack_name.lower()) ++ Logger.warning("Cannot determine stack root for stack named {}".format(stack_name)) ++ return "/usr/{}".format(stack_name.lower()) + + return stack_root[stack_name] + +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/substitute_vars.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/substitute_vars.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/substitute_vars.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/substitute_vars.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + """ + result = raw + +- pattern = re.compile("\$\{[^\}\$\x0020]+\}") ++ pattern = re.compile("\\$\\{[^\\}\\$\x0020]+\\}") + + for depth in range(0, _MAX_SUBST - 1): + match = pattern.search(result) +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/tar_archive.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/tar_archive.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/tar_archive.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/tar_archive.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/upgrade_summary.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/upgrade_summary.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/upgrade_summary.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/upgrade_summary.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + 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 list(service_summary.items()): + service_summary = UpgradeServiceSummary(service_name = service_name, + source_stack = service_summary_json["sourceStackId"], + source_version = service_summary_json["sourceVersion"], +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/validate.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/validate.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/validate.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/validate.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/version.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/version.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/version.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/version.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/version_select_util.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/version_select_util.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/version_select_util.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/version_select_util.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + """ + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file +@@ -48,23 +48,23 @@ + if stack_selector_name and stack_selector_path and os.path.exists(stack_selector_path): + tmpfile = tempfile.NamedTemporaryFile(delete=True) + out, code = None, -1 +- get_stack_comp_version_cmd = '%s status %s > %s' % (stack_selector_path, component_name, tmpfile.name) ++ get_stack_comp_version_cmd = '{} status {} > {}'.format(stack_selector_path, component_name, tmpfile.name) + + try: + # This is necessary because Ubuntu returns "stdin: is not a tty", see AMBARI-8088 + # ToDo: original problem looks strange +- with open(tmpfile.name, 'r') as f: ++ with open(tmpfile.name) as f: + code = shell.call(get_stack_comp_version_cmd, quiet=True)[0] + out = f.read() + + if code != 0 or out is None: + raise ValueError("Code is nonzero or output is empty") + +- Logger.debug("Command: %s\nOutput: %s" % (get_stack_comp_version_cmd, str(out))) ++ Logger.debug("Command: {}\nOutput: {}".format(get_stack_comp_version_cmd, str(out))) + 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: ++ Logger.debug("Version for component {}: {}".format(component_name, str(version))) ++ 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: +@@ -97,18 +97,18 @@ + get_stack_comp_version_cmd = "" + try: + # This is necessary because Ubuntu returns "stdin: is not a tty", see AMBARI-8088 +- with open(tmpfile.name, 'r') as file: +- get_stack_comp_version_cmd = '{0} status {1} > {2}' .format(stack_selector_path, component_name, tmpfile.name) ++ with open(tmpfile.name) as file: ++ get_stack_comp_version_cmd = '{} status {} > {}' .format(stack_selector_path, component_name, tmpfile.name) + code, stdoutdata = shell.call(get_stack_comp_version_cmd, quiet=True) + out = file.read() + + if code != 0 or out is None: + raise Exception("Code is nonzero or output is empty") + +- Logger.debug("Command: %s\nOutput: %s" % (get_stack_comp_version_cmd, str(out))) ++ Logger.debug("Command: {}\nOutput: {}".format(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 +@@ -126,5 +126,5 @@ + return [] + + installed_stack_versions = [f for f in os.listdir(stack_root) if os.path.isdir(os.path.join(stack_root, f)) +- and re.match("([\d\.]+(-\d+)?)", f)] ++ and re.match(r"([\d\.]+(-\d+)?)", f)] + return installed_stack_versions +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/zip_archive.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/zip_archive.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/functions/zip_archive.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/functions/zip_archive.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/__init__.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/__init__.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/__init__.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/__init__.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/providers/execute_hadoop.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/providers/execute_hadoop.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/providers/execute_hadoop.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/providers/execute_hadoop.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/providers/execute_hdfs.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/providers/execute_hdfs.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/providers/execute_hdfs.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/providers/execute_hdfs.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/providers/hdfs_resource.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/providers/hdfs_resource.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/providers/hdfs_resource.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/providers/hdfs_resource.py 2022-07-11 00:52:28.000000000 +0800 +@@ -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 +@@ -105,7 +105,7 @@ + except namenode_ha_utils.NoActiveNamenodeException as ex: + # one of ns can be down (during initial start forexample) no need to worry for federated cluster + if len(nameservices) > 1: +- Logger.exception("Cannot run HdfsResource for nameservice {0}. Due to no active namenode present".format(nameservice)) ++ Logger.exception("Cannot run HdfsResource for nameservice {}. Due to no active namenode present".format(nameservice)) + else: + raise + +@@ -116,7 +116,7 @@ + env.config['hdfs_files'] = [] + + # 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: +@@ -176,7 +176,7 @@ + class WebHDFSCallException(Fail): + def __init__(self, message, result_message): + self.result_message = result_message +- super(WebHDFSCallException, self).__init__(message) ++ super().__init__(message) + + def get_exception_name(self): + if isinstance(self.result_message, dict) and "RemoteException" in self.result_message and "exception" in self.result_message["RemoteException"]: +@@ -227,7 +227,7 @@ + raise + + while True: +- Logger.info("Retrying after {0} seconds. Reason: {1}".format(try_sleep, str(last_exception))) ++ Logger.info("Retrying after {} seconds. Reason: {}".format(try_sleep, str(last_exception))) + try_count -= 1 + time.sleep(try_sleep) + +@@ -256,7 +256,7 @@ + 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] +@@ -291,7 +291,7 @@ + if status_code not in WebHDFSUtil.valid_status_codes+ignore_status_codes or assertable_result and result_dict and not result_dict['boolean']: + formatted_output = json.dumps(result_dict, indent=2) if isinstance(result_dict, dict) else result_dict + formatted_output = err + "\n" + formatted_output +- err_msg = "Execution of '%s' returned status_code=%s. %s" % (shell.string_cmd_from_args_list(cmd), status_code, formatted_output) ++ err_msg = "Execution of '{}' returned status_code={}. {}".format(shell.string_cmd_from_args_list(cmd), status_code, formatted_output) + raise WebHDFSCallException(err_msg, result_dict) + + return result_dict +@@ -378,7 +378,7 @@ + except namenode_ha_utils.NoActiveNamenodeException as ex: + # one of ns can be down (during initial start forexample) no need to worry for federated cluster + if len(nameservices) > 1: +- Logger.exception("Cannot run HdfsResource for nameservice {0}. Due to no active namenode present".format(nameservice)) ++ Logger.exception("Cannot run HdfsResource for nameservice {}. Due to no active namenode present".format(nameservice)) + else: + raise + +@@ -612,7 +612,7 @@ + + class HdfsResourceProvider(Provider): + def __init__(self, resource): +- super(HdfsResourceProvider,self).__init__(resource) ++ super().__init__(resource) + + self.assert_parameter_is_set('dfs_type') + self.fsType = getattr(resource, 'dfs_type') +@@ -668,7 +668,7 @@ + self.manage_if_exists = not parsed_path in parsed_not_managed_paths + + if parsed_path in self.ignored_resources_list: +- Logger.info("Skipping '{0}' because it is in ignore file {1}.".format(self.resource, self.resource.hdfs_resource_ignore_file)) ++ Logger.info("Skipping '{}' because it is in ignore file {}.".format(self.resource, self.resource.hdfs_resource_ignore_file)) + return + + self.get_hdfs_resource_executor().action_delayed(action_name, self) +@@ -693,7 +693,7 @@ + + def assert_parameter_is_set(self, parameter_name): + if not getattr(self.resource, parameter_name): +- raise Fail("Resource parameter '{0}' is not set.".format(parameter_name)) ++ raise Fail("Resource parameter '{}' is not set.".format(parameter_name)) + return True + + def kinit(self): +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/providers/__init__.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/providers/__init__.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/providers/__init__.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/providers/__init__.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/providers/modify_properties_file.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/providers/modify_properties_file.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/providers/modify_properties_file.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/providers/modify_properties_file.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + 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 = "" + +@@ -53,18 +53,18 @@ + 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] = "{}{}{}".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 = "{}{}{}".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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/providers/monitor_webserver.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/providers/monitor_webserver.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/providers/monitor_webserver.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/providers/monitor_webserver.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/providers/msi.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/providers/msi.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/providers/msi.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/providers/msi.py 2022-07-11 00:52:28.000000000 +0800 +@@ -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 @@ + + # 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 @@ + + # 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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/providers/properties_file.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/providers/properties_file.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/providers/properties_file.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/providers/properties_file.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/providers/repository.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/providers/repository.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/providers/repository.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/providers/repository.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 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, +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/providers/template_config.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/providers/template_config.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/providers/template_config.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/providers/template_config.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/providers/xml_config.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/providers/xml_config.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/providers/xml_config.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/providers/xml_config.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + """ + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file +@@ -62,7 +62,7 @@ + configuration_attrs=configuration_attrs, xml_include_file=self.resource.xml_include_file) + + xml_config_dest_file_path = os.path.join(xml_config_provider_config_dir, filename) +- Logger.info("Generating config: {0}".format(xml_config_dest_file_path)) ++ Logger.info("Generating config: {}".format(xml_config_dest_file_path)) + + File (xml_config_dest_file_path, + content = config_content, +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/resources/execute_hadoop.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/resources/execute_hadoop.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/resources/execute_hadoop.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/resources/execute_hadoop.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/resources/execute_hdfs.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/resources/execute_hdfs.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/resources/execute_hdfs.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/resources/execute_hdfs.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/resources/__init__.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/resources/__init__.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/resources/__init__.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/resources/__init__.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/resources/modify_properties_file.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/resources/modify_properties_file.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/resources/modify_properties_file.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/resources/modify_properties_file.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/resources/monitor_webserver.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/resources/monitor_webserver.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/resources/monitor_webserver.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/resources/monitor_webserver.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/resources/properties_file.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/resources/properties_file.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/resources/properties_file.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/resources/properties_file.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/resources/repository.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/resources/repository.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/resources/repository.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/resources/repository.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/resources/template_config.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/resources/template_config.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/resources/template_config.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/resources/template_config.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/resources/xml_config.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/resources/xml_config.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/resources/xml_config.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/resources/xml_config.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/script/config_dictionary.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/script/config_dictionary.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/script/config_dictionary.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/script/config_dictionary.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +@@ -34,11 +34,11 @@ + """ + Recursively turn dict to ConfigDictionary + """ +- for k, v in dictionary.iteritems(): ++ for k, v in list(dictionary.items()): + if isinstance(v, dict): + dictionary[k] = ConfigDictionary(v) + +- super(ConfigDictionary, self).__init__(dictionary) ++ super().__init__(dictionary) + + def __setitem__(self, name, value): + raise Fail(IMMUTABLE_MESSAGE) +@@ -49,7 +49,7 @@ + - enable lazy failure for unknown configs. + """ + try: +- value = super(ConfigDictionary, self).__getitem__(name) ++ value = super().__getitem__(name) + except KeyError: + return UnknownConfiguration(name) + +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/script/dummy.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/script/dummy.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/script/dummy.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/script/dummy.py 2022-07-11 00:52:28.000000000 +0800 +@@ -62,19 +62,19 @@ + if "role" in self.config: + self.component_name = self.config["role"] + +- self.pid_file = "/var/run/%s/%s.pid" % (self.host_name, self.component_name) ++ self.pid_file = "/var/run/{}/{}.pid".format(self.host_name, self.component_name) + self.user = "root" + 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() +- """ ++ r""" + component_name = self.get_component_name() + repo_info = str(default("/hostLevelParams/repoInfo", "1.1.1.1-1")) + matches = re.findall(r"([\d\.]+\-\d+)", repo_info) +@@ -91,28 +91,28 @@ + """ + + 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) +- Execute("%s -kt %s %s" % (kinit_path_local, keytab_path_replaced, principal_replaced), ++ Execute("{} -kt {} {}".format(kinit_path_local, keytab_path_replaced, principal_replaced), + 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 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 +- Execute("%s rm -rf %s" % (self.sudo, self.pid_file)) ++ print(("Deleting pid file: %s" % self.pid_file)) ++ Execute("{} rm -rf {}".format(self.sudo, self.pid_file)) + + def status(self, env): +- print "Status" ++ print("Status") + self.prepare() + + if not os.path.isfile(self.pid_file): +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/script/hook.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/script/hook.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/script/hook.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/script/hook.py 2022-07-11 00:52:28.000000000 +0800 +@@ -37,7 +37,7 @@ + """ + Changes logics of resolving method name + """ +- return super(Hook, self).choose_method_to_execute(self.HOOK_METHOD_NAME) ++ return super().choose_method_to_execute(self.HOOK_METHOD_NAME) + + def run_custom_hook(self, command): + """ +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/script/__init__.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/script/__init__.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/script/__init__.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/script/__init__.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/script/script.py apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/script/script.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/resource_management/libraries/script/script.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/resource_management/libraries/script/script.py 2022-07-11 00:52:28.000000000 +0800 +@@ -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 @@ + 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: +@@ -104,7 +104,7 @@ + def get_config_lock_file(): + return os.path.join(Script.get_tmp_dir(), "link_configs_lock_file") + +-class Script(object): ++class Script: + instance = None + + """ +@@ -137,7 +137,7 @@ + Script.structuredOut = {} + if os.path.exists(self.stroutfile): + if os.path.getsize(self.stroutfile) > 0: +- with open(self.stroutfile, 'r') as fp: ++ with open(self.stroutfile) as fp: + try: + Script.structuredOut = json.load(fp) + except Exception: +@@ -159,7 +159,7 @@ + try: + with open(self.stroutfile, 'w') as fp: + json.dump(Script.structuredOut, fp) +- except IOError, err: ++ except OSError as err: + Script.structuredOut.update({"errMsg" : "Unable to write to " + self.stroutfile}) + + +@@ -214,7 +214,7 @@ + # this is needed in cases where an existing symlink is on the system and stack-select can't + # change it on installation (because it's scared to in order to support parallel installs) + if is_install_command and repository_resolved and repository_version is not None: +- Logger.info("The repository with version {0} for this command has been marked as resolved."\ ++ Logger.info("The repository with version {} for this command has been marked as resolved."\ + " It will be used to report the version of the component which was installed".format(repository_version)) + + component_version = repository_version +@@ -233,8 +233,8 @@ + output, code, versions = stack_select.unsafe_get_stack_versions() + if len(versions) == 1: + component_version = versions[0] +- Logger.error("The '{0}' component did not advertise a version. This may indicate a problem with the component packaging. " \ +- "However, the stack-select tool was able to report a single version installed ({1}). " \ ++ Logger.error("The '{}' component did not advertise a version. This may indicate a problem with the component packaging. " \ ++ "However, the stack-select tool was able to report a single version installed ({}). " \ + "This is the version that will be reported.".format(stack_select_package_name, component_version)) + + if component_version: +@@ -247,7 +247,7 @@ + self.put_structured_out({"repository_version_id": repo_version_id}) + else: + if not self.is_hook(): +- Logger.error("The '{0}' component did not advertise a version. This may indicate a problem with the component packaging.".format(stack_select_package_name)) ++ Logger.error("The '{}' component did not advertise a version. This may indicate a problem with the component packaging.".format(stack_select_package_name)) + + + def should_expose_component_version(self, command_name): +@@ -282,8 +282,8 @@ + + # 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]) +@@ -324,11 +324,11 @@ + Script.config = ConfigDictionary(json.load(f)) + # load passwords here(used on windows to impersonate different users) + Script.passwords = {} +- for k, v in _PASSWORD_MAP.iteritems(): ++ for k, v in list(_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) + +- except IOError: ++ except OSError: + Logger.logger.exception("Can not read json file with command parameters: ") + sys.exit(1) + +@@ -355,7 +355,7 @@ + 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: +@@ -377,11 +377,11 @@ + example: command_name=start, afix=pre will result in execution of self.pre_start(env) if exists + """ + self_methods = dir(self) +- method_name = "{0}_{1}".format(afix, command_name) ++ method_name = "{}_{}".format(afix, command_name) + if not method_name in self_methods: +- Logger.logger.debug("Action afix '{0}' not present".format(method_name)) ++ Logger.logger.debug("Action afix '{}' not present".format(method_name)) + return +- Logger.logger.debug("Execute action afix: {0}".format(method_name)) ++ Logger.logger.debug("Execute action afix: {}".format(method_name)) + method = getattr(self, method_name) + method(env) + +@@ -425,11 +425,11 @@ + pids = [] + for pid_file in pid_files: + if not sudo.path_exists(pid_file): +- raise Fail("Pid file {0} doesn't exist after starting of the component.".format(pid_file)) ++ raise Fail("Pid file {} doesn't exist after starting of the component.".format(pid_file)) + + 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): {}".format(', '.join(pids))) + + def post_stop(self, env): + """ +@@ -450,10 +450,10 @@ + 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 + +@@ -463,7 +463,7 @@ + """ + self_methods = dir(self) + if not command_name in self_methods: +- raise Fail("Script '{0}' has no method '{1}'".format(sys.argv[0], command_name)) ++ raise Fail("Script '{}' has no method '{}'".format(sys.argv[0], command_name)) + method = getattr(self, command_name) + return method + +@@ -516,7 +516,7 @@ + from resource_management.libraries.functions.default import default + + package_delimiter = '-' if OSCheck.is_ubuntu_family() else '_' +- package_regex = name.replace(STACK_VERSION_PLACEHOLDER, '(\d|{0})+'.format(package_delimiter)) + "$" ++ package_regex = name.replace(STACK_VERSION_PLACEHOLDER, r'(\d|{})+'.format(package_delimiter)) + "$" + repo = default('/repositoryFile', None) + name_with_version = None + +@@ -530,9 +530,9 @@ + return package + + if name_with_version: +- raise Fail("No package found for {0}(expected name: {1})".format(name, name_with_version)) ++ raise Fail("No package found for {}(expected name: {})".format(name, name_with_version)) + else: +- raise Fail("Cannot match package for regexp name {0}. Available packages: {1}".format(name, self.available_packages_in_repos)) ++ raise Fail("Cannot match package for regexp name {}. Available packages: {}".format(name, self.available_packages_in_repos)) + + def format_package_name(self, name): + from resource_management.libraries.functions.default import default +@@ -577,7 +577,7 @@ + if (package_version is None or '*' in package_version) \ + and effective_version is not None and 'INSTALL' == role_command: + package_version = effective_version.replace('.', package_delimiter).replace('-', package_delimiter) +- Logger.info("Version {0} was provided as effective cluster version. Using package version {1}".format(effective_version, package_version)) ++ Logger.info("Version {} was provided as effective cluster version. Using package version {}".format(effective_version, package_version)) + + if package_version: + stack_version_package_formatted = package_version +@@ -680,13 +680,13 @@ + stack_root_json = default("/configurations/cluster-env/stack_root", None) + + if stack_root_json is None: +- return "/usr/{0}".format(stack_name.lower()) ++ return "/usr/{}".format(stack_name.lower()) + + stack_root = json.loads(stack_root_json) + + if stack_name not in stack_root: +- Logger.warning("Cannot determine stack root for stack named {0}".format(stack_name)) +- return "/usr/{0}".format(stack_name.lower()) ++ Logger.warning("Cannot determine stack root for stack named {}".format(stack_name)) ++ return "/usr/{}".format(stack_name.lower()) + + return stack_root[stack_name] + +@@ -798,10 +798,10 @@ + repos.items = [r for r in repos.items if not (repo_tags_to_skip & r.tags)] + + repo_ids = [repo.repo_id for repo in repos.items] +- Logger.info("Command repositories: {0}".format(", ".join(repo_ids))) ++ Logger.info("Command repositories: {}".format(", ".join(repo_ids))) + repos.items = [x for x in repos.items if (not x.applicable_services or service_name in x.applicable_services) ] + applicable_repo_ids = [repo.repo_id for repo in repos.items] +- Logger.info("Applicable repositories: {0}".format(", ".join(applicable_repo_ids))) ++ Logger.info("Applicable repositories: {}".format(", ".join(applicable_repo_ids))) + + + pkg_provider = ManagerFactory.get() +@@ -836,7 +836,7 @@ + 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): +@@ -878,7 +878,7 @@ + chooser_method = getattr(package_conditions, condition) + except AttributeError: + name = package['name'] +- raise Fail("Condition with name '{0}', when installing package {1}. Please check package_conditions.py.".format(condition, name)) ++ raise Fail("Condition with name '{}', when installing package {}. Please check package_conditions.py.".format(condition, name)) + + return chooser_method() + +@@ -896,7 +896,7 @@ + """ + Prints error message and exits with non-zero exit code + """ +- print("Error: " + message) ++ print(("Error: " + message)) + sys.stderr.write("Error: " + message) + sys.exit(1) + +@@ -992,9 +992,9 @@ + #TODO Once the logic for pid is available from Ranger and Ranger KMS code, will remove the below if block. + services_to_skip = ['RANGER', 'RANGER_KMS'] + if service_name in services_to_skip: +- Logger.info('Temporarily skipping status check for {0} service only.'.format(service_name)) ++ Logger.info('Temporarily skipping status check for {} service only.'.format(service_name)) + elif is_stack_upgrade: +- Logger.info('Skipping status check for {0} service during upgrade'.format(service_name)) ++ Logger.info('Skipping status check for {} service during upgrade'.format(service_name)) + else: + self.status(env) + raise Fail("Stop command finished but process keep running.") +@@ -1102,31 +1102,31 @@ + 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 list(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 list(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 list(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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/python/urlinfo_processor/urlinfo_processor.py apache-ambari-2.7.6-change/ambari-common/src/main/python/urlinfo_processor/urlinfo_processor.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/python/urlinfo_processor/urlinfo_processor.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/python/urlinfo_processor/urlinfo_processor.py 2022-07-11 00:52:28.000000000 +0800 +@@ -20,14 +20,14 @@ + + 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 + + import sys + +-json_stack_version_re = re.compile("(\S*)-((\d\.*)+)") ++json_stack_version_re = re.compile(r"(\S*)-((\d\.*)+)") + + family_map = {"redhat6": "centos6", + "redhat7": "centos7"} +@@ -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 @@ + 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 {} to {} for repo id:{} and family:{}".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_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 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 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-common/src/main/repo/install_ambari_tarball.py apache-ambari-2.7.6-change/ambari-common/src/main/repo/install_ambari_tarball.py +--- ambari-release-2.7.6-origin/ambari-common/src/main/repo/install_ambari_tarball.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/repo/install_ambari_tarball.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python2 ++#!/usr/bin/env python32 + ''' + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file +@@ -23,7 +23,7 @@ + import logging + from ambari_commons import subprocess32 + 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" +@@ -57,7 +57,7 @@ + else: + stdout = stderr = None + +- logger.info("Running '{0}'".format(command)) ++ logger.info("Running '{}'".format(command)) + proc = subprocess32.Popen(command, shell=shell, stdout=stdout, stderr=stderr, env=env) + + if not print_output: +@@ -78,7 +78,7 @@ + def install_package(name): + from os_check import OSCheck + +- logger.info("Checking for existance of {0} dependency package".format(name)) ++ logger.info("Checking for existance of {} dependency package".format(name)) + is_rpm = not OSCheck.is_ubuntu_family() + + if is_rpm: +@@ -90,13 +90,13 @@ + + try: + Utils.os_call(is_installed_cmd, logoutput=False) +- logger.info("Package {0} is already installed. Skipping installation.".format(name)) ++ logger.info("Package {} is already installed. Skipping installation.".format(name)) + except OsCallFailure: +- logger.info("Package {0} is not installed. Installing it...".format(name)) ++ logger.info("Package {} is not installed. Installing it...".format(name)) + Utils.os_call(install_cmd) + + +-class FakePropertiesHeader(object): ++class FakePropertiesHeader: + """ + Hacky class to parse properties file without sections. + see http://stackoverflow.com/questions/2819696/module-to-use-when-parsing-properties-file-in-python/2819788#2819788 +@@ -104,7 +104,7 @@ + FAKE_SECTION_NAME = 'section' + def __init__(self, fp): + self.fp = fp +- self.sechead = '[{0}]\n'.format(FakePropertiesHeader.FAKE_SECTION_NAME) ++ self.sechead = '[{}]\n'.format(FakePropertiesHeader.FAKE_SECTION_NAME) + def readline(self): + if self.sechead: + try: +@@ -132,8 +132,8 @@ + if dirname: + Utils.os_call(["mkdir", "-p", dirname]) + +- url = "{0}/{1}".format(self.base_url, name) +- logger.info("Downloading {0}".format(url)) ++ url = "{}/{}".format(self.base_url, name) ++ logger.info("Downloading {}".format(url)) + Utils.os_call(["wget", "-O", name, url]) + + def run(self): +@@ -156,14 +156,14 @@ + 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)) + + properties = dict(cp.items(FakePropertiesHeader.FAKE_SECTION_NAME)) + + packages_string = None +- postfixes = [os_family+str(ver) for ver in range(int(os_version),0,-1)+['']]+[''] ++ postfixes = [os_family+str(ver) for ver in list(range(int(os_version),0,-1))+['']]+[''] + for postfix in postfixes: + property_name = property_prefix + postfix + if property_name in properties: +@@ -177,13 +177,13 @@ + else: + raise Exception(err_msg) + +- packages_string = re.sub('Requires\s*:','',packages_string) ++ packages_string = re.sub(r'Requires\s*:','',packages_string) + packages_string = re.sub('\\\\n','',packages_string) +- packages_string = re.sub('\s','',packages_string) ++ packages_string = re.sub(r'\s','',packages_string) + 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 {} (y/n): ".format(packages_string)) + if var.lower() != "y" and var.lower() != "yes": + raise Exception("User canceled the installation.") + return +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/main/unix/ambari-python-wrap apache-ambari-2.7.6-change/ambari-common/src/main/unix/ambari-python-wrap +--- ambari-release-2.7.6-origin/ambari-common/src/main/unix/ambari-python-wrap 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/main/unix/ambari-python-wrap 2022-07-10 15:09:03.000000000 +0800 +@@ -34,7 +34,7 @@ + + # if no preferable python versions found, try to use system one. Hoping it's Python 2 + if [[ -z "$PYTHON" ]]; then +- PYTHON=/usr/bin/python ++ PYTHON=/usr/bin/python3 + fi + + # execute script +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/test/python/coilmq/auth/__init__.py apache-ambari-2.7.6-change/ambari-common/src/test/python/coilmq/auth/__init__.py +--- ambari-release-2.7.6-origin/ambari-common/src/test/python/coilmq/auth/__init__.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/test/python/coilmq/auth/__init__.py 2022-07-11 00:52:28.000000000 +0800 +@@ -20,9 +20,8 @@ + limitations under the License.""" + + +-class Authenticator(object): ++class Authenticator(metaclass=abc.ABCMeta): + """ Abstract base class for authenticators. """ +- __metaclass__ = abc.ABCMeta + + @abc.abstractmethod + def authenticate(self, login, passcode): +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/test/python/coilmq/auth/simple.py apache-ambari-2.7.6-change/ambari-common/src/test/python/coilmq/auth/simple.py +--- ambari-release-2.7.6-origin/ambari-common/src/test/python/coilmq/auth/simple.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/test/python/coilmq/auth/simple.py 2022-07-11 00:52:28.000000000 +0800 +@@ -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 -Naur ambari-release-2.7.6-origin/ambari-common/src/test/python/coilmq/config/__init__.py apache-ambari-2.7.6-change/ambari-common/src/test/python/coilmq/config/__init__.py +--- ambari-release-2.7.6-origin/ambari-common/src/test/python/coilmq/config/__init__.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/test/python/coilmq/config/__init__.py 2022-07-11 00:52:28.000000000 +0800 +@@ -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 -Naur ambari-release-2.7.6-origin/ambari-common/src/test/python/coilmq/engine.py apache-ambari-2.7.6-change/ambari-common/src/test/python/coilmq/engine.py +--- ambari-release-2.7.6-origin/ambari-common/src/test/python/coilmq/engine.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/test/python/coilmq/engine.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,5 +1,3 @@ +-from __future__ import absolute_import +- + from coilmq.protocol import STOMP10 + + """ +@@ -37,7 +35,7 @@ + limitations under the License.""" + + +-class StompEngine(object): ++class StompEngine: + """ + The engine provides the core business logic that we use to respond to STOMP protocol + messages. +@@ -70,7 +68,7 @@ + @param connection: The stomp connection backing this engine. + @type connection: L{coilmq.server.StompConnection} + """ +- self.log = logging.getLogger('%s.%s' % ( ++ self.log = logging.getLogger('{}.{}'.format( + self.__class__.__module__, self.__class__.__name__)) + self.connection = connection + self.authenticator = authenticator +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/test/python/coilmq/protocol/__init__.py apache-ambari-2.7.6-change/ambari-common/src/test/python/coilmq/protocol/__init__.py +--- ambari-release-2.7.6-origin/ambari-common/src/test/python/coilmq/protocol/__init__.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/test/python/coilmq/protocol/__init__.py 2022-07-11 00:52:28.000000000 +0800 +@@ -25,9 +25,7 @@ + 'subscribe', 'unsubscribe', 'begin', 'commit', 'abort', 'ack', 'disconnect', 'nack', 'stomp'] + + +-class STOMP(object): +- +- __metaclass__ = abc.ABCMeta ++class STOMP(metaclass=abc.ABCMeta): + + def __init__(self, engine): + self.engine = engine +@@ -253,7 +251,7 @@ + SUPPORTED_VERSIONS = {'1.0', '1.1'} + + def __init__(self, engine, send_heartbeat_interval=100, receive_heartbeat_interval=100, *args, **kwargs): +- super(STOMP11, self).__init__(engine) ++ super().__init__(engine) + self.last_hb = datetime.datetime.now() + self.last_hb_sent = datetime.datetime.now() + self.timer = CoilThreadingTimer() +@@ -272,7 +270,7 @@ + self.timer.schedule(max(self.send_heartbeat_interval, datetime.timedelta(milliseconds=cx)).total_seconds(), + self.receive_heartbeat) + self.timer.start() +- response.headers['heart-beat'] = '{0},{1}'.format(int(self.send_heartbeat_interval.microseconds / 1000), ++ response.headers['heart-beat'] = '{},{}'.format(int(self.send_heartbeat_interval.microseconds / 1000), + int(self.receive_heartbeat_interval.microseconds / 1000)) + + def disable_heartbeat(self): +@@ -285,7 +283,7 @@ + def receive_heartbeat(self): + ago = datetime.datetime.now() - self.last_hb + if ago > self.receive_heartbeat_interval: +- self.engine.log.debug("No heartbeat was received for {0} seconds".format(ago.total_seconds())) ++ self.engine.log.debug("No heartbeat was received for {} seconds".format(ago.total_seconds())) + self.engine.unbind() + + def connect(self, frame, response=None): +@@ -293,8 +291,8 @@ + 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) +- super(STOMP11, self).connect(frame, response=connected_frame) ++ self.enable_heartbeat(*list(map(int, heart_beat.split(','))), response=connected_frame) ++ super().connect(frame, response=connected_frame) + + def nack(self, frame): + """ +@@ -316,7 +314,7 @@ + self.engine.connection.send_frame(Frame( + frames.ERROR, + headers={'version': versions, 'content-type': frames.TEXT_PLAIN}, +- body='Supported protocol versions are {0}'.format(versions) ++ body='Supported protocol versions are {}'.format(versions) + )) + else: + response.headers['version'] = max(common) +@@ -336,7 +334,7 @@ + raise ProtocolError('"host" header is required') + if host != socket.getfqdn(): + raise ProtocolError('Virtual hosting is not supported or host is unknown') +- super(STOMP12, self).connect(frame, response) ++ super().connect(frame, response) + + + PROTOCOL_MAP = {'1.0': STOMP10, '1.1': STOMP11, '1.2': STOMP12} +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/test/python/coilmq/queue.py apache-ambari-2.7.6-change/ambari-common/src/test/python/coilmq/queue.py +--- ambari-release-2.7.6-origin/ambari-common/src/test/python/coilmq/queue.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/test/python/coilmq/queue.py 2022-07-11 00:52:28.000000000 +0800 +@@ -29,7 +29,7 @@ + lock = threading.RLock() + + +-class QueueManager(object): ++class QueueManager: + """ + Class that manages distribution of messages to queue subscribers. + +@@ -75,7 +75,7 @@ + @type queue_scheduler: L{coilmq.scheduler.QueuePriorityScheduler} + """ + self.log = logging.getLogger( +- '%s.%s' % (__name__, self.__class__.__name__)) ++ '{}.{}'.format(__name__, self.__class__.__name__)) + + # Use default schedulers, if they're not specified + if subscriber_scheduler is None: +@@ -126,7 +126,7 @@ + else: + # total them up + total = 0 +- for k in self._queues.keys(): ++ for k in list(self._queues.keys()): + total += len(self._queues[k]) + return total + +@@ -141,7 +141,7 @@ + @param destination: The topic/queue destination (e.g. '/queue/foo') + @type destination: C{str} + """ +- self.log.debug("Subscribing %s to %s" % (connection, destination)) ++ self.log.debug("Subscribing {} to {}".format(connection, destination)) + self._queues[destination].add(connection) + self._send_backlog(connection, destination) + +@@ -156,7 +156,7 @@ + @param destination: The topic/queue destination (e.g. '/queue/foo') + @type destination: C{str} + """ +- self.log.debug("Unsubscribing %s from %s" % (connection, destination)) ++ self.log.debug("Unsubscribing {} from {}".format(connection, destination)) + if connection in self._queues[destination]: + self._queues[destination].remove(connection) + +@@ -213,7 +213,7 @@ + + if not subscribers: + self.log.debug( +- "No eligible subscribers; adding message %s to queue %s" % (message, dest)) ++ "No eligible subscribers; adding message {} to queue {}".format(message, dest)) + self.store.enqueue(dest, message) + else: + selected = self.subscriber_scheduler.choice(subscribers, message) +@@ -236,7 +236,7 @@ + @param frame: The frame being acknowledged. + + """ +- self.log.debug("ACK %s for %s" % (frame, connection)) ++ self.log.debug("ACK {} for {}".format(frame, connection)) + + if connection in self._pending: + pending_frame = self._pending[connection] +@@ -315,8 +315,8 @@ + if destination is None: + # Find all destinations that have frames and that contain this + # connection (subscriber). +- eligible_queues = dict([(dest, q) for (dest, q) in self._queues.items() +- if connection in q and self.store.has_frames(dest)]) ++ eligible_queues = {dest: q for (dest, q) in list(self._queues.items()) ++ if connection in q and self.store.has_frames(dest)} + destination = self.queue_scheduler.choice( + eligible_queues, connection) + if destination is None: +@@ -334,7 +334,7 @@ + self._send_frame(connection, frame) + except Exception as x: + self.log.error( +- "Error sending message %s (requeueing): %s" % (frame, x)) ++ "Error sending message {} (requeueing): {}".format(frame, x)) + self.store.requeue(destination, frame) + raise + else: +@@ -343,7 +343,7 @@ + self._send_frame(connection, frame) + except Exception as x: + self.log.error( +- "Error sending message %s (requeueing): %s" % (frame, x)) ++ "Error sending message {} (requeueing): {}".format(frame, x)) + self.store.requeue(destination, frame) + raise + +@@ -370,7 +370,7 @@ + if connection in self._pending: + raise RuntimeError("Connection already has a pending frame.") + self.log.debug( +- "Tracking frame %s as pending for connection %s" % (frame, connection)) ++ "Tracking frame {} as pending for connection {}".format(frame, connection)) + self._pending[connection] = frame + + connection.send_frame(frame) +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/test/python/coilmq/scheduler.py apache-ambari-2.7.6-change/ambari-common/src/test/python/coilmq/scheduler.py +--- ambari-release-2.7.6-origin/ambari-common/src/test/python/coilmq/scheduler.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/test/python/coilmq/scheduler.py 2022-07-11 00:52:28.000000000 +0800 +@@ -25,9 +25,8 @@ + limitations under the License.""" + + +-class SubscriberPriorityScheduler(object): ++class SubscriberPriorityScheduler(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): +@@ -45,7 +44,7 @@ + """ + + +-class QueuePriorityScheduler(object): ++class QueuePriorityScheduler: + """ + Abstract base class for objects that provide a way to prioritize the queues. + """ +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/test/python/coilmq/server/__init__.py apache-ambari-2.7.6-change/ambari-common/src/test/python/coilmq/server/__init__.py +--- ambari-release-2.7.6-origin/ambari-common/src/test/python/coilmq/server/__init__.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/test/python/coilmq/server/__init__.py 2022-07-11 00:52:28.000000000 +0800 +@@ -20,7 +20,7 @@ + limitations under the License.""" + + +-class StompConnection(object): ++class StompConnection(metaclass=abc.ABCMeta): + """ + An "interface" for server implementation classes to "implement". + +@@ -30,7 +30,6 @@ + @ivar reliable_subscriber: Whether this client will ACK all messages. + @type reliable_subscriber: C{bool} + """ +- __metaclass__ = abc.ABCMeta + + reliable_subscriber = False + +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/test/python/coilmq/server/socket_server.py apache-ambari-2.7.6-change/ambari-common/src/test/python/coilmq/server/socket_server.py +--- ambari-release-2.7.6-origin/ambari-common/src/test/python/coilmq/server/socket_server.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/test/python/coilmq/server/socket_server.py 2022-07-11 00:52:28.000000000 +0800 +@@ -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 +@@ -56,7 +56,7 @@ + if self.server.timeout is not None: + self.request.settimeout(self.server.timeout) + self.debug = False +- self.log = logging.getLogger('%s.%s' % (self.__module__, self.__class__.__name__)) ++ self.log = logging.getLogger('{}.{}'.format(self.__module__, self.__class__.__name__)) + self.buffer = FrameBuffer() + self.engine = StompEngine(connection=self, + authenticator=self.server.authenticator, +@@ -147,7 +147,7 @@ + @keyword queue_manager: The configured L{coilmq.queue.QueueManager} object to use. + @keyword topic_manager: The configured L{coilmq.topic.TopicManager} object to use. + """ +- self.log = logging.getLogger('%s.%s' % ( ++ self.log = logging.getLogger('{}.{}'.format( + self.__module__, self.__class__.__name__)) + if not RequestHandlerClass: + RequestHandlerClass = StompRequestHandler +@@ -156,7 +156,7 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-common/src/test/python/coilmq/start.py apache-ambari-2.7.6-change/ambari-common/src/test/python/coilmq/start.py +--- ambari-release-2.7.6-origin/ambari-common/src/test/python/coilmq/start.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/test/python/coilmq/start.py 2022-07-11 00:52:28.000000000 +0800 +@@ -138,7 +138,7 @@ + "Stats heartbeat -------------------------------") + store = server.queue_manager.store + for dest in store.destinations(): +- log.debug("Queue %s: size=%s, subscribers=%s" % ( ++ log.debug("Queue {}: size={}, subscribers={}".format( + dest, store.size(dest), server.queue_manager.subscriber_count(dest))) + + # TODO: Add number of subscribers? +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/test/python/coilmq/store/dbm.py apache-ambari-2.7.6-change/ambari-common/src/test/python/coilmq/store/dbm.py +--- ambari-release-2.7.6-origin/ambari-common/src/test/python/coilmq/store/dbm.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/test/python/coilmq/store/dbm.py 2022-07-11 00:52:28.000000000 +0800 +@@ -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 -Naur ambari-release-2.7.6-origin/ambari-common/src/test/python/coilmq/store/__init__.py apache-ambari-2.7.6-change/ambari-common/src/test/python/coilmq/store/__init__.py +--- ambari-release-2.7.6-origin/ambari-common/src/test/python/coilmq/store/__init__.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/test/python/coilmq/store/__init__.py 2022-07-11 00:52:28.000000000 +0800 +@@ -24,7 +24,7 @@ + lock = threading.RLock() + + +-class QueueStore(object): ++class QueueStore(metaclass=abc.ABCMeta): + """ + Abstract base class for queue storage. + +@@ -33,7 +33,6 @@ + @ivar log: A logger for this class. + @type log: C{logging.Logger} + """ +- __metaclass__ = abc.ABCMeta + + def __init__(self): + """ +@@ -42,7 +41,7 @@ + If you extend this class, you should either call this method or at minimum make sure these values + get set. + """ +- self.log = logging.getLogger('%s.%s' % ( ++ self.log = logging.getLogger('{}.{}'.format( + self.__module__, self.__class__.__name__)) + + @abc.abstractmethod +@@ -146,7 +145,7 @@ + return QueueFrameIterator(self, destination) + + +-class QueueFrameIterator(object): ++class QueueFrameIterator: + """ + Provides an C{iterable} over the frames for a specified destination in a queue. + +@@ -164,7 +163,7 @@ + def __iter__(self): + return self + +- def next(self): ++ def __next__(self): + return self.__next__() + + def __next__(self): +@@ -177,7 +176,7 @@ + return self.store.size(self.destination) + + +-class TopicStore(object): ++class TopicStore: + """ + Abstract base class for non-durable topic storage. + """ +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/test/python/coilmq/store/rds.py apache-ambari-2.7.6-change/ambari-common/src/test/python/coilmq/store/rds.py +--- ambari-release-2.7.6-origin/ambari-common/src/test/python/coilmq/store/rds.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/test/python/coilmq/store/rds.py 2022-07-11 00:52:28.000000000 +0800 +@@ -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 + +@@ -40,7 +40,7 @@ + """The default connection parameters are: host='localhost', port=6379, db=0""" + self.__db = redis_conn or redis.Redis() + # self.key = '{0}:{1}'.format(namespace, name) +- super(RedisQueueStore, self).__init__() ++ super().__init__() + + @synchronized(lock) + def enqueue(self, destination, frame): +@@ -66,4 +66,4 @@ + + @synchronized(lock) + def destinations(self): +- return self.__db.keys() ++ return list(self.__db.keys()) +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/test/python/coilmq/store/sa/__init__.py apache-ambari-2.7.6-change/ambari-common/src/test/python/coilmq/store/sa/__init__.py +--- ambari-release-2.7.6-origin/ambari-common/src/test/python/coilmq/store/sa/__init__.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/test/python/coilmq/store/sa/__init__.py 2022-07-11 00:52:28.000000000 +0800 +@@ -196,7 +196,7 @@ + session = meta.Session() + sel = select([distinct(model.frames_table.c.destination)]) + result = session.execute(sel) +- return set([r[0] for r in result.fetchall()]) ++ return {r[0] for r in result.fetchall()} + + def close(self): + """ +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/test/python/coilmq/topic.py apache-ambari-2.7.6-change/ambari-common/src/test/python/coilmq/topic.py +--- ambari-release-2.7.6-origin/ambari-common/src/test/python/coilmq/topic.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/test/python/coilmq/topic.py 2022-07-11 00:52:28.000000000 +0800 +@@ -28,7 +28,7 @@ + lock = threading.RLock() + + +-class TopicManager(object): ++class TopicManager: + """ + Class that manages distribution of messages to topic subscribers. + +@@ -45,7 +45,7 @@ + + def __init__(self): + self.log = logging.getLogger( +- '%s.%s' % (__name__, self.__class__.__name__)) ++ '{}.{}'.format(__name__, self.__class__.__name__)) + + # Lock var is required for L{synchornized} decorator. + self._lock = threading.RLock() +@@ -74,7 +74,7 @@ + @param destination: The topic destination (e.g. '/topic/foo') + @type destination: C{str} + """ +- self.log.debug("Subscribing %s to %s" % (connection, destination)) ++ self.log.debug("Subscribing {} to {}".format(connection, destination)) + self._topics[destination].add(connection) + + @synchronized(lock) +@@ -88,7 +88,7 @@ + @param destination: The topic destination (e.g. '/topic/foo') + @type destination: C{str} + """ +- self.log.debug("Unsubscribing %s from %s" % (connection, destination)) ++ self.log.debug("Unsubscribing {} from {}".format(connection, destination)) + if connection in self._topics[destination]: + self._topics[destination].remove(connection) + +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/test/python/coilmq/util/concurrency.py apache-ambari-2.7.6-change/ambari-common/src/test/python/coilmq/util/concurrency.py +--- ambari-release-2.7.6-origin/ambari-common/src/test/python/coilmq/util/concurrency.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/test/python/coilmq/util/concurrency.py 2022-07-11 00:52:28.000000000 +0800 +@@ -40,9 +40,7 @@ + return synchronize + + +-class CoilTimerBase(object): +- +- __metaclass__ = abc.ABCMeta ++class CoilTimerBase(metaclass=abc.ABCMeta): + + def __init__(self): + self.jobs = [] +@@ -75,7 +73,7 @@ + class CoilThreadingTimer(CoilTimerBase): + + def __init__(self, *args, **kwargs): +- super(CoilThreadingTimer, self).__init__(*args, **kwargs) ++ super().__init__(*args, **kwargs) + self._running = False + + def run(self): +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/test/python/coilmq/util/frames.py apache-ambari-2.7.6-change/ambari-common/src/test/python/coilmq/util/frames.py +--- ambari-release-2.7.6-origin/ambari-common/src/test/python/coilmq/util/frames.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/test/python/coilmq/util/frames.py 2022-07-11 00:52:28.000000000 +0800 +@@ -4,7 +4,7 @@ + from collections import OrderedDict + import io + +-import six ++from . import six + + SEND = 'SEND' + CONNECT = 'CONNECT' +@@ -42,9 +42,7 @@ + """ + 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([x.decode() for x in iter(lambda: buff.readline().strip(), b'')] + ) + if not preamble_lines: + raise EmptyBuffer() +@@ -57,7 +55,7 @@ + if content_length >= 0: + if len(body) < content_length: + raise IncompleteFrame() +- terminator = six.u(buff.read(1)).decode() ++ terminator = buff.read(1).decode() + if not terminator: + raise BodyNotTerminated() + else: +@@ -71,7 +69,7 @@ + return body + + +-class Frame(object): ++class Frame: + """ + A STOMP frame (or message). + +@@ -90,7 +88,7 @@ + self.cmd, + self.headers, + self.body if isinstance( +- self.body, six.binary_type) else six.b(self.body) ++ self.body, bytes) else six.b(self.body) + ) + + def __eq__(self, other): +@@ -122,11 +120,11 @@ + + # Convert and append any existing headers to a string as the + # protocol describes. +- headerparts = ("{0}:{1}\n".format(key, value) +- for key, value in self.headers.items()) ++ headerparts = ("{}:{}\n".format(key, value) ++ for key, value in list(self.headers.items())) + + # Frame is Command + Header + EOF marker. +- return six.b("{0}\n{1}\n".format(self.cmd, "".join(headerparts))) + (self.body if isinstance(self.body, six.binary_type) else six.b(self.body)) + six.b('\x00') ++ return six.b("{}\n{}\n".format(self.cmd, "".join(headerparts))) + (self.body if isinstance(self.body, bytes) else six.b(self.body)) + b'\x00' + + + class ConnectedFrame(Frame): +@@ -141,12 +139,12 @@ + @param session: The (throw-away) session ID to include in response. + @type session: C{str} + """ +- super(ConnectedFrame, self).__init__( ++ super().__init__( + cmd='connected', headers=extra_headers or {}) + self.headers['session'] = session + + +-class HeaderValue(object): ++class HeaderValue: + """ + An descriptor class that can be used when a calculated header value is needed. + +@@ -186,7 +184,7 @@ + self.calc = value + + def __repr__(self): +- return '<%s calculator=%s>' % (self.__class__.__name__, self.calc) ++ return '<{} calculator={}>'.format(self.__class__.__name__, self.calc) + + + class ErrorFrame(Frame): +@@ -197,14 +195,14 @@ + @param body: The message body bytes. + @type body: C{str} + """ +- super(ErrorFrame, self).__init__(cmd='error', ++ super().__init__(cmd='error', + headers=extra_headers or {}, body=body) + self.headers['message'] = message + self.headers[ + 'content-length'] = HeaderValue(calculator=lambda: len(self.body)) + + def __repr__(self): +- return '<%s message=%r>' % (self.__class__.__name__, self.headers['message']) ++ return '<{} message={!r}>'.format(self.__class__.__name__, self.headers['message']) + + + class ReceiptFrame(Frame): +@@ -215,12 +213,12 @@ + @param receipt: The receipt message ID. + @type receipt: C{str} + """ +- super(ReceiptFrame, self).__init__( ++ super().__init__( + 'RECEIPT', headers=extra_headers or {}) + self.headers['receipt-id'] = receipt + + +-class FrameBuffer(object): ++class FrameBuffer: + """ + A customized version of the StompBuffer class from Stomper project that returns frame objects + and supports iteration. +@@ -251,13 +249,13 @@ + # with a command followed by the headers, so the content-length header will + # always be preceded by a newline. It may not always proceeded by a + # newline, though! +- content_length_re = re.compile('\ncontent-length\s*:\s*(\d+)\s*(\n|$)') ++ content_length_re = re.compile('\ncontent-length\\s*:\\s*(\\d+)\\s*(\n|$)') + + def __init__(self): + self._buffer = io.BytesIO() + self._pointer = 0 + self.debug = False +- self.log = logging.getLogger('%s.%s' % ( ++ self.log = logging.getLogger('{}.{}'.format( + self.__module__, self.__class__.__name__)) + + def clear(self): +@@ -355,5 +353,5 @@ + raise StopIteration() + return msg + +- def next(self): ++ def __next__(self): + return self.__next__() +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/test/python/coilmq/util/six.py apache-ambari-2.7.6-change/ambari-common/src/test/python/coilmq/util/six.py +--- ambari-release-2.7.6-origin/ambari-common/src/test/python/coilmq/util/six.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/test/python/coilmq/util/six.py 2022-07-11 00:52:28.000000000 +0800 +@@ -12,5 +12,5 @@ + 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 +\ 文件尾没有换行符 +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/test/python/mock/docs/conf.py apache-ambari-2.7.6-change/ambari-common/src/test/python/mock/docs/conf.py +--- ambari-release-2.7.6-origin/ambari-common/src/test/python/mock/docs/conf.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/test/python/mock/docs/conf.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,4 +1,3 @@ +-# -*- coding: utf-8 -*- + # + # Mock documentation build configuration file, created by + # sphinx-quickstart on Mon Nov 17 18:12:00 2008. +@@ -13,7 +12,7 @@ + + import sys, os + sys.path.insert(0, os.path.abspath('..')) +-from mock import __version__ ++from unittest.mock import __version__ + + # If your extensions are in another directory, add it here. If the directory + # is relative to the documentation root, use os.path.abspath to make it +@@ -65,8 +64,8 @@ + 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 +186,8 @@ + # 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 -Naur ambari-release-2.7.6-origin/ambari-common/src/test/python/mock/mock.py apache-ambari-2.7.6-change/ambari-common/src/test/python/mock/mock.py +--- ambari-release-2.7.6-origin/ambari-common/src/test/python/mock/mock.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/test/python/mock/mock.py 2022-07-11 00:52:28.000000000 +0800 +@@ -89,11 +89,11 @@ + return obj.next() + + +-BaseExceptions = (BaseException,) ++BaseExceptions = (BaseException as) + if 'java' in sys.platform: + # jython + import java +- BaseExceptions = (BaseException, java.lang.Throwable) ++ BaseExceptions = (BaseException as java.lang.Throwable) + + try: + _isidentifier = str.isidentifier +@@ -136,7 +136,7 @@ + ) + + +-class _slotted(object): ++class _slotted: + __slots__ = ['a'] + + +@@ -335,7 +335,7 @@ + return '__%s__' % name[2:-2] == name + + +-class _SentinelObject(object): ++class _SentinelObject: + "A unique, named, sentinel object." + def __init__(self, name): + self.name = name +@@ -344,7 +344,7 @@ + return 'sentinel.%s' % self.name + + +-class _Sentinel(object): ++class _Sentinel: + """Access attributes to return a named object, usable as a sentinel.""" + def __init__(self): + self._sentinels = {} +@@ -378,13 +378,11 @@ + if not inPy3k: + ClassTypes = (type, ClassType) + +-_allowed_names = set( +- [ ++_allowed_names = { + 'return_value', '_mock_return_value', 'side_effect', + '_mock_side_effect', '_mock_parent', '_mock_new_parent', + '_mock_name', '_mock_new_name' +- ] +-) ++} + + + def _delegating_property(name): +@@ -452,7 +450,7 @@ + + + +-class Base(object): ++class Base: + _mock_return_value = DEFAULT + _mock_side_effect = None + def __init__(self, *args, **kwargs): +@@ -725,7 +723,7 @@ + if self._spec_set: + spec_string = ' spec_set=%r' + spec_string = spec_string % self._spec_class.__name__ +- return "<%s%s%s id='%s'>" % ( ++ return "<{}{}{} id='{}'>".format( + type(self).__name__, + name_string, + spec_string, +@@ -826,7 +824,7 @@ + self = _mock_self + if self.call_args is None: + expected = self._format_mock_call_signature(args, kwargs) +- raise AssertionError('Expected call: %s\nNot called' % (expected,)) ++ raise AssertionError('Expected call: {}\nNot called'.format(expected)) + + if self.call_args != (args, kwargs): + msg = self._format_mock_failure_message(args, kwargs) +@@ -872,7 +870,7 @@ + not_found.append(kall) + if not_found: + raise AssertionError( +- '%r not all found in call list' % (tuple(not_found),) ++ '{!r} not all found in call list'.format(tuple(not_found)) + ) + + +@@ -1106,7 +1104,7 @@ + return hasattr(patcher, 'is_local') + + +-class _patch(object): ++class _patch: + + attribute_name = None + _active_patches = set() +@@ -1237,7 +1235,7 @@ + + if not self.create and original is DEFAULT: + raise AttributeError( +- "%s does not have the attribute %r" % (target, name) ++ "{} does not have the attribute {!r}".format(target, name) + ) + return original, local + +@@ -1566,7 +1564,7 @@ + ) + + +-class _patch_dict(object): ++class _patch_dict: + """ + Patch a dictionary, or dictionary like object, and restore the dictionary + to its original state after the test. +@@ -1729,13 +1727,13 @@ + # (as they are metaclass methods) + # __del__ is not supported at all as it causes problems if it exists + +-_non_defaults = set('__%s__' % method for method in [ ++_non_defaults = {'__%s__' % method for method in [ + 'cmp', 'getslice', 'setslice', 'coerce', 'subclasses', + 'format', 'get', 'set', 'delete', 'reversed', + 'missing', 'reduce', 'reduce_ex', 'getinitargs', + 'getnewargs', 'getstate', 'setstate', 'getformat', + 'setformat', 'repr', 'dir' +-]) ++]} + + + def _get_method(name, func): +@@ -1746,19 +1744,19 @@ + return method + + +-_magics = set( ++_magics = { + '__%s__' % method for method in + ' '.join([magic_methods, numerics, inplace, right, extra]).split() +-) ++} + + _all_magics = _magics | _non_defaults + +-_unsupported_magics = set([ ++_unsupported_magics = { + '__getattr__', '__setattr__', + '__init__', '__new__', '__prepare__' + '__instancecheck__', '__subclasscheck__', + '__del__' +-]) ++} + + _calculate_return_value = { + '__hash__': lambda self: object.__hash__(self), +@@ -1843,7 +1841,7 @@ + + + +-class MagicMixin(object): ++class MagicMixin: + def __init__(self, *args, **kw): + _super(MagicMixin, self).__init__(*args, **kw) + self._mock_set_magics() +@@ -1907,7 +1905,7 @@ + + + +-class MagicProxy(object): ++class MagicProxy: + def __init__(self, name, parent): + self.name = name + self.parent = parent +@@ -1930,7 +1928,7 @@ + + + +-class _ANY(object): ++class _ANY: + "A helper object that compares equal to everything." + + def __eq__(self, other): +@@ -1951,7 +1949,7 @@ + formatted_args = '' + args_string = ', '.join([repr(arg) for arg in args]) + kwargs_string = ', '.join([ +- '%s=%r' % (key, value) for key, value in kwargs.items() ++ '{}={!r}'.format(key, value) for key, value in kwargs.items() + ]) + if args_string: + formatted_args = args_string +@@ -2088,7 +2086,7 @@ + def __getattr__(self, attr): + if self.name is None: + return _Call(name=attr, from_kall=False) +- name = '%s.%s' % (self.name, attr) ++ name = '{}.{}'.format(self.name, attr) + return _Call(name=name, parent=self, from_kall=False) + + +@@ -2230,7 +2228,7 @@ + else: + parent = mock + if isinstance(spec, FunctionTypes): +- parent = mock.mock ++ parent = mock + + new = MagicMock(parent=parent, name=entry, _new_name=entry, + _new_parent=parent, **kwargs) +@@ -2279,7 +2277,7 @@ + return type(obj) + + +-class _SpecState(object): ++class _SpecState: + + def __init__(self, spec, spec_set=False, parent=None, + name=None, ids=None, instance=False): +@@ -2300,7 +2298,7 @@ + type(_ANY.__eq__), + ) + +-FunctionAttributes = set([ ++FunctionAttributes = { + 'func_closure', + 'func_code', + 'func_defaults', +@@ -2308,7 +2306,7 @@ + 'func_doc', + 'func_globals', + 'func_name', +-]) ++} + + + file_spec = None +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/test/python/mock/setup.py apache-ambari-2.7.6-change/ambari-common/src/test/python/mock/setup.py +--- ambari-release-2.7.6-origin/ambari-common/src/test/python/mock/setup.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/test/python/mock/setup.py 2022-07-11 00:52:28.000000000 +0800 +@@ -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 unittest.mock import __version__ + + import os + +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/test/python/mock/tests/support.py apache-ambari-2.7.6-change/ambari-common/src/test/python/mock/tests/support.py +--- ambari-release-2.7.6-origin/ambari-common/src/test/python/mock/tests/support.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/test/python/mock/tests/support.py 2022-07-11 00:52:28.000000000 +0800 +@@ -24,18 +24,18 @@ + return issubclass(type(obj), klass) + + +-class SomeClass(object): ++class SomeClass: + class_attribute = None + + def wibble(self): + pass + + +-class X(object): ++class X: + pass + + try: + next = next + except NameError: + def next(obj): +- return obj.next() ++ return obj.__next__() +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/test/python/mock/tests/support_with.py apache-ambari-2.7.6-change/ambari-common/src/test/python/mock/tests/support_with.py +--- ambari-release-2.7.6-origin/ambari-common/src/test/python/mock/tests/support_with.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/test/python/mock/tests/support_with.py 2022-07-11 00:52:28.000000000 +0800 +@@ -1,5 +1,3 @@ +-from __future__ import with_statement +- + import sys + + __all__ = ['nested', 'catch_warnings', 'examine_warnings'] +@@ -38,7 +36,7 @@ + try: + from warnings import catch_warnings + except ImportError: +- class catch_warnings(object): ++ class catch_warnings: + def __init__(self, record=False, module=None): + self._record = record + self._module = sys.modules['warnings'] +@@ -49,7 +47,7 @@ + if self._record: + args.append("record=True") + name = type(self).__name__ +- return "%s(%s)" % (name, ", ".join(args)) ++ return "{}({})".format(name, ", ".join(args)) + + def __enter__(self): + if self._entered: +@@ -73,7 +71,7 @@ + self._module.filters = self._filters + self._module.showwarning = self._showwarning + +- class WarningMessage(object): ++ class WarningMessage: + _WARNING_DETAILS = ("message", "category", "filename", "lineno", "file", + "line") + def __init__(self, message, category, filename, lineno, file=None, +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/test/python/mock/tests/testcallable.py apache-ambari-2.7.6-change/ambari-common/src/test/python/mock/tests/testcallable.py +--- ambari-release-2.7.6-origin/ambari-common/src/test/python/mock/tests/testcallable.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/test/python/mock/tests/testcallable.py 2022-07-11 00:52:28.000000000 +0800 +@@ -4,7 +4,7 @@ + + from tests.support import is_instance, unittest2, X, SomeClass + +-from mock import ( ++from unittest.mock import ( + Mock, MagicMock, NonCallableMagicMock, + NonCallableMock, patch, create_autospec, + CallableMixin +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/test/python/mock/tests/testhelpers.py apache-ambari-2.7.6-change/ambari-common/src/test/python/mock/tests/testhelpers.py +--- ambari-release-2.7.6-origin/ambari-common/src/test/python/mock/tests/testhelpers.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/test/python/mock/tests/testhelpers.py 2022-07-11 00:52:28.000000000 +0800 +@@ -4,14 +4,14 @@ + + from tests.support import unittest2, inPy3k + +-from mock import ( ++from unittest.mock import ( + call, _Call, create_autospec, MagicMock, + Mock, ANY, _CallList, patch, PropertyMock + ) + + from datetime import datetime + +-class SomeClass(object): ++class SomeClass: + def one(self, a, b): + pass + def two(self): +@@ -49,7 +49,7 @@ + def test_any_mock_calls_comparison_order(self): + mock = Mock() + d = datetime.now() +- class Foo(object): ++ class Foo: + def __eq__(self, other): + return False + def __ne__(self, other): +@@ -352,7 +352,7 @@ + mock = create_autospec(f, return_value='foo') + self.assertEqual(mock(), 'foo') + +- class Foo(object): ++ class Foo: + pass + + mock = create_autospec(Foo, return_value='foo') +@@ -367,7 +367,7 @@ + + + def test_mocking_unbound_methods(self): +- class Foo(object): ++ class Foo: + def foo(self, foo): + pass + p = patch.object(Foo, 'foo') +@@ -380,7 +380,7 @@ + @unittest2.expectedFailure + def test_create_autospec_unbound_methods(self): + # see issue 128 +- class Foo(object): ++ class Foo: + def foo(self): + pass + +@@ -395,7 +395,7 @@ + + + def test_create_autospec_keyword_arguments(self): +- class Foo(object): ++ class Foo: + a = 3 + m = create_autospec(Foo, a='3') + self.assertEqual(m.a, '3') +@@ -435,7 +435,7 @@ + + self.assertRaises(AttributeError, getattr, mock, 'foo') + +- class Foo(object): ++ class Foo: + foo = [] + + mock = create_autospec(Foo) +@@ -532,7 +532,7 @@ + + + def test_descriptors(self): +- class Foo(object): ++ class Foo: + @classmethod + def f(cls, a, b): + pass +@@ -578,7 +578,7 @@ + + + def test_recursive(self): +- class A(object): ++ class A: + def a(self): + pass + foo = 'foo bar baz' +@@ -601,10 +601,10 @@ + + + def test_spec_inheritance_for_classes(self): +- class Foo(object): ++ class Foo: + def a(self): + pass +- class Bar(object): ++ class Bar: + def f(self): + pass + +@@ -637,7 +637,7 @@ + + + def test_inherit(self): +- class Foo(object): ++ class Foo: + a = 3 + + Foo.Foo = Foo +@@ -698,12 +698,12 @@ + + + def test_skip_attributeerrors(self): +- class Raiser(object): ++ class Raiser: + def __get__(self, obj, type=None): + if obj is None: + raise AttributeError('Can only be accessed via an instance') + +- class RaiserClass(object): ++ class RaiserClass: + raiser = Raiser() + + @staticmethod +@@ -721,7 +721,7 @@ + + + def test_signature_class(self): +- class Foo(object): ++ class Foo: + def __init__(self, a, b=3): + pass + +@@ -754,7 +754,7 @@ + def test_class_with_no_init(self): + # this used to raise an exception + # due to trying to get a signature from object.__init__ +- class Foo(object): ++ class Foo: + pass + create_autospec(Foo) + +@@ -769,7 +769,7 @@ + + + def test_signature_callable(self): +- class Callable(object): ++ class Callable: + def __init__(self): + pass + def __call__(self, a): +@@ -796,7 +796,7 @@ + + + def test_signature_noncallable(self): +- class NonCallable(object): ++ class NonCallable: + def __init__(self): + pass + +@@ -813,7 +813,7 @@ + + + def test_create_autospec_none(self): +- class Foo(object): ++ class Foo: + bar = None + + mock = create_autospec(Foo) +@@ -825,7 +825,7 @@ + + + def test_autospec_functions_with_self_in_odd_place(self): +- class Foo(object): ++ class Foo: + def f(a, self): + pass + +@@ -835,7 +835,7 @@ + + + def test_autospec_property(self): +- class Foo(object): ++ class Foo: + @property + def foo(self): + return 3 +@@ -852,7 +852,7 @@ + + + def test_autospec_slots(self): +- class Foo(object): ++ class Foo: + __slots__ = ['a'] + + foo = create_autospec(Foo) +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/test/python/mock/tests/testmagicmethods.py apache-ambari-2.7.6-change/ambari-common/src/test/python/mock/tests/testmagicmethods.py +--- ambari-release-2.7.6-origin/ambari-common/src/test/python/mock/tests/testmagicmethods.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/test/python/mock/tests/testmagicmethods.py 2022-07-11 00:52:28.000000000 +0800 +@@ -5,15 +5,15 @@ + from tests.support import unittest2, inPy3k + + try: +- unicode ++ str + except NameError: + # Python 3 +- unicode = str ++ str = str + long = int + + import inspect + import sys +-from mock import Mock, MagicMock, _magics ++from unittest.mock import Mock, MagicMock, _magics + + + +@@ -83,10 +83,10 @@ + @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 @@ + 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') +@@ -346,7 +346,7 @@ + + + def test_magic_methods_and_spec(self): +- class Iterable(object): ++ class Iterable: + def __iter__(self): + pass + +@@ -356,7 +356,7 @@ + mock.__iter__ = Mock(return_value=iter([])) + self.assertEqual(list(mock), []) + +- class NonIterable(object): ++ class NonIterable: + pass + mock = Mock(spec=NonIterable) + self.assertRaises(AttributeError, lambda: mock.__iter__) +@@ -371,7 +371,7 @@ + + + def test_magic_methods_and_spec_set(self): +- class Iterable(object): ++ class Iterable: + def __iter__(self): + pass + +@@ -381,7 +381,7 @@ + mock.__iter__ = Mock(return_value=iter([])) + self.assertEqual(list(mock), []) + +- class NonIterable(object): ++ class NonIterable: + pass + mock = Mock(spec_set=NonIterable) + self.assertRaises(AttributeError, lambda: mock.__iter__) +@@ -399,7 +399,7 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-common/src/test/python/mock/tests/testmock.py apache-ambari-2.7.6-change/ambari-common/src/test/python/mock/tests/testmock.py +--- ambari-release-2.7.6-origin/ambari-common/src/test/python/mock/tests/testmock.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/test/python/mock/tests/testmock.py 2022-07-11 00:52:28.000000000 +0800 +@@ -10,8 +10,8 @@ + import pickle + import sys + +-import mock +-from mock import ( ++from unittest import mock ++from unittest.mock import ( + call, DEFAULT, patch, sentinel, + MagicMock, Mock, NonCallableMock, + NonCallableMagicMock, _CallList, +@@ -20,19 +20,19 @@ + + + try: +- unicode ++ str + except NameError: +- unicode = str ++ str = str + + +-class Iter(object): ++class Iter: + def __init__(self): + self.thing = iter(['this', 'is', 'an', 'iter']) + + def __iter__(self): + return self + +- def next(self): ++ def __next__(self): + return next(self.thing) + + __next__ = next +@@ -42,7 +42,7 @@ + pass + + +-class Thing(object): ++class Thing: + attribute = 6 + foo = 'bar' + +@@ -87,7 +87,7 @@ + + 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): +@@ -113,7 +113,7 @@ + + + def test_repr_with_spec(self): +- class X(object): ++ class X: + pass + + mock = Mock(spec=X) +@@ -396,7 +396,7 @@ + + # this should be allowed + mock.something +- self.assertRaisesRegexp( ++ self.assertRaisesRegex( + AttributeError, + "Mock object has no attribute 'something_else'", + getattr, mock, 'something_else' +@@ -404,7 +404,7 @@ + + + def test_from_spec(self): +- class Something(object): ++ class Something: + x = 3 + __something__ = None + def y(self): +@@ -415,12 +415,12 @@ + 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__' +@@ -453,7 +453,7 @@ + + + def test_wraps_attributes(self): +- class Real(object): ++ class Real: + attribute = Mock() + + real = Real() +@@ -486,7 +486,7 @@ + + def test_assert_called_with_message(self): + mock = Mock() +- self.assertRaisesRegexp(AssertionError, 'Not called', ++ self.assertRaisesRegex(AssertionError, 'Not called', + mock.assert_called_with) + + +@@ -509,7 +509,7 @@ + + + def test_spec_class(self): +- class X(object): ++ class X: + pass + + mock = Mock(spec=X) +@@ -529,7 +529,7 @@ + + + def test_setting_attribute_with_spec_set(self): +- class X(object): ++ class X: + y = 3 + + mock = Mock(spec=X) +@@ -626,7 +626,7 @@ + def test_dir(self): + mock = Mock() + attrs = set(dir(mock)) +- type_attrs = set([m for m in dir(Mock) if not m.startswith('_')]) ++ type_attrs = {m for m in dir(Mock) if not m.startswith('_')} + + # all public attributes from the type are included + self.assertEqual(set(), type_attrs - attrs) +@@ -705,7 +705,7 @@ + instance = sys.exc_info()[1] + self.assertIsInstance(instance, exception) + else: +- self.fail('Exception %r not raised' % (exception,)) ++ self.fail('Exception {!r} not raised'.format(exception)) + + msg = str(instance) + self.assertEqual(msg, message) +@@ -926,7 +926,7 @@ + self.assertEqual([mock(), mock(), mock()], ['g', 'h', 'i']) + self.assertRaises(StopIteration, mock) + +- class Foo(object): ++ class Foo: + pass + mock = MagicMock(side_effect=Foo) + self.assertIsInstance(mock(), Foo) +@@ -1099,11 +1099,11 @@ + + + def test_mock_add_spec(self): +- class _One(object): ++ class _One: + one = 1 +- class _Two(object): ++ class _Two: + two = 2 +- class Anything(object): ++ class Anything: + one = two = three = 'four' + + klasses = [ +@@ -1202,7 +1202,7 @@ + + + def test_manager_mock(self): +- class Foo(object): ++ class Foo: + one = 'one' + two = 'two' + manager = Mock() +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/test/python/mock/tests/testpatch.py apache-ambari-2.7.6-change/ambari-common/src/test/python/mock/tests/testpatch.py +--- ambari-release-2.7.6-origin/ambari-common/src/test/python/mock/tests/testpatch.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/test/python/mock/tests/testpatch.py 2022-07-11 00:52:28.000000000 +0800 +@@ -8,7 +8,7 @@ + from tests import support + from tests.support import unittest2, inPy3k, SomeClass, is_instance, callable + +-from mock import ( ++from unittest.mock import ( + NonCallableMock, CallableMixin, patch, sentinel, + MagicMock, Mock, NonCallableMagicMock, patch, _patch, + DEFAULT, call, _get_target +@@ -17,14 +17,14 @@ + builtin_string = '__builtin__' + if inPy3k: + builtin_string = 'builtins' +- unicode = str ++ str = str + + PTModule = sys.modules[__name__] + MODNAME = '%s.PTModule' % __name__ + + + def _get_proxy(obj, get_only=True): +- class Proxy(object): ++ class Proxy: + def __getattr__(self, name): + return getattr(obj, name) + if not get_only: +@@ -42,7 +42,7 @@ + something_else = sentinel.SomethingElse + + +-class Foo(object): ++class Foo: + def __init__(self, a): + pass + def f(self, a): +@@ -51,7 +51,7 @@ + pass + foo = 'bar' + +- class Bar(object): ++ class Bar: + def a(self): + pass + +@@ -62,7 +62,7 @@ + pass + + +-class Container(object): ++class Container: + def __init__(self): + self.values = {} + +@@ -93,7 +93,7 @@ + + + def test_single_patchobject(self): +- class Something(object): ++ class Something: + attribute = sentinel.Original + + @patch.object(Something, 'attribute', sentinel.Patched) +@@ -106,7 +106,7 @@ + + + def test_patchobject_with_none(self): +- class Something(object): ++ class Something: + attribute = sentinel.Original + + @patch.object(Something, 'attribute', None) +@@ -119,7 +119,7 @@ + + + def test_multiple_patchobject(self): +- class Something(object): ++ class Something: + attribute = sentinel.Original + next_attribute = sentinel.Original2 + +@@ -188,7 +188,7 @@ + mock.return_value = sentinel.Handle + @patch('%s.open' % builtin_string, mock) + def test(): +- self.assertEqual(open('filename', 'r'), sentinel.Handle, ++ self.assertEqual(open('filename'), sentinel.Handle, + "open not patched") + test() + test() +@@ -209,7 +209,7 @@ + + + def test_patchobject_with_default_mock(self): +- class Test(object): ++ class Test: + something = sentinel.Original + something2 = sentinel.Original2 + +@@ -391,7 +391,7 @@ + + + def test_patch_with_static_methods(self): +- class Foo(object): ++ class Foo: + @staticmethod + def woot(): + return sentinel.Static +@@ -415,7 +415,7 @@ + + + def test_patch_slots(self): +- class Foo(object): ++ class Foo: + __slots__ = ('Foo',) + + foo = Foo() +@@ -430,10 +430,10 @@ + + + def test_patchobject_class_decorator(self): +- class Something(object): ++ class Something: + attribute = sentinel.Original + +- class Foo(object): ++ class Foo: + def test_method(other_self): + self.assertEqual(Something.attribute, sentinel.Patched, + "unpatched") +@@ -452,10 +452,10 @@ + + + def test_patch_class_decorator(self): +- class Something(object): ++ class Something: + attribute = sentinel.Original + +- class Foo(object): ++ class Foo: + def test_method(other_self, mock_something): + self.assertEqual(PTModule.something, mock_something, + "unpatched") +@@ -475,7 +475,7 @@ + + + def test_patchobject_twice(self): +- class Something(object): ++ class Something: + attribute = sentinel.Original + next_attribute = sentinel.Original2 + +@@ -648,10 +648,10 @@ + def test_patch_descriptor(self): + # would be some effort to fix this - we could special case the + # builtin descriptors: classmethod, property, staticmethod +- class Nothing(object): ++ class Nothing: + foo = None + +- class Something(object): ++ class Something: + foo = {} + + @patch.object(Nothing, 'foo', 2) +@@ -773,7 +773,7 @@ + d = {'spam': 'eggs'} + original = d.copy() + +- class Test(object): ++ class Test: + def test_first(self): + this.assertEqual(d, {'foo': 'bar'}) + def test_second(self): +@@ -800,7 +800,7 @@ + + + def test_get_only_proxy(self): +- class Something(object): ++ class Something: + foo = 'foo' + class SomethingElse: + foo = 'foo' +@@ -818,7 +818,7 @@ + + + def test_get_set_delete_proxy(self): +- class Something(object): ++ class Something: + foo = 'foo' + class SomethingElse: + foo = 'foo' +@@ -877,7 +877,7 @@ + + + def test_autospec(self): +- class Boo(object): ++ class Boo: + def __init__(self, a): + pass + def f(self, a): +@@ -886,7 +886,7 @@ + pass + foo = 'bar' + +- class Bar(object): ++ class Bar: + def a(self): + pass + +@@ -1059,7 +1059,7 @@ + + + def test_new_callable_keyword_arguments(self): +- class Bar(object): ++ class Bar: + kwargs = None + def __init__(self, **kwargs): + Bar.kwargs = kwargs +@@ -1074,7 +1074,7 @@ + + + def test_new_callable_spec(self): +- class Bar(object): ++ class Bar: + kwargs = None + def __init__(self, **kwargs): + Bar.kwargs = kwargs +@@ -1149,7 +1149,7 @@ + + + def test_new_callable_inherit_non_mock(self): +- class NotAMock(object): ++ class NotAMock: + def __init__(self, spec): + self.spec = spec + +@@ -1167,7 +1167,7 @@ + def test_new_callable_class_decorating(self): + test = self + original = Foo +- class SomeTest(object): ++ class SomeTest: + + def _test(self, mock_foo): + test.assertIsNot(Foo, original) +@@ -1316,7 +1316,7 @@ + try: + f = result['f'] + foo = result['foo'] +- self.assertEqual(set(result), set(['f', 'foo'])) ++ self.assertEqual(set(result), {'f', 'foo'}) + + self.assertIs(Foo, original_foo) + self.assertIs(Foo.f, f) +@@ -1336,7 +1336,7 @@ + original_f = Foo.f + original_g = Foo.g + +- class SomeTest(object): ++ class SomeTest: + + def _test(self, f, foo): + test.assertIs(Foo, original_foo) +@@ -1394,7 +1394,7 @@ + + + def test_patch_multiple_new_callable(self): +- class Thing(object): ++ class Thing: + pass + + patcher = patch.multiple( +@@ -1528,7 +1528,7 @@ + + + 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') +@@ -1541,7 +1541,7 @@ + + @patch('mock.patch.TEST_PREFIX', 'foo') + def test_patch_test_prefix(self): +- class Foo(object): ++ class Foo: + thing = 'original' + + def foo_one(self): +@@ -1564,7 +1564,7 @@ + + @patch('mock.patch.TEST_PREFIX', 'bar') + def test_patch_dict_test_prefix(self): +- class Foo(object): ++ class Foo: + def bar_one(self): + return dict(the_dict) + def bar_two(self): +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/test/python/mock/tests/testsentinel.py apache-ambari-2.7.6-change/ambari-common/src/test/python/mock/tests/testsentinel.py +--- ambari-release-2.7.6-origin/ambari-common/src/test/python/mock/tests/testsentinel.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/test/python/mock/tests/testsentinel.py 2022-07-11 00:52:28.000000000 +0800 +@@ -4,7 +4,7 @@ + + from tests.support import unittest2 + +-from mock import sentinel, DEFAULT ++from unittest.mock import sentinel, DEFAULT + + + class SentinelTest(unittest2.TestCase): +diff -Naur ambari-release-2.7.6-origin/ambari-common/src/test/python/mock/tests/_testwith.py apache-ambari-2.7.6-change/ambari-common/src/test/python/mock/tests/_testwith.py +--- ambari-release-2.7.6-origin/ambari-common/src/test/python/mock/tests/_testwith.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-common/src/test/python/mock/tests/_testwith.py 2022-07-11 00:52:28.000000000 +0800 +@@ -2,11 +2,10 @@ + # 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 + +-from mock import MagicMock, Mock, patch, sentinel, mock_open, call ++from unittest.mock import MagicMock, Mock, patch, sentinel, mock_open, call + + from tests.support_with import catch_warnings, nested + +@@ -44,7 +43,7 @@ + + + def test_patch_object_with_statement(self): +- class Foo(object): ++ class Foo: + something = 'foo' + original = Foo.something + with patch.object(Foo, 'something'): +diff -Naur ambari-release-2.7.6-origin/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hcat_client.py apache-ambari-2.7.6-change/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hcat_client.py +--- ambari-release-2.7.6-origin/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hcat_client.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hcat_client.py 2022-07-11 00:52:36.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 .hcat import hcat + + class HCatClient(Script): + def install(self, env): +@@ -28,7 +28,7 @@ + self.configure(env) + + def configure(self, env): +- import params ++ from . import params + + env.set_params(params) + +diff -Naur ambari-release-2.7.6-origin/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hcat.py apache-ambari-2.7.6-change/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hcat.py +--- ambari-release-2.7.6-origin/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hcat.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hcat.py 2022-07-11 00:52:36.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 . import params + + Directory(params.hcat_conf_dir, + owner=params.hcat_user, +@@ -39,7 +39,7 @@ + + + def hcat_TemplateConfig(name): +- import params ++ from . import params + + TemplateConfig(format("{hcat_conf_dir}/{name}"), + owner=params.hcat_user, +diff -Naur ambari-release-2.7.6-origin/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hcat_service_check.py apache-ambari-2.7.6-change/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hcat_service_check.py +--- ambari-release-2.7.6-origin/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hcat_service_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hcat_service_check.py 2022-07-11 00:52:36.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 . import params + + unique = get_unique_id_and_date() + output_file = format("/apps/hive/warehouse/hcatsmoke{unique}") +@@ -35,7 +35,7 @@ + + 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 -Naur ambari-release-2.7.6-origin/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive_client.py apache-ambari-2.7.6-change/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive_client.py +--- ambari-release-2.7.6-origin/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive_client.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive_client.py 2022-07-11 00:52:36.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 .hive import hive + + class HiveClient(Script): + def install(self, env): +@@ -28,7 +28,7 @@ + self.configure(env) + + def configure(self, env): +- import params ++ from . import params + env.set_params(params) + + hive(name='client') +diff -Naur ambari-release-2.7.6-origin/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive_metastore.py apache-ambari-2.7.6-change/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive_metastore.py +--- ambari-release-2.7.6-origin/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive_metastore.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive_metastore.py 2022-07-11 00:52:36.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 .hive import hive ++from .hive_service import hive_service + + class HiveMetastore(Script): + +@@ -31,13 +31,13 @@ + self.configure(env) + + def configure(self, env): +- import params ++ from . import params + env.set_params(params) + + hive(name='metastore') + + def start(self, env): +- import params ++ from . import params + env.set_params(params) + self.configure(env) # FOR SECURITY + hive_service( 'metastore', +@@ -45,7 +45,7 @@ + ) + + def stop(self, env): +- import params ++ from . import params + env.set_params(params) + + hive_service( 'metastore', +@@ -53,7 +53,7 @@ + ) + + def status(self, env): +- import status_params ++ from . 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 -Naur ambari-release-2.7.6-origin/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive.py apache-ambari-2.7.6-change/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive.py +--- ambari-release-2.7.6-origin/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive.py 2022-07-11 00:52:36.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 . 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 @@ + + 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 crt_directory(name): +- import params ++ from . 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 . import params + + File(name, + owner=params.hive_user, +@@ -103,7 +103,7 @@ + + + def jdbc_connector(): +- import params ++ from . 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 -Naur ambari-release-2.7.6-origin/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive_server.py apache-ambari-2.7.6-change/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive_server.py +--- ambari-release-2.7.6-origin/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive_server.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive_server.py 2022-07-11 00:52:36.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 .hive import hive ++from .hive_service import hive_service + + class HiveServer(Script): + +@@ -30,13 +30,13 @@ + self.install_packages(env) + self.configure(env) + def configure(self, env): +- import params ++ from . import params + env.set_params(params) + + hive(name='hiveserver2') + + def start(self, env): +- import params ++ from . import params + env.set_params(params) + self.configure(env) # FOR SECURITY + hive_service( 'hiveserver2', +@@ -44,7 +44,7 @@ + ) + + def stop(self, env): +- import params ++ from . import params + env.set_params(params) + + hive_service( 'hiveserver2', +@@ -53,7 +53,7 @@ + + + def status(self, env): +- import status_params ++ from . import status_params + env.set_params(status_params) + pid_file = format("{hive_pid_dir}/{hive_pid}") + # Recursively check all existing gmetad pid files +diff -Naur ambari-release-2.7.6-origin/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive_service.py apache-ambari-2.7.6-change/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive_service.py +--- ambari-release-2.7.6-origin/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive_service.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive_service.py 2022-07-11 00:52:36.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + name, + action='start'): + +- import params ++ from . import params + + if name == 'metastore': + pid_file = format("{hive_pid_dir}/{hive_metastore_pid}") +diff -Naur ambari-release-2.7.6-origin/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/__init__.py apache-ambari-2.7.6-change/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/__init__.py +--- ambari-release-2.7.6-origin/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/__init__.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/__init__.py 2022-07-11 00:52:36.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/mysql_server.py apache-ambari-2.7.6-change/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/mysql_server.py +--- ambari-release-2.7.6-origin/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/mysql_server.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/mysql_server.py 2022-07-11 00:52:36.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 .mysql_service import mysql_service + + class MysqlServer(Script): + +@@ -35,13 +35,13 @@ + self.configure(env) + + def configure(self, env): +- import params ++ from . 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 @@ + mysql_service(daemon_name=self.daemon_name, action='stop') + + def start(self, env): +- import params ++ from . import params + env.set_params(params) + + mysql_service(daemon_name=self.daemon_name, action = 'start') + + def stop(self, env): +- import params ++ from . import params + env.set_params(params) + + mysql_service(daemon_name=self.daemon_name, action = 'stop') +diff -Naur ambari-release-2.7.6-origin/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/mysql_service.py apache-ambari-2.7.6-change/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/mysql_service.py +--- ambari-release-2.7.6-origin/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/mysql_service.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/mysql_service.py 2022-07-11 00:52:36.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/params.py apache-ambari-2.7.6-change/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/params.py +--- ambari-release-2.7.6-origin/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/params.py 2022-07-11 00:52:36.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 . import status_params + + # server configurations + config = Script.get_config() +diff -Naur ambari-release-2.7.6-origin/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/service_check.py apache-ambari-2.7.6-change/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/service_check.py +--- ambari-release-2.7.6-origin/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/service_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/service_check.py 2022-07-11 00:52:36.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 .hcat_service_check import hcat_service_check + + class HiveServiceCheck(Script): + def service_check(self, env): +- import params ++ from . 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 @@ + + File(params.smoke_test_path, + content=StaticFile('hiveserver2Smoke.sh'), +- mode=0755 ++ mode=0o755 + ) + + File(params.smoke_test_sql, +diff -Naur ambari-release-2.7.6-origin/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/status_params.py apache-ambari-2.7.6-change/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/status_params.py +--- ambari-release-2.7.6-origin/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/status_params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/status_params.py 2022-07-11 00:52:36.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-infra/ambari-infra-manager/.gitignore apache-ambari-2.7.6-change/ambari-infra/ambari-infra-manager/.gitignore +--- ambari-release-2.7.6-origin/ambari-infra/ambari-infra-manager/.gitignore 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-infra/ambari-infra-manager/.gitignore 1970-01-01 08:00:00.000000000 +0800 +@@ -1,8 +0,0 @@ +-out/* +-*.pid +-Profile +-.env +-test-out +-test.db +-**/swagger/swagger.json +-**/swagger/swagger.yaml +\ 文件尾没有换行符 +diff -Naur ambari-release-2.7.6-origin/ambari-infra/ambari-infra-solr-client/pom.xml apache-ambari-2.7.6-change/ambari-infra/ambari-infra-solr-client/pom.xml +--- ambari-release-2.7.6-origin/ambari-infra/ambari-infra-solr-client/pom.xml 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-infra/ambari-infra-solr-client/pom.xml 2022-07-12 16:31:57.000000000 +0800 +@@ -31,9 +31,9 @@ + + 6.6.2 + lucene-core-${lucene6.version}.jar +- https://repo1.maven.org/maven2/org/apache/lucene/lucene-core/${lucene6.version}/${lucene6-core-jar.name} ++ https://repo.huaweicloud.com/repository/maven/org/apache/lucene/lucene-core/${lucene6.version}/${lucene6-core-jar.name} + lucene-backward-codecs-${lucene6.version}.jar +- https://repo1.maven.org/maven2/org/apache/lucene/lucene-backward-codecs/${lucene6.version}/${lucene6-backward-codecs-jar.name} ++ https://repo.huaweicloud.com/repository/maven/org/apache/lucene/lucene-backward-codecs/${lucene6.version}/${lucene6-backward-codecs-jar.name} + + + +diff -Naur ambari-release-2.7.6-origin/ambari-infra/ambari-infra-solr-client/src/main/python/migrationConfigGenerator.py apache-ambari-2.7.6-change/ambari-infra/ambari-infra-solr-client/src/main/python/migrationConfigGenerator.py +--- ambari-release-2.7.6-origin/ambari-infra/ambari-infra-solr-client/src/main/python/migrationConfigGenerator.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-infra/ambari-infra-solr-client/src/main/python/migrationConfigGenerator.py 2022-07-11 00:52:29.000000000 +0800 +@@ -24,12 +24,12 @@ + import sys + import time + import traceback +-import urllib2, ssl ++import urllib.request, urllib.error, urllib.parse, ssl + import logging + import json + import base64 + import optparse +-import ConfigParser ++import configparser + from subprocess import Popen, PIPE + from random import randrange + +@@ -66,12 +66,12 @@ + def api_accessor(host, username, password, protocol, port): + def do_request(api_url, request_type, request_body=''): + try: +- url = '{0}://{1}:{2}{3}'.format(protocol, host, port, api_url) +- logger.debug('Execute {0} {1}'.format(request_type, url)) ++ url = '{}://{}:{}{}'.format(protocol, host, port, api_url) ++ logger.debug('Execute {} {}'.format(request_type, url)) + if request_body: +- logger.debug('Request body: {0}'.format(request_body)) ++ logger.debug('Request body: {}'.format(request_body)) + admin_auth = base64.encodestring('%s:%s' % (username, password)).replace('\n', '') +- request = urllib2.Request(url) ++ 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) +@@ -81,29 +81,29 @@ + 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: +- raise Exception('Problem with accessing api. Reason: {0}'.format(exc)) ++ raise Exception('Problem with accessing api. Reason: {}'.format(exc)) + return response_body + return do_request + + def create_solr_api_request_command(request_url, user='infra-solr', kerberos_enabled='false', keytab=None, principal=None, output=None): +- use_infra_solr_user="sudo -u {0}".format(user) ++ use_infra_solr_user="sudo -u {}".format(user) + curl_prefix = "curl -k" + if output is not None: +- curl_prefix+=" -o {0}".format(output) +- api_cmd = '{0} kinit -kt {1} {2} && {3} {4} --negotiate -u : "{5}"'.format(use_infra_solr_user, keytab, principal, use_infra_solr_user, curl_prefix, request_url) \ +- if kerberos_enabled == 'true' else '{0} {1} "{2}"'.format(use_infra_solr_user, curl_prefix, request_url) ++ curl_prefix+=" -o {}".format(output) ++ api_cmd = '{} kinit -kt {} {} && {} {} --negotiate -u : "{}"'.format(use_infra_solr_user, keytab, principal, use_infra_solr_user, curl_prefix, request_url) \ ++ if kerberos_enabled == 'true' else '{} {} "{}"'.format(use_infra_solr_user, curl_prefix, request_url) + return api_cmd + + def get_random_solr_url(solr_urls): + splitted_solr_urls = solr_urls.split(',') + random_index = randrange(0, len(splitted_solr_urls)) + result = splitted_solr_urls[random_index] +- logger.debug("Use {0} for request.".format(result)) ++ logger.debug("Use {} for request.".format(result)) + return result + + def retry(func, *args, **kwargs): +@@ -115,13 +115,13 @@ + result = func(*args, **kwargs) + if result is not None: return result + except Exception as e: +- logger.debug("Error occurred during {0} operation: {1}".format(context, str(traceback.format_exc()))) +- logger.info("{0}: waiting for {1} seconds before retyring again (retry count: {2})".format(context, delay, r+1)) ++ logger.debug("Error occurred during {} operation: {}".format(context, str(traceback.format_exc()))) ++ logger.info("{}: waiting for {} seconds before retyring again (retry count: {})".format(context, delay, r+1)) + time.sleep(delay) + + def get_shard_numbers_per_collections(state_json_data): + collection_shard_map={} +- for key,val in state_json_data.iteritems(): ++ for key,val in state_json_data.items(): + if 'shards' in val: + shard_count=len(val['shards']) + collection_shard_map[key]=shard_count +@@ -129,7 +129,7 @@ + + def get_max_shards_for_collections(state_json_data): + collection_max_shard_map={} +- for key,val in state_json_data.iteritems(): ++ for key,val in state_json_data.items(): + if 'maxShardsPerNode' in val: + collection_max_shard_map[key]=val['maxShardsPerNode'] + return collection_max_shard_map +@@ -222,7 +222,7 @@ + solr_port = infra_solr_env_props['infra_solr_port'] if 'infra_solr_port' in infra_solr_env_props else '8886' + solr_addr_list = [] + for solr_host in solr_hosts: +- solr_addr = "{0}://{1}:{2}/solr".format(solr_protocol, solr_host, solr_port) ++ solr_addr = "{}://{}:{}/solr".format(solr_protocol, solr_host, solr_port) + solr_addr_list.append(solr_addr) + + return ','.join(solr_addr_list) +@@ -261,9 +261,9 @@ + + def generate_ambari_solr_migration_ini_file(options, accessor, protocol): + +- print "Start generating config file: {0} ...".format(options.ini_file) ++ print("Start generating config file: {} ...".format(options.ini_file)) + +- config = ConfigParser.RawConfigParser() ++ config = configparser.RawConfigParser() + + config.add_section('ambari_server') + config.set('ambari_server', 'host', options.host) +@@ -273,34 +273,34 @@ + config.set('ambari_server', 'username', options.username) + config.set('ambari_server', 'password', options.password) + +- print "Get Ambari cluster details ..." ++ print("Get Ambari cluster details ...") + blueprint = get_json(accessor, CLUSTERS_URL.format(options.cluster) + BLUEPRINT_CONFIG_URL) + installed_components = get_installed_components(blueprint) + +- print "Set JAVA_HOME: {0}".format(options.java_home) ++ print("Set JAVA_HOME: {}".format(options.java_home)) + host = socket.getfqdn() + + cluster_config = get_cluster_configs(blueprint) + solr_hosts = get_solr_hosts(options, accessor) + + if solr_hosts and host not in solr_hosts: +- print "{0}WARNING{1}: Host '{2}' is not found in Infra Solr hosts ({3}). Migration commands won't work from here."\ +- .format(colors.WARNING, colors.ENDC, host, ','.join(solr_hosts)) ++ print("{}WARNING{}: Host '{}' is not found in Infra Solr hosts ({}). Migration commands won't work from here."\ ++ .format(colors.WARNING, colors.ENDC, host, ','.join(solr_hosts))) + + zookeeper_hosts = get_zookeeper_server_hosts(options, accessor) + + security_enabled = is_security_enabled(cluster_config) + zk_connect_string = get_zookeeper_connection_string(cluster_config, zookeeper_hosts) + if zk_connect_string: +- print "Service detected: " + colors.OKGREEN + "ZOOKEEPER" + colors.ENDC +- print "Zookeeper connection string: {0}".format(str(zk_connect_string)) ++ print("Service detected: " + colors.OKGREEN + "ZOOKEEPER" + colors.ENDC) ++ print("Zookeeper connection string: {}".format(str(zk_connect_string))) + solr_protocol = get_solr_protocol(cluster_config) + solr_urls = get_solr_urls(cluster_config, solr_hosts, solr_protocol) + if solr_urls: +- print "Service detected: " + colors.OKGREEN + "AMBARI_INFRA_SOLR" + colors.ENDC ++ print("Service detected: " + colors.OKGREEN + "AMBARI_INFRA_SOLR" + colors.ENDC) + solr_znode = get_solr_znode(cluster_config) + if solr_znode: +- print "Infra Solr znode: {0}".format(solr_znode) ++ print("Infra Solr znode: {}".format(solr_znode)) + infra_solr_env_props = get_config_props(cluster_config, 'infra-solr-env') + + infra_solr_user = infra_solr_env_props['infra_solr_user'] if 'infra_solr_user' in infra_solr_env_props else 'infra-solr' +@@ -340,7 +340,7 @@ + default_zk_quorum = "{zookeeper_quorum}" + external_zk_connection_string = infra_solr_env_props['infra_solr_zookeeper_quorum'] if 'infra_solr_zookeeper_quorum' in infra_solr_env_props else default_zk_quorum + if default_zk_quorum != external_zk_connection_string: +- print "Found external zk connection string: {0}".format(external_zk_connection_string) ++ print("Found external zk connection string: {}".format(external_zk_connection_string)) + config.set('infra_solr', 'external_zk_connect_string', external_zk_connection_string) + config.set('infra_solr', 'zk_principal_user', zk_principal_user) + +@@ -350,7 +350,7 @@ + + config.add_section('ranger_collection') + if "RANGER_ADMIN" in installed_components and not options.skip_ranger: +- print "Service detected: " + colors.OKGREEN + "RANGER" + colors.ENDC ++ print("Service detected: " + colors.OKGREEN + "RANGER" + colors.ENDC) + ranger_env_props = get_config_props(cluster_config, 'ranger-env') + if "is_solrCloud_enabled" in ranger_env_props and ranger_env_props['is_solrCloud_enabled'] == 'true': + if "is_external_solrCloud_enabled" in ranger_env_props and ranger_env_props['is_external_solrCloud_enabled'] == 'true' and not options.force_ranger: +@@ -367,7 +367,7 @@ + config.set('ranger_collection', 'ranger_collection_max_shards_per_node', max_shards_map[ranger_collection_name]) + config.set('ranger_collection', 'backup_ranger_config_set_name', 'old_ranger_audits') + config.set('ranger_collection', 'backup_ranger_collection_name', 'old_ranger_audits') +- print 'Ranger Solr collection: ' + ranger_collection_name ++ print('Ranger Solr collection: ' + ranger_collection_name) + ranger_backup_path = None + if options.backup_base_path: + ranger_backup_path = os.path.join(options.backup_base_path, "ranger") +@@ -375,7 +375,7 @@ + ranger_backup_path = options.backup_ranger_base_path + if ranger_backup_path is not None: + config.set('ranger_collection', 'backup_path', ranger_backup_path) +- print 'Ranger backup path: ' + ranger_backup_path ++ print('Ranger backup path: ' + ranger_backup_path) + if options.ranger_hdfs_base_path: + config.set('ranger_collection', 'hdfs_base_path', options.ranger_hdfs_base_path) + elif options.hdfs_base_path: +@@ -387,7 +387,7 @@ + + config.add_section('atlas_collections') + if "ATLAS_SERVER" in installed_components and not options.skip_atlas: +- print "Service detected: " + colors.OKGREEN + "ATLAS" + colors.ENDC ++ print("Service detected: " + colors.OKGREEN + "ATLAS" + colors.ENDC) + config.set('atlas_collections', 'enabled', 'true') + config.set('atlas_collections', 'config_set', 'atlas_configs') + config.set('atlas_collections', 'fulltext_index_name', 'fulltext_index') +@@ -408,7 +408,7 @@ + config.set('atlas_collections', 'vertex_index_shards', coll_shard_map['vertex_index']) + if 'vertex_index' in max_shards_map: + config.set('atlas_collections', 'vertex_index_max_shards_per_node', max_shards_map['vertex_index']) +- print 'Atlas Solr collections: fulltext_index, edge_index, vertex_index' ++ print('Atlas Solr collections: fulltext_index, edge_index, vertex_index') + atlas_backup_path = None + if options.backup_base_path: + atlas_backup_path = os.path.join(options.backup_base_path, "atlas") +@@ -416,7 +416,7 @@ + atlas_backup_path = options.backup_atlas_base_path + if atlas_backup_path is not None: + config.set('atlas_collections', 'backup_path', atlas_backup_path) +- print 'Atlas backup path: ' + atlas_backup_path ++ print('Atlas backup path: ' + atlas_backup_path) + if options.atlas_hdfs_base_path: + config.set('atlas_collections', 'hdfs_base_path', options.atlas_hdfs_base_path) + elif options.hdfs_base_path: +@@ -426,7 +426,7 @@ + + config.add_section('logsearch_collections') + if "LOGSEARCH_SERVER" in installed_components: +- print "Service detected: " + colors.OKGREEN + "LOGSEARCH" + colors.ENDC ++ print("Service detected: " + colors.OKGREEN + "LOGSEARCH" + colors.ENDC) + + logsearch_props = get_config_props(cluster_config, 'logsearch-properties') + +@@ -437,19 +437,19 @@ + config.set('logsearch_collections', 'hadoop_logs_collection_name', logsearch_hadoop_logs_coll_name) + config.set('logsearch_collections', 'audit_logs_collection_name', logsearch_audit_logs_coll_name) + config.set('logsearch_collections', 'history_collection_name', 'history') +- print 'Log Search Solr collections: {0}, {1}, history'.format(logsearch_hadoop_logs_coll_name, logsearch_audit_logs_coll_name) ++ print('Log Search Solr collections: {}, {}, history'.format(logsearch_hadoop_logs_coll_name, logsearch_audit_logs_coll_name)) + else: + config.set('logsearch_collections', 'enabled', 'false') + + if security_enabled == 'true': +- print "Kerberos: enabled" ++ print("Kerberos: enabled") + else: +- print "Kerberos: disabled" ++ print("Kerberos: disabled") + + with open(options.ini_file, 'w') as f: + config.write(f) + +- print "Config file generation has finished " + colors.OKGREEN + "successfully" + colors.ENDC ++ print("Config file generation has finished " + colors.OKGREEN + "successfully" + colors.ENDC) + + def validate_inputs(options): + errors=[] +@@ -466,7 +466,7 @@ + if not options.java_home: + errors.append("Option is empty or missing: java-home") + elif not os.path.isdir(options.java_home): +- errors.append("java-home directory does not exist ({0})".format(options.java_home)) ++ errors.append("java-home directory does not exist ({})".format(options.java_home)) + return errors + + if __name__=="__main__": +@@ -500,10 +500,10 @@ + errors = validate_inputs(options) + + if errors: +- print 'Errors' ++ print('Errors') + for error in errors: +- print '- {0}'.format(error) +- print '' ++ print('- {}'.format(error)) ++ print('') + parser.print_help() + else: + protocol = 'https' if options.ssl else 'http' +@@ -511,8 +511,8 @@ + try: + generate_ambari_solr_migration_ini_file(options, accessor, protocol) + except Exception as exc: +- print traceback.format_exc() +- print 'Config file generation ' + colors.FAIL + 'failed' + colors.ENDC ++ print(traceback.format_exc()) ++ print('Config file generation ' + colors.FAIL + 'failed' + colors.ENDC) + except KeyboardInterrupt: +- print ++ print() + sys.exit(128 + signal.SIGINT) +\ 文件尾没有换行符 +diff -Naur ambari-release-2.7.6-origin/ambari-infra/ambari-infra-solr-client/src/main/python/migrationHelper.py apache-ambari-2.7.6-change/ambari-infra/ambari-infra-solr-client/src/main/python/migrationHelper.py +--- ambari-release-2.7.6-origin/ambari-infra/ambari-infra-solr-client/src/main/python/migrationHelper.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-infra/ambari-infra-solr-client/src/main/python/migrationHelper.py 2022-07-11 00:52:29.000000000 +0800 +@@ -18,7 +18,7 @@ + limitations under the License. + ''' + +-import ConfigParser ++import configparser + import base64 + import copy + import glob +@@ -31,7 +31,7 @@ + import sys + import time + import traceback +-import urllib2 ++import urllib.request, urllib.error, urllib.parse + from datetime import datetime, timedelta + from random import randrange, randint + from subprocess import Popen, PIPE +@@ -94,12 +94,12 @@ + def api_accessor(host, username, password, protocol, port): + def do_request(api_url, request_type, request_body=''): + try: +- url = '{0}://{1}:{2}{3}'.format(protocol, host, port, api_url) +- logger.debug('Execute {0} {1}'.format(request_type, url)) ++ url = '{}://{}:{}{}'.format(protocol, host, port, api_url) ++ logger.debug('Execute {} {}'.format(request_type, url)) + if request_body: +- logger.debug('Request body: {0}'.format(request_body)) ++ logger.debug('Request body: {}'.format(request_body)) + admin_auth = base64.encodestring('%s:%s' % (username, password)).replace('\n', '') +- request = urllib2.Request(url) ++ 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) +@@ -109,12 +109,12 @@ + 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: +- raise Exception('Problem with accessing api. Reason: {0}'.format(exc)) ++ raise Exception('Problem with accessing api. Reason: {}'.format(exc)) + return response_body + return do_request + +@@ -133,10 +133,10 @@ + result = func(*args, **kwargs) + if result is not None: return result + except Exception as e: +- logger.error("Error occurred during {0} operation: {1}".format(context, str(traceback.format_exc()))) +- logger.info("\n{0}: waiting for {1} seconds before retyring again (retry count: {2})".format(context, delay, r+1)) ++ logger.error("Error occurred during {} operation: {}".format(context, str(traceback.format_exc()))) ++ logger.info("\n{}: waiting for {} seconds before retyring again (retry count: {})".format(context, delay, r+1)) + time.sleep(delay) +- print '{0} operation {1}FAILED{2}'.format(context, colors.FAIL, colors.ENDC) ++ print('{} operation {}FAILED{}'.format(context, colors.FAIL, colors.ENDC)) + sys.exit(1) + + def get_keytab_and_principal(config): +@@ -165,13 +165,13 @@ + if config.has_section('cluster') and config.has_option('cluster', 'kerberos_enabled'): + kerberos_enabled=config.get('cluster', 'kerberos_enabled') + keytab, principal=get_keytab_and_principal(config) +- use_infra_solr_user="sudo -u {0}".format(user) ++ use_infra_solr_user="sudo -u {}".format(user) + curl_prefix = "curl -k" + if output is not None: +- curl_prefix+=" -o {0}".format(output) +- api_cmd = '{0} kinit -kt {1} {2} && {3} {4} --negotiate -u : "{5}"'.format(use_infra_solr_user, keytab, principal, use_infra_solr_user, curl_prefix, request_url) \ +- if kerberos_enabled == 'true' else '{0} {1} "{2}"'.format(use_infra_solr_user, curl_prefix, request_url) +- logger.debug("Solr API command: {0}".format(api_cmd)) ++ curl_prefix+=" -o {}".format(output) ++ api_cmd = '{} kinit -kt {} {} && {} {} --negotiate -u : "{}"'.format(use_infra_solr_user, keytab, principal, use_infra_solr_user, curl_prefix, request_url) \ ++ if kerberos_enabled == 'true' else '{} {} "{}"'.format(use_infra_solr_user, curl_prefix, request_url) ++ logger.debug("Solr API command: {}".format(api_cmd)) + return api_cmd + + def create_infra_solr_client_command(options, config, command, appendZnode=False): +@@ -192,7 +192,7 @@ + zkConnectString=config.get('infra_solr', 'zk_connect_string') + if kerberos_enabled == 'true': + zk_principal_user = config.get('infra_solr', 'zk_principal_user') if config.has_option('infra_solr', 'zk_principal_user') else 'zookeeper' +- infra_solr_cli_opts= '-Dzookeeper.sasl.client=true -Dzookeeper.sasl.client.username={0} -Dzookeeper.sasl.clientconfig=Client'.format(zk_principal_user) ++ infra_solr_cli_opts= '-Dzookeeper.sasl.client=true -Dzookeeper.sasl.client.username={} -Dzookeeper.sasl.clientconfig=Client'.format(zk_principal_user) + jaasOption=" --jaas-file /etc/ambari-infra-solr/conf/infra_solr_jaas.conf" + command+=jaasOption + if config.has_section('local') and config.has_option('local', 'java_home'): +@@ -204,13 +204,13 @@ + if appendZnode: + if config.has_option('infra_solr', 'znode'): + znode_to_append=config.get('infra_solr', 'znode') +- zkConnectString+="{0}".format(znode_to_append) ++ zkConnectString+="{}".format(znode_to_append) + else: + raise Exception("'znode' option is required for infra_solr section") + +- set_java_home_= 'JAVA_HOME={0}'.format(java_home) +- set_infra_solr_cli_opts = ' INFRA_SOLR_CLI_OPTS="{0}"'.format(infra_solr_cli_opts) if infra_solr_cli_opts != '' else '' +- solr_cli_cmd = '{0} {1}{2} /usr/lib/ambari-infra-solr-client/solrCloudCli.sh --zookeeper-connect-string {3} {4}'\ ++ set_java_home_= 'JAVA_HOME={}'.format(java_home) ++ set_infra_solr_cli_opts = ' INFRA_SOLR_CLI_OPTS="{}"'.format(infra_solr_cli_opts) if infra_solr_cli_opts != '' else '' ++ solr_cli_cmd = '{} {}{} /usr/lib/ambari-infra-solr-client/solrCloudCli.sh --zookeeper-connect-string {} {}'\ + .format(AMBARI_SUDO, set_java_home_, set_infra_solr_cli_opts, zkConnectString, command) + + return solr_cli_cmd +@@ -218,18 +218,18 @@ + def get_random_solr_url(solr_urls, options = None): + random_index = randrange(0, len(solr_urls)) + result = solr_urls[random_index] +- logger.debug("Use {0} solr address for next request.".format(result)) ++ logger.debug("Use {} solr address for next request.".format(result)) + return result + + def format_json(dictionary, tab_level=0): + output = '' + tab = ' ' * 2 * tab_level +- for key, value in dictionary.iteritems(): +- output += ',\n{0}"{1}": '.format(tab, key) ++ for key, value in dictionary.items(): ++ output += ',\n{}"{}": '.format(tab, key) + if isinstance(value, dict): + output += '{\n' + format_json(value, tab_level + 1) + tab + '}' + else: +- output += '"{0}"'.format(value) ++ output += '"{}"'.format(value) + output += '\n' + return output[2:] + +@@ -273,10 +273,10 @@ + request = {} + request['order_id'] = order_id + request['type'] = 'POST' +- request['uri'] = "/clusters/{0}/requests".format(cluster) ++ request['uri'] = "/clusters/{}/requests".format(cluster) + request_body_info = {} + request_info = {} +- request_info["context"] = context + " ({0} of {1})".format(order_id, all) ++ request_info["context"] = context + " ({} of {})".format(order_id, all) + request_info["command"] = command + + order_id = order_id + 1 +@@ -399,12 +399,12 @@ + def validte_common_options(options, parser, config): + if not options.index_location: + parser.print_help() +- print 'index-location option is required' ++ print('index-location option is required') + sys.exit(1) + + if not options.collection: + parser.print_help() +- print 'collection option is required' ++ print('collection option is required') + sys.exit(1) + + def get_service_components(options, accessor, cluster, service, component): +@@ -477,7 +477,7 @@ + solr_instance_hosts = get_service_components(options, accessor, cluster, "AMBARI_INFRA_SOLR", "INFRA_SOLR") + + context = "Upgrade Solr Instances" +- sys.stdout.write("Sending upgrade request: [{0}] ".format(context)) ++ sys.stdout.write("Sending upgrade request: [{}] ".format(context)) + sys.stdout.flush() + + cmd_request = create_command_request("UPGRADE_SOLR_INSTANCE", {}, solr_instance_hosts, cluster, context) +@@ -485,16 +485,16 @@ + request_id = get_request_id(response) + sys.stdout.write(colors.OKGREEN + 'DONE\n' + colors.ENDC) + sys.stdout.flush() +- print 'Upgrade command request id: {0}'.format(request_id) ++ print('Upgrade command request id: {}'.format(request_id)) + if options.async: +- print "Upgrade request sent to Ambari server. Check Ambari UI about the results." ++ print("Upgrade request sent to Ambari server. Check Ambari UI about the results.") + sys.exit(0) + else: +- sys.stdout.write("Start monitoring Ambari request with id {0} ...".format(request_id)) ++ sys.stdout.write("Start monitoring Ambari request with id {} ...".format(request_id)) + sys.stdout.flush() + cluster = config.get('ambari_server', 'cluster') + monitor_request(options, accessor, cluster, request_id, context) +- print "{0}... {1} DONE{2}".format(context, colors.OKGREEN, colors.ENDC) ++ print("{}... {} DONE{}".format(context, colors.OKGREEN, colors.ENDC)) + + def upgrade_solr_clients(options, accessor, parser, config): + """ +@@ -511,11 +511,11 @@ + solr_client_hosts.remove(host) + + if not len(solr_client_hosts): +- print 'The Solr Clients upgrade request has been aborted because no other host can be upgraded.' ++ print('The Solr Clients upgrade request has been aborted because no other host can be upgraded.') + sys.exit(0) + + context = "Upgrade Solr Clients" +- sys.stdout.write("Sending upgrade request: [{0}] ".format(context)) ++ sys.stdout.write("Sending upgrade request: [{}] ".format(context)) + sys.stdout.flush() + + cmd_request = create_command_request("UPGRADE_SOLR_CLIENT", {}, solr_client_hosts, cluster, context, component="INFRA_SOLR_CLIENT") +@@ -523,16 +523,16 @@ + request_id = get_request_id(response) + sys.stdout.write(colors.OKGREEN + 'DONE\n' + colors.ENDC) + sys.stdout.flush() +- print 'Upgrade command request id: {0}'.format(request_id) ++ print('Upgrade command request id: {}'.format(request_id)) + if options.async: +- print "Upgrade request sent to Ambari server. Check Ambari UI about the results." ++ print("Upgrade request sent to Ambari server. Check Ambari UI about the results.") + sys.exit(0) + else: +- sys.stdout.write("Start monitoring Ambari request with id {0} ...".format(request_id)) ++ sys.stdout.write("Start monitoring Ambari request with id {} ...".format(request_id)) + sys.stdout.flush() + cluster = config.get('ambari_server', 'cluster') + monitor_request(options, accessor, cluster, request_id, context) +- print "{0}... {1}DONE{2}".format(context, colors.OKGREEN, colors.ENDC) ++ print("{}... {}DONE{}".format(context, colors.OKGREEN, colors.ENDC)) + + def upgrade_logfeeders(options, accessor, parser, config): + """ +@@ -542,7 +542,7 @@ + logfeeder_hosts = get_service_components(options, accessor, cluster, "LOGSEARCH", "LOGSEARCH_LOGFEEDER") + + context = "Upgrade Log Feeders" +- sys.stdout.write("Sending upgrade request: [{0}] ".format(context)) ++ sys.stdout.write("Sending upgrade request: [{}] ".format(context)) + sys.stdout.flush() + + cmd_request = create_command_request("UPGRADE_LOGFEEDER", {}, logfeeder_hosts, cluster, context, service="LOGSEARCH", component="LOGSEARCH_LOGFEEDER") +@@ -550,16 +550,16 @@ + request_id = get_request_id(response) + sys.stdout.write(colors.OKGREEN + 'DONE\n' + colors.ENDC) + sys.stdout.flush() +- print 'Upgrade command request id: {0}'.format(request_id) ++ print('Upgrade command request id: {}'.format(request_id)) + if options.async: +- print "Upgrade request sent to Ambari server. Check Ambari UI about the results." ++ print("Upgrade request sent to Ambari server. Check Ambari UI about the results.") + sys.exit(0) + else: +- sys.stdout.write("Start monitoring Ambari request with id {0} ...".format(request_id)) ++ sys.stdout.write("Start monitoring Ambari request with id {} ...".format(request_id)) + sys.stdout.flush() + cluster = config.get('ambari_server', 'cluster') + monitor_request(options, accessor, cluster, request_id, context) +- print "{0}... {1} DONE{2}".format(context, colors.OKGREEN, colors.ENDC) ++ print("{}... {} DONE{}".format(context, colors.OKGREEN, colors.ENDC)) + + def upgrade_logsearch_portal(options, accessor, parser, config): + """ +@@ -569,7 +569,7 @@ + logsearch_portal_hosts = get_service_components(options, accessor, cluster, "LOGSEARCH", "LOGSEARCH_SERVER") + + context = "Upgrade Log Search Portal" +- sys.stdout.write("Sending upgrade request: [{0}] ".format(context)) ++ sys.stdout.write("Sending upgrade request: [{}] ".format(context)) + sys.stdout.flush() + + cmd_request = create_command_request("UPGRADE_LOGSEARCH_PORTAL", {}, logsearch_portal_hosts, cluster, context, service="LOGSEARCH", component="LOGSEARCH_SERVER") +@@ -577,16 +577,16 @@ + request_id = get_request_id(response) + sys.stdout.write(colors.OKGREEN + 'DONE\n' + colors.ENDC) + sys.stdout.flush() +- print 'Upgrade command request id: {0}'.format(request_id) ++ print('Upgrade command request id: {}'.format(request_id)) + if options.async: +- print "Upgrade request sent to Ambari server. Check Ambari UI about the results." ++ print("Upgrade request sent to Ambari server. Check Ambari UI about the results.") + sys.exit(0) + else: +- sys.stdout.write("Start monitoring Ambari request with id {0} ...".format(request_id)) ++ sys.stdout.write("Start monitoring Ambari request with id {} ...".format(request_id)) + sys.stdout.flush() + cluster = config.get('ambari_server', 'cluster') + monitor_request(options, accessor, cluster, request_id, context) +- print "{0}... {1} DONE{2}".format(context, colors.OKGREEN, colors.ENDC) ++ print("{}... {} DONE{}".format(context, colors.OKGREEN, colors.ENDC)) + + def service_components_command(options, accessor, parser, config, service, component, command, command_str): + """ +@@ -595,8 +595,8 @@ + cluster = config.get('ambari_server', 'cluster') + service_components = get_service_components(options, accessor, cluster, service, component) + +- context = "{0} {1}".format(command_str, component) +- sys.stdout.write("Sending '{0}' request: [{1}] ".format(command, context)) ++ context = "{} {}".format(command_str, component) ++ sys.stdout.write("Sending '{}' request: [{}] ".format(command, context)) + sys.stdout.flush() + + cmd_request = create_command_request(command, {}, service_components, cluster, context, service=service, component=component) +@@ -604,29 +604,29 @@ + request_id = get_request_id(response) + sys.stdout.write(colors.OKGREEN + 'DONE\n' + colors.ENDC) + sys.stdout.flush() +- print '{0} command request id: {1}'.format(command_str, request_id) ++ print('{} command request id: {}'.format(command_str, request_id)) + if options.async: +- print "{0} request sent to Ambari server. Check Ambari UI about the results.".format(command_str) ++ print("{} request sent to Ambari server. Check Ambari UI about the results.".format(command_str)) + sys.exit(0) + else: +- sys.stdout.write("Start monitoring Ambari request with id {0} ...".format(request_id)) ++ sys.stdout.write("Start monitoring Ambari request with id {} ...".format(request_id)) + sys.stdout.flush() + cluster = config.get('ambari_server', 'cluster') + monitor_request(options, accessor, cluster, request_id, context) +- print "{0}... {1} DONE{2}".format(context, colors.OKGREEN, colors.ENDC) ++ print("{}... {} DONE{}".format(context, colors.OKGREEN, colors.ENDC)) + + def monitor_request(options, accessor, cluster, request_id, context): + while True: +- request_response=get_json(accessor, "/api/v1/clusters/{0}{1}/{2}".format(cluster, REQUESTS_API_URL, request_id)) ++ request_response=get_json(accessor, "/api/v1/clusters/{}{}/{}".format(cluster, REQUESTS_API_URL, request_id)) + if 'Requests' in request_response and 'request_status' in request_response['Requests']: + request_status = request_response['Requests']['request_status'] +- logger.debug("\nMonitoring '{0}' request (id: '{1}') status is {2}".format(context, request_id, request_status)) ++ logger.debug("\nMonitoring '{}' request (id: '{}') status is {}".format(context, request_id, request_status)) + if request_status in ['FAILED', 'TIMEDOUT', 'ABORTED', 'COMPLETED', 'SKIPPED_FAILED']: + if request_status == 'COMPLETED': +- print "\nRequest (id: {0}) {1}COMPLETED{2}".format(request_id, colors.OKGREEN, colors.ENDC) ++ print("\nRequest (id: {}) {}COMPLETED{}".format(request_id, colors.OKGREEN, colors.ENDC)) + time.sleep(4) + else: +- print "\nRequest (id: {0}) {1}FAILED{2} (checkout Ambari UI about the failed tasks)\n".format(request_id, colors.FAIL, colors.ENDC) ++ print("\nRequest (id: {}) {}FAILED{} (checkout Ambari UI about the failed tasks)\n".format(request_id, colors.FAIL, colors.ENDC)) + sys.exit(1) + break + else: +@@ -636,14 +636,14 @@ + logger.debug("Sleep 5 seconds ...") + time.sleep(5) + else: +- print "'Requests' or 'request_status' cannot be found in JSON response: {0}".format(request_response) ++ print("'Requests' or 'request_status' cannot be found in JSON response: {}".format(request_response)) + sys.exit(1) + + def get_request_id(json_response): + if "Requests" in json_response: + if "id" in json_response['Requests']: + return json_response['Requests']['id'] +- raise Exception("Cannot access request id from Ambari response: {0}".format(json_response)) ++ raise Exception("Cannot access request id from Ambari response: {}".format(json_response)) + + def filter_collections(options, collections): + if options.collection is not None: +@@ -682,10 +682,10 @@ + turn_status = "on" if enable else "off" + if 'infra_solr_security_manually_managed' in security_props and security_props['infra_solr_security_manually_managed'] == check_value: + security_props['infra_solr_security_manually_managed'] = set_value +- post_configuration = create_configs('infra-solr-security-json', security_props, 'Turn {0} security.json manaul management by migrationHelper.py'.format(turn_status)) ++ post_configuration = create_configs('infra-solr-security-json', security_props, 'Turn {} security.json manaul management by migrationHelper.py'.format(turn_status)) + apply_configs(config, accessor, post_configuration) + else: +- print "Configuration 'infra-solr-security-json/infra_solr_security_manually_managed' has already set to '{0}'".format(set_value) ++ print("Configuration 'infra-solr-security-json/infra_solr_security_manually_managed' has already set to '{}'".format(set_value)) + + def set_solr_name_rules(infra_solr_props, accessor, add = False): + """ +@@ -697,22 +697,22 @@ + + if 'content' in infra_solr_env_props and (name_rules_param not in infra_solr_env_props['content']) is add: + if add: +- print "Adding 'SOLR_KERB_NAME_RULES' to 'infra-solr-env/content'" ++ print("Adding 'SOLR_KERB_NAME_RULES' to 'infra-solr-env/content'") + new_content = insert_string_before(infra_solr_env_props['content'], "SOLR_KERB_KEYTAB", name_rules_param) + infra_solr_env_props['content'] = new_content + post_configuration = create_configs('infra-solr-env', infra_solr_env_props, 'Add "SOLR_KERB_NAME_RULES" by migrationHelper.py') + apply_configs(config, accessor, post_configuration) + else: +- print "Removing 'SOLR_KERB_NAME_RULES' from 'infra-solr-env/content'" ++ print("Removing 'SOLR_KERB_NAME_RULES' from 'infra-solr-env/content'") + new_content = infra_solr_env_props['content'].replace(name_rules_param, '') + infra_solr_env_props['content'] = new_content + post_configuration = create_configs('infra-solr-env', infra_solr_env_props, 'Remove "SOLR_KERB_NAME_RULES" by migrationHelper.py') + apply_configs(config, accessor, post_configuration) + else: + if add: +- print "'SOLR_KERB_NAME_RULES' has already set in configuration 'infra-solr-env/content'" ++ print("'SOLR_KERB_NAME_RULES' has already set in configuration 'infra-solr-env/content'") + else: +- print "Configuration 'infra-solr-env/content' does not contain 'SOLR_KERB_NAME_RULES'" ++ print("Configuration 'infra-solr-env/content' does not contain 'SOLR_KERB_NAME_RULES'") + + def apply_configs(config, accessor, post_configuration): + cluster = config.get('ambari_server', 'cluster') +@@ -791,7 +791,7 @@ + splitted_solr_hosts.remove(excluded_url) + + for solr_host in splitted_solr_hosts: +- solr_addr = "{0}://{1}:{2}/solr".format(solr_protocol, solr_host, solr_port) ++ solr_addr = "{}://{}:{}/solr".format(solr_protocol, solr_host, solr_port) + solr_urls.append(solr_addr) + + return solr_urls +@@ -806,9 +806,9 @@ + output_solr_urls = target_solr_urls + hostname = socket.getfqdn() + if any(hostname in s for s in input_solr_urls): +- input_solr_urls = filter(lambda x: hostname in x, input_solr_urls) ++ input_solr_urls = [x for x in input_solr_urls if hostname in x] + if any(hostname in s for s in output_solr_urls): +- output_solr_urls = filter(lambda x: hostname in x, output_solr_urls) ++ output_solr_urls = [x for x in output_solr_urls if hostname in x] + common_url_list = intersect(input_solr_urls, output_solr_urls) + if common_url_list: + input_solr_urls = common_url_list +@@ -830,13 +830,13 @@ + + def monitor_solr_async_request(options, config, status_request, request_id): + request_status_json_cmd=create_solr_api_request_command(status_request, config) +- logger.debug("Solr request: {0}".format(status_request)) +- async_request_success_msg = "Async Solr request (id: {0}) {1}COMPLETED{2}".format(request_id, colors.OKGREEN, colors.ENDC) +- async_request_timeout_msg = "Async Solr request (id: {0}) {1}FAILED{2}".format(request_id, colors.FAIL, colors.ENDC) +- async_request_fail_msg = "\nAsync Solr request (id: {0}) {1}TIMED OUT{2} (increase --solr-async-request-tries if required, default is 400)".format(request_id, colors.FAIL, colors.ENDC) ++ logger.debug("Solr request: {}".format(status_request)) ++ async_request_success_msg = "Async Solr request (id: {}) {}COMPLETED{}".format(request_id, colors.OKGREEN, colors.ENDC) ++ async_request_timeout_msg = "Async Solr request (id: {}) {}FAILED{}".format(request_id, colors.FAIL, colors.ENDC) ++ async_request_fail_msg = "\nAsync Solr request (id: {}) {}TIMED OUT{} (increase --solr-async-request-tries if required, default is 400)".format(request_id, colors.FAIL, colors.ENDC) + max_tries = options.solr_async_request_tries if options.solr_async_request_tries else 400 + tries = 0 +- sys.stdout.write("Start monitoring Solr request with id {0} ...".format(request_id)) ++ sys.stdout.write("Start monitoring Solr request with id {} ...".format(request_id)) + sys.stdout.flush() + async_request_finished = False + async_request_failed = False +@@ -846,7 +846,7 @@ + process = Popen(request_status_json_cmd, stdout=PIPE, stderr=PIPE, shell=True) + out, err = process.communicate() + if process.returncode != 0: +- raise Exception("{0} command failed: {1}".format(request_status_json_cmd, str(err))) ++ raise Exception("{} command failed: {}".format(request_status_json_cmd, str(err))) + else: + response=json.loads(str(out)) + logger.debug(response) +@@ -855,12 +855,12 @@ + async_msg=response['status']['msg'] + if async_state == "completed": + async_request_finished = True +- sys.stdout.write("\nSolr response message: {0}\n".format(async_msg)) ++ sys.stdout.write("\nSolr response message: {}\n".format(async_msg)) + sys.stdout.flush() + elif async_state == "failed": + async_request_finished = True + async_request_failed = True +- sys.stdout.write("\nSolr response message: {0}\n".format(async_msg)) ++ sys.stdout.write("\nSolr response message: {}\n".format(async_msg)) + sys.stdout.flush() + else: + if not options.verbose: +@@ -870,20 +870,20 @@ + logger.debug("Sleep 5 seconds ...") + time.sleep(5) + else: +- raise Exception("The 'status' field is missing from the response: {0}".format(response)) ++ raise Exception("The 'status' field is missing from the response: {}".format(response)) + if tries == max_tries: + async_request_finished = True + async_request_timed_out = True + + if async_request_failed: + if async_request_timed_out: +- print async_request_timeout_msg ++ print(async_request_timeout_msg) + sys.exit(1) + else: +- print async_request_fail_msg ++ print(async_request_fail_msg) + sys.exit(1) + else: +- print async_request_success_msg ++ print(async_request_success_msg) + return request_id + + +@@ -891,47 +891,47 @@ + async_id = str(randint(1000,100000)) + solr_url = get_random_solr_url(solr_urls, options) + request = DELETE_SOLR_COLLECTION_URL.format(solr_url, collection, async_id) +- logger.debug("Solr request: {0}".format(request)) ++ logger.debug("Solr request: {}".format(request)) + delete_collection_json_cmd=create_solr_api_request_command(request, config) + process = Popen(delete_collection_json_cmd, stdout=PIPE, stderr=PIPE, shell=True) + out, err = process.communicate() + if process.returncode != 0: +- raise Exception("{0} command failed: {1}".format(delete_collection_json_cmd, str(err))) ++ raise Exception("{} command failed: {}".format(delete_collection_json_cmd, str(err))) + response=json.loads(str(out)) + if 'requestid' in response: +- print 'Deleting collection {0} request sent. {1}DONE{2}'.format(collection, colors.OKGREEN, colors.ENDC) ++ print('Deleting collection {} request sent. {}DONE{}'.format(collection, colors.OKGREEN, colors.ENDC)) + response_data_map['request_id']=response['requestid'] + response_data_map['status_request']=REQUEST_STATUS_SOLR_COLLECTION_URL.format(solr_url, response['requestid']) + return collection + else: +- raise Exception("DELETE collection ('{0}') failed. Response: {1}".format(collection, str(out))) ++ raise Exception("DELETE collection ('{}') failed. Response: {}".format(collection, str(out))) + + def create_collection(options, config, solr_urls, collection, config_set, shards, replica, max_shards_per_node): + request = CREATE_SOLR_COLLECTION_URL.format(get_random_solr_url(solr_urls, options), collection, config_set, shards, replica, max_shards_per_node) +- logger.debug("Solr request: {0}".format(request)) ++ logger.debug("Solr request: {}".format(request)) + create_collection_json_cmd=create_solr_api_request_command(request, config) + process = Popen(create_collection_json_cmd, stdout=PIPE, stderr=PIPE, shell=True) + out, err = process.communicate() + if process.returncode != 0: +- raise Exception("{0} command failed: {1}".format(create_collection_json_cmd, str(err))) ++ raise Exception("{} command failed: {}".format(create_collection_json_cmd, str(err))) + response=json.loads(str(out)) + if 'success' in response: +- print 'Creating collection {0} was {1}SUCCESSFUL{2}'.format(collection, colors.OKGREEN, colors.ENDC) ++ print('Creating collection {} was {}SUCCESSFUL{}'.format(collection, colors.OKGREEN, colors.ENDC)) + return collection + else: + raise Exception("CREATE collection ('{0}') failed. ({1}) Response: {1}".format(collection, str(out))) + + def reload_collection(options, config, solr_urls, collection): + request = RELOAD_SOLR_COLLECTION_URL.format(get_random_solr_url(solr_urls, options), collection) +- logger.debug("Solr request: {0}".format(request)) ++ logger.debug("Solr request: {}".format(request)) + reload_collection_json_cmd=create_solr_api_request_command(request, config) + process = Popen(reload_collection_json_cmd, stdout=PIPE, stderr=PIPE, shell=True) + out, err = process.communicate() + if process.returncode != 0: +- raise Exception("{0} command failed: {1}".format(reload_collection_json_cmd, str(err))) ++ raise Exception("{} command failed: {}".format(reload_collection_json_cmd, str(err))) + response=json.loads(str(out)) + if 'success' in response: +- print 'Reloading collection {0} was {1}SUCCESSFUL{2}'.format(collection, colors.OKGREEN, colors.ENDC) ++ print('Reloading collection {} was {}SUCCESSFUL{}'.format(collection, colors.OKGREEN, colors.ENDC)) + return collection + else: + raise Exception("RELOAD collection ('{0}') failed. ({1}) Response: {1}".format(collection, str(out))) +@@ -960,51 +960,51 @@ + + def get_replica_index_size(config, core_url, replica): + request = CORE_DETAILS_URL.format(core_url) +- logger.debug("Solr request: {0}".format(request)) ++ logger.debug("Solr request: {}".format(request)) + get_core_detaul_json_cmd=create_solr_api_request_command(request, config) + process = Popen(get_core_detaul_json_cmd, stdout=PIPE, stderr=PIPE, shell=True) + out, err = process.communicate() + if process.returncode != 0: +- raise Exception("{0} command failed: {1}".format(get_core_detaul_json_cmd, str(err))) ++ raise Exception("{} command failed: {}".format(get_core_detaul_json_cmd, str(err))) + response=json.loads(str(out)) + if 'details' in response: + if 'indexSize' in response['details']: + return response['details']['indexSize'] + else: +- raise Exception("Not found 'indexSize' in core details ('{0}'). Response: {1}".format(replica, str(out))) ++ raise Exception("Not found 'indexSize' in core details ('{}'). Response: {}".format(replica, str(out))) + else: +- raise Exception("GET core details ('{0}') failed. Response: {1}".format(replica, str(out))) ++ raise Exception("GET core details ('{}') failed. Response: {}".format(replica, str(out))) + + def delete_znode(options, config, znode): +- solr_cli_command=create_infra_solr_client_command(options, config, '--delete-znode --znode {0}'.format(znode)) +- logger.debug("Solr cli command: {0}".format(solr_cli_command)) +- sys.stdout.write('Deleting znode {0} ... '.format(znode)) ++ solr_cli_command=create_infra_solr_client_command(options, config, '--delete-znode --znode {}'.format(znode)) ++ logger.debug("Solr cli command: {}".format(solr_cli_command)) ++ sys.stdout.write('Deleting znode {} ... '.format(znode)) + sys.stdout.flush() + process = Popen(solr_cli_command, stdout=PIPE, stderr=PIPE, shell=True) + out, err = process.communicate() + if process.returncode != 0: + sys.stdout.write(colors.FAIL + 'FAILED\n' + colors.ENDC) + sys.stdout.flush() +- raise Exception("{0} command failed: {1}".format(solr_cli_command, str(err))) ++ raise Exception("{} command failed: {}".format(solr_cli_command, str(err))) + sys.stdout.write(colors.OKGREEN + 'DONE\n' + colors.ENDC) + sys.stdout.flush() + logger.debug(str(out)) + + def copy_znode(options, config, copy_src, copy_dest, copy_from_local=False, copy_to_local=False): +- solr_cli_command=create_infra_solr_client_command(options, config, '--transfer-znode --copy-src {0} --copy-dest {1}'.format(copy_src, copy_dest)) ++ solr_cli_command=create_infra_solr_client_command(options, config, '--transfer-znode --copy-src {} --copy-dest {}'.format(copy_src, copy_dest)) + if copy_from_local: + solr_cli_command+=" --transfer-mode copyFromLocal" + elif copy_to_local: + solr_cli_command+=" --transfer-mode copyToLocal" +- logger.debug("Solr cli command: {0}".format(solr_cli_command)) +- sys.stdout.write('Transferring data from {0} to {1} ... '.format(copy_src, copy_dest)) ++ logger.debug("Solr cli command: {}".format(solr_cli_command)) ++ sys.stdout.write('Transferring data from {} to {} ... '.format(copy_src, copy_dest)) + sys.stdout.flush() + process = Popen(solr_cli_command, stdout=PIPE, stderr=PIPE, shell=True) + out, err = process.communicate() + if process.returncode != 0: + sys.stdout.write(colors.FAIL + 'FAILED\n' + colors.ENDC) + sys.stdout.flush() +- raise Exception("{0} command failed: {1}".format(solr_cli_command, str(err))) ++ raise Exception("{} command failed: {}".format(solr_cli_command, str(err))) + sys.stdout.write(colors.OKGREEN + 'DONE\n' + colors.ENDC) + sys.stdout.flush() + logger.debug(str(out)) +@@ -1019,29 +1019,29 @@ + if output_file.endswith(dump_json_file): + skip_dump=True + if skip_dump: +- print 'Skipping collection dump file generation: {0}'.format(output_file) ++ print('Skipping collection dump file generation: {}'.format(output_file)) + if not os.path.exists(output_file): +- print "{0}FAIL{1}: Collection dump file '{2}' does not exist.".format(colors.FAIL, colors.ENDC, output_file) ++ print("{}FAIL{}: Collection dump file '{}' does not exist.".format(colors.FAIL, colors.ENDC, output_file)) + sys.exit(1) + else: +- command_suffix = '--dump-collections --output {0}'.format(output_file) ++ command_suffix = '--dump-collections --output {}'.format(output_file) + if include_number_of_docs: + command_suffix+=' --include-doc-number' + solr_cli_command=create_infra_solr_client_command(options, config, command_suffix, appendZnode=True) +- logger.debug("Solr cli command: {0}".format(solr_cli_command)) +- sys.stdout.write('Dumping collections data to {0} ... '.format(output_file)) ++ logger.debug("Solr cli command: {}".format(solr_cli_command)) ++ sys.stdout.write('Dumping collections data to {} ... '.format(output_file)) + sys.stdout.flush() + process = Popen(solr_cli_command, stdout=PIPE, stderr=PIPE, shell=True) + out, err = process.communicate() + if process.returncode != 0: + sys.stdout.write(colors.FAIL + 'FAILED\n' + colors.ENDC) + sys.stdout.flush() +- raise Exception("{0} command failed: {1}".format(solr_cli_command, str(err))) ++ raise Exception("{} command failed: {}".format(solr_cli_command, str(err))) + sys.stdout.write(colors.OKGREEN + 'DONE\n' + colors.ENDC) + sys.stdout.flush() + logger.debug(str(out)) + collections_data = get_collections_data(output_file) +- return collections_data.keys() if collections_data is not None else [] ++ return list(collections_data.keys()) if collections_data is not None else [] + + def get_collections_data(output_file): + return read_json(output_file) +@@ -1056,27 +1056,27 @@ + if service_logs_collection in collections: + solr_urls = get_solr_urls(options, config, service_logs_collection, collections_json_location) + response_map={} +- retry(delete_collection, options, config, service_logs_collection, solr_urls, response_map, context='[Delete {0} collection]'.format(service_logs_collection)) ++ retry(delete_collection, options, config, service_logs_collection, solr_urls, response_map, context='[Delete {} collection]'.format(service_logs_collection)) + retry(monitor_solr_async_request, options, config, response_map['status_request'], response_map['request_id'], +- context="[Monitor Solr async request, id: {0}]".format(response_map['request_id'])) ++ context="[Monitor Solr async request, id: {}]".format(response_map['request_id'])) + else: +- print 'Collection {0} does not exist or filtered out. Skipping delete operation.'.format(service_logs_collection) ++ print('Collection {} does not exist or filtered out. Skipping delete operation.'.format(service_logs_collection)) + if audit_logs_collection in collections: + solr_urls = get_solr_urls(options, config, audit_logs_collection, collections_json_location) + response_map={} +- retry(delete_collection, options, config, audit_logs_collection, solr_urls, response_map, context='[Delete {0} collection]'.format(audit_logs_collection)) ++ retry(delete_collection, options, config, audit_logs_collection, solr_urls, response_map, context='[Delete {} collection]'.format(audit_logs_collection)) + retry(monitor_solr_async_request, options, config, response_map['status_request'], response_map['request_id'], +- context="[Monitor Solr async request, id: {0}]".format(response_map['request_id'])) ++ context="[Monitor Solr async request, id: {}]".format(response_map['request_id'])) + else: +- print 'Collection {0} does not exist or filtered out. Skipping delete operation.'.format(audit_logs_collection) ++ print('Collection {} does not exist or filtered out. Skipping delete operation.'.format(audit_logs_collection)) + if history_collection in collections: + solr_urls = get_solr_urls(options, config, history_collection, collections_json_location) + response_map={} +- retry(delete_collection, options, config, history_collection, solr_urls, response_map, context='[Delete {0} collection]'.format(history_collection)) ++ retry(delete_collection, options, config, history_collection, solr_urls, response_map, context='[Delete {} collection]'.format(history_collection)) + retry(monitor_solr_async_request, options, config, response_map['status_request'], response_map['request_id'], +- context="[Monitor Solr async request, id: {0}]".format(response_map['request_id'])) ++ context="[Monitor Solr async request, id: {}]".format(response_map['request_id'])) + else: +- print 'Collection {0} does not exist or filtered out. Skipping delete operation.'.format(history_collection) ++ print('Collection {} does not exist or filtered out. Skipping delete operation.'.format(history_collection)) + + def delete_atlas_collections(options, config, collections_json_location, collections): + fulltext_collection = config.get('atlas_collections', 'fulltext_index_name') +@@ -1085,38 +1085,38 @@ + if fulltext_collection in collections: + solr_urls = get_solr_urls(options, config, fulltext_collection, collections_json_location) + response_map={} +- retry(delete_collection, options, config, fulltext_collection, solr_urls, response_map, context='[Delete {0} collection]'.format(fulltext_collection)) ++ retry(delete_collection, options, config, fulltext_collection, solr_urls, response_map, context='[Delete {} collection]'.format(fulltext_collection)) + retry(monitor_solr_async_request, options, config, response_map['status_request'], response_map['request_id'], +- context="[Monitor Solr async request, id: {0}]".format(response_map['request_id'])) ++ context="[Monitor Solr async request, id: {}]".format(response_map['request_id'])) + else: +- print 'Collection {0} does not exist or filtered out. Skipping delete operation.'.format(fulltext_collection) ++ print('Collection {} does not exist or filtered out. Skipping delete operation.'.format(fulltext_collection)) + if edge_index_collection in collections: + solr_urls = get_solr_urls(options, config, edge_index_collection, collections_json_location) + response_map={} +- retry(delete_collection, options, config, edge_index_collection, solr_urls, response_map, context='[Delete {0} collection]'.format(edge_index_collection)) ++ retry(delete_collection, options, config, edge_index_collection, solr_urls, response_map, context='[Delete {} collection]'.format(edge_index_collection)) + retry(monitor_solr_async_request, options, config, response_map['status_request'], response_map['request_id'], +- context="[Monitor Solr async request, id: {0}]".format(response_map['request_id'])) ++ context="[Monitor Solr async request, id: {}]".format(response_map['request_id'])) + else: +- print 'Collection {0} does not exist or filtered out. Skipping delete operation.'.format(edge_index_collection) ++ print('Collection {} does not exist or filtered out. Skipping delete operation.'.format(edge_index_collection)) + if vertex_index_collection in collections: + solr_urls = get_solr_urls(options, config, vertex_index_collection, collections_json_location) + response_map={} +- retry(delete_collection, options, config, vertex_index_collection, solr_urls, response_map, context='[Delete {0} collection]'.format(vertex_index_collection)) ++ retry(delete_collection, options, config, vertex_index_collection, solr_urls, response_map, context='[Delete {} collection]'.format(vertex_index_collection)) + retry(monitor_solr_async_request, options, config, response_map['status_request'], response_map['request_id'], +- context="[Monitor Solr async request, id: {0}]".format(response_map['request_id'])) ++ context="[Monitor Solr async request, id: {}]".format(response_map['request_id'])) + else: +- print 'Collection {0} does not exist or filtered out. Skipping delete operation.'.format(vertex_index_collection) ++ print('Collection {} does not exist or filtered out. Skipping delete operation.'.format(vertex_index_collection)) + + def delete_ranger_collection(options, config, collections_json_location, collections): + ranger_collection_name = config.get('ranger_collection', 'ranger_collection_name') + if ranger_collection_name in collections: + solr_urls = get_solr_urls(options, config, ranger_collection_name, collections_json_location) + response_map={} +- retry(delete_collection, options, config, ranger_collection_name, solr_urls, response_map, context='[Delete {0} collection]'.format(ranger_collection_name)) ++ retry(delete_collection, options, config, ranger_collection_name, solr_urls, response_map, context='[Delete {} collection]'.format(ranger_collection_name)) + retry(monitor_solr_async_request, options, config, response_map['status_request'], response_map['request_id'], +- context="[Monitor Solr async request, id: {0}]".format(response_map['request_id'])) ++ context="[Monitor Solr async request, id: {}]".format(response_map['request_id'])) + else: +- print 'Collection {0} does not exist or filtered out. Skipping delete operation'.format(ranger_collection_name) ++ print('Collection {} does not exist or filtered out. Skipping delete operation'.format(ranger_collection_name)) + + def delete_collections(options, config, service_filter): + collections_json_location = COLLECTIONS_DATA_JSON_LOCATION.format("delete_collections.json") +@@ -1135,8 +1135,8 @@ + if config.has_section('infra_solr') and config.has_option('infra_solr', 'znode'): + solr_znode=config.get('infra_solr', 'znode') + ranger_config_set_name = config.get('ranger_collection', 'ranger_config_set_name') +- copy_znode(options, config, "{0}{1}".format(INFRA_SOLR_CLIENT_BASE_PATH, RANGER_NEW_SCHEMA), +- "{0}/configs/{1}/managed-schema".format(solr_znode, ranger_config_set_name), copy_from_local=True) ++ copy_znode(options, config, "{}{}".format(INFRA_SOLR_CLIENT_BASE_PATH, RANGER_NEW_SCHEMA), ++ "{}/configs/{}/managed-schema".format(solr_znode, ranger_config_set_name), copy_from_local=True) + + def backup_ranger_configs(options, config, service_filter): + solr_znode='/infra-solr' +@@ -1145,8 +1145,8 @@ + solr_znode=config.get('infra_solr', 'znode') + ranger_config_set_name = config.get('ranger_collection', 'ranger_config_set_name') + backup_ranger_config_set_name = config.get('ranger_collection', 'backup_ranger_config_set_name') +- copy_znode(options, config, "{0}/configs/{1}".format(solr_znode, ranger_config_set_name), +- "{0}/configs/{1}".format(solr_znode, backup_ranger_config_set_name)) ++ copy_znode(options, config, "{}/configs/{}".format(solr_znode, ranger_config_set_name), ++ "{}/configs/{}".format(solr_znode, backup_ranger_config_set_name)) + + def upgrade_ranger_solrconfig_xml(options, config, service_filter): + solr_znode='/infra-solr' +@@ -1155,38 +1155,38 @@ + solr_znode=config.get('infra_solr', 'znode') + ranger_config_set_name = config.get('ranger_collection', 'ranger_config_set_name') + backup_ranger_config_set_name = config.get('ranger_collection', 'backup_ranger_config_set_name') +- copy_znode(options, config, "{0}/configs/{1}/solrconfig.xml".format(solr_znode, ranger_config_set_name), +- "{0}/configs/{1}/solrconfig.xml".format(solr_znode, backup_ranger_config_set_name)) ++ copy_znode(options, config, "{}/configs/{}/solrconfig.xml".format(solr_znode, ranger_config_set_name), ++ "{}/configs/{}/solrconfig.xml".format(solr_znode, backup_ranger_config_set_name)) + + def evaluate_check_shard_result(collection, result, skip_index_size = False): + evaluate_result = {} + active_shards = result['active_shards'] + all_shards = result['all_shards'] + warnings = 0 +- print 30 * "-" +- print "Number of shards: {0}".format(str(len(all_shards))) ++ print(30 * "-") ++ print("Number of shards: {}".format(str(len(all_shards)))) + for shard in all_shards: + if shard in active_shards: +- print "{0}OK{1}: Found active leader replica for {2}" \ +- .format(colors.OKGREEN, colors.ENDC, shard) ++ print("{}OK{}: Found active leader replica for {}" \ ++ .format(colors.OKGREEN, colors.ENDC, shard)) + else: + warnings=warnings+1 +- print "{0}WARNING{1}: Not found any active leader replicas for {2}, migration will probably fail, fix or delete the shard if it is possible." \ +- .format(colors.WARNING, colors.ENDC, shard) ++ print("{}WARNING{}: Not found any active leader replicas for {}, migration will probably fail, fix or delete the shard if it is possible." \ ++ .format(colors.WARNING, colors.ENDC, shard)) + + if not skip_index_size: + index_size_map = result['index_size_map'] + host_index_size_map = result['host_index_size_map'] + if index_size_map: +- print "Index size per shard for {0}:".format(collection) ++ print("Index size per shard for {}:".format(collection)) + for shard in index_size_map: +- print " - {0}: {1}".format(shard, human_size(index_size_map[shard])) ++ print(" - {}: {}".format(shard, human_size(index_size_map[shard]))) + if host_index_size_map: +- print "Index size per host for {0} (consider this for backup): ".format(collection) ++ print("Index size per host for {} (consider this for backup): ".format(collection)) + for host in host_index_size_map: +- print " - {0}: {1}".format(host, human_size(host_index_size_map[host])) ++ print(" - {}: {}".format(host, human_size(host_index_size_map[host]))) + evaluate_result['host_index_size_map'] = host_index_size_map +- print 30 * "-" ++ print(30 * "-") + evaluate_result['warnings'] = warnings + return evaluate_result + +@@ -1197,7 +1197,7 @@ + index_size_map = {} + host_index_size_map = {} + collections_data = get_collections_data(COLLECTIONS_DATA_JSON_LOCATION.format("check_collections.json")) +- print "Checking available shards for '{0}' collection...".format(collection) ++ print("Checking available shards for '{}' collection...".format(collection)) + if collection in collections_data: + collection_details = collections_data[collection] + if 'shards' in collection_details: +@@ -1209,7 +1209,7 @@ + and collection_details['shards'][shard]['replicas'][replica]['state'].lower() == 'active' \ + and 'leader' in collection_details['shards'][shard]['replicas'][replica]['properties'] \ + and collection_details['shards'][shard]['replicas'][replica]['properties']['leader'] == 'true' : +- logger.debug("Found active shard for {0} (collection: {1})".format(shard, collection)) ++ logger.debug("Found active shard for {} (collection: {})".format(shard, collection)) + active_shards.append(shard) + if not skip_index_size: + core_url = collection_details['shards'][shard]['replicas'][replica]['coreUrl'] +@@ -1276,7 +1276,7 @@ + if collection in docs_map: + num_docs=docs_map[collection] + if num_docs == -1: +- print "Number of documents: -1. That means the number of docs was not provided in the collection dump." ++ print("Number of documents: -1. That means the number of docs was not provided in the collection dump.") + elif num_docs == 0: + result = True + return result +@@ -1285,30 +1285,30 @@ + solr_znode='/infra-solr' + if config.has_section('infra_solr') and config.has_option('infra_solr', 'znode'): + solr_znode=config.get('infra_solr', 'znode') +- coll_data_dir = "{0}migrate/data/{1}".format(INFRA_SOLR_CLIENT_BASE_PATH, collection) ++ coll_data_dir = "{}migrate/data/{}".format(INFRA_SOLR_CLIENT_BASE_PATH, collection) + if not os.path.exists(coll_data_dir): + os.makedirs(coll_data_dir) + +- copy_znode(options, config, "{0}/collections/{1}/state.json".format(solr_znode, collection), "{0}/state.json".format(coll_data_dir), copy_to_local=True) +- copy_znode(options, config, "{0}/restore_metadata/{1}".format(solr_znode, collection), "{0}".format(coll_data_dir), copy_to_local=True) ++ copy_znode(options, config, "{}/collections/{}/state.json".format(solr_znode, collection), "{}/state.json".format(coll_data_dir), copy_to_local=True) ++ copy_znode(options, config, "{}/restore_metadata/{}".format(solr_znode, collection), "{}".format(coll_data_dir), copy_to_local=True) + +- json_file_list=glob.glob("{0}/*.json".format(coll_data_dir)) +- logger.debug("Downloaded json files list: {0}".format(str(json_file_list))) ++ json_file_list=glob.glob("{}/*.json".format(coll_data_dir)) ++ logger.debug("Downloaded json files list: {}".format(str(json_file_list))) + + cores_data_json_list = [k for k in json_file_list if 'state.json' not in k and 'new_state.json' not in k and 'restore_core_pairs.json' not in k] + state_json_list = [k for k in json_file_list if '/state.json' in k] + + if not cores_data_json_list: +- raise Exception('Cannot find any downloaded restore core metadata for {0}'.format(collection)) ++ raise Exception('Cannot find any downloaded restore core metadata for {}'.format(collection)) + if not state_json_list: +- raise Exception('Cannot find any downloaded restore collection state metadata for {0}'.format(collection)) ++ raise Exception('Cannot find any downloaded restore collection state metadata for {}'.format(collection)) + + core_pairs = generate_core_pairs(original_collection, collection, config, options) + cores_to_skip = [] +- logger.debug("Generated core pairs: {0}".format(str(core_pairs))) ++ logger.debug("Generated core pairs: {}".format(str(core_pairs))) + if options.skip_cores: + cores_to_skip = options.skip_cores.split(',') +- logger.debug("Cores to skip: {0}".format(str(cores_to_skip))) ++ logger.debug("Cores to skip: {}".format(str(cores_to_skip))) + + state_json_file=state_json_list[0] + state_data = read_json(state_json_file) +@@ -1317,11 +1317,11 @@ + for core_data_json_file in cores_data_json_list: + core_json_data.append(read_json(core_data_json_file)) + +- logger.debug("collection data content: {0}".format(str(state_data))) ++ logger.debug("collection data content: {}".format(str(state_data))) + core_details={} + for core in core_json_data: + core_details[core['core_node']]=core +- logger.debug("core data contents: {0}".format(str(core_details))) ++ logger.debug("core data contents: {}".format(str(core_details))) + + collection_data = state_data[collection] + shards = collection_data['shards'] +@@ -1338,7 +1338,7 @@ + ulog_dir = core_data['ulogDir'] if 'ulogDir' in core_data else None + + if cores_to_skip and (core in cores_to_skip or (core in core_pairs and core_pairs[core] in cores_to_skip)): +- print "Skipping core '{0}' as it is in skip-cores list (or its original pair: '{1}')".format(core, core_pairs[core]) ++ print("Skipping core '{}' as it is in skip-cores list (or its original pair: '{}')".format(core, core_pairs[core])) + elif replica in core_details: + old_core_node=core_details[replica]['core_node'] + new_core_node=core_details[replica]['new_core_node'] +@@ -1361,76 +1361,76 @@ + new_state_json_data[collection]['shards'][shard]['replicas'][replica]['base_url']=base_url.replace(old_host, new_host) + new_state_json_data[collection]['shards'][shard]['replicas'][replica]['node_name']=node_name.replace(old_host, new_host) + +- with open("{0}/new_state.json".format(coll_data_dir), 'w') as outfile: ++ with open("{}/new_state.json".format(coll_data_dir), 'w') as outfile: + json.dump(new_state_json_data, outfile) + +- copy_znode(options, config, "{0}/new_state.json".format(coll_data_dir), "{0}/collections/{1}/state.json".format(solr_znode, collection), copy_from_local=True) ++ copy_znode(options, config, "{}/new_state.json".format(coll_data_dir), "{}/collections/{}/state.json".format(solr_znode, collection), copy_from_local=True) + + def delete_znodes(options, config, service_filter): + solr_znode='/infra-solr' + if is_logsearch_available(config, service_filter): + if config.has_section('infra_solr') and config.has_option('infra_solr', 'znode'): + solr_znode=config.get('infra_solr', 'znode') +- delete_znode(options, config, "{0}/configs/hadoop_logs".format(solr_znode)) +- delete_znode(options, config, "{0}/configs/audit_logs".format(solr_znode)) +- delete_znode(options, config, "{0}/configs/history".format(solr_znode)) ++ delete_znode(options, config, "{}/configs/hadoop_logs".format(solr_znode)) ++ delete_znode(options, config, "{}/configs/audit_logs".format(solr_znode)) ++ delete_znode(options, config, "{}/configs/history".format(solr_znode)) + + def do_backup_request(options, accessor, parser, config, collection, index_location): +- sys.stdout.write("Sending backup collection request ('{0}') to Ambari to process (backup destination: '{1}')..." ++ sys.stdout.write("Sending backup collection request ('{}') to Ambari to process (backup destination: '{}')..." + .format(collection, index_location)) + sys.stdout.flush() + response = backup(options, accessor, parser, config, collection, index_location) + request_id = get_request_id(response) + sys.stdout.write(colors.OKGREEN + 'DONE\n' + colors.ENDC) + sys.stdout.flush() +- print 'Backup command request id: {0}'.format(request_id) ++ print('Backup command request id: {}'.format(request_id)) + if options.async: +- print "Backup {0} collection request sent to Ambari server. Check Ambari UI about the results.".format(collection) ++ print("Backup {} collection request sent to Ambari server. Check Ambari UI about the results.".format(collection)) + sys.exit(0) + else: +- sys.stdout.write("Start monitoring Ambari request with id {0} ...".format(request_id)) ++ sys.stdout.write("Start monitoring Ambari request with id {} ...".format(request_id)) + sys.stdout.flush() + cluster = config.get('ambari_server', 'cluster') + monitor_request(options, accessor, cluster, request_id, 'Backup Solr collection: ' + collection) +- print "Backup collection '{0}'... {1}DONE{2}".format(collection, colors.OKGREEN, colors.ENDC) ++ print("Backup collection '{}'... {}DONE{}".format(collection, colors.OKGREEN, colors.ENDC)) + + def do_migrate_request(options, accessor, parser, config, collection, index_location): +- sys.stdout.write("Sending migrate collection request ('{0}') to Ambari to process (migrate folder: '{1}')..." ++ sys.stdout.write("Sending migrate collection request ('{}') to Ambari to process (migrate folder: '{}')..." + .format(collection, index_location)) + sys.stdout.flush() + response = migrate(options, accessor, parser, config, collection, index_location) + request_id = get_request_id(response) + sys.stdout.write(colors.OKGREEN + 'DONE\n' + colors.ENDC) + sys.stdout.flush() +- print 'Migrate command request id: {0}'.format(request_id) ++ print('Migrate command request id: {}'.format(request_id)) + if options.async: +- print "Migrate {0} collection index request sent to Ambari server. Check Ambari UI about the results.".format(collection) ++ print("Migrate {} collection index request sent to Ambari server. Check Ambari UI about the results.".format(collection)) + sys.exit(0) + else: +- sys.stdout.write("Start monitoring Ambari request with id {0} ...".format(request_id)) ++ sys.stdout.write("Start monitoring Ambari request with id {} ...".format(request_id)) + sys.stdout.flush() + cluster = config.get('ambari_server', 'cluster') + monitor_request(options, accessor, cluster, request_id, 'Migrate Solr collection index: ' + collection) +- print "Migrate index '{0}'... {1}DONE{2}".format(collection, colors.OKGREEN, colors.ENDC) ++ print("Migrate index '{}'... {}DONE{}".format(collection, colors.OKGREEN, colors.ENDC)) + + def do_restore_request(options, accessor, parser, config, original_collection, collection, config_set, index_location, shards, hdfs_path): +- sys.stdout.write("Sending restore collection request ('{0}') to Ambari to process (backup location: '{1}')..." ++ sys.stdout.write("Sending restore collection request ('{}') to Ambari to process (backup location: '{}')..." + .format(collection, index_location)) + sys.stdout.flush() + response = restore(options, accessor, parser, config, original_collection, collection, config_set, index_location, hdfs_path, shards) + request_id = get_request_id(response) + sys.stdout.write(colors.OKGREEN + 'DONE\n' + colors.ENDC) + sys.stdout.flush() +- print 'Restore command request id: {0}'.format(request_id) ++ print('Restore command request id: {}'.format(request_id)) + if options.async: +- print "Restore {0} collection request sent to Ambari server. Check Ambari UI about the results.".format(collection) ++ print("Restore {} collection request sent to Ambari server. Check Ambari UI about the results.".format(collection)) + sys.exit(0) + else: +- sys.stdout.write("Start monitoring Ambari request with id {0} ...".format(request_id)) ++ sys.stdout.write("Start monitoring Ambari request with id {} ...".format(request_id)) + sys.stdout.flush() + cluster = config.get('ambari_server', 'cluster') + monitor_request(options, accessor, cluster, request_id, 'Restore Solr collection: ' + collection) +- print "Restoring collection '{0}'... {1}DONE{2}".format(collection, colors.OKGREEN, colors.ENDC) ++ print("Restoring collection '{}'... {}DONE{}".format(collection, colors.OKGREEN, colors.ENDC)) + + def get_ranger_index_location(collection, config, options): + ranger_index_location = None +@@ -1441,8 +1441,8 @@ + elif config.has_option('ranger_collection', 'backup_path'): + ranger_index_location = config.get('ranger_collection', 'backup_path') + else: +- print "'backup_path'is missing from config file and --index-location or --ranger-index-location options are missing as well. Backup collection {0} {1}FAILED{2}." \ +- .format(collection, colors.FAIL, colors.ENDC) ++ print("'backup_path'is missing from config file and --index-location or --ranger-index-location options are missing as well. Backup collection {} {}FAILED{}." \ ++ .format(collection, colors.FAIL, colors.ENDC)) + sys.exit(1) + return ranger_index_location + +@@ -1455,8 +1455,8 @@ + elif config.has_option('atlas_collections', 'backup_path'): + atlas_index_location = os.path.join(config.get('atlas_collections', 'backup_path'), collection) + else: +- print "'backup_path'is missing from config file and --index-location or --atlas-index-location options are missing as well. Backup collection {0} {1}FAILED{2}." \ +- .format(collection, colors.FAIL, colors.ENDC) ++ print("'backup_path'is missing from config file and --index-location or --atlas-index-location options are missing as well. Backup collection {} {}FAILED{}." \ ++ .format(collection, colors.FAIL, colors.ENDC)) + sys.exit(1) + return atlas_index_location + +@@ -1468,40 +1468,40 @@ + collection_name = config.get('ranger_collection', 'ranger_collection_name') + if collection_name in collections: + if is_collection_empty(num_docs_map, collection_name): +- print "Collection '{0}' is empty. Backup is not required.".format(collection_name) ++ print("Collection '{}' is empty. Backup is not required.".format(collection_name)) + else: + ranger_index_location=get_ranger_index_location(collection_name, config, options) + do_backup_request(options, accessor, parser, config, collection_name, ranger_index_location) + else: +- print 'Collection {0} does not exist or filtered out. Skipping backup operation.'.format(collection_name) ++ print('Collection {} does not exist or filtered out. Skipping backup operation.'.format(collection_name)) + if is_atlas_available(config, service_filter): + fulltext_index_collection = config.get('atlas_collections', 'fulltext_index_name') + if fulltext_index_collection in collections: + if is_collection_empty(num_docs_map, fulltext_index_collection): +- print "Collection '{0}' is empty. Backup is not required.".format(fulltext_index_collection) ++ print("Collection '{}' is empty. Backup is not required.".format(fulltext_index_collection)) + else: + fulltext_index_location = get_atlas_index_location(fulltext_index_collection, config, options) + do_backup_request(options, accessor, parser, config, fulltext_index_collection, fulltext_index_location) + else: +- print 'Collection {0} does not exist or filtered out. Skipping backup operation.'.format(fulltext_index_collection) ++ print('Collection {} does not exist or filtered out. Skipping backup operation.'.format(fulltext_index_collection)) + vertex_index_collection = config.get('atlas_collections', 'vertex_index_name') + if vertex_index_collection in collections: + if is_collection_empty(num_docs_map, vertex_index_collection): +- print "Collection '{0}' is empty. Backup is not required.".format(vertex_index_collection) ++ print("Collection '{}' is empty. Backup is not required.".format(vertex_index_collection)) + else: + vertex_index_location = get_atlas_index_location(vertex_index_collection, config, options) + do_backup_request(options, accessor, parser, config, vertex_index_collection, vertex_index_location) + else: +- print 'Collection {0} does not exist or filtered out. Skipping backup operation.'.format(vertex_index_collection) ++ print('Collection {} does not exist or filtered out. Skipping backup operation.'.format(vertex_index_collection)) + edge_index_collection = config.get('atlas_collections', 'edge_index_name') + if edge_index_collection in collections: + if is_collection_empty(num_docs_map, edge_index_collection): +- print "Collection '{0}' is empty. Backup is not required.".format(edge_index_collection) ++ print("Collection '{}' is empty. Backup is not required.".format(edge_index_collection)) + else: + edge_index_location = get_atlas_index_location(edge_index_collection, config, options) + do_backup_request(options, accessor, parser, config, edge_index_collection, edge_index_location) + else: +- print 'Collection {0} does not exist or filtered out. Skipping backup operation.'.format(edge_index_collection) ++ print('Collection {} does not exist or filtered out. Skipping backup operation.'.format(edge_index_collection)) + + def migrate_snapshots(options, accessor, parser, config, service_filter): + if is_ranger_available(config, service_filter): +@@ -1510,26 +1510,26 @@ + ranger_index_location=get_ranger_index_location(collection_name, config, options) + do_migrate_request(options, accessor, parser, config, collection_name, ranger_index_location) + else: +- print "Collection '{0}' backup index has filtered out. Skipping migrate operation.".format(collection_name) ++ print("Collection '{}' backup index has filtered out. Skipping migrate operation.".format(collection_name)) + if is_atlas_available(config, service_filter): + fulltext_index_collection = config.get('atlas_collections', 'fulltext_index_name') + if options.collection is None or options.collection == fulltext_index_collection: + fulltext_index_location=get_atlas_index_location(fulltext_index_collection, config, options) + do_migrate_request(options, accessor, parser, config, fulltext_index_collection, fulltext_index_location) + else: +- print "Collection '{0}' backup index has filtered out. Skipping migrate operation.".format(fulltext_index_collection) ++ print("Collection '{}' backup index has filtered out. Skipping migrate operation.".format(fulltext_index_collection)) + vertex_index_collection = config.get('atlas_collections', 'vertex_index_name') + if options.collection is None or options.collection == vertex_index_collection: + vertex_index_location=get_atlas_index_location(vertex_index_collection, config, options) + do_migrate_request(options, accessor, parser, config, vertex_index_collection, vertex_index_location) + else: +- print "Collection '{0}' backup index has filtered out. Skipping migrate operation.".format(vertex_index_collection) ++ print("Collection '{}' backup index has filtered out. Skipping migrate operation.".format(vertex_index_collection)) + edge_index_collection = config.get('atlas_collections', 'edge_index_name') + if options.collection is None or options.collection == edge_index_collection: + edge_index_location=get_atlas_index_location(edge_index_collection, config, options) + do_migrate_request(options, accessor, parser, config, edge_index_collection, edge_index_location) + else: +- print "Collection '{0}' backup index has filtered out. Skipping migrate operation.".format(edge_index_collection) ++ print("Collection '{}' backup index has filtered out. Skipping migrate operation.".format(edge_index_collection)) + + def create_backup_collections(options, accessor, parser, config, service_filter): + collections_json_location = COLLECTIONS_DATA_JSON_LOCATION.format("before_restore_collections.json") +@@ -1541,11 +1541,11 @@ + backup_ranger_collection = config.get('ranger_collection', 'backup_ranger_collection_name') + if original_ranger_collection in collections: + if is_collection_empty(num_docs_map, original_ranger_collection): +- print "Collection '{0}' was empty during backup. It won't need a backup collection.".format(original_ranger_collection) ++ print("Collection '{}' was empty during backup. It won't need a backup collection.".format(original_ranger_collection)) + else: + if backup_ranger_collection not in collections: + if options.collection is not None and options.collection != backup_ranger_collection: +- print "Collection {0} has filtered out. Skipping create operation.".format(backup_ranger_collection) ++ print("Collection {} has filtered out. Skipping create operation.".format(backup_ranger_collection)) + else: + solr_urls = get_solr_urls(options, config, backup_ranger_collection, collections_json_location) + backup_ranger_config_set = config.get('ranger_collection', 'backup_ranger_config_set_name') +@@ -1554,18 +1554,18 @@ + retry(create_collection, options, config, solr_urls, backup_ranger_collection, backup_ranger_config_set, + backup_ranger_shards, replica_number, backup_ranger_max_shards, context="[Create Solr Collections]") + else: +- print "Collection {0} has already exist. Skipping create operation.".format(backup_ranger_collection) ++ print("Collection {} has already exist. Skipping create operation.".format(backup_ranger_collection)) + if is_atlas_available(config, service_filter): + backup_atlas_config_set = config.get('atlas_collections', 'config_set') + backup_fulltext_index_name = config.get('atlas_collections', 'backup_fulltext_index_name') + original_fulltext_index_name = config.get('atlas_collections', 'fulltext_index_name') + if original_fulltext_index_name in collections: + if is_collection_empty(num_docs_map, original_fulltext_index_name): +- print "Collection '{0}' was empty during backup. It won't need a backup collection.".format(original_fulltext_index_name) ++ print("Collection '{}' was empty during backup. It won't need a backup collection.".format(original_fulltext_index_name)) + else: + if backup_fulltext_index_name not in collections: + if options.collection is not None and options.collection != backup_fulltext_index_name: +- print "Collection {0} has filtered out. Skipping create operation.".format(backup_fulltext_index_name) ++ print("Collection {} has filtered out. Skipping create operation.".format(backup_fulltext_index_name)) + else: + solr_urls = get_solr_urls(options, config, backup_fulltext_index_name, collections_json_location) + backup_fulltext_index_shards = config.get('atlas_collections', 'fulltext_index_shards') +@@ -1573,17 +1573,17 @@ + retry(create_collection, options, config, solr_urls, backup_fulltext_index_name, backup_atlas_config_set, + backup_fulltext_index_shards, replica_number, backup_fulltext_index_max_shards, context="[Create Solr Collections]") + else: +- print "Collection {0} has already exist. Skipping create operation.".format(backup_fulltext_index_name) ++ print("Collection {} has already exist. Skipping create operation.".format(backup_fulltext_index_name)) + + backup_edge_index_name = config.get('atlas_collections', 'backup_edge_index_name') + original_edge_index_name = config.get('atlas_collections', 'edge_index_name') + if original_edge_index_name in collections: + if is_collection_empty(num_docs_map, original_edge_index_name): +- print "Collection '{0}' was empty during backup. It won't need a backup collection.".format(original_edge_index_name) ++ print("Collection '{}' was empty during backup. It won't need a backup collection.".format(original_edge_index_name)) + else: + if backup_edge_index_name not in collections: + if options.collection is not None and options.collection != backup_edge_index_name: +- print "Collection {0} has filtered out. Skipping create operation.".format(backup_edge_index_name) ++ print("Collection {} has filtered out. Skipping create operation.".format(backup_edge_index_name)) + else: + solr_urls = get_solr_urls(options, config, backup_edge_index_name, collections_json_location) + backup_edge_index_shards = config.get('atlas_collections', 'edge_index_shards') +@@ -1591,17 +1591,17 @@ + retry(create_collection, options, config, solr_urls, backup_edge_index_name, backup_atlas_config_set, + backup_edge_index_shards, replica_number, backup_edge_index_max_shards, context="[Create Solr Collections]") + else: +- print "Collection {0} has already exist. Skipping create operation.".format(backup_edge_index_name) ++ print("Collection {} has already exist. Skipping create operation.".format(backup_edge_index_name)) + + backup_vertex_index_name = config.get('atlas_collections', 'backup_vertex_index_name') + original_vertex_index_name = config.get('atlas_collections', 'vertex_index_name') + if original_vertex_index_name in collections: + if is_collection_empty(num_docs_map, original_vertex_index_name): +- print "Collection '{0}' was empty during backup. It won't need a backup collection.".format(original_vertex_index_name) ++ print("Collection '{}' was empty during backup. It won't need a backup collection.".format(original_vertex_index_name)) + else: + if backup_vertex_index_name not in collections: + if options.collection is not None and options.collection != backup_vertex_index_name: +- print "Collection {0} has filtered out. Skipping create operation.".format(backup_vertex_index_name) ++ print("Collection {} has filtered out. Skipping create operation.".format(backup_vertex_index_name)) + else: + solr_urls = get_solr_urls(options, config, backup_vertex_index_name, collections_json_location) + backup_vertex_index_shards = config.get('atlas_collections', 'vertex_index_shards') +@@ -1609,7 +1609,7 @@ + retry(create_collection, options, config, solr_urls, backup_vertex_index_name, backup_atlas_config_set, + backup_vertex_index_shards, replica_number, backup_vertex_index_max_shards, context="[Create Solr Collections]") + else: +- print "Collection {0} has already exist. Skipping create operation.".format(backup_fulltext_index_name) ++ print("Collection {} has already exist. Skipping create operation.".format(backup_fulltext_index_name)) + + def restore_collections(options, accessor, parser, config, service_filter): + collections=list_collections(options, config, COLLECTIONS_DATA_JSON_LOCATION.format("restore_collections.json")) +@@ -1632,7 +1632,7 @@ + ranger_index_location=get_ranger_index_location(collection_name, config, options) + do_restore_request(options, accessor, parser, config, collection_name, backup_ranger_collection, backup_ranger_config_set_name, ranger_index_location, backup_ranger_shards, hdfs_base_path) + else: +- print "Collection '{0}' does not exist or filtered out. Skipping restore operation.".format(backup_ranger_collection) ++ print("Collection '{}' does not exist or filtered out. Skipping restore operation.".format(backup_ranger_collection)) + + if is_atlas_available(config, service_filter): + hdfs_base_path = None +@@ -1651,7 +1651,7 @@ + fulltext_index_location=get_atlas_index_location(fulltext_index_collection, config, options) + do_restore_request(options, accessor, parser, config, fulltext_index_collection, backup_fulltext_index_name, atlas_config_set, fulltext_index_location, backup_fulltext_index_shards, hdfs_base_path) + else: +- print "Collection '{0}' does not exist or filtered out. Skipping restore operation.".format(fulltext_index_collection) ++ print("Collection '{}' does not exist or filtered out. Skipping restore operation.".format(fulltext_index_collection)) + + edge_index_collection = config.get('atlas_collections', 'edge_index_name') + backup_edge_index_name = config.get('atlas_collections', 'backup_edge_index_name') +@@ -1660,7 +1660,7 @@ + edge_index_location=get_atlas_index_location(edge_index_collection, config, options) + do_restore_request(options, accessor, parser, config, edge_index_collection, backup_edge_index_name, atlas_config_set, edge_index_location, backup_edge_index_shards, hdfs_base_path) + else: +- print "Collection '{0}' does not exist or filtered out. Skipping restore operation.".format(edge_index_collection) ++ print("Collection '{}' does not exist or filtered out. Skipping restore operation.".format(edge_index_collection)) + + vertex_index_collection = config.get('atlas_collections', 'vertex_index_name') + backup_vertex_index_name = config.get('atlas_collections', 'backup_vertex_index_name') +@@ -1669,7 +1669,7 @@ + vertex_index_location=get_atlas_index_location(vertex_index_collection, config, options) + do_restore_request(options, accessor, parser, config, vertex_index_collection, backup_vertex_index_name, atlas_config_set, vertex_index_location, backup_vertex_index_shards, hdfs_base_path) + else: +- print "Collection '{0}' does not exist or filtered out. Skipping restore operation.".format(vertex_index_collection) ++ print("Collection '{}' does not exist or filtered out. Skipping restore operation.".format(vertex_index_collection)) + + def reload_collections(options, accessor, parser, config, service_filter): + collections_json_location = COLLECTIONS_DATA_JSON_LOCATION.format("reload_collections.json") +@@ -1681,35 +1681,35 @@ + solr_urls = get_solr_urls(options, config, backup_ranger_collection, collections_json_location) + retry(reload_collection, options, config, solr_urls, backup_ranger_collection, context="[Reload Solr Collections]") + else: +- print "Collection '{0}' does not exist or filtered out. Skipping reload operation.".format(backup_ranger_collection) ++ print("Collection '{}' does not exist or filtered out. Skipping reload operation.".format(backup_ranger_collection)) + if is_atlas_available(config, service_filter): + backup_fulltext_index_name = config.get('atlas_collections', 'backup_fulltext_index_name') + if backup_fulltext_index_name in collections: + solr_urls = get_solr_urls(options, config, backup_fulltext_index_name, collections_json_location) + retry(reload_collection, options, config, solr_urls, backup_fulltext_index_name, context="[Reload Solr Collections]") + else: +- print "Collection '{0}' does not exist or filtered out. Skipping reload operation.".format(backup_fulltext_index_name) ++ print("Collection '{}' does not exist or filtered out. Skipping reload operation.".format(backup_fulltext_index_name)) + backup_edge_index_name = config.get('atlas_collections', 'backup_edge_index_name') + if backup_edge_index_name in collections: + solr_urls = get_solr_urls(options, config, backup_edge_index_name, collections_json_location) + retry(reload_collection, options, config, solr_urls, backup_edge_index_name, context="[Reload Solr Collections]") + else: +- print "Collection '{0}' does not exist or filtered out. Skipping reload operation.".format(backup_edge_index_name) ++ print("Collection '{}' does not exist or filtered out. Skipping reload operation.".format(backup_edge_index_name)) + backup_vertex_index_name = config.get('atlas_collections', 'backup_vertex_index_name') + if backup_vertex_index_name in collections: + solr_urls = get_solr_urls(options, config, backup_vertex_index_name, collections_json_location) + retry(reload_collection, options, config, solr_urls, backup_vertex_index_name, context="[Reload Solr Collections]") + else: +- print "Collection '{0}' does not exist or filtered out. Skipping reload operation.".format(backup_fulltext_index_name) ++ print("Collection '{}' does not exist or filtered out. Skipping reload operation.".format(backup_fulltext_index_name)) + + def validate_ini_file(options, parser): + if options.ini_file is None: + parser.print_help() +- print 'ini-file option is missing' ++ print('ini-file option is missing') + sys.exit(1) + elif not os.path.isfile(options.ini_file): + parser.print_help() +- print 'ini file ({0}) does not exist'.format(options.ini_file) ++ print('ini file ({}) does not exist'.format(options.ini_file)) + sys.exit(1) + + def rolling_restart(options, accessor, parser, config, service_name, component_name, context): +@@ -1719,7 +1719,7 @@ + fault_tolerance = options.batch_fault_tolerance + request_body = create_batch_command("RESTART", component_hosts, cluster, service_name, component_name, interval_secs, fault_tolerance, "Rolling restart Infra Solr Instances") + post_json(accessor, BATCH_REQUEST_API_URL.format(cluster), request_body) +- print "{0} request sent. (check Ambari UI about the requests)".format(context) ++ print("{} request sent. (check Ambari UI about the requests)".format(context)) + + def update_state_jsons(options, accessor, parser, config, service_filter): + collections=list_collections(options, config, COLLECTIONS_DATA_JSON_LOCATION.format("collections.json")) +@@ -1730,26 +1730,26 @@ + if backup_ranger_collection in collections: + update_state_json(original_ranger_collection, backup_ranger_collection, config, options) + else: +- print "Collection '{0}' does not exist or filtered out. Skipping update collection state operation.".format(backup_ranger_collection) ++ print("Collection '{}' does not exist or filtered out. Skipping update collection state operation.".format(backup_ranger_collection)) + if is_atlas_available(config, service_filter): + original_fulltext_index_name = config.get('atlas_collections', 'fulltext_index_name') + backup_fulltext_index_name = config.get('atlas_collections', 'backup_fulltext_index_name') + if backup_fulltext_index_name in collections: + update_state_json(original_fulltext_index_name, backup_fulltext_index_name, config, options) + else: +- print "Collection '{0}' does not exist or filtered out. Skipping update collection state operation.".format(backup_fulltext_index_name) ++ print("Collection '{}' does not exist or filtered out. Skipping update collection state operation.".format(backup_fulltext_index_name)) + original_edge_index_name = config.get('atlas_collections', 'edge_index_name') + backup_edge_index_name = config.get('atlas_collections', 'backup_edge_index_name') + if backup_edge_index_name in collections: + update_state_json(original_edge_index_name, backup_edge_index_name, config, options) + else: +- print "Collection '{0}' does not exist or filtered out. Skipping update collection state operation.".format(backup_edge_index_name) ++ print("Collection '{}' does not exist or filtered out. Skipping update collection state operation.".format(backup_edge_index_name)) + original_vertex_index_name = config.get('atlas_collections', 'vertex_index_name') + backup_vertex_index_name = config.get('atlas_collections', 'backup_vertex_index_name') + if backup_vertex_index_name in collections: + update_state_json(original_vertex_index_name, backup_vertex_index_name, config, options) + else: +- print "Collection '{0}' does not exist or filtered out. Skipping update collection state operation.".format(backup_fulltext_index_name) ++ print("Collection '{}' does not exist or filtered out. Skipping update collection state operation.".format(backup_fulltext_index_name)) + + def set_solr_authorization(options, accessor, parser, config, enable_authorization, fix_kerberos_config = False): + solr_znode='/infra-solr' +@@ -1761,22 +1761,22 @@ + if kerberos_enabled == 'true': + infra_solr_props = get_infra_solr_props(config, accessor) + if enable_authorization: +- print "Enable Solr security.json management by Ambari ... " ++ print("Enable Solr security.json management by Ambari ... ") + set_solr_security_management(infra_solr_props, accessor, enable = False) + if fix_kerberos_config: + set_solr_name_rules(infra_solr_props, accessor, False) + else: +- print "Disable Solr authorization by uploading a new security.json and turn on security.json management by Ambari..." ++ print("Disable Solr authorization by uploading a new security.json and turn on security.json management by Ambari...") + set_solr_security_management(infra_solr_props, accessor, enable = True) + copy_znode(options, config, COLLECTIONS_DATA_JSON_LOCATION.format("security-without-authr.json"), +- "{0}/security.json".format(solr_znode), copy_from_local=True) ++ "{}/security.json".format(solr_znode), copy_from_local=True) + if fix_kerberos_config: + set_solr_name_rules(infra_solr_props, accessor, True) + else: + if fix_kerberos_config: +- print "Security is not enabled. Skipping enable/disable Solr authorization + fix infra-solr-env kerberos config operation." ++ print("Security is not enabled. Skipping enable/disable Solr authorization + fix infra-solr-env kerberos config operation.") + else: +- print "Security is not enabled. Skipping enable/disable Solr authorization operation." ++ print("Security is not enabled. Skipping enable/disable Solr authorization operation.") + + def summarize_shard_check_result(check_results, skip_warnings = False, skip_index_size = False): + warnings = 0 +@@ -1793,16 +1793,16 @@ + index_size_per_host[host]=host_index_size_map[host] + pass + if not skip_index_size and index_size_per_host: +- print "Full index size per hosts: (consider this for backup)" ++ print("Full index size per hosts: (consider this for backup)") + for host in index_size_per_host: +- print " - {0}: {1}".format(host, human_size(index_size_per_host[host])) ++ print(" - {}: {}".format(host, human_size(index_size_per_host[host]))) + +- print "All warnings: {0}".format(warnings) ++ print("All warnings: {}".format(warnings)) + if warnings != 0 and not skip_warnings: +- print "Check shards - {0}FAILED{1} (warnings: {2}, fix warnings or use --skip-warnings flag to PASS) ".format(colors.FAIL, colors.ENDC, warnings) ++ print("Check shards - {}FAILED{} (warnings: {}, fix warnings or use --skip-warnings flag to PASS) ".format(colors.FAIL, colors.ENDC, warnings)) + sys.exit(1) + else: +- print "Check shards - {0}PASSED{1}".format(colors.OKGREEN, colors.ENDC) ++ print("Check shards - {}PASSED{}".format(colors.OKGREEN, colors.ENDC)) + + def check_shards(options, accessor, parser, config, backup_shards = False): + collections=list_collections(options, config, COLLECTIONS_DATA_JSON_LOCATION.format("check_collections.json")) +@@ -1815,7 +1815,7 @@ + ranger_collection_details = check_shard_for_collection(config, ranger_collection, options.skip_index_size) + check_results[ranger_collection]=evaluate_check_shard_result(ranger_collection, ranger_collection_details, options.skip_index_size) + else: +- print "Collection '{0}' does not exist or filtered out. Skipping check collection operation.".format(ranger_collection) ++ print("Collection '{}' does not exist or filtered out. Skipping check collection operation.".format(ranger_collection)) + if is_atlas_available(config, service_filter): + fulltext_index_name = config.get('atlas_collections', 'backup_fulltext_index_name') if backup_shards \ + else config.get('atlas_collections', 'fulltext_index_name') +@@ -1823,32 +1823,32 @@ + fulltext_collection_details = check_shard_for_collection(config, fulltext_index_name, options.skip_index_size) + check_results[fulltext_index_name]=evaluate_check_shard_result(fulltext_index_name, fulltext_collection_details, options.skip_index_size) + else: +- print "Collection '{0}' does not exist or filtered out. Skipping check collection operation.".format(fulltext_index_name) ++ print("Collection '{}' does not exist or filtered out. Skipping check collection operation.".format(fulltext_index_name)) + edge_index_name = config.get('atlas_collections', 'backup_edge_index_name') if backup_shards \ + else config.get('atlas_collections', 'edge_index_name') + if edge_index_name in collections: + edge_collection_details = check_shard_for_collection(config, edge_index_name, options.skip_index_size) + check_results[edge_index_name]=evaluate_check_shard_result(edge_index_name, edge_collection_details, options.skip_index_size) + else: +- print "Collection '{0}' does not exist or filtered out. Skipping check collection operation.".format(edge_index_name) ++ print("Collection '{}' does not exist or filtered out. Skipping check collection operation.".format(edge_index_name)) + vertex_index_name = config.get('atlas_collections', 'backup_vertex_index_name') if backup_shards \ + else config.get('atlas_collections', 'vertex_index_name') + if vertex_index_name in collections: + vertex_collection_details = check_shard_for_collection(config, vertex_index_name, options.skip_index_size) + check_results[vertex_index_name]=evaluate_check_shard_result(vertex_index_name, vertex_collection_details, options.skip_index_size) + else: +- print "Collection '{0}' does not exist or filtered out. Skipping check collection operation.".format(fulltext_index_name) ++ print("Collection '{}' does not exist or filtered out. Skipping check collection operation.".format(fulltext_index_name)) + summarize_shard_check_result(check_results, options.skip_warnings, options.skip_index_size) + + def check_docs(options, accessor, parser, config): + collections=list_collections(options, config, COLLECTIONS_DATA_JSON_LOCATION.format("check_docs_collections.json"), include_number_of_docs=True) + if collections: +- print "Get the number of documents per collections ..." ++ print("Get the number of documents per collections ...") + docs_map = get_number_of_docs_map(COLLECTIONS_DATA_JSON_LOCATION.format("check_docs_collections.json")) + for collection_docs_data in docs_map: +- print "Collection: '{0}' - Number of docs: {1}".format(collection_docs_data, docs_map[collection_docs_data]) ++ print("Collection: '{}' - Number of docs: {}".format(collection_docs_data, docs_map[collection_docs_data])) + else: +- print "Check number of documents - Not found any collections." ++ print("Check number of documents - Not found any collections.") + + def run_solr_data_manager_on_collection(options, config, collections, src_collection, target_collection, + collections_json_location, num_docs, skip_date_usage = True): +@@ -1856,15 +1856,15 @@ + source_solr_urls = get_solr_urls(options, config, src_collection, collections_json_location) + target_solr_urls = get_solr_urls(options, config, target_collection, collections_json_location) + if is_collection_empty(num_docs, src_collection): +- print "Collection '{0}' is empty. Skipping transport data operation.".format(target_collection) ++ print("Collection '{}' is empty. Skipping transport data operation.".format(target_collection)) + else: + src_solr_url, target_solr_url = get_input_output_solr_url(source_solr_urls, target_solr_urls) + keytab, principal = get_keytab_and_principal(config) + date_format = "%Y-%m-%dT%H:%M:%S.%fZ" + d = datetime.now() + timedelta(days=365) + end = d.strftime(date_format) +- print "Running solrDataManager.py (solr input collection: {0}, solr output collection: {1})"\ +- .format(src_collection, target_collection) ++ print("Running solrDataManager.py (solr input collection: {}, solr output collection: {})"\ ++ .format(src_collection, target_collection)) + solr_data_manager.verbose = options.verbose + solr_data_manager.set_log_level(True) + solr_data_manager.save("archive", src_solr_url, src_collection, "evtTime", "id", end, +@@ -1873,7 +1873,7 @@ + None, None, None, None, None, target_collection, + target_solr_url, "_version_", skip_date_usage) + else: +- print "Collection '{0}' or {1} does not exist or filtered out. Skipping transport data operation.".format(target_collection, src_collection) ++ print("Collection '{}' or {} does not exist or filtered out. Skipping transport data operation.".format(target_collection, src_collection)) + + def transfer_old_data(options, accessor, parser, config): + collections_json_location = COLLECTIONS_DATA_JSON_LOCATION.format("transport_collections.json") +@@ -1946,11 +1946,11 @@ + set_log_level(options.verbose) + + if options.verbose: +- print "Run command with args: {0}".format(str(sys.argv)) ++ print("Run command with args: {}".format(str(sys.argv))) + + validate_ini_file(options, parser) + +- config = ConfigParser.RawConfigParser() ++ config = configparser.RawConfigParser() + config.read(options.ini_file) + + command_start_time = time.time() +@@ -1959,7 +1959,7 @@ + + if options.action is None: + parser.print_help() +- print 'action option is missing' ++ print('action option is missing') + sys.exit(1) + else: + if config.has_section('ambari_server'): +@@ -1974,8 +1974,8 @@ + local_host = socket.getfqdn() + solr_hosts = config.get('infra_solr', 'hosts') + if solr_hosts and local_host not in solr_hosts.split(","): +- print "{0}WARNING{1}: Host '{2}' is not found in Infra Solr hosts ({3}). Migration commands won't work from here." \ +- .format(colors.WARNING, colors.ENDC, local_host, solr_hosts) ++ print("{}WARNING{}: Host '{}' is not found in Infra Solr hosts ({}). Migration commands won't work from here." \ ++ .format(colors.WARNING, colors.ENDC, local_host, solr_hosts)) + if options.action.lower() == 'backup': + backup_ranger_configs(options, config, service_filter) + backup_collections(options, accessor, parser, config, service_filter) +@@ -2011,18 +2011,18 @@ + if is_logsearch_available(config, service_filter): + upgrade_logsearch_portal(options, accessor, parser, config) + else: +- print "LOGSEARCH service has not found in the config or filtered out." ++ print("LOGSEARCH service has not found in the config or filtered out.") + elif options.action.lower() == 'upgrade-logfeeders': + if is_logsearch_available(config, service_filter): + upgrade_logfeeders(options, accessor, parser, config) + else: +- print "LOGSEARCH service has not found in the config or filtered out." ++ print("LOGSEARCH service has not found in the config or filtered out.") + elif options.action.lower() == 'stop-logsearch': + if is_logsearch_available(config, service_filter): + service_components_command(options, accessor, parser, config, LOGSEARCH_SERVICE_NAME, LOGSEARCH_SERVER_COMPONENT_NAME, "STOP", "Stop") + service_components_command(options, accessor, parser, config, LOGSEARCH_SERVICE_NAME, LOGSEARCH_LOGFEEDER_COMPONENT_NAME, "STOP", "Stop") + else: +- print "LOGSEARCH service has not found in the config or filtered out." ++ print("LOGSEARCH service has not found in the config or filtered out.") + elif options.action.lower() == 'restart-solr': + service_components_command(options, accessor, parser, config, SOLR_SERVICE_NAME, SOLR_COMPONENT_NAME, "RESTART", "Restart") + elif options.action.lower() == 'restart-logsearch': +@@ -2030,27 +2030,27 @@ + service_components_command(options, accessor, parser, config, LOGSEARCH_SERVICE_NAME, LOGSEARCH_SERVER_COMPONENT_NAME, "RESTART", "Restart") + service_components_command(options, accessor, parser, config, LOGSEARCH_SERVICE_NAME, LOGSEARCH_LOGFEEDER_COMPONENT_NAME, "RESTART", "Restart") + else: +- print "LOGSEARCH service has not found in the config or filtered out." ++ print("LOGSEARCH service has not found in the config or filtered out.") + elif options.action.lower() == 'restart-atlas': + if is_atlas_available(config, service_filter): + service_components_command(options, accessor, parser, config, ATLAS_SERVICE_NAME, ATLAS_SERVER_COMPONENT_NAME, "RESTART", "Restart") + else: +- print "ATLAS service has not found in the config or filtered out." ++ print("ATLAS service has not found in the config or filtered out.") + elif options.action.lower() == 'restart-ranger': + if is_ranger_available(config, service_filter): + service_components_command(options, accessor, parser, config, RANGER_SERVICE_NAME, RANGER_ADMIN_COMPONENT_NAME, "RESTART", "Restart") + else: +- print "RANGER service has not found in the config or filtered out." ++ print("RANGER service has not found in the config or filtered out.") + elif options.action.lower() == 'rolling-restart-ranger': + if is_ranger_available(config, service_filter): + rolling_restart(options, accessor, parser, config, RANGER_SERVICE_NAME, RANGER_ADMIN_COMPONENT_NAME, "Rolling Restart Ranger Admin Instances") + else: +- print "RANGER service has not found in the config or filtered out." ++ print("RANGER service has not found in the config or filtered out.") + elif options.action.lower() == 'rolling-restart-atlas': + if is_atlas_available(config, service_filter): + rolling_restart(options, accessor, parser, config, ATLAS_SERVICE_NAME, ATLAS_SERVER_COMPONENT_NAME, "Rolling Restart Atlas Server Instances") + else: +- print "ATLAS service has not found in the config or filtered out." ++ print("ATLAS service has not found in the config or filtered out.") + elif options.action.lower() == 'rolling-restart-solr': + rolling_restart(options, accessor, parser, config, SOLR_SERVICE_NAME, SOLR_COMPONENT_NAME, "Rolling Restart Infra Solr Instances") + elif options.action.lower() == 'enable-solr-authorization': +@@ -2073,15 +2073,15 @@ + check_docs(options, accessor, parser, config) + else: + parser.print_help() +- print 'action option is invalid (available actions: delete-collections | backup | cleanup-znodes | backup-and-cleanup | migrate | restore |' \ ++ print('action option is invalid (available actions: delete-collections | backup | cleanup-znodes | backup-and-cleanup | migrate | restore |' \ + ' rolling-restart-solr | rolling-restart-ranger | rolling-restart-atlas | check-shards | check-backup-shards | check-docs | enable-solr-authorization |'\ + ' disable-solr-authorization | fix-solr5-kerberos-config | fix-solr7-kerberos-config | upgrade-solr-clients | upgrade-solr-instances | upgrade-logsearch-portal |' \ + ' upgrade-logfeeders | stop-logsearch | restart-solr |' \ +- ' restart-logsearch | restart-ranger | restart-atlas | transport-old-data )' ++ ' restart-logsearch | restart-ranger | restart-atlas | transport-old-data )') + sys.exit(1) + command_elapsed_time = time.time() - command_start_time + time_to_print = time.strftime("%H:%M:%S", time.gmtime(command_elapsed_time)) +- print 30 * "-" +- print "Command elapsed time: {0}".format(time_to_print) +- print 30 * "-" +- print "Migration helper command {0}FINISHED{1}".format(colors.OKGREEN, colors.ENDC) ++ print(30 * "-") ++ print("Command elapsed time: {}".format(time_to_print)) ++ print(30 * "-") ++ print("Migration helper command {}FINISHED{}".format(colors.OKGREEN, colors.ENDC)) +diff -Naur ambari-release-2.7.6-origin/ambari-infra/ambari-infra-solr-client/src/main/python/solrDataManager.py apache-ambari-2.7.6-change/ambari-infra/ambari-infra-solr-client/src/main/python/solrDataManager.py +--- ambari-release-2.7.6-origin/ambari-infra/ambari-infra-solr-client/src/main/python/solrDataManager.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-infra/ambari-infra-solr-client/src/main/python/solrDataManager.py 2022-07-11 00:52:29.000000000 +0800 +@@ -31,7 +31,7 @@ + import time + from datetime import datetime, timedelta + from subprocess import call, Popen, PIPE +-from urllib import quote, unquote ++from urllib.parse import quote, unquote + from zipfile import ZipFile, ZIP_DEFLATED + + VERSION = "1.0" +@@ -44,7 +44,7 @@ + verbose = False + + def parse_arguments(): +- parser = optparse.OptionParser("usage: %prog [options]", version="Solr Data Manager {0}".format(VERSION)) ++ parser = optparse.OptionParser("usage: %prog [options]", version="Solr Data Manager {}".format(VERSION)) + + parser.add_option("-m", "--mode", dest="mode", type="string", help="archive | delete | save") + parser.add_option("-s", "--solr-url", dest="solr_url", type="string", help="the url of the solr server including the port and protocol") +@@ -98,45 +98,45 @@ + + for r in ["mode", "solr_url", "collection"]: + if options.__dict__[r] is None: +- print "argument '{0}' is mandatory".format(r) ++ print("argument '{}' is mandatory".format(r)) + parser.print_help() + sys.exit() + + if not options.skip_date_usage: + if options.filter_field is None: +- print "argument 'filter_field' is mandatory" ++ print("argument 'filter_field' is mandatory") + parser.print_help() + sys.exit() + + mode_values = ["archive", "delete", "save"] + if options.mode not in mode_values: +- print "mode must be one of {0}".format(" | ".join(mode_values)) ++ print("mode must be one of {}".format(" | ".join(mode_values))) + parser.print_help() + sys.exit() + + if options.mode == "delete": + for r in ["name", "hdfs_keytab", "hdfs_principal", "hdfs_user", "hdfs_path", "key_file_path", "bucket", "key_prefix", "local_path"]: + if options.__dict__[r] is not None: +- print "argument '{0}' may not be specified in delete mode".format(r) ++ print("argument '{}' may not be specified in delete mode".format(r)) + parser.print_help() + sys.exit() + + if not options.skip_date_usage and options.__dict__["end"] is None and options.__dict__["days"] is None or \ + options.__dict__["end"] is not None and options.__dict__["days"] is not None: +- print "exactly one of 'end' or 'days' must be specfied" ++ print("exactly one of 'end' or 'days' must be specfied") + parser.print_help() + sys.exit() + + is_any_solr_kerberos_property = options.__dict__["solr_keytab"] is not None or options.__dict__["solr_principal"] is not None + is_all_solr_kerberos_property = options.__dict__["solr_keytab"] is not None and options.__dict__["solr_principal"] is not None + if is_any_solr_kerberos_property and not is_all_solr_kerberos_property: +- print "either both 'solr-keytab' and 'solr-principal' must be specfied, or neither of them" ++ print("either both 'solr-keytab' and 'solr-principal' must be specfied, or neither of them") + parser.print_help() + sys.exit() + + compression_values = ["none", "tar.gz", "tar.bz2", "zip", "gz"] + if options.compression not in compression_values: +- print "compression must be one of {0}".format(" | ".join(compression_values)) ++ print("compression must be one of {}".format(" | ".join(compression_values))) + parser.print_help() + sys.exit() + +@@ -145,14 +145,14 @@ + is_any_hdfs_kerberos_property = options.__dict__["hdfs_keytab"] is not None or options.__dict__["hdfs_principal"] is not None + is_all_hdfs_kerberos_property = options.__dict__["hdfs_keytab"] is not None and options.__dict__["hdfs_principal"] is not None + if is_any_hdfs_kerberos_property and not is_all_hdfs_kerberos_property: +- print "either both 'hdfs_keytab' and 'hdfs_principal' must be specfied, or neither of them" ++ print("either both 'hdfs_keytab' and 'hdfs_principal' must be specfied, or neither of them") + parser.print_help() + sys.exit() + + is_any_hdfs_property = options.__dict__["hdfs_user"] is not None or options.__dict__["hdfs_path"] is not None + is_all_hdfs_property = options.__dict__["hdfs_user"] is not None and options.__dict__["hdfs_path"] is not None + if is_any_hdfs_property and not is_all_hdfs_property: +- print "either both 'hdfs_user' and 'hdfs_path' must be specfied, or neither of them" ++ print("either both 'hdfs_user' and 'hdfs_path' must be specfied, or neither of them") + parser.print_help() + sys.exit() + +@@ -161,7 +161,7 @@ + is_all_s3_property = options.__dict__["key_file_path"] is not None and options.__dict__["bucket"] is not None and \ + options.__dict__["key_prefix"] is not None + if is_any_s3_property and not is_all_s3_property: +- print "either all the S3 arguments ('key_file_path', 'bucket', 'key_prefix') must be specfied, or none of them" ++ print("either all the S3 arguments ('key_file_path', 'bucket', 'key_prefix') must be specfied, or none of them") + parser.print_help() + sys.exit() + +@@ -169,70 +169,70 @@ + count = (1 if is_any_solr_output_property else 0) + (1 if is_any_hdfs_property else 0) + \ + (1 if is_any_s3_property else 0) + (1 if options.__dict__["local_path"] is not None else 0) + if count != 1: +- print "exactly one of the HDFS arguments ('hdfs_user', 'hdfs_path') or the S3 arguments ('key_file_path', 'bucket', 'key_prefix') or the solr arguments ('solr_output_collection') or the 'local_path' argument must be specified" ++ print("exactly one of the HDFS arguments ('hdfs_user', 'hdfs_path') or the S3 arguments ('key_file_path', 'bucket', 'key_prefix') or the solr arguments ('solr_output_collection') or the 'local_path' argument must be specified") + parser.print_help() + sys.exit() + + if options.__dict__["hdfs_keytab"] is not None and options.__dict__["hdfs_user"] is None: +- print "HDFS kerberos keytab and principal may only be specified if the upload target is HDFS" ++ print("HDFS kerberos keytab and principal may only be specified if the upload target is HDFS") + parser.print_help() + sys.exit() + +- print("You are running Solr Data Manager {0} with arguments:".format(VERSION)) +- print(" mode: " + options.mode) +- print(" solr-url: " + options.solr_url) +- print(" collection: " + options.collection) ++ print(("You are running Solr Data Manager {} with arguments:".format(VERSION))) ++ print((" mode: " + options.mode)) ++ print((" solr-url: " + options.solr_url)) ++ print((" collection: " + options.collection)) + if options.__dict__["filter_field"] is not None: +- print(" filter-field: " + options.filter_field) ++ print((" filter-field: " + options.filter_field)) + if options.mode in ["archive", "save"]: +- print(" id-field: " + options.id_field) ++ print((" id-field: " + options.id_field)) + if options.__dict__["exclude_fields"] is not None: +- print(" exclude fields: " + options.exclude_fields) ++ print((" exclude fields: " + options.exclude_fields)) + if options.__dict__["end"] is not None: +- print(" end: " + options.end) ++ print((" end: " + options.end)) + else: +- print(" days: " + str(options.days)) +- print(" date-format: " + options.date_format) ++ print((" days: " + str(options.days))) ++ print((" date-format: " + options.date_format)) + if options.__dict__["additional_filter"] is not None: +- print(" additional-filter: " + str(options.additional_filter)) ++ print((" additional-filter: " + str(options.additional_filter))) + if options.__dict__["name"] is not None: +- print(" name: " + str(options.name)) ++ print((" name: " + str(options.name))) + if options.mode in ["archive", "save"]: +- print(" read-block-size: " + str(options.read_block_size)) +- print(" write-block-size: " + str(options.write_block_size)) +- print(" ignore-unfinished-uploading: " + str(options.ignore_unfinished_uploading)) ++ print((" read-block-size: " + str(options.read_block_size))) ++ print((" write-block-size: " + str(options.write_block_size))) ++ print((" ignore-unfinished-uploading: " + str(options.ignore_unfinished_uploading))) + if (options.__dict__["solr_keytab"] is not None): +- print(" solr-keytab: " + options.solr_keytab) +- print(" solr-principal: " + options.solr_principal) ++ print((" solr-keytab: " + options.solr_keytab)) ++ print((" solr-principal: " + options.solr_principal)) + if options.mode in ["archive", "save"]: +- print(" output: " + ("json" if options.json_file else "line-delimited-json")) +- print(" compression: " + options.compression) ++ print((" output: " + ("json" if options.json_file else "line-delimited-json"))) ++ print((" compression: " + options.compression)) + if options.__dict__["solr_output_collection"] is not None: +- print(" solr output collection: " + options.solr_output_collection) ++ print((" solr output collection: " + options.solr_output_collection)) + if options.__dict__["solr_output_url"] is not None: +- print(" solr output url: " + options.solr_output_collection) ++ print((" solr output url: " + options.solr_output_collection)) + if (options.__dict__["hdfs_keytab"] is not None): +- print(" hdfs-keytab: " + options.hdfs_keytab) +- print(" hdfs-principal: " + options.hdfs_principal) ++ print((" hdfs-keytab: " + options.hdfs_keytab)) ++ print((" hdfs-principal: " + options.hdfs_principal)) + if (options.__dict__["hdfs_user"] is not None): +- print(" hdfs-user: " + options.hdfs_user) +- print(" hdfs-path: " + options.hdfs_path) ++ print((" hdfs-user: " + options.hdfs_user)) ++ print((" hdfs-path: " + options.hdfs_path)) + if (options.__dict__["key_file_path"] is not None): +- print(" key-file-path: " + options.key_file_path) +- print(" bucket: " + options.bucket) +- print(" key-prefix: " + options.key_prefix) ++ print((" key-file-path: " + options.key_file_path)) ++ print((" bucket: " + options.bucket)) ++ print((" key-prefix: " + options.key_prefix)) + if (options.__dict__["local_path"] is not None): +- print(" local-path: " + options.local_path) +- print (" skip-date-usage: " + str(options.skip_date_usage)) +- print(" verbose: " + str(options.verbose)) +- print ++ print((" local-path: " + options.local_path)) ++ print((" skip-date-usage: " + str(options.skip_date_usage))) ++ print((" verbose: " + str(options.verbose))) ++ print() + + if options.__dict__["additional_filter"] is not None and options.__dict__["name"] is None: + go = False + while not go: + sys.stdout.write("It is recommended to set --name in case of any additional filter is set.\n") + sys.stdout.write("Are you sure that you want to proceed without a name (yes/no)? ") +- choice = raw_input().lower() ++ choice = input().lower() + if choice in ['yes', 'ye', 'y']: + go = True + elif choice in ['no', 'n']: +@@ -261,18 +261,18 @@ + logger.info("Deleting data where %s <= %s", filter_field, end) + solr_kinit_command = None + if solr_keytab: +- solr_kinit_command = "kinit -kt {0} {1}".format(solr_keytab, solr_principal) ++ solr_kinit_command = "kinit -kt {} {}".format(solr_keytab, solr_principal) + curl_prefix = "curl -k --negotiate -u : " + else: + curl_prefix = "curl -k" + if skip_date_usage: + delete_query = "*:*" + else: +- delete_query = "{0}:[* TO \"{1}\"]".format(filter_field, end) +- delete_command = "{0}/{1}/update?commit=true&wt=json".format(solr_url, collection) +- delete_data = "{0}".format(delete_query) ++ delete_query = "{}:[* TO \"{}\"]".format(filter_field, end) ++ delete_command = "{}/{}/update?commit=true&wt=json".format(solr_url, collection) ++ delete_data = "{}".format(delete_query) + +- query_solr(solr_kinit_command, delete_command, "{0} -H Content-Type:text/xml {1}".format(curl_prefix, delete_command), "Deleting", delete_data) ++ query_solr(solr_kinit_command, delete_command, "{} -H Content-Type:text/xml {}".format(curl_prefix, delete_command), "Deleting", delete_data) + + def save(mode, solr_url, collection, filter_field, id_field, range_end, read_block_size, write_block_size, + ignore_unfinished_uploading, additional_filter, name, solr_keytab, solr_principal, json_file, +@@ -280,14 +280,14 @@ + solr_output_collection, solr_output_url, exclude_fields, skip_date_usage): + solr_kinit_command = None + if solr_keytab: +- solr_kinit_command = "kinit -kt {0} {1}".format(solr_keytab, solr_principal) ++ solr_kinit_command = "kinit -kt {} {}".format(solr_keytab, solr_principal) + curl_prefix = "curl -k --negotiate -u : " + else: + curl_prefix = "curl -k" + + hdfs_kinit_command = None + if hdfs_keytab: +- hdfs_kinit_command = "sudo -u {0} kinit -kt {1} {2}".format(hdfs_user, hdfs_keytab, hdfs_principal) ++ hdfs_kinit_command = "sudo -u {} kinit -kt {} {}".format(hdfs_user, hdfs_keytab, hdfs_principal) + + if hdfs_path: + ensure_hdfs_path(hdfs_kinit_command, hdfs_user, hdfs_path) +@@ -307,17 +307,17 @@ + run_kinit(hdfs_kinit_command, "HDFS") + + try: +- hdfs_create_dir_command = "sudo -u {0} hadoop fs -mkdir -p {1}".format(hdfs_user, hdfs_path) ++ hdfs_create_dir_command = "sudo -u {} hadoop fs -mkdir -p {}".format(hdfs_user, hdfs_path) + logger.debug("Ensuring that the HDFS path %s exists:\n%s", hdfs_path, hdfs_create_dir_command) + result = call(hdfs_create_dir_command.split()) + except Exception as e: +- print ++ print() + logger.warn("Could not execute hdfs ensure dir command:\n%s", hdfs_create_dir_command) + logger.warn(str(e)) + sys.exit() + + if result != 0: +- print ++ print() + logger.warn("Could not ensure HDFS dir command:\n%s", hdfs_create_dir_command) + logger.warn(str(err)) + sys.exit() +@@ -327,7 +327,7 @@ + md5.update(solr_url) + md5.update(collection) + hash = md5.hexdigest() +- working_dir = "/tmp/solrDataManager/{0}".format(hash) ++ working_dir = "/tmp/solrDataManager/{}".format(hash) + + if not(os.path.isdir(working_dir)): + os.makedirs(working_dir) +@@ -336,17 +336,17 @@ + return working_dir + + def handle_unfinished_uploading(solr_kinit_command, hdfs_kinit_command, curl_prefix, working_dir, ignore_unfinished_uploading, skip_date_usage): +- command_json_path = "{0}/command.json".format(working_dir) ++ command_json_path = "{}/command.json".format(working_dir) + if os.path.isfile(command_json_path): + with open(command_json_path) as command_file: + command = json.load(command_file) + +- if "upload" in command.keys() and ignore_unfinished_uploading: ++ if "upload" in list(command.keys()) and ignore_unfinished_uploading: + logger.info("Ignoring unfinished uploading left by previous run") + os.remove(command_json_path) + return + +- if "upload" in command.keys(): ++ if "upload" in list(command.keys()): + logger.info("Previous run has left unfinished uploading") + logger.info("You may try to run the program with '-g' or '--ignore-unfinished-uploading' to ignore it if it keeps on failing") + +@@ -365,7 +365,7 @@ + logger.warn("Unknown upload type: %s", command["upload"]["type"]) + sys.exit() + +- if "delete" in command.keys(): ++ if "delete" in list(command.keys()): + delete_data(solr_kinit_command, curl_prefix, command["delete"]["command"], command["delete"]["collection"], + command["delete"]["filter_field"], command["delete"]["id_field"], command["delete"]["prev_lot_end_value"], + command["delete"]["prev_lot_end_id"], skip_date_usage) +@@ -378,25 +378,25 @@ + solr_output_url, exclude_fields, skip_date_usage): + logger.info("Starting to save data") + +- tmp_file_path = "{0}/tmp.json".format(working_dir) ++ tmp_file_path = "{}/tmp.json".format(working_dir) + + prev_lot_end_value = None + prev_lot_end_id = None + + if skip_date_usage: + if additional_filter: +- q = quote("*:*+AND+{0}".format(additional_filter), safe="/+\"*") ++ q = quote("*:*+AND+{}".format(additional_filter), safe="/+\"*") + else: + q = quote("*:*", safe="/+\"*") +- sort = quote("{0}+asc".format(id_field), safe="/+\"*") ++ sort = quote("{}+asc".format(id_field), safe="/+\"*") + else: + if additional_filter: +- q = quote("{0}+AND+{1}:[*+TO+\"{2}\"]".format(additional_filter, filter_field, range_end), safe="/+\"*") ++ q = quote("{}+AND+{}:[*+TO+\"{}\"]".format(additional_filter, filter_field, range_end), safe="/+\"*") + else: +- q = quote("{0}:[*+TO+\"{1}\"]".format(filter_field, range_end), safe="/+\"*") +- sort = quote("{0}+asc,{1}+asc".format(filter_field, id_field), safe="/+\"*") ++ q = quote("{}:[*+TO+\"{}\"]".format(filter_field, range_end), safe="/+\"*") ++ sort = quote("{}+asc,{}+asc".format(filter_field, id_field), safe="/+\"*") + +- solr_query_url_prefix = "{0}/{1}/select?q={2}&sort={3}&rows={4}&wt=json".format(solr_url, collection, q, sort, read_block_size) ++ solr_query_url_prefix = "{}/{}/select?q={}&sort={}&rows={}&wt=json".format(solr_url, collection, q, sort, read_block_size) + + exclude_field_list = exclude_fields.split(',') if exclude_fields else None + if solr_output_collection and not exclude_field_list: +@@ -435,21 +435,21 @@ + if skip_date_usage: + if prev_lot_end_id: + fq = "({0}:{{\"{1}\"+TO+*])".format(id_field, prev_lot_end_id) +- url = "{0}&fq={1}".format(solr_query_url_prefix, quote(fq, safe="/+\"*")) ++ url = "{}&fq={}".format(solr_query_url_prefix, quote(fq, safe="/+\"*")) + else: +- url = "{0}".format(solr_query_url_prefix) ++ url = "{}".format(solr_query_url_prefix) + else: + if prev_lot_end_value: + fq_prev_end_rest = "({0}:\"{1}\"+AND+{2}:{{\"{3}\"+TO+*])".format(filter_field, prev_lot_end_value, id_field, + prev_lot_end_id) + fq_new = "{0}:{{\"{1}\"+TO+\"{2}\"]".format(filter_field, prev_lot_end_value, range_end) +- fq = "{0}+OR+{1}".format(fq_prev_end_rest, fq_new) ++ fq = "{}+OR+{}".format(fq_prev_end_rest, fq_new) + else: +- fq = "{0}:[*+TO+\"{1}\"]".format(filter_field, range_end) ++ fq = "{}:[*+TO+\"{}\"]".format(filter_field, range_end) + +- url = "{0}&fq={1}".format(solr_query_url_prefix, quote(fq, safe="/+\"*")) ++ url = "{}&fq={}".format(solr_query_url_prefix, quote(fq, safe="/+\"*")) + +- curl_command = "{0} {1}".format(curl_prefix, url) ++ curl_command = "{} {}".format(curl_prefix, url) + + rsp = query_solr(solr_kinit_command, url, curl_command, "Obtaining") + +@@ -466,10 +466,10 @@ + + prev_lot_end_value = last_doc[filter_field] if not skip_date_usage else prev_lot_end_value + prev_lot_end_id = last_doc[id_field] +- sys.stdout.write("\r{0} records are written".format(records)) ++ sys.stdout.write("\r{} records are written".format(records)) + sys.stdout.flush() + if verbose and records < write_block_size: +- print ++ print() + logger.debug("Collecting next lot of data") + + finish_file(tmp_file, json_file) +@@ -503,9 +503,9 @@ + key_file_path, bucket, key_prefix, local_path, compression, solr_output_collection, solr_output_url, + skip_date_usage): + if name: +- file_name = "{0}_-_{1}_-_{2}_-_{3}".format(collection, name, prev_lot_end_value, prev_lot_end_id).replace(':', '_') ++ file_name = "{}_-_{}_-_{}_-_{}".format(collection, name, prev_lot_end_value, prev_lot_end_id).replace(':', '_') + else: +- file_name = "{0}_-_{1}_-_{2}".format(collection, prev_lot_end_value, prev_lot_end_id).replace(':', '_') ++ file_name = "{}_-_{}_-_{}".format(collection, prev_lot_end_value, prev_lot_end_id).replace(':', '_') + + upload_file_path = compress_file(working_dir, tmp_file_path, file_name, compression) + +@@ -531,33 +531,33 @@ + if mode == "archive": + delete_data(solr_kinit_command, curl_prefix, delete_command, collection, filter_field, id_field, prev_lot_end_value, + prev_lot_end_id, skip_date_usage) +- os.remove("{0}/command.json".format(working_dir)) ++ os.remove("{}/command.json".format(working_dir)) + + def compress_file(working_dir, tmp_file_path, file_name, compression): +- data_file_name = "{0}.json".format(file_name) ++ data_file_name = "{}.json".format(file_name) + if compression == "none": +- upload_file_path = "{0}/{1}.json".format(working_dir, file_name) ++ upload_file_path = "{}/{}.json".format(working_dir, file_name) + os.rename(tmp_file_path, upload_file_path) + elif compression == "tar.gz": +- upload_file_path = "{0}/{1}.json.tar.gz".format(working_dir, file_name) ++ upload_file_path = "{}/{}.json.tar.gz".format(working_dir, file_name) + tar = tarfile.open(upload_file_path, mode="w:gz") + try: + tar.add(tmp_file_path, arcname=data_file_name) + finally: + tar.close() + elif compression == "tar.bz2": +- upload_file_path = "{0}/{1}.json.tar.bz2".format(working_dir, file_name) ++ upload_file_path = "{}/{}.json.tar.bz2".format(working_dir, file_name) + tar = tarfile.open(upload_file_path, mode="w:bz2") + try: + tar.add(tmp_file_path, arcname=data_file_name) + finally: + tar.close() + elif compression == "zip": +- upload_file_path = "{0}/{1}.json.zip".format(working_dir, file_name) ++ upload_file_path = "{}/{}.json.zip".format(working_dir, file_name) + zip = ZipFile(upload_file_path, 'w') + zip.write(tmp_file_path, data_file_name, ZIP_DEFLATED) + elif compression == "gz": +- upload_file_path = "{0}/{1}.json.gz".format(working_dir, file_name) ++ upload_file_path = "{}/{}.json.gz".format(working_dir, file_name) + gz = gzip.open(upload_file_path, mode="wb") + f = open(tmp_file_path) + try: +@@ -587,7 +587,7 @@ + if upload: + if solr_output_collection: + command_url = solr_output_url if solr_output_url else solr_url +- upload_command = "{0}/{1}/update/json/docs?commit=true&wt=json --data-binary @{2}"\ ++ upload_command = "{}/{}/update/json/docs?commit=true&wt=json --data-binary @{}"\ + .format(command_url, solr_output_collection, upload_file_path) + upload_command_data = {} + upload_command_data["type"] = "solr" +@@ -596,7 +596,7 @@ + upload_command_data["solr_output_collection"] = solr_output_collection + commands["upload"] = upload_command_data + elif hdfs_path: +- upload_command = "sudo -u {0} hadoop fs -put {1} {2}".format(hdfs_user, upload_file_path, hdfs_path) ++ upload_command = "sudo -u {} hadoop fs -put {} {}".format(hdfs_user, upload_file_path, hdfs_path) + upload_command_data = {} + upload_command_data["type"] = "hdfs" + upload_command_data["command"] = upload_command +@@ -605,7 +605,7 @@ + upload_command_data["hdfs_user"] = hdfs_user + commands["upload"] = upload_command_data + elif key_file_path: +- upload_command = "java -cp {0}/libs/* org.apache.ambari.infra.solr.S3Uploader {1} {2} {3} {4}".format( \ ++ upload_command = "java -cp {}/libs/* org.apache.ambari.infra.solr.S3Uploader {} {} {} {}".format( \ + os.path.dirname(os.path.realpath(__file__)), key_file_path, bucket, key_prefix, upload_file_path) + upload_command_data = {} + upload_command_data["type"] = "s3" +@@ -615,7 +615,7 @@ + upload_command_data["key_prefix"] = key_prefix + commands["upload"] = upload_command_data + elif local_path: +- upload_command = "mv {0} {1}".format(upload_file_path, local_path) ++ upload_command = "mv {} {}".format(upload_file_path, local_path) + upload_command_data = {} + upload_command_data["type"] = "local" + upload_command_data["command"] = upload_command +@@ -630,13 +630,13 @@ + return upload_command + + if skip_date_usage: +- delete_query = "({0}:[*+TO+\"{1}\"])".format(id_field, prev_lot_end_id) ++ delete_query = "({}:[*+TO+\"{}\"])".format(id_field, prev_lot_end_id) + else: +- delete_prev = "{0}:[*+TO+\"{1}\"]".format(filter_field, prev_lot_end_value) +- delete_last = "({0}:\"{1}\"+AND+{2}:[*+TO+\"{3}\"])".format(filter_field, prev_lot_end_value, id_field, prev_lot_end_id) +- delete_query = "{0}+OR+{1}".format(delete_prev, delete_last) ++ delete_prev = "{}:[*+TO+\"{}\"]".format(filter_field, prev_lot_end_value) ++ delete_last = "({}:\"{}\"+AND+{}:[*+TO+\"{}\"])".format(filter_field, prev_lot_end_value, id_field, prev_lot_end_id) ++ delete_query = "{}+OR+{}".format(delete_prev, delete_last) + +- delete_command = "{0}/{1}/update?commit=true&wt=json --data-binary {2}" \ ++ delete_command = "{}/{}/update?commit=true&wt=json --data-binary {}" \ + .format(solr_url, collection, delete_query) + if mode == "save": + return delete_command +@@ -650,8 +650,8 @@ + delete_command_data["prev_lot_end_id"] = prev_lot_end_id + commands["delete"] = delete_command_data + +- command_file_path = "{0}/command.json".format(working_dir) +- command_file_path_tmp = "{0}.tmp".format(command_file_path) ++ command_file_path = "{}/command.json".format(working_dir) ++ command_file_path_tmp = "{}.tmp".format(command_file_path) + cft = open(command_file_path_tmp, 'w') + cft.write(json.dumps(commands, indent=4)) + os.rename(command_file_path_tmp, command_file_path) +@@ -668,11 +668,11 @@ + run_kinit(hdfs_kinit_command, "HDFS") + + try: +- hdfs_file_exists_command = "sudo -u {0} hadoop fs -test -e {1}".format(hdfs_user, hdfs_path + os.path.basename(upload_file_path)) ++ hdfs_file_exists_command = "sudo -u {} hadoop fs -test -e {}".format(hdfs_user, hdfs_path + os.path.basename(upload_file_path)) + logger.debug("Checking if file already exists on hdfs:\n%s", hdfs_file_exists_command) + hdfs_file_exists = (0 == call(hdfs_file_exists_command.split())) + except Exception as e: +- print ++ print() + logger.warn("Could not execute command to check if file already exists on HDFS:\n%s", hdfs_file_exists_command) + logger.warn(str(e)) + sys.exit() +@@ -682,7 +682,7 @@ + logger.debug("Uploading file to hdfs:\n%s", upload_command) + result = call(upload_command.split()) + except Exception as e: +- print ++ print() + logger.warn("Could not execute command to upload file to HDFS:\n%s", upload_command) + logger.warn(str(e)) + sys.exit() +@@ -700,7 +700,7 @@ + logger.debug("Uploading file to s3:\n%s", upload_command) + result = call(upload_command.split()) + except Exception as e: +- print ++ print() + logger.warn("Could not execute command to upload file to S3:\n%s", upload_command) + logger.warn(str(e)) + sys.exit() +@@ -725,21 +725,21 @@ + call(upload_command.split()) + logger.info("File %s was moved to local directory %s", os.path.basename(upload_file_path), local_path) + except Exception as e: +- print ++ print() + logger.warn("Could not execute move command command:\n%s", upload_command) + logger.warn(str(e)) + sys.exit() + + def upload_file_to_solr(solr_kinit_command, curl_prefix, upload_command, upload_file_path, collection): + if os.path.isfile(upload_file_path): +- query_solr(solr_kinit_command, upload_command, "{0} -H Content-type:application/json {1}".format(curl_prefix, upload_command), "Saving") ++ query_solr(solr_kinit_command, upload_command, "{} -H Content-type:application/json {}".format(curl_prefix, upload_command), "Saving") + logger.info("Save data to collection: %s", collection) + + def delete_data(solr_kinit_command, curl_prefix, delete_command, collection, filter_field, id_field, prev_lot_end_value, + prev_lot_end_id, skip_date_usage): + delete_cmd = delete_command.split(" --data-binary")[0] + delete_query_data = delete_command.split("--data-binary ")[1].replace("+", " ") +- query_solr(solr_kinit_command, delete_cmd, "{0} -H Content-Type:text/xml {1}".format(curl_prefix, delete_cmd), "Deleting", delete_query_data) ++ query_solr(solr_kinit_command, delete_cmd, "{} -H Content-Type:text/xml {}".format(curl_prefix, delete_cmd), "Deleting", delete_query_data) + if skip_date_usage: + logger.info("Deleted data from collection %s where %s < %s", collection, id_field, prev_lot_end_id) + else: +@@ -758,14 +758,14 @@ + logger.debug("%s data from solr:\n%s", action, ' '.join(cmd)) + process = Popen(cmd, stdin=PIPE, stdout=PIPE, stderr=PIPE) + except Exception as e: +- print ++ print() + logger.warn("Could not execute curl command:\n%s", ' '.join(cmd)) + logger.warn(str(e)) + sys.exit() + + out, err = process.communicate() + if process.returncode != 0: +- print ++ print() + logger.warn("Could not execute curl command:\n%s", ' '.join(cmd)) + logger.warn(str(err)) + sys.exit() +@@ -773,7 +773,7 @@ + true = True # needed to be able to eval 'true' in the returned json + rsp = eval(str(out)) + if rsp["responseHeader"]["status"] != 0: +- print ++ print() + logger.warn("Could not execute solr query:\n%s", unquote(url)) + logger.warn(rsp["error"]["msg"]) + sys.exit() +@@ -785,13 +785,13 @@ + logger.debug("Running kinit for %s:\n%s", program, kinit_command) + result = call(kinit_command.split()) + except Exception as e: +- print ++ print() + logger.warn("Could not execute %s kinit command:\n%s", program, kinit_command) + logger.warn(str(e)) + sys.exit() + + if result != 0: +- print ++ print() + logger.warn("%s kinit command was not successful:\n%s", program, kinit_command) + sys.exit() + +@@ -817,7 +817,7 @@ + else: + logger.warn("Unknown mode: %s", options.mode) + +- print("--- %s seconds ---" % (time.time() - start_time)) ++ print(("--- %s seconds ---" % (time.time() - start_time))) + except KeyboardInterrupt: +- print ++ print() + sys.exit(128 + signal.SIGINT) +diff -Naur ambari-release-2.7.6-origin/ambari-infra/ambari-infra-solr-plugin/.gitignore apache-ambari-2.7.6-change/ambari-infra/ambari-infra-solr-plugin/.gitignore +--- ambari-release-2.7.6-origin/ambari-infra/ambari-infra-solr-plugin/.gitignore 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-infra/ambari-infra-solr-plugin/.gitignore 1970-01-01 08:00:00.000000000 +0800 +@@ -1,3 +0,0 @@ +-Profile +-.env +-ambari-infra-solr-*.rpm +\ 文件尾没有换行符 +diff -Naur ambari-release-2.7.6-origin/ambari-infra/.gitignore apache-ambari-2.7.6-change/ambari-infra/.gitignore +--- ambari-release-2.7.6-origin/ambari-infra/.gitignore 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-infra/.gitignore 1970-01-01 08:00:00.000000000 +0800 +@@ -1,6 +0,0 @@ +-target +-.settings +-.classpath +-.project +-/bin/ +-job-repository.db +\ 文件尾没有换行符 +diff -Naur ambari-release-2.7.6-origin/ambari-infra/pom.xml apache-ambari-2.7.6-change/ambari-infra/pom.xml +--- ambari-release-2.7.6-origin/ambari-infra/pom.xml 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-infra/pom.xml 2022-07-11 23:49:26.000000000 +0800 +@@ -33,7 +33,7 @@ + ${deb.python.ver} + 3.0.0 + -Xmx1024m -Xms512m +- 3.4.6.2.3.0.0-2557 ++ 3.4.6 + false + 2.11.0 + +diff -Naur ambari-release-2.7.6-origin/ambari-logsearch/ambari-logsearch-appender/.gitignore apache-ambari-2.7.6-change/ambari-logsearch/ambari-logsearch-appender/.gitignore +--- ambari-release-2.7.6-origin/ambari-logsearch/ambari-logsearch-appender/.gitignore 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-logsearch/ambari-logsearch-appender/.gitignore 1970-01-01 08:00:00.000000000 +0800 +@@ -1,2 +0,0 @@ +-logs/* +-target +diff -Naur ambari-release-2.7.6-origin/ambari-logsearch/ambari-logsearch-config-api/.gitignore apache-ambari-2.7.6-change/ambari-logsearch/ambari-logsearch-config-api/.gitignore +--- ambari-release-2.7.6-origin/ambari-logsearch/ambari-logsearch-config-api/.gitignore 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-logsearch/ambari-logsearch-config-api/.gitignore 1970-01-01 08:00:00.000000000 +0800 +@@ -1 +0,0 @@ +-/bin/ +diff -Naur ambari-release-2.7.6-origin/ambari-logsearch/ambari-logsearch-config-zookeeper/.gitignore apache-ambari-2.7.6-change/ambari-logsearch/ambari-logsearch-config-zookeeper/.gitignore +--- ambari-release-2.7.6-origin/ambari-logsearch/ambari-logsearch-config-zookeeper/.gitignore 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-logsearch/ambari-logsearch-config-zookeeper/.gitignore 1970-01-01 08:00:00.000000000 +0800 +@@ -1 +0,0 @@ +-/bin/ +diff -Naur ambari-release-2.7.6-origin/ambari-logsearch/ambari-logsearch-logfeeder/.gitignore apache-ambari-2.7.6-change/ambari-logsearch/ambari-logsearch-logfeeder/.gitignore +--- ambari-release-2.7.6-origin/ambari-logsearch/ambari-logsearch-logfeeder/.gitignore 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-logsearch/ambari-logsearch-logfeeder/.gitignore 1970-01-01 08:00:00.000000000 +0800 +@@ -1 +0,0 @@ +-*.pid +\ 文件尾没有换行符 +diff -Naur ambari-release-2.7.6-origin/ambari-logsearch/ambari-logsearch-logfeeder/src/main/resources/log-samples/.gitignore apache-ambari-2.7.6-change/ambari-logsearch/ambari-logsearch-logfeeder/src/main/resources/log-samples/.gitignore +--- ambari-release-2.7.6-origin/ambari-logsearch/ambari-logsearch-logfeeder/src/main/resources/log-samples/.gitignore 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-logsearch/ambari-logsearch-logfeeder/src/main/resources/log-samples/.gitignore 1970-01-01 08:00:00.000000000 +0800 +@@ -1,4 +0,0 @@ +-logs/*.log +-shipper-conf/input.config-*.json +-!shipper-conf/input.config-sample.json +- +diff -Naur ambari-release-2.7.6-origin/ambari-logsearch/ambari-logsearch-server/.gitignore apache-ambari-2.7.6-change/ambari-logsearch/ambari-logsearch-server/.gitignore +--- ambari-release-2.7.6-origin/ambari-logsearch/ambari-logsearch-server/.gitignore 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-logsearch/ambari-logsearch-server/.gitignore 1970-01-01 08:00:00.000000000 +0800 +@@ -1,10 +0,0 @@ +-target +-.settings +-.classpath +-.project +-/bin/ +-node_modules/ +-logs/ +-node/ +-*.pid +- +diff -Naur ambari-release-2.7.6-origin/ambari-logsearch/ambari-logsearch-web/.gitignore apache-ambari-2.7.6-change/ambari-logsearch/ambari-logsearch-web/.gitignore +--- ambari-release-2.7.6-origin/ambari-logsearch/ambari-logsearch-web/.gitignore 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-logsearch/ambari-logsearch-web/.gitignore 1970-01-01 08:00:00.000000000 +0800 +@@ -1,45 +0,0 @@ +-# See http://help.github.com/ignore-files/ for more about ignoring files. +- +-# compiled output +-/dist +-/tmp +-/out-tsc +- +-# dependencies +-/node_modules +- +-# IDEs and editors +-/.idea +-.project +-.classpath +-.c9/ +-*.launch +-.settings/ +-*.sublime-workspace +- +-# IDE - VSCode +-.vscode/* +-!.vscode/settings.json +-!.vscode/tasks.json +-!.vscode/launch.json +-!.vscode/extensions.json +- +-# misc +-/.sass-cache +-/connect.lock +-/coverage +-/libpeerconnection.log +-npm-debug.log +-testem.log +-/typings +- +-# e2e +-/e2e/*.js +-/e2e/*.map +- +-# System Files +-.DS_Store +-Thumbs.db +- +-# Development Test Files +-webpack.config.dev.js +diff -Naur ambari-release-2.7.6-origin/ambari-logsearch/ambari-logsearch-web/package.json apache-ambari-2.7.6-change/ambari-logsearch/ambari-logsearch-web/package.json +--- ambari-release-2.7.6-origin/ambari-logsearch/ambari-logsearch-web/package.json 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-logsearch/ambari-logsearch-web/package.json 2022-07-14 16:06:38.000000000 +0800 +@@ -72,7 +72,6 @@ + "karma-coverage-istanbul-reporter": "^0.2.0", + "karma-jasmine": "~1.1.0", + "karma-jasmine-html-reporter": "^0.2.2", +- "karma-phantomjs-launcher": "^1.0.4", + "less-loader": "^4.0.5", + "postcss-loader": "^1.3.3", + "postcss-url": "^5.1.2", +diff -Naur ambari-release-2.7.6-origin/ambari-logsearch/ambari-logsearch-web/yarn.lock apache-ambari-2.7.6-change/ambari-logsearch/ambari-logsearch-web/yarn.lock +--- ambari-release-2.7.6-origin/ambari-logsearch/ambari-logsearch-web/yarn.lock 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-logsearch/ambari-logsearch-web/yarn.lock 2022-07-11 20:00:40.000000000 +0800 +@@ -4,7 +4,7 @@ + + "@angular-devkit/build-optimizer@~0.0.18": + version "0.0.18" +- resolved "https://registry.yarnpkg.com/@angular-devkit/build-optimizer/-/build-optimizer-0.0.18.tgz#bdf507a37403b07fc72437d792d4e2541b0f13ec" ++ resolved "https://repo.huaweicloud.com/repository/npm/@angular-devkit/build-optimizer/-/build-optimizer-0.0.18.tgz#bdf507a37403b07fc72437d792d4e2541b0f13ec" + dependencies: + loader-utils "^1.1.0" + source-map "^0.5.6" +@@ -12,11 +12,11 @@ + + "@angular-devkit/core@0.0.12": + version "0.0.12" +- resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-0.0.12.tgz#bf044c8ed38b8e2ec2648bbc6fd0d92be99112da" ++ resolved "https://repo.huaweicloud.com/repository/npm/@angular-devkit/core/-/core-0.0.12.tgz#bf044c8ed38b8e2ec2648bbc6fd0d92be99112da" + + "@angular-devkit/schematics@~0.0.21": + version "0.0.21" +- resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-0.0.21.tgz#ea4b3b6ce8fc86f50de9df3402a039469369a7eb" ++ resolved "https://repo.huaweicloud.com/repository/npm/@angular-devkit/schematics/-/schematics-0.0.21.tgz#ea4b3b6ce8fc86f50de9df3402a039469369a7eb" + dependencies: + "@angular-devkit/core" "0.0.12" + "@ngtools/json-schema" "^1.1.0" +@@ -25,13 +25,13 @@ + + "@angular/animations@^4.0.0": + version "4.4.6" +- resolved "https://registry.yarnpkg.com/@angular/animations/-/animations-4.4.6.tgz#fa661899a8a4e38cb7c583c7a5c97ce65d592a35" ++ resolved "https://repo.huaweicloud.com/repository/npm/@angular/animations/-/animations-4.4.6.tgz#fa661899a8a4e38cb7c583c7a5c97ce65d592a35" + dependencies: + tslib "^1.7.1" + + "@angular/cli@^1.4.3": + version "1.4.3" +- resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-1.4.3.tgz#8389d4eeadfe34abb1d16e53836416a8f8430fb3" ++ resolved "https://repo.huaweicloud.com/repository/npm/@angular/cli/-/cli-1.4.3.tgz#8389d4eeadfe34abb1d16e53836416a8f8430fb3" + dependencies: + "@angular-devkit/build-optimizer" "~0.0.18" + "@angular-devkit/schematics" "~0.0.21" +@@ -94,13 +94,13 @@ + + "@angular/common@^4.0.0": + version "4.4.3" +- resolved "https://registry.yarnpkg.com/@angular/common/-/common-4.4.3.tgz#f92ac68b02bec5f0e6d3603a843294dc96c96074" ++ resolved "https://repo.huaweicloud.com/repository/npm/@angular/common/-/common-4.4.3.tgz#f92ac68b02bec5f0e6d3603a843294dc96c96074" + dependencies: + tslib "^1.7.1" + + "@angular/compiler-cli@^4.0.0": + version "4.4.3" +- resolved "https://registry.yarnpkg.com/@angular/compiler-cli/-/compiler-cli-4.4.3.tgz#183af81f141186b8d660b06429592d40b7540a4a" ++ resolved "https://repo.huaweicloud.com/repository/npm/@angular/compiler-cli/-/compiler-cli-4.4.3.tgz#183af81f141186b8d660b06429592d40b7540a4a" + dependencies: + "@angular/tsc-wrapped" "4.4.3" + minimist "^1.2.0" +@@ -108,71 +108,71 @@ + + "@angular/compiler@^4.0.0": + version "4.4.3" +- resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-4.4.3.tgz#8f01163dad7db3408497d99d387554b6b185ad66" ++ resolved "https://repo.huaweicloud.com/repository/npm/@angular/compiler/-/compiler-4.4.3.tgz#8f01163dad7db3408497d99d387554b6b185ad66" + dependencies: + tslib "^1.7.1" + + "@angular/core@^4.0.0": + version "4.4.3" +- resolved "https://registry.yarnpkg.com/@angular/core/-/core-4.4.3.tgz#e71d2b07beaacbab48ab7f51d4e2286ea5d70e15" ++ resolved "https://repo.huaweicloud.com/repository/npm/@angular/core/-/core-4.4.3.tgz#e71d2b07beaacbab48ab7f51d4e2286ea5d70e15" + dependencies: + tslib "^1.7.1" + + "@angular/forms@^4.0.0": + version "4.4.3" +- resolved "https://registry.yarnpkg.com/@angular/forms/-/forms-4.4.3.tgz#25b41bbab58bf1da872411c8517c10d7c5373d8e" ++ resolved "https://repo.huaweicloud.com/repository/npm/@angular/forms/-/forms-4.4.3.tgz#25b41bbab58bf1da872411c8517c10d7c5373d8e" + dependencies: + tslib "^1.7.1" + + "@angular/http@^4.0.0": + version "4.4.3" +- resolved "https://registry.yarnpkg.com/@angular/http/-/http-4.4.3.tgz#b557ed24144aacc44b136cd477e84d2f57808903" ++ resolved "https://repo.huaweicloud.com/repository/npm/@angular/http/-/http-4.4.3.tgz#b557ed24144aacc44b136cd477e84d2f57808903" + dependencies: + tslib "^1.7.1" + + "@angular/platform-browser-dynamic@^4.0.0": + version "4.4.3" +- resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-4.4.3.tgz#e41ddd8252432775310eab5940cdd8df0618f084" ++ resolved "https://repo.huaweicloud.com/repository/npm/@angular/platform-browser-dynamic/-/platform-browser-dynamic-4.4.3.tgz#e41ddd8252432775310eab5940cdd8df0618f084" + dependencies: + tslib "^1.7.1" + + "@angular/platform-browser@^4.0.0": + version "4.4.3" +- resolved "https://registry.yarnpkg.com/@angular/platform-browser/-/platform-browser-4.4.3.tgz#23f9a45bd3dc7f44d97877fbf8e6032decfc9dcb" ++ resolved "https://repo.huaweicloud.com/repository/npm/@angular/platform-browser/-/platform-browser-4.4.3.tgz#23f9a45bd3dc7f44d97877fbf8e6032decfc9dcb" + dependencies: + tslib "^1.7.1" + + "@angular/router@^4.0.0": + version "4.4.3" +- resolved "https://registry.yarnpkg.com/@angular/router/-/router-4.4.3.tgz#26cc94775a3860946aeaf1c2e8f60f4d44e90991" ++ resolved "https://repo.huaweicloud.com/repository/npm/@angular/router/-/router-4.4.3.tgz#26cc94775a3860946aeaf1c2e8f60f4d44e90991" + dependencies: + tslib "^1.7.1" + + "@angular/tsc-wrapped@4.4.3": + version "4.4.3" +- resolved "https://registry.yarnpkg.com/@angular/tsc-wrapped/-/tsc-wrapped-4.4.3.tgz#2d3f38210a1d4db03fc86dcf1e095812b85cd119" ++ resolved "https://repo.huaweicloud.com/repository/npm/@angular/tsc-wrapped/-/tsc-wrapped-4.4.3.tgz#2d3f38210a1d4db03fc86dcf1e095812b85cd119" + dependencies: + tsickle "^0.21.0" + + "@ngrx/core@^1.2.0": + version "1.2.0" +- resolved "https://registry.yarnpkg.com/@ngrx/core/-/core-1.2.0.tgz#882b46abafa2e0e6d887cb71a1b2c2fa3e6d0dc6" ++ resolved "https://repo.huaweicloud.com/repository/npm/@ngrx/core/-/core-1.2.0.tgz#882b46abafa2e0e6d887cb71a1b2c2fa3e6d0dc6" + + "@ngrx/store-devtools@3.2.4": + version "3.2.4" +- resolved "https://registry.yarnpkg.com/@ngrx/store-devtools/-/store-devtools-3.2.4.tgz#2ce4d13bf34848a9e51ec87e3b125ed67b51e550" ++ resolved "https://repo.huaweicloud.com/repository/npm/@ngrx/store-devtools/-/store-devtools-3.2.4.tgz#2ce4d13bf34848a9e51ec87e3b125ed67b51e550" + + "@ngrx/store@^2.2.3": + version "2.2.3" +- resolved "https://registry.yarnpkg.com/@ngrx/store/-/store-2.2.3.tgz#e7bd1149f1c44208f1cc4744353f0f98a0f1f57b" ++ resolved "https://repo.huaweicloud.com/repository/npm/@ngrx/store/-/store-2.2.3.tgz#e7bd1149f1c44208f1cc4744353f0f98a0f1f57b" + + "@ngtools/json-schema@1.1.0", "@ngtools/json-schema@^1.1.0": + version "1.1.0" +- resolved "https://registry.yarnpkg.com/@ngtools/json-schema/-/json-schema-1.1.0.tgz#c3a0c544d62392acc2813a42c8a0dc6f58f86922" ++ resolved "https://repo.huaweicloud.com/repository/npm/@ngtools/json-schema/-/json-schema-1.1.0.tgz#c3a0c544d62392acc2813a42c8a0dc6f58f86922" + + "@ngtools/webpack@1.7.1", "@ngtools/webpack@^1.7.1": + version "1.7.1" +- resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-1.7.1.tgz#383ddd689845cf42fc755975f6440f75535f5016" ++ resolved "https://repo.huaweicloud.com/repository/npm/@ngtools/webpack/-/webpack-1.7.1.tgz#383ddd689845cf42fc755975f6440f75535f5016" + dependencies: + enhanced-resolve "^3.1.0" + loader-utils "^1.0.2" +@@ -181,164 +181,164 @@ + + "@ngx-translate/core@^6.0.1": + version "6.0.1" +- resolved "https://registry.yarnpkg.com/@ngx-translate/core/-/core-6.0.1.tgz#7c7a80077feb994fc815b67a72065af04d394efe" ++ resolved "https://repo.huaweicloud.com/repository/npm/@ngx-translate/core/-/core-6.0.1.tgz#7c7a80077feb994fc815b67a72065af04d394efe" + + "@ngx-translate/http-loader@^0.0.3": + version "0.0.3" +- resolved "https://registry.yarnpkg.com/@ngx-translate/http-loader/-/http-loader-0.0.3.tgz#8346c8d2d6f630254601029668f17abe2afe8a9b" ++ resolved "https://repo.huaweicloud.com/repository/npm/@ngx-translate/http-loader/-/http-loader-0.0.3.tgz#8346c8d2d6f630254601029668f17abe2afe8a9b" + + "@schematics/angular@~0.0.30": + version "0.0.33" +- resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-0.0.33.tgz#bc0b28356af46fe9ec64495588ee61503fd34ce5" ++ resolved "https://repo.huaweicloud.com/repository/npm/@schematics/angular/-/angular-0.0.33.tgz#bc0b28356af46fe9ec64495588ee61503fd34ce5" + + "@types/d3-array@*": + version "1.2.0" +- resolved "https://registry.yarnpkg.com/@types/d3-array/-/d3-array-1.2.0.tgz#9b1fc3202fc1a9f7da0f2873bd38b443137a9d34" ++ resolved "https://repo.huaweicloud.com/repository/npm/@types/d3-array/-/d3-array-1.2.0.tgz#9b1fc3202fc1a9f7da0f2873bd38b443137a9d34" + + "@types/d3-axis@*": + version "1.0.9" +- resolved "https://registry.yarnpkg.com/@types/d3-axis/-/d3-axis-1.0.9.tgz#62ce7bc8d04354298cda57f3f1d1f856ad69b89a" ++ resolved "https://repo.huaweicloud.com/repository/npm/@types/d3-axis/-/d3-axis-1.0.9.tgz#62ce7bc8d04354298cda57f3f1d1f856ad69b89a" + dependencies: + "@types/d3-selection" "*" + + "@types/d3-brush@*": + version "1.0.7" +- resolved "https://registry.yarnpkg.com/@types/d3-brush/-/d3-brush-1.0.7.tgz#05c30440f4d537fd23f976b0e6c4ba223001ef45" ++ resolved "https://repo.huaweicloud.com/repository/npm/@types/d3-brush/-/d3-brush-1.0.7.tgz#05c30440f4d537fd23f976b0e6c4ba223001ef45" + dependencies: + "@types/d3-selection" "*" + + "@types/d3-chord@*": + version "1.0.6" +- resolved "https://registry.yarnpkg.com/@types/d3-chord/-/d3-chord-1.0.6.tgz#0589eb97a3191f4edaf17b7bde498462890ce1ec" ++ resolved "https://repo.huaweicloud.com/repository/npm/@types/d3-chord/-/d3-chord-1.0.6.tgz#0589eb97a3191f4edaf17b7bde498462890ce1ec" + + "@types/d3-collection@*": + version "1.0.5" +- resolved "https://registry.yarnpkg.com/@types/d3-collection/-/d3-collection-1.0.5.tgz#bb1f3aa97cdc8d881645541b9d6cf87edfee9bc3" ++ resolved "https://repo.huaweicloud.com/repository/npm/@types/d3-collection/-/d3-collection-1.0.5.tgz#bb1f3aa97cdc8d881645541b9d6cf87edfee9bc3" + + "@types/d3-color@*": + version "1.0.5" +- resolved "https://registry.yarnpkg.com/@types/d3-color/-/d3-color-1.0.5.tgz#cad755f0fc6de7b70fa6e5e08afa81ef4c2248de" ++ resolved "https://repo.huaweicloud.com/repository/npm/@types/d3-color/-/d3-color-1.0.5.tgz#cad755f0fc6de7b70fa6e5e08afa81ef4c2248de" + + "@types/d3-dispatch@*": + version "1.0.5" +- resolved "https://registry.yarnpkg.com/@types/d3-dispatch/-/d3-dispatch-1.0.5.tgz#f1f9187b538ecb05157569d8dc2f70dfb04f1b52" ++ resolved "https://repo.huaweicloud.com/repository/npm/@types/d3-dispatch/-/d3-dispatch-1.0.5.tgz#f1f9187b538ecb05157569d8dc2f70dfb04f1b52" + + "@types/d3-drag@*": + version "1.1.0" +- resolved "https://registry.yarnpkg.com/@types/d3-drag/-/d3-drag-1.1.0.tgz#9105e35ca58aa0c4783f3ce83082bcb24ccb6960" ++ resolved "https://repo.huaweicloud.com/repository/npm/@types/d3-drag/-/d3-drag-1.1.0.tgz#9105e35ca58aa0c4783f3ce83082bcb24ccb6960" + dependencies: + "@types/d3-selection" "*" + + "@types/d3-dsv@*": + version "1.0.30" +- resolved "https://registry.yarnpkg.com/@types/d3-dsv/-/d3-dsv-1.0.30.tgz#78e0dddde4283566f463e51551a97a63c170d5a8" ++ resolved "https://repo.huaweicloud.com/repository/npm/@types/d3-dsv/-/d3-dsv-1.0.30.tgz#78e0dddde4283566f463e51551a97a63c170d5a8" + + "@types/d3-ease@*": + version "1.0.7" +- resolved "https://registry.yarnpkg.com/@types/d3-ease/-/d3-ease-1.0.7.tgz#93a301868be9e15061f3d44343b1ab3f8acb6f09" ++ resolved "https://repo.huaweicloud.com/repository/npm/@types/d3-ease/-/d3-ease-1.0.7.tgz#93a301868be9e15061f3d44343b1ab3f8acb6f09" + + "@types/d3-force@*": + version "1.0.7" +- resolved "https://registry.yarnpkg.com/@types/d3-force/-/d3-force-1.0.7.tgz#8e3c533697143ebb70275d56840206e8ba789185" ++ resolved "https://repo.huaweicloud.com/repository/npm/@types/d3-force/-/d3-force-1.0.7.tgz#8e3c533697143ebb70275d56840206e8ba789185" + + "@types/d3-format@*": + version "1.2.0" +- resolved "https://registry.yarnpkg.com/@types/d3-format/-/d3-format-1.2.0.tgz#3e128efc9e6dd09df8fd21f1d981ab68e140a8a2" ++ resolved "https://repo.huaweicloud.com/repository/npm/@types/d3-format/-/d3-format-1.2.0.tgz#3e128efc9e6dd09df8fd21f1d981ab68e140a8a2" + + "@types/d3-geo@*": + version "1.6.3" +- resolved "https://registry.yarnpkg.com/@types/d3-geo/-/d3-geo-1.6.3.tgz#21b501d1fe224d88877f39f84cb8c9dd8aa1bf28" ++ resolved "https://repo.huaweicloud.com/repository/npm/@types/d3-geo/-/d3-geo-1.6.3.tgz#21b501d1fe224d88877f39f84cb8c9dd8aa1bf28" + dependencies: + "@types/geojson" "*" + + "@types/d3-hierarchy@*": + version "1.1.0" +- resolved "https://registry.yarnpkg.com/@types/d3-hierarchy/-/d3-hierarchy-1.1.0.tgz#50f1ee052840638035cbdd4acab1fc3470905907" ++ resolved "https://repo.huaweicloud.com/repository/npm/@types/d3-hierarchy/-/d3-hierarchy-1.1.0.tgz#50f1ee052840638035cbdd4acab1fc3470905907" + + "@types/d3-interpolate@*": + version "1.1.6" +- resolved "https://registry.yarnpkg.com/@types/d3-interpolate/-/d3-interpolate-1.1.6.tgz#64041b15c9c032c348da1b22baabc59fa4d16136" ++ resolved "https://repo.huaweicloud.com/repository/npm/@types/d3-interpolate/-/d3-interpolate-1.1.6.tgz#64041b15c9c032c348da1b22baabc59fa4d16136" + dependencies: + "@types/d3-color" "*" + + "@types/d3-path@*": + version "1.0.6" +- resolved "https://registry.yarnpkg.com/@types/d3-path/-/d3-path-1.0.6.tgz#c1a7d2dc07b295fdd1c84dabe4404df991b48693" ++ resolved "https://repo.huaweicloud.com/repository/npm/@types/d3-path/-/d3-path-1.0.6.tgz#c1a7d2dc07b295fdd1c84dabe4404df991b48693" + + "@types/d3-polygon@*": + version "1.0.5" +- resolved "https://registry.yarnpkg.com/@types/d3-polygon/-/d3-polygon-1.0.5.tgz#35ad54ed84c39d7e9f1252b6535be600be6cace2" ++ resolved "https://repo.huaweicloud.com/repository/npm/@types/d3-polygon/-/d3-polygon-1.0.5.tgz#35ad54ed84c39d7e9f1252b6535be600be6cace2" + + "@types/d3-quadtree@*": + version "1.0.5" +- resolved "https://registry.yarnpkg.com/@types/d3-quadtree/-/d3-quadtree-1.0.5.tgz#1ce1e659eae4530df0cb127f297f1741a367a82e" ++ resolved "https://repo.huaweicloud.com/repository/npm/@types/d3-quadtree/-/d3-quadtree-1.0.5.tgz#1ce1e659eae4530df0cb127f297f1741a367a82e" + + "@types/d3-queue@*": + version "3.0.5" +- resolved "https://registry.yarnpkg.com/@types/d3-queue/-/d3-queue-3.0.5.tgz#3e4cbe2aff61db6a0b2b8c4800299e4ec6acc850" ++ resolved "https://repo.huaweicloud.com/repository/npm/@types/d3-queue/-/d3-queue-3.0.5.tgz#3e4cbe2aff61db6a0b2b8c4800299e4ec6acc850" + + "@types/d3-random@*": + version "1.1.0" +- resolved "https://registry.yarnpkg.com/@types/d3-random/-/d3-random-1.1.0.tgz#2dd08f1159c70719270e4a7c834af85c8b88d2c3" ++ resolved "https://repo.huaweicloud.com/repository/npm/@types/d3-random/-/d3-random-1.1.0.tgz#2dd08f1159c70719270e4a7c834af85c8b88d2c3" + + "@types/d3-request@*": + version "1.0.2" +- resolved "https://registry.yarnpkg.com/@types/d3-request/-/d3-request-1.0.2.tgz#db9db8154f47816584706c6e6f702be66f22f4be" ++ resolved "https://repo.huaweicloud.com/repository/npm/@types/d3-request/-/d3-request-1.0.2.tgz#db9db8154f47816584706c6e6f702be66f22f4be" + dependencies: + "@types/d3-dsv" "*" + + "@types/d3-scale-chromatic@^1.1.0": + version "1.1.0" +- resolved "https://registry.yarnpkg.com/@types/d3-scale-chromatic/-/d3-scale-chromatic-1.1.0.tgz#6a5033ed1b89b7bad38f5f085a4f16695f07fdf0" ++ resolved "https://repo.huaweicloud.com/repository/npm/@types/d3-scale-chromatic/-/d3-scale-chromatic-1.1.0.tgz#6a5033ed1b89b7bad38f5f085a4f16695f07fdf0" + + "@types/d3-scale@*": + version "1.0.10" +- resolved "https://registry.yarnpkg.com/@types/d3-scale/-/d3-scale-1.0.10.tgz#8c5c1dca54a159eed042b46719dbb3bdb7e8c842" ++ resolved "https://repo.huaweicloud.com/repository/npm/@types/d3-scale/-/d3-scale-1.0.10.tgz#8c5c1dca54a159eed042b46719dbb3bdb7e8c842" + dependencies: + "@types/d3-time" "*" + + "@types/d3-selection@*": + version "1.1.0" +- resolved "https://registry.yarnpkg.com/@types/d3-selection/-/d3-selection-1.1.0.tgz#59b88f10d2cff7d9ffd7fe986b3aaef3de048224" ++ resolved "https://repo.huaweicloud.com/repository/npm/@types/d3-selection/-/d3-selection-1.1.0.tgz#59b88f10d2cff7d9ffd7fe986b3aaef3de048224" + + "@types/d3-shape@*": + version "1.2.1" +- resolved "https://registry.yarnpkg.com/@types/d3-shape/-/d3-shape-1.2.1.tgz#cac2d9f0122f173220c32c8c152dc42ee9349df2" ++ resolved "https://repo.huaweicloud.com/repository/npm/@types/d3-shape/-/d3-shape-1.2.1.tgz#cac2d9f0122f173220c32c8c152dc42ee9349df2" + dependencies: + "@types/d3-path" "*" + + "@types/d3-time-format@*": + version "2.0.5" +- resolved "https://registry.yarnpkg.com/@types/d3-time-format/-/d3-time-format-2.0.5.tgz#1d4c5ba77ed5352b10c7fce062c883382f1e16e0" ++ resolved "https://repo.huaweicloud.com/repository/npm/@types/d3-time-format/-/d3-time-format-2.0.5.tgz#1d4c5ba77ed5352b10c7fce062c883382f1e16e0" + + "@types/d3-time@*": + version "1.0.7" +- resolved "https://registry.yarnpkg.com/@types/d3-time/-/d3-time-1.0.7.tgz#4266d7c9be15fa81256a88d1d052d61cd8dc572c" ++ resolved "https://repo.huaweicloud.com/repository/npm/@types/d3-time/-/d3-time-1.0.7.tgz#4266d7c9be15fa81256a88d1d052d61cd8dc572c" + + "@types/d3-timer@*": + version "1.0.6" +- resolved "https://registry.yarnpkg.com/@types/d3-timer/-/d3-timer-1.0.6.tgz#786d4e20731adf03af2c5df6c86fe29667fe429b" ++ resolved "https://repo.huaweicloud.com/repository/npm/@types/d3-timer/-/d3-timer-1.0.6.tgz#786d4e20731adf03af2c5df6c86fe29667fe429b" + + "@types/d3-transition@*": + version "1.1.0" +- resolved "https://registry.yarnpkg.com/@types/d3-transition/-/d3-transition-1.1.0.tgz#74475d4a8f8a0944a517d5ef861970cc30287e40" ++ resolved "https://repo.huaweicloud.com/repository/npm/@types/d3-transition/-/d3-transition-1.1.0.tgz#74475d4a8f8a0944a517d5ef861970cc30287e40" + dependencies: + "@types/d3-selection" "*" + + "@types/d3-voronoi@*": + version "1.1.6" +- resolved "https://registry.yarnpkg.com/@types/d3-voronoi/-/d3-voronoi-1.1.6.tgz#b52252c1d61972e7c751135890aea112d5dadc6d" ++ resolved "https://repo.huaweicloud.com/repository/npm/@types/d3-voronoi/-/d3-voronoi-1.1.6.tgz#b52252c1d61972e7c751135890aea112d5dadc6d" + + "@types/d3-zoom@*": + version "1.5.0" +- resolved "https://registry.yarnpkg.com/@types/d3-zoom/-/d3-zoom-1.5.0.tgz#21f690b25a8419fd1bcc95ac629cefdfb462c70f" ++ resolved "https://repo.huaweicloud.com/repository/npm/@types/d3-zoom/-/d3-zoom-1.5.0.tgz#21f690b25a8419fd1bcc95ac629cefdfb462c70f" + dependencies: + "@types/d3-interpolate" "*" + "@types/d3-selection" "*" + + "@types/d3@^4.10.0": + version "4.10.1" +- resolved "https://registry.yarnpkg.com/@types/d3/-/d3-4.10.1.tgz#a888ac8780ac241d770b2025b3d7e379c4d417f0" ++ resolved "https://repo.huaweicloud.com/repository/npm/@types/d3/-/d3-4.10.1.tgz#a888ac8780ac241d770b2025b3d7e379c4d417f0" + dependencies: + "@types/d3-array" "*" + "@types/d3-axis" "*" +@@ -373,109 +373,109 @@ + + "@types/geojson@*": + version "1.0.2" +- resolved "https://registry.yarnpkg.com/@types/geojson/-/geojson-1.0.2.tgz#b02d10ab028e2928ac592a051aaa4981a1941d03" ++ resolved "https://repo.huaweicloud.com/repository/npm/@types/geojson/-/geojson-1.0.2.tgz#b02d10ab028e2928ac592a051aaa4981a1941d03" + + "@types/jasmine@2.5.38": + version "2.5.38" +- resolved "https://registry.yarnpkg.com/@types/jasmine/-/jasmine-2.5.38.tgz#a4379124c4921d4e21de54ec74669c9e9b356717" ++ resolved "https://repo.huaweicloud.com/repository/npm/@types/jasmine/-/jasmine-2.5.38.tgz#a4379124c4921d4e21de54ec74669c9e9b356717" + + "@types/jquery@^1.10.33": + version "1.10.33" +- resolved "https://registry.yarnpkg.com/@types/jquery/-/jquery-1.10.33.tgz#6c4c279f8d06839b184950432e880e0a469a64a1" ++ resolved "https://repo.huaweicloud.com/repository/npm/@types/jquery/-/jquery-1.10.33.tgz#6c4c279f8d06839b184950432e880e0a469a64a1" + + "@types/moment-timezone@^0.2.34": + version "0.2.35" +- resolved "https://registry.yarnpkg.com/@types/moment-timezone/-/moment-timezone-0.2.35.tgz#3fbbcb035e66aa5589a9198a6eec8d4dd9a701a5" ++ resolved "https://repo.huaweicloud.com/repository/npm/@types/moment-timezone/-/moment-timezone-0.2.35.tgz#3fbbcb035e66aa5589a9198a6eec8d4dd9a701a5" + dependencies: + moment ">=2.14.0" + + "@types/moment@^2.13.0": + version "2.13.0" +- resolved "https://registry.yarnpkg.com/@types/moment/-/moment-2.13.0.tgz#604ebd189bc3bc34a1548689404e61a2a4aac896" ++ resolved "https://repo.huaweicloud.com/repository/npm/@types/moment/-/moment-2.13.0.tgz#604ebd189bc3bc34a1548689404e61a2a4aac896" + dependencies: + moment "*" + + "@types/node@^6.0.46": + version "6.0.73" +- resolved "https://registry.yarnpkg.com/@types/node/-/node-6.0.73.tgz#85dc4bb6f125377c75ddd2519a1eeb63f0a4ed70" ++ resolved "https://repo.huaweicloud.com/repository/npm/@types/node/-/node-6.0.73.tgz#85dc4bb6f125377c75ddd2519a1eeb63f0a4ed70" + + "@types/node@~6.0.60": + version "6.0.88" +- resolved "https://registry.yarnpkg.com/@types/node/-/node-6.0.88.tgz#f618f11a944f6a18d92b5c472028728a3e3d4b66" ++ resolved "https://repo.huaweicloud.com/repository/npm/@types/node/-/node-6.0.88.tgz#f618f11a944f6a18d92b5c472028728a3e3d4b66" + + "@types/q@^0.0.32": + version "0.0.32" +- resolved "https://registry.yarnpkg.com/@types/q/-/q-0.0.32.tgz#bd284e57c84f1325da702babfc82a5328190c0c5" ++ resolved "https://repo.huaweicloud.com/repository/npm/@types/q/-/q-0.0.32.tgz#bd284e57c84f1325da702babfc82a5328190c0c5" + + "@types/selenium-webdriver@^2.53.35", "@types/selenium-webdriver@~2.53.39": + version "2.53.42" +- resolved "https://registry.yarnpkg.com/@types/selenium-webdriver/-/selenium-webdriver-2.53.42.tgz#74cb77fb6052edaff2a8984ddafd88d419f25cac" ++ resolved "https://repo.huaweicloud.com/repository/npm/@types/selenium-webdriver/-/selenium-webdriver-2.53.42.tgz#74cb77fb6052edaff2a8984ddafd88d419f25cac" + + abbrev@1: + version "1.1.0" +- resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.0.tgz#d0554c2256636e2f56e7c2e5ad183f859428d81f" ++ resolved "https://repo.huaweicloud.com/repository/npm/abbrev/-/abbrev-1.1.0.tgz#d0554c2256636e2f56e7c2e5ad183f859428d81f" + + accepts@1.3.3: + version "1.3.3" +- resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.3.tgz#c3ca7434938648c3e0d9c1e328dd68b622c284ca" ++ resolved "https://repo.huaweicloud.com/repository/npm/accepts/-/accepts-1.3.3.tgz#c3ca7434938648c3e0d9c1e328dd68b622c284ca" + dependencies: + mime-types "~2.1.11" + negotiator "0.6.1" + + accepts@~1.3.3: + version "1.3.4" +- resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.4.tgz#86246758c7dd6d21a6474ff084a4740ec05eb21f" ++ resolved "https://repo.huaweicloud.com/repository/npm/accepts/-/accepts-1.3.4.tgz#86246758c7dd6d21a6474ff084a4740ec05eb21f" + dependencies: + mime-types "~2.1.16" + negotiator "0.6.1" + + acorn-dynamic-import@^2.0.0: + version "2.0.2" +- resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz#c752bd210bef679501b6c6cb7fc84f8f47158cc4" ++ resolved "https://repo.huaweicloud.com/repository/npm/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz#c752bd210bef679501b6c6cb7fc84f8f47158cc4" + dependencies: + acorn "^4.0.3" + + acorn@^4.0.3: + version "4.0.13" +- resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" ++ resolved "https://repo.huaweicloud.com/repository/npm/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" + + acorn@^5.0.0: + version "5.1.2" +- resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.1.2.tgz#911cb53e036807cf0fa778dc5d370fbd864246d7" ++ resolved "https://repo.huaweicloud.com/repository/npm/acorn/-/acorn-5.1.2.tgz#911cb53e036807cf0fa778dc5d370fbd864246d7" + + adm-zip@0.4.4: + version "0.4.4" +- resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.4.tgz#a61ed5ae6905c3aea58b3a657d25033091052736" ++ resolved "https://repo.huaweicloud.com/repository/npm/adm-zip/-/adm-zip-0.4.4.tgz#a61ed5ae6905c3aea58b3a657d25033091052736" + + adm-zip@^0.4.7: + version "0.4.7" +- resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.7.tgz#8606c2cbf1c426ce8c8ec00174447fd49b6eafc1" ++ resolved "https://repo.huaweicloud.com/repository/npm/adm-zip/-/adm-zip-0.4.7.tgz#8606c2cbf1c426ce8c8ec00174447fd49b6eafc1" + + after@0.8.2: + version "0.8.2" +- resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f" ++ resolved "https://repo.huaweicloud.com/repository/npm/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f" + + agent-base@2: + version "2.1.0" +- resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-2.1.0.tgz#193455e4347bca6b05847cb81e939bb325446da8" ++ resolved "https://repo.huaweicloud.com/repository/npm/agent-base/-/agent-base-2.1.0.tgz#193455e4347bca6b05847cb81e939bb325446da8" + dependencies: + extend "~3.0.0" + semver "~5.0.1" + + ajv-keywords@^2.0.0: + version "2.1.0" +- resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.0.tgz#a296e17f7bfae7c1ce4f7e0de53d29cb32162df0" ++ resolved "https://repo.huaweicloud.com/repository/npm/ajv-keywords/-/ajv-keywords-2.1.0.tgz#a296e17f7bfae7c1ce4f7e0de53d29cb32162df0" + + ajv@^4.9.1: + version "4.11.8" +- resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" ++ resolved "https://repo.huaweicloud.com/repository/npm/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" + dependencies: + co "^4.6.0" + json-stable-stringify "^1.0.1" + + ajv@^5.0.0, ajv@^5.1.5: + version "5.2.2" +- resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.2.2.tgz#47c68d69e86f5d953103b0074a9430dc63da5e39" ++ resolved "https://repo.huaweicloud.com/repository/npm/ajv/-/ajv-5.2.2.tgz#47c68d69e86f5d953103b0074a9430dc63da5e39" + dependencies: + co "^4.6.0" + fast-deep-equal "^1.0.0" +@@ -484,7 +484,7 @@ + + align-text@^0.1.1, align-text@^0.1.3: + version "0.1.4" +- resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" ++ resolved "https://repo.huaweicloud.com/repository/npm/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" + dependencies: + kind-of "^3.0.2" + longest "^1.0.1" +@@ -492,19 +492,19 @@ + + alphanum-sort@^1.0.1, alphanum-sort@^1.0.2: + version "1.0.2" +- resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" ++ resolved "https://repo.huaweicloud.com/repository/npm/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" + + amdefine@>=0.0.4: + version "1.0.1" +- resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" ++ resolved "https://repo.huaweicloud.com/repository/npm/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + + angular-in-memory-web-api@^0.3.1: + version "0.3.2" +- resolved "https://registry.yarnpkg.com/angular-in-memory-web-api/-/angular-in-memory-web-api-0.3.2.tgz#8836d9e2534d37b728f3cb5a1caf6fe1e7fbbecd" ++ resolved "https://repo.huaweicloud.com/repository/npm/angular-in-memory-web-api/-/angular-in-memory-web-api-0.3.2.tgz#8836d9e2534d37b728f3cb5a1caf6fe1e7fbbecd" + + angular-moment-timezone@^0.2.1: + version "0.2.1" +- resolved "https://registry.yarnpkg.com/angular-moment-timezone/-/angular-moment-timezone-0.2.1.tgz#b2c1d9dd0e90558483b4da8db277bee4dbdbf6d1" ++ resolved "https://repo.huaweicloud.com/repository/npm/angular-moment-timezone/-/angular-moment-timezone-0.2.1.tgz#b2c1d9dd0e90558483b4da8db277bee4dbdbf6d1" + dependencies: + "@angular/common" "^4.0.0" + "@angular/compiler" "^4.0.0" +@@ -524,148 +524,148 @@ + + angular-pipes@^6.5.3: + version "6.5.3" +- resolved "https://registry.yarnpkg.com/angular-pipes/-/angular-pipes-6.5.3.tgz#6bed37c51ebc2adaf3412663bfe25179d0489b02" ++ resolved "https://repo.huaweicloud.com/repository/npm/angular-pipes/-/angular-pipes-6.5.3.tgz#6bed37c51ebc2adaf3412663bfe25179d0489b02" + + angular2-moment@^1.3.3: + version "1.4.0" +- resolved "https://registry.yarnpkg.com/angular2-moment/-/angular2-moment-1.4.0.tgz#3d59c1ebc28934fcfe9b888ab461e261724987e8" ++ resolved "https://repo.huaweicloud.com/repository/npm/angular2-moment/-/angular2-moment-1.4.0.tgz#3d59c1ebc28934fcfe9b888ab461e261724987e8" + dependencies: + moment "^2.16.0" + + angular2-moment@^1.4.0: + version "1.7.0" +- resolved "https://registry.yarnpkg.com/angular2-moment/-/angular2-moment-1.7.0.tgz#6e620430cc21efc65ed3a68b5c09f3f3ef7a8256" ++ resolved "https://repo.huaweicloud.com/repository/npm/angular2-moment/-/angular2-moment-1.7.0.tgz#6e620430cc21efc65ed3a68b5c09f3f3ef7a8256" + dependencies: + moment "^2.16.0" + + angular2-notifications@0.4.46: + version "0.4.46" +- resolved "https://registry.yarnpkg.com/angular2-notifications/-/angular2-notifications-0.4.46.tgz#d868cfad43c4da3c1490a57a96d637a5eb96ce69" ++ resolved "https://repo.huaweicloud.com/repository/npm/angular2-notifications/-/angular2-notifications-0.4.46.tgz#d868cfad43c4da3c1490a57a96d637a5eb96ce69" + + ansi-align@^2.0.0: + version "2.0.0" +- resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f" ++ resolved "https://repo.huaweicloud.com/repository/npm/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f" + dependencies: + string-width "^2.0.0" + + ansi-html@0.0.7: + version "0.0.7" +- resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" ++ resolved "https://repo.huaweicloud.com/repository/npm/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" + + ansi-regex@^2.0.0: + version "2.1.1" +- resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" ++ resolved "https://repo.huaweicloud.com/repository/npm/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + + ansi-styles@^2.2.1: + version "2.2.1" +- resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" ++ resolved "https://repo.huaweicloud.com/repository/npm/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + + ansi-styles@^3.1.0: + version "3.2.0" +- resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.0.tgz#c159b8d5be0f9e5a6f346dab94f16ce022161b88" ++ resolved "https://repo.huaweicloud.com/repository/npm/ansi-styles/-/ansi-styles-3.2.0.tgz#c159b8d5be0f9e5a6f346dab94f16ce022161b88" + dependencies: + color-convert "^1.9.0" + + any-promise@^1.3.0: + version "1.3.0" +- resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" ++ resolved "https://repo.huaweicloud.com/repository/npm/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" + + anymatch@^1.3.0: + version "1.3.0" +- resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.0.tgz#a3e52fa39168c825ff57b0248126ce5a8ff95507" ++ resolved "https://repo.huaweicloud.com/repository/npm/anymatch/-/anymatch-1.3.0.tgz#a3e52fa39168c825ff57b0248126ce5a8ff95507" + dependencies: + arrify "^1.0.0" + micromatch "^2.1.5" + + app-root-path@^2.0.1: + version "2.0.1" +- resolved "https://registry.yarnpkg.com/app-root-path/-/app-root-path-2.0.1.tgz#cd62dcf8e4fd5a417efc664d2e5b10653c651b46" ++ resolved "https://repo.huaweicloud.com/repository/npm/app-root-path/-/app-root-path-2.0.1.tgz#cd62dcf8e4fd5a417efc664d2e5b10653c651b46" + + append-transform@^0.4.0: + version "0.4.0" +- resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-0.4.0.tgz#d76ebf8ca94d276e247a36bad44a4b74ab611991" ++ resolved "https://repo.huaweicloud.com/repository/npm/append-transform/-/append-transform-0.4.0.tgz#d76ebf8ca94d276e247a36bad44a4b74ab611991" + dependencies: + default-require-extensions "^1.0.0" + + aproba@^1.0.3: + version "1.1.1" +- resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.1.1.tgz#95d3600f07710aa0e9298c726ad5ecf2eacbabab" ++ resolved "https://repo.huaweicloud.com/repository/npm/aproba/-/aproba-1.1.1.tgz#95d3600f07710aa0e9298c726ad5ecf2eacbabab" + + are-we-there-yet@~1.1.2: + version "1.1.4" +- resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d" ++ resolved "https://repo.huaweicloud.com/repository/npm/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d" + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + + argparse@^1.0.7: + version "1.0.9" +- resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" ++ resolved "https://repo.huaweicloud.com/repository/npm/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" + dependencies: + sprintf-js "~1.0.2" + + arr-diff@^2.0.0: + version "2.0.0" +- resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" ++ resolved "https://repo.huaweicloud.com/repository/npm/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" + dependencies: + arr-flatten "^1.0.1" + + arr-flatten@^1.0.1: + version "1.0.3" +- resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.0.3.tgz#a274ed85ac08849b6bd7847c4580745dc51adfb1" ++ resolved "https://repo.huaweicloud.com/repository/npm/arr-flatten/-/arr-flatten-1.0.3.tgz#a274ed85ac08849b6bd7847c4580745dc51adfb1" + + array-find-index@^1.0.1: + version "1.0.2" +- resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" ++ resolved "https://repo.huaweicloud.com/repository/npm/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" + + array-flatten@1.1.1: + version "1.1.1" +- resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" ++ resolved "https://repo.huaweicloud.com/repository/npm/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + + array-flatten@^2.1.0: + version "2.1.1" +- resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.1.tgz#426bb9da84090c1838d812c8150af20a8331e296" ++ resolved "https://repo.huaweicloud.com/repository/npm/array-flatten/-/array-flatten-2.1.1.tgz#426bb9da84090c1838d812c8150af20a8331e296" + + array-includes@^3.0.3: + version "3.0.3" +- resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.0.3.tgz#184b48f62d92d7452bb31b323165c7f8bd02266d" ++ resolved "https://repo.huaweicloud.com/repository/npm/array-includes/-/array-includes-3.0.3.tgz#184b48f62d92d7452bb31b323165c7f8bd02266d" + dependencies: + define-properties "^1.1.2" + es-abstract "^1.7.0" + + array-slice@^0.2.3: + version "0.2.3" +- resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-0.2.3.tgz#dd3cfb80ed7973a75117cdac69b0b99ec86186f5" ++ resolved "https://repo.huaweicloud.com/repository/npm/array-slice/-/array-slice-0.2.3.tgz#dd3cfb80ed7973a75117cdac69b0b99ec86186f5" + + array-union@^1.0.1: + version "1.0.2" +- resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" ++ resolved "https://repo.huaweicloud.com/repository/npm/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + dependencies: + array-uniq "^1.0.1" + + array-uniq@^1.0.1: + version "1.0.3" +- resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" ++ resolved "https://repo.huaweicloud.com/repository/npm/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + + array-unique@^0.2.1: + version "0.2.1" +- resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" ++ resolved "https://repo.huaweicloud.com/repository/npm/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" + + arraybuffer.slice@0.0.6: + version "0.0.6" +- resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz#f33b2159f0532a3f3107a272c0ccfbd1ad2979ca" ++ resolved "https://repo.huaweicloud.com/repository/npm/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz#f33b2159f0532a3f3107a272c0ccfbd1ad2979ca" + + arrify@^1.0.0: + version "1.0.1" +- resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" ++ resolved "https://repo.huaweicloud.com/repository/npm/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + + asap@~2.0.3: + version "2.0.6" +- resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" ++ resolved "https://repo.huaweicloud.com/repository/npm/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + + asn1.js@^4.0.0: + version "4.9.1" +- resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.9.1.tgz#48ba240b45a9280e94748990ba597d216617fd40" ++ resolved "https://repo.huaweicloud.com/repository/npm/asn1.js/-/asn1.js-4.9.1.tgz#48ba240b45a9280e94748990ba597d216617fd40" + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" +@@ -673,61 +673,61 @@ + + asn1@~0.2.3: + version "0.2.3" +- resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" ++ resolved "https://repo.huaweicloud.com/repository/npm/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" + + assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" ++ resolved "https://repo.huaweicloud.com/repository/npm/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + + assert-plus@^0.2.0: + version "0.2.0" +- resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" ++ resolved "https://repo.huaweicloud.com/repository/npm/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" + + assert@^1.1.1: + version "1.4.1" +- resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91" ++ resolved "https://repo.huaweicloud.com/repository/npm/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91" + dependencies: + util "0.10.3" + + async-each@^1.0.0: + version "1.0.1" +- resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" ++ resolved "https://repo.huaweicloud.com/repository/npm/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" + + async-foreach@^0.1.3: + version "0.1.3" +- resolved "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542" ++ resolved "https://repo.huaweicloud.com/repository/npm/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542" + + async@^0.9.0: + version "0.9.2" +- resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d" ++ resolved "https://repo.huaweicloud.com/repository/npm/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d" + + async@^1.4.0, async@^1.5.2: + version "1.5.2" +- resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" ++ resolved "https://repo.huaweicloud.com/repository/npm/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" + + async@^2.1.2, async@^2.1.5, async@^2.4.1: + version "2.5.0" +- resolved "https://registry.yarnpkg.com/async/-/async-2.5.0.tgz#843190fd6b7357a0b9e1c956edddd5ec8462b54d" ++ resolved "https://repo.huaweicloud.com/repository/npm/async/-/async-2.5.0.tgz#843190fd6b7357a0b9e1c956edddd5ec8462b54d" + dependencies: + lodash "^4.14.0" + + async@^2.1.4: + version "2.4.1" +- resolved "https://registry.yarnpkg.com/async/-/async-2.4.1.tgz#62a56b279c98a11d0987096a01cc3eeb8eb7bbd7" ++ resolved "https://repo.huaweicloud.com/repository/npm/async/-/async-2.4.1.tgz#62a56b279c98a11d0987096a01cc3eeb8eb7bbd7" + dependencies: + lodash "^4.14.0" + + async@~0.2.6: + version "0.2.10" +- resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" ++ resolved "https://repo.huaweicloud.com/repository/npm/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" + + asynckit@^0.4.0: + version "0.4.0" +- resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" ++ resolved "https://repo.huaweicloud.com/repository/npm/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + + autoprefixer@^6.3.1, autoprefixer@^6.5.3: + version "6.7.7" +- resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-6.7.7.tgz#1dbd1c835658e35ce3f9984099db00585c782014" ++ resolved "https://repo.huaweicloud.com/repository/npm/autoprefixer/-/autoprefixer-6.7.7.tgz#1dbd1c835658e35ce3f9984099db00585c782014" + dependencies: + browserslist "^1.7.6" + caniuse-db "^1.0.30000634" +@@ -738,15 +738,15 @@ + + aws-sign2@~0.6.0: + version "0.6.0" +- resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" ++ resolved "https://repo.huaweicloud.com/repository/npm/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" + + aws4@^1.2.1: + version "1.6.0" +- resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" ++ resolved "https://repo.huaweicloud.com/repository/npm/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" + + babel-code-frame@^6.11.0: + version "6.26.0" +- resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" ++ resolved "https://repo.huaweicloud.com/repository/npm/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" + dependencies: + chalk "^1.1.3" + esutils "^2.0.2" +@@ -754,7 +754,7 @@ + + babel-code-frame@^6.20.0, babel-code-frame@^6.22.0: + version "6.22.0" +- resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.22.0.tgz#027620bee567a88c32561574e7fd0801d33118e4" ++ resolved "https://repo.huaweicloud.com/repository/npm/babel-code-frame/-/babel-code-frame-6.22.0.tgz#027620bee567a88c32561574e7fd0801d33118e4" + dependencies: + chalk "^1.1.0" + esutils "^2.0.2" +@@ -762,7 +762,7 @@ + + babel-generator@^6.18.0: + version "6.24.1" +- resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.24.1.tgz#e715f486c58ded25649d888944d52aa07c5d9497" ++ resolved "https://repo.huaweicloud.com/repository/npm/babel-generator/-/babel-generator-6.24.1.tgz#e715f486c58ded25649d888944d52aa07c5d9497" + dependencies: + babel-messages "^6.23.0" + babel-runtime "^6.22.0" +@@ -775,27 +775,27 @@ + + babel-messages@^6.23.0: + version "6.23.0" +- resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" ++ resolved "https://repo.huaweicloud.com/repository/npm/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" + dependencies: + babel-runtime "^6.22.0" + + babel-runtime@^6.18.0: + version "6.26.0" +- resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" ++ resolved "https://repo.huaweicloud.com/repository/npm/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.11.0" + + babel-runtime@^6.22.0: + version "6.23.0" +- resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.23.0.tgz#0a9489f144de70efb3ce4300accdb329e2fc543b" ++ resolved "https://repo.huaweicloud.com/repository/npm/babel-runtime/-/babel-runtime-6.23.0.tgz#0a9489f144de70efb3ce4300accdb329e2fc543b" + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.10.0" + + babel-template@^6.16.0: + version "6.24.1" +- resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.24.1.tgz#04ae514f1f93b3a2537f2a0f60a5a45fb8308333" ++ resolved "https://repo.huaweicloud.com/repository/npm/babel-template/-/babel-template-6.24.1.tgz#04ae514f1f93b3a2537f2a0f60a5a45fb8308333" + dependencies: + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" +@@ -805,7 +805,7 @@ + + babel-traverse@^6.18.0, babel-traverse@^6.24.1: + version "6.24.1" +- resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.24.1.tgz#ab36673fd356f9a0948659e7b338d5feadb31695" ++ resolved "https://repo.huaweicloud.com/repository/npm/babel-traverse/-/babel-traverse-6.24.1.tgz#ab36673fd356f9a0948659e7b338d5feadb31695" + dependencies: + babel-code-frame "^6.22.0" + babel-messages "^6.23.0" +@@ -819,7 +819,7 @@ + + babel-types@^6.18.0, babel-types@^6.24.1: + version "6.24.1" +- resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.24.1.tgz#a136879dc15b3606bda0d90c1fc74304c2ff0975" ++ resolved "https://repo.huaweicloud.com/repository/npm/babel-types/-/babel-types-6.24.1.tgz#a136879dc15b3606bda0d90c1fc74304c2ff0975" + dependencies: + babel-runtime "^6.22.0" + esutils "^2.0.2" +@@ -828,87 +828,87 @@ + + babylon@^6.11.0, babylon@^6.13.0, babylon@^6.15.0: + version "6.17.1" +- resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.17.1.tgz#17f14fddf361b695981fe679385e4f1c01ebd86f" ++ resolved "https://repo.huaweicloud.com/repository/npm/babylon/-/babylon-6.17.1.tgz#17f14fddf361b695981fe679385e4f1c01ebd86f" + + babylon@^6.18.0: + version "6.18.0" +- resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" ++ resolved "https://repo.huaweicloud.com/repository/npm/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" + + backo2@1.0.2: + version "1.0.2" +- resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" ++ resolved "https://repo.huaweicloud.com/repository/npm/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" + + balanced-match@^0.4.1, balanced-match@^0.4.2: + version "0.4.2" +- resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" ++ resolved "https://repo.huaweicloud.com/repository/npm/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" + + base64-arraybuffer@0.1.5: + version "0.1.5" +- resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8" ++ resolved "https://repo.huaweicloud.com/repository/npm/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8" + + base64-js@^1.0.2: + version "1.2.1" +- resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.1.tgz#a91947da1f4a516ea38e5b4ec0ec3773675e0886" ++ resolved "https://repo.huaweicloud.com/repository/npm/base64-js/-/base64-js-1.2.1.tgz#a91947da1f4a516ea38e5b4ec0ec3773675e0886" + + base64id@1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/base64id/-/base64id-1.0.0.tgz#47688cb99bb6804f0e06d3e763b1c32e57d8e6b6" ++ resolved "https://repo.huaweicloud.com/repository/npm/base64id/-/base64id-1.0.0.tgz#47688cb99bb6804f0e06d3e763b1c32e57d8e6b6" + + batch@0.6.1: + version "0.6.1" +- resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" ++ resolved "https://repo.huaweicloud.com/repository/npm/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" + + bcrypt-pbkdf@^1.0.0: + version "1.0.1" +- resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" ++ resolved "https://repo.huaweicloud.com/repository/npm/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" + dependencies: + tweetnacl "^0.14.3" + + better-assert@~1.0.0: + version "1.0.2" +- resolved "https://registry.yarnpkg.com/better-assert/-/better-assert-1.0.2.tgz#40866b9e1b9e0b55b481894311e68faffaebc522" ++ resolved "https://repo.huaweicloud.com/repository/npm/better-assert/-/better-assert-1.0.2.tgz#40866b9e1b9e0b55b481894311e68faffaebc522" + dependencies: + callsite "1.0.0" + + big.js@^3.1.3: + version "3.1.3" +- resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.1.3.tgz#4cada2193652eb3ca9ec8e55c9015669c9806978" ++ resolved "https://repo.huaweicloud.com/repository/npm/big.js/-/big.js-3.1.3.tgz#4cada2193652eb3ca9ec8e55c9015669c9806978" + + binary-extensions@^1.0.0: + version "1.8.0" +- resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.8.0.tgz#48ec8d16df4377eae5fa5884682480af4d95c774" ++ resolved "https://repo.huaweicloud.com/repository/npm/binary-extensions/-/binary-extensions-1.8.0.tgz#48ec8d16df4377eae5fa5884682480af4d95c774" + + blob@0.0.4: + version "0.0.4" +- resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.4.tgz#bcf13052ca54463f30f9fc7e95b9a47630a94921" ++ resolved "https://repo.huaweicloud.com/repository/npm/blob/-/blob-0.0.4.tgz#bcf13052ca54463f30f9fc7e95b9a47630a94921" + + block-stream@*: + version "0.0.9" +- resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" ++ resolved "https://repo.huaweicloud.com/repository/npm/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" + dependencies: + inherits "~2.0.0" + + blocking-proxy@0.0.5: + version "0.0.5" +- resolved "https://registry.yarnpkg.com/blocking-proxy/-/blocking-proxy-0.0.5.tgz#462905e0dcfbea970f41aa37223dda9c07b1912b" ++ resolved "https://repo.huaweicloud.com/repository/npm/blocking-proxy/-/blocking-proxy-0.0.5.tgz#462905e0dcfbea970f41aa37223dda9c07b1912b" + dependencies: + minimist "^1.2.0" + + bluebird@^2.10.2: + version "2.11.0" +- resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-2.11.0.tgz#534b9033c022c9579c56ba3b3e5a5caafbb650e1" ++ resolved "https://repo.huaweicloud.com/repository/npm/bluebird/-/bluebird-2.11.0.tgz#534b9033c022c9579c56ba3b3e5a5caafbb650e1" + + bluebird@^3.3.0, bluebird@^3.4.7: + version "3.5.0" +- resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.0.tgz#791420d7f551eea2897453a8a77653f96606d67c" ++ resolved "https://repo.huaweicloud.com/repository/npm/bluebird/-/bluebird-3.5.0.tgz#791420d7f551eea2897453a8a77653f96606d67c" + + bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: + version "4.11.8" +- resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" ++ resolved "https://repo.huaweicloud.com/repository/npm/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" + + body-parser@^1.12.4: + version "1.17.2" +- resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.17.2.tgz#f8892abc8f9e627d42aedafbca66bf5ab99104ee" ++ resolved "https://repo.huaweicloud.com/repository/npm/body-parser/-/body-parser-1.17.2.tgz#f8892abc8f9e627d42aedafbca66bf5ab99104ee" + dependencies: + bytes "2.4.0" + content-type "~1.0.2" +@@ -923,7 +923,7 @@ + + bonjour@^3.5.0: + version "3.5.0" +- resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5" ++ resolved "https://repo.huaweicloud.com/repository/npm/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5" + dependencies: + array-flatten "^2.1.0" + deep-equal "^1.0.1" +@@ -934,21 +934,21 @@ + + boolbase@~1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" ++ resolved "https://repo.huaweicloud.com/repository/npm/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + + boom@2.x.x: + version "2.10.1" +- resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" ++ resolved "https://repo.huaweicloud.com/repository/npm/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" + dependencies: + hoek "2.x.x" + + bootstrap@^3.3.7: + version "3.3.7" +- resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-3.3.7.tgz#5a389394549f23330875a3b150656574f8a9eb71" ++ resolved "https://repo.huaweicloud.com/repository/npm/bootstrap/-/bootstrap-3.3.7.tgz#5a389394549f23330875a3b150656574f8a9eb71" + + boxen@^1.0.0: + version "1.1.0" +- resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.1.0.tgz#b1b69dd522305e807a99deee777dbd6e5167b102" ++ resolved "https://repo.huaweicloud.com/repository/npm/boxen/-/boxen-1.1.0.tgz#b1b69dd522305e807a99deee777dbd6e5167b102" + dependencies: + ansi-align "^2.0.0" + camelcase "^4.0.0" +@@ -960,20 +960,20 @@ + + brace-expansion@^1.1.7: + version "1.1.7" +- resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.7.tgz#3effc3c50e000531fb720eaff80f0ae8ef23cf59" ++ resolved "https://repo.huaweicloud.com/repository/npm/brace-expansion/-/brace-expansion-1.1.7.tgz#3effc3c50e000531fb720eaff80f0ae8ef23cf59" + dependencies: + balanced-match "^0.4.1" + concat-map "0.0.1" + + braces@^0.1.2: + version "0.1.5" +- resolved "https://registry.yarnpkg.com/braces/-/braces-0.1.5.tgz#c085711085291d8b75fdd74eab0f8597280711e6" ++ resolved "https://repo.huaweicloud.com/repository/npm/braces/-/braces-0.1.5.tgz#c085711085291d8b75fdd74eab0f8597280711e6" + dependencies: + expand-range "^0.1.0" + + braces@^1.8.2: + version "1.8.5" +- resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" ++ resolved "https://repo.huaweicloud.com/repository/npm/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" + dependencies: + expand-range "^1.8.1" + preserve "^0.2.0" +@@ -981,11 +981,11 @@ + + brorand@^1.0.1: + version "1.1.0" +- resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" ++ resolved "https://repo.huaweicloud.com/repository/npm/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + + browserify-aes@^1.0.0, browserify-aes@^1.0.4: + version "1.0.8" +- resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.0.8.tgz#c8fa3b1b7585bb7ba77c5560b60996ddec6d5309" ++ resolved "https://repo.huaweicloud.com/repository/npm/browserify-aes/-/browserify-aes-1.0.8.tgz#c8fa3b1b7585bb7ba77c5560b60996ddec6d5309" + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" +@@ -996,7 +996,7 @@ + + browserify-cipher@^1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.0.tgz#9988244874bf5ed4e28da95666dcd66ac8fc363a" ++ resolved "https://repo.huaweicloud.com/repository/npm/browserify-cipher/-/browserify-cipher-1.0.0.tgz#9988244874bf5ed4e28da95666dcd66ac8fc363a" + dependencies: + browserify-aes "^1.0.4" + browserify-des "^1.0.0" +@@ -1004,7 +1004,7 @@ + + browserify-des@^1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.0.tgz#daa277717470922ed2fe18594118a175439721dd" ++ resolved "https://repo.huaweicloud.com/repository/npm/browserify-des/-/browserify-des-1.0.0.tgz#daa277717470922ed2fe18594118a175439721dd" + dependencies: + cipher-base "^1.0.1" + des.js "^1.0.0" +@@ -1012,14 +1012,14 @@ + + browserify-rsa@^4.0.0: + version "4.0.1" +- resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" ++ resolved "https://repo.huaweicloud.com/repository/npm/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" + dependencies: + bn.js "^4.1.0" + randombytes "^2.0.1" + + browserify-sign@^4.0.0: + version "4.0.4" +- resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298" ++ resolved "https://repo.huaweicloud.com/repository/npm/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298" + dependencies: + bn.js "^4.1.1" + browserify-rsa "^4.0.0" +@@ -1031,32 +1031,32 @@ + + browserify-zlib@^0.1.4: + version "0.1.4" +- resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.1.4.tgz#bb35f8a519f600e0fa6b8485241c979d0141fb2d" ++ resolved "https://repo.huaweicloud.com/repository/npm/browserify-zlib/-/browserify-zlib-0.1.4.tgz#bb35f8a519f600e0fa6b8485241c979d0141fb2d" + dependencies: + pako "~0.2.0" + + browserslist@^1.3.6, browserslist@^1.5.2, browserslist@^1.7.6: + version "1.7.7" +- resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-1.7.7.tgz#0bd76704258be829b2398bb50e4b62d1a166b0b9" ++ resolved "https://repo.huaweicloud.com/repository/npm/browserslist/-/browserslist-1.7.7.tgz#0bd76704258be829b2398bb50e4b62d1a166b0b9" + dependencies: + caniuse-db "^1.0.30000639" + electron-to-chromium "^1.2.7" + + buffer-indexof@^1.0.0: + version "1.1.1" +- resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c" ++ resolved "https://repo.huaweicloud.com/repository/npm/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c" + + buffer-shims@~1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" ++ resolved "https://repo.huaweicloud.com/repository/npm/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" + + buffer-xor@^1.0.3: + version "1.0.3" +- resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" ++ resolved "https://repo.huaweicloud.com/repository/npm/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + + buffer@^4.3.0: + version "4.9.1" +- resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" ++ resolved "https://repo.huaweicloud.com/repository/npm/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" +@@ -1064,57 +1064,57 @@ + + builtin-modules@^1.0.0: + version "1.1.1" +- resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" ++ resolved "https://repo.huaweicloud.com/repository/npm/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" + + builtin-status-codes@^3.0.0: + version "3.0.0" +- resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" ++ resolved "https://repo.huaweicloud.com/repository/npm/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + + bytes@2.4.0: + version "2.4.0" +- resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.4.0.tgz#7d97196f9d5baf7f6935e25985549edd2a6c2339" ++ resolved "https://repo.huaweicloud.com/repository/npm/bytes/-/bytes-2.4.0.tgz#7d97196f9d5baf7f6935e25985549edd2a6c2339" + + bytes@2.5.0: + version "2.5.0" +- resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.5.0.tgz#4c9423ea2d252c270c41b2bdefeff9bb6b62c06a" ++ resolved "https://repo.huaweicloud.com/repository/npm/bytes/-/bytes-2.5.0.tgz#4c9423ea2d252c270c41b2bdefeff9bb6b62c06a" + + callsite@1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20" ++ resolved "https://repo.huaweicloud.com/repository/npm/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20" + + camel-case@3.0.x: + version "3.0.0" +- resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73" ++ resolved "https://repo.huaweicloud.com/repository/npm/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73" + dependencies: + no-case "^2.2.0" + upper-case "^1.1.1" + + camelcase-keys@^2.0.0: + version "2.1.0" +- resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" ++ resolved "https://repo.huaweicloud.com/repository/npm/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" + dependencies: + camelcase "^2.0.0" + map-obj "^1.0.0" + + camelcase@^1.0.2: + version "1.2.1" +- resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" ++ resolved "https://repo.huaweicloud.com/repository/npm/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" + + camelcase@^2.0.0: + version "2.1.1" +- resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" ++ resolved "https://repo.huaweicloud.com/repository/npm/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" + + camelcase@^3.0.0: + version "3.0.0" +- resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" ++ resolved "https://repo.huaweicloud.com/repository/npm/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" + + camelcase@^4.0.0, camelcase@^4.1.0: + version "4.1.0" +- resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" ++ resolved "https://repo.huaweicloud.com/repository/npm/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" + + caniuse-api@^1.5.2: + version "1.6.1" +- resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-1.6.1.tgz#b534e7c734c4f81ec5fbe8aca2ad24354b962c6c" ++ resolved "https://repo.huaweicloud.com/repository/npm/caniuse-api/-/caniuse-api-1.6.1.tgz#b534e7c734c4f81ec5fbe8aca2ad24354b962c6c" + dependencies: + browserslist "^1.3.6" + caniuse-db "^1.0.30000529" +@@ -1123,26 +1123,26 @@ + + caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639: + version "1.0.30000726" +- resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000726.tgz#9bb742f8d026a62df873bc03c06843d2255b60d7" ++ resolved "https://repo.huaweicloud.com/repository/npm/caniuse-db/-/caniuse-db-1.0.30000726.tgz#9bb742f8d026a62df873bc03c06843d2255b60d7" + + capture-stack-trace@^1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz#4a6fa07399c26bba47f0b2496b4d0fb408c5550d" ++ resolved "https://repo.huaweicloud.com/repository/npm/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz#4a6fa07399c26bba47f0b2496b4d0fb408c5550d" + + caseless@~0.12.0: + version "0.12.0" +- resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" ++ resolved "https://repo.huaweicloud.com/repository/npm/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + + center-align@^0.1.1: + version "0.1.3" +- resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" ++ resolved "https://repo.huaweicloud.com/repository/npm/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" + dependencies: + align-text "^0.1.3" + lazy-cache "^1.0.3" + + chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3: + version "1.1.3" +- resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" ++ resolved "https://repo.huaweicloud.com/repository/npm/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" +@@ -1152,7 +1152,7 @@ + + chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0: + version "2.1.0" +- resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.1.0.tgz#ac5becf14fa21b99c6c92ca7a7d7cfd5b17e743e" ++ resolved "https://repo.huaweicloud.com/repository/npm/chalk/-/chalk-2.1.0.tgz#ac5becf14fa21b99c6c92ca7a7d7cfd5b17e743e" + dependencies: + ansi-styles "^3.1.0" + escape-string-regexp "^1.0.5" +@@ -1160,11 +1160,11 @@ + + charenc@~0.0.1: + version "0.0.2" +- resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" ++ resolved "https://repo.huaweicloud.com/repository/npm/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" + + chokidar@^1.4.1, chokidar@^1.6.0, chokidar@^1.7.0: + version "1.7.0" +- resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" ++ resolved "https://repo.huaweicloud.com/repository/npm/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" + dependencies: + anymatch "^1.3.0" + async-each "^1.0.0" +@@ -1179,34 +1179,34 @@ + + cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" +- resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" ++ resolved "https://repo.huaweicloud.com/repository/npm/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + + circular-dependency-plugin@^3.0.0: + version "3.0.0" +- resolved "https://registry.yarnpkg.com/circular-dependency-plugin/-/circular-dependency-plugin-3.0.0.tgz#9b68692e35b0e3510998d0164b6ae5011bea5760" ++ resolved "https://repo.huaweicloud.com/repository/npm/circular-dependency-plugin/-/circular-dependency-plugin-3.0.0.tgz#9b68692e35b0e3510998d0164b6ae5011bea5760" + + clap@^1.0.9: + version "1.2.0" +- resolved "https://registry.yarnpkg.com/clap/-/clap-1.2.0.tgz#59c90fe3e137104746ff19469a27a634ff68c857" ++ resolved "https://repo.huaweicloud.com/repository/npm/clap/-/clap-1.2.0.tgz#59c90fe3e137104746ff19469a27a634ff68c857" + dependencies: + chalk "^1.1.3" + + clean-css@4.1.x: + version "4.1.8" +- resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.1.8.tgz#061455b2494a750ac98f46d8d5ebb17c679ea9d1" ++ resolved "https://repo.huaweicloud.com/repository/npm/clean-css/-/clean-css-4.1.8.tgz#061455b2494a750ac98f46d8d5ebb17c679ea9d1" + dependencies: + source-map "0.5.x" + + cli-boxes@^1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" ++ resolved "https://repo.huaweicloud.com/repository/npm/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" + + cliui@^2.1.0: + version "2.1.0" +- resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" ++ resolved "https://repo.huaweicloud.com/repository/npm/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" + dependencies: + center-align "^0.1.1" + right-align "^0.1.1" +@@ -1214,7 +1214,7 @@ + + cliui@^3.2.0: + version "3.2.0" +- resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" ++ resolved "https://repo.huaweicloud.com/repository/npm/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" +@@ -1222,7 +1222,7 @@ + + clone-deep@^0.3.0: + version "0.3.0" +- resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-0.3.0.tgz#348c61ae9cdbe0edfe053d91ff4cc521d790ede8" ++ resolved "https://repo.huaweicloud.com/repository/npm/clone-deep/-/clone-deep-0.3.0.tgz#348c61ae9cdbe0edfe053d91ff4cc521d790ede8" + dependencies: + for-own "^1.0.0" + is-plain-object "^2.0.1" +@@ -1231,29 +1231,29 @@ + + clone@^1.0.2: + version "1.0.2" +- resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.2.tgz#260b7a99ebb1edfe247538175f783243cb19d149" ++ resolved "https://repo.huaweicloud.com/repository/npm/clone/-/clone-1.0.2.tgz#260b7a99ebb1edfe247538175f783243cb19d149" + + clone@^2.1.1: + version "2.1.1" +- resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.1.tgz#d217d1e961118e3ac9a4b8bba3285553bf647cdb" ++ resolved "https://repo.huaweicloud.com/repository/npm/clone/-/clone-2.1.1.tgz#d217d1e961118e3ac9a4b8bba3285553bf647cdb" + + co@^4.6.0: + version "4.6.0" +- resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" ++ resolved "https://repo.huaweicloud.com/repository/npm/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + + coa@~1.0.1: + version "1.0.4" +- resolved "https://registry.yarnpkg.com/coa/-/coa-1.0.4.tgz#a9ef153660d6a86a8bdec0289a5c684d217432fd" ++ resolved "https://repo.huaweicloud.com/repository/npm/coa/-/coa-1.0.4.tgz#a9ef153660d6a86a8bdec0289a5c684d217432fd" + dependencies: + q "^1.1.2" + + code-point-at@^1.0.0: + version "1.1.0" +- resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" ++ resolved "https://repo.huaweicloud.com/repository/npm/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + + codelyzer@~2.0.0: + version "2.0.1" +- resolved "https://registry.yarnpkg.com/codelyzer/-/codelyzer-2.0.1.tgz#d0f7121f67a8424c92d21d3b31f3640b83def9ed" ++ resolved "https://repo.huaweicloud.com/repository/npm/codelyzer/-/codelyzer-2.0.1.tgz#d0f7121f67a8424c92d21d3b31f3640b83def9ed" + dependencies: + app-root-path "^2.0.1" + css-selector-tokenizer "^0.7.0" +@@ -1264,23 +1264,23 @@ + + color-convert@^1.3.0, color-convert@^1.9.0: + version "1.9.0" +- resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.0.tgz#1accf97dd739b983bf994d56fec8f95853641b7a" ++ resolved "https://repo.huaweicloud.com/repository/npm/color-convert/-/color-convert-1.9.0.tgz#1accf97dd739b983bf994d56fec8f95853641b7a" + dependencies: + color-name "^1.1.1" + + color-name@^1.0.0, color-name@^1.1.1: + version "1.1.3" +- resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" ++ resolved "https://repo.huaweicloud.com/repository/npm/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + + color-string@^0.3.0: + version "0.3.0" +- resolved "https://registry.yarnpkg.com/color-string/-/color-string-0.3.0.tgz#27d46fb67025c5c2fa25993bfbf579e47841b991" ++ resolved "https://repo.huaweicloud.com/repository/npm/color-string/-/color-string-0.3.0.tgz#27d46fb67025c5c2fa25993bfbf579e47841b991" + dependencies: + color-name "^1.0.0" + + color@^0.11.0: + version "0.11.4" +- resolved "https://registry.yarnpkg.com/color/-/color-0.11.4.tgz#6d7b5c74fb65e841cd48792ad1ed5e07b904d764" ++ resolved "https://repo.huaweicloud.com/repository/npm/color/-/color-0.11.4.tgz#6d7b5c74fb65e841cd48792ad1ed5e07b904d764" + dependencies: + clone "^1.0.2" + color-convert "^1.3.0" +@@ -1288,7 +1288,7 @@ + + colormin@^1.0.5: + version "1.1.2" +- resolved "https://registry.yarnpkg.com/colormin/-/colormin-1.1.2.tgz#ea2f7420a72b96881a38aae59ec124a6f7298133" ++ resolved "https://repo.huaweicloud.com/repository/npm/colormin/-/colormin-1.1.2.tgz#ea2f7420a72b96881a38aae59ec124a6f7298133" + dependencies: + color "^0.11.0" + css-color-names "0.0.4" +@@ -1296,61 +1296,61 @@ + + colors@1.1.2, colors@^1.1.0, colors@^1.1.2, colors@~1.1.2: + version "1.1.2" +- resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" ++ resolved "https://repo.huaweicloud.com/repository/npm/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" + + combine-lists@^1.0.0: + version "1.0.1" +- resolved "https://registry.yarnpkg.com/combine-lists/-/combine-lists-1.0.1.tgz#458c07e09e0d900fc28b70a3fec2dacd1d2cb7f6" ++ resolved "https://repo.huaweicloud.com/repository/npm/combine-lists/-/combine-lists-1.0.1.tgz#458c07e09e0d900fc28b70a3fec2dacd1d2cb7f6" + dependencies: + lodash "^4.5.0" + + combined-stream@^1.0.5, combined-stream@~1.0.5: + version "1.0.5" +- resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" ++ resolved "https://repo.huaweicloud.com/repository/npm/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" + dependencies: + delayed-stream "~1.0.0" + + commander@2: + version "2.9.0" +- resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" ++ resolved "https://repo.huaweicloud.com/repository/npm/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" + dependencies: + graceful-readlink ">= 1.0.0" + + commander@2.11.x, commander@~2.11.0: + version "2.11.0" +- resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563" ++ resolved "https://repo.huaweicloud.com/repository/npm/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563" + + common-tags@^1.3.1: + version "1.4.0" +- resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.4.0.tgz#1187be4f3d4cf0c0427d43f74eef1f73501614c0" ++ resolved "https://repo.huaweicloud.com/repository/npm/common-tags/-/common-tags-1.4.0.tgz#1187be4f3d4cf0c0427d43f74eef1f73501614c0" + dependencies: + babel-runtime "^6.18.0" + + component-bind@1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1" ++ resolved "https://repo.huaweicloud.com/repository/npm/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1" + + component-emitter@1.1.2: + version "1.1.2" +- resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.1.2.tgz#296594f2753daa63996d2af08d15a95116c9aec3" ++ resolved "https://repo.huaweicloud.com/repository/npm/component-emitter/-/component-emitter-1.1.2.tgz#296594f2753daa63996d2af08d15a95116c9aec3" + + component-emitter@1.2.1: + version "1.2.1" +- resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" ++ resolved "https://repo.huaweicloud.com/repository/npm/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" + + component-inherit@0.0.3: + version "0.0.3" +- resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143" ++ resolved "https://repo.huaweicloud.com/repository/npm/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143" + + compressible@~2.0.10: + version "2.0.11" +- resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.11.tgz#16718a75de283ed8e604041625a2064586797d8a" ++ resolved "https://repo.huaweicloud.com/repository/npm/compressible/-/compressible-2.0.11.tgz#16718a75de283ed8e604041625a2064586797d8a" + dependencies: + mime-db ">= 1.29.0 < 2" + + compression@^1.5.2: + version "1.7.0" +- resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.0.tgz#030c9f198f1643a057d776a738e922da4373012d" ++ resolved "https://repo.huaweicloud.com/repository/npm/compression/-/compression-1.7.0.tgz#030c9f198f1643a057d776a738e922da4373012d" + dependencies: + accepts "~1.3.3" + bytes "2.5.0" +@@ -1362,11 +1362,11 @@ + + concat-map@0.0.1: + version "0.0.1" +- resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" ++ resolved "https://repo.huaweicloud.com/repository/npm/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + + concat-stream@1.6.0: + version "1.6.0" +- resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" ++ resolved "https://repo.huaweicloud.com/repository/npm/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" + dependencies: + inherits "^2.0.3" + readable-stream "^2.2.2" +@@ -1374,7 +1374,7 @@ + + configstore@^3.0.0: + version "3.1.0" +- resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.0.tgz#45df907073e26dfa1cf4b2d52f5b60545eaa11d1" ++ resolved "https://repo.huaweicloud.com/repository/npm/configstore/-/configstore-3.1.0.tgz#45df907073e26dfa1cf4b2d52f5b60545eaa11d1" + dependencies: + dot-prop "^4.1.0" + graceful-fs "^4.1.2" +@@ -1385,11 +1385,11 @@ + + connect-history-api-fallback@^1.3.0: + version "1.3.0" +- resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.3.0.tgz#e51d17f8f0ef0db90a64fdb47de3051556e9f169" ++ resolved "https://repo.huaweicloud.com/repository/npm/connect-history-api-fallback/-/connect-history-api-fallback-1.3.0.tgz#e51d17f8f0ef0db90a64fdb47de3051556e9f169" + + connect@^3.3.5: + version "3.6.2" +- resolved "https://registry.yarnpkg.com/connect/-/connect-3.6.2.tgz#694e8d20681bfe490282c8ab886be98f09f42fe7" ++ resolved "https://repo.huaweicloud.com/repository/npm/connect/-/connect-3.6.2.tgz#694e8d20681bfe490282c8ab886be98f09f42fe7" + dependencies: + debug "2.6.7" + finalhandler "1.0.3" +@@ -1398,41 +1398,41 @@ + + console-browserify@^1.1.0: + version "1.1.0" +- resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" ++ resolved "https://repo.huaweicloud.com/repository/npm/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" + dependencies: + date-now "^0.1.4" + + console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" +- resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" ++ resolved "https://repo.huaweicloud.com/repository/npm/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + + constants-browserify@^1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" ++ resolved "https://repo.huaweicloud.com/repository/npm/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + + content-disposition@0.5.2: + version "0.5.2" +- resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" ++ resolved "https://repo.huaweicloud.com/repository/npm/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" + + content-type@~1.0.2: + version "1.0.2" +- resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.2.tgz#b7d113aee7a8dd27bd21133c4dc2529df1721eed" ++ resolved "https://repo.huaweicloud.com/repository/npm/content-type/-/content-type-1.0.2.tgz#b7d113aee7a8dd27bd21133c4dc2529df1721eed" + + convert-source-map@^1.3.0: + version "1.5.0" +- resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5" ++ resolved "https://repo.huaweicloud.com/repository/npm/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5" + + cookie-signature@1.0.6: + version "1.0.6" +- resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" ++ resolved "https://repo.huaweicloud.com/repository/npm/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + + cookie@0.3.1: + version "0.3.1" +- resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" ++ resolved "https://repo.huaweicloud.com/repository/npm/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" + + copy-webpack-plugin@^4.0.1: + version "4.0.1" +- resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-4.0.1.tgz#9728e383b94316050d0c7463958f2b85c0aa8200" ++ resolved "https://repo.huaweicloud.com/repository/npm/copy-webpack-plugin/-/copy-webpack-plugin-4.0.1.tgz#9728e383b94316050d0c7463958f2b85c0aa8200" + dependencies: + bluebird "^2.10.2" + fs-extra "^0.26.4" +@@ -1445,25 +1445,25 @@ + + core-js@^2.2.0, core-js@^2.4.0: + version "2.4.1" +- resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e" ++ resolved "https://repo.huaweicloud.com/repository/npm/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e" + + core-js@^2.4.1: + version "2.5.1" +- resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.1.tgz#ae6874dc66937789b80754ff5428df66819ca50b" ++ resolved "https://repo.huaweicloud.com/repository/npm/core-js/-/core-js-2.5.1.tgz#ae6874dc66937789b80754ff5428df66819ca50b" + + core-object@^3.1.0: + version "3.1.5" +- resolved "https://registry.yarnpkg.com/core-object/-/core-object-3.1.5.tgz#fa627b87502adc98045e44678e9a8ec3b9c0d2a9" ++ resolved "https://repo.huaweicloud.com/repository/npm/core-object/-/core-object-3.1.5.tgz#fa627b87502adc98045e44678e9a8ec3b9c0d2a9" + dependencies: + chalk "^2.0.0" + + core-util-is@~1.0.0: + version "1.0.2" +- resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" ++ resolved "https://repo.huaweicloud.com/repository/npm/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + + cosmiconfig@^2.1.0, cosmiconfig@^2.1.1: + version "2.2.2" +- resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-2.2.2.tgz#6173cebd56fac042c1f4390edf7af6c07c7cb892" ++ resolved "https://repo.huaweicloud.com/repository/npm/cosmiconfig/-/cosmiconfig-2.2.2.tgz#6173cebd56fac042c1f4390edf7af6c07c7cb892" + dependencies: + is-directory "^0.3.1" + js-yaml "^3.4.3" +@@ -1475,20 +1475,20 @@ + + create-ecdh@^4.0.0: + version "4.0.0" +- resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.0.tgz#888c723596cdf7612f6498233eebd7a35301737d" ++ resolved "https://repo.huaweicloud.com/repository/npm/create-ecdh/-/create-ecdh-4.0.0.tgz#888c723596cdf7612f6498233eebd7a35301737d" + dependencies: + bn.js "^4.1.0" + elliptic "^6.0.0" + + create-error-class@^3.0.0: + version "3.0.2" +- resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" ++ resolved "https://repo.huaweicloud.com/repository/npm/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" + dependencies: + capture-stack-trace "^1.0.0" + + create-hash@^1.1.0, create-hash@^1.1.2: + version "1.1.3" +- resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.1.3.tgz#606042ac8b9262750f483caddab0f5819172d8fd" ++ resolved "https://repo.huaweicloud.com/repository/npm/create-hash/-/create-hash-1.1.3.tgz#606042ac8b9262750f483caddab0f5819172d8fd" + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" +@@ -1497,7 +1497,7 @@ + + create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: + version "1.1.6" +- resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.6.tgz#acb9e221a4e17bdb076e90657c42b93e3726cf06" ++ resolved "https://repo.huaweicloud.com/repository/npm/create-hmac/-/create-hmac-1.1.6.tgz#acb9e221a4e17bdb076e90657c42b93e3726cf06" + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" +@@ -1508,21 +1508,21 @@ + + cross-spawn-async@^2.1.1: + version "2.2.5" +- resolved "https://registry.yarnpkg.com/cross-spawn-async/-/cross-spawn-async-2.2.5.tgz#845ff0c0834a3ded9d160daca6d390906bb288cc" ++ resolved "https://repo.huaweicloud.com/repository/npm/cross-spawn-async/-/cross-spawn-async-2.2.5.tgz#845ff0c0834a3ded9d160daca6d390906bb288cc" + dependencies: + lru-cache "^4.0.0" + which "^1.2.8" + + cross-spawn@^3.0.0: + version "3.0.1" +- resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982" ++ resolved "https://repo.huaweicloud.com/repository/npm/cross-spawn/-/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982" + dependencies: + lru-cache "^4.0.1" + which "^1.2.9" + + cross-spawn@^5.0.1: + version "5.1.0" +- resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" ++ resolved "https://repo.huaweicloud.com/repository/npm/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + dependencies: + lru-cache "^4.0.1" + shebang-command "^1.2.0" +@@ -1530,17 +1530,17 @@ + + crypt@~0.0.1: + version "0.0.2" +- resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" ++ resolved "https://repo.huaweicloud.com/repository/npm/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" + + cryptiles@2.x.x: + version "2.0.5" +- resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" ++ resolved "https://repo.huaweicloud.com/repository/npm/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" + dependencies: + boom "2.x.x" + + crypto-browserify@^3.11.0: + version "3.11.1" +- resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.11.1.tgz#948945efc6757a400d6e5e5af47194d10064279f" ++ resolved "https://repo.huaweicloud.com/repository/npm/crypto-browserify/-/crypto-browserify-3.11.1.tgz#948945efc6757a400d6e5e5af47194d10064279f" + dependencies: + browserify-cipher "^1.0.0" + browserify-sign "^4.0.0" +@@ -1555,15 +1555,15 @@ + + crypto-random-string@^1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" ++ resolved "https://repo.huaweicloud.com/repository/npm/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" + + css-color-names@0.0.4: + version "0.0.4" +- resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" ++ resolved "https://repo.huaweicloud.com/repository/npm/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" + + css-loader@^0.28.1: + version "0.28.7" +- resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-0.28.7.tgz#5f2ee989dd32edd907717f953317656160999c1b" ++ resolved "https://repo.huaweicloud.com/repository/npm/css-loader/-/css-loader-0.28.7.tgz#5f2ee989dd32edd907717f953317656160999c1b" + dependencies: + babel-code-frame "^6.11.0" + css-selector-tokenizer "^0.7.0" +@@ -1582,11 +1582,11 @@ + + css-parse@1.7.x: + version "1.7.0" +- resolved "https://registry.yarnpkg.com/css-parse/-/css-parse-1.7.0.tgz#321f6cf73782a6ff751111390fc05e2c657d8c9b" ++ resolved "https://repo.huaweicloud.com/repository/npm/css-parse/-/css-parse-1.7.0.tgz#321f6cf73782a6ff751111390fc05e2c657d8c9b" + + css-select@^1.1.0: + version "1.2.0" +- resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858" ++ resolved "https://repo.huaweicloud.com/repository/npm/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858" + dependencies: + boolbase "~1.0.0" + css-what "2.1" +@@ -1595,7 +1595,7 @@ + + css-selector-tokenizer@^0.7.0: + version "0.7.0" +- resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz#e6988474ae8c953477bf5e7efecfceccd9cf4c86" ++ resolved "https://repo.huaweicloud.com/repository/npm/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz#e6988474ae8c953477bf5e7efecfceccd9cf4c86" + dependencies: + cssesc "^0.1.0" + fastparse "^1.1.1" +@@ -1603,21 +1603,21 @@ + + css-what@2.1: + version "2.1.0" +- resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.0.tgz#9467d032c38cfaefb9f2d79501253062f87fa1bd" ++ resolved "https://repo.huaweicloud.com/repository/npm/css-what/-/css-what-2.1.0.tgz#9467d032c38cfaefb9f2d79501253062f87fa1bd" + + cssauron@^1.4.0: + version "1.4.0" +- resolved "https://registry.yarnpkg.com/cssauron/-/cssauron-1.4.0.tgz#a6602dff7e04a8306dc0db9a551e92e8b5662ad8" ++ resolved "https://repo.huaweicloud.com/repository/npm/cssauron/-/cssauron-1.4.0.tgz#a6602dff7e04a8306dc0db9a551e92e8b5662ad8" + dependencies: + through X.X.X + + cssesc@^0.1.0: + version "0.1.0" +- resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-0.1.0.tgz#c814903e45623371a0477b40109aaafbeeaddbb4" ++ resolved "https://repo.huaweicloud.com/repository/npm/cssesc/-/cssesc-0.1.0.tgz#c814903e45623371a0477b40109aaafbeeaddbb4" + + "cssnano@>=2.6.1 <4", cssnano@^3.10.0: + version "3.10.0" +- resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-3.10.0.tgz#4f38f6cea2b9b17fa01490f23f1dc68ea65c1c38" ++ resolved "https://repo.huaweicloud.com/repository/npm/cssnano/-/cssnano-3.10.0.tgz#4f38f6cea2b9b17fa01490f23f1dc68ea65c1c38" + dependencies: + autoprefixer "^6.3.1" + decamelize "^1.1.2" +@@ -1654,32 +1654,32 @@ + + csso@~2.3.1: + version "2.3.2" +- resolved "https://registry.yarnpkg.com/csso/-/csso-2.3.2.tgz#ddd52c587033f49e94b71fc55569f252e8ff5f85" ++ resolved "https://repo.huaweicloud.com/repository/npm/csso/-/csso-2.3.2.tgz#ddd52c587033f49e94b71fc55569f252e8ff5f85" + dependencies: + clap "^1.0.9" + source-map "^0.5.3" + + currently-unhandled@^0.4.1: + version "0.4.1" +- resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" ++ resolved "https://repo.huaweicloud.com/repository/npm/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" + dependencies: + array-find-index "^1.0.1" + + custom-event@~1.0.0: + version "1.0.1" +- resolved "https://registry.yarnpkg.com/custom-event/-/custom-event-1.0.1.tgz#5d02a46850adf1b4a317946a3928fccb5bfd0425" ++ resolved "https://repo.huaweicloud.com/repository/npm/custom-event/-/custom-event-1.0.1.tgz#5d02a46850adf1b4a317946a3928fccb5bfd0425" + + d3-array@1, d3-array@1.2.0, d3-array@^1.2.0: + version "1.2.0" +- resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-1.2.0.tgz#147d269720e174c4057a7f42be8b0f3f2ba53108" ++ resolved "https://repo.huaweicloud.com/repository/npm/d3-array/-/d3-array-1.2.0.tgz#147d269720e174c4057a7f42be8b0f3f2ba53108" + + d3-axis@1.0.8: + version "1.0.8" +- resolved "https://registry.yarnpkg.com/d3-axis/-/d3-axis-1.0.8.tgz#31a705a0b535e65759de14173a31933137f18efa" ++ resolved "https://repo.huaweicloud.com/repository/npm/d3-axis/-/d3-axis-1.0.8.tgz#31a705a0b535e65759de14173a31933137f18efa" + + d3-brush@1.0.4: + version "1.0.4" +- resolved "https://registry.yarnpkg.com/d3-brush/-/d3-brush-1.0.4.tgz#00c2f238019f24f6c0a194a26d41a1530ffe7bc4" ++ resolved "https://repo.huaweicloud.com/repository/npm/d3-brush/-/d3-brush-1.0.4.tgz#00c2f238019f24f6c0a194a26d41a1530ffe7bc4" + dependencies: + d3-dispatch "1" + d3-drag "1" +@@ -1689,33 +1689,33 @@ + + d3-chord@1.0.4: + version "1.0.4" +- resolved "https://registry.yarnpkg.com/d3-chord/-/d3-chord-1.0.4.tgz#7dec4f0ba886f713fe111c45f763414f6f74ca2c" ++ resolved "https://repo.huaweicloud.com/repository/npm/d3-chord/-/d3-chord-1.0.4.tgz#7dec4f0ba886f713fe111c45f763414f6f74ca2c" + dependencies: + d3-array "1" + d3-path "1" + + d3-collection@1, d3-collection@1.0.4: + version "1.0.4" +- resolved "https://registry.yarnpkg.com/d3-collection/-/d3-collection-1.0.4.tgz#342dfd12837c90974f33f1cc0a785aea570dcdc2" ++ resolved "https://repo.huaweicloud.com/repository/npm/d3-collection/-/d3-collection-1.0.4.tgz#342dfd12837c90974f33f1cc0a785aea570dcdc2" + + d3-color@1, d3-color@1.0.3: + version "1.0.3" +- resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-1.0.3.tgz#bc7643fca8e53a8347e2fbdaffa236796b58509b" ++ resolved "https://repo.huaweicloud.com/repository/npm/d3-color/-/d3-color-1.0.3.tgz#bc7643fca8e53a8347e2fbdaffa236796b58509b" + + d3-dispatch@1, d3-dispatch@1.0.3: + version "1.0.3" +- resolved "https://registry.yarnpkg.com/d3-dispatch/-/d3-dispatch-1.0.3.tgz#46e1491eaa9b58c358fce5be4e8bed626e7871f8" ++ resolved "https://repo.huaweicloud.com/repository/npm/d3-dispatch/-/d3-dispatch-1.0.3.tgz#46e1491eaa9b58c358fce5be4e8bed626e7871f8" + + d3-drag@1, d3-drag@1.1.1: + version "1.1.1" +- resolved "https://registry.yarnpkg.com/d3-drag/-/d3-drag-1.1.1.tgz#b5155304433b18ba38726b2184d0098e820dc64b" ++ resolved "https://repo.huaweicloud.com/repository/npm/d3-drag/-/d3-drag-1.1.1.tgz#b5155304433b18ba38726b2184d0098e820dc64b" + dependencies: + d3-dispatch "1" + d3-selection "1" + + d3-dsv@1: + version "1.0.5" +- resolved "https://registry.yarnpkg.com/d3-dsv/-/d3-dsv-1.0.5.tgz#419f7db47f628789fc3fdb636e678449d0821136" ++ resolved "https://repo.huaweicloud.com/repository/npm/d3-dsv/-/d3-dsv-1.0.5.tgz#419f7db47f628789fc3fdb636e678449d0821136" + dependencies: + commander "2" + iconv-lite "0.4" +@@ -1723,7 +1723,7 @@ + + d3-dsv@1.0.7: + version "1.0.7" +- resolved "https://registry.yarnpkg.com/d3-dsv/-/d3-dsv-1.0.7.tgz#137076663f398428fc3d031ae65370522492b78f" ++ resolved "https://repo.huaweicloud.com/repository/npm/d3-dsv/-/d3-dsv-1.0.7.tgz#137076663f398428fc3d031ae65370522492b78f" + dependencies: + commander "2" + iconv-lite "0.4" +@@ -1731,11 +1731,11 @@ + + d3-ease@1, d3-ease@1.0.3: + version "1.0.3" +- resolved "https://registry.yarnpkg.com/d3-ease/-/d3-ease-1.0.3.tgz#68bfbc349338a380c44d8acc4fbc3304aa2d8c0e" ++ resolved "https://repo.huaweicloud.com/repository/npm/d3-ease/-/d3-ease-1.0.3.tgz#68bfbc349338a380c44d8acc4fbc3304aa2d8c0e" + + d3-force@1.0.6: + version "1.0.6" +- resolved "https://registry.yarnpkg.com/d3-force/-/d3-force-1.0.6.tgz#ea7e1b7730e2664cd314f594d6718c57cc132b79" ++ resolved "https://repo.huaweicloud.com/repository/npm/d3-force/-/d3-force-1.0.6.tgz#ea7e1b7730e2664cd314f594d6718c57cc132b79" + dependencies: + d3-collection "1" + d3-dispatch "1" +@@ -1744,47 +1744,47 @@ + + d3-format@1, d3-format@1.2.0: + version "1.2.0" +- resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-1.2.0.tgz#6b480baa886885d4651dc248a8f4ac9da16db07a" ++ resolved "https://repo.huaweicloud.com/repository/npm/d3-format/-/d3-format-1.2.0.tgz#6b480baa886885d4651dc248a8f4ac9da16db07a" + + d3-geo@1.6.4: + version "1.6.4" +- resolved "https://registry.yarnpkg.com/d3-geo/-/d3-geo-1.6.4.tgz#f20e1e461cb1845f5a8be55ab6f876542a7e3199" ++ resolved "https://repo.huaweicloud.com/repository/npm/d3-geo/-/d3-geo-1.6.4.tgz#f20e1e461cb1845f5a8be55ab6f876542a7e3199" + dependencies: + d3-array "1" + + d3-hierarchy@1.1.5: + version "1.1.5" +- resolved "https://registry.yarnpkg.com/d3-hierarchy/-/d3-hierarchy-1.1.5.tgz#a1c845c42f84a206bcf1c01c01098ea4ddaa7a26" ++ resolved "https://repo.huaweicloud.com/repository/npm/d3-hierarchy/-/d3-hierarchy-1.1.5.tgz#a1c845c42f84a206bcf1c01c01098ea4ddaa7a26" + + d3-interpolate@1, d3-interpolate@1.1.5: + version "1.1.5" +- resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-1.1.5.tgz#69e099ff39214716e563c9aec3ea9d1ea4b8a79f" ++ resolved "https://repo.huaweicloud.com/repository/npm/d3-interpolate/-/d3-interpolate-1.1.5.tgz#69e099ff39214716e563c9aec3ea9d1ea4b8a79f" + dependencies: + d3-color "1" + + d3-path@1, d3-path@1.0.5: + version "1.0.5" +- resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-1.0.5.tgz#241eb1849bd9e9e8021c0d0a799f8a0e8e441764" ++ resolved "https://repo.huaweicloud.com/repository/npm/d3-path/-/d3-path-1.0.5.tgz#241eb1849bd9e9e8021c0d0a799f8a0e8e441764" + + d3-polygon@1.0.3: + version "1.0.3" +- resolved "https://registry.yarnpkg.com/d3-polygon/-/d3-polygon-1.0.3.tgz#16888e9026460933f2b179652ad378224d382c62" ++ resolved "https://repo.huaweicloud.com/repository/npm/d3-polygon/-/d3-polygon-1.0.3.tgz#16888e9026460933f2b179652ad378224d382c62" + + d3-quadtree@1, d3-quadtree@1.0.3: + version "1.0.3" +- resolved "https://registry.yarnpkg.com/d3-quadtree/-/d3-quadtree-1.0.3.tgz#ac7987e3e23fe805a990f28e1b50d38fcb822438" ++ resolved "https://repo.huaweicloud.com/repository/npm/d3-quadtree/-/d3-quadtree-1.0.3.tgz#ac7987e3e23fe805a990f28e1b50d38fcb822438" + + d3-queue@3.0.7: + version "3.0.7" +- resolved "https://registry.yarnpkg.com/d3-queue/-/d3-queue-3.0.7.tgz#c93a2e54b417c0959129d7d73f6cf7d4292e7618" ++ resolved "https://repo.huaweicloud.com/repository/npm/d3-queue/-/d3-queue-3.0.7.tgz#c93a2e54b417c0959129d7d73f6cf7d4292e7618" + + d3-random@1.1.0: + version "1.1.0" +- resolved "https://registry.yarnpkg.com/d3-random/-/d3-random-1.1.0.tgz#6642e506c6fa3a648595d2b2469788a8d12529d3" ++ resolved "https://repo.huaweicloud.com/repository/npm/d3-random/-/d3-random-1.1.0.tgz#6642e506c6fa3a648595d2b2469788a8d12529d3" + + d3-request@1.0.6: + version "1.0.6" +- resolved "https://registry.yarnpkg.com/d3-request/-/d3-request-1.0.6.tgz#a1044a9ef4ec28c824171c9379fae6d79474b19f" ++ resolved "https://repo.huaweicloud.com/repository/npm/d3-request/-/d3-request-1.0.6.tgz#a1044a9ef4ec28c824171c9379fae6d79474b19f" + dependencies: + d3-collection "1" + d3-dispatch "1" +@@ -1793,13 +1793,13 @@ + + d3-scale-chromatic@^1.1.1: + version "1.1.1" +- resolved "https://registry.yarnpkg.com/d3-scale-chromatic/-/d3-scale-chromatic-1.1.1.tgz#811406e8e09dab78a49dac4a32047d5d3edd0c44" ++ resolved "https://repo.huaweicloud.com/repository/npm/d3-scale-chromatic/-/d3-scale-chromatic-1.1.1.tgz#811406e8e09dab78a49dac4a32047d5d3edd0c44" + dependencies: + d3-interpolate "1" + + d3-scale@1.0.6: + version "1.0.6" +- resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-1.0.6.tgz#bce19da80d3a0cf422c9543ae3322086220b34ed" ++ resolved "https://repo.huaweicloud.com/repository/npm/d3-scale/-/d3-scale-1.0.6.tgz#bce19da80d3a0cf422c9543ae3322086220b34ed" + dependencies: + d3-array "^1.2.0" + d3-collection "1" +@@ -1811,35 +1811,35 @@ + + d3-selection@1, d3-selection@1.1.0, d3-selection@^1.1.0: + version "1.1.0" +- resolved "https://registry.yarnpkg.com/d3-selection/-/d3-selection-1.1.0.tgz#1998684896488f839ca0372123da34f1d318809c" ++ resolved "https://repo.huaweicloud.com/repository/npm/d3-selection/-/d3-selection-1.1.0.tgz#1998684896488f839ca0372123da34f1d318809c" + + d3-shape@1.2.0: + version "1.2.0" +- resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-1.2.0.tgz#45d01538f064bafd05ea3d6d2cb748fd8c41f777" ++ resolved "https://repo.huaweicloud.com/repository/npm/d3-shape/-/d3-shape-1.2.0.tgz#45d01538f064bafd05ea3d6d2cb748fd8c41f777" + dependencies: + d3-path "1" + + d3-time-format@2, d3-time-format@2.0.5: + version "2.0.5" +- resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-2.0.5.tgz#9d7780204f7c9119c9170b1a56db4de9a8af972e" ++ resolved "https://repo.huaweicloud.com/repository/npm/d3-time-format/-/d3-time-format-2.0.5.tgz#9d7780204f7c9119c9170b1a56db4de9a8af972e" + dependencies: + d3-time "1" + + d3-time@1, d3-time@1.0.7: + version "1.0.7" +- resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-1.0.7.tgz#94caf6edbb7879bb809d0d1f7572bc48482f7270" ++ resolved "https://repo.huaweicloud.com/repository/npm/d3-time/-/d3-time-1.0.7.tgz#94caf6edbb7879bb809d0d1f7572bc48482f7270" + + d3-timer@1: + version "1.0.6" +- resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-1.0.6.tgz#4044bf15d7025c06ce7d1149f73cd07b54dbd784" ++ resolved "https://repo.huaweicloud.com/repository/npm/d3-timer/-/d3-timer-1.0.6.tgz#4044bf15d7025c06ce7d1149f73cd07b54dbd784" + + d3-timer@1.0.7: + version "1.0.7" +- resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-1.0.7.tgz#df9650ca587f6c96607ff4e60cc38229e8dd8531" ++ resolved "https://repo.huaweicloud.com/repository/npm/d3-timer/-/d3-timer-1.0.7.tgz#df9650ca587f6c96607ff4e60cc38229e8dd8531" + + d3-transition@1, d3-transition@1.1.0: + version "1.1.0" +- resolved "https://registry.yarnpkg.com/d3-transition/-/d3-transition-1.1.0.tgz#cfc85c74e5239324290546623572990560c3966f" ++ resolved "https://repo.huaweicloud.com/repository/npm/d3-transition/-/d3-transition-1.1.0.tgz#cfc85c74e5239324290546623572990560c3966f" + dependencies: + d3-color "1" + d3-dispatch "1" +@@ -1850,11 +1850,11 @@ + + d3-voronoi@1.1.2: + version "1.1.2" +- resolved "https://registry.yarnpkg.com/d3-voronoi/-/d3-voronoi-1.1.2.tgz#1687667e8f13a2d158c80c1480c5a29cb0d8973c" ++ resolved "https://repo.huaweicloud.com/repository/npm/d3-voronoi/-/d3-voronoi-1.1.2.tgz#1687667e8f13a2d158c80c1480c5a29cb0d8973c" + + d3-zoom@1.5.0: + version "1.5.0" +- resolved "https://registry.yarnpkg.com/d3-zoom/-/d3-zoom-1.5.0.tgz#8417de9a077f98f9ce83b1998efb8ee12b4db26e" ++ resolved "https://repo.huaweicloud.com/repository/npm/d3-zoom/-/d3-zoom-1.5.0.tgz#8417de9a077f98f9ce83b1998efb8ee12b4db26e" + dependencies: + d3-dispatch "1" + d3-drag "1" +@@ -1864,7 +1864,7 @@ + + d3@^4.10.0: + version "4.10.2" +- resolved "https://registry.yarnpkg.com/d3/-/d3-4.10.2.tgz#d401b2bc0372a77e6822f278c0e4b4090206babd" ++ resolved "https://repo.huaweicloud.com/repository/npm/d3/-/d3-4.10.2.tgz#d401b2bc0372a77e6822f278c0e4b4090206babd" + dependencies: + d3-array "1.2.0" + d3-axis "1.0.8" +@@ -1899,82 +1899,82 @@ + + d@1: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f" ++ resolved "https://repo.huaweicloud.com/repository/npm/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f" + dependencies: + es5-ext "^0.10.9" + + dashdash@^1.12.0: + version "1.14.1" +- resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" ++ resolved "https://repo.huaweicloud.com/repository/npm/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + dependencies: + assert-plus "^1.0.0" + + date-now@^0.1.4: + version "0.1.4" +- resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" ++ resolved "https://repo.huaweicloud.com/repository/npm/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" + + debug@*: + version "3.0.1" +- resolved "https://registry.yarnpkg.com/debug/-/debug-3.0.1.tgz#0564c612b521dc92d9f2988f0549e34f9c98db64" ++ resolved "https://repo.huaweicloud.com/repository/npm/debug/-/debug-3.0.1.tgz#0564c612b521dc92d9f2988f0549e34f9c98db64" + dependencies: + ms "2.0.0" + + debug@2, debug@2.6.8, debug@^2.2.0, debug@^2.6.3, debug@^2.6.6, debug@^2.6.8: + version "2.6.8" +- resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc" ++ resolved "https://repo.huaweicloud.com/repository/npm/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc" + dependencies: + ms "2.0.0" + + debug@2.2.0: + version "2.2.0" +- resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" ++ resolved "https://repo.huaweicloud.com/repository/npm/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" + dependencies: + ms "0.7.1" + + debug@2.3.3: + version "2.3.3" +- resolved "https://registry.yarnpkg.com/debug/-/debug-2.3.3.tgz#40c453e67e6e13c901ddec317af8986cda9eff8c" ++ resolved "https://repo.huaweicloud.com/repository/npm/debug/-/debug-2.3.3.tgz#40c453e67e6e13c901ddec317af8986cda9eff8c" + dependencies: + ms "0.7.2" + + debug@2.6.7: + version "2.6.7" +- resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.7.tgz#92bad1f6d05bbb6bba22cca88bcd0ec894c2861e" ++ resolved "https://repo.huaweicloud.com/repository/npm/debug/-/debug-2.6.7.tgz#92bad1f6d05bbb6bba22cca88bcd0ec894c2861e" + dependencies: + ms "2.0.0" + + decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2: + version "1.2.0" +- resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" ++ resolved "https://repo.huaweicloud.com/repository/npm/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + + deep-equal@^1.0.1: + version "1.0.1" +- resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" ++ resolved "https://repo.huaweicloud.com/repository/npm/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" + + deep-extend@~0.4.0: + version "0.4.2" +- resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f" ++ resolved "https://repo.huaweicloud.com/repository/npm/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f" + + default-require-extensions@^1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-1.0.0.tgz#f37ea15d3e13ffd9b437d33e1a75b5fb97874cb8" ++ resolved "https://repo.huaweicloud.com/repository/npm/default-require-extensions/-/default-require-extensions-1.0.0.tgz#f37ea15d3e13ffd9b437d33e1a75b5fb97874cb8" + dependencies: + strip-bom "^2.0.0" + + define-properties@^1.1.2: + version "1.1.2" +- resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94" ++ resolved "https://repo.huaweicloud.com/repository/npm/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94" + dependencies: + foreach "^2.0.5" + object-keys "^1.0.8" + + defined@^1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" ++ resolved "https://repo.huaweicloud.com/repository/npm/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" + + del@^2.2.0: + version "2.2.2" +- resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" ++ resolved "https://repo.huaweicloud.com/repository/npm/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" + dependencies: + globby "^5.0.0" + is-path-cwd "^1.0.0" +@@ -1986,7 +1986,7 @@ + + del@^3.0.0: + version "3.0.0" +- resolved "https://registry.yarnpkg.com/del/-/del-3.0.0.tgz#53ecf699ffcbcb39637691ab13baf160819766e5" ++ resolved "https://repo.huaweicloud.com/repository/npm/del/-/del-3.0.0.tgz#53ecf699ffcbcb39637691ab13baf160819766e5" + dependencies: + globby "^6.1.0" + is-path-cwd "^1.0.0" +@@ -1997,56 +1997,56 @@ + + delayed-stream@~1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" ++ resolved "https://repo.huaweicloud.com/repository/npm/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + + delegates@^1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" ++ resolved "https://repo.huaweicloud.com/repository/npm/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + + denodeify@^1.2.1: + version "1.2.1" +- resolved "https://registry.yarnpkg.com/denodeify/-/denodeify-1.2.1.tgz#3a36287f5034e699e7577901052c2e6c94251631" ++ resolved "https://repo.huaweicloud.com/repository/npm/denodeify/-/denodeify-1.2.1.tgz#3a36287f5034e699e7577901052c2e6c94251631" + + depd@1.1.0, depd@~1.1.0: + version "1.1.0" +- resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.0.tgz#e1bd82c6aab6ced965b97b88b17ed3e528ca18c3" ++ resolved "https://repo.huaweicloud.com/repository/npm/depd/-/depd-1.1.0.tgz#e1bd82c6aab6ced965b97b88b17ed3e528ca18c3" + + depd@1.1.1, depd@~1.1.1: + version "1.1.1" +- resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359" ++ resolved "https://repo.huaweicloud.com/repository/npm/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359" + + des.js@^1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc" ++ resolved "https://repo.huaweicloud.com/repository/npm/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc" + dependencies: + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + + destroy@~1.0.4: + version "1.0.4" +- resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" ++ resolved "https://repo.huaweicloud.com/repository/npm/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + + detect-indent@^4.0.0: + version "4.0.0" +- resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" ++ resolved "https://repo.huaweicloud.com/repository/npm/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" + dependencies: + repeating "^2.0.0" + + detect-node@^2.0.3: + version "2.0.3" +- resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.3.tgz#a2033c09cc8e158d37748fbde7507832bd6ce127" ++ resolved "https://repo.huaweicloud.com/repository/npm/detect-node/-/detect-node-2.0.3.tgz#a2033c09cc8e158d37748fbde7507832bd6ce127" + + di@^0.0.1: + version "0.0.1" +- resolved "https://registry.yarnpkg.com/di/-/di-0.0.1.tgz#806649326ceaa7caa3306d75d985ea2748ba913c" ++ resolved "https://repo.huaweicloud.com/repository/npm/di/-/di-0.0.1.tgz#806649326ceaa7caa3306d75d985ea2748ba913c" + + diff@^3.0.1, diff@^3.1.0: + version "3.2.0" +- resolved "https://registry.yarnpkg.com/diff/-/diff-3.2.0.tgz#c9ce393a4b7cbd0b058a725c93df299027868ff9" ++ resolved "https://repo.huaweicloud.com/repository/npm/diff/-/diff-3.2.0.tgz#c9ce393a4b7cbd0b058a725c93df299027868ff9" + + diffie-hellman@^5.0.0: + version "5.0.2" +- resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.2.tgz#b5835739270cfe26acf632099fded2a07f209e5e" ++ resolved "https://repo.huaweicloud.com/repository/npm/diffie-hellman/-/diffie-hellman-5.0.2.tgz#b5835739270cfe26acf632099fded2a07f209e5e" + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" +@@ -2054,7 +2054,7 @@ + + directory-encoder@^0.7.2: + version "0.7.2" +- resolved "https://registry.yarnpkg.com/directory-encoder/-/directory-encoder-0.7.2.tgz#59b4e2aa4f25422f6c63b527b462f5e2d0dd2c58" ++ resolved "https://repo.huaweicloud.com/repository/npm/directory-encoder/-/directory-encoder-0.7.2.tgz#59b4e2aa4f25422f6c63b527b462f5e2d0dd2c58" + dependencies: + fs-extra "^0.23.1" + handlebars "^1.3.0" +@@ -2062,30 +2062,30 @@ + + dns-equal@^1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" ++ resolved "https://repo.huaweicloud.com/repository/npm/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" + + dns-packet@^1.0.1: + version "1.2.2" +- resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.2.2.tgz#a8a26bec7646438963fc86e06f8f8b16d6c8bf7a" ++ resolved "https://repo.huaweicloud.com/repository/npm/dns-packet/-/dns-packet-1.2.2.tgz#a8a26bec7646438963fc86e06f8f8b16d6c8bf7a" + dependencies: + ip "^1.1.0" + safe-buffer "^5.0.1" + + dns-txt@^2.0.2: + version "2.0.2" +- resolved "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6" ++ resolved "https://repo.huaweicloud.com/repository/npm/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6" + dependencies: + buffer-indexof "^1.0.0" + + dom-converter@~0.1: + version "0.1.4" +- resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.1.4.tgz#a45ef5727b890c9bffe6d7c876e7b19cb0e17f3b" ++ resolved "https://repo.huaweicloud.com/repository/npm/dom-converter/-/dom-converter-0.1.4.tgz#a45ef5727b890c9bffe6d7c876e7b19cb0e17f3b" + dependencies: + utila "~0.3" + + dom-serialize@^2.2.0: + version "2.2.1" +- resolved "https://registry.yarnpkg.com/dom-serialize/-/dom-serialize-2.2.1.tgz#562ae8999f44be5ea3076f5419dcd59eb43ac95b" ++ resolved "https://repo.huaweicloud.com/repository/npm/dom-serialize/-/dom-serialize-2.2.1.tgz#562ae8999f44be5ea3076f5419dcd59eb43ac95b" + dependencies: + custom-event "~1.0.0" + ent "~2.2.0" +@@ -2094,73 +2094,73 @@ + + dom-serializer@0: + version "0.1.0" +- resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82" ++ resolved "https://repo.huaweicloud.com/repository/npm/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82" + dependencies: + domelementtype "~1.1.1" + entities "~1.1.1" + + domain-browser@^1.1.1: + version "1.1.7" +- resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.1.7.tgz#867aa4b093faa05f1de08c06f4d7b21fdf8698bc" ++ resolved "https://repo.huaweicloud.com/repository/npm/domain-browser/-/domain-browser-1.1.7.tgz#867aa4b093faa05f1de08c06f4d7b21fdf8698bc" + + domelementtype@1: + version "1.3.0" +- resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.0.tgz#b17aed82e8ab59e52dd9c19b1756e0fc187204c2" ++ resolved "https://repo.huaweicloud.com/repository/npm/domelementtype/-/domelementtype-1.3.0.tgz#b17aed82e8ab59e52dd9c19b1756e0fc187204c2" + + domelementtype@~1.1.1: + version "1.1.3" +- resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.1.3.tgz#bd28773e2642881aec51544924299c5cd822185b" ++ resolved "https://repo.huaweicloud.com/repository/npm/domelementtype/-/domelementtype-1.1.3.tgz#bd28773e2642881aec51544924299c5cd822185b" + + domhandler@2.1: + version "2.1.0" +- resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.1.0.tgz#d2646f5e57f6c3bab11cf6cb05d3c0acf7412594" ++ resolved "https://repo.huaweicloud.com/repository/npm/domhandler/-/domhandler-2.1.0.tgz#d2646f5e57f6c3bab11cf6cb05d3c0acf7412594" + dependencies: + domelementtype "1" + + domutils@1.1: + version "1.1.6" +- resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.1.6.tgz#bddc3de099b9a2efacc51c623f28f416ecc57485" ++ resolved "https://repo.huaweicloud.com/repository/npm/domutils/-/domutils-1.1.6.tgz#bddc3de099b9a2efacc51c623f28f416ecc57485" + dependencies: + domelementtype "1" + + domutils@1.5.1: + version "1.5.1" +- resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" ++ resolved "https://repo.huaweicloud.com/repository/npm/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" + dependencies: + dom-serializer "0" + domelementtype "1" + + dot-prop@^4.1.0: + version "4.1.1" +- resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.1.1.tgz#a8493f0b7b5eeec82525b5c7587fa7de7ca859c1" ++ resolved "https://repo.huaweicloud.com/repository/npm/dot-prop/-/dot-prop-4.1.1.tgz#a8493f0b7b5eeec82525b5c7587fa7de7ca859c1" + dependencies: + is-obj "^1.0.0" + + duplexer3@^0.1.4: + version "0.1.4" +- resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" ++ resolved "https://repo.huaweicloud.com/repository/npm/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" + + ecc-jsbn@~0.1.1: + version "0.1.1" +- resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" ++ resolved "https://repo.huaweicloud.com/repository/npm/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" + dependencies: + jsbn "~0.1.0" + + ee-first@1.1.1: + version "1.1.1" +- resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" ++ resolved "https://repo.huaweicloud.com/repository/npm/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + + ejs@^2.5.7: + version "2.5.7" +- resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.5.7.tgz#cc872c168880ae3c7189762fd5ffc00896c9518a" ++ resolved "https://repo.huaweicloud.com/repository/npm/ejs/-/ejs-2.5.7.tgz#cc872c168880ae3c7189762fd5ffc00896c9518a" + + electron-to-chromium@^1.2.7: + version "1.3.21" +- resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.21.tgz#a967ebdcfe8ed0083fc244d1894022a8e8113ea2" ++ resolved "https://repo.huaweicloud.com/repository/npm/electron-to-chromium/-/electron-to-chromium-1.3.21.tgz#a967ebdcfe8ed0083fc244d1894022a8e8113ea2" + + elliptic@^6.0.0: + version "6.4.0" +- resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.0.tgz#cac9af8762c85836187003c8dfe193e5e2eae5df" ++ resolved "https://repo.huaweicloud.com/repository/npm/elliptic/-/elliptic-6.4.0.tgz#cac9af8762c85836187003c8dfe193e5e2eae5df" + dependencies: + bn.js "^4.4.0" + brorand "^1.0.1" +@@ -2172,19 +2172,19 @@ + + ember-cli-string-utils@^1.0.0: + version "1.1.0" +- resolved "https://registry.yarnpkg.com/ember-cli-string-utils/-/ember-cli-string-utils-1.1.0.tgz#39b677fc2805f55173735376fcef278eaa4452a1" ++ resolved "https://repo.huaweicloud.com/repository/npm/ember-cli-string-utils/-/ember-cli-string-utils-1.1.0.tgz#39b677fc2805f55173735376fcef278eaa4452a1" + + emojis-list@^2.0.0: + version "2.1.0" +- resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" ++ resolved "https://repo.huaweicloud.com/repository/npm/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" + + encodeurl@~1.0.1: + version "1.0.1" +- resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.1.tgz#79e3d58655346909fe6f0f45a5de68103b294d20" ++ resolved "https://repo.huaweicloud.com/repository/npm/encodeurl/-/encodeurl-1.0.1.tgz#79e3d58655346909fe6f0f45a5de68103b294d20" + + engine.io-client@1.8.2: + version "1.8.2" +- resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-1.8.2.tgz#c38767547f2a7d184f5752f6f0ad501006703766" ++ resolved "https://repo.huaweicloud.com/repository/npm/engine.io-client/-/engine.io-client-1.8.2.tgz#c38767547f2a7d184f5752f6f0ad501006703766" + dependencies: + component-emitter "1.2.1" + component-inherit "0.0.3" +@@ -2201,7 +2201,7 @@ + + engine.io-parser@1.3.2: + version "1.3.2" +- resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-1.3.2.tgz#937b079f0007d0893ec56d46cb220b8cb435220a" ++ resolved "https://repo.huaweicloud.com/repository/npm/engine.io-parser/-/engine.io-parser-1.3.2.tgz#937b079f0007d0893ec56d46cb220b8cb435220a" + dependencies: + after "0.8.2" + arraybuffer.slice "0.0.6" +@@ -2212,7 +2212,7 @@ + + engine.io@1.8.2: + version "1.8.2" +- resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-1.8.2.tgz#6b59be730b348c0125b0a4589de1c355abcf7a7e" ++ resolved "https://repo.huaweicloud.com/repository/npm/engine.io/-/engine.io-1.8.2.tgz#6b59be730b348c0125b0a4589de1c355abcf7a7e" + dependencies: + accepts "1.3.3" + base64id "1.0.0" +@@ -2223,7 +2223,7 @@ + + enhanced-resolve@^3.1.0, enhanced-resolve@^3.4.0: + version "3.4.1" +- resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz#0421e339fd71419b3da13d129b3979040230476e" ++ resolved "https://repo.huaweicloud.com/repository/npm/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz#0421e339fd71419b3da13d129b3979040230476e" + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.4.0" +@@ -2232,27 +2232,27 @@ + + ent@~2.2.0: + version "2.2.0" +- resolved "https://registry.yarnpkg.com/ent/-/ent-2.2.0.tgz#e964219325a21d05f44466a2f686ed6ce5f5dd1d" ++ resolved "https://repo.huaweicloud.com/repository/npm/ent/-/ent-2.2.0.tgz#e964219325a21d05f44466a2f686ed6ce5f5dd1d" + + entities@~1.1.1: + version "1.1.1" +- resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0" ++ resolved "https://repo.huaweicloud.com/repository/npm/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0" + + errno@^0.1.1, errno@^0.1.3: + version "0.1.4" +- resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.4.tgz#b896e23a9e5e8ba33871fc996abd3635fc9a1c7d" ++ resolved "https://repo.huaweicloud.com/repository/npm/errno/-/errno-0.1.4.tgz#b896e23a9e5e8ba33871fc996abd3635fc9a1c7d" + dependencies: + prr "~0.0.0" + + error-ex@^1.2.0: + version "1.3.1" +- resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" ++ resolved "https://repo.huaweicloud.com/repository/npm/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" + dependencies: + is-arrayish "^0.2.1" + + es-abstract@^1.7.0: + version "1.8.2" +- resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.8.2.tgz#25103263dc4decbda60e0c737ca32313518027ee" ++ resolved "https://repo.huaweicloud.com/repository/npm/es-abstract/-/es-abstract-1.8.2.tgz#25103263dc4decbda60e0c737ca32313518027ee" + dependencies: + es-to-primitive "^1.1.1" + function-bind "^1.1.1" +@@ -2262,7 +2262,7 @@ + + es-to-primitive@^1.1.1: + version "1.1.1" +- resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d" ++ resolved "https://repo.huaweicloud.com/repository/npm/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d" + dependencies: + is-callable "^1.1.1" + is-date-object "^1.0.1" +@@ -2270,14 +2270,14 @@ + + es5-ext@^0.10.14, es5-ext@^0.10.9, es5-ext@~0.10.14: + version "0.10.30" +- resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.30.tgz#7141a16836697dbabfaaaeee41495ce29f52c939" ++ resolved "https://repo.huaweicloud.com/repository/npm/es5-ext/-/es5-ext-0.10.30.tgz#7141a16836697dbabfaaaeee41495ce29f52c939" + dependencies: + es6-iterator "2" + es6-symbol "~3.1" + + es6-iterator@2, es6-iterator@^2.0.1, es6-iterator@~2.0.1: + version "2.0.1" +- resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.1.tgz#8e319c9f0453bf575d374940a655920e59ca5512" ++ resolved "https://repo.huaweicloud.com/repository/npm/es6-iterator/-/es6-iterator-2.0.1.tgz#8e319c9f0453bf575d374940a655920e59ca5512" + dependencies: + d "1" + es5-ext "^0.10.14" +@@ -2285,7 +2285,7 @@ + + es6-map@^0.1.3: + version "0.1.5" +- resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.5.tgz#9136e0503dcc06a301690f0bb14ff4e364e949f0" ++ resolved "https://repo.huaweicloud.com/repository/npm/es6-map/-/es6-map-0.1.5.tgz#9136e0503dcc06a301690f0bb14ff4e364e949f0" + dependencies: + d "1" + es5-ext "~0.10.14" +@@ -2296,11 +2296,11 @@ + + es6-promise@~4.0.3: + version "4.0.5" +- resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.0.5.tgz#7882f30adde5b240ccfa7f7d78c548330951ae42" ++ resolved "https://repo.huaweicloud.com/repository/npm/es6-promise/-/es6-promise-4.0.5.tgz#7882f30adde5b240ccfa7f7d78c548330951ae42" + + es6-set@~0.1.5: + version "0.1.5" +- resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.5.tgz#d2b3ec5d4d800ced818db538d28974db0a73ccb1" ++ resolved "https://repo.huaweicloud.com/repository/npm/es6-set/-/es6-set-0.1.5.tgz#d2b3ec5d4d800ced818db538d28974db0a73ccb1" + dependencies: + d "1" + es5-ext "~0.10.14" +@@ -2310,14 +2310,14 @@ + + es6-symbol@3.1.1, es6-symbol@^3.1, es6-symbol@^3.1.1, es6-symbol@~3.1, es6-symbol@~3.1.1: + version "3.1.1" +- resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77" ++ resolved "https://repo.huaweicloud.com/repository/npm/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77" + dependencies: + d "1" + es5-ext "~0.10.14" + + es6-weak-map@^2.0.1: + version "2.0.2" +- resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz#5e3ab32251ffd1538a1f8e5ffa1357772f92d96f" ++ resolved "https://repo.huaweicloud.com/repository/npm/es6-weak-map/-/es6-weak-map-2.0.2.tgz#5e3ab32251ffd1538a1f8e5ffa1357772f92d96f" + dependencies: + d "1" + es5-ext "^0.10.14" +@@ -2326,15 +2326,15 @@ + + escape-html@~1.0.3: + version "1.0.3" +- resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" ++ resolved "https://repo.huaweicloud.com/repository/npm/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + + escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: + version "1.0.5" +- resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" ++ resolved "https://repo.huaweicloud.com/repository/npm/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + + escope@^3.6.0: + version "3.6.0" +- resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3" ++ resolved "https://repo.huaweicloud.com/repository/npm/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3" + dependencies: + es6-map "^0.1.3" + es6-weak-map "^2.0.1" +@@ -2343,66 +2343,66 @@ + + esprima@^2.6.0: + version "2.7.3" +- resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" ++ resolved "https://repo.huaweicloud.com/repository/npm/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" + + esprima@^3.1.1: + version "3.1.3" +- resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" ++ resolved "https://repo.huaweicloud.com/repository/npm/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" + + esprima@^4.0.0: + version "4.0.0" +- resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" ++ resolved "https://repo.huaweicloud.com/repository/npm/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" + + esrecurse@^4.1.0: + version "4.2.0" +- resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.0.tgz#fa9568d98d3823f9a41d91e902dcab9ea6e5b163" ++ resolved "https://repo.huaweicloud.com/repository/npm/esrecurse/-/esrecurse-4.2.0.tgz#fa9568d98d3823f9a41d91e902dcab9ea6e5b163" + dependencies: + estraverse "^4.1.0" + object-assign "^4.0.1" + + estraverse@^4.1.0, estraverse@^4.1.1: + version "4.2.0" +- resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" ++ resolved "https://repo.huaweicloud.com/repository/npm/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" + + esutils@^2.0.2: + version "2.0.2" +- resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" ++ resolved "https://repo.huaweicloud.com/repository/npm/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" + + etag@~1.8.0: + version "1.8.0" +- resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.0.tgz#6f631aef336d6c46362b51764044ce216be3c051" ++ resolved "https://repo.huaweicloud.com/repository/npm/etag/-/etag-1.8.0.tgz#6f631aef336d6c46362b51764044ce216be3c051" + + event-emitter@~0.3.5: + version "0.3.5" +- resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" ++ resolved "https://repo.huaweicloud.com/repository/npm/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" + dependencies: + d "1" + es5-ext "~0.10.14" + + eventemitter3@1.x.x: + version "1.2.0" +- resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-1.2.0.tgz#1c86991d816ad1e504750e73874224ecf3bec508" ++ resolved "https://repo.huaweicloud.com/repository/npm/eventemitter3/-/eventemitter3-1.2.0.tgz#1c86991d816ad1e504750e73874224ecf3bec508" + + events@^1.0.0: + version "1.1.1" +- resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" ++ resolved "https://repo.huaweicloud.com/repository/npm/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" + + eventsource@0.1.6: + version "0.1.6" +- resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-0.1.6.tgz#0acede849ed7dd1ccc32c811bb11b944d4f29232" ++ resolved "https://repo.huaweicloud.com/repository/npm/eventsource/-/eventsource-0.1.6.tgz#0acede849ed7dd1ccc32c811bb11b944d4f29232" + dependencies: + original ">=0.0.5" + + evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: + version "1.0.3" +- resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" ++ resolved "https://repo.huaweicloud.com/repository/npm/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + + execa@^0.4.0: + version "0.4.0" +- resolved "https://registry.yarnpkg.com/execa/-/execa-0.4.0.tgz#4eb6467a36a095fabb2970ff9d5e3fb7bce6ebc3" ++ resolved "https://repo.huaweicloud.com/repository/npm/execa/-/execa-0.4.0.tgz#4eb6467a36a095fabb2970ff9d5e3fb7bce6ebc3" + dependencies: + cross-spawn-async "^2.1.1" + is-stream "^1.1.0" +@@ -2413,7 +2413,7 @@ + + execa@^0.7.0: + version "0.7.0" +- resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" ++ resolved "https://repo.huaweicloud.com/repository/npm/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" + dependencies: + cross-spawn "^5.0.1" + get-stream "^3.0.0" +@@ -2425,11 +2425,11 @@ + + exit@^0.1.2: + version "0.1.2" +- resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" ++ resolved "https://repo.huaweicloud.com/repository/npm/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + + expand-braces@^0.1.1: + version "0.1.2" +- resolved "https://registry.yarnpkg.com/expand-braces/-/expand-braces-0.1.2.tgz#488b1d1d2451cb3d3a6b192cfc030f44c5855fea" ++ resolved "https://repo.huaweicloud.com/repository/npm/expand-braces/-/expand-braces-0.1.2.tgz#488b1d1d2451cb3d3a6b192cfc030f44c5855fea" + dependencies: + array-slice "^0.2.3" + array-unique "^0.2.1" +@@ -2437,33 +2437,33 @@ + + expand-brackets@^0.1.4: + version "0.1.5" +- resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" ++ resolved "https://repo.huaweicloud.com/repository/npm/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" + dependencies: + is-posix-bracket "^0.1.0" + + expand-range@^0.1.0: + version "0.1.1" +- resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-0.1.1.tgz#4cb8eda0993ca56fa4f41fc42f3cbb4ccadff044" ++ resolved "https://repo.huaweicloud.com/repository/npm/expand-range/-/expand-range-0.1.1.tgz#4cb8eda0993ca56fa4f41fc42f3cbb4ccadff044" + dependencies: + is-number "^0.1.1" + repeat-string "^0.2.2" + + expand-range@^1.8.1: + version "1.8.2" +- resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" ++ resolved "https://repo.huaweicloud.com/repository/npm/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" + dependencies: + fill-range "^2.1.0" + + exports-loader@^0.6.3: + version "0.6.4" +- resolved "https://registry.yarnpkg.com/exports-loader/-/exports-loader-0.6.4.tgz#d70fc6121975b35fc12830cf52754be2740fc886" ++ resolved "https://repo.huaweicloud.com/repository/npm/exports-loader/-/exports-loader-0.6.4.tgz#d70fc6121975b35fc12830cf52754be2740fc886" + dependencies: + loader-utils "^1.0.2" + source-map "0.5.x" + + express@^4.13.3: + version "4.15.4" +- resolved "https://registry.yarnpkg.com/express/-/express-4.15.4.tgz#032e2253489cf8fce02666beca3d11ed7a2daed1" ++ resolved "https://repo.huaweicloud.com/repository/npm/express/-/express-4.15.4.tgz#032e2253489cf8fce02666beca3d11ed7a2daed1" + dependencies: + accepts "~1.3.3" + array-flatten "1.1.1" +@@ -2496,17 +2496,17 @@ + + extend@3, extend@^3.0.0, extend@~3.0.0: + version "3.0.1" +- resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" ++ resolved "https://repo.huaweicloud.com/repository/npm/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" + + extglob@^0.3.1: + version "0.3.2" +- resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" ++ resolved "https://repo.huaweicloud.com/repository/npm/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" + dependencies: + is-extglob "^1.0.0" + + extract-text-webpack-plugin@3.0.0: + version "3.0.0" +- resolved "https://registry.yarnpkg.com/extract-text-webpack-plugin/-/extract-text-webpack-plugin-3.0.0.tgz#90caa7907bc449f335005e3ac7532b41b00de612" ++ resolved "https://repo.huaweicloud.com/repository/npm/extract-text-webpack-plugin/-/extract-text-webpack-plugin-3.0.0.tgz#90caa7907bc449f335005e3ac7532b41b00de612" + dependencies: + async "^2.4.1" + loader-utils "^1.1.0" +@@ -2515,7 +2515,7 @@ + + extract-zip@~1.6.5: + version "1.6.5" +- resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.6.5.tgz#99a06735b6ea20ea9b705d779acffcc87cff0440" ++ resolved "https://repo.huaweicloud.com/repository/npm/extract-zip/-/extract-zip-1.6.5.tgz#99a06735b6ea20ea9b705d779acffcc87cff0440" + dependencies: + concat-stream "1.6.0" + debug "2.2.0" +@@ -2524,54 +2524,54 @@ + + extsprintf@1.0.2: + version "1.0.2" +- resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550" ++ resolved "https://repo.huaweicloud.com/repository/npm/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550" + + fast-deep-equal@^1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff" ++ resolved "https://repo.huaweicloud.com/repository/npm/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff" + + fastparse@^1.1.1: + version "1.1.1" +- resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.1.tgz#d1e2643b38a94d7583b479060e6c4affc94071f8" ++ resolved "https://repo.huaweicloud.com/repository/npm/fastparse/-/fastparse-1.1.1.tgz#d1e2643b38a94d7583b479060e6c4affc94071f8" + + faye-websocket@^0.10.0: + version "0.10.0" +- resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4" ++ resolved "https://repo.huaweicloud.com/repository/npm/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4" + dependencies: + websocket-driver ">=0.5.1" + + faye-websocket@~0.11.0: + version "0.11.1" +- resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.1.tgz#f0efe18c4f56e4f40afc7e06c719fd5ee6188f38" ++ resolved "https://repo.huaweicloud.com/repository/npm/faye-websocket/-/faye-websocket-0.11.1.tgz#f0efe18c4f56e4f40afc7e06c719fd5ee6188f38" + dependencies: + websocket-driver ">=0.5.1" + + fd-slicer@~1.0.1: + version "1.0.1" +- resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.0.1.tgz#8b5bcbd9ec327c5041bf9ab023fd6750f1177e65" ++ resolved "https://repo.huaweicloud.com/repository/npm/fd-slicer/-/fd-slicer-1.0.1.tgz#8b5bcbd9ec327c5041bf9ab023fd6750f1177e65" + dependencies: + pend "~1.2.0" + + file-loader@^0.10.0: + version "0.10.1" +- resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-0.10.1.tgz#815034119891fc6441fb5a64c11bc93c22ddd842" ++ resolved "https://repo.huaweicloud.com/repository/npm/file-loader/-/file-loader-0.10.1.tgz#815034119891fc6441fb5a64c11bc93c22ddd842" + dependencies: + loader-utils "^1.0.2" + + filename-regex@^2.0.0: + version "2.0.1" +- resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" ++ resolved "https://repo.huaweicloud.com/repository/npm/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" + + fileset@^2.0.2: + version "2.0.3" +- resolved "https://registry.yarnpkg.com/fileset/-/fileset-2.0.3.tgz#8e7548a96d3cc2327ee5e674168723a333bba2a0" ++ resolved "https://repo.huaweicloud.com/repository/npm/fileset/-/fileset-2.0.3.tgz#8e7548a96d3cc2327ee5e674168723a333bba2a0" + dependencies: + glob "^7.0.3" + minimatch "^3.0.3" + + fill-range@^2.1.0: + version "2.2.3" +- resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" ++ resolved "https://repo.huaweicloud.com/repository/npm/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" + dependencies: + is-number "^2.1.0" + isobject "^2.0.0" +@@ -2581,7 +2581,7 @@ + + finalhandler@1.0.3: + version "1.0.3" +- resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.0.3.tgz#ef47e77950e999780e86022a560e3217e0d0cc89" ++ resolved "https://repo.huaweicloud.com/repository/npm/finalhandler/-/finalhandler-1.0.3.tgz#ef47e77950e999780e86022a560e3217e0d0cc89" + dependencies: + debug "2.6.7" + encodeurl "~1.0.1" +@@ -2593,7 +2593,7 @@ + + finalhandler@~1.0.4: + version "1.0.4" +- resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.0.4.tgz#18574f2e7c4b98b8ae3b230c21f201f31bdb3fb7" ++ resolved "https://repo.huaweicloud.com/repository/npm/finalhandler/-/finalhandler-1.0.4.tgz#18574f2e7c4b98b8ae3b230c21f201f31bdb3fb7" + dependencies: + debug "2.6.8" + encodeurl "~1.0.1" +@@ -2605,62 +2605,62 @@ + + find-up@^1.0.0: + version "1.1.2" +- resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" ++ resolved "https://repo.huaweicloud.com/repository/npm/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + dependencies: + path-exists "^2.0.0" + pinkie-promise "^2.0.0" + + find-up@^2.0.0: + version "2.1.0" +- resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" ++ resolved "https://repo.huaweicloud.com/repository/npm/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + dependencies: + locate-path "^2.0.0" + + findup-sync@~0.3.0: + version "0.3.0" +- resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-0.3.0.tgz#37930aa5d816b777c03445e1966cc6790a4c0b16" ++ resolved "https://repo.huaweicloud.com/repository/npm/findup-sync/-/findup-sync-0.3.0.tgz#37930aa5d816b777c03445e1966cc6790a4c0b16" + dependencies: + glob "~5.0.0" + + flatten@^1.0.2: + version "1.0.2" +- resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782" ++ resolved "https://repo.huaweicloud.com/repository/npm/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782" + + font-awesome@^4.7.0: + version "4.7.0" +- resolved "https://registry.yarnpkg.com/font-awesome/-/font-awesome-4.7.0.tgz#8fa8cf0411a1a31afd07b06d2902bb9fc815a133" ++ resolved "https://repo.huaweicloud.com/repository/npm/font-awesome/-/font-awesome-4.7.0.tgz#8fa8cf0411a1a31afd07b06d2902bb9fc815a133" + + for-in@^0.1.3: + version "0.1.8" +- resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.8.tgz#d8773908e31256109952b1fdb9b3fa867d2775e1" ++ resolved "https://repo.huaweicloud.com/repository/npm/for-in/-/for-in-0.1.8.tgz#d8773908e31256109952b1fdb9b3fa867d2775e1" + + for-in@^1.0.1: + version "1.0.2" +- resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" ++ resolved "https://repo.huaweicloud.com/repository/npm/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + + for-own@^0.1.4: + version "0.1.5" +- resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" ++ resolved "https://repo.huaweicloud.com/repository/npm/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" + dependencies: + for-in "^1.0.1" + + for-own@^1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b" ++ resolved "https://repo.huaweicloud.com/repository/npm/for-own/-/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b" + dependencies: + for-in "^1.0.1" + + foreach@^2.0.5: + version "2.0.5" +- resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" ++ resolved "https://repo.huaweicloud.com/repository/npm/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" + + forever-agent@~0.6.1: + version "0.6.1" +- resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" ++ resolved "https://repo.huaweicloud.com/repository/npm/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + + form-data@~2.1.1: + version "2.1.4" +- resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" ++ resolved "https://repo.huaweicloud.com/repository/npm/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.5" +@@ -2668,15 +2668,15 @@ + + forwarded@~0.1.0: + version "0.1.0" +- resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.0.tgz#19ef9874c4ae1c297bcf078fde63a09b66a84363" ++ resolved "https://repo.huaweicloud.com/repository/npm/forwarded/-/forwarded-0.1.0.tgz#19ef9874c4ae1c297bcf078fde63a09b66a84363" + + fresh@0.5.0: + version "0.5.0" +- resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.0.tgz#f474ca5e6a9246d6fd8e0953cfa9b9c805afa78e" ++ resolved "https://repo.huaweicloud.com/repository/npm/fresh/-/fresh-0.5.0.tgz#f474ca5e6a9246d6fd8e0953cfa9b9c805afa78e" + + fs-extra@^0.23.1: + version "0.23.1" +- resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.23.1.tgz#6611dba6adf2ab8dc9c69fab37cddf8818157e3d" ++ resolved "https://repo.huaweicloud.com/repository/npm/fs-extra/-/fs-extra-0.23.1.tgz#6611dba6adf2ab8dc9c69fab37cddf8818157e3d" + dependencies: + graceful-fs "^4.1.2" + jsonfile "^2.1.0" +@@ -2685,7 +2685,7 @@ + + fs-extra@^0.26.4: + version "0.26.7" +- resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.26.7.tgz#9ae1fdd94897798edab76d0918cf42d0c3184fa9" ++ resolved "https://repo.huaweicloud.com/repository/npm/fs-extra/-/fs-extra-0.26.7.tgz#9ae1fdd94897798edab76d0918cf42d0c3184fa9" + dependencies: + graceful-fs "^4.1.2" + jsonfile "^2.1.0" +@@ -2695,7 +2695,7 @@ + + fs-extra@^4.0.0: + version "4.0.1" +- resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.1.tgz#7fc0c6c8957f983f57f306a24e5b9ddd8d0dd880" ++ resolved "https://repo.huaweicloud.com/repository/npm/fs-extra/-/fs-extra-4.0.1.tgz#7fc0c6c8957f983f57f306a24e5b9ddd8d0dd880" + dependencies: + graceful-fs "^4.1.2" + jsonfile "^3.0.0" +@@ -2703,7 +2703,7 @@ + + fs-extra@~1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-1.0.0.tgz#cd3ce5f7e7cb6145883fcae3191e9877f8587950" ++ resolved "https://repo.huaweicloud.com/repository/npm/fs-extra/-/fs-extra-1.0.0.tgz#cd3ce5f7e7cb6145883fcae3191e9877f8587950" + dependencies: + graceful-fs "^4.1.2" + jsonfile "^2.1.0" +@@ -2711,18 +2711,18 @@ + + fs.realpath@^1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" ++ resolved "https://repo.huaweicloud.com/repository/npm/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + + fsevents@^1.0.0: + version "1.1.1" +- resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.1.tgz#f19fd28f43eeaf761680e519a203c4d0b3d31aff" ++ resolved "https://repo.huaweicloud.com/repository/npm/fsevents/-/fsevents-1.1.1.tgz#f19fd28f43eeaf761680e519a203c4d0b3d31aff" + dependencies: + nan "^2.3.0" + node-pre-gyp "^0.6.29" + + fstream-ignore@^1.0.5: + version "1.0.5" +- resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" ++ resolved "https://repo.huaweicloud.com/repository/npm/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" + dependencies: + fstream "^1.0.0" + inherits "2" +@@ -2730,7 +2730,7 @@ + + fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2: + version "1.0.11" +- resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" ++ resolved "https://repo.huaweicloud.com/repository/npm/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" + dependencies: + graceful-fs "^4.1.2" + inherits "~2.0.0" +@@ -2739,11 +2739,11 @@ + + function-bind@^1.0.2, function-bind@^1.1.1: + version "1.1.1" +- resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" ++ resolved "https://repo.huaweicloud.com/repository/npm/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + + gauge@~2.7.3: + version "2.7.4" +- resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" ++ resolved "https://repo.huaweicloud.com/repository/npm/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" +@@ -2756,44 +2756,44 @@ + + gaze@^1.0.0: + version "1.1.2" +- resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.2.tgz#847224677adb8870d679257ed3388fdb61e40105" ++ resolved "https://repo.huaweicloud.com/repository/npm/gaze/-/gaze-1.1.2.tgz#847224677adb8870d679257ed3388fdb61e40105" + dependencies: + globule "^1.0.0" + + get-caller-file@^1.0.0, get-caller-file@^1.0.1: + version "1.0.2" +- resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" ++ resolved "https://repo.huaweicloud.com/repository/npm/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" + + get-stdin@^4.0.1: + version "4.0.1" +- resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" ++ resolved "https://repo.huaweicloud.com/repository/npm/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" + + get-stream@^3.0.0: + version "3.0.0" +- resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" ++ resolved "https://repo.huaweicloud.com/repository/npm/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + + getpass@^0.1.1: + version "0.1.7" +- resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" ++ resolved "https://repo.huaweicloud.com/repository/npm/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + dependencies: + assert-plus "^1.0.0" + + glob-base@^0.3.0: + version "0.3.0" +- resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" ++ resolved "https://repo.huaweicloud.com/repository/npm/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" + dependencies: + glob-parent "^2.0.0" + is-glob "^2.0.0" + + glob-parent@^2.0.0: + version "2.0.0" +- resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" ++ resolved "https://repo.huaweicloud.com/repository/npm/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" + dependencies: + is-glob "^2.0.0" + + glob@7.0.x: + version "7.0.6" +- resolved "https://registry.yarnpkg.com/glob/-/glob-7.0.6.tgz#211bafaf49e525b8cd93260d14ab136152b3f57a" ++ resolved "https://repo.huaweicloud.com/repository/npm/glob/-/glob-7.0.6.tgz#211bafaf49e525b8cd93260d14ab136152b3f57a" + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" +@@ -2804,7 +2804,7 @@ + + glob@^6.0.4: + version "6.0.4" +- resolved "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22" ++ resolved "https://repo.huaweicloud.com/repository/npm/glob/-/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22" + dependencies: + inflight "^1.0.4" + inherits "2" +@@ -2814,7 +2814,7 @@ + + glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.0.6, glob@^7.1.1, glob@~7.1.1: + version "7.1.2" +- resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" ++ resolved "https://repo.huaweicloud.com/repository/npm/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" +@@ -2825,7 +2825,7 @@ + + glob@~5.0.0: + version "5.0.15" +- resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" ++ resolved "https://repo.huaweicloud.com/repository/npm/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" + dependencies: + inflight "^1.0.4" + inherits "2" +@@ -2835,11 +2835,11 @@ + + globals@^9.0.0: + version "9.17.0" +- resolved "https://registry.yarnpkg.com/globals/-/globals-9.17.0.tgz#0c0ca696d9b9bb694d2e5470bd37777caad50286" ++ resolved "https://repo.huaweicloud.com/repository/npm/globals/-/globals-9.17.0.tgz#0c0ca696d9b9bb694d2e5470bd37777caad50286" + + globby@^5.0.0: + version "5.0.0" +- resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" ++ resolved "https://repo.huaweicloud.com/repository/npm/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" + dependencies: + array-union "^1.0.1" + arrify "^1.0.0" +@@ -2850,7 +2850,7 @@ + + globby@^6.1.0: + version "6.1.0" +- resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" ++ resolved "https://repo.huaweicloud.com/repository/npm/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" + dependencies: + array-union "^1.0.1" + glob "^7.0.3" +@@ -2860,7 +2860,7 @@ + + globule@^1.0.0: + version "1.2.0" +- resolved "https://registry.yarnpkg.com/globule/-/globule-1.2.0.tgz#1dc49c6822dd9e8a2fa00ba2a295006e8664bd09" ++ resolved "https://repo.huaweicloud.com/repository/npm/globule/-/globule-1.2.0.tgz#1dc49c6822dd9e8a2fa00ba2a295006e8664bd09" + dependencies: + glob "~7.1.1" + lodash "~4.17.4" +@@ -2868,7 +2868,7 @@ + + got@^6.7.1: + version "6.7.1" +- resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" ++ resolved "https://repo.huaweicloud.com/repository/npm/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" + dependencies: + create-error-class "^3.0.0" + duplexer3 "^0.1.4" +@@ -2884,19 +2884,19 @@ + + graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9: + version "4.1.11" +- resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" ++ resolved "https://repo.huaweicloud.com/repository/npm/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" + + "graceful-readlink@>= 1.0.0": + version "1.0.1" +- resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" ++ resolved "https://repo.huaweicloud.com/repository/npm/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" + + handle-thing@^1.2.5: + version "1.2.5" +- resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-1.2.5.tgz#fd7aad726bf1a5fd16dfc29b2f7a6601d27139c4" ++ resolved "https://repo.huaweicloud.com/repository/npm/handle-thing/-/handle-thing-1.2.5.tgz#fd7aad726bf1a5fd16dfc29b2f7a6601d27139c4" + + handlebars@^1.3.0: + version "1.3.0" +- resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-1.3.0.tgz#9e9b130a93e389491322d975cf3ec1818c37ce34" ++ resolved "https://repo.huaweicloud.com/repository/npm/handlebars/-/handlebars-1.3.0.tgz#9e9b130a93e389491322d975cf3ec1818c37ce34" + dependencies: + optimist "~0.3" + optionalDependencies: +@@ -2904,7 +2904,7 @@ + + handlebars@^4.0.3: + version "4.0.10" +- resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.10.tgz#3d30c718b09a3d96f23ea4cc1f403c4d3ba9ff4f" ++ resolved "https://repo.huaweicloud.com/repository/npm/handlebars/-/handlebars-4.0.10.tgz#3d30c718b09a3d96f23ea4cc1f403c4d3ba9ff4f" + dependencies: + async "^1.4.0" + optimist "^0.6.1" +@@ -2914,79 +2914,79 @@ + + har-schema@^1.0.5: + version "1.0.5" +- resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" ++ resolved "https://repo.huaweicloud.com/repository/npm/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" + + har-validator@~4.2.1: + version "4.2.1" +- resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a" ++ resolved "https://repo.huaweicloud.com/repository/npm/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a" + dependencies: + ajv "^4.9.1" + har-schema "^1.0.5" + + has-ansi@^2.0.0: + version "2.0.0" +- resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" ++ resolved "https://repo.huaweicloud.com/repository/npm/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + dependencies: + ansi-regex "^2.0.0" + + has-binary@0.1.7: + version "0.1.7" +- resolved "https://registry.yarnpkg.com/has-binary/-/has-binary-0.1.7.tgz#68e61eb16210c9545a0a5cce06a873912fe1e68c" ++ resolved "https://repo.huaweicloud.com/repository/npm/has-binary/-/has-binary-0.1.7.tgz#68e61eb16210c9545a0a5cce06a873912fe1e68c" + dependencies: + isarray "0.0.1" + + has-cors@1.1.0: + version "1.1.0" +- resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39" ++ resolved "https://repo.huaweicloud.com/repository/npm/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39" + + has-flag@^1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" ++ resolved "https://repo.huaweicloud.com/repository/npm/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" + + has-flag@^2.0.0: + version "2.0.0" +- resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" ++ resolved "https://repo.huaweicloud.com/repository/npm/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" + + has-unicode@^2.0.0: + version "2.0.1" +- resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" ++ resolved "https://repo.huaweicloud.com/repository/npm/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + + has@^1.0.1: + version "1.0.1" +- resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28" ++ resolved "https://repo.huaweicloud.com/repository/npm/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28" + dependencies: + function-bind "^1.0.2" + + hash-base@^2.0.0: + version "2.0.2" +- resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-2.0.2.tgz#66ea1d856db4e8a5470cadf6fce23ae5244ef2e1" ++ resolved "https://repo.huaweicloud.com/repository/npm/hash-base/-/hash-base-2.0.2.tgz#66ea1d856db4e8a5470cadf6fce23ae5244ef2e1" + dependencies: + inherits "^2.0.1" + + hash-base@^3.0.0: + version "3.0.4" +- resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" ++ resolved "https://repo.huaweicloud.com/repository/npm/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + + hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.3" +- resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.3.tgz#340dedbe6290187151c1ea1d777a3448935df846" ++ resolved "https://repo.huaweicloud.com/repository/npm/hash.js/-/hash.js-1.1.3.tgz#340dedbe6290187151c1ea1d777a3448935df846" + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.0" + + hasha@~2.2.0: + version "2.2.0" +- resolved "https://registry.yarnpkg.com/hasha/-/hasha-2.2.0.tgz#78d7cbfc1e6d66303fe79837365984517b2f6ee1" ++ resolved "https://repo.huaweicloud.com/repository/npm/hasha/-/hasha-2.2.0.tgz#78d7cbfc1e6d66303fe79837365984517b2f6ee1" + dependencies: + is-stream "^1.0.1" + pinkie-promise "^2.0.0" + + hawk@~3.1.3: + version "3.1.3" +- resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" ++ resolved "https://repo.huaweicloud.com/repository/npm/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" + dependencies: + boom "2.x.x" + cryptiles "2.x.x" +@@ -2995,24 +2995,24 @@ + + he@1.1.x: + version "1.1.1" +- resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" ++ resolved "https://repo.huaweicloud.com/repository/npm/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" + + heimdalljs-logger@^0.1.9: + version "0.1.9" +- resolved "https://registry.yarnpkg.com/heimdalljs-logger/-/heimdalljs-logger-0.1.9.tgz#d76ada4e45b7bb6f786fc9c010a68eb2e2faf176" ++ resolved "https://repo.huaweicloud.com/repository/npm/heimdalljs-logger/-/heimdalljs-logger-0.1.9.tgz#d76ada4e45b7bb6f786fc9c010a68eb2e2faf176" + dependencies: + debug "^2.2.0" + heimdalljs "^0.2.0" + + heimdalljs@^0.2.0, heimdalljs@^0.2.4: + version "0.2.5" +- resolved "https://registry.yarnpkg.com/heimdalljs/-/heimdalljs-0.2.5.tgz#6aa54308eee793b642cff9cf94781445f37730ac" ++ resolved "https://repo.huaweicloud.com/repository/npm/heimdalljs/-/heimdalljs-0.2.5.tgz#6aa54308eee793b642cff9cf94781445f37730ac" + dependencies: + rsvp "~3.2.1" + + hmac-drbg@^1.0.0: + version "1.0.1" +- resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" ++ resolved "https://repo.huaweicloud.com/repository/npm/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" +@@ -3020,15 +3020,15 @@ + + hoek@2.x.x: + version "2.16.3" +- resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" ++ resolved "https://repo.huaweicloud.com/repository/npm/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" + + hosted-git-info@^2.1.4: + version "2.5.0" +- resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c" ++ resolved "https://repo.huaweicloud.com/repository/npm/hosted-git-info/-/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c" + + hpack.js@^2.1.6: + version "2.1.6" +- resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" ++ resolved "https://repo.huaweicloud.com/repository/npm/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" + dependencies: + inherits "^2.0.1" + obuf "^1.0.0" +@@ -3037,15 +3037,15 @@ + + html-comment-regex@^1.1.0: + version "1.1.1" +- resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.1.tgz#668b93776eaae55ebde8f3ad464b307a4963625e" ++ resolved "https://repo.huaweicloud.com/repository/npm/html-comment-regex/-/html-comment-regex-1.1.1.tgz#668b93776eaae55ebde8f3ad464b307a4963625e" + + html-entities@^1.2.0: + version "1.2.1" +- resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f" ++ resolved "https://repo.huaweicloud.com/repository/npm/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f" + + html-minifier@^3.2.3: + version "3.5.3" +- resolved "https://registry.yarnpkg.com/html-minifier/-/html-minifier-3.5.3.tgz#4a275e3b1a16639abb79b4c11191ff0d0fcf1ab9" ++ resolved "https://repo.huaweicloud.com/repository/npm/html-minifier/-/html-minifier-3.5.3.tgz#4a275e3b1a16639abb79b4c11191ff0d0fcf1ab9" + dependencies: + camel-case "3.0.x" + clean-css "4.1.x" +@@ -3058,7 +3058,7 @@ + + html-webpack-plugin@^2.29.0, html-webpack-plugin@^2.30.1: + version "2.30.1" +- resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-2.30.1.tgz#7f9c421b7ea91ec460f56527d78df484ee7537d5" ++ resolved "https://repo.huaweicloud.com/repository/npm/html-webpack-plugin/-/html-webpack-plugin-2.30.1.tgz#7f9c421b7ea91ec460f56527d78df484ee7537d5" + dependencies: + bluebird "^3.4.7" + html-minifier "^3.2.3" +@@ -3069,7 +3069,7 @@ + + htmlparser2@~3.3.0: + version "3.3.0" +- resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.3.0.tgz#cc70d05a59f6542e43f0e685c982e14c924a9efe" ++ resolved "https://repo.huaweicloud.com/repository/npm/htmlparser2/-/htmlparser2-3.3.0.tgz#cc70d05a59f6542e43f0e685c982e14c924a9efe" + dependencies: + domelementtype "1" + domhandler "2.1" +@@ -3078,11 +3078,11 @@ + + http-deceiver@^1.2.7: + version "1.2.7" +- resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" ++ resolved "https://repo.huaweicloud.com/repository/npm/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" + + http-errors@~1.6.1: + version "1.6.1" +- resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.1.tgz#5f8b8ed98aca545656bf572997387f904a722257" ++ resolved "https://repo.huaweicloud.com/repository/npm/http-errors/-/http-errors-1.6.1.tgz#5f8b8ed98aca545656bf572997387f904a722257" + dependencies: + depd "1.1.0" + inherits "2.0.3" +@@ -3091,7 +3091,7 @@ + + http-errors@~1.6.2: + version "1.6.2" +- resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736" ++ resolved "https://repo.huaweicloud.com/repository/npm/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736" + dependencies: + depd "1.1.1" + inherits "2.0.3" +@@ -3100,7 +3100,7 @@ + + http-proxy-middleware@~0.17.4: + version "0.17.4" +- resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.17.4.tgz#642e8848851d66f09d4f124912846dbaeb41b833" ++ resolved "https://repo.huaweicloud.com/repository/npm/http-proxy-middleware/-/http-proxy-middleware-0.17.4.tgz#642e8848851d66f09d4f124912846dbaeb41b833" + dependencies: + http-proxy "^1.16.2" + is-glob "^3.1.0" +@@ -3109,14 +3109,14 @@ + + http-proxy@^1.13.0, http-proxy@^1.16.2: + version "1.16.2" +- resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.16.2.tgz#06dff292952bf64dbe8471fa9df73066d4f37742" ++ resolved "https://repo.huaweicloud.com/repository/npm/http-proxy/-/http-proxy-1.16.2.tgz#06dff292952bf64dbe8471fa9df73066d4f37742" + dependencies: + eventemitter3 "1.x.x" + requires-port "1.x.x" + + http-signature@~1.1.0: + version "1.1.1" +- resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" ++ resolved "https://repo.huaweicloud.com/repository/npm/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" + dependencies: + assert-plus "^0.2.0" + jsprim "^1.2.2" +@@ -3124,11 +3124,11 @@ + + https-browserify@0.0.1: + version "0.0.1" +- resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-0.0.1.tgz#3f91365cabe60b77ed0ebba24b454e3e09d95a82" ++ resolved "https://repo.huaweicloud.com/repository/npm/https-browserify/-/https-browserify-0.0.1.tgz#3f91365cabe60b77ed0ebba24b454e3e09d95a82" + + https-proxy-agent@^1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz#35f7da6c48ce4ddbfa264891ac593ee5ff8671e6" ++ resolved "https://repo.huaweicloud.com/repository/npm/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz#35f7da6c48ce4ddbfa264891ac593ee5ff8671e6" + dependencies: + agent-base "2" + debug "2" +@@ -3136,320 +3136,320 @@ + + iconv-lite@0.4: + version "0.4.17" +- resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.17.tgz#4fdaa3b38acbc2c031b045d0edcdfe1ecab18c8d" ++ resolved "https://repo.huaweicloud.com/repository/npm/iconv-lite/-/iconv-lite-0.4.17.tgz#4fdaa3b38acbc2c031b045d0edcdfe1ecab18c8d" + + iconv-lite@0.4.15: + version "0.4.15" +- resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.15.tgz#fe265a218ac6a57cfe854927e9d04c19825eddeb" ++ resolved "https://repo.huaweicloud.com/repository/npm/iconv-lite/-/iconv-lite-0.4.15.tgz#fe265a218ac6a57cfe854927e9d04c19825eddeb" + + icss-replace-symbols@^1.1.0: + version "1.1.0" +- resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded" ++ resolved "https://repo.huaweicloud.com/repository/npm/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded" + + icss-utils@^2.1.0: + version "2.1.0" +- resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-2.1.0.tgz#83f0a0ec378bf3246178b6c2ad9136f135b1c962" ++ resolved "https://repo.huaweicloud.com/repository/npm/icss-utils/-/icss-utils-2.1.0.tgz#83f0a0ec378bf3246178b6c2ad9136f135b1c962" + dependencies: + postcss "^6.0.1" + + ieee754@^1.1.4: + version "1.1.8" +- resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4" ++ resolved "https://repo.huaweicloud.com/repository/npm/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4" + + image-size@~0.5.0: + version "0.5.5" +- resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c" ++ resolved "https://repo.huaweicloud.com/repository/npm/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c" + + img-stats@^0.5.2: + version "0.5.2" +- resolved "https://registry.yarnpkg.com/img-stats/-/img-stats-0.5.2.tgz#c203496c42f2d9eb2e5ab8232fa756bab32c9e2b" ++ resolved "https://repo.huaweicloud.com/repository/npm/img-stats/-/img-stats-0.5.2.tgz#c203496c42f2d9eb2e5ab8232fa756bab32c9e2b" + dependencies: + xmldom "^0.1.19" + + imurmurhash@^0.1.4: + version "0.1.4" +- resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" ++ resolved "https://repo.huaweicloud.com/repository/npm/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + + in-publish@^2.0.0: + version "2.0.0" +- resolved "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.0.tgz#e20ff5e3a2afc2690320b6dc552682a9c7fadf51" ++ resolved "https://repo.huaweicloud.com/repository/npm/in-publish/-/in-publish-2.0.0.tgz#e20ff5e3a2afc2690320b6dc552682a9c7fadf51" + + indent-string@^2.1.0: + version "2.1.0" +- resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" ++ resolved "https://repo.huaweicloud.com/repository/npm/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" + dependencies: + repeating "^2.0.0" + + indexes-of@^1.0.1: + version "1.0.1" +- resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" ++ resolved "https://repo.huaweicloud.com/repository/npm/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" + + indexof@0.0.1: + version "0.0.1" +- resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" ++ resolved "https://repo.huaweicloud.com/repository/npm/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" + + inflight@^1.0.4: + version "1.0.6" +- resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" ++ resolved "https://repo.huaweicloud.com/repository/npm/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + dependencies: + once "^1.3.0" + wrappy "1" + + inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.3" +- resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" ++ resolved "https://repo.huaweicloud.com/repository/npm/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + + inherits@2.0.1: + version "2.0.1" +- resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" ++ resolved "https://repo.huaweicloud.com/repository/npm/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + + ini@^1.3.4, ini@~1.3.0: + version "1.3.4" +- resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" ++ resolved "https://repo.huaweicloud.com/repository/npm/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" + + internal-ip@1.2.0, internal-ip@^1.2.0: + version "1.2.0" +- resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-1.2.0.tgz#ae9fbf93b984878785d50a8de1b356956058cf5c" ++ resolved "https://repo.huaweicloud.com/repository/npm/internal-ip/-/internal-ip-1.2.0.tgz#ae9fbf93b984878785d50a8de1b356956058cf5c" + dependencies: + meow "^3.3.0" + + interpret@^1.0.0: + version "1.0.3" +- resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.0.3.tgz#cbc35c62eeee73f19ab7b10a801511401afc0f90" ++ resolved "https://repo.huaweicloud.com/repository/npm/interpret/-/interpret-1.0.3.tgz#cbc35c62eeee73f19ab7b10a801511401afc0f90" + + invariant@^2.2.0: + version "2.2.2" +- resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" ++ resolved "https://repo.huaweicloud.com/repository/npm/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" + dependencies: + loose-envify "^1.0.0" + + invert-kv@^1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" ++ resolved "https://repo.huaweicloud.com/repository/npm/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" + + ip@^1.1.0, ip@^1.1.5: + version "1.1.5" +- resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" ++ resolved "https://repo.huaweicloud.com/repository/npm/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" + + ipaddr.js@1.4.0: + version "1.4.0" +- resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.4.0.tgz#296aca878a821816e5b85d0a285a99bcff4582f0" ++ resolved "https://repo.huaweicloud.com/repository/npm/ipaddr.js/-/ipaddr.js-1.4.0.tgz#296aca878a821816e5b85d0a285a99bcff4582f0" + + is-absolute-url@^2.0.0: + version "2.1.0" +- resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" ++ resolved "https://repo.huaweicloud.com/repository/npm/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" + + is-arrayish@^0.2.1: + version "0.2.1" +- resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" ++ resolved "https://repo.huaweicloud.com/repository/npm/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + + is-binary-path@^1.0.0: + version "1.0.1" +- resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" ++ resolved "https://repo.huaweicloud.com/repository/npm/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + dependencies: + binary-extensions "^1.0.0" + + is-buffer@^1.0.2, is-buffer@^1.1.5, is-buffer@~1.1.1: + version "1.1.5" +- resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.5.tgz#1f3b26ef613b214b88cbca23cc6c01d87961eecc" ++ resolved "https://repo.huaweicloud.com/repository/npm/is-buffer/-/is-buffer-1.1.5.tgz#1f3b26ef613b214b88cbca23cc6c01d87961eecc" + + is-builtin-module@^1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" ++ resolved "https://repo.huaweicloud.com/repository/npm/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" + dependencies: + builtin-modules "^1.0.0" + + is-callable@^1.1.1, is-callable@^1.1.3: + version "1.1.3" +- resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.3.tgz#86eb75392805ddc33af71c92a0eedf74ee7604b2" ++ resolved "https://repo.huaweicloud.com/repository/npm/is-callable/-/is-callable-1.1.3.tgz#86eb75392805ddc33af71c92a0eedf74ee7604b2" + + is-date-object@^1.0.1: + version "1.0.1" +- resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" ++ resolved "https://repo.huaweicloud.com/repository/npm/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" + + is-directory@^0.3.1: + version "0.3.1" +- resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" ++ resolved "https://repo.huaweicloud.com/repository/npm/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" + + is-dotfile@^1.0.0: + version "1.0.2" +- resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.2.tgz#2c132383f39199f8edc268ca01b9b007d205cc4d" ++ resolved "https://repo.huaweicloud.com/repository/npm/is-dotfile/-/is-dotfile-1.0.2.tgz#2c132383f39199f8edc268ca01b9b007d205cc4d" + + is-equal-shallow@^0.1.3: + version "0.1.3" +- resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" ++ resolved "https://repo.huaweicloud.com/repository/npm/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" + dependencies: + is-primitive "^2.0.0" + + is-extendable@^0.1.1: + version "0.1.1" +- resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" ++ resolved "https://repo.huaweicloud.com/repository/npm/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + + is-extglob@^1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" ++ resolved "https://repo.huaweicloud.com/repository/npm/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" + + is-extglob@^2.1.0: + version "2.1.1" +- resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" ++ resolved "https://repo.huaweicloud.com/repository/npm/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + + is-finite@^1.0.0: + version "1.0.2" +- resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" ++ resolved "https://repo.huaweicloud.com/repository/npm/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" + dependencies: + number-is-nan "^1.0.0" + + is-fullwidth-code-point@^1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" ++ resolved "https://repo.huaweicloud.com/repository/npm/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + dependencies: + number-is-nan "^1.0.0" + + is-fullwidth-code-point@^2.0.0: + version "2.0.0" +- resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" ++ resolved "https://repo.huaweicloud.com/repository/npm/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + + is-glob@^2.0.0, is-glob@^2.0.1: + version "2.0.1" +- resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" ++ resolved "https://repo.huaweicloud.com/repository/npm/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" + dependencies: + is-extglob "^1.0.0" + + is-glob@^3.1.0: + version "3.1.0" +- resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" ++ resolved "https://repo.huaweicloud.com/repository/npm/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + dependencies: + is-extglob "^2.1.0" + + is-npm@^1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" ++ resolved "https://repo.huaweicloud.com/repository/npm/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" + + is-number@^0.1.1: + version "0.1.1" +- resolved "https://registry.yarnpkg.com/is-number/-/is-number-0.1.1.tgz#69a7af116963d47206ec9bd9b48a14216f1e3806" ++ resolved "https://repo.huaweicloud.com/repository/npm/is-number/-/is-number-0.1.1.tgz#69a7af116963d47206ec9bd9b48a14216f1e3806" + + is-number@^2.0.2, is-number@^2.1.0: + version "2.1.0" +- resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" ++ resolved "https://repo.huaweicloud.com/repository/npm/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" + dependencies: + kind-of "^3.0.2" + + is-number@^4.0.0: + version "4.0.0" +- resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" ++ resolved "https://repo.huaweicloud.com/repository/npm/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" + + is-obj@^1.0.0: + version "1.0.1" +- resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" ++ resolved "https://repo.huaweicloud.com/repository/npm/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + + is-path-cwd@^1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" ++ resolved "https://repo.huaweicloud.com/repository/npm/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" + + is-path-in-cwd@^1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc" ++ resolved "https://repo.huaweicloud.com/repository/npm/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc" + dependencies: + is-path-inside "^1.0.0" + + is-path-inside@^1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.0.tgz#fc06e5a1683fbda13de667aff717bbc10a48f37f" ++ resolved "https://repo.huaweicloud.com/repository/npm/is-path-inside/-/is-path-inside-1.0.0.tgz#fc06e5a1683fbda13de667aff717bbc10a48f37f" + dependencies: + path-is-inside "^1.0.1" + + is-plain-obj@^1.0.0: + version "1.1.0" +- resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" ++ resolved "https://repo.huaweicloud.com/repository/npm/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + + is-plain-object@^2.0.1: + version "2.0.4" +- resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" ++ resolved "https://repo.huaweicloud.com/repository/npm/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + dependencies: + isobject "^3.0.1" + + is-posix-bracket@^0.1.0: + version "0.1.1" +- resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" ++ resolved "https://repo.huaweicloud.com/repository/npm/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" + + is-primitive@^2.0.0: + version "2.0.0" +- resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" ++ resolved "https://repo.huaweicloud.com/repository/npm/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" + + is-redirect@^1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" ++ resolved "https://repo.huaweicloud.com/repository/npm/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" + + is-regex@^1.0.4: + version "1.0.4" +- resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" ++ resolved "https://repo.huaweicloud.com/repository/npm/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" + dependencies: + has "^1.0.1" + + is-retry-allowed@^1.0.0: + version "1.1.0" +- resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" ++ resolved "https://repo.huaweicloud.com/repository/npm/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" + + is-stream@^1.0.0, is-stream@^1.0.1, is-stream@^1.1.0: + version "1.1.0" +- resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" ++ resolved "https://repo.huaweicloud.com/repository/npm/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + + is-svg@^2.0.0: + version "2.1.0" +- resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-2.1.0.tgz#cf61090da0d9efbcab8722deba6f032208dbb0e9" ++ resolved "https://repo.huaweicloud.com/repository/npm/is-svg/-/is-svg-2.1.0.tgz#cf61090da0d9efbcab8722deba6f032208dbb0e9" + dependencies: + html-comment-regex "^1.1.0" + + is-symbol@^1.0.1: + version "1.0.1" +- resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572" ++ resolved "https://repo.huaweicloud.com/repository/npm/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572" + + is-typedarray@~1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" ++ resolved "https://repo.huaweicloud.com/repository/npm/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + + is-utf8@^0.2.0: + version "0.2.1" +- resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" ++ resolved "https://repo.huaweicloud.com/repository/npm/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + + is-wsl@^1.1.0: + version "1.1.0" +- resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" ++ resolved "https://repo.huaweicloud.com/repository/npm/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + + isarray@0.0.1: + version "0.0.1" +- resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" ++ resolved "https://repo.huaweicloud.com/repository/npm/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + + isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" ++ resolved "https://repo.huaweicloud.com/repository/npm/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + + isbinaryfile@^3.0.0: + version "3.0.2" +- resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.2.tgz#4a3e974ec0cba9004d3fc6cde7209ea69368a621" ++ resolved "https://repo.huaweicloud.com/repository/npm/isbinaryfile/-/isbinaryfile-3.0.2.tgz#4a3e974ec0cba9004d3fc6cde7209ea69368a621" + + isexe@^2.0.0: + version "2.0.0" +- resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" ++ resolved "https://repo.huaweicloud.com/repository/npm/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + + isobject@^2.0.0: + version "2.1.0" +- resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" ++ resolved "https://repo.huaweicloud.com/repository/npm/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + dependencies: + isarray "1.0.0" + + isobject@^3.0.1: + version "3.0.1" +- resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" ++ resolved "https://repo.huaweicloud.com/repository/npm/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + + isstream@~0.1.2: + version "0.1.2" +- resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" ++ resolved "https://repo.huaweicloud.com/repository/npm/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + + istanbul-api@^1.1.1: + version "1.1.9" +- resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-1.1.9.tgz#2827920d380d4286d857d57a2968a841db8a7ec8" ++ resolved "https://repo.huaweicloud.com/repository/npm/istanbul-api/-/istanbul-api-1.1.9.tgz#2827920d380d4286d857d57a2968a841db8a7ec8" + dependencies: + async "^2.1.4" + fileset "^2.0.2" +@@ -3465,7 +3465,7 @@ + + istanbul-instrumenter-loader@^2.0.0: + version "2.0.0" +- resolved "https://registry.yarnpkg.com/istanbul-instrumenter-loader/-/istanbul-instrumenter-loader-2.0.0.tgz#e5492900ab0bba835efa8024cb00be9b3eea2700" ++ resolved "https://repo.huaweicloud.com/repository/npm/istanbul-instrumenter-loader/-/istanbul-instrumenter-loader-2.0.0.tgz#e5492900ab0bba835efa8024cb00be9b3eea2700" + dependencies: + convert-source-map "^1.3.0" + istanbul-lib-instrument "^1.1.3" +@@ -3474,17 +3474,17 @@ + + istanbul-lib-coverage@^1.1.1: + version "1.1.1" +- resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.1.tgz#73bfb998885299415c93d38a3e9adf784a77a9da" ++ resolved "https://repo.huaweicloud.com/repository/npm/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.1.tgz#73bfb998885299415c93d38a3e9adf784a77a9da" + + istanbul-lib-hook@^1.0.7: + version "1.0.7" +- resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.0.7.tgz#dd6607f03076578fe7d6f2a630cf143b49bacddc" ++ resolved "https://repo.huaweicloud.com/repository/npm/istanbul-lib-hook/-/istanbul-lib-hook-1.0.7.tgz#dd6607f03076578fe7d6f2a630cf143b49bacddc" + dependencies: + append-transform "^0.4.0" + + istanbul-lib-instrument@^1.1.3: + version "1.8.0" +- resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.8.0.tgz#66f6c9421cc9ec4704f76f2db084ba9078a2b532" ++ resolved "https://repo.huaweicloud.com/repository/npm/istanbul-lib-instrument/-/istanbul-lib-instrument-1.8.0.tgz#66f6c9421cc9ec4704f76f2db084ba9078a2b532" + dependencies: + babel-generator "^6.18.0" + babel-template "^6.16.0" +@@ -3496,7 +3496,7 @@ + + istanbul-lib-instrument@^1.7.2: + version "1.7.2" +- resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.7.2.tgz#6014b03d3470fb77638d5802508c255c06312e56" ++ resolved "https://repo.huaweicloud.com/repository/npm/istanbul-lib-instrument/-/istanbul-lib-instrument-1.7.2.tgz#6014b03d3470fb77638d5802508c255c06312e56" + dependencies: + babel-generator "^6.18.0" + babel-template "^6.16.0" +@@ -3508,7 +3508,7 @@ + + istanbul-lib-report@^1.1.1: + version "1.1.1" +- resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.1.1.tgz#f0e55f56655ffa34222080b7a0cd4760e1405fc9" ++ resolved "https://repo.huaweicloud.com/repository/npm/istanbul-lib-report/-/istanbul-lib-report-1.1.1.tgz#f0e55f56655ffa34222080b7a0cd4760e1405fc9" + dependencies: + istanbul-lib-coverage "^1.1.1" + mkdirp "^0.5.1" +@@ -3517,7 +3517,7 @@ + + istanbul-lib-source-maps@^1.2.1: + version "1.2.1" +- resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.1.tgz#a6fe1acba8ce08eebc638e572e294d267008aa0c" ++ resolved "https://repo.huaweicloud.com/repository/npm/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.1.tgz#a6fe1acba8ce08eebc638e572e294d267008aa0c" + dependencies: + debug "^2.6.3" + istanbul-lib-coverage "^1.1.1" +@@ -3527,27 +3527,27 @@ + + istanbul-reports@^1.1.1: + version "1.1.1" +- resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.1.1.tgz#042be5c89e175bc3f86523caab29c014e77fee4e" ++ resolved "https://repo.huaweicloud.com/repository/npm/istanbul-reports/-/istanbul-reports-1.1.1.tgz#042be5c89e175bc3f86523caab29c014e77fee4e" + dependencies: + handlebars "^4.0.3" + + jasmine-core@~2.5.2: + version "2.5.2" +- resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-2.5.2.tgz#6f61bd79061e27f43e6f9355e44b3c6cab6ff297" ++ resolved "https://repo.huaweicloud.com/repository/npm/jasmine-core/-/jasmine-core-2.5.2.tgz#6f61bd79061e27f43e6f9355e44b3c6cab6ff297" + + jasmine-core@~2.6.0: + version "2.6.2" +- resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-2.6.2.tgz#74ea1f7cf428691af201107d631234027a09daab" ++ resolved "https://repo.huaweicloud.com/repository/npm/jasmine-core/-/jasmine-core-2.6.2.tgz#74ea1f7cf428691af201107d631234027a09daab" + + jasmine-spec-reporter@~3.2.0: + version "3.2.0" +- resolved "https://registry.yarnpkg.com/jasmine-spec-reporter/-/jasmine-spec-reporter-3.2.0.tgz#fdbe85a80ccdd3b276746bc77fde83c1ce773eff" ++ resolved "https://repo.huaweicloud.com/repository/npm/jasmine-spec-reporter/-/jasmine-spec-reporter-3.2.0.tgz#fdbe85a80ccdd3b276746bc77fde83c1ce773eff" + dependencies: + colors "1.1.2" + + jasmine@^2.5.3: + version "2.6.0" +- resolved "https://registry.yarnpkg.com/jasmine/-/jasmine-2.6.0.tgz#6b22e70883e8e589d456346153b4d206ddbe217f" ++ resolved "https://repo.huaweicloud.com/repository/npm/jasmine/-/jasmine-2.6.0.tgz#6b22e70883e8e589d456346153b4d206ddbe217f" + dependencies: + exit "^0.1.2" + glob "^7.0.6" +@@ -3555,112 +3555,112 @@ + + jasminewd2@^2.1.0: + version "2.1.0" +- resolved "https://registry.yarnpkg.com/jasminewd2/-/jasminewd2-2.1.0.tgz#da595275d1ae631de736ac0a7c7d85c9f73ef652" ++ resolved "https://repo.huaweicloud.com/repository/npm/jasminewd2/-/jasminewd2-2.1.0.tgz#da595275d1ae631de736ac0a7c7d85c9f73ef652" + + jodid25519@^1.0.0: + version "1.0.2" +- resolved "https://registry.yarnpkg.com/jodid25519/-/jodid25519-1.0.2.tgz#06d4912255093419477d425633606e0e90782967" ++ resolved "https://repo.huaweicloud.com/repository/npm/jodid25519/-/jodid25519-1.0.2.tgz#06d4912255093419477d425633606e0e90782967" + dependencies: + jsbn "~0.1.0" + + jquery@^1.12.4: + version "1.12.4" +- resolved "https://registry.yarnpkg.com/jquery/-/jquery-1.12.4.tgz#01e1dfba290fe73deba77ceeacb0f9ba2fec9e0c" ++ resolved "https://repo.huaweicloud.com/repository/npm/jquery/-/jquery-1.12.4.tgz#01e1dfba290fe73deba77ceeacb0f9ba2fec9e0c" + + js-base64@^2.1.5, js-base64@^2.1.8, js-base64@^2.1.9: + version "2.1.9" +- resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.1.9.tgz#f0e80ae039a4bd654b5f281fc93f04a914a7fcce" ++ resolved "https://repo.huaweicloud.com/repository/npm/js-base64/-/js-base64-2.1.9.tgz#f0e80ae039a4bd654b5f281fc93f04a914a7fcce" + + js-tokens@^3.0.0: + version "3.0.1" +- resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.1.tgz#08e9f132484a2c45a30907e9dc4d5567b7f114d7" ++ resolved "https://repo.huaweicloud.com/repository/npm/js-tokens/-/js-tokens-3.0.1.tgz#08e9f132484a2c45a30907e9dc4d5567b7f114d7" + + js-tokens@^3.0.2: + version "3.0.2" +- resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" ++ resolved "https://repo.huaweicloud.com/repository/npm/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + + js-yaml@^3.4.3: + version "3.9.1" +- resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.9.1.tgz#08775cebdfdd359209f0d2acd383c8f86a6904a0" ++ resolved "https://repo.huaweicloud.com/repository/npm/js-yaml/-/js-yaml-3.9.1.tgz#08775cebdfdd359209f0d2acd383c8f86a6904a0" + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + + js-yaml@^3.7.0: + version "3.8.4" +- resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.8.4.tgz#520b4564f86573ba96662af85a8cafa7b4b5a6f6" ++ resolved "https://repo.huaweicloud.com/repository/npm/js-yaml/-/js-yaml-3.8.4.tgz#520b4564f86573ba96662af85a8cafa7b4b5a6f6" + dependencies: + argparse "^1.0.7" + esprima "^3.1.1" + + js-yaml@~3.7.0: + version "3.7.0" +- resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.7.0.tgz#5c967ddd837a9bfdca5f2de84253abe8a1c03b80" ++ resolved "https://repo.huaweicloud.com/repository/npm/js-yaml/-/js-yaml-3.7.0.tgz#5c967ddd837a9bfdca5f2de84253abe8a1c03b80" + dependencies: + argparse "^1.0.7" + esprima "^2.6.0" + + jsbn@~0.1.0: + version "0.1.1" +- resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" ++ resolved "https://repo.huaweicloud.com/repository/npm/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + + jsesc@^1.3.0: + version "1.3.0" +- resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" ++ resolved "https://repo.huaweicloud.com/repository/npm/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" + + jsesc@~0.5.0: + version "0.5.0" +- resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" ++ resolved "https://repo.huaweicloud.com/repository/npm/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + + json-loader@^0.5.4: + version "0.5.7" +- resolved "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.7.tgz#dca14a70235ff82f0ac9a3abeb60d337a365185d" ++ resolved "https://repo.huaweicloud.com/repository/npm/json-loader/-/json-loader-0.5.7.tgz#dca14a70235ff82f0ac9a3abeb60d337a365185d" + + json-schema-traverse@^0.3.0: + version "0.3.1" +- resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" ++ resolved "https://repo.huaweicloud.com/repository/npm/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" + + json-schema@0.2.3: + version "0.2.3" +- resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" ++ resolved "https://repo.huaweicloud.com/repository/npm/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + + json-stable-stringify@^1.0.1: + version "1.0.1" +- resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" ++ resolved "https://repo.huaweicloud.com/repository/npm/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" + dependencies: + jsonify "~0.0.0" + + json-stringify-safe@~5.0.1: + version "5.0.1" +- resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" ++ resolved "https://repo.huaweicloud.com/repository/npm/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + + json3@3.3.2, json3@^3.3.2: + version "3.3.2" +- resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" ++ resolved "https://repo.huaweicloud.com/repository/npm/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" + + json5@^0.5.0, json5@^0.5.1: + version "0.5.1" +- resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" ++ resolved "https://repo.huaweicloud.com/repository/npm/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + + jsonfile@^2.1.0: + version "2.4.0" +- resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" ++ resolved "https://repo.huaweicloud.com/repository/npm/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" + optionalDependencies: + graceful-fs "^4.1.6" + + jsonfile@^3.0.0: + version "3.0.1" +- resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-3.0.1.tgz#a5ecc6f65f53f662c4415c7675a0331d0992ec66" ++ resolved "https://repo.huaweicloud.com/repository/npm/jsonfile/-/jsonfile-3.0.1.tgz#a5ecc6f65f53f662c4415c7675a0331d0992ec66" + optionalDependencies: + graceful-fs "^4.1.6" + + jsonify@~0.0.0: + version "0.0.0" +- resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" ++ resolved "https://repo.huaweicloud.com/repository/npm/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + + jsprim@^1.2.2: + version "1.4.0" +- resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.0.tgz#a3b87e40298d8c380552d8cc7628a0bb95a22918" ++ resolved "https://repo.huaweicloud.com/repository/npm/jsprim/-/jsprim-1.4.0.tgz#a3b87e40298d8c380552d8cc7628a0bb95a22918" + dependencies: + assert-plus "1.0.0" + extsprintf "1.0.2" +@@ -3669,42 +3669,42 @@ + + karma-cli@~1.0.1: + version "1.0.1" +- resolved "https://registry.yarnpkg.com/karma-cli/-/karma-cli-1.0.1.tgz#ae6c3c58a313a1d00b45164c455b9b86ce17f960" ++ resolved "https://repo.huaweicloud.com/repository/npm/karma-cli/-/karma-cli-1.0.1.tgz#ae6c3c58a313a1d00b45164c455b9b86ce17f960" + dependencies: + resolve "^1.1.6" + + karma-coverage-istanbul-reporter@^0.2.0: + version "0.2.3" +- resolved "https://registry.yarnpkg.com/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-0.2.3.tgz#11f1be9cfa93755a77bac39ab16e315a7100b5c5" ++ resolved "https://repo.huaweicloud.com/repository/npm/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-0.2.3.tgz#11f1be9cfa93755a77bac39ab16e315a7100b5c5" + dependencies: + istanbul-api "^1.1.1" + + karma-jasmine-html-reporter@^0.2.2: + version "0.2.2" +- resolved "https://registry.yarnpkg.com/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-0.2.2.tgz#48a8e5ef18807617ee2b5e33c1194c35b439524c" ++ resolved "https://repo.huaweicloud.com/repository/npm/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-0.2.2.tgz#48a8e5ef18807617ee2b5e33c1194c35b439524c" + dependencies: + karma-jasmine "^1.0.2" + + karma-jasmine@^1.0.2, karma-jasmine@~1.1.0: + version "1.1.0" +- resolved "https://registry.yarnpkg.com/karma-jasmine/-/karma-jasmine-1.1.0.tgz#22e4c06bf9a182e5294d1f705e3733811b810acf" ++ resolved "https://repo.huaweicloud.com/repository/npm/karma-jasmine/-/karma-jasmine-1.1.0.tgz#22e4c06bf9a182e5294d1f705e3733811b810acf" + + karma-phantomjs-launcher@^1.0.4: + version "1.0.4" +- resolved "https://registry.yarnpkg.com/karma-phantomjs-launcher/-/karma-phantomjs-launcher-1.0.4.tgz#d23ca34801bda9863ad318e3bb4bd4062b13acd2" ++ resolved "https://repo.huaweicloud.com/repository/npm/karma-phantomjs-launcher/-/karma-phantomjs-launcher-1.0.4.tgz#d23ca34801bda9863ad318e3bb4bd4062b13acd2" + dependencies: + lodash "^4.0.1" + phantomjs-prebuilt "^2.1.7" + + karma-source-map-support@^1.2.0: + version "1.2.0" +- resolved "https://registry.yarnpkg.com/karma-source-map-support/-/karma-source-map-support-1.2.0.tgz#1bf81e7bb4b089627ab352ec4179e117c406a540" ++ resolved "https://repo.huaweicloud.com/repository/npm/karma-source-map-support/-/karma-source-map-support-1.2.0.tgz#1bf81e7bb4b089627ab352ec4179e117c406a540" + dependencies: + source-map-support "^0.4.1" + + karma@~1.4.1: + version "1.4.1" +- resolved "https://registry.yarnpkg.com/karma/-/karma-1.4.1.tgz#41981a71d54237606b0a3ea8c58c90773f41650e" ++ resolved "https://repo.huaweicloud.com/repository/npm/karma/-/karma-1.4.1.tgz#41981a71d54237606b0a3ea8c58c90773f41650e" + dependencies: + bluebird "^3.3.0" + body-parser "^1.12.4" +@@ -3736,57 +3736,57 @@ + + kew@~0.7.0: + version "0.7.0" +- resolved "https://registry.yarnpkg.com/kew/-/kew-0.7.0.tgz#79d93d2d33363d6fdd2970b335d9141ad591d79b" ++ resolved "https://repo.huaweicloud.com/repository/npm/kew/-/kew-0.7.0.tgz#79d93d2d33363d6fdd2970b335d9141ad591d79b" + + kind-of@^2.0.1: + version "2.0.1" +- resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-2.0.1.tgz#018ec7a4ce7e3a86cb9141be519d24c8faa981b5" ++ resolved "https://repo.huaweicloud.com/repository/npm/kind-of/-/kind-of-2.0.1.tgz#018ec7a4ce7e3a86cb9141be519d24c8faa981b5" + dependencies: + is-buffer "^1.0.2" + + kind-of@^3.0.2, kind-of@^3.2.2: + version "3.2.2" +- resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" ++ resolved "https://repo.huaweicloud.com/repository/npm/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + dependencies: + is-buffer "^1.1.5" + + kind-of@^6.0.0: + version "6.0.2" +- resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" ++ resolved "https://repo.huaweicloud.com/repository/npm/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" + + klaw@^1.0.0: + version "1.3.1" +- resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" ++ resolved "https://repo.huaweicloud.com/repository/npm/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" + optionalDependencies: + graceful-fs "^4.1.9" + + latest-version@^3.0.0: + version "3.1.0" +- resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15" ++ resolved "https://repo.huaweicloud.com/repository/npm/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15" + dependencies: + package-json "^4.0.0" + + lazy-cache@^0.2.3: + version "0.2.7" +- resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-0.2.7.tgz#7feddf2dcb6edb77d11ef1d117ab5ffdf0ab1b65" ++ resolved "https://repo.huaweicloud.com/repository/npm/lazy-cache/-/lazy-cache-0.2.7.tgz#7feddf2dcb6edb77d11ef1d117ab5ffdf0ab1b65" + + lazy-cache@^1.0.3: + version "1.0.4" +- resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" ++ resolved "https://repo.huaweicloud.com/repository/npm/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" + + lazy-req@^2.0.0: + version "2.0.0" +- resolved "https://registry.yarnpkg.com/lazy-req/-/lazy-req-2.0.0.tgz#c9450a363ecdda2e6f0c70132ad4f37f8f06f2b4" ++ resolved "https://repo.huaweicloud.com/repository/npm/lazy-req/-/lazy-req-2.0.0.tgz#c9450a363ecdda2e6f0c70132ad4f37f8f06f2b4" + + lcid@^1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" ++ resolved "https://repo.huaweicloud.com/repository/npm/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" + dependencies: + invert-kv "^1.0.0" + + less-loader@^4.0.5: + version "4.0.5" +- resolved "https://registry.yarnpkg.com/less-loader/-/less-loader-4.0.5.tgz#ae155a7406cac6acd293d785587fcff0f478c4dd" ++ resolved "https://repo.huaweicloud.com/repository/npm/less-loader/-/less-loader-4.0.5.tgz#ae155a7406cac6acd293d785587fcff0f478c4dd" + dependencies: + clone "^2.1.1" + loader-utils "^1.1.0" +@@ -3794,7 +3794,7 @@ + + less@^2.7.2: + version "2.7.2" +- resolved "https://registry.yarnpkg.com/less/-/less-2.7.2.tgz#368d6cc73e1fb03981183280918743c5dcf9b3df" ++ resolved "https://repo.huaweicloud.com/repository/npm/less/-/less-2.7.2.tgz#368d6cc73e1fb03981183280918743c5dcf9b3df" + optionalDependencies: + errno "^0.1.1" + graceful-fs "^4.1.2" +@@ -3807,13 +3807,13 @@ + + license-webpack-plugin@^1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/license-webpack-plugin/-/license-webpack-plugin-1.0.0.tgz#9515229075bacce8ec420cadf99a54a5f78cc7df" ++ resolved "https://repo.huaweicloud.com/repository/npm/license-webpack-plugin/-/license-webpack-plugin-1.0.0.tgz#9515229075bacce8ec420cadf99a54a5f78cc7df" + dependencies: + ejs "^2.5.7" + + load-json-file@^1.0.0: + version "1.1.0" +- resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" ++ resolved "https://repo.huaweicloud.com/repository/npm/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" +@@ -3823,7 +3823,7 @@ + + load-json-file@^2.0.0: + version "2.0.0" +- resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" ++ resolved "https://repo.huaweicloud.com/repository/npm/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" +@@ -3832,11 +3832,11 @@ + + loader-runner@^2.3.0: + version "2.3.0" +- resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2" ++ resolved "https://repo.huaweicloud.com/repository/npm/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2" + + loader-utils@^0.2.15, loader-utils@^0.2.16, loader-utils@~0.2.2: + version "0.2.17" +- resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.17.tgz#f86e6374d43205a6e6c60e9196f17c0299bfb348" ++ resolved "https://repo.huaweicloud.com/repository/npm/loader-utils/-/loader-utils-0.2.17.tgz#f86e6374d43205a6e6c60e9196f17c0299bfb348" + dependencies: + big.js "^3.1.3" + emojis-list "^2.0.0" +@@ -3845,7 +3845,7 @@ + + loader-utils@^1.0.1, loader-utils@^1.0.2, loader-utils@^1.1.0: + version "1.1.0" +- resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd" ++ resolved "https://repo.huaweicloud.com/repository/npm/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd" + dependencies: + big.js "^3.1.3" + emojis-list "^2.0.0" +@@ -3853,143 +3853,143 @@ + + locate-path@^2.0.0: + version "2.0.0" +- resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" ++ resolved "https://repo.huaweicloud.com/repository/npm/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + + lodash.assign@^4.2.0: + version "4.2.0" +- resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" ++ resolved "https://repo.huaweicloud.com/repository/npm/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" + + lodash.camelcase@^4.3.0: + version "4.3.0" +- resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" ++ resolved "https://repo.huaweicloud.com/repository/npm/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" + + lodash.clonedeep@^4.3.2, lodash.clonedeep@^4.5.0: + version "4.5.0" +- resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" ++ resolved "https://repo.huaweicloud.com/repository/npm/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + + lodash.memoize@^4.1.2: + version "4.1.2" +- resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" ++ resolved "https://repo.huaweicloud.com/repository/npm/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + + lodash.mergewith@^4.6.0: + version "4.6.0" +- resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.0.tgz#150cf0a16791f5903b8891eab154609274bdea55" ++ resolved "https://repo.huaweicloud.com/repository/npm/lodash.mergewith/-/lodash.mergewith-4.6.0.tgz#150cf0a16791f5903b8891eab154609274bdea55" + + lodash.tail@^4.1.1: + version "4.1.1" +- resolved "https://registry.yarnpkg.com/lodash.tail/-/lodash.tail-4.1.1.tgz#d2333a36d9e7717c8ad2f7cacafec7c32b444664" ++ resolved "https://repo.huaweicloud.com/repository/npm/lodash.tail/-/lodash.tail-4.1.1.tgz#d2333a36d9e7717c8ad2f7cacafec7c32b444664" + + lodash.uniq@^4.5.0: + version "4.5.0" +- resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" ++ resolved "https://repo.huaweicloud.com/repository/npm/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + + lodash@^3.8.0: + version "3.10.1" +- resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" ++ resolved "https://repo.huaweicloud.com/repository/npm/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" + + lodash@^4.0.0, lodash@^4.0.1, lodash@^4.11.1, lodash@^4.14.0, lodash@^4.17.2, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.3.0, lodash@^4.5.0, lodash@~4.17.4: + version "4.17.4" +- resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" ++ resolved "https://repo.huaweicloud.com/repository/npm/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" + + log4js@^0.6.31: + version "0.6.38" +- resolved "https://registry.yarnpkg.com/log4js/-/log4js-0.6.38.tgz#2c494116695d6fb25480943d3fc872e662a522fd" ++ resolved "https://repo.huaweicloud.com/repository/npm/log4js/-/log4js-0.6.38.tgz#2c494116695d6fb25480943d3fc872e662a522fd" + dependencies: + readable-stream "~1.0.2" + semver "~4.3.3" + + loglevel@^1.4.1: + version "1.4.1" +- resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.4.1.tgz#95b383f91a3c2756fd4ab093667e4309161f2bcd" ++ resolved "https://repo.huaweicloud.com/repository/npm/loglevel/-/loglevel-1.4.1.tgz#95b383f91a3c2756fd4ab093667e4309161f2bcd" + + longest@^1.0.1: + version "1.0.1" +- resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" ++ resolved "https://repo.huaweicloud.com/repository/npm/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" + + loose-envify@^1.0.0: + version "1.3.1" +- resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" ++ resolved "https://repo.huaweicloud.com/repository/npm/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" + dependencies: + js-tokens "^3.0.0" + + loud-rejection@^1.0.0: + version "1.6.0" +- resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" ++ resolved "https://repo.huaweicloud.com/repository/npm/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" + dependencies: + currently-unhandled "^0.4.1" + signal-exit "^3.0.0" + + lower-case@^1.1.1: + version "1.1.4" +- resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" ++ resolved "https://repo.huaweicloud.com/repository/npm/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" + + lowercase-keys@^1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" ++ resolved "https://repo.huaweicloud.com/repository/npm/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" + + lru-cache@2.2.x: + version "2.2.4" +- resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.2.4.tgz#6c658619becf14031d0d0b594b16042ce4dc063d" ++ resolved "https://repo.huaweicloud.com/repository/npm/lru-cache/-/lru-cache-2.2.4.tgz#6c658619becf14031d0d0b594b16042ce4dc063d" + + lru-cache@^4.0.0: + version "4.0.2" +- resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.0.2.tgz#1d17679c069cda5d040991a09dbc2c0db377e55e" ++ resolved "https://repo.huaweicloud.com/repository/npm/lru-cache/-/lru-cache-4.0.2.tgz#1d17679c069cda5d040991a09dbc2c0db377e55e" + dependencies: + pseudomap "^1.0.1" + yallist "^2.0.0" + + lru-cache@^4.0.1: + version "4.1.1" +- resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55" ++ resolved "https://repo.huaweicloud.com/repository/npm/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55" + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + + macaddress@^0.2.8: + version "0.2.8" +- resolved "https://registry.yarnpkg.com/macaddress/-/macaddress-0.2.8.tgz#5904dc537c39ec6dbefeae902327135fa8511f12" ++ resolved "https://repo.huaweicloud.com/repository/npm/macaddress/-/macaddress-0.2.8.tgz#5904dc537c39ec6dbefeae902327135fa8511f12" + + magic-string@^0.22.3: + version "0.22.4" +- resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.22.4.tgz#31039b4e40366395618c1d6cf8193c53917475ff" ++ resolved "https://repo.huaweicloud.com/repository/npm/magic-string/-/magic-string-0.22.4.tgz#31039b4e40366395618c1d6cf8193c53917475ff" + dependencies: + vlq "^0.2.1" + + make-dir@^1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.0.0.tgz#97a011751e91dd87cfadef58832ebb04936de978" ++ resolved "https://repo.huaweicloud.com/repository/npm/make-dir/-/make-dir-1.0.0.tgz#97a011751e91dd87cfadef58832ebb04936de978" + dependencies: + pify "^2.3.0" + + make-error@^1.1.1: + version "1.3.0" +- resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.0.tgz#52ad3a339ccf10ce62b4040b708fe707244b8b96" ++ resolved "https://repo.huaweicloud.com/repository/npm/make-error/-/make-error-1.3.0.tgz#52ad3a339ccf10ce62b4040b708fe707244b8b96" + + map-obj@^1.0.0, map-obj@^1.0.1: + version "1.0.1" +- resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" ++ resolved "https://repo.huaweicloud.com/repository/npm/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" + + math-expression-evaluator@^1.2.14: + version "1.2.17" +- resolved "https://registry.yarnpkg.com/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz#de819fdbcd84dccd8fae59c6aeb79615b9d266ac" ++ resolved "https://repo.huaweicloud.com/repository/npm/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz#de819fdbcd84dccd8fae59c6aeb79615b9d266ac" + + math-random@^1.0.1: + version "1.0.1" +- resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.1.tgz#8b3aac588b8a66e4975e3cdea67f7bb329601fac" ++ resolved "https://repo.huaweicloud.com/repository/npm/math-random/-/math-random-1.0.1.tgz#8b3aac588b8a66e4975e3cdea67f7bb329601fac" + + md5.js@^1.3.4: + version "1.3.4" +- resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.4.tgz#e9bdbde94a20a5ac18b04340fc5764d5b09d901d" ++ resolved "https://repo.huaweicloud.com/repository/npm/md5.js/-/md5.js-1.3.4.tgz#e9bdbde94a20a5ac18b04340fc5764d5b09d901d" + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + + md5@^2.2.1: + version "2.2.1" +- resolved "https://registry.yarnpkg.com/md5/-/md5-2.2.1.tgz#53ab38d5fe3c8891ba465329ea23fac0540126f9" ++ resolved "https://repo.huaweicloud.com/repository/npm/md5/-/md5-2.2.1.tgz#53ab38d5fe3c8891ba465329ea23fac0540126f9" + dependencies: + charenc "~0.0.1" + crypt "~0.0.1" +@@ -3997,24 +3997,24 @@ + + media-typer@0.3.0: + version "0.3.0" +- resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" ++ resolved "https://repo.huaweicloud.com/repository/npm/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + + mem@^1.1.0: + version "1.1.0" +- resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76" ++ resolved "https://repo.huaweicloud.com/repository/npm/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76" + dependencies: + mimic-fn "^1.0.0" + + memory-fs@^0.4.0, memory-fs@^0.4.1, memory-fs@~0.4.1: + version "0.4.1" +- resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" ++ resolved "https://repo.huaweicloud.com/repository/npm/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + + meow@^3.3.0, meow@^3.7.0: + version "3.7.0" +- resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" ++ resolved "https://repo.huaweicloud.com/repository/npm/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" + dependencies: + camelcase-keys "^2.0.0" + decamelize "^1.1.2" +@@ -4029,15 +4029,15 @@ + + merge-descriptors@1.0.1: + version "1.0.1" +- resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" ++ resolved "https://repo.huaweicloud.com/repository/npm/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + + methods@~1.1.2: + version "1.1.2" +- resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" ++ resolved "https://repo.huaweicloud.com/repository/npm/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + + micromatch@^2.1.5, micromatch@^2.3.11: + version "2.3.11" +- resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" ++ resolved "https://repo.huaweicloud.com/repository/npm/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" + dependencies: + arr-diff "^2.0.0" + array-unique "^0.2.1" +@@ -4055,166 +4055,166 @@ + + miller-rabin@^4.0.0: + version "4.0.0" +- resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.0.tgz#4a62fb1d42933c05583982f4c716f6fb9e6c6d3d" ++ resolved "https://repo.huaweicloud.com/repository/npm/miller-rabin/-/miller-rabin-4.0.0.tgz#4a62fb1d42933c05583982f4c716f6fb9e6c6d3d" + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + + "mime-db@>= 1.29.0 < 2", mime-db@~1.30.0: + version "1.30.0" +- resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01" ++ resolved "https://repo.huaweicloud.com/repository/npm/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01" + + mime-db@~1.27.0: + version "1.27.0" +- resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.27.0.tgz#820f572296bbd20ec25ed55e5b5de869e5436eb1" ++ resolved "https://repo.huaweicloud.com/repository/npm/mime-db/-/mime-db-1.27.0.tgz#820f572296bbd20ec25ed55e5b5de869e5436eb1" + + mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.15, mime-types@~2.1.7: + version "2.1.15" +- resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.15.tgz#a4ebf5064094569237b8cf70046776d09fc92aed" ++ resolved "https://repo.huaweicloud.com/repository/npm/mime-types/-/mime-types-2.1.15.tgz#a4ebf5064094569237b8cf70046776d09fc92aed" + dependencies: + mime-db "~1.27.0" + + mime-types@~2.1.16: + version "2.1.17" +- resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.17.tgz#09d7a393f03e995a79f8af857b70a9e0ab16557a" ++ resolved "https://repo.huaweicloud.com/repository/npm/mime-types/-/mime-types-2.1.17.tgz#09d7a393f03e995a79f8af857b70a9e0ab16557a" + dependencies: + mime-db "~1.30.0" + + mime@1.3.4: + version "1.3.4" +- resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53" ++ resolved "https://repo.huaweicloud.com/repository/npm/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53" + + mime@1.3.x, mime@^1.3.4: + version "1.3.6" +- resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.6.tgz#591d84d3653a6b0b4a3b9df8de5aa8108e72e5e0" ++ resolved "https://repo.huaweicloud.com/repository/npm/mime/-/mime-1.3.6.tgz#591d84d3653a6b0b4a3b9df8de5aa8108e72e5e0" + + mime@^1.2.11: + version "1.4.0" +- resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.0.tgz#69e9e0db51d44f2a3b56e48b7817d7d137f1a343" ++ resolved "https://repo.huaweicloud.com/repository/npm/mime/-/mime-1.4.0.tgz#69e9e0db51d44f2a3b56e48b7817d7d137f1a343" + + mimic-fn@^1.0.0: + version "1.1.0" +- resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.1.0.tgz#e667783d92e89dbd342818b5230b9d62a672ad18" ++ resolved "https://repo.huaweicloud.com/repository/npm/mimic-fn/-/mimic-fn-1.1.0.tgz#e667783d92e89dbd342818b5230b9d62a672ad18" + + minimalistic-assert@^1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz#702be2dda6b37f4836bcb3f5db56641b64a1d3d3" ++ resolved "https://repo.huaweicloud.com/repository/npm/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz#702be2dda6b37f4836bcb3f5db56641b64a1d3d3" + + minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: + version "1.0.1" +- resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" ++ resolved "https://repo.huaweicloud.com/repository/npm/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + + "minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4, minimatch@~3.0.2: + version "3.0.4" +- resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" ++ resolved "https://repo.huaweicloud.com/repository/npm/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + dependencies: + brace-expansion "^1.1.7" + + minimist@0.0.8: + version "0.0.8" +- resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" ++ resolved "https://repo.huaweicloud.com/repository/npm/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + + minimist@^1.1.3, minimist@^1.2.0: + version "1.2.0" +- resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" ++ resolved "https://repo.huaweicloud.com/repository/npm/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + + minimist@~0.0.1: + version "0.0.10" +- resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" ++ resolved "https://repo.huaweicloud.com/repository/npm/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" + + mixin-object@^2.0.1: + version "2.0.1" +- resolved "https://registry.yarnpkg.com/mixin-object/-/mixin-object-2.0.1.tgz#4fb949441dab182540f1fe035ba60e1947a5e57e" ++ resolved "https://repo.huaweicloud.com/repository/npm/mixin-object/-/mixin-object-2.0.1.tgz#4fb949441dab182540f1fe035ba60e1947a5e57e" + dependencies: + for-in "^0.1.3" + is-extendable "^0.1.1" + + mkdirp@0.5.0: + version "0.5.0" +- resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.0.tgz#1d73076a6df986cd9344e15e71fcc05a4c9abf12" ++ resolved "https://repo.huaweicloud.com/repository/npm/mkdirp/-/mkdirp-0.5.0.tgz#1d73076a6df986cd9344e15e71fcc05a4c9abf12" + dependencies: + minimist "0.0.8" + + mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: + version "0.5.1" +- resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" ++ resolved "https://repo.huaweicloud.com/repository/npm/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + dependencies: + minimist "0.0.8" + + moment-timezone@^0.5.13: + version "0.5.13" +- resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.13.tgz#99ce5c7d827262eb0f1f702044177f60745d7b90" ++ resolved "https://repo.huaweicloud.com/repository/npm/moment-timezone/-/moment-timezone-0.5.13.tgz#99ce5c7d827262eb0f1f702044177f60745d7b90" + dependencies: + moment ">= 2.9.0" + + moment@*, "moment@>= 2.9.0", moment@>=2.14.0, moment@^2.16.0, moment@^2.18.1: + version "2.18.1" +- resolved "https://registry.yarnpkg.com/moment/-/moment-2.18.1.tgz#c36193dd3ce1c2eed2adb7c802dbbc77a81b1c0f" ++ resolved "https://repo.huaweicloud.com/repository/npm/moment/-/moment-2.18.1.tgz#c36193dd3ce1c2eed2adb7c802dbbc77a81b1c0f" + + ms@0.7.1: + version "0.7.1" +- resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" ++ resolved "https://repo.huaweicloud.com/repository/npm/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" + + ms@0.7.2: + version "0.7.2" +- resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765" ++ resolved "https://repo.huaweicloud.com/repository/npm/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765" + + ms@2.0.0: + version "2.0.0" +- resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" ++ resolved "https://repo.huaweicloud.com/repository/npm/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + + multicast-dns-service-types@^1.1.0: + version "1.1.0" +- resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" ++ resolved "https://repo.huaweicloud.com/repository/npm/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" + + multicast-dns@^6.0.1: + version "6.1.1" +- resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.1.1.tgz#6e7de86a570872ab17058adea7160bbeca814dde" ++ resolved "https://repo.huaweicloud.com/repository/npm/multicast-dns/-/multicast-dns-6.1.1.tgz#6e7de86a570872ab17058adea7160bbeca814dde" + dependencies: + dns-packet "^1.0.1" + thunky "^0.1.0" + + nan@^2.3.0: + version "2.6.2" +- resolved "https://registry.yarnpkg.com/nan/-/nan-2.6.2.tgz#e4ff34e6c95fdfb5aecc08de6596f43605a7db45" ++ resolved "https://repo.huaweicloud.com/repository/npm/nan/-/nan-2.6.2.tgz#e4ff34e6c95fdfb5aecc08de6596f43605a7db45" + + nan@^2.3.2: + version "2.7.0" +- resolved "https://registry.yarnpkg.com/nan/-/nan-2.7.0.tgz#d95bf721ec877e08db276ed3fc6eb78f9083ad46" ++ resolved "https://repo.huaweicloud.com/repository/npm/nan/-/nan-2.7.0.tgz#d95bf721ec877e08db276ed3fc6eb78f9083ad46" + + ncname@1.0.x: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/ncname/-/ncname-1.0.0.tgz#5b57ad18b1ca092864ef62b0b1ed8194f383b71c" ++ resolved "https://repo.huaweicloud.com/repository/npm/ncname/-/ncname-1.0.0.tgz#5b57ad18b1ca092864ef62b0b1ed8194f383b71c" + dependencies: + xml-char-classes "^1.0.0" + + negotiator@0.6.1: + version "0.6.1" +- resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" ++ resolved "https://repo.huaweicloud.com/repository/npm/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" + + ngx-bootstrap@^1.9.3: + version "1.9.3" +- resolved "https://registry.yarnpkg.com/ngx-bootstrap/-/ngx-bootstrap-1.9.3.tgz#28e75d14fb1beaee609383d7694de4eb3ba03b26" ++ resolved "https://repo.huaweicloud.com/repository/npm/ngx-bootstrap/-/ngx-bootstrap-1.9.3.tgz#28e75d14fb1beaee609383d7694de4eb3ba03b26" + + no-case@^2.2.0: + version "2.3.1" +- resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.1.tgz#7aeba1c73a52184265554b7dc03baf720df80081" ++ resolved "https://repo.huaweicloud.com/repository/npm/no-case/-/no-case-2.3.1.tgz#7aeba1c73a52184265554b7dc03baf720df80081" + dependencies: + lower-case "^1.1.1" + + node-dir@^0.1.10: + version "0.1.17" +- resolved "https://registry.yarnpkg.com/node-dir/-/node-dir-0.1.17.tgz#5f5665d93351335caabef8f1c554516cf5f1e4e5" ++ resolved "https://repo.huaweicloud.com/repository/npm/node-dir/-/node-dir-0.1.17.tgz#5f5665d93351335caabef8f1c554516cf5f1e4e5" + dependencies: + minimatch "^3.0.2" + + node-forge@0.6.33: + version "0.6.33" +- resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.6.33.tgz#463811879f573d45155ad6a9f43dc296e8e85ebc" ++ resolved "https://repo.huaweicloud.com/repository/npm/node-forge/-/node-forge-0.6.33.tgz#463811879f573d45155ad6a9f43dc296e8e85ebc" + + node-gyp@^3.3.1: + version "3.6.2" +- resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.6.2.tgz#9bfbe54562286284838e750eac05295853fa1c60" ++ resolved "https://repo.huaweicloud.com/repository/npm/node-gyp/-/node-gyp-3.6.2.tgz#9bfbe54562286284838e750eac05295853fa1c60" + dependencies: + fstream "^1.0.0" + glob "^7.0.3" +@@ -4232,7 +4232,7 @@ + + node-libs-browser@^2.0.0: + version "2.0.0" +- resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.0.0.tgz#a3a59ec97024985b46e958379646f96c4b616646" ++ resolved "https://repo.huaweicloud.com/repository/npm/node-libs-browser/-/node-libs-browser-2.0.0.tgz#a3a59ec97024985b46e958379646f96c4b616646" + dependencies: + assert "^1.1.1" + browserify-zlib "^0.1.4" +@@ -4260,11 +4260,11 @@ + + node-modules-path@^1.0.0: + version "1.0.1" +- resolved "https://registry.yarnpkg.com/node-modules-path/-/node-modules-path-1.0.1.tgz#40096b08ce7ad0ea14680863af449c7c75a5d1c8" ++ resolved "https://repo.huaweicloud.com/repository/npm/node-modules-path/-/node-modules-path-1.0.1.tgz#40096b08ce7ad0ea14680863af449c7c75a5d1c8" + + node-pre-gyp@^0.6.29: + version "0.6.34" +- resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.34.tgz#94ad1c798a11d7fc67381b50d47f8cc18d9799f7" ++ resolved "https://repo.huaweicloud.com/repository/npm/node-pre-gyp/-/node-pre-gyp-0.6.34.tgz#94ad1c798a11d7fc67381b50d47f8cc18d9799f7" + dependencies: + mkdirp "^0.5.1" + nopt "^4.0.1" +@@ -4278,7 +4278,7 @@ + + node-sass@^4.3.0: + version "4.5.3" +- resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.5.3.tgz#d09c9d1179641239d1b97ffc6231fdcec53e1568" ++ resolved "https://repo.huaweicloud.com/repository/npm/node-sass/-/node-sass-4.5.3.tgz#d09c9d1179641239d1b97ffc6231fdcec53e1568" + dependencies: + async-foreach "^0.1.3" + chalk "^1.1.1" +@@ -4301,20 +4301,20 @@ + + "nopt@2 || 3": + version "3.0.6" +- resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" ++ resolved "https://repo.huaweicloud.com/repository/npm/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" + dependencies: + abbrev "1" + + nopt@^4.0.1: + version "4.0.1" +- resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" ++ resolved "https://repo.huaweicloud.com/repository/npm/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" + dependencies: + abbrev "1" + osenv "^0.1.4" + + normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: + version "2.4.0" +- resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" ++ resolved "https://repo.huaweicloud.com/repository/npm/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" + dependencies: + hosted-git-info "^2.1.4" + is-builtin-module "^1.0.0" +@@ -4323,17 +4323,17 @@ + + normalize-path@^2.0.1: + version "2.1.1" +- resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" ++ resolved "https://repo.huaweicloud.com/repository/npm/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + dependencies: + remove-trailing-separator "^1.0.1" + + normalize-range@^0.1.2: + version "0.1.2" +- resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" ++ resolved "https://repo.huaweicloud.com/repository/npm/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + + normalize-url@^1.4.0: + version "1.9.1" +- resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c" ++ resolved "https://repo.huaweicloud.com/repository/npm/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c" + dependencies: + object-assign "^4.0.1" + prepend-http "^1.0.0" +@@ -4342,19 +4342,19 @@ + + npm-run-path@^1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-1.0.0.tgz#f5c32bf595fe81ae927daec52e82f8b000ac3c8f" ++ resolved "https://repo.huaweicloud.com/repository/npm/npm-run-path/-/npm-run-path-1.0.0.tgz#f5c32bf595fe81ae927daec52e82f8b000ac3c8f" + dependencies: + path-key "^1.0.0" + + npm-run-path@^2.0.0: + version "2.0.2" +- resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" ++ resolved "https://repo.huaweicloud.com/repository/npm/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + dependencies: + path-key "^2.0.0" + + "npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0: + version "4.1.2" +- resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" ++ resolved "https://repo.huaweicloud.com/repository/npm/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" +@@ -4363,7 +4363,7 @@ + + npmlog@^4.0.2: + version "4.1.0" +- resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.0.tgz#dc59bee85f64f00ed424efb2af0783df25d1c0b5" ++ resolved "https://repo.huaweicloud.com/repository/npm/npmlog/-/npmlog-4.1.0.tgz#dc59bee85f64f00ed424efb2af0783df25d1c0b5" + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" +@@ -4372,118 +4372,118 @@ + + nth-check@~1.0.1: + version "1.0.1" +- resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.1.tgz#9929acdf628fc2c41098deab82ac580cf149aae4" ++ resolved "https://repo.huaweicloud.com/repository/npm/nth-check/-/nth-check-1.0.1.tgz#9929acdf628fc2c41098deab82ac580cf149aae4" + dependencies: + boolbase "~1.0.0" + + num2fraction@^1.2.2: + version "1.2.2" +- resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" ++ resolved "https://repo.huaweicloud.com/repository/npm/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" + + number-is-nan@^1.0.0: + version "1.0.1" +- resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" ++ resolved "https://repo.huaweicloud.com/repository/npm/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + + oauth-sign@~0.8.1: + version "0.8.2" +- resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" ++ resolved "https://repo.huaweicloud.com/repository/npm/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" + + object-assign@4.1.0: + version "4.1.0" +- resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0" ++ resolved "https://repo.huaweicloud.com/repository/npm/object-assign/-/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0" + + object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: + version "4.1.1" +- resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" ++ resolved "https://repo.huaweicloud.com/repository/npm/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + + object-component@0.0.3: + version "0.0.3" +- resolved "https://registry.yarnpkg.com/object-component/-/object-component-0.0.3.tgz#f0c69aa50efc95b866c186f400a33769cb2f1291" ++ resolved "https://repo.huaweicloud.com/repository/npm/object-component/-/object-component-0.0.3.tgz#f0c69aa50efc95b866c186f400a33769cb2f1291" + + object-keys@^1.0.8: + version "1.0.11" +- resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d" ++ resolved "https://repo.huaweicloud.com/repository/npm/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d" + + object.omit@^2.0.0: + version "2.0.1" +- resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" ++ resolved "https://repo.huaweicloud.com/repository/npm/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" + dependencies: + for-own "^0.1.4" + is-extendable "^0.1.1" + + obuf@^1.0.0, obuf@^1.1.1: + version "1.1.1" +- resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.1.tgz#104124b6c602c6796881a042541d36db43a5264e" ++ resolved "https://repo.huaweicloud.com/repository/npm/obuf/-/obuf-1.1.1.tgz#104124b6c602c6796881a042541d36db43a5264e" + + on-finished@~2.3.0: + version "2.3.0" +- resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" ++ resolved "https://repo.huaweicloud.com/repository/npm/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + dependencies: + ee-first "1.1.1" + + on-headers@~1.0.1: + version "1.0.1" +- resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7" ++ resolved "https://repo.huaweicloud.com/repository/npm/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7" + + once@^1.3.0, once@^1.3.3, once@^1.4.0: + version "1.4.0" +- resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" ++ resolved "https://repo.huaweicloud.com/repository/npm/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + dependencies: + wrappy "1" + + opn@4.0.2: + version "4.0.2" +- resolved "https://registry.yarnpkg.com/opn/-/opn-4.0.2.tgz#7abc22e644dff63b0a96d5ab7f2790c0f01abc95" ++ resolved "https://repo.huaweicloud.com/repository/npm/opn/-/opn-4.0.2.tgz#7abc22e644dff63b0a96d5ab7f2790c0f01abc95" + dependencies: + object-assign "^4.0.1" + pinkie-promise "^2.0.0" + + opn@^5.1.0, opn@~5.1.0: + version "5.1.0" +- resolved "https://registry.yarnpkg.com/opn/-/opn-5.1.0.tgz#72ce2306a17dbea58ff1041853352b4a8fc77519" ++ resolved "https://repo.huaweicloud.com/repository/npm/opn/-/opn-5.1.0.tgz#72ce2306a17dbea58ff1041853352b4a8fc77519" + dependencies: + is-wsl "^1.1.0" + + optimist@^0.6.1, optimist@~0.6.0: + version "0.6.1" +- resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" ++ resolved "https://repo.huaweicloud.com/repository/npm/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" + dependencies: + minimist "~0.0.1" + wordwrap "~0.0.2" + + optimist@~0.3, optimist@~0.3.5: + version "0.3.7" +- resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.3.7.tgz#c90941ad59e4273328923074d2cf2e7cbc6ec0d9" ++ resolved "https://repo.huaweicloud.com/repository/npm/optimist/-/optimist-0.3.7.tgz#c90941ad59e4273328923074d2cf2e7cbc6ec0d9" + dependencies: + wordwrap "~0.0.2" + + options@>=0.0.5: + version "0.0.6" +- resolved "https://registry.yarnpkg.com/options/-/options-0.0.6.tgz#ec22d312806bb53e731773e7cdaefcf1c643128f" ++ resolved "https://repo.huaweicloud.com/repository/npm/options/-/options-0.0.6.tgz#ec22d312806bb53e731773e7cdaefcf1c643128f" + + original@>=0.0.5: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/original/-/original-1.0.0.tgz#9147f93fa1696d04be61e01bd50baeaca656bd3b" ++ resolved "https://repo.huaweicloud.com/repository/npm/original/-/original-1.0.0.tgz#9147f93fa1696d04be61e01bd50baeaca656bd3b" + dependencies: + url-parse "1.0.x" + + os-browserify@^0.2.0: + version "0.2.1" +- resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.2.1.tgz#63fc4ccee5d2d7763d26bbf8601078e6c2e0044f" ++ resolved "https://repo.huaweicloud.com/repository/npm/os-browserify/-/os-browserify-0.2.1.tgz#63fc4ccee5d2d7763d26bbf8601078e6c2e0044f" + + os-homedir@^1.0.0, os-homedir@^1.0.1: + version "1.0.2" +- resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" ++ resolved "https://repo.huaweicloud.com/repository/npm/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + + os-locale@^1.4.0: + version "1.4.0" +- resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" ++ resolved "https://repo.huaweicloud.com/repository/npm/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" + dependencies: + lcid "^1.0.0" + + os-locale@^2.0.0: + version "2.1.0" +- resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" ++ resolved "https://repo.huaweicloud.com/repository/npm/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" + dependencies: + execa "^0.7.0" + lcid "^1.0.0" +@@ -4491,36 +4491,36 @@ + + os-tmpdir@^1.0.0, os-tmpdir@~1.0.1: + version "1.0.2" +- resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" ++ resolved "https://repo.huaweicloud.com/repository/npm/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + + osenv@0, osenv@^0.1.4: + version "0.1.4" +- resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644" ++ resolved "https://repo.huaweicloud.com/repository/npm/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + + p-finally@^1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" ++ resolved "https://repo.huaweicloud.com/repository/npm/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + + p-limit@^1.1.0: + version "1.1.0" +- resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.1.0.tgz#b07ff2d9a5d88bec806035895a2bab66a27988bc" ++ resolved "https://repo.huaweicloud.com/repository/npm/p-limit/-/p-limit-1.1.0.tgz#b07ff2d9a5d88bec806035895a2bab66a27988bc" + + p-locate@^2.0.0: + version "2.0.0" +- resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" ++ resolved "https://repo.huaweicloud.com/repository/npm/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + dependencies: + p-limit "^1.1.0" + + p-map@^1.1.1: + version "1.1.1" +- resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.1.1.tgz#05f5e4ae97a068371bc2a5cc86bfbdbc19c4ae7a" ++ resolved "https://repo.huaweicloud.com/repository/npm/p-map/-/p-map-1.1.1.tgz#05f5e4ae97a068371bc2a5cc86bfbdbc19c4ae7a" + + package-json@^4.0.0: + version "4.0.1" +- resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed" ++ resolved "https://repo.huaweicloud.com/repository/npm/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed" + dependencies: + got "^6.7.1" + registry-auth-token "^3.0.1" +@@ -4529,17 +4529,17 @@ + + pako@~0.2.0: + version "0.2.9" +- resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75" ++ resolved "https://repo.huaweicloud.com/repository/npm/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75" + + param-case@2.1.x: + version "2.1.1" +- resolved "https://registry.yarnpkg.com/param-case/-/param-case-2.1.1.tgz#df94fd8cf6531ecf75e6bef9a0858fbc72be2247" ++ resolved "https://repo.huaweicloud.com/repository/npm/param-case/-/param-case-2.1.1.tgz#df94fd8cf6531ecf75e6bef9a0858fbc72be2247" + dependencies: + no-case "^2.2.0" + + parse-asn1@^5.0.0: + version "5.1.0" +- resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.0.tgz#37c4f9b7ed3ab65c74817b5f2480937fbf97c712" ++ resolved "https://repo.huaweicloud.com/repository/npm/parse-asn1/-/parse-asn1-5.1.0.tgz#37c4f9b7ed3ab65c74817b5f2480937fbf97c712" + dependencies: + asn1.js "^4.0.0" + browserify-aes "^1.0.0" +@@ -4549,7 +4549,7 @@ + + parse-glob@^3.0.4: + version "3.0.4" +- resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" ++ resolved "https://repo.huaweicloud.com/repository/npm/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" + dependencies: + glob-base "^0.3.0" + is-dotfile "^1.0.0" +@@ -4558,73 +4558,73 @@ + + parse-json@^2.2.0: + version "2.2.0" +- resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" ++ resolved "https://repo.huaweicloud.com/repository/npm/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + dependencies: + error-ex "^1.2.0" + + parsejson@0.0.3: + version "0.0.3" +- resolved "https://registry.yarnpkg.com/parsejson/-/parsejson-0.0.3.tgz#ab7e3759f209ece99437973f7d0f1f64ae0e64ab" ++ resolved "https://repo.huaweicloud.com/repository/npm/parsejson/-/parsejson-0.0.3.tgz#ab7e3759f209ece99437973f7d0f1f64ae0e64ab" + dependencies: + better-assert "~1.0.0" + + parseqs@0.0.5: + version "0.0.5" +- resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.5.tgz#d5208a3738e46766e291ba2ea173684921a8b89d" ++ resolved "https://repo.huaweicloud.com/repository/npm/parseqs/-/parseqs-0.0.5.tgz#d5208a3738e46766e291ba2ea173684921a8b89d" + dependencies: + better-assert "~1.0.0" + + parseuri@0.0.5: + version "0.0.5" +- resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.5.tgz#80204a50d4dbb779bfdc6ebe2778d90e4bce320a" ++ resolved "https://repo.huaweicloud.com/repository/npm/parseuri/-/parseuri-0.0.5.tgz#80204a50d4dbb779bfdc6ebe2778d90e4bce320a" + dependencies: + better-assert "~1.0.0" + + parseurl@~1.3.1: + version "1.3.1" +- resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.1.tgz#c8ab8c9223ba34888aa64a297b28853bec18da56" ++ resolved "https://repo.huaweicloud.com/repository/npm/parseurl/-/parseurl-1.3.1.tgz#c8ab8c9223ba34888aa64a297b28853bec18da56" + + path-browserify@0.0.0: + version "0.0.0" +- resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a" ++ resolved "https://repo.huaweicloud.com/repository/npm/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a" + + path-exists@^2.0.0: + version "2.1.0" +- resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" ++ resolved "https://repo.huaweicloud.com/repository/npm/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + dependencies: + pinkie-promise "^2.0.0" + + path-exists@^3.0.0: + version "3.0.0" +- resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" ++ resolved "https://repo.huaweicloud.com/repository/npm/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + + path-is-absolute@^1.0.0: + version "1.0.1" +- resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" ++ resolved "https://repo.huaweicloud.com/repository/npm/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + + path-is-inside@^1.0.1: + version "1.0.2" +- resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" ++ resolved "https://repo.huaweicloud.com/repository/npm/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + + path-key@^1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/path-key/-/path-key-1.0.0.tgz#5d53d578019646c0d68800db4e146e6bdc2ac7af" ++ resolved "https://repo.huaweicloud.com/repository/npm/path-key/-/path-key-1.0.0.tgz#5d53d578019646c0d68800db4e146e6bdc2ac7af" + + path-key@^2.0.0: + version "2.0.1" +- resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" ++ resolved "https://repo.huaweicloud.com/repository/npm/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + + path-parse@^1.0.5: + version "1.0.5" +- resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" ++ resolved "https://repo.huaweicloud.com/repository/npm/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" + + path-to-regexp@0.1.7: + version "0.1.7" +- resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" ++ resolved "https://repo.huaweicloud.com/repository/npm/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + + path-type@^1.0.0: + version "1.1.0" +- resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" ++ resolved "https://repo.huaweicloud.com/repository/npm/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" + dependencies: + graceful-fs "^4.1.2" + pify "^2.0.0" +@@ -4632,13 +4632,13 @@ + + path-type@^2.0.0: + version "2.0.0" +- resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" ++ resolved "https://repo.huaweicloud.com/repository/npm/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" + dependencies: + pify "^2.0.0" + + pbkdf2@^3.0.3: + version "3.0.13" +- resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.13.tgz#c37d295531e786b1da3e3eadc840426accb0ae25" ++ resolved "https://repo.huaweicloud.com/repository/npm/pbkdf2/-/pbkdf2-3.0.13.tgz#c37d295531e786b1da3e3eadc840426accb0ae25" + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" +@@ -4648,15 +4648,15 @@ + + pend@~1.2.0: + version "1.2.0" +- resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" ++ resolved "https://repo.huaweicloud.com/repository/npm/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" + + performance-now@^0.2.0: + version "0.2.0" +- resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" ++ resolved "https://repo.huaweicloud.com/repository/npm/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" + + phantomjs-prebuilt@^2.1.7: + version "2.1.15" +- resolved "https://registry.yarnpkg.com/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.15.tgz#20f86e82d3349c505917527745b7a411e08b3903" ++ resolved "https://repo.huaweicloud.com/repository/npm/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.15.tgz#20f86e82d3349c505917527745b7a411e08b3903" + dependencies: + es6-promise "~4.0.3" + extract-zip "~1.6.5" +@@ -4670,25 +4670,25 @@ + + pify@^2.0.0, pify@^2.3.0: + version "2.3.0" +- resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" ++ resolved "https://repo.huaweicloud.com/repository/npm/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + + pify@^3.0.0: + version "3.0.0" +- resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" ++ resolved "https://repo.huaweicloud.com/repository/npm/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + + pinkie-promise@^2.0.0: + version "2.0.1" +- resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" ++ resolved "https://repo.huaweicloud.com/repository/npm/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + dependencies: + pinkie "^2.0.0" + + pinkie@^2.0.0, pinkie@^2.0.4: + version "2.0.4" +- resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" ++ resolved "https://repo.huaweicloud.com/repository/npm/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + + portfinder@^1.0.9, portfinder@~1.0.12: + version "1.0.13" +- resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.13.tgz#bb32ecd87c27104ae6ee44b5a3ccbf0ebb1aede9" ++ resolved "https://repo.huaweicloud.com/repository/npm/portfinder/-/portfinder-1.0.13.tgz#bb32ecd87c27104ae6ee44b5a3ccbf0ebb1aede9" + dependencies: + async "^1.5.2" + debug "^2.2.0" +@@ -4696,7 +4696,7 @@ + + postcss-calc@^5.2.0: + version "5.3.1" +- resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-5.3.1.tgz#77bae7ca928ad85716e2fda42f261bf7c1d65b5e" ++ resolved "https://repo.huaweicloud.com/repository/npm/postcss-calc/-/postcss-calc-5.3.1.tgz#77bae7ca928ad85716e2fda42f261bf7c1d65b5e" + dependencies: + postcss "^5.0.2" + postcss-message-helpers "^2.0.0" +@@ -4704,7 +4704,7 @@ + + postcss-colormin@^2.1.8: + version "2.2.2" +- resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-2.2.2.tgz#6631417d5f0e909a3d7ec26b24c8a8d1e4f96e4b" ++ resolved "https://repo.huaweicloud.com/repository/npm/postcss-colormin/-/postcss-colormin-2.2.2.tgz#6631417d5f0e909a3d7ec26b24c8a8d1e4f96e4b" + dependencies: + colormin "^1.0.5" + postcss "^5.0.13" +@@ -4712,52 +4712,52 @@ + + postcss-convert-values@^2.3.4: + version "2.6.1" +- resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz#bbd8593c5c1fd2e3d1c322bb925dcae8dae4d62d" ++ resolved "https://repo.huaweicloud.com/repository/npm/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz#bbd8593c5c1fd2e3d1c322bb925dcae8dae4d62d" + dependencies: + postcss "^5.0.11" + postcss-value-parser "^3.1.2" + + postcss-discard-comments@^2.0.4: + version "2.0.4" +- resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz#befe89fafd5b3dace5ccce51b76b81514be00e3d" ++ resolved "https://repo.huaweicloud.com/repository/npm/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz#befe89fafd5b3dace5ccce51b76b81514be00e3d" + dependencies: + postcss "^5.0.14" + + postcss-discard-duplicates@^2.0.1: + version "2.1.0" +- resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz#b9abf27b88ac188158a5eb12abcae20263b91932" ++ resolved "https://repo.huaweicloud.com/repository/npm/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz#b9abf27b88ac188158a5eb12abcae20263b91932" + dependencies: + postcss "^5.0.4" + + postcss-discard-empty@^2.0.1: + version "2.1.0" +- resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz#d2b4bd9d5ced5ebd8dcade7640c7d7cd7f4f92b5" ++ resolved "https://repo.huaweicloud.com/repository/npm/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz#d2b4bd9d5ced5ebd8dcade7640c7d7cd7f4f92b5" + dependencies: + postcss "^5.0.14" + + postcss-discard-overridden@^0.1.1: + version "0.1.1" +- resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz#8b1eaf554f686fb288cd874c55667b0aa3668d58" ++ resolved "https://repo.huaweicloud.com/repository/npm/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz#8b1eaf554f686fb288cd874c55667b0aa3668d58" + dependencies: + postcss "^5.0.16" + + postcss-discard-unused@^2.2.1: + version "2.2.3" +- resolved "https://registry.yarnpkg.com/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz#bce30b2cc591ffc634322b5fb3464b6d934f4433" ++ resolved "https://repo.huaweicloud.com/repository/npm/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz#bce30b2cc591ffc634322b5fb3464b6d934f4433" + dependencies: + postcss "^5.0.14" + uniqs "^2.0.0" + + postcss-filter-plugins@^2.0.0: + version "2.0.2" +- resolved "https://registry.yarnpkg.com/postcss-filter-plugins/-/postcss-filter-plugins-2.0.2.tgz#6d85862534d735ac420e4a85806e1f5d4286d84c" ++ resolved "https://repo.huaweicloud.com/repository/npm/postcss-filter-plugins/-/postcss-filter-plugins-2.0.2.tgz#6d85862534d735ac420e4a85806e1f5d4286d84c" + dependencies: + postcss "^5.0.4" + uniqid "^4.0.0" + + postcss-load-config@^1.2.0: + version "1.2.0" +- resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-1.2.0.tgz#539e9afc9ddc8620121ebf9d8c3673e0ce50d28a" ++ resolved "https://repo.huaweicloud.com/repository/npm/postcss-load-config/-/postcss-load-config-1.2.0.tgz#539e9afc9ddc8620121ebf9d8c3673e0ce50d28a" + dependencies: + cosmiconfig "^2.1.0" + object-assign "^4.1.0" +@@ -4766,21 +4766,21 @@ + + postcss-load-options@^1.2.0: + version "1.2.0" +- resolved "https://registry.yarnpkg.com/postcss-load-options/-/postcss-load-options-1.2.0.tgz#b098b1559ddac2df04bc0bb375f99a5cfe2b6d8c" ++ resolved "https://repo.huaweicloud.com/repository/npm/postcss-load-options/-/postcss-load-options-1.2.0.tgz#b098b1559ddac2df04bc0bb375f99a5cfe2b6d8c" + dependencies: + cosmiconfig "^2.1.0" + object-assign "^4.1.0" + + postcss-load-plugins@^2.3.0: + version "2.3.0" +- resolved "https://registry.yarnpkg.com/postcss-load-plugins/-/postcss-load-plugins-2.3.0.tgz#745768116599aca2f009fad426b00175049d8d92" ++ resolved "https://repo.huaweicloud.com/repository/npm/postcss-load-plugins/-/postcss-load-plugins-2.3.0.tgz#745768116599aca2f009fad426b00175049d8d92" + dependencies: + cosmiconfig "^2.1.1" + object-assign "^4.1.0" + + postcss-loader@^1.3.3: + version "1.3.3" +- resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-1.3.3.tgz#a621ea1fa29062a83972a46f54486771301916eb" ++ resolved "https://repo.huaweicloud.com/repository/npm/postcss-loader/-/postcss-loader-1.3.3.tgz#a621ea1fa29062a83972a46f54486771301916eb" + dependencies: + loader-utils "^1.0.2" + object-assign "^4.1.1" +@@ -4789,7 +4789,7 @@ + + postcss-merge-idents@^2.1.5: + version "2.1.7" +- resolved "https://registry.yarnpkg.com/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz#4c5530313c08e1d5b3bbf3d2bbc747e278eea270" ++ resolved "https://repo.huaweicloud.com/repository/npm/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz#4c5530313c08e1d5b3bbf3d2bbc747e278eea270" + dependencies: + has "^1.0.1" + postcss "^5.0.10" +@@ -4797,13 +4797,13 @@ + + postcss-merge-longhand@^2.0.1: + version "2.0.2" +- resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz#23d90cd127b0a77994915332739034a1a4f3d658" ++ resolved "https://repo.huaweicloud.com/repository/npm/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz#23d90cd127b0a77994915332739034a1a4f3d658" + dependencies: + postcss "^5.0.4" + + postcss-merge-rules@^2.0.3: + version "2.1.2" +- resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz#d1df5dfaa7b1acc3be553f0e9e10e87c61b5f721" ++ resolved "https://repo.huaweicloud.com/repository/npm/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz#d1df5dfaa7b1acc3be553f0e9e10e87c61b5f721" + dependencies: + browserslist "^1.5.2" + caniuse-api "^1.5.2" +@@ -4813,11 +4813,11 @@ + + postcss-message-helpers@^2.0.0: + version "2.0.0" +- resolved "https://registry.yarnpkg.com/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz#a4f2f4fab6e4fe002f0aed000478cdf52f9ba60e" ++ resolved "https://repo.huaweicloud.com/repository/npm/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz#a4f2f4fab6e4fe002f0aed000478cdf52f9ba60e" + + postcss-minify-font-values@^1.0.2: + version "1.0.5" +- resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz#4b58edb56641eba7c8474ab3526cafd7bbdecb69" ++ resolved "https://repo.huaweicloud.com/repository/npm/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz#4b58edb56641eba7c8474ab3526cafd7bbdecb69" + dependencies: + object-assign "^4.0.1" + postcss "^5.0.4" +@@ -4825,14 +4825,14 @@ + + postcss-minify-gradients@^1.0.1: + version "1.0.5" +- resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz#5dbda11373703f83cfb4a3ea3881d8d75ff5e6e1" ++ resolved "https://repo.huaweicloud.com/repository/npm/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz#5dbda11373703f83cfb4a3ea3881d8d75ff5e6e1" + dependencies: + postcss "^5.0.12" + postcss-value-parser "^3.3.0" + + postcss-minify-params@^1.0.4: + version "1.2.2" +- resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz#ad2ce071373b943b3d930a3fa59a358c28d6f1f3" ++ resolved "https://repo.huaweicloud.com/repository/npm/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz#ad2ce071373b943b3d930a3fa59a358c28d6f1f3" + dependencies: + alphanum-sort "^1.0.1" + postcss "^5.0.2" +@@ -4841,7 +4841,7 @@ + + postcss-minify-selectors@^2.0.4: + version "2.1.1" +- resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz#b2c6a98c0072cf91b932d1a496508114311735bf" ++ resolved "https://repo.huaweicloud.com/repository/npm/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz#b2c6a98c0072cf91b932d1a496508114311735bf" + dependencies: + alphanum-sort "^1.0.2" + has "^1.0.1" +@@ -4850,40 +4850,40 @@ + + postcss-modules-extract-imports@^1.0.0: + version "1.2.0" +- resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.0.tgz#66140ecece38ef06bf0d3e355d69bf59d141ea85" ++ resolved "https://repo.huaweicloud.com/repository/npm/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.0.tgz#66140ecece38ef06bf0d3e355d69bf59d141ea85" + dependencies: + postcss "^6.0.1" + + postcss-modules-local-by-default@^1.0.1: + version "1.2.0" +- resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz#f7d80c398c5a393fa7964466bd19500a7d61c069" ++ resolved "https://repo.huaweicloud.com/repository/npm/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz#f7d80c398c5a393fa7964466bd19500a7d61c069" + dependencies: + css-selector-tokenizer "^0.7.0" + postcss "^6.0.1" + + postcss-modules-scope@^1.0.0: + version "1.1.0" +- resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz#d6ea64994c79f97b62a72b426fbe6056a194bb90" ++ resolved "https://repo.huaweicloud.com/repository/npm/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz#d6ea64994c79f97b62a72b426fbe6056a194bb90" + dependencies: + css-selector-tokenizer "^0.7.0" + postcss "^6.0.1" + + postcss-modules-values@^1.1.0: + version "1.3.0" +- resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz#ecffa9d7e192518389f42ad0e83f72aec456ea20" ++ resolved "https://repo.huaweicloud.com/repository/npm/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz#ecffa9d7e192518389f42ad0e83f72aec456ea20" + dependencies: + icss-replace-symbols "^1.1.0" + postcss "^6.0.1" + + postcss-normalize-charset@^1.1.0: + version "1.1.1" +- resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz#ef9ee71212d7fe759c78ed162f61ed62b5cb93f1" ++ resolved "https://repo.huaweicloud.com/repository/npm/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz#ef9ee71212d7fe759c78ed162f61ed62b5cb93f1" + dependencies: + postcss "^5.0.5" + + postcss-normalize-url@^3.0.7: + version "3.0.8" +- resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz#108f74b3f2fcdaf891a2ffa3ea4592279fc78222" ++ resolved "https://repo.huaweicloud.com/repository/npm/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz#108f74b3f2fcdaf891a2ffa3ea4592279fc78222" + dependencies: + is-absolute-url "^2.0.0" + normalize-url "^1.4.0" +@@ -4892,27 +4892,27 @@ + + postcss-ordered-values@^2.1.0: + version "2.2.3" +- resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz#eec6c2a67b6c412a8db2042e77fe8da43f95c11d" ++ resolved "https://repo.huaweicloud.com/repository/npm/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz#eec6c2a67b6c412a8db2042e77fe8da43f95c11d" + dependencies: + postcss "^5.0.4" + postcss-value-parser "^3.0.1" + + postcss-reduce-idents@^2.2.2: + version "2.4.0" +- resolved "https://registry.yarnpkg.com/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz#c2c6d20cc958284f6abfbe63f7609bf409059ad3" ++ resolved "https://repo.huaweicloud.com/repository/npm/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz#c2c6d20cc958284f6abfbe63f7609bf409059ad3" + dependencies: + postcss "^5.0.4" + postcss-value-parser "^3.0.2" + + postcss-reduce-initial@^1.0.0: + version "1.0.1" +- resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz#68f80695f045d08263a879ad240df8dd64f644ea" ++ resolved "https://repo.huaweicloud.com/repository/npm/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz#68f80695f045d08263a879ad240df8dd64f644ea" + dependencies: + postcss "^5.0.4" + + postcss-reduce-transforms@^1.0.3: + version "1.0.4" +- resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz#ff76f4d8212437b31c298a42d2e1444025771ae1" ++ resolved "https://repo.huaweicloud.com/repository/npm/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz#ff76f4d8212437b31c298a42d2e1444025771ae1" + dependencies: + has "^1.0.1" + postcss "^5.0.8" +@@ -4920,7 +4920,7 @@ + + postcss-selector-parser@^2.0.0, postcss-selector-parser@^2.2.2: + version "2.2.3" +- resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz#f9437788606c3c9acee16ffe8d8b16297f27bb90" ++ resolved "https://repo.huaweicloud.com/repository/npm/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz#f9437788606c3c9acee16ffe8d8b16297f27bb90" + dependencies: + flatten "^1.0.2" + indexes-of "^1.0.1" +@@ -4928,7 +4928,7 @@ + + postcss-svgo@^2.1.1: + version "2.1.6" +- resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-2.1.6.tgz#b6df18aa613b666e133f08adb5219c2684ac108d" ++ resolved "https://repo.huaweicloud.com/repository/npm/postcss-svgo/-/postcss-svgo-2.1.6.tgz#b6df18aa613b666e133f08adb5219c2684ac108d" + dependencies: + is-svg "^2.0.0" + postcss "^5.0.14" +@@ -4937,7 +4937,7 @@ + + postcss-unique-selectors@^2.0.2: + version "2.0.2" +- resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz#981d57d29ddcb33e7b1dfe1fd43b8649f933ca1d" ++ resolved "https://repo.huaweicloud.com/repository/npm/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz#981d57d29ddcb33e7b1dfe1fd43b8649f933ca1d" + dependencies: + alphanum-sort "^1.0.1" + postcss "^5.0.4" +@@ -4945,7 +4945,7 @@ + + postcss-url@^5.1.2: + version "5.1.2" +- resolved "https://registry.yarnpkg.com/postcss-url/-/postcss-url-5.1.2.tgz#98b3165be8d592471cb0caadde2c0d1f832f133e" ++ resolved "https://repo.huaweicloud.com/repository/npm/postcss-url/-/postcss-url-5.1.2.tgz#98b3165be8d592471cb0caadde2c0d1f832f133e" + dependencies: + directory-encoder "^0.7.2" + js-base64 "^2.1.5" +@@ -4957,11 +4957,11 @@ + + postcss-value-parser@^3.0.1, postcss-value-parser@^3.0.2, postcss-value-parser@^3.1.1, postcss-value-parser@^3.1.2, postcss-value-parser@^3.2.3, postcss-value-parser@^3.3.0: + version "3.3.0" +- resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz#87f38f9f18f774a4ab4c8a232f5c5ce8872a9d15" ++ resolved "https://repo.huaweicloud.com/repository/npm/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz#87f38f9f18f774a4ab4c8a232f5c5ce8872a9d15" + + postcss-zindex@^2.0.1: + version "2.2.0" +- resolved "https://registry.yarnpkg.com/postcss-zindex/-/postcss-zindex-2.2.0.tgz#d2109ddc055b91af67fc4cb3b025946639d2af22" ++ resolved "https://repo.huaweicloud.com/repository/npm/postcss-zindex/-/postcss-zindex-2.2.0.tgz#d2109ddc055b91af67fc4cb3b025946639d2af22" + dependencies: + has "^1.0.1" + postcss "^5.0.4" +@@ -4969,7 +4969,7 @@ + + postcss@^5.0.0, postcss@^5.0.10, postcss@^5.0.11, postcss@^5.0.12, postcss@^5.0.13, postcss@^5.0.14, postcss@^5.0.16, postcss@^5.0.2, postcss@^5.0.4, postcss@^5.0.5, postcss@^5.0.6, postcss@^5.0.8, postcss@^5.2.15, postcss@^5.2.16: + version "5.2.17" +- resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.17.tgz#cf4f597b864d65c8a492b2eabe9d706c879c388b" ++ resolved "https://repo.huaweicloud.com/repository/npm/postcss/-/postcss-5.2.17.tgz#cf4f597b864d65c8a492b2eabe9d706c879c388b" + dependencies: + chalk "^1.1.3" + js-base64 "^2.1.9" +@@ -4978,7 +4978,7 @@ + + postcss@^6.0.1: + version "6.0.11" +- resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.11.tgz#f48db210b1d37a7f7ab6499b7a54982997ab6f72" ++ resolved "https://repo.huaweicloud.com/repository/npm/postcss/-/postcss-6.0.11.tgz#f48db210b1d37a7f7ab6499b7a54982997ab6f72" + dependencies: + chalk "^2.1.0" + source-map "^0.5.7" +@@ -4986,40 +4986,40 @@ + + prepend-http@^1.0.0, prepend-http@^1.0.1: + version "1.0.4" +- resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" ++ resolved "https://repo.huaweicloud.com/repository/npm/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" + + preserve@^0.2.0: + version "0.2.0" +- resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" ++ resolved "https://repo.huaweicloud.com/repository/npm/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" + + pretty-error@^2.0.2: + version "2.1.1" +- resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.1.tgz#5f4f87c8f91e5ae3f3ba87ab4cf5e03b1a17f1a3" ++ resolved "https://repo.huaweicloud.com/repository/npm/pretty-error/-/pretty-error-2.1.1.tgz#5f4f87c8f91e5ae3f3ba87ab4cf5e03b1a17f1a3" + dependencies: + renderkid "^2.0.1" + utila "~0.4" + + process-nextick-args@~1.0.6: + version "1.0.7" +- resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" ++ resolved "https://repo.huaweicloud.com/repository/npm/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" + + process@^0.11.0: + version "0.11.10" +- resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" ++ resolved "https://repo.huaweicloud.com/repository/npm/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + + progress@~1.1.8: + version "1.1.8" +- resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be" ++ resolved "https://repo.huaweicloud.com/repository/npm/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be" + + promise@^7.1.1: + version "7.3.1" +- resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" ++ resolved "https://repo.huaweicloud.com/repository/npm/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" + dependencies: + asap "~2.0.3" + + protractor@~5.1.0: + version "5.1.2" +- resolved "https://registry.yarnpkg.com/protractor/-/protractor-5.1.2.tgz#9b221741709a4c62d5cd53c6aadd54a71137e95f" ++ resolved "https://repo.huaweicloud.com/repository/npm/protractor/-/protractor-5.1.2.tgz#9b221741709a4c62d5cd53c6aadd54a71137e95f" + dependencies: + "@types/node" "^6.0.46" + "@types/q" "^0.0.32" +@@ -5039,22 +5039,22 @@ + + proxy-addr@~1.1.5: + version "1.1.5" +- resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-1.1.5.tgz#71c0ee3b102de3f202f3b64f608d173fcba1a918" ++ resolved "https://repo.huaweicloud.com/repository/npm/proxy-addr/-/proxy-addr-1.1.5.tgz#71c0ee3b102de3f202f3b64f608d173fcba1a918" + dependencies: + forwarded "~0.1.0" + ipaddr.js "1.4.0" + + prr@~0.0.0: + version "0.0.0" +- resolved "https://registry.yarnpkg.com/prr/-/prr-0.0.0.tgz#1a84b85908325501411853d0081ee3fa86e2926a" ++ resolved "https://repo.huaweicloud.com/repository/npm/prr/-/prr-0.0.0.tgz#1a84b85908325501411853d0081ee3fa86e2926a" + + pseudomap@^1.0.1, pseudomap@^1.0.2: + version "1.0.2" +- resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" ++ resolved "https://repo.huaweicloud.com/repository/npm/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + + public-encrypt@^4.0.0: + version "4.0.0" +- resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.0.tgz#39f699f3a46560dd5ebacbca693caf7c65c18cc6" ++ resolved "https://repo.huaweicloud.com/repository/npm/public-encrypt/-/public-encrypt-4.0.0.tgz#39f699f3a46560dd5ebacbca693caf7c65c18cc6" + dependencies: + bn.js "^4.1.0" + browserify-rsa "^4.0.0" +@@ -5064,65 +5064,65 @@ + + punycode@1.3.2: + version "1.3.2" +- resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" ++ resolved "https://repo.huaweicloud.com/repository/npm/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + + punycode@^1.2.4, punycode@^1.4.1: + version "1.4.1" +- resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" ++ resolved "https://repo.huaweicloud.com/repository/npm/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + + q@1.4.1, q@^1.4.1: + version "1.4.1" +- resolved "https://registry.yarnpkg.com/q/-/q-1.4.1.tgz#55705bcd93c5f3673530c2c2cbc0c2b3addc286e" ++ resolved "https://repo.huaweicloud.com/repository/npm/q/-/q-1.4.1.tgz#55705bcd93c5f3673530c2c2cbc0c2b3addc286e" + + q@^1.1.2: + version "1.5.0" +- resolved "https://registry.yarnpkg.com/q/-/q-1.5.0.tgz#dd01bac9d06d30e6f219aecb8253ee9ebdc308f1" ++ resolved "https://repo.huaweicloud.com/repository/npm/q/-/q-1.5.0.tgz#dd01bac9d06d30e6f219aecb8253ee9ebdc308f1" + + qjobs@^1.1.4: + version "1.1.5" +- resolved "https://registry.yarnpkg.com/qjobs/-/qjobs-1.1.5.tgz#659de9f2cf8dcc27a1481276f205377272382e73" ++ resolved "https://repo.huaweicloud.com/repository/npm/qjobs/-/qjobs-1.1.5.tgz#659de9f2cf8dcc27a1481276f205377272382e73" + + qs@6.4.0, qs@~6.4.0: + version "6.4.0" +- resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" ++ resolved "https://repo.huaweicloud.com/repository/npm/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" + + qs@6.5.0: + version "6.5.0" +- resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.0.tgz#8d04954d364def3efc55b5a0793e1e2c8b1e6e49" ++ resolved "https://repo.huaweicloud.com/repository/npm/qs/-/qs-6.5.0.tgz#8d04954d364def3efc55b5a0793e1e2c8b1e6e49" + + query-string@^4.1.0: + version "4.3.4" +- resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb" ++ resolved "https://repo.huaweicloud.com/repository/npm/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb" + dependencies: + object-assign "^4.1.0" + strict-uri-encode "^1.0.0" + + querystring-es3@^0.2.0: + version "0.2.1" +- resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" ++ resolved "https://repo.huaweicloud.com/repository/npm/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + + querystring@0.2.0: + version "0.2.0" +- resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" ++ resolved "https://repo.huaweicloud.com/repository/npm/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + + querystringify@0.0.x: + version "0.0.4" +- resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-0.0.4.tgz#0cf7f84f9463ff0ae51c4c4b142d95be37724d9c" ++ resolved "https://repo.huaweicloud.com/repository/npm/querystringify/-/querystringify-0.0.4.tgz#0cf7f84f9463ff0ae51c4c4b142d95be37724d9c" + + querystringify@~1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-1.0.0.tgz#6286242112c5b712fa654e526652bf6a13ff05cb" ++ resolved "https://repo.huaweicloud.com/repository/npm/querystringify/-/querystringify-1.0.0.tgz#6286242112c5b712fa654e526652bf6a13ff05cb" + + randomatic@^1.1.3: + version "1.1.6" +- resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.6.tgz#110dcabff397e9dcff7c0789ccc0a49adf1ec5bb" ++ resolved "https://repo.huaweicloud.com/repository/npm/randomatic/-/randomatic-1.1.6.tgz#110dcabff397e9dcff7c0789ccc0a49adf1ec5bb" + dependencies: + is-number "^2.0.2" + kind-of "^3.0.2" + + randomatic@^3.0.0: + version "3.0.0" +- resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.0.0.tgz#d35490030eb4f7578de292ce6dfb04a91a128923" ++ resolved "https://repo.huaweicloud.com/repository/npm/randomatic/-/randomatic-3.0.0.tgz#d35490030eb4f7578de292ce6dfb04a91a128923" + dependencies: + is-number "^4.0.0" + kind-of "^6.0.0" +@@ -5130,17 +5130,17 @@ + + randombytes@^2.0.0, randombytes@^2.0.1: + version "2.0.5" +- resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.5.tgz#dc009a246b8d09a177b4b7a0ae77bc570f4b1b79" ++ resolved "https://repo.huaweicloud.com/repository/npm/randombytes/-/randombytes-2.0.5.tgz#dc009a246b8d09a177b4b7a0ae77bc570f4b1b79" + dependencies: + safe-buffer "^5.1.0" + + range-parser@^1.0.3, range-parser@^1.2.0, range-parser@~1.2.0: + version "1.2.0" +- resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" ++ resolved "https://repo.huaweicloud.com/repository/npm/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" + + raw-body@~2.2.0: + version "2.2.0" +- resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.2.0.tgz#994976cf6a5096a41162840492f0bdc5d6e7fb96" ++ resolved "https://repo.huaweicloud.com/repository/npm/raw-body/-/raw-body-2.2.0.tgz#994976cf6a5096a41162840492f0bdc5d6e7fb96" + dependencies: + bytes "2.4.0" + iconv-lite "0.4.15" +@@ -5148,11 +5148,11 @@ + + raw-loader@^0.5.1: + version "0.5.1" +- resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-0.5.1.tgz#0c3d0beaed8a01c966d9787bf778281252a979aa" ++ resolved "https://repo.huaweicloud.com/repository/npm/raw-loader/-/raw-loader-0.5.1.tgz#0c3d0beaed8a01c966d9787bf778281252a979aa" + + rc@^1.0.1, rc@^1.1.6, rc@^1.1.7: + version "1.2.1" +- resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.1.tgz#2e03e8e42ee450b8cb3dce65be1bf8974e1dfd95" ++ resolved "https://repo.huaweicloud.com/repository/npm/rc/-/rc-1.2.1.tgz#2e03e8e42ee450b8cb3dce65be1bf8974e1dfd95" + dependencies: + deep-extend "~0.4.0" + ini "~1.3.0" +@@ -5161,21 +5161,21 @@ + + read-pkg-up@^1.0.1: + version "1.0.1" +- resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" ++ resolved "https://repo.huaweicloud.com/repository/npm/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" + dependencies: + find-up "^1.0.0" + read-pkg "^1.0.0" + + read-pkg-up@^2.0.0: + version "2.0.0" +- resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" ++ resolved "https://repo.huaweicloud.com/repository/npm/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" + dependencies: + find-up "^2.0.0" + read-pkg "^2.0.0" + + read-pkg@^1.0.0: + version "1.1.0" +- resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" ++ resolved "https://repo.huaweicloud.com/repository/npm/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" + dependencies: + load-json-file "^1.0.0" + normalize-package-data "^2.3.2" +@@ -5183,7 +5183,7 @@ + + read-pkg@^2.0.0: + version "2.0.0" +- resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" ++ resolved "https://repo.huaweicloud.com/repository/npm/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" + dependencies: + load-json-file "^2.0.0" + normalize-package-data "^2.3.2" +@@ -5191,7 +5191,7 @@ + + readable-stream@1.0, readable-stream@~1.0.2: + version "1.0.34" +- resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" ++ resolved "https://repo.huaweicloud.com/repository/npm/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" +@@ -5200,7 +5200,7 @@ + + readable-stream@^2.0.1, readable-stream@^2.0.5, readable-stream@^2.2.2, readable-stream@^2.2.6, readable-stream@^2.2.9: + version "2.3.3" +- resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" ++ resolved "https://repo.huaweicloud.com/repository/npm/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" +@@ -5212,7 +5212,7 @@ + + readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.4: + version "2.2.9" +- resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.9.tgz#cf78ec6f4a6d1eb43d26488cac97f042e74b7fc8" ++ resolved "https://repo.huaweicloud.com/repository/npm/readable-stream/-/readable-stream-2.2.9.tgz#cf78ec6f4a6d1eb43d26488cac97f042e74b7fc8" + dependencies: + buffer-shims "~1.0.0" + core-util-is "~1.0.0" +@@ -5224,7 +5224,7 @@ + + readdirp@^2.0.0: + version "2.1.0" +- resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" ++ resolved "https://repo.huaweicloud.com/repository/npm/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" + dependencies: + graceful-fs "^4.1.2" + minimatch "^3.0.2" +@@ -5233,14 +5233,14 @@ + + redent@^1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" ++ resolved "https://repo.huaweicloud.com/repository/npm/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" + dependencies: + indent-string "^2.1.0" + strip-indent "^1.0.1" + + reduce-css-calc@^1.2.6: + version "1.3.0" +- resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz#747c914e049614a4c9cfbba629871ad1d2927716" ++ resolved "https://repo.huaweicloud.com/repository/npm/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz#747c914e049614a4c9cfbba629871ad1d2927716" + dependencies: + balanced-match "^0.4.2" + math-expression-evaluator "^1.2.14" +@@ -5248,36 +5248,36 @@ + + reduce-function-call@^1.0.1: + version "1.0.2" +- resolved "https://registry.yarnpkg.com/reduce-function-call/-/reduce-function-call-1.0.2.tgz#5a200bf92e0e37751752fe45b0ab330fd4b6be99" ++ resolved "https://repo.huaweicloud.com/repository/npm/reduce-function-call/-/reduce-function-call-1.0.2.tgz#5a200bf92e0e37751752fe45b0ab330fd4b6be99" + dependencies: + balanced-match "^0.4.2" + + reflect-metadata@^0.1.2: + version "0.1.10" +- resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.10.tgz#b4f83704416acad89988c9b15635d47e03b9344a" ++ resolved "https://repo.huaweicloud.com/repository/npm/reflect-metadata/-/reflect-metadata-0.1.10.tgz#b4f83704416acad89988c9b15635d47e03b9344a" + + regenerate@^1.2.1: + version "1.3.2" +- resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.2.tgz#d1941c67bad437e1be76433add5b385f95b19260" ++ resolved "https://repo.huaweicloud.com/repository/npm/regenerate/-/regenerate-1.3.2.tgz#d1941c67bad437e1be76433add5b385f95b19260" + + regenerator-runtime@^0.10.0: + version "0.10.5" +- resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" ++ resolved "https://repo.huaweicloud.com/repository/npm/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" + + regenerator-runtime@^0.11.0: + version "0.11.0" +- resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz#7e54fe5b5ccd5d6624ea6255c3473be090b802e1" ++ resolved "https://repo.huaweicloud.com/repository/npm/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz#7e54fe5b5ccd5d6624ea6255c3473be090b802e1" + + regex-cache@^0.4.2: + version "0.4.3" +- resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d7114145" ++ resolved "https://repo.huaweicloud.com/repository/npm/regex-cache/-/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d7114145" + dependencies: + is-equal-shallow "^0.1.3" + is-primitive "^2.0.0" + + regexpu-core@^1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-1.0.0.tgz#86a763f58ee4d7c2f6b102e4764050de7ed90c6b" ++ resolved "https://repo.huaweicloud.com/repository/npm/regexpu-core/-/regexpu-core-1.0.0.tgz#86a763f58ee4d7c2f6b102e4764050de7ed90c6b" + dependencies: + regenerate "^1.2.1" + regjsgen "^0.2.0" +@@ -5285,38 +5285,38 @@ + + registry-auth-token@^3.0.1: + version "3.3.1" +- resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.3.1.tgz#fb0d3289ee0d9ada2cbb52af5dfe66cb070d3006" ++ resolved "https://repo.huaweicloud.com/repository/npm/registry-auth-token/-/registry-auth-token-3.3.1.tgz#fb0d3289ee0d9ada2cbb52af5dfe66cb070d3006" + dependencies: + rc "^1.1.6" + safe-buffer "^5.0.1" + + registry-url@^3.0.3: + version "3.1.0" +- resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" ++ resolved "https://repo.huaweicloud.com/repository/npm/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" + dependencies: + rc "^1.0.1" + + regjsgen@^0.2.0: + version "0.2.0" +- resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" ++ resolved "https://repo.huaweicloud.com/repository/npm/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" + + regjsparser@^0.1.4: + version "0.1.5" +- resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" ++ resolved "https://repo.huaweicloud.com/repository/npm/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" + dependencies: + jsesc "~0.5.0" + + relateurl@0.2.x: + version "0.2.7" +- resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" ++ resolved "https://repo.huaweicloud.com/repository/npm/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" + + remove-trailing-separator@^1.0.1: + version "1.0.1" +- resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.0.1.tgz#615ebb96af559552d4bf4057c8436d486ab63cc4" ++ resolved "https://repo.huaweicloud.com/repository/npm/remove-trailing-separator/-/remove-trailing-separator-1.0.1.tgz#615ebb96af559552d4bf4057c8436d486ab63cc4" + + renderkid@^2.0.1: + version "2.0.1" +- resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.1.tgz#898cabfc8bede4b7b91135a3ffd323e58c0db319" ++ resolved "https://repo.huaweicloud.com/repository/npm/renderkid/-/renderkid-2.0.1.tgz#898cabfc8bede4b7b91135a3ffd323e58c0db319" + dependencies: + css-select "^1.1.0" + dom-converter "~0.1" +@@ -5326,31 +5326,31 @@ + + repeat-element@^1.1.2: + version "1.1.2" +- resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" ++ resolved "https://repo.huaweicloud.com/repository/npm/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" + + repeat-string@^0.2.2: + version "0.2.2" +- resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-0.2.2.tgz#c7a8d3236068362059a7e4651fc6884e8b1fb4ae" ++ resolved "https://repo.huaweicloud.com/repository/npm/repeat-string/-/repeat-string-0.2.2.tgz#c7a8d3236068362059a7e4651fc6884e8b1fb4ae" + + repeat-string@^1.5.2: + version "1.6.1" +- resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" ++ resolved "https://repo.huaweicloud.com/repository/npm/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + + repeating@^2.0.0: + version "2.0.1" +- resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" ++ resolved "https://repo.huaweicloud.com/repository/npm/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + dependencies: + is-finite "^1.0.0" + + request-progress@~2.0.1: + version "2.0.1" +- resolved "https://registry.yarnpkg.com/request-progress/-/request-progress-2.0.1.tgz#5d36bb57961c673aa5b788dbc8141fdf23b44e08" ++ resolved "https://repo.huaweicloud.com/repository/npm/request-progress/-/request-progress-2.0.1.tgz#5d36bb57961c673aa5b788dbc8141fdf23b44e08" + dependencies: + throttleit "^1.0.0" + + request@2, request@^2.72.0, request@^2.78.0, request@^2.79.0, request@^2.81.0, request@~2.81.0: + version "2.81.0" +- resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" ++ resolved "https://repo.huaweicloud.com/repository/npm/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" + dependencies: + aws-sign2 "~0.6.0" + aws4 "^1.2.1" +@@ -5377,76 +5377,76 @@ + + require-directory@^2.1.1: + version "2.1.1" +- resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" ++ resolved "https://repo.huaweicloud.com/repository/npm/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + + require-from-string@^1.1.0: + version "1.2.1" +- resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-1.2.1.tgz#529c9ccef27380adfec9a2f965b649bbee636418" ++ resolved "https://repo.huaweicloud.com/repository/npm/require-from-string/-/require-from-string-1.2.1.tgz#529c9ccef27380adfec9a2f965b649bbee636418" + + require-main-filename@^1.0.1: + version "1.0.1" +- resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" ++ resolved "https://repo.huaweicloud.com/repository/npm/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" + + requires-port@1.0.x, requires-port@1.x.x: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" ++ resolved "https://repo.huaweicloud.com/repository/npm/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + + resolve@^1.1.6, resolve@^1.1.7: + version "1.3.3" +- resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.3.3.tgz#655907c3469a8680dc2de3a275a8fdd69691f0e5" ++ resolved "https://repo.huaweicloud.com/repository/npm/resolve/-/resolve-1.3.3.tgz#655907c3469a8680dc2de3a275a8fdd69691f0e5" + dependencies: + path-parse "^1.0.5" + + right-align@^0.1.1: + version "0.1.3" +- resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" ++ resolved "https://repo.huaweicloud.com/repository/npm/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" + dependencies: + align-text "^0.1.1" + + rimraf@2, rimraf@^2.2.8, rimraf@^2.3.3, rimraf@^2.5.1, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.1: + version "2.6.1" +- resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d" ++ resolved "https://repo.huaweicloud.com/repository/npm/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d" + dependencies: + glob "^7.0.5" + + ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.1" +- resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.1.tgz#0f4584295c53a3628af7e6d79aca21ce57d1c6e7" ++ resolved "https://repo.huaweicloud.com/repository/npm/ripemd160/-/ripemd160-2.0.1.tgz#0f4584295c53a3628af7e6d79aca21ce57d1c6e7" + dependencies: + hash-base "^2.0.0" + inherits "^2.0.1" + + rsvp@~3.2.1: + version "3.2.1" +- resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.2.1.tgz#07cb4a5df25add9e826ebc67dcc9fd89db27d84a" ++ resolved "https://repo.huaweicloud.com/repository/npm/rsvp/-/rsvp-3.2.1.tgz#07cb4a5df25add9e826ebc67dcc9fd89db27d84a" + + rw@1: + version "1.3.3" +- resolved "https://registry.yarnpkg.com/rw/-/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4" ++ resolved "https://repo.huaweicloud.com/repository/npm/rw/-/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4" + + rxjs@^5.1.0: + version "5.4.0" +- resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.4.0.tgz#a7db14ab157f9d7aac6a56e655e7a3860d39bf26" ++ resolved "https://repo.huaweicloud.com/repository/npm/rxjs/-/rxjs-5.4.0.tgz#a7db14ab157f9d7aac6a56e655e7a3860d39bf26" + dependencies: + symbol-observable "^1.0.1" + + rxjs@^5.4.2, rxjs@^5.4.3: + version "5.4.3" +- resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.4.3.tgz#0758cddee6033d68e0fd53676f0f3596ce3d483f" ++ resolved "https://repo.huaweicloud.com/repository/npm/rxjs/-/rxjs-5.4.3.tgz#0758cddee6033d68e0fd53676f0f3596ce3d483f" + dependencies: + symbol-observable "^1.0.1" + + safe-buffer@5.1.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.1" +- resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" ++ resolved "https://repo.huaweicloud.com/repository/npm/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" + + safe-buffer@^5.0.1: + version "5.0.1" +- resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.0.1.tgz#d263ca54696cd8a306b5ca6551e92de57918fbe7" ++ resolved "https://repo.huaweicloud.com/repository/npm/safe-buffer/-/safe-buffer-5.0.1.tgz#d263ca54696cd8a306b5ca6551e92de57918fbe7" + + sass-graph@^2.1.1: + version "2.2.4" +- resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.4.tgz#13fbd63cd1caf0908b9fd93476ad43a51d1e0b49" ++ resolved "https://repo.huaweicloud.com/repository/npm/sass-graph/-/sass-graph-2.2.4.tgz#13fbd63cd1caf0908b9fd93476ad43a51d1e0b49" + dependencies: + glob "^7.0.0" + lodash "^4.0.0" +@@ -5455,7 +5455,7 @@ + + sass-loader@^6.0.3: + version "6.0.6" +- resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-6.0.6.tgz#e9d5e6c1f155faa32a4b26d7a9b7107c225e40f9" ++ resolved "https://repo.huaweicloud.com/repository/npm/sass-loader/-/sass-loader-6.0.6.tgz#e9d5e6c1f155faa32a4b26d7a9b7107c225e40f9" + dependencies: + async "^2.1.5" + clone-deep "^0.3.0" +@@ -5465,46 +5465,46 @@ + + saucelabs@~1.3.0: + version "1.3.0" +- resolved "https://registry.yarnpkg.com/saucelabs/-/saucelabs-1.3.0.tgz#d240e8009df7fa87306ec4578a69ba3b5c424fee" ++ resolved "https://repo.huaweicloud.com/repository/npm/saucelabs/-/saucelabs-1.3.0.tgz#d240e8009df7fa87306ec4578a69ba3b5c424fee" + dependencies: + https-proxy-agent "^1.0.0" + + sax@0.5.x: + version "0.5.8" +- resolved "https://registry.yarnpkg.com/sax/-/sax-0.5.8.tgz#d472db228eb331c2506b0e8c15524adb939d12c1" ++ resolved "https://repo.huaweicloud.com/repository/npm/sax/-/sax-0.5.8.tgz#d472db228eb331c2506b0e8c15524adb939d12c1" + + sax@0.6.x: + version "0.6.1" +- resolved "https://registry.yarnpkg.com/sax/-/sax-0.6.1.tgz#563b19c7c1de892e09bfc4f2fc30e3c27f0952b9" ++ resolved "https://repo.huaweicloud.com/repository/npm/sax/-/sax-0.6.1.tgz#563b19c7c1de892e09bfc4f2fc30e3c27f0952b9" + + sax@>=0.6.0: + version "1.2.2" +- resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.2.tgz#fd8631a23bc7826bef5d871bdb87378c95647828" ++ resolved "https://repo.huaweicloud.com/repository/npm/sax/-/sax-1.2.2.tgz#fd8631a23bc7826bef5d871bdb87378c95647828" + + sax@~1.2.1: + version "1.2.4" +- resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" ++ resolved "https://repo.huaweicloud.com/repository/npm/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + + schema-utils@^0.3.0: + version "0.3.0" +- resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.3.0.tgz#f5877222ce3e931edae039f17eb3716e7137f8cf" ++ resolved "https://repo.huaweicloud.com/repository/npm/schema-utils/-/schema-utils-0.3.0.tgz#f5877222ce3e931edae039f17eb3716e7137f8cf" + dependencies: + ajv "^5.0.0" + + scss-tokenizer@^0.2.3: + version "0.2.3" +- resolved "https://registry.yarnpkg.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz#8eb06db9a9723333824d3f5530641149847ce5d1" ++ resolved "https://repo.huaweicloud.com/repository/npm/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz#8eb06db9a9723333824d3f5530641149847ce5d1" + dependencies: + js-base64 "^2.1.8" + source-map "^0.4.2" + + select-hose@^2.0.0: + version "2.0.0" +- resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" ++ resolved "https://repo.huaweicloud.com/repository/npm/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" + + selenium-webdriver@3.0.1: + version "3.0.1" +- resolved "https://registry.yarnpkg.com/selenium-webdriver/-/selenium-webdriver-3.0.1.tgz#a2dea5da4a97f6672e89e7ca7276cefa365147a7" ++ resolved "https://repo.huaweicloud.com/repository/npm/selenium-webdriver/-/selenium-webdriver-3.0.1.tgz#a2dea5da4a97f6672e89e7ca7276cefa365147a7" + dependencies: + adm-zip "^0.4.7" + rimraf "^2.5.4" +@@ -5513,7 +5513,7 @@ + + selenium-webdriver@^2.53.2: + version "2.53.3" +- resolved "https://registry.yarnpkg.com/selenium-webdriver/-/selenium-webdriver-2.53.3.tgz#d29ff5a957dff1a1b49dc457756e4e4bfbdce085" ++ resolved "https://repo.huaweicloud.com/repository/npm/selenium-webdriver/-/selenium-webdriver-2.53.3.tgz#d29ff5a957dff1a1b49dc457756e4e4bfbdce085" + dependencies: + adm-zip "0.4.4" + rimraf "^2.2.8" +@@ -5523,41 +5523,41 @@ + + selfsigned@^1.9.1: + version "1.10.1" +- resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.1.tgz#bf8cb7b83256c4551e31347c6311778db99eec52" ++ resolved "https://repo.huaweicloud.com/repository/npm/selfsigned/-/selfsigned-1.10.1.tgz#bf8cb7b83256c4551e31347c6311778db99eec52" + dependencies: + node-forge "0.6.33" + + semver-diff@^2.0.0: + version "2.1.0" +- resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" ++ resolved "https://repo.huaweicloud.com/repository/npm/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" + dependencies: + semver "^5.0.3" + + semver-dsl@^1.0.1: + version "1.0.1" +- resolved "https://registry.yarnpkg.com/semver-dsl/-/semver-dsl-1.0.1.tgz#d3678de5555e8a61f629eed025366ae5f27340a0" ++ resolved "https://repo.huaweicloud.com/repository/npm/semver-dsl/-/semver-dsl-1.0.1.tgz#d3678de5555e8a61f629eed025366ae5f27340a0" + dependencies: + semver "^5.3.0" + + "semver@2 || 3 || 4 || 5": + version "5.4.1" +- resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" ++ resolved "https://repo.huaweicloud.com/repository/npm/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" + + semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@~5.3.0: + version "5.3.0" +- resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" ++ resolved "https://repo.huaweicloud.com/repository/npm/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" + + semver@~4.3.3: + version "4.3.6" +- resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" ++ resolved "https://repo.huaweicloud.com/repository/npm/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" + + semver@~5.0.1: + version "5.0.3" +- resolved "https://registry.yarnpkg.com/semver/-/semver-5.0.3.tgz#77466de589cd5d3c95f138aa78bc569a3cb5d27a" ++ resolved "https://repo.huaweicloud.com/repository/npm/semver/-/semver-5.0.3.tgz#77466de589cd5d3c95f138aa78bc569a3cb5d27a" + + send@0.15.4: + version "0.15.4" +- resolved "https://registry.yarnpkg.com/send/-/send-0.15.4.tgz#985faa3e284b0273c793364a35c6737bd93905b9" ++ resolved "https://repo.huaweicloud.com/repository/npm/send/-/send-0.15.4.tgz#985faa3e284b0273c793364a35c6737bd93905b9" + dependencies: + debug "2.6.8" + depd "~1.1.1" +@@ -5575,7 +5575,7 @@ + + serve-index@^1.7.2: + version "1.9.0" +- resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.0.tgz#d2b280fc560d616ee81b48bf0fa82abed2485ce7" ++ resolved "https://repo.huaweicloud.com/repository/npm/serve-index/-/serve-index-1.9.0.tgz#d2b280fc560d616ee81b48bf0fa82abed2485ce7" + dependencies: + accepts "~1.3.3" + batch "0.6.1" +@@ -5587,7 +5587,7 @@ + + serve-static@1.12.4: + version "1.12.4" +- resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.12.4.tgz#9b6aa98eeb7253c4eedc4c1f6fdbca609901a961" ++ resolved "https://repo.huaweicloud.com/repository/npm/serve-static/-/serve-static-1.12.4.tgz#9b6aa98eeb7253c4eedc4c1f6fdbca609901a961" + dependencies: + encodeurl "~1.0.1" + escape-html "~1.0.3" +@@ -5596,29 +5596,29 @@ + + set-blocking@^2.0.0, set-blocking@~2.0.0: + version "2.0.0" +- resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" ++ resolved "https://repo.huaweicloud.com/repository/npm/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + + set-immediate-shim@^1.0.1: + version "1.0.1" +- resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" ++ resolved "https://repo.huaweicloud.com/repository/npm/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" + + setimmediate@^1.0.4: + version "1.0.5" +- resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" ++ resolved "https://repo.huaweicloud.com/repository/npm/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + + setprototypeof@1.0.3: + version "1.0.3" +- resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04" ++ resolved "https://repo.huaweicloud.com/repository/npm/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04" + + sha.js@^2.4.0, sha.js@^2.4.8: + version "2.4.8" +- resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.8.tgz#37068c2c476b6baf402d14a49c67f597921f634f" ++ resolved "https://repo.huaweicloud.com/repository/npm/sha.js/-/sha.js-2.4.8.tgz#37068c2c476b6baf402d14a49c67f597921f634f" + dependencies: + inherits "^2.0.1" + + shallow-clone@^0.1.2: + version "0.1.2" +- resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-0.1.2.tgz#5909e874ba77106d73ac414cfec1ffca87d97060" ++ resolved "https://repo.huaweicloud.com/repository/npm/shallow-clone/-/shallow-clone-0.1.2.tgz#5909e874ba77106d73ac414cfec1ffca87d97060" + dependencies: + is-extendable "^0.1.1" + kind-of "^2.0.1" +@@ -5627,44 +5627,44 @@ + + shebang-command@^1.2.0: + version "1.2.0" +- resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" ++ resolved "https://repo.huaweicloud.com/repository/npm/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + dependencies: + shebang-regex "^1.0.0" + + shebang-regex@^1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" ++ resolved "https://repo.huaweicloud.com/repository/npm/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + + signal-exit@^3.0.0: + version "3.0.2" +- resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" ++ resolved "https://repo.huaweicloud.com/repository/npm/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + + silent-error@^1.0.0: + version "1.1.0" +- resolved "https://registry.yarnpkg.com/silent-error/-/silent-error-1.1.0.tgz#2209706f1c850a9f1d10d0d840918b46f26e1bc9" ++ resolved "https://repo.huaweicloud.com/repository/npm/silent-error/-/silent-error-1.1.0.tgz#2209706f1c850a9f1d10d0d840918b46f26e1bc9" + dependencies: + debug "^2.2.0" + + slide@^1.1.5: + version "1.1.6" +- resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" ++ resolved "https://repo.huaweicloud.com/repository/npm/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" + + sntp@1.x.x: + version "1.0.9" +- resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" ++ resolved "https://repo.huaweicloud.com/repository/npm/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" + dependencies: + hoek "2.x.x" + + socket.io-adapter@0.5.0: + version "0.5.0" +- resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-0.5.0.tgz#cb6d4bb8bec81e1078b99677f9ced0046066bb8b" ++ resolved "https://repo.huaweicloud.com/repository/npm/socket.io-adapter/-/socket.io-adapter-0.5.0.tgz#cb6d4bb8bec81e1078b99677f9ced0046066bb8b" + dependencies: + debug "2.3.3" + socket.io-parser "2.3.1" + + socket.io-client@1.7.2: + version "1.7.2" +- resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-1.7.2.tgz#39fdb0c3dd450e321b7e40cfd83612ec533dd644" ++ resolved "https://repo.huaweicloud.com/repository/npm/socket.io-client/-/socket.io-client-1.7.2.tgz#39fdb0c3dd450e321b7e40cfd83612ec533dd644" + dependencies: + backo2 "1.0.2" + component-bind "1.0.0" +@@ -5680,7 +5680,7 @@ + + socket.io-parser@2.3.1: + version "2.3.1" +- resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-2.3.1.tgz#dd532025103ce429697326befd64005fcfe5b4a0" ++ resolved "https://repo.huaweicloud.com/repository/npm/socket.io-parser/-/socket.io-parser-2.3.1.tgz#dd532025103ce429697326befd64005fcfe5b4a0" + dependencies: + component-emitter "1.1.2" + debug "2.2.0" +@@ -5689,7 +5689,7 @@ + + socket.io@1.7.2: + version "1.7.2" +- resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-1.7.2.tgz#83bbbdf2e79263b378900da403e7843e05dc3b71" ++ resolved "https://repo.huaweicloud.com/repository/npm/socket.io/-/socket.io-1.7.2.tgz#83bbbdf2e79263b378900da403e7843e05dc3b71" + dependencies: + debug "2.3.3" + engine.io "1.8.2" +@@ -5701,7 +5701,7 @@ + + sockjs-client@1.1.4: + version "1.1.4" +- resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.1.4.tgz#5babe386b775e4cf14e7520911452654016c8b12" ++ resolved "https://repo.huaweicloud.com/repository/npm/sockjs-client/-/sockjs-client-1.1.4.tgz#5babe386b775e4cf14e7520911452654016c8b12" + dependencies: + debug "^2.6.6" + eventsource "0.1.6" +@@ -5712,24 +5712,24 @@ + + sockjs@0.3.18: + version "0.3.18" +- resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.18.tgz#d9b289316ca7df77595ef299e075f0f937eb4207" ++ resolved "https://repo.huaweicloud.com/repository/npm/sockjs/-/sockjs-0.3.18.tgz#d9b289316ca7df77595ef299e075f0f937eb4207" + dependencies: + faye-websocket "^0.10.0" + uuid "^2.0.2" + + sort-keys@^1.0.0: + version "1.1.2" +- resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" ++ resolved "https://repo.huaweicloud.com/repository/npm/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" + dependencies: + is-plain-obj "^1.0.0" + + source-list-map@^2.0.0: + version "2.0.0" +- resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.0.tgz#aaa47403f7b245a92fbc97ea08f250d6087ed085" ++ resolved "https://repo.huaweicloud.com/repository/npm/source-list-map/-/source-list-map-2.0.0.tgz#aaa47403f7b245a92fbc97ea08f250d6087ed085" + + source-map-loader@^0.2.0: + version "0.2.1" +- resolved "https://registry.yarnpkg.com/source-map-loader/-/source-map-loader-0.2.1.tgz#48126be9230bd47fad05e46a8c3c2e3d2dabe507" ++ resolved "https://repo.huaweicloud.com/repository/npm/source-map-loader/-/source-map-loader-0.2.1.tgz#48126be9230bd47fad05e46a8c3c2e3d2dabe507" + dependencies: + async "^0.9.0" + loader-utils "~0.2.2" +@@ -5737,53 +5737,53 @@ + + source-map-support@^0.4.0, source-map-support@^0.4.2, source-map-support@~0.4.0: + version "0.4.15" +- resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.15.tgz#03202df65c06d2bd8c7ec2362a193056fef8d3b1" ++ resolved "https://repo.huaweicloud.com/repository/npm/source-map-support/-/source-map-support-0.4.15.tgz#03202df65c06d2bd8c7ec2362a193056fef8d3b1" + dependencies: + source-map "^0.5.6" + + source-map-support@^0.4.1: + version "0.4.17" +- resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.17.tgz#6f2150553e6375375d0ccb3180502b78c18ba430" ++ resolved "https://repo.huaweicloud.com/repository/npm/source-map-support/-/source-map-support-0.4.17.tgz#6f2150553e6375375d0ccb3180502b78c18ba430" + dependencies: + source-map "^0.5.6" + + source-map@0.1.x, source-map@~0.1.33, source-map@~0.1.7: + version "0.1.43" +- resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346" ++ resolved "https://repo.huaweicloud.com/repository/npm/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346" + dependencies: + amdefine ">=0.0.4" + + source-map@0.5.x, source-map@^0.5.7, source-map@~0.5.3: + version "0.5.7" +- resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" ++ resolved "https://repo.huaweicloud.com/repository/npm/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + + source-map@^0.4.2, source-map@^0.4.4: + version "0.4.4" +- resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" ++ resolved "https://repo.huaweicloud.com/repository/npm/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" + dependencies: + amdefine ">=0.0.4" + + source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.1: + version "0.5.6" +- resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" ++ resolved "https://repo.huaweicloud.com/repository/npm/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" + + spdx-correct@~1.0.0: + version "1.0.2" +- resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" ++ resolved "https://repo.huaweicloud.com/repository/npm/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" + dependencies: + spdx-license-ids "^1.0.2" + + spdx-expression-parse@~1.0.0: + version "1.0.4" +- resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c" ++ resolved "https://repo.huaweicloud.com/repository/npm/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c" + + spdx-license-ids@^1.0.2: + version "1.2.2" +- resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" ++ resolved "https://repo.huaweicloud.com/repository/npm/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" + + spdy-transport@^2.0.18: + version "2.0.20" +- resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-2.0.20.tgz#735e72054c486b2354fe89e702256004a39ace4d" ++ resolved "https://repo.huaweicloud.com/repository/npm/spdy-transport/-/spdy-transport-2.0.20.tgz#735e72054c486b2354fe89e702256004a39ace4d" + dependencies: + debug "^2.6.8" + detect-node "^2.0.3" +@@ -5795,7 +5795,7 @@ + + spdy@^3.4.1: + version "3.4.7" +- resolved "https://registry.yarnpkg.com/spdy/-/spdy-3.4.7.tgz#42ff41ece5cc0f99a3a6c28aabb73f5c3b03acbc" ++ resolved "https://repo.huaweicloud.com/repository/npm/spdy/-/spdy-3.4.7.tgz#42ff41ece5cc0f99a3a6c28aabb73f5c3b03acbc" + dependencies: + debug "^2.6.8" + handle-thing "^1.2.5" +@@ -5806,15 +5806,15 @@ + + sprintf-js@^1.0.3: + version "1.1.1" +- resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.1.tgz#36be78320afe5801f6cea3ee78b6e5aab940ea0c" ++ resolved "https://repo.huaweicloud.com/repository/npm/sprintf-js/-/sprintf-js-1.1.1.tgz#36be78320afe5801f6cea3ee78b6e5aab940ea0c" + + sprintf-js@~1.0.2: + version "1.0.3" +- resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" ++ resolved "https://repo.huaweicloud.com/repository/npm/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + + sshpk@^1.7.0: + version "1.13.0" +- resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.0.tgz#ff2a3e4fd04497555fed97b39a0fd82fafb3a33c" ++ resolved "https://repo.huaweicloud.com/repository/npm/sshpk/-/sshpk-1.13.0.tgz#ff2a3e4fd04497555fed97b39a0fd82fafb3a33c" + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" +@@ -5829,24 +5829,24 @@ + + "statuses@>= 1.3.1 < 2", statuses@~1.3.1: + version "1.3.1" +- resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" ++ resolved "https://repo.huaweicloud.com/repository/npm/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" + + stdout-stream@^1.4.0: + version "1.4.0" +- resolved "https://registry.yarnpkg.com/stdout-stream/-/stdout-stream-1.4.0.tgz#a2c7c8587e54d9427ea9edb3ac3f2cd522df378b" ++ resolved "https://repo.huaweicloud.com/repository/npm/stdout-stream/-/stdout-stream-1.4.0.tgz#a2c7c8587e54d9427ea9edb3ac3f2cd522df378b" + dependencies: + readable-stream "^2.0.1" + + stream-browserify@^2.0.1: + version "2.0.1" +- resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db" ++ resolved "https://repo.huaweicloud.com/repository/npm/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db" + dependencies: + inherits "~2.0.1" + readable-stream "^2.0.2" + + stream-http@^2.3.1: + version "2.7.2" +- resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.7.2.tgz#40a050ec8dc3b53b33d9909415c02c0bf1abfbad" ++ resolved "https://repo.huaweicloud.com/repository/npm/stream-http/-/stream-http-2.7.2.tgz#40a050ec8dc3b53b33d9909415c02c0bf1abfbad" + dependencies: + builtin-status-codes "^3.0.0" + inherits "^2.0.1" +@@ -5856,11 +5856,11 @@ + + strict-uri-encode@^1.0.0: + version "1.1.0" +- resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" ++ resolved "https://repo.huaweicloud.com/repository/npm/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" + + string-width@^1.0.1, string-width@^1.0.2: + version "1.0.2" +- resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" ++ resolved "https://repo.huaweicloud.com/repository/npm/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" +@@ -5868,70 +5868,70 @@ + + string-width@^2.0.0: + version "2.0.0" +- resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.0.0.tgz#635c5436cc72a6e0c387ceca278d4e2eec52687e" ++ resolved "https://repo.huaweicloud.com/repository/npm/string-width/-/string-width-2.0.0.tgz#635c5436cc72a6e0c387ceca278d4e2eec52687e" + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^3.0.0" + + string_decoder@^0.10.25, string_decoder@~0.10.x: + version "0.10.31" +- resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" ++ resolved "https://repo.huaweicloud.com/repository/npm/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + + string_decoder@~1.0.0: + version "1.0.1" +- resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.1.tgz#62e200f039955a6810d8df0a33ffc0f013662d98" ++ resolved "https://repo.huaweicloud.com/repository/npm/string_decoder/-/string_decoder-1.0.1.tgz#62e200f039955a6810d8df0a33ffc0f013662d98" + dependencies: + safe-buffer "^5.0.1" + + string_decoder@~1.0.3: + version "1.0.3" +- resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" ++ resolved "https://repo.huaweicloud.com/repository/npm/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" + dependencies: + safe-buffer "~5.1.0" + + stringstream@~0.0.4: + version "0.0.5" +- resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" ++ resolved "https://repo.huaweicloud.com/repository/npm/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" + + strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" +- resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" ++ resolved "https://repo.huaweicloud.com/repository/npm/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + dependencies: + ansi-regex "^2.0.0" + + strip-bom@^2.0.0: + version "2.0.0" +- resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" ++ resolved "https://repo.huaweicloud.com/repository/npm/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" + dependencies: + is-utf8 "^0.2.0" + + strip-bom@^3.0.0: + version "3.0.0" +- resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" ++ resolved "https://repo.huaweicloud.com/repository/npm/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + + strip-eof@^1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" ++ resolved "https://repo.huaweicloud.com/repository/npm/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + + strip-indent@^1.0.1: + version "1.0.1" +- resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" ++ resolved "https://repo.huaweicloud.com/repository/npm/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" + dependencies: + get-stdin "^4.0.1" + + strip-json-comments@^2.0.0, strip-json-comments@~2.0.1: + version "2.0.1" +- resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" ++ resolved "https://repo.huaweicloud.com/repository/npm/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + + style-loader@^0.13.1: + version "0.13.2" +- resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.13.2.tgz#74533384cf698c7104c7951150b49717adc2f3bb" ++ resolved "https://repo.huaweicloud.com/repository/npm/style-loader/-/style-loader-0.13.2.tgz#74533384cf698c7104c7951150b49717adc2f3bb" + dependencies: + loader-utils "^1.0.2" + + stylus-loader@^3.0.1: + version "3.0.1" +- resolved "https://registry.yarnpkg.com/stylus-loader/-/stylus-loader-3.0.1.tgz#77f4b34fd030d25b2617bcf5513db5b0730c4089" ++ resolved "https://repo.huaweicloud.com/repository/npm/stylus-loader/-/stylus-loader-3.0.1.tgz#77f4b34fd030d25b2617bcf5513db5b0730c4089" + dependencies: + loader-utils "^1.0.2" + lodash.clonedeep "^4.5.0" +@@ -5939,7 +5939,7 @@ + + stylus@^0.54.5: + version "0.54.5" +- resolved "https://registry.yarnpkg.com/stylus/-/stylus-0.54.5.tgz#42b9560931ca7090ce8515a798ba9e6aa3d6dc79" ++ resolved "https://repo.huaweicloud.com/repository/npm/stylus/-/stylus-0.54.5.tgz#42b9560931ca7090ce8515a798ba9e6aa3d6dc79" + dependencies: + css-parse "1.7.x" + debug "*" +@@ -5950,23 +5950,23 @@ + + supports-color@^2.0.0: + version "2.0.0" +- resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" ++ resolved "https://repo.huaweicloud.com/repository/npm/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + + supports-color@^3.1.1, supports-color@^3.1.2, supports-color@^3.2.3: + version "3.2.3" +- resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" ++ resolved "https://repo.huaweicloud.com/repository/npm/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" + dependencies: + has-flag "^1.0.0" + + supports-color@^4.0.0, supports-color@^4.2.1, supports-color@^4.4.0: + version "4.4.0" +- resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.4.0.tgz#883f7ddabc165142b2a61427f3352ded195d1a3e" ++ resolved "https://repo.huaweicloud.com/repository/npm/supports-color/-/supports-color-4.4.0.tgz#883f7ddabc165142b2a61427f3352ded195d1a3e" + dependencies: + has-flag "^2.0.0" + + svgo@^0.7.0: + version "0.7.2" +- resolved "https://registry.yarnpkg.com/svgo/-/svgo-0.7.2.tgz#9f5772413952135c6fefbf40afe6a4faa88b4bb5" ++ resolved "https://repo.huaweicloud.com/repository/npm/svgo/-/svgo-0.7.2.tgz#9f5772413952135c6fefbf40afe6a4faa88b4bb5" + dependencies: + coa "~1.0.1" + colors "~1.1.2" +@@ -5978,15 +5978,15 @@ + + symbol-observable@^1.0.1: + version "1.0.4" +- resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.4.tgz#29bf615d4aa7121bdd898b22d4b3f9bc4e2aa03d" ++ resolved "https://repo.huaweicloud.com/repository/npm/symbol-observable/-/symbol-observable-1.0.4.tgz#29bf615d4aa7121bdd898b22d4b3f9bc4e2aa03d" + + tapable@^0.2.7: + version "0.2.8" +- resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.8.tgz#99372a5c999bf2df160afc0d74bed4f47948cd22" ++ resolved "https://repo.huaweicloud.com/repository/npm/tapable/-/tapable-0.2.8.tgz#99372a5c999bf2df160afc0d74bed4f47948cd22" + + tar-pack@^3.4.0: + version "3.4.0" +- resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.0.tgz#23be2d7f671a8339376cbdb0b8fe3fdebf317984" ++ resolved "https://repo.huaweicloud.com/repository/npm/tar-pack/-/tar-pack-3.4.0.tgz#23be2d7f671a8339376cbdb0b8fe3fdebf317984" + dependencies: + debug "^2.2.0" + fstream "^1.0.10" +@@ -5999,7 +5999,7 @@ + + tar@^2.0.0, tar@^2.2.1: + version "2.2.1" +- resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" ++ resolved "https://repo.huaweicloud.com/repository/npm/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" + dependencies: + block-stream "*" + fstream "^1.0.2" +@@ -6007,85 +6007,85 @@ + + term-size@^0.1.0: + version "0.1.1" +- resolved "https://registry.yarnpkg.com/term-size/-/term-size-0.1.1.tgz#87360b96396cab5760963714cda0d0cbeecad9ca" ++ resolved "https://repo.huaweicloud.com/repository/npm/term-size/-/term-size-0.1.1.tgz#87360b96396cab5760963714cda0d0cbeecad9ca" + dependencies: + execa "^0.4.0" + + throttleit@^1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.0.tgz#9e785836daf46743145a5984b6268d828528ac6c" ++ resolved "https://repo.huaweicloud.com/repository/npm/throttleit/-/throttleit-1.0.0.tgz#9e785836daf46743145a5984b6268d828528ac6c" + + through@X.X.X: + version "2.3.8" +- resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" ++ resolved "https://repo.huaweicloud.com/repository/npm/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + + thunky@^0.1.0: + version "0.1.0" +- resolved "https://registry.yarnpkg.com/thunky/-/thunky-0.1.0.tgz#bf30146824e2b6e67b0f2d7a4ac8beb26908684e" ++ resolved "https://repo.huaweicloud.com/repository/npm/thunky/-/thunky-0.1.0.tgz#bf30146824e2b6e67b0f2d7a4ac8beb26908684e" + + time-stamp@^2.0.0: + version "2.0.0" +- resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-2.0.0.tgz#95c6a44530e15ba8d6f4a3ecb8c3a3fac46da357" ++ resolved "https://repo.huaweicloud.com/repository/npm/time-stamp/-/time-stamp-2.0.0.tgz#95c6a44530e15ba8d6f4a3ecb8c3a3fac46da357" + + timed-out@^4.0.0: + version "4.0.1" +- resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" ++ resolved "https://repo.huaweicloud.com/repository/npm/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" + + timers-browserify@^2.0.2: + version "2.0.4" +- resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.4.tgz#96ca53f4b794a5e7c0e1bd7cc88a372298fa01e6" ++ resolved "https://repo.huaweicloud.com/repository/npm/timers-browserify/-/timers-browserify-2.0.4.tgz#96ca53f4b794a5e7c0e1bd7cc88a372298fa01e6" + dependencies: + setimmediate "^1.0.4" + + tmp@0.0.24: + version "0.0.24" +- resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.24.tgz#d6a5e198d14a9835cc6f2d7c3d9e302428c8cf12" ++ resolved "https://repo.huaweicloud.com/repository/npm/tmp/-/tmp-0.0.24.tgz#d6a5e198d14a9835cc6f2d7c3d9e302428c8cf12" + + tmp@0.0.28, tmp@0.0.x: + version "0.0.28" +- resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.28.tgz#172735b7f614ea7af39664fa84cf0de4e515d120" ++ resolved "https://repo.huaweicloud.com/repository/npm/tmp/-/tmp-0.0.28.tgz#172735b7f614ea7af39664fa84cf0de4e515d120" + dependencies: + os-tmpdir "~1.0.1" + + tmp@0.0.30: + version "0.0.30" +- resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.30.tgz#72419d4a8be7d6ce75148fd8b324e593a711c2ed" ++ resolved "https://repo.huaweicloud.com/repository/npm/tmp/-/tmp-0.0.30.tgz#72419d4a8be7d6ce75148fd8b324e593a711c2ed" + dependencies: + os-tmpdir "~1.0.1" + + to-array@0.1.4: + version "0.1.4" +- resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890" ++ resolved "https://repo.huaweicloud.com/repository/npm/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890" + + to-arraybuffer@^1.0.0: + version "1.0.1" +- resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" ++ resolved "https://repo.huaweicloud.com/repository/npm/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" + + to-fast-properties@^1.0.1: + version "1.0.3" +- resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" ++ resolved "https://repo.huaweicloud.com/repository/npm/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" + + toposort@^1.0.0: + version "1.0.3" +- resolved "https://registry.yarnpkg.com/toposort/-/toposort-1.0.3.tgz#f02cd8a74bd8be2fc0e98611c3bacb95a171869c" ++ resolved "https://repo.huaweicloud.com/repository/npm/toposort/-/toposort-1.0.3.tgz#f02cd8a74bd8be2fc0e98611c3bacb95a171869c" + + tough-cookie@~2.3.0: + version "2.3.2" +- resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a" ++ resolved "https://repo.huaweicloud.com/repository/npm/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a" + dependencies: + punycode "^1.4.1" + + trim-newlines@^1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" ++ resolved "https://repo.huaweicloud.com/repository/npm/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" + + trim-right@^1.0.1: + version "1.0.1" +- resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" ++ resolved "https://repo.huaweicloud.com/repository/npm/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + + ts-node@~2.0.0: + version "2.0.0" +- resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-2.0.0.tgz#16e4fecc949088238b4cbf1c39c9582526b66f74" ++ resolved "https://repo.huaweicloud.com/repository/npm/ts-node/-/ts-node-2.0.0.tgz#16e4fecc949088238b4cbf1c39c9582526b66f74" + dependencies: + arrify "^1.0.0" + chalk "^1.1.1" +@@ -6102,7 +6102,7 @@ + + tsconfig@^5.0.2: + version "5.0.3" +- resolved "https://registry.yarnpkg.com/tsconfig/-/tsconfig-5.0.3.tgz#5f4278e701800967a8fc383fd19648878f2a6e3a" ++ resolved "https://repo.huaweicloud.com/repository/npm/tsconfig/-/tsconfig-5.0.3.tgz#5f4278e701800967a8fc383fd19648878f2a6e3a" + dependencies: + any-promise "^1.3.0" + parse-json "^2.2.0" +@@ -6111,7 +6111,7 @@ + + tsickle@^0.21.0: + version "0.21.6" +- resolved "https://registry.yarnpkg.com/tsickle/-/tsickle-0.21.6.tgz#53b01b979c5c13fdb13afb3fb958177e5991588d" ++ resolved "https://repo.huaweicloud.com/repository/npm/tsickle/-/tsickle-0.21.6.tgz#53b01b979c5c13fdb13afb3fb958177e5991588d" + dependencies: + minimist "^1.2.0" + mkdirp "^0.5.1" +@@ -6120,11 +6120,11 @@ + + tslib@^1.7.1: + version "1.7.1" +- resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.7.1.tgz#bc8004164691923a79fe8378bbeb3da2017538ec" ++ resolved "https://repo.huaweicloud.com/repository/npm/tslib/-/tslib-1.7.1.tgz#bc8004164691923a79fe8378bbeb3da2017538ec" + + tslint@~4.5.0: + version "4.5.1" +- resolved "https://registry.yarnpkg.com/tslint/-/tslint-4.5.1.tgz#05356871bef23a434906734006fc188336ba824b" ++ resolved "https://repo.huaweicloud.com/repository/npm/tslint/-/tslint-4.5.1.tgz#05356871bef23a434906734006fc188336ba824b" + dependencies: + babel-code-frame "^6.20.0" + colors "^1.1.2" +@@ -6138,51 +6138,51 @@ + + tsutils@^1.1.0: + version "1.9.1" +- resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-1.9.1.tgz#b9f9ab44e55af9681831d5f28d0aeeaf5c750cb0" ++ resolved "https://repo.huaweicloud.com/repository/npm/tsutils/-/tsutils-1.9.1.tgz#b9f9ab44e55af9681831d5f28d0aeeaf5c750cb0" + + tty-browserify@0.0.0: + version "0.0.0" +- resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" ++ resolved "https://repo.huaweicloud.com/repository/npm/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" + + tunnel-agent@^0.6.0: + version "0.6.0" +- resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" ++ resolved "https://repo.huaweicloud.com/repository/npm/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + dependencies: + safe-buffer "^5.0.1" + + tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" +- resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" ++ resolved "https://repo.huaweicloud.com/repository/npm/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + + type-is@~1.6.15: + version "1.6.15" +- resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.15.tgz#cab10fb4909e441c82842eafe1ad646c81804410" ++ resolved "https://repo.huaweicloud.com/repository/npm/type-is/-/type-is-1.6.15.tgz#cab10fb4909e441c82842eafe1ad646c81804410" + dependencies: + media-typer "0.3.0" + mime-types "~2.1.15" + + typedarray@^0.0.6: + version "0.0.6" +- resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" ++ resolved "https://repo.huaweicloud.com/repository/npm/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + + "typescript@>=2.0.0 <2.6.0", typescript@^2.3.3: + version "2.5.2" +- resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.5.2.tgz#038a95f7d9bbb420b1bf35ba31d4c5c1dd3ffe34" ++ resolved "https://repo.huaweicloud.com/repository/npm/typescript/-/typescript-2.5.2.tgz#038a95f7d9bbb420b1bf35ba31d4c5c1dd3ffe34" + + typescript@~2.5.0: + version "2.5.3" +- resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.5.3.tgz#df3dcdc38f3beb800d4bc322646b04a3f6ca7f0d" ++ resolved "https://repo.huaweicloud.com/repository/npm/typescript/-/typescript-2.5.3.tgz#df3dcdc38f3beb800d4bc322646b04a3f6ca7f0d" + + uglify-js@3.0.x: + version "3.0.28" +- resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.0.28.tgz#96b8495f0272944787b5843a1679aa326640d5f7" ++ resolved "https://repo.huaweicloud.com/repository/npm/uglify-js/-/uglify-js-3.0.28.tgz#96b8495f0272944787b5843a1679aa326640d5f7" + dependencies: + commander "~2.11.0" + source-map "~0.5.1" + + uglify-js@^2.6: + version "2.8.27" +- resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.27.tgz#47787f912b0f242e5b984343be8e35e95f694c9c" ++ resolved "https://repo.huaweicloud.com/repository/npm/uglify-js/-/uglify-js-2.8.27.tgz#47787f912b0f242e5b984343be8e35e95f694c9c" + dependencies: + source-map "~0.5.1" + yargs "~3.10.0" +@@ -6191,7 +6191,7 @@ + + uglify-js@^2.8.29: + version "2.8.29" +- resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" ++ resolved "https://repo.huaweicloud.com/repository/npm/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" + dependencies: + source-map "~0.5.1" + yargs "~3.10.0" +@@ -6200,7 +6200,7 @@ + + uglify-js@~2.3: + version "2.3.6" +- resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.3.6.tgz#fa0984770b428b7a9b2a8058f46355d14fef211a" ++ resolved "https://repo.huaweicloud.com/repository/npm/uglify-js/-/uglify-js-2.3.6.tgz#fa0984770b428b7a9b2a8058f46355d14fef211a" + dependencies: + async "~0.2.6" + optimist "~0.3.5" +@@ -6208,11 +6208,11 @@ + + uglify-to-browserify@~1.0.0: + version "1.0.2" +- resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" ++ resolved "https://repo.huaweicloud.com/repository/npm/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" + + uglifyjs-webpack-plugin@^0.4.6: + version "0.4.6" +- resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz#b951f4abb6bd617e66f63eb891498e391763e309" ++ resolved "https://repo.huaweicloud.com/repository/npm/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz#b951f4abb6bd617e66f63eb891498e391763e309" + dependencies: + source-map "^0.5.6" + uglify-js "^2.8.29" +@@ -6220,47 +6220,47 @@ + + uid-number@^0.0.6: + version "0.0.6" +- resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" ++ resolved "https://repo.huaweicloud.com/repository/npm/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" + + ultron@1.0.x: + version "1.0.2" +- resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.0.2.tgz#ace116ab557cd197386a4e88f4685378c8b2e4fa" ++ resolved "https://repo.huaweicloud.com/repository/npm/ultron/-/ultron-1.0.2.tgz#ace116ab557cd197386a4e88f4685378c8b2e4fa" + + uniq@^1.0.1: + version "1.0.1" +- resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" ++ resolved "https://repo.huaweicloud.com/repository/npm/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" + + uniqid@^4.0.0: + version "4.1.1" +- resolved "https://registry.yarnpkg.com/uniqid/-/uniqid-4.1.1.tgz#89220ddf6b751ae52b5f72484863528596bb84c1" ++ resolved "https://repo.huaweicloud.com/repository/npm/uniqid/-/uniqid-4.1.1.tgz#89220ddf6b751ae52b5f72484863528596bb84c1" + dependencies: + macaddress "^0.2.8" + + uniqs@^2.0.0: + version "2.0.0" +- resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" ++ resolved "https://repo.huaweicloud.com/repository/npm/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" + + unique-string@^1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" ++ resolved "https://repo.huaweicloud.com/repository/npm/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" + dependencies: + crypto-random-string "^1.0.0" + + universalify@^0.1.0: + version "0.1.1" +- resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.1.tgz#fa71badd4437af4c148841e3b3b165f9e9e590b7" ++ resolved "https://repo.huaweicloud.com/repository/npm/universalify/-/universalify-0.1.1.tgz#fa71badd4437af4c148841e3b3b165f9e9e590b7" + + unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" ++ resolved "https://repo.huaweicloud.com/repository/npm/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + + unzip-response@^2.0.1: + version "2.0.1" +- resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" ++ resolved "https://repo.huaweicloud.com/repository/npm/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" + + update-notifier@^2.0.0: + version "2.1.0" +- resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.1.0.tgz#ec0c1e53536b76647a24b77cb83966d9315123d9" ++ resolved "https://repo.huaweicloud.com/repository/npm/update-notifier/-/update-notifier-2.1.0.tgz#ec0c1e53536b76647a24b77cb83966d9315123d9" + dependencies: + boxen "^1.0.0" + chalk "^1.0.0" +@@ -6273,127 +6273,127 @@ + + upper-case@^1.1.1: + version "1.1.3" +- resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598" ++ resolved "https://repo.huaweicloud.com/repository/npm/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598" + + url-loader@^0.5.7: + version "0.5.9" +- resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-0.5.9.tgz#cc8fea82c7b906e7777019250869e569e995c295" ++ resolved "https://repo.huaweicloud.com/repository/npm/url-loader/-/url-loader-0.5.9.tgz#cc8fea82c7b906e7777019250869e569e995c295" + dependencies: + loader-utils "^1.0.2" + mime "1.3.x" + + url-parse-lax@^1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" ++ resolved "https://repo.huaweicloud.com/repository/npm/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" + dependencies: + prepend-http "^1.0.1" + + url-parse@1.0.x: + version "1.0.5" +- resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.0.5.tgz#0854860422afdcfefeb6c965c662d4800169927b" ++ resolved "https://repo.huaweicloud.com/repository/npm/url-parse/-/url-parse-1.0.5.tgz#0854860422afdcfefeb6c965c662d4800169927b" + dependencies: + querystringify "0.0.x" + requires-port "1.0.x" + + url-parse@^1.1.8: + version "1.1.9" +- resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.1.9.tgz#c67f1d775d51f0a18911dd7b3ffad27bb9e5bd19" ++ resolved "https://repo.huaweicloud.com/repository/npm/url-parse/-/url-parse-1.1.9.tgz#c67f1d775d51f0a18911dd7b3ffad27bb9e5bd19" + dependencies: + querystringify "~1.0.0" + requires-port "1.0.x" + + url@^0.11.0: + version "0.11.0" +- resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" ++ resolved "https://repo.huaweicloud.com/repository/npm/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + dependencies: + punycode "1.3.2" + querystring "0.2.0" + + user-home@^1.1.1: + version "1.1.1" +- resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" ++ resolved "https://repo.huaweicloud.com/repository/npm/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" + + useragent@^2.1.10: + version "2.1.13" +- resolved "https://registry.yarnpkg.com/useragent/-/useragent-2.1.13.tgz#bba43e8aa24d5ceb83c2937473e102e21df74c10" ++ resolved "https://repo.huaweicloud.com/repository/npm/useragent/-/useragent-2.1.13.tgz#bba43e8aa24d5ceb83c2937473e102e21df74c10" + dependencies: + lru-cache "2.2.x" + tmp "0.0.x" + + util-deprecate@~1.0.1: + version "1.0.2" +- resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" ++ resolved "https://repo.huaweicloud.com/repository/npm/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + + util@0.10.3, util@^0.10.3: + version "0.10.3" +- resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" ++ resolved "https://repo.huaweicloud.com/repository/npm/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + dependencies: + inherits "2.0.1" + + utila@~0.3: + version "0.3.3" +- resolved "https://registry.yarnpkg.com/utila/-/utila-0.3.3.tgz#d7e8e7d7e309107092b05f8d9688824d633a4226" ++ resolved "https://repo.huaweicloud.com/repository/npm/utila/-/utila-0.3.3.tgz#d7e8e7d7e309107092b05f8d9688824d633a4226" + + utila@~0.4: + version "0.4.0" +- resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" ++ resolved "https://repo.huaweicloud.com/repository/npm/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" + + utils-merge@1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.0.tgz#0294fb922bb9375153541c4f7096231f287c8af8" ++ resolved "https://repo.huaweicloud.com/repository/npm/utils-merge/-/utils-merge-1.0.0.tgz#0294fb922bb9375153541c4f7096231f287c8af8" + + uuid@^2.0.2: + version "2.0.3" +- resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a" ++ resolved "https://repo.huaweicloud.com/repository/npm/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a" + + uuid@^3.0.0: + version "3.0.1" +- resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.1.tgz#6544bba2dfda8c1cf17e629a3a305e2bb1fee6c1" ++ resolved "https://repo.huaweicloud.com/repository/npm/uuid/-/uuid-3.0.1.tgz#6544bba2dfda8c1cf17e629a3a305e2bb1fee6c1" + + v8flags@^2.0.11: + version "2.1.1" +- resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4" ++ resolved "https://repo.huaweicloud.com/repository/npm/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4" + dependencies: + user-home "^1.1.1" + + validate-npm-package-license@^3.0.1: + version "3.0.1" +- resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" ++ resolved "https://repo.huaweicloud.com/repository/npm/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" + dependencies: + spdx-correct "~1.0.0" + spdx-expression-parse "~1.0.0" + + vary@~1.1.1: + version "1.1.1" +- resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.1.tgz#67535ebb694c1d52257457984665323f587e8d37" ++ resolved "https://repo.huaweicloud.com/repository/npm/vary/-/vary-1.1.1.tgz#67535ebb694c1d52257457984665323f587e8d37" + + vendors@^1.0.0: + version "1.0.1" +- resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.1.tgz#37ad73c8ee417fb3d580e785312307d274847f22" ++ resolved "https://repo.huaweicloud.com/repository/npm/vendors/-/vendors-1.0.1.tgz#37ad73c8ee417fb3d580e785312307d274847f22" + + verror@1.3.6: + version "1.3.6" +- resolved "https://registry.yarnpkg.com/verror/-/verror-1.3.6.tgz#cff5df12946d297d2baaefaa2689e25be01c005c" ++ resolved "https://repo.huaweicloud.com/repository/npm/verror/-/verror-1.3.6.tgz#cff5df12946d297d2baaefaa2689e25be01c005c" + dependencies: + extsprintf "1.0.2" + + vlq@^0.2.1: + version "0.2.2" +- resolved "https://registry.yarnpkg.com/vlq/-/vlq-0.2.2.tgz#e316d5257b40b86bb43cb8d5fea5d7f54d6b0ca1" ++ resolved "https://repo.huaweicloud.com/repository/npm/vlq/-/vlq-0.2.2.tgz#e316d5257b40b86bb43cb8d5fea5d7f54d6b0ca1" + + vm-browserify@0.0.4: + version "0.0.4" +- resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73" ++ resolved "https://repo.huaweicloud.com/repository/npm/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73" + dependencies: + indexof "0.0.1" + + void-elements@^2.0.0: + version "2.0.1" +- resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec" ++ resolved "https://repo.huaweicloud.com/repository/npm/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec" + + watchpack@^1.4.0: + version "1.4.0" +- resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.4.0.tgz#4a1472bcbb952bd0a9bb4036801f954dfb39faac" ++ resolved "https://repo.huaweicloud.com/repository/npm/watchpack/-/watchpack-1.4.0.tgz#4a1472bcbb952bd0a9bb4036801f954dfb39faac" + dependencies: + async "^2.1.2" + chokidar "^1.7.0" +@@ -6401,20 +6401,20 @@ + + wbuf@^1.1.0, wbuf@^1.7.2: + version "1.7.2" +- resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.2.tgz#d697b99f1f59512df2751be42769c1580b5801fe" ++ resolved "https://repo.huaweicloud.com/repository/npm/wbuf/-/wbuf-1.7.2.tgz#d697b99f1f59512df2751be42769c1580b5801fe" + dependencies: + minimalistic-assert "^1.0.0" + + webdriver-js-extender@^1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/webdriver-js-extender/-/webdriver-js-extender-1.0.0.tgz#81c533a9e33d5bfb597b4e63e2cdb25b54777515" ++ resolved "https://repo.huaweicloud.com/repository/npm/webdriver-js-extender/-/webdriver-js-extender-1.0.0.tgz#81c533a9e33d5bfb597b4e63e2cdb25b54777515" + dependencies: + "@types/selenium-webdriver" "^2.53.35" + selenium-webdriver "^2.53.2" + + webdriver-manager@^12.0.6: + version "12.0.6" +- resolved "https://registry.yarnpkg.com/webdriver-manager/-/webdriver-manager-12.0.6.tgz#3df1a481977010b4cbf8c9d85c7a577828c0e70b" ++ resolved "https://repo.huaweicloud.com/repository/npm/webdriver-manager/-/webdriver-manager-12.0.6.tgz#3df1a481977010b4cbf8c9d85c7a577828c0e70b" + dependencies: + adm-zip "^0.4.7" + chalk "^1.1.1" +@@ -6430,14 +6430,14 @@ + + webpack-concat-plugin@1.4.0: + version "1.4.0" +- resolved "https://registry.yarnpkg.com/webpack-concat-plugin/-/webpack-concat-plugin-1.4.0.tgz#a6eb3f0082d03c79d8ee2f1518c7f48e44ee12c5" ++ resolved "https://repo.huaweicloud.com/repository/npm/webpack-concat-plugin/-/webpack-concat-plugin-1.4.0.tgz#a6eb3f0082d03c79d8ee2f1518c7f48e44ee12c5" + dependencies: + md5 "^2.2.1" + uglify-js "^2.8.29" + + webpack-dev-middleware@^1.11.0, webpack-dev-middleware@~1.12.0: + version "1.12.0" +- resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-1.12.0.tgz#d34efefb2edda7e1d3b5dbe07289513219651709" ++ resolved "https://repo.huaweicloud.com/repository/npm/webpack-dev-middleware/-/webpack-dev-middleware-1.12.0.tgz#d34efefb2edda7e1d3b5dbe07289513219651709" + dependencies: + memory-fs "~0.4.1" + mime "^1.3.4" +@@ -6447,7 +6447,7 @@ + + webpack-dev-server@~2.7.1: + version "2.7.1" +- resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-2.7.1.tgz#21580f5a08cd065c71144cf6f61c345bca59a8b8" ++ resolved "https://repo.huaweicloud.com/repository/npm/webpack-dev-server/-/webpack-dev-server-2.7.1.tgz#21580f5a08cd065c71144cf6f61c345bca59a8b8" + dependencies: + ansi-html "0.0.7" + bonjour "^3.5.0" +@@ -6475,7 +6475,7 @@ + + webpack-dev-server@~2.9.0: + version "2.9.1" +- resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-2.9.1.tgz#7ac9320b61b00eb65b2109f15c82747fc5b93585" ++ resolved "https://repo.huaweicloud.com/repository/npm/webpack-dev-server/-/webpack-dev-server-2.9.1.tgz#7ac9320b61b00eb65b2109f15c82747fc5b93585" + dependencies: + ansi-html "0.0.7" + array-includes "^3.0.3" +@@ -6504,20 +6504,20 @@ + + webpack-merge@^4.1.0: + version "4.1.0" +- resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-4.1.0.tgz#6ad72223b3e0b837e531e4597c199f909361511e" ++ resolved "https://repo.huaweicloud.com/repository/npm/webpack-merge/-/webpack-merge-4.1.0.tgz#6ad72223b3e0b837e531e4597c199f909361511e" + dependencies: + lodash "^4.17.4" + + webpack-sources@^1.0.1: + version "1.0.1" +- resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.0.1.tgz#c7356436a4d13123be2e2426a05d1dad9cbe65cf" ++ resolved "https://repo.huaweicloud.com/repository/npm/webpack-sources/-/webpack-sources-1.0.1.tgz#c7356436a4d13123be2e2426a05d1dad9cbe65cf" + dependencies: + source-list-map "^2.0.0" + source-map "~0.5.3" + + webpack@~3.5.5: + version "3.5.6" +- resolved "https://registry.yarnpkg.com/webpack/-/webpack-3.5.6.tgz#a492fb6c1ed7f573816f90e00c8fbb5a20cc5c36" ++ resolved "https://repo.huaweicloud.com/repository/npm/webpack/-/webpack-3.5.6.tgz#a492fb6c1ed7f573816f90e00c8fbb5a20cc5c36" + dependencies: + acorn "^5.0.0" + acorn-dynamic-import "^2.0.0" +@@ -6544,7 +6544,7 @@ + + webpack@~3.6.0: + version "3.6.0" +- resolved "https://registry.yarnpkg.com/webpack/-/webpack-3.6.0.tgz#a89a929fbee205d35a4fa2cc487be9cbec8898bc" ++ resolved "https://repo.huaweicloud.com/repository/npm/webpack/-/webpack-3.6.0.tgz#a89a929fbee205d35a4fa2cc487be9cbec8898bc" + dependencies: + acorn "^5.0.0" + acorn-dynamic-import "^2.0.0" +@@ -6571,80 +6571,80 @@ + + websocket-driver@>=0.5.1: + version "0.6.5" +- resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.6.5.tgz#5cb2556ceb85f4373c6d8238aa691c8454e13a36" ++ resolved "https://repo.huaweicloud.com/repository/npm/websocket-driver/-/websocket-driver-0.6.5.tgz#5cb2556ceb85f4373c6d8238aa691c8454e13a36" + dependencies: + websocket-extensions ">=0.1.1" + + websocket-extensions@>=0.1.1: + version "0.1.1" +- resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.1.tgz#76899499c184b6ef754377c2dbb0cd6cb55d29e7" ++ resolved "https://repo.huaweicloud.com/repository/npm/websocket-extensions/-/websocket-extensions-0.1.1.tgz#76899499c184b6ef754377c2dbb0cd6cb55d29e7" + + when@~3.6.x: + version "3.6.4" +- resolved "https://registry.yarnpkg.com/when/-/when-3.6.4.tgz#473b517ec159e2b85005497a13983f095412e34e" ++ resolved "https://repo.huaweicloud.com/repository/npm/when/-/when-3.6.4.tgz#473b517ec159e2b85005497a13983f095412e34e" + + whet.extend@~0.9.9: + version "0.9.9" +- resolved "https://registry.yarnpkg.com/whet.extend/-/whet.extend-0.9.9.tgz#f877d5bf648c97e5aa542fadc16d6a259b9c11a1" ++ resolved "https://repo.huaweicloud.com/repository/npm/whet.extend/-/whet.extend-0.9.9.tgz#f877d5bf648c97e5aa542fadc16d6a259b9c11a1" + + which-module@^1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" ++ resolved "https://repo.huaweicloud.com/repository/npm/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" + + which-module@^2.0.0: + version "2.0.0" +- resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" ++ resolved "https://repo.huaweicloud.com/repository/npm/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + + which@1, which@^1.2.9: + version "1.3.0" +- resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" ++ resolved "https://repo.huaweicloud.com/repository/npm/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" + dependencies: + isexe "^2.0.0" + + which@^1.2.8, which@~1.2.10: + version "1.2.14" +- resolved "https://registry.yarnpkg.com/which/-/which-1.2.14.tgz#9a87c4378f03e827cecaf1acdf56c736c01c14e5" ++ resolved "https://repo.huaweicloud.com/repository/npm/which/-/which-1.2.14.tgz#9a87c4378f03e827cecaf1acdf56c736c01c14e5" + dependencies: + isexe "^2.0.0" + + wide-align@^1.1.0: + version "1.1.2" +- resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710" ++ resolved "https://repo.huaweicloud.com/repository/npm/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710" + dependencies: + string-width "^1.0.2" + + widest-line@^1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-1.0.0.tgz#0c09c85c2a94683d0d7eaf8ee097d564bf0e105c" ++ resolved "https://repo.huaweicloud.com/repository/npm/widest-line/-/widest-line-1.0.0.tgz#0c09c85c2a94683d0d7eaf8ee097d564bf0e105c" + dependencies: + string-width "^1.0.1" + + window-size@0.1.0: + version "0.1.0" +- resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" ++ resolved "https://repo.huaweicloud.com/repository/npm/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" + + wordwrap@0.0.2: + version "0.0.2" +- resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" ++ resolved "https://repo.huaweicloud.com/repository/npm/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" + + wordwrap@~0.0.2: + version "0.0.3" +- resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" ++ resolved "https://repo.huaweicloud.com/repository/npm/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" + + wrap-ansi@^2.0.0: + version "2.1.0" +- resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" ++ resolved "https://repo.huaweicloud.com/repository/npm/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + + wrappy@1: + version "1.0.2" +- resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" ++ resolved "https://repo.huaweicloud.com/repository/npm/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + + write-file-atomic@^2.0.0: + version "2.1.0" +- resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.1.0.tgz#1769f4b551eedce419f0505deae2e26763542d37" ++ resolved "https://repo.huaweicloud.com/repository/npm/write-file-atomic/-/write-file-atomic-2.1.0.tgz#1769f4b551eedce419f0505deae2e26763542d37" + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" +@@ -6652,88 +6652,88 @@ + + ws@1.1.1, ws@^1.0.1: + version "1.1.1" +- resolved "https://registry.yarnpkg.com/ws/-/ws-1.1.1.tgz#082ddb6c641e85d4bb451f03d52f06eabdb1f018" ++ resolved "https://repo.huaweicloud.com/repository/npm/ws/-/ws-1.1.1.tgz#082ddb6c641e85d4bb451f03d52f06eabdb1f018" + dependencies: + options ">=0.0.5" + ultron "1.0.x" + + wtf-8@1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/wtf-8/-/wtf-8-1.0.0.tgz#392d8ba2d0f1c34d1ee2d630f15d0efb68e1048a" ++ resolved "https://repo.huaweicloud.com/repository/npm/wtf-8/-/wtf-8-1.0.0.tgz#392d8ba2d0f1c34d1ee2d630f15d0efb68e1048a" + + xdg-basedir@^3.0.0: + version "3.0.0" +- resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" ++ resolved "https://repo.huaweicloud.com/repository/npm/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" + + xml-char-classes@^1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/xml-char-classes/-/xml-char-classes-1.0.0.tgz#64657848a20ffc5df583a42ad8a277b4512bbc4d" ++ resolved "https://repo.huaweicloud.com/repository/npm/xml-char-classes/-/xml-char-classes-1.0.0.tgz#64657848a20ffc5df583a42ad8a277b4512bbc4d" + + xml2js@0.4.4: + version "0.4.4" +- resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.4.tgz#3111010003008ae19240eba17497b57c729c555d" ++ resolved "https://repo.huaweicloud.com/repository/npm/xml2js/-/xml2js-0.4.4.tgz#3111010003008ae19240eba17497b57c729c555d" + dependencies: + sax "0.6.x" + xmlbuilder ">=1.0.0" + + xml2js@^0.4.17: + version "0.4.17" +- resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.17.tgz#17be93eaae3f3b779359c795b419705a8817e868" ++ resolved "https://repo.huaweicloud.com/repository/npm/xml2js/-/xml2js-0.4.17.tgz#17be93eaae3f3b779359c795b419705a8817e868" + dependencies: + sax ">=0.6.0" + xmlbuilder "^4.1.0" + + xmlbuilder@>=1.0.0, xmlbuilder@^4.1.0: + version "4.2.1" +- resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-4.2.1.tgz#aa58a3041a066f90eaa16c2f5389ff19f3f461a5" ++ resolved "https://repo.huaweicloud.com/repository/npm/xmlbuilder/-/xmlbuilder-4.2.1.tgz#aa58a3041a066f90eaa16c2f5389ff19f3f461a5" + dependencies: + lodash "^4.0.0" + + xmldom@^0.1.19: + version "0.1.27" +- resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.27.tgz#d501f97b3bdb403af8ef9ecc20573187aadac0e9" ++ resolved "https://repo.huaweicloud.com/repository/npm/xmldom/-/xmldom-0.1.27.tgz#d501f97b3bdb403af8ef9ecc20573187aadac0e9" + + xmlhttprequest-ssl@1.5.3: + version "1.5.3" +- resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz#185a888c04eca46c3e4070d99f7b49de3528992d" ++ resolved "https://repo.huaweicloud.com/repository/npm/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz#185a888c04eca46c3e4070d99f7b49de3528992d" + + xmlhttprequest@1: + version "1.8.0" +- resolved "https://registry.yarnpkg.com/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz#67fe075c5c24fef39f9d65f5f7b7fe75171968fc" ++ resolved "https://repo.huaweicloud.com/repository/npm/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz#67fe075c5c24fef39f9d65f5f7b7fe75171968fc" + + xtend@^4.0.0: + version "4.0.1" +- resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" ++ resolved "https://repo.huaweicloud.com/repository/npm/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" + + y18n@^3.2.1: + version "3.2.1" +- resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" ++ resolved "https://repo.huaweicloud.com/repository/npm/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" + + yallist@^2.0.0, yallist@^2.1.2: + version "2.1.2" +- resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" ++ resolved "https://repo.huaweicloud.com/repository/npm/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + + yargs-parser@^4.2.0: + version "4.2.1" +- resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-4.2.1.tgz#29cceac0dc4f03c6c87b4a9f217dd18c9f74871c" ++ resolved "https://repo.huaweicloud.com/repository/npm/yargs-parser/-/yargs-parser-4.2.1.tgz#29cceac0dc4f03c6c87b4a9f217dd18c9f74871c" + dependencies: + camelcase "^3.0.0" + + yargs-parser@^5.0.0: + version "5.0.0" +- resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a" ++ resolved "https://repo.huaweicloud.com/repository/npm/yargs-parser/-/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a" + dependencies: + camelcase "^3.0.0" + + yargs-parser@^7.0.0: + version "7.0.0" +- resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9" ++ resolved "https://repo.huaweicloud.com/repository/npm/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9" + dependencies: + camelcase "^4.1.0" + + yargs@^6.0.0, yargs@^6.6.0: + version "6.6.0" +- resolved "https://registry.yarnpkg.com/yargs/-/yargs-6.6.0.tgz#782ec21ef403345f830a808ca3d513af56065208" ++ resolved "https://repo.huaweicloud.com/repository/npm/yargs/-/yargs-6.6.0.tgz#782ec21ef403345f830a808ca3d513af56065208" + dependencies: + camelcase "^3.0.0" + cliui "^3.2.0" +@@ -6751,7 +6751,7 @@ + + yargs@^7.0.0: + version "7.1.0" +- resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8" ++ resolved "https://repo.huaweicloud.com/repository/npm/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8" + dependencies: + camelcase "^3.0.0" + cliui "^3.2.0" +@@ -6769,7 +6769,7 @@ + + yargs@^8.0.2: + version "8.0.2" +- resolved "https://registry.yarnpkg.com/yargs/-/yargs-8.0.2.tgz#6299a9055b1cefc969ff7e79c1d918dceb22c360" ++ resolved "https://repo.huaweicloud.com/repository/npm/yargs/-/yargs-8.0.2.tgz#6299a9055b1cefc969ff7e79c1d918dceb22c360" + dependencies: + camelcase "^4.1.0" + cliui "^3.2.0" +@@ -6787,7 +6787,7 @@ + + yargs@~3.10.0: + version "3.10.0" +- resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" ++ resolved "https://repo.huaweicloud.com/repository/npm/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" + dependencies: + camelcase "^1.0.2" + cliui "^2.1.0" +@@ -6796,24 +6796,24 @@ + + yauzl@2.4.1: + version "2.4.1" +- resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.4.1.tgz#9528f442dab1b2284e58b4379bb194e22e0c4005" ++ resolved "https://repo.huaweicloud.com/repository/npm/yauzl/-/yauzl-2.4.1.tgz#9528f442dab1b2284e58b4379bb194e22e0c4005" + dependencies: + fd-slicer "~1.0.1" + + yeast@0.1.2: + version "0.1.2" +- resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419" ++ resolved "https://repo.huaweicloud.com/repository/npm/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419" + + yn@^1.2.0: + version "1.3.0" +- resolved "https://registry.yarnpkg.com/yn/-/yn-1.3.0.tgz#1b0812abb8d805d48966f8df385dc9dacc9a19d8" ++ resolved "https://repo.huaweicloud.com/repository/npm/yn/-/yn-1.3.0.tgz#1b0812abb8d805d48966f8df385dc9dacc9a19d8" + dependencies: + object-assign "^4.1.1" + + zone.js@^0.8.14: + version "0.8.17" +- resolved "https://registry.yarnpkg.com/zone.js/-/zone.js-0.8.17.tgz#4c5e5185a857da8da793daf3919371c5a36b2a0b" ++ resolved "https://repo.huaweicloud.com/repository/npm/zone.js/-/zone.js-0.8.17.tgz#4c5e5185a857da8da793daf3919371c5a36b2a0b" + + zone.js@^0.8.4: + version "0.8.18" +- resolved "https://registry.yarnpkg.com/zone.js/-/zone.js-0.8.18.tgz#8cecb3977fcd1b3090562ff4570e2847e752b48d" ++ resolved "https://repo.huaweicloud.com/repository/npm/zone.js/-/zone.js-0.8.18.tgz#8cecb3977fcd1b3090562ff4570e2847e752b48d" +diff -Naur ambari-release-2.7.6-origin/ambari-logsearch/docker/.gitignore apache-ambari-2.7.6-change/ambari-logsearch/docker/.gitignore +--- ambari-release-2.7.6-origin/ambari-logsearch/docker/.gitignore 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-logsearch/docker/.gitignore 1970-01-01 08:00:00.000000000 +0800 +@@ -1,2 +0,0 @@ +-Profile +-.env +diff -Naur ambari-release-2.7.6-origin/ambari-logsearch/.gitignore apache-ambari-2.7.6-change/ambari-logsearch/.gitignore +--- ambari-release-2.7.6-origin/ambari-logsearch/.gitignore 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-logsearch/.gitignore 1970-01-01 08:00:00.000000000 +0800 +@@ -1,10 +0,0 @@ +-target +-.settings +-.classpath +-.project +-/bin/ +-node_modules/ +-logs/ +-node/ +-*.pid +- +diff -Naur ambari-release-2.7.6-origin/ambari-logsearch/pom.xml apache-ambari-2.7.6-change/ambari-logsearch/pom.xml +--- ambari-release-2.7.6-origin/ambari-logsearch/pom.xml 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-logsearch/pom.xml 2022-07-11 10:25:33.000000000 +0800 +@@ -47,7 +47,7 @@ + 7.7.3 + 3.0.0 + 2.5 +- 3.4.6.2.3.0.0-2557 ++ 3.4.6 + 4 + false + -Xmx1024m -Xms512m +diff -Naur ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-grafana/pom.xml apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-grafana/pom.xml +--- ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-grafana/pom.xml 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-grafana/pom.xml 2022-07-10 20:40:54.000000000 +0800 +@@ -114,7 +114,7 @@ + + + +diff -Naur ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/amhm_service.py apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/amhm_service.py +--- ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/amhm_service.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/amhm_service.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +@@ -23,13 +23,13 @@ + import sys + + from ambari_commons.ambari_service import AmbariService +-from ambari_commons.exceptions import FatalException, NonFatalException ++from ambari_commons.exceptions import FatalException as NonFatalException + from ambari_commons.logging_utils import print_warning_msg, print_error_msg + from ambari_commons.os_windows import SvcStatusCallback +-from core.config_reader import SERVICE_USERNAME_KEY, SERVICE_PASSWORD_KEY, \ ++from .core.config_reader import SERVICE_USERNAME_KEY, SERVICE_PASSWORD_KEY, \ + SETUP_ACTION, START_ACTION, STOP_ACTION, RESTART_ACTION, STATUS_ACTION +-from core.stop_handler import bind_signal_handlers, StopHandler +-from main import server_process_main, main_config ++from .core.stop_handler import bind_signal_handlers, StopHandler ++from .main import server_process_main, main_config + + + # +@@ -117,7 +117,7 @@ + options.exit_message = None + + statusStr = AMHostMonitoringService.QueryStatus() +- print "Ambari Metrics Collector is " + statusStr ++ print("Ambari Metrics Collector is " + statusStr) + + + def init_options_parser(): +@@ -141,7 +141,7 @@ + sys.frozen = 'windows_exe' # Fake py2exe so we can debug + + if len(args) == 0: +- print parser.print_help() ++ print(parser.print_help()) + parser.error("No action entered") + + action = args[0] +@@ -169,7 +169,7 @@ + pass + except FatalException as e: + if e.reason is not None: +- print_error_msg("Exiting with exit code {0}. \nREASON: {1}".format(e.code, e.reason)) ++ print_error_msg("Exiting with exit code {}. \nREASON: {}".format(e.code, e.reason)) + sys.exit(e.code) + except NonFatalException as e: + options.exit_message = "Ambari Metrics Host Monitoring '%s' completed with warnings." % action +@@ -177,7 +177,7 @@ + print_warning_msg(e.reason) + + if options.exit_message is not None: +- print options.exit_message ++ print(options.exit_message) + + sys.exit(0) + +diff -Naur ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/core/aggregator.py apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/core/aggregator.py +--- ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/core/aggregator.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/core/aggregator.py 2022-07-11 00:52:30.000000000 +0800 +@@ -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 threading + import subprocess + import logging +-import urllib2 ++import urllib.request, urllib.error, urllib.parse + + logger = logging.getLogger() + class Aggregator(threading.Thread): +@@ -40,14 +40,14 @@ + config_dir = self._config.get_config_dir() + class_name = "org.apache.hadoop.metrics2.host.aggregator.AggregatorApplication" + ams_log_file = "ambari-metrics-aggregator.log" +- additional_classpath = ':{0}'.format(config_dir) ++ additional_classpath = ':{}'.format(config_dir) + ams_log_dir = self._config.ams_monitor_log_dir() + hostname = self._config.get_hostname_config() + logger.info('Starting Aggregator thread.') +- cmd = "{0}/bin/java {1} -Dams.log.dir={2} -Dams.log.file={3} -cp /var/lib/ambari-metrics-monitor/lib/*{4} {5} {6} {7}"\ ++ cmd = "{}/bin/java {} -Dams.log.dir={} -Dams.log.file={} -cp /var/lib/ambari-metrics-monitor/lib/*{} {} {} {}"\ + .format(java_home, jvm_agrs, ams_log_dir, ams_log_file, additional_classpath, class_name, hostname, collector_hosts) + +- logger.info("Executing : {0}".format(cmd)) ++ logger.info("Executing : {}".format(cmd)) + + self._aggregator_process = subprocess.Popen([cmd], stdout = None, stderr = None, shell = True) + while not self.stopped: +@@ -82,11 +82,11 @@ + if 0 == self._stop_handler.wait(self.SLEEP_TIME): + break + try: +- conn = urllib2.urlopen(self.URL, timeout=self.CONNECTION_TIMEOUT) ++ conn = urllib.request.urlopen(self.URL, timeout=self.CONNECTION_TIMEOUT) + self.set_is_ok(True) + except (KeyboardInterrupt, SystemExit): + raise +- except Exception, e: ++ except Exception as e: + self.set_is_ok(False) + continue + if conn.code != 200: +diff -Naur ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/core/application_metric_map.py apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/core/application_metric_map.py +--- ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/core/application_metric_map.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/core/application_metric_map.py 2022-07-11 00:52:30.000000000 +0800 +@@ -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 put_metric(self, application_id, metric_id_to_value_map, timestamp): + with self.lock: +- for metric_name, value in metric_id_to_value_map.iteritems(): ++ for metric_name, value in metric_id_to_value_map.items(): + + metric_map = self.app_metric_map.get(application_id) + if not metric_map: +@@ -79,16 +79,16 @@ + local_metric_map = {} + + if application_id: +- if self.app_metric_map.has_key(application_id): ++ if application_id in self.app_metric_map: + local_metric_map = { application_id : self.app_metric_map[application_id] } + else: +- logger.info("application_id: {0}, not present in the map.".format(application_id)) ++ logger.info("application_id: {}, not present in the map.".format(application_id)) + else: + local_metric_map = self.app_metric_map.copy() + pass + +- for appId, metrics in local_metric_map.iteritems(): +- for metricId, metricData in dict(metrics).iteritems(): ++ for appId, metrics in local_metric_map.items(): ++ for metricId, metricData in dict(metrics).items(): + # Create a timeline metric object + result_instanceid = "" + if set_instanceid: +@@ -115,14 +115,14 @@ + + def get_start_time(self, app_id, metric_id): + with self.lock: +- if self.cached_metric_map.has_key(app_id): +- if self.cached_metric_map.get(app_id).has_key(metric_id): ++ if app_id in self.cached_metric_map: ++ if metric_id in self.cached_metric_map.get(app_id): + metrics = self.cached_metric_map.get(app_id).get(metric_id) +- return min(metrics.iterkeys()) +- if self.app_metric_map.has_key(app_id): +- if self.app_metric_map.get(app_id).has_key(metric_id): ++ return min(metrics.keys()) ++ if app_id in self.app_metric_map: ++ if metric_id in self.app_metric_map.get(app_id): + metrics = self.app_metric_map.get(app_id).get(metric_id) +- return min(metrics.iterkeys()) ++ return min(metrics.keys()) + pass + + def format_app_id(self, app_id, instance_id = None): +@@ -163,11 +163,11 @@ + # check if needs to be cached + # in case there can't be any more datapoints in last minute just post the metrics, + # otherwise need to cut off and cache the last uncompleted minute +- max_time = max(metricData.iterkeys()) ++ max_time = max(metricData.keys()) + if max_time % 60000 <= 60000 - 10000: + max_minute = max_time / 60000 + metric_data_copy = metricData.copy() +- for time,value in metric_data_copy.iteritems(): ++ for time,value in metric_data_copy.items(): + if time / 60000 == max_minute: + cached_metric_map = self.cached_metric_map.get(appId) + if not cached_metric_map: +diff -Naur ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/core/blacklisted_set.py apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/core/blacklisted_set.py +--- ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/core/blacklisted_set.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/core/blacklisted_set.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +@@ -62,12 +62,12 @@ + hosts = [1, 2, 3, 4] + bs = BlacklistedSet(hosts) + bs.blacklist(4) +- print bs ++ print(bs) + for a in bs: +- print a ++ print(a) + time.sleep(2) + + bs.blacklist(1) + bs.blacklist(5) + for a in bs: +- print a ++ print(a) +diff -Naur ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/core/config_reader.py apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/core/config_reader.py +--- ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/core/config_reader.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/core/config_reader.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +@@ -18,8 +18,8 @@ + limitations under the License. + ''' + +-import ConfigParser +-import StringIO ++import configparser ++import io + import json + import os + from ambari_commons import OSConst +@@ -76,7 +76,7 @@ + + configDefaults = ConfigDefaults() + +-config = ConfigParser.RawConfigParser() ++config = configparser.RawConfigParser() + + CONFIG_DIR = configDefaults.get_config_dir() + CONFIG_FILE_PATH = configDefaults.get_config_file_path() +@@ -169,17 +169,17 @@ + + def __init__(self): + global config_content +- self.config = ConfigParser.RawConfigParser() ++ self.config = configparser.RawConfigParser() + if os.path.exists(CONFIG_FILE_PATH): + self.config.read(CONFIG_FILE_PATH) + else: +- self.config.readfp(StringIO.StringIO(config_content)) ++ self.config.readfp(io.StringIO(config_content)) + pass + if os.path.exists(METRIC_FILE_PATH): + with open(METRIC_FILE_PATH, 'r') as f: + self.metric_groups = json.load(f) + else: +- print 'No metric configs found at {0}'.format(METRIC_FILE_PATH) ++ print('No metric configs found at {}'.format(METRIC_FILE_PATH)) + self.metric_groups = \ + { + 'host_metric_groups': [], +@@ -188,7 +188,7 @@ + pass + self._ca_cert_file_path = CA_CERTS_FILE_PATH + self.hostname_script = None +- 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) +diff -Naur ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/core/controller.py apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/core/controller.py +--- ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/core/controller.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/core/controller.py 2022-07-11 00:52:30.000000000 +0800 +@@ -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 logging + import threading +-from Queue import Queue ++from queue import Queue + from threading import Timer +-from application_metric_map import ApplicationMetricMap +-from event_definition import HostMetricCollectEvent, ProcessMetricCollectEvent +-from metric_collector import MetricsCollector +-from emitter import Emitter +-from host_info import HostInfo +-from aggregator import Aggregator +-from aggregator import AggregatorWatchdog ++from .application_metric_map import ApplicationMetricMap ++from .event_definition import HostMetricCollectEvent, ProcessMetricCollectEvent ++from .metric_collector import MetricsCollector ++from .emitter import Emitter ++from .host_info import HostInfo ++from .aggregator import Aggregator ++from .aggregator import AggregatorWatchdog + + + logger = logging.getLogger() +@@ -107,15 +107,15 @@ + try: + host_metrics_groups = self.metrics_config['host_metric_groups'] + process_metrics_groups = self.metrics_config['process_metric_groups'] +- except KeyError, ke: ++ except KeyError as ke: + logger.warn('Error loading metric groups.') + raise ke + pass + + if host_metrics_groups: +- for name, properties in host_metrics_groups.iteritems(): ++ for name, properties in host_metrics_groups.items(): + event = HostMetricCollectEvent(properties, name) +- logger.info('Adding event to cache, {0} : {1}'.format(name, properties)) ++ logger.info('Adding event to cache, {} : {}'.format(name, properties)) + self.events_cache.append(event) + pass + pass +diff -Naur ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/core/emitter.py apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/core/emitter.py +--- ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/core/emitter.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/core/emitter.py 2022-07-11 00:52:30.000000000 +0800 +@@ -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 threading + +-from security import CachedHTTPSConnection, CachedHTTPConnection +-from blacklisted_set import BlacklistedSet +-from config_reader import ROUND_ROBIN_FAILOVER_STRATEGY +-from spnego_kerberos_auth import SPNEGOKerberosAuth ++from .security import CachedHTTPSConnection, CachedHTTPConnection ++from .blacklisted_set import BlacklistedSet ++from .config_reader import ROUND_ROBIN_FAILOVER_STRATEGY ++from .spnego_kerberos_auth import SPNEGOKerberosAuth + + logger = logging.getLogger() + +@@ -73,14 +73,14 @@ + if config.get_failover_strategy() == ROUND_ROBIN_FAILOVER_STRATEGY: + self.active_collector_hosts = BlacklistedSet(self.all_metrics_collector_hosts, float(config.get_failover_strategy_blacklisted_interval_seconds())) + else: +- raise Exception(-1, "Uknown failover strategy {0}".format(config.get_failover_strategy())) ++ raise Exception(-1, "Uknown failover strategy {}".format(config.get_failover_strategy())) + + def run(self): + logger.info('Running Emitter thread: %s' % threading.currentThread().getName()) + while True: + try: + self.submit_metrics() +- except Exception, e: ++ except Exception as e: + logger.warn('Unable to emit events. %s' % str(e)) + self.cookie_cached = {} + pass +@@ -129,7 +129,7 @@ + if self.cookie_cached[connection.host]: + headers["Cookie"] = self.cookie_cached[connection.host] + logger.debug("Cookie: %s" % self.cookie_cached[connection.host]) +- except Exception, e: ++ except Exception as e: + self.cookie_cached = {} + pass + +@@ -149,11 +149,11 @@ + if self.spnego_krb_auth.get_negotiate_value(auth_header) == '': + response = self.spnego_krb_auth.authenticate_handshake(connection, "POST", self.AMS_METRICS_POST_URL, data, headers, self.kinit_cmd, self.klist_cmd) + if response: +- logger.debug("response from authenticate_client: retcode = {0}, reason = {1}" ++ logger.debug("response from authenticate_client: retcode = {}, reason = {}" + .format(response.status, response.reason)) + logger.debug(str(response.read())) + if response.status == 200: +- logger.debug("response headers: {0}".format(response.getheaders())) ++ logger.debug("response headers: {}".format(response.getheaders())) + logger.debug("cookie_cached: %s" % self.cookie_cached) + set_cookie_header = response.getheader('set-cookie', None) + if set_cookie_header and self.spnego_krb_auth: +@@ -163,7 +163,7 @@ + self.cookie_cached[connection.host] = set_cookie_val + return True + #No response or failed +- logger.warn("Retrying after {0} ...".format(self.RETRY_SLEEP_INTERVAL)) ++ logger.warn("Retrying after {} ...".format(self.RETRY_SLEEP_INTERVAL)) + retry_count += 1 + #Wait for the service stop event instead of sleeping blindly + if 0 == self._stop_handler.wait(self.RETRY_SLEEP_INTERVAL): +@@ -172,7 +172,7 @@ + + if retry_count >= self.MAX_RETRY_COUNT: + self.active_collector_hosts.blacklist(collector_host) +- logger.warn("Metric collector host {0} was blacklisted.".format(collector_host)) ++ logger.warn("Metric collector host {} was blacklisted.".format(collector_host)) + return False + + def get_connection(self, protocol, host, port): +@@ -193,11 +193,11 @@ + connection.request("POST", self.AMS_METRICS_POST_URL, data, headers) + response = connection.getresponse() + if response: +- logger.debug("POST response from server: retcode = {0}, reason = {1}" ++ logger.debug("POST response from server: retcode = {}, reason = {}" + .format(response.status, response.reason)) + logger.debug(str(response.read())) + return response +- except Exception, e: ++ except Exception as e: + logger.warn('Error sending metrics to server. %s' % str(e)) + self.cookie_cached = {} + return None +@@ -213,7 +213,7 @@ + def compute_hash(self, hostname): + hash = 11987 + length = len(hostname) +- for i in xrange(0, length - 1): ++ for i in range(0, length - 1): + hash = 31*hash + ord(hostname[i]) + return hash + +diff -Naur ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/core/event_definition.py apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/core/event_definition.py +--- ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/core/event_definition.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/core/event_definition.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +@@ -54,8 +54,8 @@ + try: + self.group_interval = group_config['collect_every'] + self.metrics = group_config['metrics'] +- except KeyError, ex: +- logger.warn('Unable to create event from metric group. {0}'.format( ++ except KeyError as ex: ++ logger.warn('Unable to create event from metric group. {}'.format( + group_config)) + raise ex + +@@ -66,7 +66,7 @@ + try: + metric_value_thresholds[metric['name']] = metric['value_threshold'] + except: +- logger.warn('Error parsing metric configuration. {0}'.format(metric)) ++ logger.warn('Error parsing metric configuration. {}'.format(metric)) + pass + + return metric_value_thresholds +diff -Naur ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/core/host_info.py apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/core/host_info.py +--- ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/core/host_info.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/core/host_info.py 2022-07-11 00:52:30.000000000 +0800 +@@ -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 @@ + 'cpu_intr': cpu_times.irq if hasattr(cpu_times, 'irq') else 0, + 'cpu_sintr': cpu_times.softirq if hasattr(cpu_times, 'softirq') else 0, + 'cpu_steal': cpu_times.steal if hasattr(cpu_times, 'steal') else 0, +- 'boottime': long(boot_time) if boot_time else 0 ++ 'boottime': int(boot_time) if boot_time else 0 + } + if platform.system() != "Windows": + load_avg = os.getloadavg() +@@ -157,7 +157,7 @@ + skip_virtual_interfaces = self.get_virtual_network_interfaces() if self.__config.get_virtual_interfaces_skip() == 'True' else [] + skip_network_patterns = self.__config.get_network_interfaces_skip_pattern() + skip_network_patterns_list = skip_network_patterns.split(',') if skip_network_patterns and skip_network_patterns != 'None' else [] +- for interface, values in net_stats.iteritems(): ++ for interface, values in net_stats.items(): + if interface != 'lo' and not interface in skip_virtual_interfaces: + ignore_network = False + for p in skip_network_patterns_list: +@@ -171,8 +171,8 @@ + } + + with self.__last_network_lock: +- result = dict((k, (v - self.__last_network_data.get(k, 0)) / delta) for k, v in new_net_stats.iteritems()) +- result = dict((k, 0 if v < 0 else v) for k, v in result.iteritems()) ++ result = dict((k, (v - self.__last_network_data.get(k, 0)) / delta) for k, v in new_net_stats.items()) ++ result = dict((k, 0 if v < 0 else v) for k, v in result.items()) + self.__last_network_data = new_net_stats + + return result +@@ -199,7 +199,7 @@ + pass + try: + usage = psutil.disk_usage(part.mountpoint) +- except Exception, e: ++ except Exception as e: + logger.debug('Failed to read disk_usage for a mountpoint : ' + str(e)) + continue + +@@ -267,7 +267,7 @@ + logger.debug('skip_disk_patterns: %s' % skip_disk_patterns) + if not skip_disk_patterns or skip_disk_patterns == 'None': + io_counters = psutil.disk_io_counters() +- print io_counters ++ print(io_counters) + else: + sdiskio = namedtuple('sdiskio', ['read_count', 'write_count', + 'read_bytes', 'write_bytes', +@@ -277,14 +277,14 @@ + if not rawdict: + raise RuntimeError("Couldn't find any physical disk") + trimmed_dict = {} +- for disk, fields in rawdict.items(): ++ for disk, fields in list(rawdict.items()): + ignore_disk = False + for p in skip_disk_pattern_list: + if re.match(p, disk): + ignore_disk = True + if not ignore_disk: + trimmed_dict[disk] = sdiskio(*fields) +- io_counters = sdiskio(*[sum(x) for x in zip(*trimmed_dict.values())]) ++ io_counters = sdiskio(*[sum(x) for x in zip(*list(trimmed_dict.values()))]) + + new_disk_stats = { + 'read_count' : io_counters.read_count if hasattr(io_counters, 'read_count') else 0, +@@ -309,7 +309,7 @@ + disk_io_counters = psutil.disk_io_counters(True) + per_disk_io_counters = {} + +- sortByKey = lambda x: sorted(x.items(), key=operator.itemgetter(0)) ++ sortByKey = lambda x: sorted(list(x.items()), key=operator.itemgetter(0)) + + disk_counter = 0 + if disk_io_counters: +@@ -321,7 +321,7 @@ + disk = item[0] + logger.debug('Adding disk counters for %s' % str(disk)) + sdiskio = item[1] +- prefix = 'sdisk_{0}_'.format(disk) ++ prefix = 'sdisk_{}_'.format(disk) + counter_dict = { + prefix + 'read_count' : sdiskio.read_count if hasattr(sdiskio, 'read_count') else 0, + prefix + 'write_count' : sdiskio.write_count if hasattr(sdiskio, 'write_count') else 0, +diff -Naur ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/core/__init__.py apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/core/__init__.py +--- ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/core/__init__.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/core/__init__.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + """ + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file +@@ -33,5 +33,5 @@ + try: + import psutil + except ImportError: +- print 'psutil binaries need to be built by running, psutil/build.py ' \ +- 'manually or by running a, mvn clean package, command.' ++ print('psutil binaries need to be built by running, psutil/build.py ' \ ++ 'manually or by running a, mvn clean package, command.') +diff -Naur ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/core/krberr.py apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/core/krberr.py +--- ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/core/krberr.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/core/krberr.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +diff -Naur ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/core/metric_collector.py apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/core/metric_collector.py +--- ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/core/metric_collector.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/core/metric_collector.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +@@ -20,8 +20,8 @@ + + import logging + from time import time +-from host_info import HostInfo +-from event_definition import HostMetricCollectEvent, ProcessMetricCollectEvent ++from .host_info import HostInfo ++from .event_definition import HostMetricCollectEvent, ProcessMetricCollectEvent + + logger = logging.getLogger() + +diff -Naur ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/core/security.py apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/core/security.py +--- ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/core/security.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/core/security.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +@@ -21,17 +21,17 @@ + import logging + import ssl + import socket +-import httplib ++import http.client + + logger = logging.getLogger() + + # TODO merge this with security.py in ambari-agent and move to ambrari commons + +-class VerifiedHTTPSConnection(httplib.HTTPSConnection): ++class VerifiedHTTPSConnection(http.client.HTTPSConnection): + """ Connecting using ssl wrapped sockets """ + + def __init__(self, host, port, timeout, ca_certs): +- httplib.HTTPSConnection.__init__(self, host, port=port, timeout=timeout) ++ http.client.HTTPSConnection.__init__(self, host, port=port, timeout=timeout) + self.ca_certs = ca_certs + + def connect(self): +@@ -42,13 +42,13 @@ + ca_certs=self.ca_certs) + logger.info('SSL connection established.') + except (ssl.SSLError, AttributeError) as ex: +- logger.info('Insecure connection to https://{0}:{1}/ failed' ++ logger.info('Insecure connection to https://{}:{}/ failed' + .format(self.host, self.port)) + + def create_connection(self): + if self.sock: + self.sock.close() +- logger.info("SSL Connect being called.. connecting to https://{0}:{1}/" ++ logger.info("SSL Connect being called.. connecting to https://{}:{}/" + .format(self.host, self.port)) + sock = socket.create_connection((self.host, self.port), timeout=self.timeout) + sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1) +@@ -85,7 +85,7 @@ + return self.httpconn.getresponse() + + def create_connection(self): +- return httplib.HTTPConnection(self.host, self.port, self.timeout) ++ return http.client.HTTPConnection(self.host, self.port, self.timeout) + + class CachedHTTPSConnection(CachedHTTPConnection): + """ Caches an ssl socket and uses a single https connection to the server. """ +diff -Naur ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/core/spnego_kerberos_auth.py apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/core/spnego_kerberos_auth.py +--- ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/core/spnego_kerberos_auth.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/core/spnego_kerberos_auth.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +@@ -19,14 +19,14 @@ + ''' + + import logging +-import httplib ++import http.client + import os + + logger = logging.getLogger() + try: + import kerberos + except ImportError: +- import krberr as kerberos ++ from . import krberr as kerberos + logger.warn('import kerberos exception: %s' % str(ImportError)) + pass + +@@ -53,7 +53,7 @@ + + def execute_kinit(self, kinit_cmd, klist_cmd): + exit_status = os.system(kinit_cmd) +- logger.debug("kinit exit_status: {0}".format(exit_status)) ++ logger.debug("kinit exit_status: {}".format(exit_status)) + logger.debug(os.system(klist_cmd)) + return exit_status + +@@ -70,15 +70,15 @@ + try: + connection.request(method, service_url, body, headers) + response = connection.getresponse() +- except Exception, e: ++ except Exception as e: + logger.warn('2nd HTTP request exception from server: %s' % str(e)) + return None + pass + if response: +- logger.debug("2nd HTTP response from server: retcode = {0}, reason = {1}" ++ logger.debug("2nd HTTP response from server: retcode = {}, reason = {}" + .format(response.status, response.reason)) + logger.debug(str(response.read())) +- logger.debug("response headers: {0}".format(response.getheaders())) ++ logger.debug("response headers: {}".format(response.getheaders())) + return response + + def get_authorization_header(self, service): +@@ -86,9 +86,9 @@ + try: + result, self.krb_context = kerberos.authGSSClientInit(service) + if result == -1: +- logger.warn('authGSSClientInit result: {0}'.format(result)) ++ logger.warn('authGSSClientInit result: {}'.format(result)) + return None +- except kerberos.GSSError, e: ++ except kerberos.GSSError as e: + logger.warn('authGSSClientInit exception: %s' % str(e)) + return None + pass +@@ -97,9 +97,9 @@ + try: + result = kerberos.authGSSClientStep(self.krb_context, "") + if result == -1: +- logger.warn('authGSSClientStep result for authenticate client: {0}'.format(result)) ++ logger.warn('authGSSClientStep result for authenticate client: {}'.format(result)) + return None +- except kerberos.GSSError, e: ++ except kerberos.GSSError as e: + logger.warn('authGSSClientStep exception for authenticate client: %s' % str(e)) + return None + pass +@@ -107,8 +107,8 @@ + # Get the client response from the first client-side step + try: + negotiate_value = kerberos.authGSSClientResponse(self.krb_context) +- logger.debug("authGSSClientResponse response:{0}".format(negotiate_value)) +- except kerberos.GSSError, e: ++ logger.debug("authGSSClientResponse response:{}".format(negotiate_value)) ++ except kerberos.GSSError as e: + logger.warn('authGSSClientResponse exception: %s' % str(e)) + return None + pass +@@ -126,8 +126,8 @@ + try: + result = kerberos.authGSSClientStep(self.krb_context, negotiate_value) + if result == -1: +- logger.warn('authGSSClientStep result for authenticate server: {0}'.format(result)) +- except kerberos.GSSError, e: ++ logger.warn('authGSSClientStep result for authenticate server: {}'.format(result)) ++ except kerberos.GSSError as e: + logger.warn('authGSSClientStep exception for authenticate server: %s' % str(e)) + result = -1 + pass +@@ -137,8 +137,8 @@ + # Destroy the context for client-side authentication + try: + result = kerberos.authGSSClientClean(self.krb_context) +- logger.debug("authGSSClientClean result:{0}".format(result)) +- except kerberos.GSSError, e: ++ logger.debug("authGSSClientClean result:{}".format(result)) ++ except kerberos.GSSError as e: + logger.warn('authGSSClientClean exception: %s' % str(e)) + result = -1 + pass +diff -Naur ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/core/stop_handler.py apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/core/stop_handler.py +--- ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/core/stop_handler.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/core/stop_handler.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +@@ -34,7 +34,7 @@ + _handler = None + + +-class StopHandler(object): ++class StopHandler: + def set_stop(self): + pass + +diff -Naur ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/__init__.py apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/__init__.py +--- ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/__init__.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/__init__.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +@@ -18,4 +18,4 @@ + limitations under the License. + ''' + +-from core import * ++from .core import * +diff -Naur ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/main.py apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/main.py +--- ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/main.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/main.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +@@ -25,9 +25,9 @@ + import signal + from ambari_commons.os_utils import remove_file + +-from core.controller import Controller +-from core.config_reader import Configuration, PID_OUT_FILE +-from core.stop_handler import bind_signal_handlers ++from .core.controller import Controller ++from .core.config_reader import Configuration, PID_OUT_FILE ++from .core.stop_handler import bind_signal_handlers + + + logger = logging.getLogger() +@@ -66,8 +66,8 @@ + logger.info('Starting Server RPC Thread: %s' % ' '.join(sys.argv)) + controller.start() + +- print "Server out at: " + main_config.ams_monitor_out_file() +- print "Server log at: " + main_config.ams_monitor_log_file() ++ print("Server out at: " + main_config.ams_monitor_out_file()) ++ print("Server log at: " + main_config.ams_monitor_log_file()) + + save_pid(os.getpid(), PID_OUT_FILE) + +diff -Naur ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/build.py apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/build.py +--- ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/build.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/build.py 2022-07-11 00:52:30.000000000 +0800 +@@ -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 @@ + cwd = os.getcwd() + os.chdir(path) + +- print 'Executing make at location: %s ' % path ++ print('Executing make at location: %s ' % path) + + if sys.platform.startswith("win"): + # Windows +@@ -50,7 +50,7 @@ + os.chdir(cwd) + + if returncode != 0: +- print 'psutil build failed. Please find build output at: %s' % build_out_path ++ print('psutil build failed. Please find build output at: %s' % build_out_path) + pass + + if __name__ == '__main__': +diff -Naur ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/docs/conf.py apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/docs/conf.py +--- ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/docs/conf.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/docs/conf.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,3 @@ +-# -*- coding: utf-8 -*- + # + # psutil documentation build configuration file, created by + # sphinx-quickstart. +@@ -16,14 +15,14 @@ + import os + + +-PROJECT_NAME = u"psutil" +-AUTHOR = u"Giampaolo Rodola'" ++PROJECT_NAME = "psutil" ++AUTHOR = "Giampaolo Rodola'" + THIS_YEAR = str(datetime.datetime.now().year) + HERE = os.path.abspath(os.path.dirname(__file__)) + + def get_version(): + INIT = os.path.abspath(os.path.join(HERE, '../psutil/__init__.py')) +- f = open(INIT, 'r') ++ f = open(INIT) + try: + for line in f: + if line.startswith('__version__'): +@@ -68,7 +67,7 @@ + + # General information about the project. + project = PROJECT_NAME +-copyright = u'2009-%s, %s' % (THIS_YEAR, AUTHOR) ++copyright = '2009-{}, {}'.format(THIS_YEAR, AUTHOR) + + # The version info for the project you're documenting, acts as replacement for + # |version| and |release|, also used in various other places throughout the +@@ -214,7 +213,7 @@ + # (source start file, target name, title, author, documentclass [howto/manual]). + latex_documents = [ + ('index', '%s.tex' % PROJECT_NAME, +- u'%s documentation' % PROJECT_NAME, AUTHOR), ++ '%s documentation' % PROJECT_NAME, AUTHOR), + ] + + # The name of an image file (relative to this directory) to place at the top of +@@ -246,7 +245,7 @@ + # One entry per manual page. List of tuples + # (source start file, name, description, authors, manual section). + man_pages = [ +- ('index', PROJECT_NAME, u'%s documentation' % PROJECT_NAME, [AUTHOR], 1) ++ ('index', PROJECT_NAME, '%s documentation' % PROJECT_NAME, [AUTHOR], 1) + ] + + # If true, show URL addresses after external links. +diff -Naur ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/examples/disk_usage.py apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/examples/disk_usage.py +--- ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/examples/disk_usage.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/examples/disk_usage.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + # Copyright (c) 2009, Giampaolo Rodola'. All rights reserved. + # Use of this source code is governed by a BSD-style license that can be +@@ -34,7 +34,7 @@ + for s in reversed(symbols): + if n >= prefix[s]: + value = float(n) / prefix[s] +- return '%.1f%s' % (value, s) ++ return '{:.1f}{}'.format(value, s) + return "%sB" % n + + +diff -Naur ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/examples/free.py apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/examples/free.py +--- ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/examples/free.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/examples/free.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + # Copyright (c) 2009, Giampaolo Rodola'. All rights reserved. + # Use of this source code is governed by a BSD-style license that can be +diff -Naur ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/examples/iotop.py apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/examples/iotop.py +--- ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/examples/iotop.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/examples/iotop.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + # Copyright (c) 2009, Giampaolo Rodola'. All rights reserved. + # Use of this source code is governed by a BSD-style license that can be +@@ -85,7 +85,7 @@ + for s in reversed(symbols): + if n >= prefix[s]: + value = float(n) / prefix[s] +- return '%.2f %s/s' % (value, s) ++ return '{:.2f} {}/s'.format(value, s) + return '%.2f B/s' % (n) + + +diff -Naur ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/examples/killall.py apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/examples/killall.py +--- ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/examples/killall.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/examples/killall.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + # Copyright (c) 2009, Giampaolo Rodola'. All rights reserved. + # Use of this source code is governed by a BSD-style license that can be +diff -Naur ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/examples/meminfo.py apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/examples/meminfo.py +--- ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/examples/meminfo.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/examples/meminfo.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + # Copyright (c) 2009, Giampaolo Rodola'. All rights reserved. + # Use of this source code is governed by a BSD-style license that can be +@@ -47,7 +47,7 @@ + for s in reversed(symbols): + if n >= prefix[s]: + value = float(n) / prefix[s] +- return '%.1f%s' % (value, s) ++ return '{:.1f}{}'.format(value, s) + return "%sB" % n + + +diff -Naur ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/examples/netstat.py apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/examples/netstat.py +--- ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/examples/netstat.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/examples/netstat.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + # Copyright (c) 2009, Giampaolo Rodola'. All rights reserved. + # Use of this source code is governed by a BSD-style license that can be +diff -Naur ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/examples/nettop.py apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/examples/nettop.py +--- ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/examples/nettop.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/examples/nettop.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + # + # $Id: iotop.py 1160 2011-10-14 18:50:36Z g.rodola@gmail.com $ + # +@@ -87,7 +87,7 @@ + for s in reversed(symbols): + if n >= prefix[s]: + value = float(n) / prefix[s] +- return '%.2f %s' % (value, s) ++ return '{:.2f} {}'.format(value, s) + return '%.2f B' % (n) + + +diff -Naur ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/examples/pmap.py apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/examples/pmap.py +--- ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/examples/pmap.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/examples/pmap.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + # Copyright (c) 2009, Giampaolo Rodola'. All rights reserved. + # Use of this source code is governed by a BSD-style license that can be +@@ -40,7 +40,7 @@ + if len(sys.argv) != 2: + sys.exit('usage: pmap ') + p = psutil.Process(int(sys.argv[1])) +- print_("pid=%s, name=%s" % (p.pid, p.name())) ++ print_("pid={}, name={}".format(p.pid, p.name())) + templ = "%-16s %10s %-7s %s" + print_(templ % ("Address", "RSS", "Mode", "Mapping")) + total_rss = 0 +diff -Naur ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/examples/process_detail.py apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/examples/process_detail.py +--- ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/examples/process_detail.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/examples/process_detail.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + # Copyright (c) 2009, Giampaolo Rodola'. All rights reserved. + # Use of this source code is governed by a BSD-style license that can be +@@ -49,7 +49,7 @@ + for s in reversed(symbols): + if n >= prefix[s]: + value = float(n) / prefix[s] +- return '%.1f%s' % (value, s) ++ return '{:.1f}{}'.format(value, s) + return "%sB" % n + + +@@ -82,7 +82,7 @@ + started = datetime.datetime.fromtimestamp( + pinfo['create_time']).strftime('%Y-%M-%d %H:%M') + io = pinfo.get('io_counters', ACCESS_DENIED) +- mem = '%s%% (resident=%s, virtual=%s) ' % ( ++ mem = '{}% (resident={}, virtual={}) '.format( + round(pinfo['memory_percent'], 1), + convert_bytes(pinfo['memory_info'].rss), + convert_bytes(pinfo['memory_info'].vms)) +@@ -91,7 +91,7 @@ + print_('pid', pinfo['pid']) + print_('name', pinfo['name']) + print_('exe', pinfo['exe']) +- print_('parent', '%s %s' % (pinfo['ppid'], parent)) ++ print_('parent', '{} {}'.format(pinfo['ppid'], parent)) + print_('cmdline', ' '.join(pinfo['cmdline'])) + print_('started', started) + print_('user', pinfo['username']) +@@ -104,7 +104,7 @@ + if hasattr(p, 'getcwd'): + print_('cwd', pinfo['cwd']) + print_('memory', mem) +- print_('cpu', '%s%% (user=%s, system=%s)' % ( ++ print_('cpu', '{}% (user={}, system={})'.format( + pinfo['cpu_percent'], + getattr(pinfo['cpu_times'], 'user', '?'), + getattr(pinfo['cpu_times'], 'system', '?'))) +@@ -112,23 +112,23 @@ + print_('niceness', pinfo['nice']) + print_('num threads', pinfo['num_threads']) + if io != ACCESS_DENIED: +- print_('I/O', 'bytes-read=%s, bytes-written=%s' % ( ++ print_('I/O', 'bytes-read={}, bytes-written={}'.format( + convert_bytes(io.read_bytes), + convert_bytes(io.write_bytes))) + if children: + print_('children', '') + for child in children: +- print_('', 'pid=%s name=%s' % (child.pid, child.name())) ++ print_('', 'pid={} name={}'.format(child.pid, child.name())) + + if pinfo['open_files'] != ACCESS_DENIED: + print_('open files', '') + for file in pinfo['open_files']: +- print_('', 'fd=%s %s ' % (file.fd, file.path)) ++ print_('', 'fd={} {} '.format(file.fd, file.path)) + + if pinfo['threads']: + print_('running threads', '') + for thread in pinfo['threads']: +- print_('', 'id=%s, user-time=%s, sys-time=%s' % ( ++ print_('', 'id={}, user-time={}, sys-time={}'.format( + thread.id, thread.user_time, thread.system_time)) + if pinfo['connections'] not in (ACCESS_DENIED, []): + print_('open connections', '') +@@ -144,7 +144,7 @@ + rip, rport = '*', '*' + else: + rip, rport = conn.raddr +- print_('', '%s:%s -> %s:%s type=%s status=%s' % ( ++ print_('', '{}:{} -> {}:{} type={} status={}'.format( + lip, lport, rip, rport, type, conn.status)) + + +diff -Naur ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/examples/top.py apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/examples/top.py +--- ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/examples/top.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/examples/top.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + # Copyright (c) 2009, Giampaolo Rodola'. All rights reserved. + # Use of this source code is governed by a BSD-style license that can be +@@ -91,7 +91,7 @@ + for s in reversed(symbols): + if n >= prefix[s]: + value = int(float(n) / prefix[s]) +- return '%s%s' % (value, s) ++ return '{}{}'.format(value, s) + return "%sB" % n + + +@@ -124,7 +124,7 @@ + """Print system-related info, above the process list.""" + + def get_dashes(perc): +- dashes = "|" * int((float(perc) / 10 * 4)) ++ dashes = "|" * int(float(perc) / 10 * 4) + empty_dashes = " " * (40 - len(dashes)) + return dashes, empty_dashes + +@@ -158,11 +158,11 @@ + + # processes number and status + st = [] +- for x, y in procs_status.items(): ++ for x, y in list(procs_status.items()): + if y: +- st.append("%s=%s" % (x, y)) ++ st.append("{}={}".format(x, y)) + st.sort(key=lambda x: x[:3] in ('run', 'sle'), reverse=1) +- print_line(" Processes: %s (%s)" % (num_procs, ' '.join(st))) ++ print_line(" Processes: {} ({})".format(num_procs, ' '.join(st))) + # load average, uptime + uptime = datetime.now() - datetime.fromtimestamp(psutil.boot_time()) + av1, av2, av3 = os.getloadavg() +@@ -186,8 +186,8 @@ + # is expressed as: "mm:ss.ms" + if p.dict['cpu_times'] is not None: + ctime = timedelta(seconds=sum(p.dict['cpu_times'])) +- ctime = "%s:%s.%s" % (ctime.seconds // 60 % 60, +- str((ctime.seconds % 60)).zfill(2), ++ ctime = "{}:{}.{}".format(ctime.seconds // 60 % 60, ++ str(ctime.seconds % 60).zfill(2), + str(ctime.microseconds)[:2]) + else: + ctime = '' +diff -Naur ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/examples/who.py apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/examples/who.py +--- ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/examples/who.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/examples/who.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + # Copyright (c) 2009, Giampaolo Rodola'. All rights reserved. + # Use of this source code is governed by a BSD-style license that can be +diff -Naur ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/psutil/_common.py apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/psutil/_common.py +--- ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/psutil/_common.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/psutil/_common.py 2022-07-11 00:52:30.000000000 +0800 +@@ -6,7 +6,6 @@ + + """Common objects shared by all _ps* modules.""" + +-from __future__ import division + import errno + import os + import socket +@@ -133,7 +132,7 @@ + 'replcement' is the method name which will be called instead. + """ + def outer(fun): +- msg = "%s() is deprecated; use %s() instead" % ( ++ msg = "{}() is deprecated; use {}() instead".format( + fun.__name__, replacement) + if fun.__doc__ is None: + fun.__doc__ = msg +diff -Naur ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/psutil/_compat.py apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/psutil/_compat.py +--- ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/psutil/_compat.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/psutil/_compat.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + # Copyright (c) 2009, Giampaolo Rodola'. All rights reserved. + # Use of this source code is governed by a BSD-style license that can be +@@ -11,7 +11,7 @@ + + import sys + try: +- import __builtin__ ++ import builtins + except ImportError: + import builtins as __builtin__ # py3 + +@@ -21,7 +21,7 @@ + int = int + long = int + xrange = range +- unicode = str ++ str = str + exec_ = getattr(__builtin__, "exec") + print_ = getattr(__builtin__, "print") + +@@ -32,12 +32,12 @@ + return s.encode("latin-1") + else: + int = int +- long = long ++ long = int + xrange = xrange +- unicode = unicode ++ str = str + + def u(s): +- return unicode(s, "unicode_escape") ++ return str(s, "unicode_escape") + + def b(s): + return s +@@ -82,18 +82,18 @@ + """A collections.namedtuple implementation, see: + http://docs.python.org/library/collections.html#namedtuple + """ +- if isinstance(field_names, basestring): ++ if isinstance(field_names, str): + field_names = field_names.replace(',', ' ').split() + field_names = tuple(map(str, field_names)) + if rename: + names = list(field_names) + seen = set() + for i, name in enumerate(names): +- if ((not min(c.isalnum() or c == '_' for c in name) ++ if (not min(c.isalnum() or c == '_' for c in name) + or _iskeyword(name) + or not name or name[0].isdigit() + or name.startswith('_') +- or name in seen)): ++ or name in seen): + names[i] = '_%d' % i + seen.add(name) + field_names = tuple(names) +@@ -176,11 +176,9 @@ + if hasattr(property, 'setter'): + property = property + else: +- class property(__builtin__.property): +- __metaclass__ = type +- ++ class property(__builtin__.property, metaclass=type): + def __init__(self, fget, *args, **kwargs): +- super(property, self).__init__(fget, *args, **kwargs) ++ super().__init__(fget, *args, **kwargs) + self.__doc__ = fget.__doc__ + + def getter(self, method): +@@ -207,8 +205,8 @@ + """ + + def __init__(self, default_factory=None, *a, **kw): +- if ((default_factory is not None and +- not hasattr(default_factory, '__call__'))): ++ if (default_factory is not None and ++ not hasattr(default_factory, '__call__')): + raise TypeError('first argument must be callable') + dict.__init__(self, *a, **kw) + self.default_factory = default_factory +@@ -230,7 +228,7 @@ + args = tuple() + else: + args = self.default_factory, +- return type(self), args, None, None, self.items() ++ return type(self), args, None, None, list(self.items()) + + def copy(self): + return self.__copy__() +@@ -241,10 +239,10 @@ + def __deepcopy__(self, memo): + import copy + return type(self)(self.default_factory, +- copy.deepcopy(self.items())) ++ copy.deepcopy(list(self.items()))) + + def __repr__(self): +- return 'defaultdict(%s, %s)' % (self.default_factory, ++ return 'defaultdict({}, {})'.format(self.default_factory, + dict.__repr__(self)) + + +@@ -311,7 +309,7 @@ + + def _make_key(args, kwds, typed, + kwd_mark=(object(), ), +- fasttypes=set((int, str, frozenset, type(None))), ++ fasttypes={int, str, frozenset, type(None)}, + sorted=sorted, tuple=tuple, type=type, len=len): + key = args + if kwds: +diff -Naur ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/psutil/__init__.py apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/psutil/__init__.py +--- ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/psutil/__init__.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/psutil/__init__.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,5 +1,4 @@ +-#!/usr/bin/env python +-# -*- coding: utf-8 -*- ++#!/usr/bin/env python3 + + # Copyright (c) 2009, Giampaolo Rodola'. All rights reserved. + # Use of this source code is governed by a BSD-style license that can be +@@ -10,11 +9,10 @@ + in Python. + """ + +-from __future__ import division + + __author__ = "Giampaolo Rodola'" + __version__ = "2.1.1" +-version_info = tuple([int(num) for num in __version__.split('.')]) ++version_info = tuple(int(num) for num in __version__.split('.')) + + __all__ = [ + # exceptions +@@ -189,7 +187,7 @@ + self.msg = msg + if msg is None: + if name: +- details = "(pid=%s, name=%s)" % (self.pid, repr(self.name)) ++ details = "(pid={}, name={})".format(self.pid, repr(self.name)) + else: + details = "(pid=%s)" % self.pid + self.msg = "process no longer exists " + details +@@ -208,7 +206,7 @@ + self.msg = msg + if msg is None: + if (pid is not None) and (name is not None): +- self.msg = "(pid=%s, name=%s)" % (pid, repr(name)) ++ self.msg = "(pid={}, name={})".format(pid, repr(name)) + elif (pid is not None): + self.msg = "(pid=%s)" % self.pid + else: +@@ -230,7 +228,7 @@ + self.name = name + self.msg = "timeout after %s seconds" % seconds + if (pid is not None) and (name is not None): +- self.msg += " (pid=%s, name=%s)" % (pid, repr(name)) ++ self.msg += " (pid={}, name={})".format(pid, repr(name)) + elif (pid is not None): + self.msg += " (pid=%s)" % self.pid + +@@ -259,7 +257,7 @@ + return wrapper + + +-class Process(object): ++class Process: + """Represents an OS process with the given PID. + If PID is omitted current process PID (os.getpid()) is used. + Raise NoSuchProcess if PID does not exist. +@@ -299,7 +297,7 @@ + if pid is None: + pid = os.getpid() + else: +- if not _PY3 and not isinstance(pid, (int, long)): ++ if not _PY3 and not isinstance(pid, int): + raise TypeError('pid must be an integer (got %r)' % pid) + if pid < 0: + raise ValueError('pid must be a positive integer (got %s)' +@@ -346,12 +344,12 @@ + except AccessDenied: + details = "(pid=%s)" % (self.pid) + else: +- details = "(pid=%s, name=%s)" % (pid, name) +- return "%s.%s%s" % (self.__class__.__module__, ++ details = "(pid={}, name={})".format(pid, name) ++ return "{}.{}{}".format(self.__class__.__module__, + self.__class__.__name__, details) + + def __repr__(self): +- return "<%s at %s>" % (self.__str__(), id(self)) ++ return "<{} at {}>".format(self.__str__(), id(self)) + + def __eq__(self, other): + # Test for equality with another Process object based +@@ -383,9 +381,9 @@ + AccessDenied exception is raised when retrieving that + particular process information. + """ +- excluded_names = set( +- ['send_signal', 'suspend', 'resume', 'terminate', 'kill', 'wait', +- 'is_running', 'as_dict', 'parent', 'children', 'rlimit']) ++ excluded_names = { ++ 'send_signal', 'suspend', 'resume', 'terminate', 'kill', 'wait', ++ 'is_running', 'as_dict', 'parent', 'children', 'rlimit'} + retdict = dict() + ls = set(attrs or [x for x in dir(self) if not x.startswith('get')]) + for name in ls: +@@ -394,7 +392,7 @@ + if name.startswith('set_'): + continue + if name.startswith('get_'): +- msg = "%s() is deprecated; use %s() instead" % (name, name[4:]) ++ msg = "{}() is deprecated; use {}() instead".format(name, name[4:]) + warnings.warn(msg, category=DeprecationWarning, stacklevel=2) + name = name[4:] + if name in ls: +@@ -754,7 +752,7 @@ + pass + else: + # Windows only (faster) +- for pid, ppid in ppid_map.items(): ++ for pid, ppid in list(ppid_map.items()): + if ppid == self.pid: + try: + child = Process(pid) +@@ -775,7 +773,7 @@ + except NoSuchProcess: + pass + else: +- for pid, ppid in ppid_map.items(): ++ for pid, ppid in list(ppid_map.items()): + try: + p = Process(pid) + table[ppid].append(p) +@@ -925,7 +923,7 @@ + path = tupl[2] + nums = tupl[3:] + try: +- d[path] = map(lambda x, y: x + y, d[path], nums) ++ d[path] = list(map(lambda x, y: x + y, d[path], nums)) + except KeyError: + d[path] = nums + nt = _psplatform.pmmap_grouped +@@ -1220,7 +1218,7 @@ + def wait(self, timeout=None): + if self.__subproc.returncode is not None: + return self.__subproc.returncode +- ret = super(Popen, self).wait(timeout) ++ ret = super().wait(timeout) + self.__subproc.returncode = ret + return ret + +@@ -1725,11 +1723,11 @@ + if not rawdict: + raise RuntimeError("couldn't find any physical disk") + if perdisk: +- for disk, fields in rawdict.items(): ++ for disk, fields in list(rawdict.items()): + rawdict[disk] = _nt_sys_diskio(*fields) + return rawdict + else: +- return _nt_sys_diskio(*[sum(x) for x in zip(*rawdict.values())]) ++ return _nt_sys_diskio(*[sum(x) for x in zip(*list(rawdict.values()))]) + + + # ===================================================================== +@@ -1759,11 +1757,11 @@ + if not rawdict: + raise RuntimeError("couldn't find any network interface") + if pernic: +- for nic, fields in rawdict.items(): ++ for nic, fields in list(rawdict.items()): + rawdict[nic] = _nt_sys_netio(*fields) + return rawdict + else: +- return _nt_sys_netio(*[sum(x) for x in zip(*rawdict.values())]) ++ return _nt_sys_netio(*[sum(x) for x in zip(*list(rawdict.values()))]) + + + def net_connections(kind='inet'): +@@ -1947,7 +1945,7 @@ + deprecated module constants, see: + http://www.dr-josiah.com/2013/12/properties-on-python-modules.html + """ +- class ModuleWrapper(object): ++ class ModuleWrapper: + + def __repr__(self): + return repr(self._module) +diff -Naur ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/psutil/_psbsd.py apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/psutil/_psbsd.py +--- ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/psutil/_psbsd.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/psutil/_psbsd.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + # Copyright (c) 2009, Giampaolo Rodola'. All rights reserved. + # Use of this source code is governed by a BSD-style license that can be +@@ -80,7 +80,7 @@ + + def swap_memory(): + """System swap memory as (total, used, free, sin, sout) namedtuple.""" +- total, used, free, sin, sout = [x * PAGESIZE for x in cext.swap_mem()] ++ total, used, free, sin, sout = (x * PAGESIZE for x in cext.swap_mem()) + percent = usage_percent(used, total, _round=1) + return _common.sswap(total, used, free, percent, sin, sout) + +@@ -223,7 +223,7 @@ + return wrapper + + +-class Process(object): ++class Process: + """Wrapper class around underlying C implementation.""" + + __slots__ = ["pid", "_name"] +diff -Naur ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/psutil/_pslinux.py apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/psutil/_pslinux.py +--- ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/psutil/_pslinux.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/psutil/_pslinux.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + # Copyright (c) 2009, Giampaolo Rodola'. All rights reserved. + # Use of this source code is governed by a BSD-style license that can be +@@ -6,7 +6,6 @@ + + """Linux platform implementation.""" + +-from __future__ import division + + import base64 + import errno +@@ -274,12 +273,12 @@ + # http://code.google.com/p/psutil/issues/detail?id=200 + # try to parse /proc/stat as a last resort + if num == 0: +- f = open('/proc/stat', 'rt') ++ f = open('/proc/stat') + try: + lines = f.readlines() + finally: + f.close() +- search = re.compile('cpu\d') ++ search = re.compile(r'cpu\d') + for line in lines: + line = line.split(' ')[0] + if search.match(line): +@@ -395,7 +394,7 @@ + inodes = defaultdict(list) + for fd in os.listdir("/proc/%s/fd" % pid): + try: +- inode = os.readlink("/proc/%s/fd/%s" % (pid, fd)) ++ inode = os.readlink("/proc/{}/fd/{}".format(pid, fd)) + except OSError: + # TODO: need comment here + continue +@@ -476,7 +475,7 @@ + if file.endswith('6') and not os.path.exists(file): + # IPv6 not supported + return +- f = open(file, 'rt') ++ f = open(file) + try: + f.readline() # skip the first line + for line in f: +@@ -507,7 +506,7 @@ + + def process_unix(self, file, family, inodes, filter_pid=None): + """Parse /proc/net/unix files.""" +- f = open(file, 'rt') ++ f = open(file) + try: + f.readline() # skip the first line + for line in f: +@@ -576,7 +575,7 @@ + """Return network I/O statistics for every network interface + installed on the system as a dict of raw tuples. + """ +- f = open("/proc/net/dev", "rt") ++ f = open("/proc/net/dev") + try: + lines = f.readlines() + finally: +@@ -614,7 +613,7 @@ + + # determine partitions we want to look for + partitions = [] +- f = open("/proc/partitions", "rt") ++ f = open("/proc/partitions") + try: + lines = f.readlines()[2:] + finally: +@@ -634,7 +633,7 @@ + partitions.append(name) + # + retdict = {} +- f = open("/proc/diskstats", "rt") ++ f = open("/proc/diskstats") + try: + lines = f.readlines() + finally: +@@ -657,7 +656,7 @@ + def disk_partitions(all=False): + """Return mounted disk partitions as a list of nameduples""" + phydevs = [] +- f = open("/proc/filesystems", "r") ++ f = open("/proc/filesystems") + try: + for line in f: + if not line.startswith("nodev"): +@@ -692,7 +691,7 @@ + def wrapper(self, *args, **kwargs): + try: + return fun(self, *args, **kwargs) +- except EnvironmentError: ++ except OSError: + # support for private module import + if NoSuchProcess is None or AccessDenied is None: + raise +@@ -708,7 +707,7 @@ + return wrapper + + +-class Process(object): ++class Process: + """Linux process implementation.""" + + __slots__ = ["pid", "_name"] +@@ -721,9 +720,9 @@ + def name(self): + fname = "/proc/%s/stat" % self.pid + if PY3: +- f = open(fname, "rt", encoding=DEFAULT_ENCODING) ++ f = open(fname, encoding=DEFAULT_ENCODING) + else: +- f = open(fname, "rt") ++ f = open(fname) + try: + name = f.read().split(' ')[1].replace('(', '').replace(')', '') + finally: +@@ -734,7 +733,7 @@ + def exe(self): + try: + exe = os.readlink("/proc/%s/exe" % self.pid) +- except (OSError, IOError): ++ except OSError: + err = sys.exc_info()[1] + if err.errno == errno.ENOENT: + # no such file error; might be raised also if the +@@ -763,9 +762,9 @@ + def cmdline(self): + fname = "/proc/%s/cmdline" % self.pid + if PY3: +- f = open(fname, "rt", encoding=DEFAULT_ENCODING) ++ f = open(fname, encoding=DEFAULT_ENCODING) + else: +- f = open(fname, "rt") ++ f = open(fname) + try: + # return the args as a list + return [x for x in f.read().split('\x00') if x] +@@ -883,7 +882,7 @@ + f = open("/proc/%s/statm" % self.pid, "rb") + try: + vms, rss, shared, text, lib, data, dirty = \ +- [int(x) * PAGESIZE for x in f.readline().split()[:7]] ++ (int(x) * PAGESIZE for x in f.readline().split()[:7]) + finally: + f.close() + return pextmem(rss, vms, shared, text, lib, data, dirty) +@@ -896,7 +895,7 @@ + """ + f = None + try: +- f = open("/proc/%s/smaps" % self.pid, "rt") ++ f = open("/proc/%s/smaps" % self.pid) + first_line = f.readline() + current_block = [first_line] + +@@ -944,7 +943,7 @@ + data.get('Anonymous:', 0), + data.get('Swap:', 0)) + f.close() +- except EnvironmentError: ++ except OSError: + # XXX - Can't use wrap_exceptions decorator as we're + # returning a generator; this probably needs some + # refactoring in order to avoid this code duplication. +@@ -1018,8 +1017,8 @@ + hit_enoent = False + for thread_id in thread_ids: + try: +- f = open("/proc/%s/task/%s/stat" % (self.pid, thread_id), 'rb') +- except EnvironmentError: ++ f = open("/proc/{}/task/{}/stat".format(self.pid, thread_id), 'rb') ++ except OSError: + err = sys.exc_info()[1] + if err.errno == errno.ENOENT: + # no such file or directory; it means thread +@@ -1061,7 +1060,7 @@ + + @wrap_exceptions + def cpu_affinity_get(self): +- from_bitmask = lambda x: [i for i in xrange(64) if (1 << i) & x] ++ from_bitmask = lambda x: [i for i in range(64) if (1 << i) & x] + bitmask = cext.proc_cpu_affinity_get(self.pid) + return from_bitmask(bitmask) + +@@ -1150,7 +1149,7 @@ + files = os.listdir("/proc/%s/fd" % self.pid) + hit_enoent = False + for fd in files: +- file = "/proc/%s/fd/%s" % (self.pid, fd) ++ file = "/proc/{}/fd/{}".format(self.pid, fd) + if os.path.islink(file): + try: + file = os.readlink(file) +diff -Naur ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/psutil/_psosx.py apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/psutil/_psosx.py +--- ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/psutil/_psosx.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/psutil/_psosx.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + # Copyright (c) 2009, Giampaolo Rodola'. All rights reserved. + # Use of this source code is governed by a BSD-style license that can be +@@ -193,7 +193,7 @@ + return wrapper + + +-class Process(object): ++class Process: + """Wrapper class around underlying C implementation.""" + + __slots__ = ["pid", "_name"] +diff -Naur ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/psutil/_psposix.py apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/psutil/_psposix.py +--- ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/psutil/_psposix.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/psutil/_psposix.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + # Copyright (c) 2009, Giampaolo Rodola'. All rights reserved. + # Use of this source code is governed by a BSD-style license that can be +@@ -13,7 +13,7 @@ + import time + + from psutil._common import sdiskusage, usage_percent, memoize +-from psutil._compat import PY3, unicode ++from psutil._compat import PY3, str + + + class TimeoutExpired(Exception): +@@ -120,7 +120,7 @@ + try: + st = os.statvfs(path) + except UnicodeEncodeError: +- if not PY3 and isinstance(path, unicode): ++ if not PY3 and isinstance(path, str): + # this is a bug with os.statvfs() and unicode on + # Python 2, see: + # - https://code.google.com/p/psutil/issues/detail?id=416 +diff -Naur ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/psutil/_pssunos.py apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/psutil/_pssunos.py +--- ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/psutil/_pssunos.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/psutil/_pssunos.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + # Copyright (c) 2009, Giampaolo Rodola'. All rights reserved. + # Use of this source code is governed by a BSD-style license that can be +@@ -232,7 +232,7 @@ + def wrapper(self, *args, **kwargs): + try: + return fun(self, *args, **kwargs) +- except EnvironmentError: ++ except OSError: + # support for private module import + if NoSuchProcess is None or AccessDenied is None: + raise +@@ -248,7 +248,7 @@ + return wrapper + + +-class Process(object): ++class Process: + """Wrapper class around underlying C implementation.""" + + __slots__ = ["pid", "_name"] +@@ -293,7 +293,7 @@ + # fine. + try: + return _psutil_posix.getpriority(self.pid) +- except EnvironmentError: ++ except OSError: + err = sys.exc_info()[1] + if err.errno in (errno.ENOENT, errno.ESRCH): + if pid_exists(self.pid): +@@ -388,7 +388,7 @@ + try: + utime, stime = cext.query_process_thread( + self.pid, tid) +- except EnvironmentError: ++ except OSError: + # ENOENT == thread gone in meantime + err = sys.exc_info()[1] + if err.errno == errno.ENOENT: +@@ -437,14 +437,14 @@ + stderr=subprocess32.PIPE) + stdout, stderr = p.communicate() + if PY3: +- stdout, stderr = [x.decode(sys.stdout.encoding) +- for x in (stdout, stderr)] ++ stdout, stderr = (x.decode(sys.stdout.encoding) ++ for x in (stdout, stderr)) + if p.returncode != 0: + if 'permission denied' in stderr.lower(): + raise AccessDenied(self.pid, self._name) + if 'no such process' in stderr.lower(): + raise NoSuchProcess(self.pid, self._name) +- raise RuntimeError("%r command error\n%s" % (cmd, stderr)) ++ raise RuntimeError("{!r} command error\n{}".format(cmd, stderr)) + + lines = stdout.split('\n')[2:] + for i, line in enumerate(lines): +@@ -483,7 +483,7 @@ + @wrap_exceptions + def memory_maps(self): + def toaddr(start, end): +- return '%s-%s' % (hex(start)[2:].strip('L'), ++ return '{}-{}'.format(hex(start)[2:].strip('L'), + hex(end)[2:].strip('L')) + + retlist = [] +@@ -494,7 +494,7 @@ + addr = toaddr(addr, addrsize) + if not name.startswith('['): + try: +- name = os.readlink('/proc/%s/path/%s' % (self.pid, name)) ++ name = os.readlink('/proc/{}/path/{}'.format(self.pid, name)) + except OSError: + err = sys.exc_info()[1] + if err.errno == errno.ENOENT: +@@ -504,7 +504,7 @@ + # unresolved link path. + # This seems an incosistency with /proc similar + # to: http://goo.gl/55XgO +- name = '/proc/%s/path/%s' % (self.pid, name) ++ name = '/proc/{}/path/{}'.format(self.pid, name) + hit_enoent = True + else: + raise +diff -Naur ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/psutil/_pswindows.py apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/psutil/_pswindows.py +--- ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/psutil/_pswindows.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/psutil/_pswindows.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + # Copyright (c) 2009, Giampaolo Rodola'. All rights reserved. + # Use of this source code is governed by a BSD-style license that can be +@@ -110,7 +110,7 @@ + """Return disk usage associated with path.""" + try: + total, free = cext.disk_usage(path) +- except WindowsError: ++ except OSError: + if not os.path.exists(path): + msg = "No such file or directory: '%s'" % path + raise OSError(errno.ENOENT, msg) +@@ -217,7 +217,7 @@ + return wrapper + + +-class Process(object): ++class Process: + """Wrapper class around underlying C implementation.""" + + __slots__ = ["pid", "_name"] +@@ -444,7 +444,7 @@ + + @wrap_exceptions + def cpu_affinity_get(self): +- from_bitmask = lambda x: [i for i in xrange(64) if (1 << i) & x] ++ from_bitmask = lambda x: [i for i in range(64) if (1 << i) & x] + bitmask = cext.proc_cpu_affinity_get(self.pid) + return from_bitmask(bitmask) + +diff -Naur ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/setup.py apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/setup.py +--- ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/setup.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/setup.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + # Copyright (c) 2009 Giampaolo Rodola'. All rights reserved. + # Use of this source code is governed by a BSD-style license that can be +@@ -22,7 +22,7 @@ + + def get_version(): + INIT = os.path.join(HERE, 'psutil/__init__.py') +- f = open(INIT, 'r') ++ f = open(INIT) + try: + for line in f: + if line.startswith('__version__'): +@@ -39,7 +39,7 @@ + + def get_description(): + README = os.path.join(HERE, 'README') +- f = open(README, 'r') ++ f = open(README) + try: + return f.read() + finally: +diff -Naur ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/test/python/core/TestApplicationMetricMap.py apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/test/python/core/TestApplicationMetricMap.py +--- ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/test/python/core/TestApplicationMetricMap.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/test/python/core/TestApplicationMetricMap.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +diff -Naur ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/test/python/core/TestEmitter.py apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/test/python/core/TestEmitter.py +--- ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/test/python/core/TestEmitter.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/test/python/core/TestEmitter.py 2022-07-11 00:52:29.000000000 +0800 +@@ -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 unittest import TestCase + from only_for_platform import get_platform, PLATFORM_WINDOWS +-from mock.mock import patch, MagicMock ++from unittest.mock import patch, MagicMock + from security import CachedHTTPConnection + from blacklisted_set import BlacklistedSet + from spnego_kerberos_auth import SPNEGOKerberosAuth +diff -Naur ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/test/python/core/TestHostInfo.py apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/test/python/core/TestHostInfo.py +--- ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/test/python/core/TestHostInfo.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/test/python/core/TestHostInfo.py 2022-07-11 00:52:30.000000000 +0800 +@@ -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 platform + from host_info import HostInfo +-from mock.mock import patch, MagicMock ++from unittest.mock import patch, MagicMock + from unittest import TestCase + + logger = logging.getLogger() +@@ -252,14 +252,14 @@ + + #skip all by pattern + c.get_virtual_interfaces_skip.return_value = 'False' +- c.get_network_interfaces_skip_pattern.return_value = "^etc\d*$" ++ c.get_network_interfaces_skip_pattern.return_value = r"^etc\d*$" + hostinfo = HostInfo(c) + network_info = hostinfo.get_network_info() + + self.assertEqual(network_info, {}) + + #skip one by pattern +- c.get_network_interfaces_skip_pattern.return_value = "^etc\d{1}$" ++ c.get_network_interfaces_skip_pattern.return_value = r"^etc\d{1}$" + hostinfo = HostInfo(c) + network_info = hostinfo.get_network_info() + +@@ -267,7 +267,7 @@ + + all_net_stats = { 'etc2' : net_stats } + net_io_counters.return_value = all_net_stats +- c.get_network_interfaces_skip_pattern.return_value = "^etc\d{1}$" ++ c.get_network_interfaces_skip_pattern.return_value = r"^etc\d{1}$" + hostinfo = HostInfo(c) + network_info = hostinfo.get_network_info() + +@@ -298,7 +298,7 @@ + + #skip only one by pattern and other as virtual + c.get_virtual_interfaces_skip.return_value = 'True' +- c.get_network_interfaces_skip_pattern.return_value = "^etc\d{3}$" ++ c.get_network_interfaces_skip_pattern.return_value = r"^etc\d{3}$" + hostinfo = HostInfo(c) + network_info = hostinfo.get_network_info() + +diff -Naur ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/test/python/core/TestMetricCollector.py apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/test/python/core/TestMetricCollector.py +--- ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/test/python/core/TestMetricCollector.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/test/python/core/TestMetricCollector.py 2022-07-11 00:52:30.000000000 +0800 +@@ -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 unittest import TestCase +-from mock.mock import patch ++from unittest.mock import patch + + from core.application_metric_map import ApplicationMetricMap + from core.metric_collector import MetricsCollector +diff -Naur ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/test/python/unitTests.py apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/test/python/unitTests.py +--- ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-host-monitoring/src/test/python/unitTests.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-host-monitoring/src/test/python/unitTests.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +@@ -118,13 +118,13 @@ + sys.stderr.write("Failed tests:\n") + for failed_tests in [test_errors,test_failures]: + for err in failed_tests: +- sys.stderr.write("{0}: {1}\n".format(err[2],err[0])) ++ sys.stderr.write("{}: {}\n".format(err[2],err[0])) + sys.stderr.write("----------------------------------------------------------------------\n") +- sys.stderr.write("{0}\n".format(err[1])) ++ sys.stderr.write("{}\n".format(err[1])) + sys.stderr.write("----------------------------------------------------------------------\n") +- sys.stderr.write("Total run:{0}\n".format(test_runs)) +- sys.stderr.write("Total errors:{0}\n".format(len(test_errors))) +- sys.stderr.write("Total failures:{0}\n".format(len(test_failures))) ++ sys.stderr.write("Total run:{}\n".format(test_runs)) ++ sys.stderr.write("Total errors:{}\n".format(len(test_errors))) ++ sys.stderr.write("Total failures:{}\n".format(len(test_failures))) + + if tests_status: + sys.stderr.write("OK\n") +diff -Naur ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-timelineservice/conf/unix/sqlline/phoenix_utils.py apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-timelineservice/conf/unix/sqlline/phoenix_utils.py +--- ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-timelineservice/conf/unix/sqlline/phoenix_utils.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-timelineservice/conf/unix/sqlline/phoenix_utils.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + ############################################################################ + # + # Licensed to the Apache Software Foundation (ASF) under one +@@ -175,18 +175,18 @@ + + if __name__ == "__main__": + setPath() +- print "phoenix_class_path:", phoenix_class_path +- print "hbase_conf_dir:", hbase_conf_dir +- print "hbase_conf_path:", hbase_conf_path +- print "current_dir:", current_dir +- print "phoenix_jar_path:", phoenix_jar_path +- print "phoenix_client_jar:", phoenix_client_jar +- print "phoenix_test_jar_path:", phoenix_test_jar_path +- print "hadoop_common_jar_path:", hadoop_common_jar_path +- print "hadoop_common_jar:", hadoop_common_jar +- print "hadoop_hdfs_jar_path:", hadoop_hdfs_jar_path +- print "hadoop_hdfs_jar:", hadoop_hdfs_jar +- print "testjar:", testjar +- print "phoenix_queryserver_jar:", phoenix_queryserver_jar +- print "phoenix_thin_client_jar:", phoenix_thin_client_jar +- print "hadoop_classpath:", hadoop_classpath ++ print("phoenix_class_path:", phoenix_class_path) ++ print("hbase_conf_dir:", hbase_conf_dir) ++ print("hbase_conf_path:", hbase_conf_path) ++ print("current_dir:", current_dir) ++ print("phoenix_jar_path:", phoenix_jar_path) ++ print("phoenix_client_jar:", phoenix_client_jar) ++ print("phoenix_test_jar_path:", phoenix_test_jar_path) ++ print("hadoop_common_jar_path:", hadoop_common_jar_path) ++ print("hadoop_common_jar:", hadoop_common_jar) ++ print("hadoop_hdfs_jar_path:", hadoop_hdfs_jar_path) ++ print("hadoop_hdfs_jar:", hadoop_hdfs_jar) ++ print("testjar:", testjar) ++ print("phoenix_queryserver_jar:", phoenix_queryserver_jar) ++ print("phoenix_thin_client_jar:", phoenix_thin_client_jar) ++ print("hadoop_classpath:", hadoop_classpath) +diff -Naur ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-timelineservice/conf/unix/sqlline/sqlline.py apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-timelineservice/conf/unix/sqlline/sqlline.py +--- ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-timelineservice/conf/unix/sqlline/sqlline.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-timelineservice/conf/unix/sqlline/sqlline.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + ############################################################################ + # + # Licensed to the Apache Software Foundation (ASF) under one +@@ -57,9 +57,9 @@ + #phoenix_utils.setPath() + + if len(sys.argv) < 2: +- print "Zookeeper not specified. \nUsage: sqlline.py \ ++ print("Zookeeper not specified. \nUsage: sqlline.py \ + \nExample: \n 1. sqlline.py localhost:2181:/hbase \n 2. sqlline.py \ +-localhost:2181:/hbase ../examples/stock_symbol.sql" ++localhost:2181:/hbase ../examples/stock_symbol.sql") + sys.exit() + + sqlfile = "" +@@ -79,7 +79,7 @@ + + PATH_PREFIX = '/usr/lib/ambari-metrics-collector/' + if not os.path.exists(PATH_PREFIX): +- print 'Fatal Error: ' + PATH_PREFIX + ' not a valid path.' ++ print('Fatal Error: ' + PATH_PREFIX + ' not a valid path.') + sys.exit(1) + + current_dir = os.path.dirname(os.path.abspath(__file__)) +@@ -93,7 +93,7 @@ + " -n none -p none --color=" + colorSetting + " --fastConnect=false --verbose=true \ + --isolation=TRANSACTION_READ_COMMITTED " + sqlfile + +-print 'java command: %s' % str(java_cmd) ++print('java command: %s' % str(java_cmd)) + + childProc = subprocess.Popen(java_cmd, shell=True) + #Wait for child process exit +diff -Naur ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-timelineservice/pom.xml apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-timelineservice/pom.xml +--- ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-timelineservice/pom.xml 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-timelineservice/pom.xml 2022-07-09 22:40:46.000000000 +0800 +@@ -322,7 +322,7 @@ + + org.apache.zookeeper + zookeeper +- 3.4.5.1.3.0.0-107 ++ 3.4.5 + + + jline +diff -Naur ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-timelineservice/src/main/python/ambari_metrics_collector/__init__.py apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-timelineservice/src/main/python/ambari_metrics_collector/__init__.py +--- ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-timelineservice/src/main/python/ambari_metrics_collector/__init__.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-timelineservice/src/main/python/ambari_metrics_collector/__init__.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-timelineservice/src/main/python/ambari_metrics_collector/properties.py apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-timelineservice/src/main/python/ambari_metrics_collector/properties.py +--- ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-timelineservice/src/main/python/ambari_metrics_collector/properties.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-timelineservice/src/main/python/ambari_metrics_collector/properties.py 2022-07-11 00:52:29.000000000 +0800 +@@ -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 @@ + 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 +@@ -114,7 +114,7 @@ + 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: +@@ -124,25 +124,25 @@ + def unescape(self, value): + newvalue = value + if not value is None: +- newvalue = value.replace('\:', ':') +- newvalue = newvalue.replace('\=', '=') ++ newvalue = value.replace(r'\:', ':') ++ newvalue = newvalue.replace(r'\=', '=') + 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!' ++ 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() +@@ -154,7 +154,7 @@ + return self._props.get(key, '') + + def propertyNames(self): +- return self._props.keys() ++ return list(self._props.keys()) + + def getPropertyDict(self): + return self._props +@@ -171,7 +171,7 @@ + + 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 +@@ -179,7 +179,7 @@ + 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 + +@@ -187,7 +187,7 @@ + """ 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'))) +@@ -195,7 +195,7 @@ + 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 prop, val in self._origprops.items(): ++ for prop, val in list(self._origprops.items()): + if val is not None: + out.write(''.join((prop, '=', val, '\n'))) + out.close() +@@ -206,7 +206,7 @@ + """ 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'))) +@@ -214,7 +214,7 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-timelineservice/src/main/python/ambari_metrics_collector/serviceConfiguration.py apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-timelineservice/src/main/python/ambari_metrics_collector/serviceConfiguration.py +--- ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-timelineservice/src/main/python/ambari_metrics_collector/serviceConfiguration.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-timelineservice/src/main/python/ambari_metrics_collector/serviceConfiguration.py 2022-07-11 00:52:29.000000000 +0800 +@@ -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 @@ + if conf_file is None: + err = 'File %s not found in search path $%s: %s' % (AMS_PROPERTIES_FILE, + AMS_CONF_VAR, get_conf_dir()) +- print err ++ print(err) + raise FatalException(1, err) + else: + print_info_msg('Loading properties from ' + conf_file) +@@ -96,8 +96,8 @@ + try: + properties = Properties() + properties.load(open(conf_file)) +- except (Exception), e: +- print 'Could not read "%s": %s' % (conf_file, e) ++ except (Exception) as e: ++ print('Could not read "%s": %s' % (conf_file, e)) + return -1 + return properties + +@@ -126,12 +126,12 @@ + raise FatalException(1, err) + + if not os.path.isdir(java_home): +- err = "ERROR: JAVA_HOME {0} does not exist.".format(java_home) ++ err = "ERROR: JAVA_HOME {} does not exist.".format(java_home) + raise FatalException(1, err) + + java_exe = os.path.join(java_home, JAVA_EXE_SUBPATH) + if not os.path.isfile(java_exe): +- err = "ERROR: {0} is not executable.".format(java_exe) ++ err = "ERROR: {} is not executable.".format(java_exe) + raise FatalException(1, err) + + return java_home +@@ -145,7 +145,7 @@ + try: + # check envvars which might override default args + hadoop_heapsize = os.environ[HADOOP_HEAPSIZE] +- java_heap_max = "-Xms{0}m".format(hadoop_heapsize) ++ java_heap_max = "-Xms{}m".format(hadoop_heapsize) + except Exception: + java_heap_max = JAVA_HEAP_MAX_DEFAULT + +diff -Naur ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-timelineservice/src/main/python/amc_service.py apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-timelineservice/src/main/python/amc_service.py +--- ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-timelineservice/src/main/python/amc_service.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-timelineservice/src/main/python/amc_service.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +@@ -136,7 +136,7 @@ + options.exit_message = None + + statusStr = AMCollectorService.QueryStatus() +- print "Ambari Metrics Collector is " + statusStr ++ print("Ambari Metrics Collector is " + statusStr) + + + def setup(options): +@@ -167,5 +167,5 @@ + + def ensure_hadoop_service_soft_dependencies(): + if SERVICE_STATUS_RUNNING != WinServiceController.QueryStatus(EMBEDDED_HBASE_MASTER_SERVICE): +- err = 'ERROR: Service "{0}" was not started.'.format(EMBEDDED_HBASE_MASTER_SERVICE) ++ err = 'ERROR: Service "{}" was not started.'.format(EMBEDDED_HBASE_MASTER_SERVICE) + raise FatalException(1, err) +diff -Naur ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-timelineservice/src/main/python/embedded_hbase_service.py apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-timelineservice/src/main/python/embedded_hbase_service.py +--- ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-timelineservice/src/main/python/embedded_hbase_service.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-timelineservice/src/main/python/embedded_hbase_service.py 2022-07-11 00:52:29.000000000 +0800 +@@ -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 @@ + + @classmethod + def Install(cls, startupMode = "auto", username = None, password = None): +- print "Installing service %s" % (cls._svc_name_) ++ print("Installing service %s" % (cls._svc_name_)) + + # Configure master.xml, which drives the java subprocess32 + java_path = get_java_exe_path() +@@ -120,18 +120,18 @@ + None, + username, + password) +- print "Service installed" ++ print("Service installed") + win32service.CloseServiceHandle(hs) + finally: + win32service.CloseServiceHandle(hscm) +- except win32service.error, exc: ++ except win32service.error as exc: + if exc.winerror==winerror.ERROR_SERVICE_EXISTS: + cls.Update(username, password) + else: +- print "Error installing service: %s (%d)" % (exc.strerror, exc.winerror) ++ print("Error installing service: %s (%d)" % (exc.strerror, exc.winerror)) + err = exc.winerror +- except ValueError, msg: # Can be raised by custom option handler. +- print "Error installing service: %s" % str(msg) ++ except ValueError as msg: # Can be raised by custom option handler. ++ print("Error installing service: %s" % str(msg)) + err = -1 + # xxx - maybe I should remove after _any_ failed install - however, + # xxx - it may be useful to help debug to leave the service as it failed. +@@ -141,7 +141,7 @@ + try: + RemoveService(cls._svc_name_) + except win32api.error: +- print "Warning - could not remove the partially installed service." ++ print("Warning - could not remove the partially installed service.") + + @classmethod + def Update(cls, startupMode = "auto", username = None, password = None): +@@ -170,7 +170,7 @@ + username, + password, + cls._svc_display_name_) +- print "Service updated" ++ print("Service updated") + finally: + win32service.CloseServiceHandle(hs) + finally: +diff -Naur ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-timelineservice/src/main/python/main.py apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-timelineservice/src/main/python/main.py +--- ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-timelineservice/src/main/python/main.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-timelineservice/src/main/python/main.py 2022-07-11 00:52:29.000000000 +0800 +@@ -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 ambari_commons import subprocess32 + import sys + +-from ambari_commons.exceptions import FatalException, NonFatalException ++from ambari_commons.exceptions import FatalException as NonFatalException + from ambari_commons.logging_utils import print_info_msg, print_warning_msg, print_error_msg + from ambari_metrics_collector.serviceConfiguration import get_java_exe_path, get_java_cp, build_jvm_args, \ + SETUP_ACTION, START_ACTION, STOP_ACTION, RESTART_ACTION, STATUS_ACTION, PID_DIR, EXITCODE_OUT_FILE, \ +@@ -77,7 +77,7 @@ + if out is not None and out is not "": + print_info_msg(AMS_ENV_CMD + " output: " + out) + else: +- err = 'ERROR: Cannot execute "{0}"'.format(ams_env_cmd) ++ err = 'ERROR: Cannot execute "{}"'.format(ams_env_cmd) + raise FatalException(1, err) + + +@@ -101,7 +101,7 @@ + + #options.conf_dir <= --config + if not os.path.isdir(options.conf_dir): +- err = 'ERROR: Cannot find configuration directory "{0}"'.format(options.conf_dir) ++ err = 'ERROR: Cannot find configuration directory "{}"'.format(options.conf_dir) + raise FatalException(1, err) + + #execute ams-env.cmd +@@ -122,7 +122,7 @@ + suspend_mode = 'y' if SUSPEND_START_MODE else 'n' + command = command_base.format(java_class_path, java_heap_max, suspend_mode) + if not os.path.exists(PID_DIR): +- os.makedirs(PID_DIR, 0755) ++ os.makedirs(PID_DIR, 0o755) + + #Ignore the requirement to run as root. In Windows, by default the child process inherits the security context + # and the environment from the parent process. +@@ -132,7 +132,7 @@ + procJava = subprocess32.Popen(param_list, env=os.environ) + + #wait for server process for SERVER_START_TIMEOUT seconds +- print "Waiting for server start..." ++ print("Waiting for server start...") + + pidJava = procJava.pid + if pidJava <= 0: +@@ -146,9 +146,9 @@ + raise FatalException(-1, AMC_DIE_MSG.format(exitcode, SERVER_OUT_FILE)) + else: + save_pid(pidJava, PID_OUT_FILE) +- print "Server PID at: " + PID_OUT_FILE +- print "Server out at: " + SERVER_OUT_FILE +- print "Server log at: " + SERVER_LOG_FILE ++ print("Server PID at: " + PID_OUT_FILE) ++ print("Server out at: " + SERVER_OUT_FILE) ++ print("Server log at: " + SERVER_LOG_FILE) + + if scmStatus is not None: + scmStatus.reportStarted() +@@ -167,7 +167,7 @@ + init_service_debug(options) + + if len(args) == 0: +- print parser.print_help() ++ print(parser.print_help()) + parser.error("No action entered") + + action = args[0] +@@ -195,7 +195,7 @@ + pass + except FatalException as e: + if e.reason is not None: +- print_error_msg("Exiting with exit code {0}. \nREASON: {1}".format(e.code, e.reason)) ++ print_error_msg("Exiting with exit code {}. \nREASON: {}".format(e.code, e.reason)) + sys.exit(e.code) + except NonFatalException as e: + options.exit_message = "Ambari Metrics Collector '%s' completed with warnings." % action +@@ -203,7 +203,7 @@ + print_warning_msg(e.reason) + + if options.exit_message is not None: +- print options.exit_message ++ print(options.exit_message) + + + if __name__ == "__main__": +diff -Naur ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-timelineservice/src/main/resources/metrics_def/AMSSMOKETESTFAKE.DAT apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-timelineservice/src/main/resources/metrics_def/AMSSMOKETESTFAKE.DAT +--- ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-timelineservice/src/main/resources/metrics_def/AMSSMOKETESTFAKE.DAT 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-timelineservice/src/main/resources/metrics_def/AMSSMOKETESTFAKE.DAT 1970-01-01 08:00:00.000000000 +0800 +@@ -1 +0,0 @@ +-AMBARI_METRICS.SmokeTest.FakeMetric +\ 文件尾没有换行符 +diff -Naur ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-timelineservice/src/main/resources/metrics_def/TIMELINE_METRIC_STORE_WATCHER.DAT apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-timelineservice/src/main/resources/metrics_def/TIMELINE_METRIC_STORE_WATCHER.DAT +--- ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-timelineservice/src/main/resources/metrics_def/TIMELINE_METRIC_STORE_WATCHER.DAT 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-timelineservice/src/main/resources/metrics_def/TIMELINE_METRIC_STORE_WATCHER.DAT 1970-01-01 08:00:00.000000000 +0800 +@@ -1 +0,0 @@ +-TimelineMetricStoreWatcher.FakeMetric +\ 文件尾没有换行符 +diff -Naur ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-timelineservice/src/main/resources/scripts/ams_query.py apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-timelineservice/src/main/resources/scripts/ams_query.py +--- ambari-release-2.7.6-origin/ambari-metrics/ambari-metrics-timelineservice/src/main/resources/scripts/ams_query.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-metrics/ambari-metrics-timelineservice/src/main/resources/scripts/ams_query.py 2022-07-11 00:52:29.000000000 +0800 +@@ -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 signal + import sys + import optparse +@@ -92,11 +92,11 @@ + (options, args) = parser.parse_args() + + if options.host is None: +- print "Ambari Metrics host name is required (--host or -h)" ++ print("Ambari Metrics host name is required (--host or -h)") + exit(-1) + + if options.node_names is None: +- print "cluster nodes are required (--nodes or -n)" ++ print("cluster nodes are required (--nodes or -n)") + exit(3) + + global start_time_secs, metrics_test_host, hostnames +@@ -121,8 +121,8 @@ + hostname = ','.join(hostnames) + qs = QuerySender(metrics_test_host, True) + for metric_name in all_metrics: +- print +- print 'Querying for ' + metric_name + ' metrics' ++ print() ++ print('Querying for ' + metric_name + ' metrics') + current_time_secs = start_time_secs + qs.query_all_app_metrics(hostname, metric_name, + all_metrics[metric_name], +@@ -136,7 +136,7 @@ + + + def print_all_metrics(metrics): +- print 'Metrics Summary' ++ print('Metrics Summary') + for app_id in sorted(metrics): + first = True + for single_query_metrics in metrics[app_id]: +@@ -147,12 +147,12 @@ + def print_app_metrics(app_id, metric_timing, header=False): + #header + if header: +- print app_id + ': ' + ','.join(sorted(metric_timing.keys())) ++ print(app_id + ': ' + ','.join(sorted(metric_timing.keys()))) + #vals +- print app_id + ':', ++ print(app_id + ':', end=' ') + for key in sorted(metric_timing): +- print '%.3f,' % metric_timing[key], +- print ++ print('%.3f,' % metric_timing[key], end=' ') ++ print() + + + class QuerySender: +@@ -163,14 +163,14 @@ + def query_all_app_metrics(self, hostname, app_id, metrics, current_time_secs): + metric_timing = {} + for key in metrics: +- print 'Getting metrics for', key ++ print('Getting metrics for', key) + query_time = time.time() + + metric_names = ','.join(metrics[key]) + self.query(hostname, app_id, metric_names, current_time_secs) + query_time_elapsed = time.time() - query_time + +- print 'Query for "%s" took %s' % (key, query_time_elapsed) ++ print('Query for "%s" took %s' % (key, query_time_elapsed)) + metric_timing[key] = query_time_elapsed + + add_query_metrics_for_app_id(app_id, metric_timing) +@@ -179,21 +179,21 @@ + + def query(self, hostname, app_id, metric_names, current_time_secs): + url = self.create_url(hostname, metric_names, app_id, current_time_secs) +- print url ++ print(url) + response = self.send(url) + if self.print_responses: +- print response ++ print(response) + pass + + def send(self, url): +- request = urllib2.Request(url) ++ request = urllib.request.Request(url) + try: +- response = urllib2.urlopen(request, timeout=int(30)) ++ response = urllib.request.urlopen(request, timeout=int(30)) + response = response.read() + return response + +- except urllib2.URLError as e: +- print e.reason ++ except urllib.error.URLError as e: ++ print(e.reason) + + def create_url(self, hostname, metric_names, app_id, current_time_secs): + server = AMS_URL.format(self.metrics_address, +diff -Naur ambari-release-2.7.6-origin/ambari-metrics/pom.xml apache-ambari-2.7.6-change/ambari-metrics/pom.xml +--- ambari-release-2.7.6-origin/ambari-metrics/pom.xml 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-metrics/pom.xml 2022-07-10 13:42:35.000000000 +0800 +@@ -40,14 +40,14 @@ + python >= 2.6 + python (>= 2.6) + +- https://archive.apache.org/dist/hbase/2.0.2/hbase-2.0.2-bin.tar.gz ++ https://repo.huaweicloud.com/apache/hbase/2.0.2/hbase-2.0.2-bin.tar.gz + hbase-2.0.2 +- https://archive.apache.org/dist/hadoop/common/hadoop-3.1.1/hadoop-3.1.1.tar.gz ++ https://repo.huaweicloud.com/apache/hadoop/common/hadoop-3.1.1/hadoop-3.1.1.tar.gz + hadoop-3.1.1 + 3.1.1 + grafana-6.7.4 + https://dl.grafana.com/oss/release/grafana-6.7.4.linux-amd64.tar.gz +- https://downloads.apache.org/phoenix/apache-phoenix-5.0.0-HBase-2.0/bin/apache-phoenix-5.0.0-HBase-2.0-bin.tar.gz ++ https://repo.huaweicloud.com/apache/phoenix/apache-phoenix-5.0.0-HBase-2.0/bin/apache-phoenix-5.0.0-HBase-2.0-bin.tar.gz + apache-phoenix-5.0.0-HBase-2.0-bin + /usr/lib/python2.6/site-packages/resource_monitoring + 1.6.2 +diff -Naur ambari-release-2.7.6-origin/ambari-server/conf/unix/create-python-wrap.sh apache-ambari-2.7.6-change/ambari-server/conf/unix/create-python-wrap.sh +--- ambari-release-2.7.6-origin/ambari-server/conf/unix/create-python-wrap.sh 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/conf/unix/create-python-wrap.sh 2022-07-13 20:27:16.000000000 +0800 +@@ -21,10 +21,10 @@ + 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/python" "/usr/bin/python3" "/usr/bin/python2" "/usr/bin/python2.6" "/usr/bin/python2.7" ) + 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 >= (2,6)))" 1>/dev/null 2>/dev/null + + if [ $? -eq 0 ] ; then + AMBARI_PYTHON="$python_binary" +@@ -37,4 +37,4 @@ + else + mkdir -p "$PYTHON_WRAPER_DIR" + ln -s "$AMBARI_PYTHON" "$PYTHON_WRAPER_TARGET" +-fi +\ 文件尾没有换行符 ++fi +diff -Naur ambari-release-2.7.6-origin/ambari-server/conf/unix/install-helper.sh apache-ambari-2.7.6-change/ambari-server/conf/unix/install-helper.sh +--- ambari-release-2.7.6-origin/ambari-server/conf/unix/install-helper.sh 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/conf/unix/install-helper.sh 2022-07-13 20:25:27.000000000 +0800 +@@ -25,7 +25,7 @@ + ACTION=$1 + + +-OLD_PYLIB_PATH="${ROOT}/usr/lib/python2.6/site-packages" ++OLD_PYLIB_PATH="${ROOT}/usr/lib/python3.9/site-packages" + OLD_PY_MODULES="ambari_commons;resource_management;ambari_jinja2;ambari_simplejson;ambari_server" + + AMBARI_SERVER_ROOT_DIR="${ROOT}/usr/lib/${AMBARI_UNIT}" +@@ -143,10 +143,10 @@ + } + + 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/python2;/usr/bin/python2.7" + + 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 >= (2,7)))" 1>>${LOG_FILE} 2>/dev/null + + if [ $? -eq 0 ]; then + echo "${python_binary}" +diff -Naur ambari-release-2.7.6-origin/ambari-server/pom.xml apache-ambari-2.7.6-change/ambari-server/pom.xml +--- ambari-release-2.7.6-origin/ambari-server/pom.xml 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/pom.xml 2022-06-24 22:29:34.000000000 +0800 +@@ -544,7 +544,11 @@ + src/main/package/rpm/postinstall.sh + utf-8 + +- ++ ++ src/main/package/rpm/install.sh ++ utf-8 ++ ++ + src/main/package/rpm/preinstall.sh + utf-8 + +@@ -590,7 +594,8 @@ + root + + +- ${project.build.directory}${dirsep}${project.artifactId}-${project.version}-dist/usr/lib/ambari-server ++ ${project.build.directory}${dirsep}${project.artifactId}-${project.version}-dist/usr/lib/ambari-server ++ x86_64 + + + +diff -Naur ambari-release-2.7.6-origin/ambari-server/sbin/ambari-server apache-ambari-2.7.6-change/ambari-server/sbin/ambari-server +--- ambari-release-2.7.6-origin/ambari-server/sbin/ambari-server 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/sbin/ambari-server 2022-07-07 18:03:22.000000000 +0800 +@@ -31,7 +31,7 @@ + # /etc/init.d/ambari-server + set -u # fail on unset variables + VERSION="${ambariFullVersion}" +-HASH="${buildNumber}" ++HASH="${VERSION}" + + case "${1:-}" in + --version) +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/package/rpm/preinstall.sh apache-ambari-2.7.6-change/ambari-server/src/main/package/rpm/preinstall.sh +--- ambari-release-2.7.6-origin/ambari-server/src/main/package/rpm/preinstall.sh 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/package/rpm/preinstall.sh 2022-06-24 22:29:35.000000000 +0800 +@@ -104,3 +104,4 @@ + } + + do_backups ++rm -rf ${usr_dir}/lib/ambari_commons/libs/ppc64le/ +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/python/ambari_server/ambariPath.py apache-ambari-2.7.6-change/ambari-server/src/main/python/ambari_server/ambariPath.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/python/ambari_server/ambariPath.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/python/ambari_server/ambariPath.py 2022-07-11 00:52:36.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + """ + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file +@@ -38,4 +38,3 @@ + #return os.path.realpath(AmbariPath.root_directory + os.sep + path) # realpath won't replace slashes for python2.6 + return re.sub('/+', '/', AmbariPath.root_directory + os.sep + path) + +- +\ 文件尾没有换行符 +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/python/ambari_server/BackupRestore.py apache-ambari-2.7.6-change/ambari-server/src/main/python/ambari_server/BackupRestore.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/python/ambari_server/BackupRestore.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/python/ambari_server/BackupRestore.py 2022-07-11 00:52:36.000000000 +0800 +@@ -61,10 +61,10 @@ + # 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) ++ print(("Zip file created at " + self.zip_folder_path + self.zipname)) + + def perform_restore(self): + """ +@@ -72,9 +72,9 @@ + :return: + """ + try: +- print("Extracting the archive " + self.zip_folder_path + self.zipname) ++ 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,8 +89,8 @@ + zf = zipfile.ZipFile(source_filename) + try: + zf.extractall(dest_dir) +- except Exception, e: +- print("A problem occurred while unzipping. Details: " + str(e)) ++ except Exception as e: ++ print(("A problem occurred while unzipping. Details: " + str(e))) + raise e + finally: + zf.close() +@@ -110,8 +110,8 @@ + for file in files: + if not file == zipname: + zipf.write(os.path.join(root, file)) +- except Exception, e: +- print("A problem occurred while unzipping. Details: " + str(e)) ++ except Exception as e: ++ print(("A problem occurred while unzipping. Details: " + str(e))) + raise e + finally: + zipf.close() +@@ -121,11 +121,11 @@ + Usage instructions + :return: + """ +- print("Usage: python BackupRestore.py [zip-folder-path|zip-file-path]\n\n" ++ print(("Usage: python BackupRestore.py [zip-folder-path|zip-file-path]\n\n" + + " processType - backup : backs up the filesystem state of the Ambari server into a zip file\n" + + " processType - restore : restores the filesystem state of the Ambari server\n" + + " [zip-folder-path] used with backup specifies the path of the folder where the zip file to be created\n" +- + " [zip-folder-path] used with restore specifies the path of the Ambari folder where the zip file to restore from is located\n") ++ + " [zip-folder-path] used with restore specifies the path of the Ambari folder where the zip file to restore from is located\n")) + + + def validate_folders(folders): +@@ -145,7 +145,7 @@ + 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 +162,7 @@ + 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]) +@@ -173,14 +173,14 @@ + + backup_restore = BackupRestore(AMBARI_FILESYSTEM_STATE, ambari_backup_zip_filename, zip_file_path) + +- print(process_type.title() + " process initiated.") ++ print((process_type.title() + " process initiated.")) + if process_type == BACKUP_PROCESS: + validate_folders(AMBARI_FILESYSTEM_STATE) + backup_restore.perform_backup() +- print(BACKUP_PROCESS.title() + " complete.") ++ print((BACKUP_PROCESS.title() + " complete.")) + if process_type == RESTORE_PROCESS: + backup_restore.perform_restore() +- print(RESTORE_PROCESS.title() + " complete.") ++ print((RESTORE_PROCESS.title() + " complete.")) + + + if __name__ == '__main__': +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/python/ambari_server/checkDatabase.py apache-ambari-2.7.6-change/ambari-server/src/main/python/ambari_server/checkDatabase.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/python/ambari_server/checkDatabase.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/python/ambari_server/checkDatabase.py 2022-07-11 00:52:36.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +@@ -80,12 +80,12 @@ + + + if retcode > 0: +- raise FatalException(int(retcode), "Database check failed to complete: {0}. \nPlease check {1} and {2} for more " ++ raise FatalException(int(retcode), "Database check failed to complete: {}. \nPlease check {} and {} 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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/python/ambari_server/dbCleanup.py apache-ambari-2.7.6-change/ambari-server/src/main/python/ambari_server/dbCleanup.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/python/ambari_server/dbCleanup.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/python/ambari_server/dbCleanup.py 2022-07-11 00:52:36.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +@@ -60,7 +60,7 @@ + if not options.silent: + db_title = get_db_type(get_ambari_properties()).title + +- confirm_backup = get_YN_input("Ambari Server configured for {0}. Confirm you have made a backup of the Ambari Server database [y/n]".format( ++ confirm_backup = get_YN_input("Ambari Server configured for {}. Confirm you have made a backup of the Ambari Server database [y/n]".format( + db_title), True) + if not confirm_backup: + print_info_msg("Ambari Server Database purge aborted") +@@ -71,7 +71,7 @@ + return 1 + + confirm = get_YN_input( +- "Ambari server is using db type {0}. Cleanable database entries older than {1} will be purged. Proceed [y/n]".format( ++ "Ambari server is using db type {}. Cleanable database entries older than {} will be purged. Proceed [y/n]".format( + db_title, options.purge_from_date), True) + if not confirm: + print_info_msg("Ambari Server Database purge aborted") +@@ -80,7 +80,7 @@ + jdk_path = get_java_exe_path() + if jdk_path is None: + print_error_msg("No JDK found, please run the \"setup\" command to install a JDK automatically or install any " +- "JDK manually to {0}".format(configDefaults.JDK_INSTALL_DIR)) ++ "JDK manually to {}".format(configDefaults.JDK_INSTALL_DIR)) + return 1 + + ensure_jdbc_driver_is_installed(options, get_ambari_properties()) +@@ -92,7 +92,7 @@ + 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 @@ + + 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 + + +@@ -147,5 +147,5 @@ + try: + datetime.datetime.strptime(options.purge_from_date, "%Y-%m-%d") + except ValueError as e: +- print_error_msg("The --from-date argument has an invalid format. {0}".format(e.args[0])) ++ print_error_msg("The --from-date argument has an invalid format. {}".format(e.args[0])) + return 1 +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/python/ambari_server/dbConfiguration_linux.py apache-ambari-2.7.6-change/ambari-server/src/main/python/ambari_server/dbConfiguration_linux.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/python/ambari_server/dbConfiguration_linux.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/python/ambari_server/dbConfiguration_linux.py 2022-07-11 00:52:36.000000000 +0800 +@@ -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 @@ + + from ambari_commons import OSCheck, OSConst + from ambari_commons.logging_utils import get_silent, get_verbose, print_error_msg, print_info_msg, print_warning_msg +-from ambari_commons.exceptions import NonFatalException, FatalException ++from ambari_commons.exceptions import NonFatalException , FatalException + from ambari_commons.os_utils import copy_files, find_in_path, is_root, remove_file, run_os_command, is_service_exist + from ambari_server.dbConfiguration import DBMSConfig, USERNAME_PATTERN, SETUP_DB_CONNECT_ATTEMPTS, \ + SETUP_DB_CONNECT_TIMEOUT, STORAGE_TYPE_LOCAL, DEFAULT_USERNAME, DEFAULT_PASSWORD +@@ -65,7 +65,7 @@ + + class LinuxDBMSConfig(DBMSConfig): + def __init__(self, options, properties, storage_type): +- super(LinuxDBMSConfig, self).__init__(options, properties, storage_type) ++ super().__init__(options, properties, storage_type) + + #Init the database configuration data here, if any + self.dbms_full_name = "" +@@ -111,7 +111,7 @@ + self.database_host = get_validated_string_input( + "Hostname (" + self.database_host + "): ", + self.database_host, +- "^[a-zA-Z0-9.\-]*$", ++ r"^[a-zA-Z0-9.\-]*$", + "Invalid hostname.", + False + ) +@@ -160,7 +160,7 @@ + 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 _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() +@@ -272,7 +272,7 @@ + # Let the console user initialize the remote database schema + def _setup_remote_db(self): + setup_msg = "Before starting Ambari Server, you must run the following DDL " \ +- "directly from the database shell to create the schema: {0}".format(self.init_script_file) ++ "directly from the database shell to create the schema: {}".format(self.init_script_file) + + print_warning_msg(setup_msg) + +@@ -347,8 +347,8 @@ + # PostgreSQL configuration and setup + class PGConfig(LinuxDBMSConfig): + # PostgreSQL settings +- SETUP_DB_CMD = [AMBARI_SUDO_BINARY, 'su', 'postgres', '-', +- '--command=psql -f {0} -v username=\'"{1}"\' -v password="\'{2}\'" -v dbname="{3}"'] ++ SETUP_DB_CMD = [AMBARI_SUDO_BINARY, 'su' , 'postgres', '-', ++ '--command=export PGPASSWORD={2} && psql -f {0} -v username=\'"{1}"\' -v password="\'{2}\'" -v dbname="{3}" --username={1} --dbname={3}'] + + EXECUTE_SCRIPT_AS_USER = [AMBARI_SUDO_BINARY, "bash", "-c", 'export PGPASSWORD={0} && psql -U {1} -f {2}'] + +@@ -361,14 +361,14 @@ + PG_SERVICE_NAME = "postgresql" + PG_HBA_DIR = None + +- if OSCheck.is_redhat_family() and OSCheck.get_os_major_version() in OSConst.systemd_redhat_os_major_versions: ++ if OSCheck.is_redhat_family(): + if os.path.isfile("/usr/bin/postgresql-setup"): + PG_INITDB_CMD = "/usr/bin/postgresql-setup initdb" + else: + versioned_script_path = glob.glob("/usr/pgsql-*/bin/postgresql*-setup") + # versioned version of psql + if versioned_script_path: +- PG_INITDB_CMD = "{0} initdb".format(versioned_script_path[0]) ++ PG_INITDB_CMD = "{} initdb".format(versioned_script_path[0]) + + psql_service_file = glob.glob("/usr/lib/systemd/system/postgresql-*.service") + if psql_service_file: +@@ -378,22 +378,22 @@ + raise FatalException(1, "Cannot find postgresql-setup script.") + + SERVICE_CMD = "/usr/bin/env systemctl" +- PG_ST_CMD = "%s status %s" % (SERVICE_CMD, PG_SERVICE_NAME) ++ PG_ST_CMD = "{} status {}".format(SERVICE_CMD, PG_SERVICE_NAME) + +- PG_START_CMD = AMBARI_SUDO_BINARY + " %s start %s" % (SERVICE_CMD, PG_SERVICE_NAME) +- PG_RESTART_CMD = AMBARI_SUDO_BINARY + " %s restart %s" % (SERVICE_CMD, PG_SERVICE_NAME) +- PG_HBA_RELOAD_CMD = AMBARI_SUDO_BINARY + " %s reload %s" % (SERVICE_CMD, PG_SERVICE_NAME) ++ PG_START_CMD = AMBARI_SUDO_BINARY + " {} start {}".format(SERVICE_CMD, PG_SERVICE_NAME) ++ PG_RESTART_CMD = AMBARI_SUDO_BINARY + " {} restart {}".format(SERVICE_CMD, PG_SERVICE_NAME) ++ PG_HBA_RELOAD_CMD = AMBARI_SUDO_BINARY + " {} reload {}".format(SERVICE_CMD, PG_SERVICE_NAME) + else: + SERVICE_CMD = "/usr/bin/env service" + if os.path.isfile("/usr/bin/postgresql-setup"): + PG_INITDB_CMD = "/usr/bin/postgresql-setup initdb" + else: +- PG_INITDB_CMD = "%s %s initdb" % (SERVICE_CMD, PG_SERVICE_NAME) ++ PG_INITDB_CMD = "{} {} initdb".format(SERVICE_CMD, PG_SERVICE_NAME) + + 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'pgsql-([0-9]+\.?[0-9]*)', path).group(1), path), versioned_script_paths) ++ versioned_script_path_tps = [(re.search(r'pgsql-([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] +@@ -403,11 +403,11 @@ + PG_HBA_DIR = "/var/lib/pgsql/%s/data" % versioned_script_path_tp[0] + break + +- PG_ST_CMD = "%s %s status" % (SERVICE_CMD, PG_SERVICE_NAME) ++ PG_ST_CMD = "{} {} status".format(SERVICE_CMD, PG_SERVICE_NAME) + +- PG_START_CMD = AMBARI_SUDO_BINARY + " %s %s start" % (SERVICE_CMD, PG_SERVICE_NAME) +- PG_RESTART_CMD = AMBARI_SUDO_BINARY + " %s %s restart" % (SERVICE_CMD, PG_SERVICE_NAME) +- PG_HBA_RELOAD_CMD = AMBARI_SUDO_BINARY + " %s %s reload" % (SERVICE_CMD, PG_SERVICE_NAME) ++ PG_START_CMD = AMBARI_SUDO_BINARY + " {} {} start".format(SERVICE_CMD, PG_SERVICE_NAME) ++ PG_RESTART_CMD = AMBARI_SUDO_BINARY + " {} {} restart".format(SERVICE_CMD, PG_SERVICE_NAME) ++ PG_HBA_RELOAD_CMD = AMBARI_SUDO_BINARY + " {} {} reload".format(SERVICE_CMD, PG_SERVICE_NAME) + + PG_HBA_CONF_FILE = None + PG_HBA_CONF_FILE_BACKUP = None +@@ -420,7 +420,7 @@ + POSTGRES_DROP_FILE = AmbariPath.get("/var/lib/ambari-server/resources/Ambari-DDL-Postgres-DROP.sql") + + def __init__(self, options, properties, storage_type): +- super(PGConfig, self).__init__(options, properties, storage_type) ++ super().__init__(options, properties, storage_type) + + #Init the database configuration data here, if any + self.dbms = "postgres" +@@ -440,7 +440,7 @@ + self.database_url_pattern_alt = "jdbc:postgresql://{0}:{1}/{2}" + + self.JDBC_DRIVER_INSTALL_MSG = 'Before starting Ambari Server, ' \ +- 'you must copy the {0} JDBC driver JAR file to {1} and set property "server.jdbc.driver.path=[path/to/custom_jdbc_driver]" in ambari.properties.'.format( ++ 'you must copy the {} JDBC driver JAR file to {} and set property "server.jdbc.driver.path=[path/to/custom_jdbc_driver]" in ambari.properties.'.format( + self.dbms_full_name, configDefaults.JAVA_SHARE_PATH) + + self._is_user_changed = False +@@ -473,12 +473,12 @@ + if is_root(): + (pg_status, retcode, out, err) = PGConfig._check_postgre_up() + if not retcode == 0: +- err = 'Unable to start PostgreSQL server. Status {0}. {1}. Exiting'.format(pg_status, err) ++ err = 'Unable to start PostgreSQL server. Status {}. {}. 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 _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 @@ + 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' +@@ -539,12 +539,12 @@ + default = "no" + + # Run automatic reset only for embedded DB +- okToRun = get_YN_input("Confirm server reset [yes/no]({0})? ".format(default), get_silent()) ++ okToRun = get_YN_input("Confirm server reset [yes/no]({})? ".format(default), get_silent()) + if not okToRun: + 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 +@@ -571,7 +571,7 @@ + raise NonFatalException(err) + + def _reset_remote_database(self): +- super(PGConfig, self)._reset_remote_database() ++ super()._reset_remote_database() + + raise NonFatalException("Please set DB password to PGPASSWORD env variable before running DDL`s!") + +@@ -598,7 +598,7 @@ + return get_validated_string_input( + "Postgres schema (" + postgres_schema + "): ", + postgres_schema, +- "^[a-zA-Z0-9_\-]*$", ++ r"^[a-zA-Z0-9_\-]*$", + "Invalid schema name.", + False, allowEmpty=True + ) +@@ -651,6 +651,7 @@ + def _get_postgre_status(): + retcode, out, err = run_os_command(PGConfig.PG_ST_CMD) + # on RHEL and SUSE PG_ST_COMD returns RC 0 for running and 3 for stoppped ++ out = str(out,encoding='utf-8') + if retcode == 0: + if out.strip() == "Running clusters:" or "active: inactive" in out.lower(): + pg_status = PGConfig.PG_STATUS_STOPPED +@@ -672,12 +673,13 @@ + 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: ++ print((PGConfig.PG_START_CMD)) + process = subprocess32.Popen(PGConfig.PG_START_CMD.split(' '), + stdout=subprocess32.PIPE, + stdin=subprocess32.PIPE, +@@ -686,7 +688,7 @@ + out, err = process.communicate() + retcode = process.returncode + +- print_info_msg("Waiting for postgres to start at port {0}...".format(PG_PORT)) ++ print_info_msg("Waiting for postgres to start at port {}...".format(PG_PORT)) + wait_for_port_opened('127.0.0.1', PG_PORT, PG_PORT_CHECK_TRIES_COUNT, PG_PORT_CHECK_INTERVAL) + + pg_status, retcode, out, err = PGConfig._get_postgre_status() +@@ -694,7 +696,7 @@ + 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,22 +735,26 @@ + :return: (code, out, err) + """ + for i in range(SETUP_DB_CONNECT_ATTEMPTS): +- print message ++ print(message) + retcode, outdata, errdata = run_os_command(command) ++ outdata = str(outdata,encoding='utf-8') ++ errdata = str(errdata,encoding='utf-8') ++ + 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_in = str(conf_file_content_in, encoding='utf-8') + conf_file_content_out = conf_file_content_in + conf_file_content_out += "\n" + conf_file_content_out += "local all " + database_username + ",mapred md5" +@@ -766,9 +772,11 @@ + 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_in = str(pg_hba_conf_file_content_in,encoding='utf-8') ++ ++ pg_hba_conf_file_content_out = re.sub(r'all\s*all', postgresString, pg_hba_conf_file_content_in) + 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(): +@@ -776,7 +784,7 @@ + postgresql_conf_file_in = sudo.read_file(PGConfig.POSTGRESQL_CONF_FILE) + postgresql_conf_file_out = re.sub('#+listen_addresses.*?(#|$)', listenAddress, postgresql_conf_file_in) + 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 +792,11 @@ + 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,7 +807,7 @@ + + @staticmethod + def _restart_postgres(): +- print "Restarting PostgreSQL" ++ print ("Restarting PostgreSQL") + process = subprocess32.Popen(PGConfig.PG_RESTART_CMD.split(' '), + stdout=subprocess32.PIPE, + stdin=subprocess32.PIPE, +@@ -819,7 +827,7 @@ + return 0, "", "" + + def _store_remote_properties(self, properties, options): +- super(PGConfig, self)._store_remote_properties(properties, options) ++ super()._store_remote_properties(properties, options) + + properties.process_pair(JDBC_POSTGRES_SCHEMA_PROPERTY, self.postgres_schema) + +@@ -870,8 +878,8 @@ + retcode, stdout, stderr = self._execute_psql_query(query, self.database_name) + if retcode != 0 or self._check_for_psql_error(stdout, stderr): + print_error_msg("Failed to get list of ambari tables. Message from psql:\n" +- " stdout:{0}\n" +- " stderr:{1}\n".format(stdout, stderr)) ++ " stdout:{}\n" ++ " stderr:{}\n".format(stdout, stderr)) + return False + for tbl in stdout.splitlines(): + tables.append(tbl) +@@ -892,7 +900,7 @@ + "\" OWNER TO \""+self.database_username+"\"", + self.database_name, False) + if retcode != 0 or "ALTER TABLE" not in stdout: +- print_error_msg("Failed to change owner of table:{0} to user:{1}".format(tbl, owner)) ++ print_error_msg("Failed to change owner of table:{} to user:{}".format(tbl, owner)) + return False + + return True +@@ -915,7 +923,7 @@ + + class OracleConfig(LinuxDBMSConfig): + def __init__(self, options, properties, storage_type): +- super(OracleConfig, self).__init__(options, properties, storage_type) ++ super().__init__(options, properties, storage_type) + + #Init the database configuration data here, if any + self.dbms = "oracle" +@@ -938,7 +946,7 @@ + self.database_url_pattern_alt = "jdbc:oracle:thin:@{0}:{1}:{2}" + + self.JDBC_DRIVER_INSTALL_MSG = 'Before starting Ambari Server, ' \ +- 'you must copy the {0} JDBC driver JAR file to {1} and set property "server.jdbc.driver.path=[path/to/custom_jdbc_driver]" in ambari.properties.'.format( ++ 'you must copy the {} JDBC driver JAR file to {} and set property "server.jdbc.driver.path=[path/to/custom_jdbc_driver]" in ambari.properties.'.format( + self.dbms_full_name, configDefaults.JAVA_SHARE_PATH) + + self.init_script_file = AmbariPath.get("/var/lib/ambari-server/resources/Ambari-DDL-Oracle-CREATE.sql'") +@@ -955,7 +963,7 @@ + # Private implementation + # + def _reset_remote_database(self): +- super(OracleConfig, self)._reset_remote_database() ++ super()._reset_remote_database() + + raise NonFatalException("Please replace '*' symbols with password before running DDL`s!") + +@@ -1032,7 +1040,7 @@ + + class MySQLConfig(LinuxDBMSConfig): + def __init__(self, options, properties, storage_type): +- super(MySQLConfig, self).__init__(options, properties, storage_type) ++ super().__init__(options, properties, storage_type) + + #Init the database configuration data here, if any + self.dbms = "mysql" +@@ -1049,7 +1057,7 @@ + self.database_url_pattern_alt = "jdbc:mysql://{0}:{1}/{2}" + + self.JDBC_DRIVER_INSTALL_MSG = 'Before starting Ambari Server, ' \ +- 'you must copy the {0} JDBC driver JAR file to {1} and set property "server.jdbc.driver.path=[path/to/custom_jdbc_driver]" in ambari.properties.'.format( ++ 'you must copy the {} JDBC driver JAR file to {} and set property "server.jdbc.driver.path=[path/to/custom_jdbc_driver]" in ambari.properties.'.format( + self.dbms_full_name, configDefaults.JAVA_SHARE_PATH) + + self.init_script_file = AmbariPath.get("/var/lib/ambari-server/resources/Ambari-DDL-MySQL-CREATE.sql") +@@ -1060,7 +1068,7 @@ + # Private implementation + # + def _reset_remote_database(self): +- super(MySQLConfig, self)._reset_remote_database() ++ super()._reset_remote_database() + + raise NonFatalException("Please replace '*' symbols with password before running DDL`s!") + +@@ -1096,7 +1104,7 @@ + # connection pooling (c3p0 used by MySQL by default) + self.jdbc_connection_pool_type = "c3p0" + +- super(MySQLConfig, self)._store_remote_properties(properties, options) ++ super()._store_remote_properties(properties, options) + + + def createMySQLConfig(options, properties, storage_type, dbId): +@@ -1105,7 +1113,7 @@ + + class MSSQLConfig(LinuxDBMSConfig): + def __init__(self, options, properties, storage_type): +- super(MSSQLConfig, self).__init__(options, properties, storage_type) ++ super().__init__(options, properties, storage_type) + + #Init the database configuration data here, if any + self.dbms = "mssql" +@@ -1122,7 +1130,7 @@ + self.database_url_pattern_alt = "jdbc:sqlserver://{0}:{1};databaseName={2}" + + self.JDBC_DRIVER_INSTALL_MSG = 'Before starting Ambari Server, ' \ +- 'you must copy the {0} JDBC driver JAR file to {1} and set property "server.jdbc.driver.path=[path/to/custom_jdbc_driver]" in ambari.properties.'.format( ++ 'you must copy the {} JDBC driver JAR file to {} and set property "server.jdbc.driver.path=[path/to/custom_jdbc_driver]" in ambari.properties.'.format( + self.dbms_full_name, configDefaults.JAVA_SHARE_PATH) + + self.init_script_file = AmbariPath.get("/var/lib/ambari-server/resources/Ambari-DDL-SQLServer-CREATE.sql") +@@ -1133,7 +1141,7 @@ + # Private implementation + # + def _reset_remote_database(self): +- super(MSSQLConfig, self)._reset_remote_database() ++ super()._reset_remote_database() + + raise NonFatalException("Please replace '*' symbols with password before running DDL`s!") + +@@ -1141,7 +1149,7 @@ + return LinuxDBMSConfig._find_jdbc_driver("*sqljdbc*.jar") + + def _get_jdbc_driver_path(self, properties): +- super(MSSQLConfig, self)._get_jdbc_driver_path(properties) ++ super()._get_jdbc_driver_path(properties) + + + def _configure_database_name(self): +@@ -1158,7 +1166,7 @@ + EXTRACT_CMD="tar xzf {0} -C {1}" + + def __init__(self, options, properties, storage_type): +- super(SQLAConfig, self).__init__(options, properties, storage_type) ++ super().__init__(options, properties, storage_type) + + #Init the database configuration data here, if any + self.dbms = "sqlanywhere" +@@ -1179,7 +1187,7 @@ + self.database_url_pattern_alt = "jdbc:sqlanywhere:eng={0};dbf={1};host={2};port={3}" + + self.JDBC_DRIVER_INSTALL_MSG = 'Before starting Ambari Server, ' \ +- 'you must copy the {0} jdbc client tarball to {1} and set property "server.jdbc.driver.path=[path/to/custom_jdbc_driver]" in ambari.properties.'.format( ++ 'you must copy the {} jdbc client tarball to {} and set property "server.jdbc.driver.path=[path/to/custom_jdbc_driver]" in ambari.properties.'.format( + self.dbms_full_name, configDefaults.SHARE_PATH) + + self.init_script_file = AmbariPath.get("/var/lib/ambari-server/resources/Ambari-DDL-SQLAnywhere-CREATE.sql") +@@ -1197,7 +1205,7 @@ + return connectionStringFormat.format(self.server_name, self.database_name, jdbc_hostname, self.database_port) + + def _reset_remote_database(self): +- super(SQLAConfig, self)._reset_remote_database() ++ super()._reset_remote_database() + + raise NonFatalException("Please replace '*' symbols with password before running DDL`s!") + +@@ -1228,7 +1236,7 @@ + :param properties: the properties object to set MySQL specific properties on + :return: + """ +- super(SQLAConfig, self)._store_remote_properties(properties, options) ++ super()._store_remote_properties(properties, options) + properties.process_pair(JDBC_SQLA_SERVER_NAME, self.server_name) + + def _extract_client_tarball(self, properties): +@@ -1267,7 +1275,7 @@ + + class BDBConfig(LinuxDBMSConfig): + def __init__(self, options, properties, storage_type): +- super(BDBConfig, self).__init__(options, properties, storage_type) ++ super().__init__(options, properties, storage_type) + + #Init the database configuration data here, if any + self.dbms = "bdb" +@@ -1288,7 +1296,7 @@ + return LinuxDBMSConfig._find_jdbc_driver("*je-*.jar") + + def _get_jdbc_driver_path(self, properties): +- super(BDBConfig, self)._get_jdbc_driver_path(properties) ++ super()._get_jdbc_driver_path(properties) + + + def _configure_database_name(self): +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/python/ambari_server/dbConfiguration.py apache-ambari-2.7.6-change/ambari-server/src/main/python/ambari_server/dbConfiguration.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/python/ambari_server/dbConfiguration.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/python/ambari_server/dbConfiguration.py 2022-07-11 00:52:36.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +@@ -40,7 +40,7 @@ + SETUP_DB_CONNECT_TIMEOUT = 5 + SETUP_DB_CONNECT_ATTEMPTS = 3 + +-USERNAME_PATTERN = "^[a-zA-Z_][a-zA-Z0-9_\-]*$" ++USERNAME_PATTERN = r"^[a-zA-Z_][a-zA-Z0-9_\-]*$" + PASSWORD_PATTERN = "^[a-zA-Z0-9_-]*$" + CUSTOM_JDBC_DB_NAMES = ["postgres", "mysql", "mssql", "oracle", "hsqldb", "sqlanywhere", "bdb"] + DATABASE_NAMES = ["postgres", "oracle", "mysql", "mssql", "sqlanywhere", "bdb"] +@@ -99,7 +99,7 @@ + # + # Database configuration base class + # +-class DBMSConfig(object): ++class DBMSConfig: + def __init__(self, options, properties, storage_type): + """ + #Just load the defaults. The derived classes will be able to modify them later +@@ -145,7 +145,7 @@ + return result + + def setup_database(self): +- print 'Configuring {0} database...'.format(self.db_title) ++ print(('Configuring {} database...'.format(self.db_title))) + + #DB setup should be done last after doing any setup. + if self._is_local_database(): +@@ -175,7 +175,7 @@ + # check driver is present by default driver path + default_driver_path = self._get_default_driver_path(properties) + if default_driver_path and os.path.isfile(default_driver_path): +- ambari_should_use_existing_default_jdbc = get_YN_input("Should ambari use existing default jdbc {0} [y/n] (y)? ".format(default_driver_path), True) ++ ambari_should_use_existing_default_jdbc = get_YN_input("Should ambari use existing default jdbc {} [y/n] (y)? ".format(default_driver_path), True) + if ambari_should_use_existing_default_jdbc: + properties.process_pair(JDBC_DRIVER_PATH_PROPERTY, default_driver_path) + update_properties(properties) +@@ -190,17 +190,17 @@ + custom_jdbc_name = os.path.basename(path_to_custom_jdbc_driver) + if not path_to_custom_jdbc_driver == os.path.join(configDefaults.JAVA_SHARE_PATH, custom_jdbc_name): + if os.path.isfile(os.path.join(configDefaults.JAVA_SHARE_PATH, custom_jdbc_name)): +- replace_jdbc_in_share_dir = get_YN_input("You already have file {0} in /usr/share/java/. Should it be replaced? [y/n] (y)? ".format(custom_jdbc_name), True) ++ replace_jdbc_in_share_dir = get_YN_input("You already have file {} in /usr/share/java/. Should it be replaced? [y/n] (y)? ".format(custom_jdbc_name), True) + 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: +- err = "Can not copy file {0} to {1} due to: {2} . Please check file " \ ++ print(("Copying {} to {}".format(path_to_custom_jdbc_driver, configDefaults.JAVA_SHARE_PATH))) ++ except Exception as e: ++ err = "Can not copy file {} to {} due to: {} . Please check file " \ + "permissions and free disk space.".format(path_to_custom_jdbc_driver, configDefaults.JAVA_SHARE_PATH, str(e)) + raise FatalException(1, err) + +@@ -232,27 +232,27 @@ + database_password = decrypt_password_for_alias(properties, JDBC_RCA_PASSWORD_ALIAS, options) + else: + if os.path.isabs(password_file) and os.path.exists(password_file): +- with open(password_file, 'r') as file: ++ with open(password_file) as file: + database_password = file.read() + return database_password + + @staticmethod + def _init_member_with_default(options, attr_name, default_val): + options_val = getattr(options, attr_name, None) +- val = options_val if options_val is not None and options_val is not "" else default_val ++ val = options_val if options_val != None and options_val != "" else default_val + return val + + @staticmethod + def _init_member_with_properties(options, attr_name, properties, property_key): + options_val = getattr(options, attr_name, None) +- if options_val is None or options_val is "": ++ if options_val == None or options_val == "": + options_val = get_value_from_properties(properties, property_key, None) + return options_val + + @staticmethod + def _init_member_with_prop_default(options, attr_name, properties, property_key, default_val): + val = DBMSConfig._init_member_with_properties(options, attr_name, properties, property_key) +- if val is None or val is "": ++ if val == None or val == "": + val = default_val + return val + +@@ -298,7 +298,7 @@ + print_error_msg(self.JDBC_DRIVER_INSTALL_MSG) + else: + print_warning_msg(self.JDBC_DRIVER_INSTALL_MSG) +- raw_input(PRESS_ENTER_MSG) ++ eval(input(PRESS_ENTER_MSG)) + result = self._is_jdbc_driver_installed(properties) + return (result, self.JDBC_DRIVER_INSTALL_MSG) + +@@ -318,7 +318,7 @@ + # + # Database configuration factory base class + # +-class DBMSConfigFactory(object): ++class DBMSConfigFactory: + def select_dbms(self, options): + ''' + # Base declaration of the DBMS selection method. +@@ -465,7 +465,7 @@ + dbms_choices = '' + for desc in self.DBMS_LIST: + if len(desc.storage_name) > 0: +- dbms_storage = " ({0})".format(desc.storage_name) ++ dbms_storage = " ({})".format(desc.storage_name) + else: + dbms_storage = "" + dbms_choice_prompt += self.DBMS_PROMPT_PATTERN.format(n_dbms, desc.dbms_name, dbms_storage) +@@ -486,7 +486,7 @@ + + dbms_index = int(database_num) - 1 + if dbms_index >= n_dbms: +- print_info_msg('Unknown db option, default to {0} {1}.'.format( ++ print_info_msg('Unknown db option, default to {} {}.'.format( + self.DBMS_LIST[0].storage_name, self.DBMS_LIST[0].dbms_name)) + dbms_index = 0 + +@@ -544,7 +544,7 @@ + def_index = self.DBMS_DICT[dbms_name + "-" + persistence_type] + except KeyError: + # Unsupported database type (e.g. local Oracle, MySQL or MSSQL) +- raise FatalException(15, "Invalid database selection: {0} {1}".format( ++ raise FatalException(15, "Invalid database selection: {} {}".format( + getattr(options, "persistence_type", ""), getattr(options, "dbms", ""))) + + return def_index +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/python/ambari_server/dbConfiguration_windows.py apache-ambari-2.7.6-change/ambari-server/src/main/python/ambari_server/dbConfiguration_windows.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/python/ambari_server/dbConfiguration_windows.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/python/ambari_server/dbConfiguration_windows.py 2022-07-11 00:52:36.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +@@ -54,7 +54,7 @@ + # + class MSSQLConfig(DBMSConfig): + def __init__(self, options, properties, storage_type): +- super(MSSQLConfig, self).__init__(options, properties, storage_type) ++ super().__init__(options, properties, storage_type) + + """ + #Just load the defaults. The derived classes will be able to modify them later +@@ -110,7 +110,7 @@ + def _prompt_db_properties(self): + if self.must_set_database_options: + #prompt for SQL Server host and instance name +- hostname_prompt = "SQL Server host and instance for the {0} database: ({1}) ".format(self.db_title, self.database_host) ++ hostname_prompt = "SQL Server host and instance for the {} database: ({}) ".format(self.db_title, self.database_host) + self.database_host = get_validated_string_input(hostname_prompt, self.database_host, None, None, False, True) + + #prompt for SQL Server authentication method +@@ -122,7 +122,7 @@ + + user_prompt = \ + "[1] - Use SQL Server integrated authentication\n[2] - Use username+password authentication\n" \ +- "Enter choice ({0}): ".format(auth_option_default) ++ "Enter choice ({}): ".format(auth_option_default) + auth_option = get_validated_string_input(user_prompt, + auth_option_default, + "^[12]$", +@@ -135,12 +135,12 @@ + else: + self.use_windows_authentication = False + +- user_prompt = "SQL Server user name for the {0} database: ({1}) ".format(self.db_title, self.database_username) ++ user_prompt = "SQL Server user name for the {} database: ({}) ".format(self.db_title, self.database_username) + username = get_validated_string_input(user_prompt, self.database_username, None, "User name", False, + False) + self.database_username = username + +- user_prompt = "SQL Server password for the {0} database: ".format(self.db_title) ++ user_prompt = "SQL Server password for the {} database: ".format(self.db_title) + password = get_validated_string_input(user_prompt, "", None, "Password", True, False) + self.database_password = password + +@@ -170,12 +170,12 @@ + pass + + def _setup_remote_database(self): +- print 'Populating the {0} database structure...'.format(self.db_title) ++ print(('Populating the {} 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 {} database structure...'.format(self.db_title))) + + self._populate_database_structure() + +@@ -198,7 +198,7 @@ + + try: + driver_path = properties[JDBC_DRIVER_PATH_PROPERTY] +- if driver_path is None or driver_path is "": ++ if driver_path == None or driver_path == "": + return 0 + except Exception: + # No such attribute set +@@ -208,7 +208,7 @@ + + def _install_jdbc_driver(self, properties, files_list): + driver_path = get_value_from_properties(properties, JDBC_DRIVER_PATH_PROPERTY, None) +- if driver_path is None or driver_path == "": ++ if driver_path == None or driver_path == "": + driver_path = self._get_jdbc_driver_path() + + properties.process_pair(JDBC_DRIVER_PATH_PROPERTY, driver_path) +@@ -253,10 +253,10 @@ + return driver_path + + def _build_sql_server_connection_string(self): +- databaseUrl = "jdbc:sqlserver://{0}".format(ensure_double_backslashes(self.database_host)) ++ databaseUrl = "jdbc:sqlserver://{}".format(ensure_double_backslashes(self.database_host)) + if self.database_port is not None and self.database_port != "": +- databaseUrl += ":{0}".format(self.database_port) +- databaseUrl += ";databaseName={0}".format(self.database_name) ++ databaseUrl += ":{}".format(self.database_port) ++ databaseUrl += ";databaseName={}".format(self.database_name) + if(self.use_windows_authentication): + databaseUrl += ";integratedSecurity=true" + #No need to append the username and password, the Ambari server adds them by itself when connecting to the database +@@ -293,10 +293,10 @@ + + @staticmethod + def _execute_db_script(databaseHost, databaseScript, minReportedSeverityLevel=10): +- dbCmd = 'sqlcmd -S {0} -b -V {1} -i {2}'.format(databaseHost, minReportedSeverityLevel, databaseScript) ++ dbCmd = 'sqlcmd -S {} -b -V {} -i {}'.format(databaseHost, minReportedSeverityLevel, databaseScript) + retCode, outData, errData = run_os_command(['cmd', '/C', dbCmd]) + if not retCode == 0: +- err = 'Running database create script failed. Error output: {0} Output: {1} Exiting.'.format(errData, outData) ++ err = 'Running database create script failed. Error output: {} Output: {} Exiting.'.format(errData, outData) + raise FatalException(retCode, err) + print_info_msg("sqlcmd output:") + print_info_msg(outData) +@@ -322,9 +322,9 @@ + JDBC_PASSWORD_FILENAME + ) + +- super(MSSQLAmbariDBConfig, self).__init__(options, properties, storage_type) ++ super().__init__(options, properties, storage_type) + +- if self.database_name is None or self.database_name is "": ++ if self.database_name == None or self.database_name == "": + self.database_name = AMBARI_DATABASE_NAME + + self.persistence_property = PERSISTENCE_TYPE_PROPERTY +@@ -339,11 +339,11 @@ + "resources" + os.path.sep + "Ambari-DDL-SQLServer-DROP.sql")) + + def _setup_remote_server(self, properties, options): +- super(MSSQLAmbariDBConfig, self)._setup_remote_server(properties, options) ++ super()._setup_remote_server(properties, options) + + properties.process_pair(JDBC_RCA_DRIVER_PROPERTY, self.driver_class_name) + properties.process_pair(JDBC_RCA_HOSTNAME_PROPERTY, ensure_double_backslashes(self.database_host)) +- if self.database_port is not None and self.database_port != "": ++ if self.database_port != None and self.database_port != "": + properties.process_pair(JDBC_RCA_PORT_PROPERTY, self.database_port) + + authKeys = MSSQLAuthenticationKeys( +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/python/ambari_server/enableStack.py apache-ambari-2.7.6-change/ambari-server/src/main/python/ambari_server/enableStack.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/python/ambari_server/enableStack.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/python/ambari_server/enableStack.py 2022-07-11 00:52:36.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/python/ambari_server/hostUpdate.py apache-ambari-2.7.6-change/ambari-server/src/main/python/ambari_server/hostUpdate.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/python/ambari_server/hostUpdate.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/python/ambari_server/hostUpdate.py 2022-07-11 00:52:36.000000000 +0800 +@@ -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 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/python/ambari_server/__init__.py apache-ambari-2.7.6-change/ambari-server/src/main/python/ambari_server/__init__.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/python/ambari_server/__init__.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/python/ambari_server/__init__.py 2022-07-11 00:52:36.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/python/ambari_server/kerberos_setup.py apache-ambari-2.7.6-change/ambari-server/src/main/python/ambari_server/kerberos_setup.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/python/ambari_server/kerberos_setup.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/python/ambari_server/kerberos_setup.py 2022-07-11 00:52:36.000000000 +0800 +@@ -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 @@ + 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 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/python/ambari_server/properties.py apache-ambari-2.7.6-change/ambari-server/src/main/python/ambari_server/properties.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/python/ambari_server/properties.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/python/ambari_server/properties.py 2022-07-11 00:52:36.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +@@ -21,6 +21,7 @@ + import os + import re + import time ++from io import IOBase + + #Apache License Header + ASF_LICENSE_HEADER = ''' +@@ -46,7 +47,7 @@ + # A Python replacement for java.util.Properties + # Based on http://code.activestate.com/recipes + # /496795-a-python-replacement-for-javautilproperties/ +-class Properties(object): ++class Properties: + def __init__(self, props=None): + self._props = {} + self._origprops = {} +@@ -87,7 +88,7 @@ + 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 +118,7 @@ + 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: +@@ -127,37 +128,37 @@ + def unescape(self, value): + newvalue = value + if not value is None: +- newvalue = value.replace('\:', ':') +- newvalue = newvalue.replace('\=', '=') ++ newvalue = value.replace(r'\:', ':') ++ newvalue = newvalue.replace(r'\=', '=') + 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 not isinstance(stream , IOBase): ++ 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() + self.__parse(lines) +- except IOError: ++ except OSError: + raise + + def get_property(self, key): + return self._props.get(key, '') + + def propertyNames(self): +- return self._props.keys() ++ return list(self._props.keys()) + + def getPropertyDict(self): + return self._props +@@ -174,7 +175,7 @@ + + 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 +@@ -182,7 +183,7 @@ + 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 + +@@ -192,7 +193,7 @@ + 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'))) +@@ -200,10 +201,10 @@ + 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 prop, val in self._origprops.items(): ++ for prop, val in list(self._origprops.items()): + if val is not None: + out.write(''.join((prop, '=', val, '\n'))) +- except IOError: ++ except OSError: + raise + finally: + if out: +@@ -213,7 +214,7 @@ + """ 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'))) +@@ -221,10 +222,10 @@ + 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'))) + out.close() +- except IOError: ++ except OSError: + raise +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/python/ambari_server/resourceFilesKeeper.py apache-ambari-2.7.6-change/ambari-server/src/main/python/ambari_server/resourceFilesKeeper.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/python/ambari_server/resourceFilesKeeper.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/python/ambari_server/resourceFilesKeeper.py 2022-07-11 00:52:36.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +@@ -84,7 +84,7 @@ + + def _update_resources_subdir_archive(self, subdir): + archive_root = os.path.join(self.resources_dir, subdir) +- self.dbg_out("Updating archive for {0} dir at {1}...".format(subdir, archive_root)) ++ self.dbg_out("Updating archive for {} dir at {}...".format(subdir, archive_root)) + + # update the directories so that the .hash is generated + self.update_directory_archive(archive_root) +@@ -94,25 +94,25 @@ + Please see AMBARI-4481 for more details + """ + # archive stacks +- self.dbg_out("Updating archives for stack dirs at {0}...".format(self.stacks_root)) ++ self.dbg_out("Updating archives for stack dirs at {}...".format(self.stacks_root)) + valid_stacks = self.list_stacks(self.stacks_root) +- self.dbg_out("Stacks: {0}".format(pprint.pformat(valid_stacks))) ++ self.dbg_out("Stacks: {}".format(pprint.pformat(valid_stacks))) + # Iterate over stack directories + self._iter_update_directory_archive(valid_stacks) + + # archive common services + common_services_root = os.path.join(self.resources_dir, self.COMMON_SERVICES_DIR) +- self.dbg_out("Updating archives for common services dirs at {0}...".format(common_services_root)) ++ self.dbg_out("Updating archives for common services dirs at {}...".format(common_services_root)) + valid_common_services = self.list_common_services(common_services_root) +- self.dbg_out("Common Services: {0}".format(pprint.pformat(valid_common_services))) ++ self.dbg_out("Common Services: {}".format(pprint.pformat(valid_common_services))) + # Iterate over common services directories + self._iter_update_directory_archive(valid_common_services) + + # archive extensions + extensions_root = os.path.join(self.resources_dir, self.EXTENSIONS_DIR) +- self.dbg_out("Updating archives for extensions dirs at {0}...".format(extensions_root)) ++ self.dbg_out("Updating archives for extensions dirs at {}...".format(extensions_root)) + valid_extensions = self.list_extensions(extensions_root) +- self.dbg_out("Extensions: {0}".format(pprint.pformat(valid_extensions))) ++ self.dbg_out("Extensions: {}".format(pprint.pformat(valid_extensions))) + # Iterate over extension directories + self._iter_update_directory_archive(valid_extensions) + +@@ -131,7 +131,7 @@ + + def _list_metainfo_dirs(self, root_dir): + valid_items = [] # Format: +- glob_pattern = "{0}/*/*".format(root_dir) ++ glob_pattern = "{}/*/*".format(root_dir) + dirs = glob.glob(glob_pattern) + for directory in dirs: + metainfo_file = os.path.join(directory, self.METAINFO_XML) +@@ -145,8 +145,8 @@ + """ + try: + return self._list_metainfo_dirs(root_dir) +- except Exception, err: +- raise KeeperException("Can not list stacks: {0}".format(str(err))) ++ except Exception as err: ++ raise KeeperException("Can not list stacks: {}".format(str(err))) + + def list_common_services(self, root_dir): + """ +@@ -154,8 +154,8 @@ + """ + try: + return self._list_metainfo_dirs(root_dir) +- except Exception, err: +- raise KeeperException("Can not list common services: {0}".format(str(err))) ++ except Exception as err: ++ raise KeeperException("Can not list common services: {}".format(str(err))) + + def list_extensions(self, root_dir): + """ +@@ -163,8 +163,8 @@ + """ + try: + return self._list_metainfo_dirs(root_dir) +- except Exception, err: +- raise KeeperException("Can not list extensions: {0}".format(str(err))) ++ except Exception as err: ++ raise KeeperException("Can not list extensions: {}".format(str(err))) + + def update_directory_archive(self, directory): + """ +@@ -185,7 +185,7 @@ + self.zip_directory(directory, skip_empty_directory) + # Skip generation of .hash file is directory is empty + if (skip_empty_directory and (not os.path.exists(directory) or not os.listdir(directory))): +- self.dbg_out("Empty directory. Skipping generation of hash file for {0}".format(directory)) ++ self.dbg_out("Empty directory. Skipping generation of hash file for {}".format(directory)) + else: + self.write_hash_sum(directory, cur_hash) + pass +@@ -209,7 +209,7 @@ + file_list.append(full_path) + file_list.sort() + for path in file_list: +- self.dbg_out("Counting hash of {0}".format(path)) ++ self.dbg_out("Counting hash of {}".format(path)) + with open(path, 'rb') as fh: + while True: + data = fh.read(self.BUFFER) +@@ -217,9 +217,9 @@ + 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))) ++ "hash: {}".format(str(err))) + + + def read_hash_sum(self, directory): +@@ -232,8 +232,8 @@ + try: + with open(hash_file) as fh: + return fh.readline().strip() +- except Exception, err: +- raise KeeperException("Can not read file {0} : {1}".format(hash_file, ++ except Exception as err: ++ raise KeeperException("Can not read file {} : {}".format(hash_file, + str(err))) + else: + return None +@@ -249,8 +249,8 @@ + with open(hash_file, "w") as fh: + fh.write(new_hash) + os.chmod(hash_file, 0o644) +- except Exception, err: +- raise KeeperException("Can not write to file {0} : {1}".format(hash_file, ++ except Exception as err: ++ raise KeeperException("Can not write to file {} : {}".format(hash_file, + str(err))) + + def zip_directory(self, directory, skip_if_empty = False): +@@ -258,11 +258,11 @@ + Packs entire directory into zip file. Hash file is also packaged + into archive + """ +- self.dbg_out("creating archive for directory {0}".format(directory)) ++ self.dbg_out("creating archive for directory {}".format(directory)) + try: + if skip_if_empty: + if not os.path.exists(directory) or not os.listdir(directory): +- self.dbg_out("Empty directory. Skipping archive creation for {0}".format(directory)) ++ self.dbg_out("Empty directory. Skipping archive creation for {}".format(directory)) + return + + zip_file_path = os.path.join(directory, self.ARCHIVE_NAME) +@@ -274,14 +274,14 @@ + if not self.is_ignored(filename): + absname = os.path.abspath(os.path.join(root, filename)) + arcname = absname[len(abs_src) + 1:] +- self.dbg_out('zipping %s as %s' % (os.path.join(root, filename), ++ self.dbg_out('zipping {} as {}'.format(os.path.join(root, filename), + arcname)) + 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))) ++ "directory {} : {}".format(directory, str(err))) + + + def is_ignored(self, filename): +@@ -294,9 +294,9 @@ + + def dbg_out(self, text): + if self.DEBUG: +- sys.stderr.write("{0}\n".format(text)) ++ sys.stderr.write("{}\n".format(text)) + if not self.DEBUG and self.verbose: +- print text ++ print(text) + + + def main(argv=None): +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/python/ambari_server/serverClassPath.py apache-ambari-2.7.6-change/ambari-server/src/main/python/ambari_server/serverClassPath.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/python/ambari_server/serverClassPath.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/python/ambari_server/serverClassPath.py 2022-07-11 00:52:36.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/python/ambari_server/serverConfiguration.py apache-ambari-2.7.6-change/ambari-server/src/main/python/ambari_server/serverConfiguration.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/python/ambari_server/serverConfiguration.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/python/ambari_server/serverConfiguration.py 2022-07-11 00:52:36.000000000 +0800 +@@ -1,22 +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 +-distributed with this work for additional information +-regarding copyright ownership. The ASF licenses this file +-to you under the Apache License, Version 2.0 (the +-"License"); you may not use this file except in compliance +-with the License. You may obtain a copy of the License at +- +- http://www.apache.org/licenses/LICENSE-2.0 +- +-Unless required by applicable law or agreed to in writing, software +-distributed under the License is distributed on an "AS IS" BASIS, +-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-See the License for the specific language governing permissions and +-limitations under the License. +-''' + + import datetime + import glob +@@ -233,18 +216,18 @@ + return conf_dir + except KeyError: + default_conf_dir = AmbariPath.get("/etc/ambari-server/conf") +- print_info_msg("{0} is not set, using default {1}".format(AMBARI_CONF_VAR, default_conf_dir)) ++ print_info_msg("{} is not set, using default {}".format(AMBARI_CONF_VAR, default_conf_dir)) + return default_conf_dir + + def find_properties_file(): + conf_file = search_file(AMBARI_PROPERTIES_FILE, get_conf_dir()) + if conf_file is None: +- err = 'File %s not found in search path $%s: %s' % (AMBARI_PROPERTIES_FILE, ++ err = 'File {} not found in search path ${}: {}'.format(AMBARI_PROPERTIES_FILE, + AMBARI_CONF_VAR, get_conf_dir()) + print_error_msg (err) + raise FatalException(1, err) + else: +- print_info_msg('Loading properties from {0}'.format(conf_file)) ++ print_info_msg('Loading properties from {}'.format(conf_file)) + return conf_file + + # Load ambari properties and return dict with values +@@ -258,8 +241,8 @@ + properties = Properties() + with open(conf_file) as hfR: + properties.load(hfR) +- except (Exception), e: +- print_error_msg ('Could not read "%s": %s' % (conf_file, str(e))) ++ except (Exception) as e: ++ print_error_msg ('Could not read "{}": {}'.format(conf_file, str(e))) + return -1 + + # Try to replace $ROOT with the value from the OS environment. +@@ -272,19 +255,19 @@ + else: + root = '' + +- for k,v in properties.iteritems(): ++ for k,v in list(properties.items()): + properties.__dict__[k] = v.replace("$ROOT", root) + properties._props[k] = v.replace("$ROOT", root) +- except (Exception), 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): ++class ServerDatabaseType: + internal = 0 + remote = 1 + + +-class ServerDatabaseEntry(object): ++class ServerDatabaseEntry: + def __init__(self, name, title, db_type, aliases=None): + """ + :type name str +@@ -327,7 +310,7 @@ + raise RuntimeError("Not compatible type") + + +-class ServerDatabases(object): ++class ServerDatabases: + postgres = ServerDatabaseEntry("postgres", "Postgres", ServerDatabaseType.remote) + oracle = ServerDatabaseEntry("oracle", "Oracle", ServerDatabaseType.remote) + mysql = ServerDatabaseEntry("mysql", "MySQL", ServerDatabaseType.remote) +@@ -361,7 +344,7 @@ + + return None + +-class ServerConfigDefaults(object): ++class ServerConfigDefaults: + def __init__(self): + properties = get_ambari_properties() + if properties == -1: +@@ -439,18 +422,18 @@ + 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))) ++ print_error_msg("Could not create {}. Reason: {}".format(directory, str(ex))) + + if not os.path.isdir(directory) or not os.access(directory, os.W_OK): +- raise FatalException(-1, "Unable to access {0} directory. Confirm the directory is created and is writable by Ambari Server user account '{1}'".format(directory, getpass.getuser())) ++ raise FatalException(-1, "Unable to access {} directory. Confirm the directory is created and is writable by Ambari Server user account '{}'".format(directory, getpass.getuser())) + + @OsFamilyImpl(os_family=OSConst.WINSRV_FAMILY) + class ServerConfigDefaultsWindows(ServerConfigDefaults): + def __init__(self): +- super(ServerConfigDefaultsWindows, self).__init__() ++ super().__init__() + self.JDK_INSTALL_DIR = "C:\\" + self.JDK_SEARCH_PATTERN = "j[2se|dk|re]*" + self.JAVA_EXE_SUBPATH = "bin\\java.exe" +@@ -509,7 +492,7 @@ + @OsFamilyImpl(os_family=OsFamilyImpl.DEFAULT) + class ServerConfigDefaultsLinux(ServerConfigDefaults): + def __init__(self): +- super(ServerConfigDefaultsLinux, self).__init__() ++ super().__init__() + # JDK + self.JDK_INSTALL_DIR = AmbariPath.get("/usr/jdk64") + self.JDK_SEARCH_PATTERN = "jdk*" +@@ -732,14 +715,14 @@ + + # Copy file to /tmp and save with file.# (largest # is latest file) + def backup_file_in_temp(filePath): +- if filePath is not None: ++ if filePath != None: + tmpDir = tempfile.gettempdir() + back_up_file_count = len(glob.glob1(tmpDir, AMBARI_PROPERTIES_FILE + "*")) + try: + shutil.copyfile(filePath, tmpDir + os.sep + + AMBARI_PROPERTIES_FILE + "." + str(back_up_file_count + 1)) +- except (Exception), e: +- print_error_msg('Could not backup file in temp "%s": %s' % ( ++ except (Exception) as e: ++ print_error_msg('Could not backup file in temp "{}": {}'.format( + back_up_file_count, str(e))) + return 0 + +@@ -752,7 +735,7 @@ + try: + server_version_file_path = properties[SERVER_VERSION_FILE_PATH] + if server_version_file_path and os.path.exists(server_version_file_path): +- with open(server_version_file_path, 'r') as file: ++ with open(server_version_file_path) as file: + version = file.read().strip() + except: + print_error_msg("Error getting ambari version") +@@ -802,7 +785,7 @@ + + 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": +@@ -840,14 +823,14 @@ + if properties == -1: + err = "Error getting ambari properties" + raise FatalException(-1, err) +- print_warning_msg("{0} property isn't set in {1} . Setting it to default value - {2}".format(JDBC_DATABASE_NAME_PROPERTY, AMBARI_PROPERTIES_FILE, configDefaults.DEFAULT_DB_NAME)) ++ print_warning_msg("{} property isn't set in {} . Setting it to default value - {}".format(JDBC_DATABASE_NAME_PROPERTY, AMBARI_PROPERTIES_FILE, configDefaults.DEFAULT_DB_NAME)) + properties.process_pair(JDBC_DATABASE_NAME_PROPERTY, configDefaults.DEFAULT_DB_NAME) + conf_file = find_properties_file() + try: + with open(conf_file, "w") as hfW: + properties.store(hfW) +- except Exception, e: +- err = 'Could not write ambari config file "%s": %s' % (conf_file, e) ++ except Exception as e: ++ err = 'Could not write ambari config file "{}": {}'.format(conf_file, e) + raise FatalException(-1, err) + + +@@ -877,10 +860,10 @@ + + + def is_alias_string(passwdStr): +- regex = re.compile("\$\{alias=[\w\.]+\}") ++ regex = re.compile(r"\$\{alias=[\w\.]+\}") + # Match implies string at beginning of word + r = regex.match(passwdStr) +- if r is not None: ++ if r != None: + return True + else: + return False +@@ -897,7 +880,7 @@ + if jdk_path is None: + print_error_msg("No JDK found, please run the \"setup\" " + "command to install a JDK automatically or install any " +- "JDK manually to {0}".format(configDefaults.JDK_INSTALL_DIR)) ++ "JDK manually to {}".format(configDefaults.JDK_INSTALL_DIR)) + return 1 + + tempFileName = "ambari.passwd" +@@ -908,20 +891,20 @@ + with open(tempFilePath, 'w+'): + os.chmod(tempFilePath, stat.S_IREAD | stat.S_IWRITE) + +- if options is not None and hasattr(options, 'master_key') and options.master_key is not None and options.master_key: ++ if options != None and hasattr(options, 'master_key') and options.master_key != None and options.master_key: + masterKey = options.master_key +- if masterKey is None or masterKey == "": ++ if masterKey == None or masterKey == "": + masterKey = "None" + + serverClassPath = ambari_server.serverClassPath.ServerClassPath(get_ambari_properties(), None) + command = SECURITY_PROVIDER_GET_CMD.format(get_java_exe_path(), + serverClassPath.get_full_ambari_classpath_escaped_for_shell(), alias, tempFilePath, masterKey) + (retcode, stdout, stderr) = run_os_command(command) +- print_info_msg("Return code from credential provider get passwd: {0}".format(str(retcode))) ++ print_info_msg("Return code from credential provider get passwd: {}".format(str(retcode))) + if retcode != 0: +- print_error_msg ('ERROR: Unable to read password from store. alias = {0}'.format(alias)) ++ print_error_msg ('ERROR: Unable to read password from store. alias = {}'.format(alias)) + else: +- with open(tempFilePath, 'r') as hfRTemp: ++ with open(tempFilePath) as hfRTemp: + passwd = hfRTemp.read() + # Remove temporary file + os.remove(tempFilePath) +@@ -947,7 +930,7 @@ + if jdk_path is None: + print_error_msg("No JDK found, please run the \"setup\" " + "command to install a JDK automatically or install any " +- "JDK manually to {0}".format(configDefaults.JDK_INSTALL_DIR)) ++ "JDK manually to {}".format(configDefaults.JDK_INSTALL_DIR)) + return 1 + + if masterKey is None or masterKey == "": +@@ -957,7 +940,7 @@ + command = SECURITY_PROVIDER_PUT_CMD.format(get_java_exe_path(), + serverClassPath.get_full_ambari_classpath_escaped_for_shell(), alias, passwd, masterKey) + (retcode, stdout, stderr) = run_os_command(command) +- print_info_msg("Return code from credential provider save passwd: {0}".format(str(retcode))) ++ print_info_msg("Return code from credential provider save passwd: {}".format(str(retcode))) + return retcode + else: + print_error_msg("Alias or password is unreadable.") +@@ -988,8 +971,8 @@ + if os.path.exists(passFilePath): + try: + os.remove(passFilePath) +- except Exception, e: +- print_warning_msg('Unable to remove password file: {0}'.format(str(e))) ++ except Exception as e: ++ print_warning_msg('Unable to remove password file: {}'.format(str(e))) + return 1 + pass + return 0 +@@ -1037,16 +1020,16 @@ + + # Decrypt alias with master to validate it, if no master return + password = None +- if alias and env_master_key and env_master_key is not "" and env_master_key != "None": ++ if alias and env_master_key and env_master_key != "" and env_master_key != "None": + password = read_passwd_for_alias(alias, env_master_key, options) + if not password: + try: +- if options is not None and hasattr(options, 'master_key') and options.master_key is not None and options.master_key: ++ if options != None and hasattr(options, 'master_key') and options.master_key != None and options.master_key: + masterKey = options.master_key +- if masterKey is None or masterKey == "": ++ if masterKey == None or masterKey == "": + masterKey = get_validated_string_input('Enter current Master Key: ', + "", ".*", "", True, False) +- if options is not None: ++ if options != None: + options.master_key = masterKey + except KeyboardInterrupt: + print_warning_msg('Exiting...') +@@ -1055,7 +1038,7 @@ + password = read_passwd_for_alias(alias, masterKey, options) + if not password: + masterKey = None +- if options is not None: ++ if options != None: + options.master_key = None + print_error_msg ("ERROR: Master key does not match") + +@@ -1099,7 +1082,7 @@ + return 0 + + def is_jaas_keytab_exists(conf_file): +- with open(conf_file, "r") as f: ++ with open(conf_file) as f: + lines = f.read() + + match = re.search("keyTab=(.*)$", lines, re.MULTILINE) +@@ -1127,7 +1110,7 @@ + os.rename(prev_conf_file, conf_file) + print_warning_msg("Original file %s kept" % AMBARI_KRB_JAAS_LOGIN_FILE) + except OSError as e: +- print_error_msg ("Couldn't move %s file: %s" % (prev_conf_file, str(e))) ++ print_error_msg ("Couldn't move {} file: {}".format(prev_conf_file, str(e))) + return -1 + + return 0 +@@ -1137,18 +1120,18 @@ + env_file = search_file(AMBARI_ENV_FILE, configDefaults.DEFAULT_VLIBS_DIR) + + # 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) ++ if (not prev_env_file) or (prev_env_file == 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))) + return 0 + + try: +- if env_file is not None: ++ if env_file != 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))) ++ print_error_msg ( "Couldn't move {} file: {}".format(prev_env_file, str(e))) + return -1 + + return 0 +@@ -1159,7 +1142,7 @@ + err = "Error getting ambari properties" + raise FatalException(-1, err) + +- if not rewrite and key in properties.keys(): ++ if not rewrite and key in list(properties.keys()): + return + + properties.process_pair(key, value) +@@ -1174,7 +1157,7 @@ + raise FatalException(-1, err) + + +- if GPL_LICENSE_ACCEPTED_PROPERTY in properties.keys() and properties.get_property(GPL_LICENSE_ACCEPTED_PROPERTY).lower() == "true": ++ if GPL_LICENSE_ACCEPTED_PROPERTY in list(properties.keys()) and properties.get_property(GPL_LICENSE_ACCEPTED_PROPERTY).lower() == "true": + return True + + result = get_YN_input(text, default_prompt_value) +@@ -1200,8 +1183,8 @@ + try: + old_properties = Properties() + old_properties.load(hfOld) +- except Exception, e: +- print_error_msg ('Could not read "%s": %s' % (prev_conf_file, str(e))) ++ except Exception as e: ++ print_error_msg ('Could not read "{}": {}'.format(prev_conf_file, str(e))) + return -1 + + try: +@@ -1209,7 +1192,7 @@ + with open(conf_file) as hfNew: + new_properties.load(hfNew) + +- for prop_key, prop_value in old_properties.getPropertyDict().items(): ++ for prop_key, prop_value in list(old_properties.getPropertyDict().items()): + prop_value = prop_value.replace("/usr/lib/python2.6/site-packages", "/usr/lib/ambari-server/lib") + if "agent.fqdn.service.url" == prop_key: + # what is agent.fqdn property in ambari.props? +@@ -1225,7 +1208,7 @@ + # Adding custom user name property if it is absent + # In previous versions without custom user support server was started as + # "root" anyway so it's a reasonable default +- if NR_USER_PROPERTY not in new_properties.keys(): ++ if NR_USER_PROPERTY not in list(new_properties.keys()): + new_properties.process_pair(NR_USER_PROPERTY, "root") + + # update the os. In case os detection routine changed +@@ -1234,8 +1217,8 @@ + with open(conf_file, 'w') as hfW: + new_properties.store(hfW) + +- except Exception, e: +- print_error_msg ('Could not write "%s": %s' % (conf_file, str(e))) ++ except Exception as e: ++ print_error_msg ('Could not write "{}": {}'.format(conf_file, str(e))) + return -1 + + timestamp = datetime.datetime.now() +@@ -1243,8 +1226,8 @@ + new_conf_file = prev_conf_file + '.' + timestamp.strftime(fmt) + try: + os.rename(prev_conf_file, new_conf_file) +- except Exception, e: +- print_error_msg ('Could not rename "%s" to "%s": %s' % (prev_conf_file, new_conf_file, str(e))) ++ except Exception as e: ++ print_error_msg ('Could not rename "{}" to "{}": {}'.format(prev_conf_file, new_conf_file, str(e))) + #Not critical, move on + + return 0 +@@ -1254,21 +1237,21 @@ + def update_properties(propertyMap): + conf_file = search_file(AMBARI_PROPERTIES_FILE, get_conf_dir()) + backup_file_in_temp(conf_file) +- if propertyMap is not None and conf_file is not None: ++ if propertyMap != None and conf_file != None: + properties = Properties() + try: +- with open(conf_file, 'r') as file: ++ with open(conf_file) as file: + properties.load(file) +- except (Exception), e: +- print_error_msg('Could not read "%s": %s' % (conf_file, e)) ++ except (Exception) as e: ++ print_error_msg('Could not read "{}": {}'.format(conf_file, e)) + return -1 + +- for key in propertyMap.keys(): ++ for key in list(propertyMap.keys()): + properties.removeOldProp(key) + properties.process_pair(key, str(propertyMap[key])) + +- for key in properties.keys(): +- if not propertyMap.has_key(key): ++ for key in list(properties.keys()): ++ if key not in propertyMap._keymap: + properties.removeOldProp(key) + + with open(conf_file, 'w') as file: +@@ -1279,9 +1262,9 @@ + def update_properties_2(properties, propertyMap): + conf_file = search_file(AMBARI_PROPERTIES_FILE, get_conf_dir()) + backup_file_in_temp(conf_file) +- if conf_file is not None: +- if propertyMap is not None: +- for key in propertyMap.keys(): ++ if conf_file != None: ++ if propertyMap != None: ++ for key in list(propertyMap.keys()): + properties.removeOldProp(key) + properties.process_pair(key, str(propertyMap[key])) + pass +@@ -1295,17 +1278,17 @@ + conf_file = find_properties_file() + properties = Properties() + try: +- with open(conf_file, "r") as hfR: ++ with open(conf_file) as hfR: + properties.load(hfR) +- except Exception, e: +- print_error_msg('Could not read ambari config file "%s": %s' % (conf_file, e)) ++ except Exception as e: ++ print_error_msg('Could not read ambari config file "{}": {}'.format(conf_file, e)) + return -1 + properties.process_pair(key, value) + try: + with open(conf_file, 'w') as hfW: + properties.store(hfW) +- except Exception, e: +- print_error_msg('Could not write ambari config file "%s": %s' % (conf_file, e)) ++ except Exception as e: ++ print_error_msg('Could not write ambari config file "{}": {}'.format(conf_file, e)) + return -1 + return 0 + +@@ -1352,31 +1335,31 @@ + inst_dir = "" + + def __init__(self, i_name, i_desc, i_url, i_dest_file, i_jcpol_url, i_dest_jcpol_file, i_inst_dir, i_reg_exp): +- if i_name is None or i_name is "": ++ if i_name == None or i_name == "": + raise FatalException(-1, "Invalid JDK name: " + (i_desc or "")) + self.name = i_name +- if i_desc is None or i_desc is "": ++ if i_desc == None or i_desc == "": + self.desc = self.name + else: + self.desc = i_desc +- if i_url is None or i_url is "": ++ if i_url == None or i_url == "": + raise FatalException(-1, "Invalid URL for JDK " + i_name) + self.url = i_url +- if i_dest_file is None or i_dest_file is "": ++ if i_dest_file == None or i_dest_file == "": + self.dest_file = i_name + ".exe" + else: + self.dest_file = i_dest_file +- if not (i_jcpol_url is None or i_jcpol_url is ""): ++ if not (i_jcpol_url == None or i_jcpol_url == ""): + self.jcpol_url = i_jcpol_url +- if i_dest_jcpol_file is None or i_dest_jcpol_file is "": ++ if i_dest_jcpol_file == None or i_dest_jcpol_file == "": + self.dest_jcpol_file = "jcpol-" + i_name + ".zip" + else: + self.dest_jcpol_file = i_dest_jcpol_file +- if i_inst_dir is None or i_inst_dir is "": ++ if i_inst_dir == None or i_inst_dir == "": + self.inst_dir = os.path.join(configDefaults.JDK_INSTALL_DIR, i_desc) + else: + self.inst_dir = i_inst_dir +- if i_reg_exp is None or i_reg_exp is "": ++ if i_reg_exp == None or i_reg_exp == "": + raise FatalException(-1, "Invalid output parsing regular expression for JDK " + i_name) + self.reg_exp = i_reg_exp + +@@ -1388,31 +1371,31 @@ + + @staticmethod + 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 section_name == None or section_name == "": ++ raise FatalException(-1, "Invalid properties section: " + ("(empty)" if section_name == None else "")) ++ if(section_name + ".desc" in properties): #Not critical + desc = properties[section_name + ".desc"] + else: + desc = section_name +- if not properties.has_key(section_name + ".url"): ++ if section_name + ".url" not in properties: + 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 section_name + ".re" not in properties: + 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(section_name + ".dest-file" in properties): #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(section_name + ".jcpol-url" in properties): #Not critical + jcpol_url = properties[section_name + ".jcpol-url"] + else: + jcpol_url = None +- if(properties.has_key(section_name + ".jcpol-file")): #Not critical ++ if(section_name + ".jcpol-file" in properties): #Not critical + jcpol_file = properties[section_name + ".jcpol-file"] + else: + jcpol_file = None +- if(properties.has_key(section_name + ".home")): #Not critical ++ if(section_name + ".home" in properties): #Not critical + inst_dir = properties[section_name + ".home"] + else: + inst_dir = "C:\\" + section_name +@@ -1451,20 +1434,20 @@ + if jdkPath: + if validate_jdk(jdkPath): + return jdkPath +- print("INFO: Looking for available JDKs at {0}".format(configDefaults.JDK_INSTALL_DIR)) ++ print(("INFO: Looking for available JDKs at {}".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) +- print_info_msg("Found: {0}".format(str(jdks))) ++ print_info_msg("Found: {}".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 {}".format(jdkPath))) + if validate_jdk(jdkPath): +- print "INFO: Selected JDK {0}".format(jdkPath) ++ print(("INFO: Selected JDK {}".format(jdkPath))) + return jdkPath + else: +- print_error_msg ("JDK {0} is invalid".format(jdkPath)) ++ print_error_msg ("JDK {} is invalid".format(jdkPath)) + return + + def get_java_exe_path(): +@@ -1484,7 +1467,7 @@ + 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 + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/python/ambari_server/serverSetup.py apache-ambari-2.7.6-change/ambari-server/src/main/python/ambari_server/serverSetup.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/python/ambari_server/serverSetup.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/python/ambari_server/serverSetup.py 2022-07-11 00:52:36.000000000 +0800 +@@ -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 @@ + JDK_PROMPT = "[{0}] {1}\n" + JDK_VALID_CHOICES = "^[{0}{1:d}]$" + +-JDK_VERSION_CHECK_CMD = """{0} -version 2>&1 | grep -i version | sed 's/.*version ".*\.\(.*\)\..*"/\\1/; 1q' 2>&1""" ++JDK_VERSION_CHECK_CMD = """{0} -version 2>&1 | grep -i version | sed 's/.*version ".*\\.\\(.*\\)\\..*"/\\1/; 1q' 2>&1""" + + def get_supported_jdbc_drivers(): + factory = DBMSConfigFactory() +@@ -104,9 +104,9 @@ + 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 @@ + 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 +@@ -145,8 +145,8 @@ + 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 + "'" ++ se_status = re.search('(disabled|enabled)', str(out,encoding='utf-8')).group(0) ++ print(("SELinux status is '" + se_status + "'")) + if se_status == SE_STATUS_DISABLED: + return 0 + else: +@@ -155,9 +155,9 @@ + except AttributeError: + err = "Error determining SELinux mode. Exiting." + raise FatalException(1, err) +- print "SELinux mode is '" + se_mode + "'" ++ print(("SELinux mode is '" + 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.") +@@ -166,7 +166,7 @@ + raise FatalException(1, None) + return 0 + except OSError: +- print_warning_msg("Could not run {0}: OK".format(GET_SE_LINUX_ST_CMD)) ++ print_warning_msg("Could not run {}: OK".format(GET_SE_LINUX_ST_CMD)) + return 0 + + +@@ -179,7 +179,7 @@ + + @OsFamilyFuncImpl(OsFamilyImpl.DEFAULT) + def disable_security_enhancements(): +- print 'Checking SELinux...' ++ print('Checking SELinux...') + err = '' + retcode = check_selinux() + if not retcode == 0: +@@ -191,7 +191,7 @@ + # User account creation + # + +-class AmbariUserChecks(object): ++class AmbariUserChecks: + def __init__(self): + self.NR_USER_CHANGE_PROMPT = "" + self.NR_USER_CUSTOMIZE_PROMPT = "" +@@ -240,7 +240,7 @@ + @OsFamilyImpl(os_family=OSConst.WINSRV_FAMILY) + class AmbariUserChecksWindows(AmbariUserChecks): + def __init__(self, options): +- super(AmbariUserChecksWindows, self).__init__() ++ super().__init__() + + self.NR_USER_CHANGE_PROMPT = "Ambari-server service is configured to run under user '{0}'. Change this setting [y/n] ({1})? " + self.NR_USER_CUSTOMIZE_PROMPT = "Customize user account for ambari-server service [y/n] ({0})? " +@@ -252,7 +252,7 @@ + + def _create_custom_user(self): + user = get_validated_string_input( +- "Enter user account for ambari-server service ({0}):".format(self.user), ++ "Enter user account for ambari-server service ({}):".format(self.user), + self.user, None, + "Invalid username.", + False +@@ -264,23 +264,23 @@ + if get_silent(): + password = self.password + else: +- password = get_validated_string_input("Enter password for user {0}:".format(user), "", None, "Password", True, False) ++ password = get_validated_string_input("Enter password for user {}:".format(user), "", None, "Password", True, False) + + from ambari_commons.os_windows import UserHelper + + uh = UserHelper(user) + + if uh.find_user(): +- print_info_msg("User {0} already exists, make sure that you typed correct password for user, " ++ print_info_msg("User {} already exists, make sure that you typed correct password for user, " + "skipping user creation".format(user)) + else: + status, message = uh.create_user(password) + if status == UserHelper.USER_EXISTS: +- print_info_msg("User {0} already exists, make sure that you typed correct password for user, " ++ print_info_msg("User {} already exists, make sure that you typed correct password for user, " + "skipping user creation".format(user)) + + elif status == UserHelper.ACTION_FAILED: # fail +- print_warning_msg("Can't create user {0}. Failed with message {1}".format(user, message)) ++ print_warning_msg("Can't create user {}. Failed with message {}".format(user, message)) + return UserHelper.ACTION_FAILED + + self.password = password +@@ -289,16 +289,16 @@ + #This is unconditional + status, message = uh.add_user_privilege('SeServiceLogonRight') + if status == UserHelper.ACTION_FAILED: +- print_warning_msg("Can't add SeServiceLogonRight to user {0}. Failed with message {1}".format(user, message)) ++ print_warning_msg("Can't add SeServiceLogonRight to user {}. Failed with message {}".format(user, message)) + return UserHelper.ACTION_FAILED + + status, message = uh.add_user_privilege('SeBatchLogonRight') + if status == UserHelper.ACTION_FAILED: +- print_warning_msg("Can't add SeBatchLogonRight to user {0}. Failed with message {1}".format(user, message)) ++ print_warning_msg("Can't add SeBatchLogonRight to user {}. Failed with message {}".format(user, message)) + return UserHelper.ACTION_FAILED + + print_info_msg("User configuration is done.") +- print_warning_msg("When using non SYSTEM user make sure that your user has read\write access to log directories and " ++ print_warning_msg(r"When using non SYSTEM user make sure that your user has read\write access to log directories and " + "all server directories. In case of integrated authentication for SQL Server make sure that your " + "user is properly configured to access the ambari database.") + +@@ -311,7 +311,7 @@ + @OsFamilyImpl(os_family=OsFamilyImpl.DEFAULT) + class AmbariUserChecksLinux(AmbariUserChecks): + def __init__(self, options): +- super(AmbariUserChecksLinux, self).__init__() ++ super().__init__() + + self.NR_USER_CHANGE_PROMPT = "Ambari-server daemon is configured to run under user '{0}'. Change this setting [y/n] ({1})? " + self.NR_USER_CUSTOMIZE_PROMPT = "Customize user account for ambari-server daemon [y/n] ({0})? " +@@ -322,23 +322,23 @@ + + def _create_custom_user(self): + user = get_validated_string_input( +- "Enter user account for ambari-server daemon ({0}):".format(self.user), ++ "Enter user account for ambari-server daemon ({}):".format(self.user), + self.user, + "^[a-z_][a-z0-9_-]{1,31}$", + "Invalid username.", + False + ) + +- print_info_msg("Trying to create user {0}".format(user)) ++ print_info_msg("Trying to create user {}".format(user)) + command = self.NR_USERADD_CMD.format(user, self.NR_USER_COMMENT) + retcode, out, err = run_os_command(command) + if retcode == 9: # 9 = username already in use +- print_info_msg("User {0} already exists, " ++ print_info_msg("User {} already exists, " + "skipping user creation".format(user)) + + elif retcode != 0: # fail +- print_warning_msg("Can't create user {0}. Command {1} " +- "finished with {2}: \n{3}".format(user, command, retcode, err)) ++ print_warning_msg("Can't create user {}. Command {} " ++ "finished with {}: \n{}".format(user, command, retcode, err)) + return retcode + + print_info_msg("User configuration is done.") +@@ -381,7 +381,7 @@ + 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 + +@@ -395,7 +395,7 @@ + # ## JDK ### + # + +-class JDKSetup(object): ++class JDKSetup: + def __init__(self): + self.JDK_DEFAULT_CONFIGS = [] + +@@ -439,7 +439,7 @@ + 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) +@@ -490,7 +490,7 @@ + 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) +@@ -518,12 +518,12 @@ + + dest_file = os.path.abspath(os.path.join(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 {}.".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) " +@@ -535,18 +535,18 @@ + "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 + ". " +@@ -558,14 +558,14 @@ + 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) +@@ -593,23 +593,23 @@ + + 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)) ++ print_error_msg("\nREASON: {}".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)) ++ print_error_msg("\nREASON: {}".format(e.reason)) + # TODO: We don't fail installation if _download_jce_policy fails. Is it OK? + + @staticmethod +@@ -628,13 +628,13 @@ + 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 JDK_RELEASES in properties: + 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) +@@ -656,17 +656,17 @@ + return jdks, jdk_choice_prompt, jdk_valid_choices, n_config - 1 + + def _download_jdk(self, jdk_url, dest_file, progress_func = None): +- jdk_download_fail_msg = " Failed to download JDK: {0}. Please check that the " \ +- "JDK is available at {1}. Also you may specify JDK file " \ ++ jdk_download_fail_msg = " Failed to download JDK: {}. Please check that the " \ ++ "JDK is available at {}. Also you may specify JDK file " \ + "location in local filesystem using --jdk-location command " \ + "line argument.".format("{0}", jdk_url) + 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) + +@@ -676,22 +676,22 @@ + + 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: +@@ -711,7 +711,7 @@ + @OsFamilyImpl(os_family=OSConst.WINSRV_FAMILY) + class JDKSetupWindows(JDKSetup): + def __init__(self): +- super(JDKSetupWindows, self).__init__() ++ super().__init__() + self.JDK_DEFAULT_CONFIGS = [ + JDKRelease("jdk7.67", "Oracle JDK 1.7.67", + "http://public-repo-1.hortonworks.com/ARTIFACTS/jdk-7u67-windows-x64.exe", "jdk-7u67-windows-x64.exe", +@@ -727,7 +727,7 @@ + + 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 {}".format(jdk_inst_dir))) + + if not os.path.exists(jdk_inst_dir): + os.makedirs(jdk_inst_dir) +@@ -754,27 +754,27 @@ + + if retcode == 1603: + # JDK already installed +- print "JDK already installed in {0}".format(jdk_inst_dir) ++ print(("JDK already installed in {}".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 {}".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)) ++ retcode, out, err = run_os_command("SETX {} {} /M".format(JAVA_HOME, java_home_dir_unesc)) + if retcode != 0: + print_warning_msg("SETX output: " + out) + print_warning_msg("SETX error output: " + err) +- err = "Setting JAVA_HOME failed. Exit code={0}".format(retcode) ++ err = "Setting JAVA_HOME failed. Exit code={}".format(retcode) + raise FatalException(1, err) + + os.environ[JAVA_HOME] = java_home_dir +@@ -782,7 +782,7 @@ + @OsFamilyImpl(os_family=OsFamilyImpl.DEFAULT) + class JDKSetupLinux(JDKSetup): + def __init__(self): +- super(JDKSetupLinux, self).__init__() ++ super().__init__() + self.JDK_DEFAULT_CONFIGS = [ + JDKRelease("jdk1.8", "Oracle JDK 1.8 + Java Cryptography Extension (JCE) Policy Files 8", + "http://public-repo-1.hortonworks.com/ARTIFACTS/jdk-8u112-linux-x64.tar.gz", "jdk-8u112-linux-x64.tar.gz", +@@ -806,7 +806,7 @@ + + 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 {}".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)) +@@ -829,7 +829,7 @@ + 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 {}".format(jdk_inst_dir))) + return (retcode, out, java_home_dir) + + def _ensure_java_home_env_var_is_set(self, java_home_dir): +@@ -855,7 +855,7 @@ + (stdoutdata, stderrdata) = process.communicate() + + if process.returncode != 0: +- print_warning_msg("Failed to change jce permissions. {0}\n{1}".format(stderrdata, stdoutdata)) ++ print_warning_msg("Failed to change jce permissions. {}\n{}".format(stderrdata, stdoutdata)) + + def download_and_install_jdk(options): + properties = get_ambari_properties() +@@ -917,11 +917,11 @@ + + def proceedJDBCProperties(args): + if not os.path.isfile(args.jdbc_driver): +- err = "File {0} does not exist!".format(args.jdbc_driver) ++ err = "File {} does not exist!".format(args.jdbc_driver) + raise FatalException(1, err) + + if args.jdbc_db not in JDBC_DB_OPTION_VALUES: +- err = "Unsupported database name {0}. Please see help for more information.".format(args.jdbc_db) ++ err = "Unsupported database name {}. Please see help for more information.".format(args.jdbc_db) + raise FatalException(1, err) + + _cache_jdbc_driver(args) +@@ -961,9 +961,9 @@ + + try: + shutil.copy(args.jdbc_driver, dest) +- print "Copying {0} to {1}".format(args.jdbc_driver, dest) +- except Exception, e: +- err = "Cannot copy file {0} to {1} due to: {2} . Please check file " \ ++ print(("Copying {} to {}".format(args.jdbc_driver, dest))) ++ except Exception as e: ++ err = "Cannot copy file {} to {} due to: {} . Please check file " \ + "permissions and free disk space.".format(args.jdbc_driver, dest, str(e)) + raise FatalException(1, err) + +@@ -972,17 +972,17 @@ + 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: +- err = "Cannot create symlink {0} to {1} due to: {2} . Please check file " \ ++ print(("Creating symlink {} to {}".format(dest, symlink_name))) ++ except Exception as e: ++ err = "Cannot create symlink {} to {} due to: {} . 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 +@@ -999,7 +999,7 @@ + else: + ok = True + +- print 'Configuring database...' ++ print('Configuring database...') + + options.must_set_database_options = ok + options.database_index = factory.select_dbms(options) +@@ -1024,8 +1024,8 @@ + 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() +@@ -1053,7 +1053,7 @@ + if persistence_type == "remote": + err = 'Ambari doesn\'t support resetting exernal DB automatically. ' \ + 'To reset Ambari Server schema you must first drop and then create it ' \ +- 'using DDL scripts from "{0}"'.format(AmbariPath.get("/var/lib/ambari-server/resources/")) ++ 'using DDL scripts from "{}"'.format(AmbariPath.get("/var/lib/ambari-server/resources/")) + raise FatalException(1, err) + else: + factory = DBMSConfigFactory() +@@ -1119,10 +1119,10 @@ + try: + f.close() + except Exception as e: +- err = "Fail during the extraction of {0}.".format(jce_zip_path) ++ err = "Fail during the extraction of {}.".format(jce_zip_path) + raise FatalException(1, err) + else: +- err = "The path {0} or {1} is invalid.".format(jdk_security_path, jce_zip_path) ++ err = "The path {} or {} is invalid.".format(jdk_security_path, jce_zip_path) + raise FatalException(1, err) + + if unziped_jce_path: +@@ -1151,7 +1151,7 @@ + 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) +@@ -1160,7 +1160,7 @@ + + 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): +@@ -1177,30 +1177,30 @@ + err = 'Failed to create user. Exiting.' + raise FatalException(retcode, err) + +- print configDefaults.MESSAGE_CHECK_FIREWALL ++ print((configDefaults.MESSAGE_CHECK_FIREWALL)) + check_firewall() + + # proceed jdbc properties if they were set + if _check_jdbc_options(options): + proceedJDBCProperties(options) + +- 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) ++ err = 'Downloading or installing JDK failed: {}. 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. +@@ -1210,7 +1210,7 @@ + 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' +@@ -1218,12 +1218,12 @@ + + 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 {}, 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) +@@ -1236,7 +1236,7 @@ + def setup_jce_policy(args): + logger.info("Setup JCE policy for ambari-server.") + if not os.path.exists(args[1]): +- err = "Can not run 'setup-jce'. Invalid path {0}.".format(args[1]) ++ err = "Can not run 'setup-jce'. Invalid path {}.".format(args[1]) + raise FatalException(1, err) + + properties = get_ambari_properties() +@@ -1249,7 +1249,7 @@ + try: + shutil.copy(args[1], resources_dir) + except Exception as e: +- err = "Fail while trying to copy {0} to {1}. {2}".format(args[1], resources_dir, e) ++ err = "Fail while trying to copy {} to {}. {}".format(args[1], resources_dir, e) + raise FatalException(1, err) + + jdk_path = properties.get_property(JAVA_HOME_PROPERTY) +@@ -1260,17 +1260,17 @@ + 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: +- err = 'Installing JCE failed: {0}. Exiting.'.format(e) ++ err = 'Installing JCE failed: {}. Exiting.'.format(e) + raise FatalException(e.code, err) + + 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): + """ +@@ -1278,7 +1278,7 @@ + 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, +@@ -1293,19 +1293,19 @@ + raise FatalException(process.returncode, err) + else: + actual_jdk_version = int(out) +- print 'JDK version found: {0}'.format(actual_jdk_version) ++ print(('JDK version found: {}'.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 {} 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 {} 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) ++ err = 'Running java version check command failed: {}. Exiting.'.format(e) + raise FatalException(e.code, err) + except Exception as e: +- err = 'Running java version check command failed: {0}. Exiting.'.format(e) ++ err = 'Running java version check command failed: {}. Exiting.'.format(e) + raise FatalException(1, err) + + return result +@@ -1335,7 +1335,7 @@ + "You will be required to re-configure the Ambari server " + "and re-run the cluster wizard. \n" + "Are you SURE you want to perform the reset " +- "[yes/no] ({0})? ".format(default), get_silent()) ++ "[yes/no] ({})? ".format(default), get_silent()) + okToRun = choice + if not okToRun: + err = "Ambari Server 'reset' cancelled" +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/python/ambari_server/serverUpgrade.py apache-ambari-2.7.6-change/ambari-server/src/main/python/ambari_server/serverUpgrade.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/python/ambari_server/serverUpgrade.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/python/ambari_server/serverUpgrade.py 2022-07-11 00:52:36.000000000 +0800 +@@ -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 +@@ -163,17 +163,17 @@ + + check_gpl_license_approved(upgrade_response) + +- print_info_msg("Return code from schema upgrade command, retcode = {0}".format(str(retcode)), True) ++ print_info_msg("Return code from schema upgrade command, retcode = {}".format(str(retcode)), True) + 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 @@ + + 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) +@@ -207,16 +207,16 @@ + + custom_actions_dir_path = os.path.join(resources_dir, 'custom_actions') + custom_actions_scripts_dir_path = os.path.join(custom_actions_dir_path, 'scripts') +- print_info_msg('Moving *.py files from %s to %s' % (custom_actions_dir_path, custom_actions_scripts_dir_path)) ++ print_info_msg('Moving *.py files from {} to {}'.format(custom_actions_dir_path, custom_actions_scripts_dir_path)) + + try: + for custom_action_file_name in os.listdir(custom_actions_dir_path): + custom_action_file_path = os.path.join(custom_actions_dir_path, custom_action_file_name) + if os.path.isfile(custom_action_file_path) and custom_action_file_path.endswith('.py'): +- print_info_msg('Moving %s to %s' % (custom_action_file_path, custom_actions_scripts_dir_path)) ++ print_info_msg('Moving {} to {}'.format(custom_action_file_path, custom_actions_scripts_dir_path)) + shutil.move(custom_action_file_path, custom_actions_scripts_dir_path) + except (OSError, shutil.Error) as e: +- err = 'Upgrade failed. Can not move *.py files from %s to %s. ' % (custom_actions_dir_path, custom_actions_scripts_dir_path) + str(e) ++ err = 'Upgrade failed. Can not move *.py files from {} to {}. '.format(custom_actions_dir_path, custom_actions_scripts_dir_path) + str(e) + print_error_msg(err) + raise FatalException(1, err) + +@@ -225,13 +225,13 @@ + if not is_root(): + err = configDefaults.MESSAGE_ERROR_UPGRADE_NOT_ROOT + raise FatalException(4, err) +- print_info_msg('Updating Ambari Server properties in {0} ...'.format(AMBARI_PROPERTIES_FILE), True) ++ print_info_msg('Updating Ambari Server properties in {} ...'.format(AMBARI_PROPERTIES_FILE), True) + retcode = update_ambari_properties() + if not retcode == 0: + err = AMBARI_PROPERTIES_FILE + ' file can\'t be updated. Exiting' + raise FatalException(retcode, err) + +- print_info_msg('Updating Ambari Server properties in {0} ...'.format(AMBARI_ENV_FILE), True) ++ print_info_msg('Updating Ambari Server properties in {} ...'.format(AMBARI_ENV_FILE), True) + retcode = update_ambari_env() + if not retcode == 0: + err = AMBARI_ENV_FILE + ' file can\'t be updated. Exiting' +@@ -241,7 +241,7 @@ + if retcode == -2: + pass # no changes done, let's be silent + elif retcode == 0: +- print_info_msg("File {0} updated.".format(AMBARI_KRB_JAAS_LOGIN_FILE), True) ++ print_info_msg("File {} updated.".format(AMBARI_KRB_JAAS_LOGIN_FILE), True) + elif not retcode == 0: + err = AMBARI_KRB_JAAS_LOGIN_FILE + ' file can\'t be updated. Exiting' + raise FatalException(retcode, err) +@@ -261,7 +261,7 @@ + + retcode = run_schema_upgrade(args) + if not retcode == 0: +- print_error_msg("Ambari server upgrade failed. Please look at {0}, for more details.".format(configDefaults.SERVER_LOG_FILE)) ++ print_error_msg("Ambari server upgrade failed. Please look at {}, for more details.".format(configDefaults.SERVER_LOG_FILE)) + raise FatalException(11, 'Schema upgrade failed.') + + user = read_ambari_user() +@@ -318,12 +318,12 @@ + + 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 {}, 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): +@@ -370,9 +370,9 @@ + raise FatalException(1, "Failed to read properties file.") + + 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) ++ url = base_url + "clusters/{}/stack_versions".format(finalize_options.cluster_name) ++ admin_auth = base64.encodestring('{}:{}'.format(admin_login, admin_password)).replace('\n', '') ++ request = urllib.request.Request(url) + request.add_header('Authorization', 'Basic %s' % admin_auth) + request.add_header('X-Requested-By', 'ambari') + +@@ -391,11 +391,11 @@ + 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( ++ err = 'Error during setting current version. Http status code - {}. \n {}'.format( + code, content) + raise FatalException(1, err) + except Exception as e: +@@ -419,7 +419,7 @@ + + 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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/python/ambari_server/serverUtils.py apache-ambari-2.7.6-change/ambari-server/src/main/python/ambari_server/serverUtils.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/python/ambari_server/serverUtils.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/python/ambari_server/serverUtils.py 2022-07-11 00:52:36.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +@@ -21,11 +21,11 @@ + import os + import socket + import ssl +-import urllib2 ++import urllib.request, urllib.error, urllib.parse + from contextlib import closing + + import time +-from ambari_commons.exceptions import FatalException, NonFatalException ++from ambari_commons.exceptions import FatalException as NonFatalException + from ambari_commons.logging_utils import get_verbose, print_info_msg, get_debug_mode + from ambari_commons.os_check import OSConst + from ambari_commons.os_family_impl import OsFamilyFuncImpl, OsFamilyImpl +@@ -51,14 +51,14 @@ + + if os.path.exists(pid_file_path): + try: +- f = open(pid_file_path, "r") +- except IOError, ex: ++ f = open(pid_file_path) ++ except OSError as ex: + raise FatalException(1, str(ex)) + + pid = f.readline().strip() + + if not pid.isdigit(): +- err = "'%s' is incorrect PID value. %s is corrupt. Removing" % (pid, pid_file_path) ++ err = "'{}' is incorrect PID value. {} is corrupt. Removing".format(pid, pid_file_path) + f.close() + run_os_command("rm -f " + pid_file_path) + raise NonFatalException(err) +@@ -110,11 +110,11 @@ + 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 {}...".format(resources_location, ++ verbose=get_verbose()))) + resource_files_keeper.perform_housekeeping() +- except KeeperException, ex: +- msg = "Can not organize resource files at {0}: {1}".format( ++ except KeeperException as ex: ++ msg = "Can not organize resource files at {}: {}".format( + resources_location, str(ex)) + raise FatalException(-1, msg) + +@@ -143,7 +143,7 @@ + api_port_prop = properties.get_property(SSL_API_PORT) + if api_port_prop is not None: + api_port = api_port_prop +- return '{0}://{1}:{2!s}/api/v1/'.format(api_protocol, api_host, api_port) ++ return '{}://{}:{!s}/api/v1/'.format(api_protocol, api_host, api_port) + + + def get_ambari_admin_username_password_pair(options): +@@ -193,15 +193,15 @@ + :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.encodestring('{}:{}'.format(admin_login, admin_password)).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 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.encodestring('{}:{}'.format(admin_login, admin_password)).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.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( +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/python/ambari_server/setupActions.py apache-ambari-2.7.6-change/ambari-server/src/main/python/ambari_server/setupActions.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/python/ambari_server/setupActions.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/python/ambari_server/setupActions.py 2022-07-11 00:52:36.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/python/ambari_server/setupHttps.py apache-ambari-2.7.6-change/ambari-server/src/main/python/ambari_server/setupHttps.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/python/ambari_server/setupHttps.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/python/ambari_server/setupHttps.py 2022-07-11 00:52:36.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +@@ -26,8 +26,8 @@ + import string + import datetime + import tempfile +-import urllib2 +-from ambari_commons.exceptions import FatalException, NonFatalException ++import urllib.request, urllib.error, urllib.parse ++from ambari_commons.exceptions import FatalException as 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 + from ambari_server.serverConfiguration import get_ambari_properties, find_properties_file, read_ambari_user, \ +@@ -89,7 +89,7 @@ + + while not truststore_path: + truststore_path = get_validated_string_input( +- "Path to TrustStore file {0}:".format(get_prompt_default(SSL_TRUSTSTORE_PATH_DEFAULT)), ++ "Path to TrustStore file {}:".format(get_prompt_default(SSL_TRUSTSTORE_PATH_DEFAULT)), + SSL_TRUSTSTORE_PATH_DEFAULT, ".*", False, False, answer = options.trust_store_path) + + if truststore_path: +@@ -102,7 +102,7 @@ + if not truststore_type: + SSL_TRUSTSTORE_TYPE_DEFAULT = get_value_from_properties(properties, SSL_TRUSTSTORE_TYPE_PROPERTY, "jks") + truststore_type = get_validated_string_input( +- "TrustStore type [jks/jceks/pkcs12] {0}:".format(get_prompt_default(SSL_TRUSTSTORE_TYPE_DEFAULT)), ++ "TrustStore type [jks/jceks/pkcs12] {}:".format(get_prompt_default(SSL_TRUSTSTORE_TYPE_DEFAULT)), + SSL_TRUSTSTORE_TYPE_DEFAULT, "^(jks|jceks|pkcs12)?$", "Wrong type", False, answer = options.trust_store_type) + + if truststore_type: +@@ -166,7 +166,7 @@ + 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 @@ + 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 @@ + 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 @@ + 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 @@ + 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 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_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 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 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 @@ + 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 @@ + 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 @@ + 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 @@ + + 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 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/python/ambari_server/setupMpacks.py apache-ambari-2.7.6-change/ambari-server/src/main/python/ambari_server/setupMpacks.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/python/ambari_server/setupMpacks.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/python/ambari_server/setupMpacks.py 2022-07-11 00:52:36.000000000 +0800 +@@ -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 @@ + return _list + + dict.__init__(self, _dict) +- for key, value in self.iteritems(): ++ for key, value in list(self.items()): + if isinstance(value, dict): + self[key] = _named_dict(value) + if isinstance(value, list): +@@ -116,7 +116,7 @@ + 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): +@@ -130,7 +130,7 @@ + archive_filename = os.path.basename(mpack_path) + tmp_archive_path = os.path.join(tmpdir, archive_filename) + +- print_info_msg("Download management pack to temp location {0}".format(tmp_archive_path)) ++ print_info_msg("Download management pack to temp location {}".format(tmp_archive_path)) + if os.path.exists(tmp_archive_path): + os.remove(tmp_archive_path) + if os.path.exists(mpack_path): +@@ -155,7 +155,7 @@ + + # Expand management pack in temp directory + tmp_root_dir = os.path.join(tmpdir, archive_root_dir) +- print_info_msg("Expand management pack at temp location {0}".format(tmp_root_dir)) ++ print_info_msg("Expand management pack at temp location {}".format(tmp_root_dir)) + if os.path.exists(tmp_root_dir): + sudo.rmtree(tmp_root_dir) + +@@ -179,7 +179,7 @@ + print_error_msg("Malformed management pack. Metadata file missing!") + return None + +- mpack_metadata = _named_dict(json.load(open(mpack_metafile, "r"))) ++ mpack_metadata = _named_dict(json.load(open(mpack_metafile))) + return mpack_metadata + + def get_mpack_properties(): +@@ -221,7 +221,7 @@ + # Read mpack metadata + mpack_metadata = read_mpack_metadata(tmp_root_dir) + if not mpack_metadata: +- raise FatalException(-1, 'Malformed management pack {0}. Metadata file missing!'.format(mpack_path)) ++ raise FatalException(-1, 'Malformed management pack {}. Metadata file missing!'.format(mpack_path)) + + return (mpack_metadata.name, mpack_metadata.version) + +@@ -269,12 +269,12 @@ + for name in files: + file = os.path.join(root, name) + if os.path.islink(file) and staged_mpack_dir in os.path.realpath(file): +- print_info_msg("Removing symlink {0}".format(file)) ++ print_info_msg("Removing symlink {}".format(file)) + sudo.unlink(file) + for name in dirs: + dir = os.path.join(root, name) + if os.path.islink(dir) and staged_mpack_dir in os.path.realpath(dir): +- print_info_msg("Removing symlink {0}".format(dir)) ++ print_info_msg("Removing symlink {}".format(dir)) + sudo.unlink(dir) + + def run_mpack_install_checker(options, mpack_stacks): +@@ -332,8 +332,8 @@ + mpack_stacks.append(stack_name) + if not mpack_stacks: + # Don't purge stacks accidentally when installing add-on mpacks +- err = "The management pack you are attempting to install does not contain {0}. Since this management pack " \ +- "does not contain a stack, the --purge option with --purge-list={1} would cause your existing Ambari " \ ++ err = "The management pack you are attempting to install does not contain {}. Since this management pack " \ ++ "does not contain a stack, the --purge option with --purge-list={} would cause your existing Ambari " \ + "installation to be unusable. Due to that we cannot install this management pack.".format( + RESOURCE_FRIENDLY_NAMES[STACK_DEFINITIONS_RESOURCE_NAME], purge_list) + print_error_msg(err) +@@ -346,9 +346,9 @@ + 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) +- warn_msg = "CAUTION: You have specified the --purge option with --purge-list={0}. " \ +- "This will replace all existing {1} currently installed.\n" \ ++ purge_resources = {(v) for k, v in list(RESOURCE_FRIENDLY_NAMES.items()) if k in purge_list} ++ warn_msg = "CAUTION: You have specified the --purge option with --purge-list={}. " \ ++ "This will replace all existing {} currently installed.\n" \ + "Are you absolutely sure you want to perform the purge [yes/no]? (no)".format( + purge_list, ", ".join(purge_resources)) + okToPurge = get_YN_input(warn_msg, False) +@@ -390,7 +390,7 @@ + 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): + """ +@@ -409,7 +409,7 @@ + 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) +@@ -417,13 +417,13 @@ + 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) +@@ -451,7 +451,7 @@ + dest_grafana_dashboards_dir = os.path.join(dashboard_location, GRAFANA_DASHBOARDS_DIRNAME) + dest_service_dashboards_link = os.path.join(dest_grafana_dashboards_dir, service_name) + if os.path.exists(dest_service_dashboards_link): +- message = "Grafana dashboards already exist for service {0}.".format(service_name) ++ message = "Grafana dashboards already exist for service {}.".format(service_name) + print_warning_msg(message) + else: + create_symlink_using_path(src_grafana_dashboards_dir, dest_service_dashboards_link, options.force) +@@ -461,7 +461,7 @@ + if os.path.exists(src_metrics_file): + dest_metrics_dir = os.path.join(dashboard_location, SERVICE_METRICS_DIRNAME) + if os.path.exists(os.path.join(dest_metrics_dir, service_metrics_filename)): +- message = "Service metrics already exist for service {0}.".format(service_name) ++ message = "Service metrics already exist for service {}.".format(service_name) + print_warning_msg(message) + else: + create_symlink(src_metrics_dir, dest_metrics_dir, service_metrics_filename, options.force) +@@ -480,7 +480,7 @@ + # 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 +@@ -489,7 +489,7 @@ + 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) +@@ -513,7 +513,7 @@ + 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) +@@ -551,7 +551,7 @@ + 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) +@@ -577,7 +577,7 @@ + if os.path.isdir(staged_mpack_dir): + staged_mpack_metadata = read_mpack_metadata(staged_mpack_dir) + if not staged_mpack_metadata: +- print_error_msg("Skipping malformed management pack in directory {0}.".format(staged_mpack_dir)) ++ print_error_msg("Skipping malformed management pack in directory {}.".format(staged_mpack_dir)) + continue + staged_mpack_name = staged_mpack_metadata.name + staged_mpack_version = staged_mpack_metadata.version +@@ -603,7 +603,7 @@ + :param mpack_name: Management pack name + :param mpack_version: Management pack version + """ +- print_info_msg("Uninstalling management pack {0}-{1}".format(mpack_name, mpack_version)) ++ print_info_msg("Uninstalling management pack {}-{}".format(mpack_name, mpack_version)) + # Get ambari mpack properties + stack_location, extension_location, service_definitions_location, mpacks_staging_location, dashboard_location = get_mpack_properties() + found = False +@@ -616,21 +616,21 @@ + if os.path.isdir(staged_mpack_dir): + staged_mpack_metadata = read_mpack_metadata(staged_mpack_dir) + if not staged_mpack_metadata: +- print_error_msg("Skipping malformed management pack {0}-{1}. Metadata file missing!".format( ++ print_error_msg("Skipping malformed management pack {}-{}. Metadata file missing!".format( + staged_mpack_name, staged_mpack_version)) + continue + staged_mpack_name = staged_mpack_metadata.name + staged_mpack_version = staged_mpack_metadata.version + if mpack_name == staged_mpack_name and compare_versions(staged_mpack_version, mpack_version, format=True) == 0: +- print_info_msg("Removing management pack staging location {0}".format(staged_mpack_dir)) ++ print_info_msg("Removing management pack staging location {}".format(staged_mpack_dir)) + sudo.rmtree(staged_mpack_dir) + remove_symlinks(stack_location, extension_location, service_definitions_location, dashboard_location, staged_mpack_dir) + found = True + break + if not found: +- print_error_msg("Management pack {0}-{1} is not installed!".format(mpack_name, mpack_version)) ++ print_error_msg("Management pack {}-{} is not installed!".format(mpack_name, mpack_version)) + else: +- print_info_msg("Management pack {0}-{1} successfully uninstalled!".format(mpack_name, mpack_version)) ++ print_info_msg("Management pack {}-{} successfully uninstalled!".format(mpack_name, mpack_version)) + + def validate_mpack_prerequisites(mpack_metadata): + """ +@@ -650,14 +650,14 @@ + if "min_ambari_version" in mpack_prerequisites: + min_ambari_version = mpack_prerequisites.min_ambari_version + if(compare_versions(min_ambari_version, current_ambari_version, format=True) > 0): +- print_error_msg("Prerequisite failure! Current Ambari Version = {0}, " +- "Min Ambari Version = {1}".format(current_ambari_version, min_ambari_version)) ++ print_error_msg("Prerequisite failure! Current Ambari Version = {}, " ++ "Min Ambari Version = {}".format(current_ambari_version, min_ambari_version)) + fail = True + if "max_ambari_version" in mpack_prerequisites: + max_ambari_version = mpack_prerequisites.max_ambari_version + if(compare_versions(max_ambari_version, current_ambari_version, format=True) < 0): +- print_error_msg("Prerequisite failure! Current Ambari Version = {0}, " +- "Max Ambari Version = {1}".format(current_ambari_version, max_ambari_version)) ++ print_error_msg("Prerequisite failure! Current Ambari Version = {}, " ++ "Max Ambari Version = {}".format(current_ambari_version, max_ambari_version)) + if "min_stack_versions" in mpack_prerequisites: + min_stack_versions = mpack_prerequisites.min_stack_versions + stack_found = False +@@ -673,7 +673,7 @@ + fail = True + + if fail: +- raise FatalException(-1, "Prerequisites for management pack {0}-{1} failed!".format( ++ raise FatalException(-1, "Prerequisites for management pack {}-{} failed!".format( + mpack_metadata.name, mpack_metadata.version)) + + def _install_mpack(options, replay_mode=False, is_upgrade=False): +@@ -688,7 +688,7 @@ + print_error_msg("Management pack not specified!") + raise FatalException(-1, 'Management pack not specified!') + +- print_info_msg("Installing management pack {0}".format(mpack_path)) ++ print_info_msg("Installing management pack {}".format(mpack_path)) + + # Download management pack to a temp location + tmp_archive_path = download_mpack(mpack_path) +@@ -702,7 +702,7 @@ + # Read mpack metadata + mpack_metadata = read_mpack_metadata(tmp_root_dir) + if not mpack_metadata: +- raise FatalException(-1, 'Malformed management pack {0}. Metadata file missing!'.format(mpack_path)) ++ raise FatalException(-1, 'Malformed management pack {}. Metadata file missing!'.format(mpack_path)) + + # Validate management pack prerequisites + # Skip validation in replay mode +@@ -730,29 +730,29 @@ + 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)) + +@@ -763,14 +763,14 @@ + mpack_staging_dir = os.path.join(mpacks_staging_location, mpack_dirname) + mpack_archive_path = os.path.join(mpacks_cache_location, os.path.basename(tmp_archive_path)) + +- print_info_msg("Stage management pack {0}-{1} to staging location {2}".format( ++ print_info_msg("Stage management pack {}-{} to staging location {}".format( + mpack_name, mpack_version, mpack_staging_dir)) + if os.path.exists(mpack_staging_dir): + if options.force: +- print_info_msg("Force removing previously installed management pack from {0}".format(mpack_staging_dir)) ++ print_info_msg("Force removing previously installed management pack from {}".format(mpack_staging_dir)) + sudo.rmtree(mpack_staging_dir) + else: +- error_msg = "Management pack {0}-{1} already installed!".format(mpack_name, mpack_version) ++ error_msg = "Management pack {}-{} already installed!".format(mpack_name, mpack_version) + print_error_msg(error_msg) + raise FatalException(-1, error_msg) + shutil.move(tmp_root_dir, mpack_staging_dir) +@@ -786,7 +786,7 @@ + # Artifact directory with contents of the artifact + artifact_source_dir = os.path.join(mpack_staging_dir, artifact.source_dir) + +- print_info_msg("Processing artifact {0} of type {1} in {2}".format( ++ print_info_msg("Processing artifact {} of type {} in {}".format( + artifact_name, artifact_type, artifact_source_dir)) + if artifact.type == STACK_DEFINITIONS_ARTIFACT_NAME: + process_stack_definitions_artifact(artifact, artifact_source_dir, options) +@@ -797,7 +797,7 @@ + elif artifact.type == STACK_ADDON_SERVICE_DEFINITIONS_ARTIFACT_NAME: + process_stack_addon_service_definitions_artifact(artifact, artifact_source_dir, options) + else: +- print_info_msg("Unknown artifact {0} of type {1}".format(artifact_name, artifact_type)) ++ print_info_msg("Unknown artifact {} of type {}".format(artifact_name, artifact_type)) + + ambari_user = read_ambari_user() + +@@ -809,17 +809,17 @@ + mod = pack[1] + user = pack[2].format(ambari_user) + recursive = pack[3] +- logger.info("Setting file permissions: {0} {1} {2} {3}".format(file, mod, user, recursive)) ++ logger.info("Setting file permissions: {} {} {} {}".format(file, mod, user, recursive)) + set_file_permissions(file, mod, user, recursive) + + for pack in change_ownership_list: + path = pack[0] + user = pack[1].format(ambari_user) + recursive = pack[2] +- logger.info("Changing ownership: {0} {1} {2}".format(path, user, recursive)) ++ logger.info("Changing ownership: {} {} {}".format(path, user, recursive)) + change_owner(path, user, recursive) + +- print_info_msg("Management pack {0}-{1} successfully installed! Please restart ambari-server.".format(mpack_name, mpack_version)) ++ print_info_msg("Management pack {}-{} successfully installed! Please restart ambari-server.".format(mpack_name, mpack_version)) + return mpack_metadata, mpack_name, mpack_version, mpack_staging_dir, mpack_archive_path + + # TODO +@@ -830,13 +830,13 @@ + if hook_name == hook.name: + hook_script = os.path.join(base_dir, hook.script) + if os.path.exists(hook_script): +- print_info_msg("Executing {0} hook script : {1}".format(hook_name, hook_script)) ++ print_info_msg("Executing {} hook script : {}".format(hook_name, hook_script)) + if hook.type == PYTHON_HOOK_TYPE: + command = ["/usr/bin/ambari-python-wrap", hook_script] + elif hook.type == SHELL_HOOK_TYPE: + command = ["/bin/bash", hook_script] + else: +- raise FatalException(-1, "Malformed management pack. Unknown hook type for {0} hook script" ++ raise FatalException(-1, "Malformed management pack. Unknown hook type for {} hook script" + .format(hook_name)) + (returncode, stdoutdata, stderrdata) = run_os_command(command) + if returncode != 0: +@@ -847,7 +847,7 @@ + else: + print_info_msg(stdoutdata) + else: +- raise FatalException(-1, "Malformed management pack. Missing {0} hook script {1}" ++ raise FatalException(-1, "Malformed management pack. Missing {} hook script {}" + .format(hook_name, hook_script)) + + def get_replay_log_file(): +@@ -872,13 +872,13 @@ + replay_log_file = get_replay_log_file() + log = { 'mpack_command' : mpack_command, 'mpack_path' : mpack_archive_path, 'purge' : purge, 'purge_list': purge_list, 'force' : force, 'verbose' : verbose } + with open(replay_log_file, "a") as replay_log: +- replay_log.write("{0}\n".format(log)) ++ replay_log.write("{}\n".format(log)) + + def remove_replay_logs(mpack_name): + replay_log_file = get_replay_log_file() + logs = [] + if os.path.exists(replay_log_file): +- with open(replay_log_file, "r") as f: ++ with open(replay_log_file) as f: + for log in f: + log = log.strip() + options = _named_dict(ast.literal_eval(log)) +@@ -887,7 +887,7 @@ + logs.append(log) + with open(replay_log_file, "w") as replay_log: + for log in logs: +- replay_log.write("{0}\n".format(log)) ++ replay_log.write("{}\n".format(log)) + + def install_mpack(options, replay_mode=False): + """ +@@ -927,7 +927,7 @@ + + _uninstall_mpacks(mpack_name) + +- print_info_msg("Management pack {0} successfully uninstalled!".format(mpack_name)) ++ print_info_msg("Management pack {} successfully uninstalled!".format(mpack_name)) + if not replay_mode: + remove_replay_logs(mpack_name) + +@@ -950,7 +950,7 @@ + print_error_msg("No management packs found that can be upgraded!") + raise FatalException(-1, 'No management packs found that can be upgraded!') + +- print_info_msg("Upgrading management pack {0}".format(mpack_path)) ++ print_info_msg("Upgrading management pack {}".format(mpack_path)) + + # Force install new management pack version + options.force = True +@@ -962,7 +962,7 @@ + # Execute post upgrade hook + _execute_hook(mpack_metadata, AFTER_UPGRADE_HOOK_NAME, mpack_staging_dir) + +- print_info_msg("Management pack {0}-{1} successfully upgraded!".format(mpack_name, mpack_version)) ++ print_info_msg("Management pack {}-{} successfully upgraded!".format(mpack_name, mpack_version)) + if not replay_mode: + add_replay_log(UPGRADE_MPACK_ACTION, mpack_archive_path, False, [], options.force, options.verbose) + +@@ -972,7 +972,7 @@ + """ + replay_log_file = get_replay_log_file() + if os.path.exists(replay_log_file): +- with open(replay_log_file, "r") as f: ++ with open(replay_log_file) as f: + for replay_log in f: + replay_log = replay_log.strip() + print_info_msg("===========================================================================================") +@@ -987,7 +987,7 @@ + elif replay_options.mpack_command == UPGRADE_MPACK_ACTION: + upgrade_mpack(replay_options, replay_mode=True) + else: +- error_msg = "Invalid mpack command {0} in mpack replay log {1}!".format(replay_options.mpack_command, replay_log_file) ++ error_msg = "Invalid mpack command {} in mpack replay log {}!".format(replay_options.mpack_command, replay_log_file) + print_error_msg(error_msg) + raise FatalException(-1, error_msg) + else: +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/python/ambari_server/setupSecurity.py apache-ambari-2.7.6-change/ambari-server/src/main/python/ambari_server/setupSecurity.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/python/ambari_server/setupSecurity.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/python/ambari_server/setupSecurity.py 2022-07-11 00:52:36.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +@@ -30,8 +30,8 @@ + import sys + import tempfile + import time +-import urllib2 +-from ambari_commons.exceptions import FatalException, NonFatalException ++import urllib.request, urllib.error, urllib.parse ++from ambari_commons.exceptions import FatalException as 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 + from ambari_commons.os_family_impl import OsFamilyFuncImpl, OsFamilyImpl +@@ -59,7 +59,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__) + +@@ -69,8 +69,8 @@ + + LDAP_TYPES = [LDAP_AD, LDAP_IPA, LDAP_GENERIC] + +-REGEX_IP_ADDRESS = "^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$" +-REGEX_HOSTNAME = "^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])$" ++REGEX_IP_ADDRESS = r"^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$" ++REGEX_HOSTNAME = r"^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])$" + REGEX_PORT = "^([0-9]{1,5}$)" + REGEX_HOSTNAME_PORT = "^(.*:[0-9]{1,5}$)" + REGEX_TRUE_FALSE = "^(true|false)?$" +@@ -112,14 +112,14 @@ + 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 +@@ -148,7 +148,7 @@ + properties = get_ambari_properties() + + bootstrap_dir = os.path.abspath(get_value_from_properties(properties, BOOTSTRAP_DIR_PROPERTY)) +- print_info_msg("Cleaning bootstrap directory ({0}) contents...".format(bootstrap_dir)) ++ print_info_msg("Cleaning bootstrap directory ({}) contents...".format(bootstrap_dir)) + + if os.path.exists(bootstrap_dir): + shutil.rmtree(bootstrap_dir) #Ignore the non-existent dir error +@@ -156,8 +156,8 @@ + if not os.path.exists(bootstrap_dir): + try: + os.makedirs(bootstrap_dir) +- except Exception, ex: +- print_warning_msg("Failed recreating the bootstrap directory: {0}".format(str(ex))) ++ except Exception as ex: ++ print_warning_msg("Failed recreating the bootstrap directory: {}".format(str(ex))) + pass + else: + print_warning_msg("Bootstrap directory lingering around after 5s. Unable to complete the cleanup.") +@@ -205,21 +205,21 @@ + 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] + mod = pack[1] + user = pack[2].format(ambari_user) + recursive = pack[3] +- print_info_msg("Setting file permissions: {0} {1} {2} {3}".format(file, mod, user, recursive)) ++ print_info_msg("Setting file permissions: {} {} {} {}".format(file, mod, user, recursive)) + set_file_permissions(file, mod, user, recursive) + + for pack in configDefaults.NR_CHANGE_OWNERSHIP_LIST: + path = pack[0] + user = pack[1].format(ambari_user) + recursive = pack[2] +- print_info_msg("Changing ownership: {0} {1} {2}".format(path, user, recursive)) ++ print_info_msg("Changing ownership: {} {} {}".format(path, user, recursive)) + change_owner(path, user, recursive) + + def configure_ldap_password(options): +@@ -240,7 +240,7 @@ + try: + if os.path.exists(file): + new_spec = new_specs[0] +- with open(file, 'r') as names_file: ++ with open(file) as names_file: + names = names_file.read() + new_spec['names'] = names.replace('\n', '').replace('\t', '') + names_file.close() +@@ -295,8 +295,8 @@ + 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.encodestring('{}:{}'.format(admin_login, admin_password)).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' +@@ -312,7 +312,7 @@ + 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 +@@ -386,8 +386,8 @@ + 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.encodestring('{}:{}'.format(admin_login, admin_password)).replace('\n', '') ++ request = urllib.request.Request(url) + request.add_header('Authorization', 'Basic %s' % admin_auth) + request.add_header('X-Requested-By', 'ambari') + +@@ -418,7 +418,7 @@ + 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) +@@ -430,7 +430,7 @@ + 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":"*"}}] +@@ -443,7 +443,7 @@ + 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 +@@ -459,12 +459,12 @@ + 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(' {}:'.format(principal_type)) ++ for action, amount in summary.items(): ++ print(' {} = {!s}'.format(action, amount)) + request_in_progress = False + else: + time.sleep(1) +@@ -476,7 +476,7 @@ + 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) + + properties = get_ambari_properties() + if properties == -1: +@@ -487,7 +487,7 @@ + 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 +@@ -496,14 +496,14 @@ + + # Read clear text DB password from file + if db_sql_auth and not is_alias_string(db_password) and os.path.isfile(db_password): +- with open(db_password, 'r') as passwdfile: ++ with open(db_password) as passwdfile: + db_password = passwdfile.read() + + ldap_password = properties.get_property(LDAP_MGR_PASSWORD_PROPERTY) + if ldap_password: + # Read clear text LDAP password from file + if not is_alias_string(ldap_password) and os.path.isfile(ldap_password): +- with open(ldap_password, 'r') as passwdfile: ++ with open(ldap_password) as passwdfile: + ldap_password = passwdfile.read() + + ts_password = properties.get_property(SSL_TRUSTSTORE_PASSWORD_PROPERTY) +@@ -511,34 +511,34 @@ + masterKey = None + + if isSecure: +- print "Password encryption is enabled." ++ print("Password encryption is enabled.") + resetKey = True if options.security_option is not None else get_YN_input("Do you want to reset Master Key? [y/n] (n): ", False) + + # For encrypting of only unencrypted passwords without resetting the key ask + # for master key if not persisted. + if isSecure and not isPersisted and not resetKey: +- print "Master Key not persisted." ++ print("Master Key not persisted.") + masterKey = get_original_master_key(properties, options) + pass + + # Make sure both passwords are clear-text if master key is lost + if resetKey: + if not isPersisted: +- 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: +- print "To disable encryption, do the following:" +- print "- Edit " + find_properties_file() + \ +- " and set " + SECURITY_IS_ENCRYPTION_ENABLED + " = " + "false." ++ print("To disable encryption, do the following:") ++ print("- Edit " + find_properties_file() + \ ++ " and set " + SECURITY_IS_ENCRYPTION_ENABLED + " = " + "false.") + 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 ldap_password and is_alias_string(ldap_password): +- print err.format('- LDAP manager password', "'" + LDAP_SETUP_ACTION + "'") ++ print(err.format('- LDAP manager password', "'" + LDAP_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 + "'")) + + return 1 + pass +@@ -569,8 +569,8 @@ + 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): +@@ -587,7 +587,7 @@ + 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) +@@ -598,7 +598,7 @@ + if ldap_password and not is_alias_string(ldap_password): + retCode = save_passwd_for_alias(LDAP_MGR_PASSWORD_ALIAS, ldap_password, masterKey) + if retCode != 0: +- print 'Failed to save secure LDAP password.' ++ print('Failed to save secure LDAP password.') + else: + propertyMap[LDAP_MGR_PASSWORD_PROPERTY] = get_alias_string(LDAP_MGR_PASSWORD_ALIAS) + remove_password_file(LDAP_MGR_PASSWORD_FILENAME) +@@ -607,7 +607,7 @@ + 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) + pass +@@ -625,8 +625,8 @@ + 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) +@@ -638,7 +638,7 @@ + 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: +@@ -845,7 +845,7 @@ + ts_password = None + + if ldaps: +- disable_endpoint_identification = get_validated_string_input("Disable endpoint identification during SSL handshake [true/false] ({0}): ".format(disable_endpoint_identification_default), ++ disable_endpoint_identification = get_validated_string_input("Disable endpoint identification during SSL handshake [true/false] ({}): ".format(disable_endpoint_identification_default), + disable_endpoint_identification_default, + REGEX_TRUE_FALSE, "Invalid characters in the input!", False, allowEmpty=True, answer=options.ldap_sync_disable_endpoint_identification) + ldap_property_value_map[LDAP_DISABLE_ENDPOINT_IDENTIFICATION] = disable_endpoint_identification +@@ -860,7 +860,7 @@ + format(truststore_default), + truststore_set) + if custom_trust_store: +- ts_type = get_validated_string_input("TrustStore type [jks/jceks/pkcs12] {0}:".format(get_prompt_default(ssl_truststore_type_default)), ++ ts_type = get_validated_string_input("TrustStore type [jks/jceks/pkcs12] {}:".format(get_prompt_default(ssl_truststore_type_default)), + ssl_truststore_type_default, "^(jks|jceks|pkcs12)?$", "Wrong type", False, answer=options.trust_store_type) + ts_path = None + while True: +@@ -869,7 +869,7 @@ + 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) + +@@ -880,10 +880,10 @@ + 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) +@@ -891,26 +891,26 @@ + pass + pass + +- 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): +- print("%s %s" % (property.get_prompt_text(ldap_type), ldap_property_value_map[property.prop_name])) ++ if property.prop_name in ldap_property_value_map: ++ print("{} {}".format(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])) ++ print("{}: {}".format(property, ldap_property_value_map[property])) + else: +- print("%s: %s" % (property, BLIND_PASSWORD)) ++ print("{}: {}".format(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])) ++ print("{}: {}".format(property, ldap_property_values_in_ambari_properties[property])) + else: +- print("%s: %s" % (property, BLIND_PASSWORD)) ++ print("{}: {}".format(property, BLIND_PASSWORD)) + + save_settings = True if options.ldap_save_settings is not None else get_YN_input("Save settings [y/n] (y)? ", True) + +@@ -928,7 +928,7 @@ + if mgr_password: + ldap_property_value_map[LDAP_MGR_PASSWORD_PROPERTY] = store_password_file(mgr_password, LDAP_MGR_PASSWORD_FILENAME) + +- print 'Saving LDAP properties...' ++ print('Saving LDAP properties...') + + ldap_property_value_map[IS_LDAP_CONFIGURED] = "true" + #Saving LDAP configuration in Ambari DB using the REST API +@@ -938,7 +938,7 @@ + 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 + +@@ -961,9 +961,9 @@ + if keyLocation is not None: + try: + # Verify master key can be read by the java process +- with open(keyLocation, 'r'): ++ with open(keyLocation): + pass +- except IOError: ++ except OSError: + print_warning_msg("Cannot read Master key from path specified in " + "environemnt.") + prompt = True +@@ -1008,8 +1008,8 @@ + err = "Unable to detect a system user for Ambari Server.\n" + SETUP_OR_UPGRADE_MSG + raise FatalException(1, err) + if current_user != ambari_user and not is_root(): +- err = "Unable to start Ambari Server as user {0}. Please either run \"ambari-server start\" " \ +- "command as root, as sudo or as user \"{1}\"".format(current_user, ambari_user) ++ err = "Unable to start Ambari Server as user {}. Please either run \"ambari-server start\" " \ ++ "command as root, as sudo or as user \"{}\"".format(current_user, ambari_user) + raise FatalException(1, err) + return current_user + +@@ -1059,11 +1059,11 @@ + # Verify that the PAM config file exists, else show warning... + pam_config_file = pam_property_value_map[PAM_CONFIG_FILE] + if not os.path.exists(pam_config_file): +- print_warning_msg("The PAM configuration file, {0} does not exist. " \ ++ print_warning_msg("The PAM configuration file, {} does not exist. " \ + "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 + + # +@@ -1097,7 +1097,7 @@ + + 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() +@@ -1111,13 +1111,13 @@ + (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: +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/python/ambari_server/setupSso.py apache-ambari-2.7.6-change/ambari-server/src/main/python/ambari_server/setupSso.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/python/ambari_server/setupSso.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/python/ambari_server/setupSso.py 2022-07-11 00:52:36.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +@@ -18,10 +18,10 @@ + limitations under the License. + ''' + import re +-import urllib2 ++import urllib.request, urllib.error, urllib.parse + + import sys +-from ambari_commons.exceptions import FatalException, NonFatalException ++from ambari_commons.exceptions import FatalException as NonFatalException + from ambari_commons.logging_utils import get_silent, print_info_msg + + from ambari_server.serverConfiguration import get_ambari_properties +@@ -49,7 +49,7 @@ + CERTIFICATE_FOOTER = "-----END CERTIFICATE-----" + + REGEX_ANYTHING = ".*" +-REGEX_URL = "http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+\S*$" ++REGEX_URL = r"http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+\S*$" + + WILDCARD_FOR_ALL_SERVICES = "*" + SERVICE_NAME_AMBARI = 'AMBARI' +@@ -83,7 +83,7 @@ + def populate_sso_provider_url(options, properties): + if not options.sso_provider_url: + provider_url = get_value_from_dictionary(properties, SSO_PROVIDER_URL, SSO_PROVIDER_URL_DEFAULT) +- provider_url = get_validated_string_input("Provider URL ({0}): ".format(provider_url), provider_url, REGEX_URL, ++ provider_url = get_validated_string_input("Provider URL ({}): ".format(provider_url), provider_url, REGEX_URL, + "Invalid provider URL", False) + else: + provider_url = options.sso_provider_url +@@ -108,7 +108,7 @@ + def populate_jwt_cookie_name(options, properties): + if not options.sso_jwt_cookie_name and (not options.sso_provider_url or not options.sso_public_cert_file): + cookie_name = get_value_from_dictionary(properties, JWT_COOKIE_NAME, JWT_COOKIE_NAME_DEFAULT) +- cookie_name = get_validated_string_input("JWT Cookie name ({0}): ".format(cookie_name), cookie_name, REGEX_ANYTHING, ++ cookie_name = get_validated_string_input("JWT Cookie name ({}): ".format(cookie_name), cookie_name, REGEX_ANYTHING, + "Invalid cookie name", False) + else: + cookie_name = options.sso_jwt_cookie_name if options.sso_jwt_cookie_name else JWT_COOKIE_NAME_DEFAULT +@@ -119,7 +119,7 @@ + def populate_jwt_audiences(options, properties): + if options.sso_jwt_audience_list is None and (not options.sso_provider_url or not options.sso_public_cert_file): + audiences = get_value_from_dictionary(properties, JWT_AUDIENCES, JWT_AUDIENCES_DEFAULT) +- audiences = get_validated_string_input("JWT audiences list (comma-separated), empty for any ({0}): ".format(audiences), audiences, ++ audiences = get_validated_string_input("JWT audiences list (comma-separated), empty for any ({}): ".format(audiences), audiences, + REGEX_ANYTHING, "Invalid value", False) + else: + audiences = options.sso_jwt_audience_list if options.sso_jwt_audience_list else JWT_AUDIENCES_DEFAULT +@@ -129,7 +129,7 @@ + def populate_ambari_requires_sso(options, properties): + if options.sso_enabled_ambari is None: + enabled = get_boolean_from_dictionary(properties, AMBARI_SSO_AUTH_ENABLED, False) +- enabled = get_YN_input("Use SSO for Ambari [y/n] ({0})? ".format('y' if enabled else 'n'), enabled) ++ enabled = get_YN_input("Use SSO for Ambari [y/n] ({})? ".format('y' if enabled else 'n'), enabled) + else: + enabled = 'true' == options.sso_enabled_ambari + +@@ -142,7 +142,7 @@ + def get_eligible_services(properties, admin_login, admin_password, cluster_name): + print_info_msg("Fetching SSO enabled services") + +- 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, + FETCH_SERVICES_FOR_SSO_ENTRYPOINT % safe_cluster_name) +@@ -164,20 +164,20 @@ + if not options.sso_enabled_services: + if not options.sso_manage_services: + manage_services = get_boolean_from_dictionary(properties, SSO_MANAGE_SERVICES, False) +- manage_services = get_YN_input("Manage SSO configurations for eligible services [y/n] ({0})? ".format('y' if manage_services else 'n'), manage_services) ++ manage_services = get_YN_input("Manage SSO configurations for eligible services [y/n] ({})? ".format('y' if manage_services else 'n'), manage_services) + else: + manage_services = 'true' == options.sso_manage_services + + if not options.sso_provider_url: + stored_manage_services = get_boolean_from_dictionary(properties, SSO_MANAGE_SERVICES, False) +- print("Manage SSO configurations for eligible services [y/n] ({0})? {1}" +- .format('y' if stored_manage_services else 'n', 'y' if manage_services else 'n')) ++ print(("Manage SSO configurations for eligible services [y/n] ({})? {}" ++ .format('y' if stored_manage_services else 'n', 'y' if manage_services else 'n'))) + + if manage_services: + enabled_services = get_value_from_dictionary(properties, SSO_ENABLED_SERVICES, "").upper().split(',') + + all = "*" in enabled_services +- configure_for_all_services = get_YN_input(" Use SSO for all services [y/n] ({0})? ".format('y' if all else 'n'), all) ++ configure_for_all_services = get_YN_input(" Use SSO for all services [y/n] ({})? ".format('y' if all else 'n'), all) + if configure_for_all_services: + services = WILDCARD_FOR_ALL_SERVICES + else: +@@ -191,7 +191,7 @@ + + for service in eligible_services: + enabled = service.upper() in enabled_services +- question = " Use SSO for {0} [y/n] ({1})? ".format(service, 'y' if enabled else 'n') ++ question = " Use SSO for {} [y/n] ({})? ".format(service, 'y' if enabled else 'n') + if get_YN_input(question, enabled): + service_list.append(service) + +@@ -220,7 +220,7 @@ + + 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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/python/ambari_server/setupTrustedProxy.py apache-ambari-2.7.6-change/ambari-server/src/main/python/ambari_server/setupTrustedProxy.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/python/ambari_server/setupTrustedProxy.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/python/ambari_server/setupTrustedProxy.py 2022-07-11 00:52:36.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +@@ -19,12 +19,12 @@ + ''' + + 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.exceptions import FatalException as NonFatalException + from ambari_commons.logging_utils import get_silent, print_info_msg + from ambari_server.serverConfiguration import get_ambari_properties + from ambari_server.serverUtils import is_server_runing, get_ambari_admin_username_password_pair, \ +@@ -49,8 +49,8 @@ + + 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: +@@ -62,7 +62,7 @@ + def populate_tproxy_configuration_property(properties, tproxy_user_name, property_name, question_text_qualifier): + resolved_property_name = property_name.format(tproxy_user_name) + resolved_property_value = get_value_from_dictionary(properties, resolved_property_name, WILDCARD_FOR_ALL) +- resolved_property_value = get_validated_string_input("Allowed {0} for {1} ({2})? ".format(question_text_qualifier, tproxy_user_name, resolved_property_value), resolved_property_value, REGEX_ANYTHING, "Invalid input", False) ++ resolved_property_value = get_validated_string_input("Allowed {} for {} ({})? ".format(question_text_qualifier, tproxy_user_name, resolved_property_value), resolved_property_value, REGEX_ANYTHING, "Invalid input", False) + properties[resolved_property_name] = resolved_property_value + + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/python/ambari_server/userInput.py apache-ambari-2.7.6-change/ambari-server/src/main/python/ambari_server/userInput.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/python/ambari_server/userInput.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/python/ambari_server/userInput.py 2022-07-11 00:52:36.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +@@ -31,8 +31,8 @@ + # return True if 'y' or False if 'n' + # + def get_YN_input(prompt, default, answer = None): +- yes = set(['yes', 'ye', 'y']) +- no = set(['no', 'n']) ++ yes = {'yes', 'ye', 'y'} ++ no = {'no', 'n'} + if answer is not None and answer: + yes.update(['True', 'true']) + no.update(['False', 'false']) +@@ -44,25 +44,25 @@ + if get_silent(): + print(prompt) + return default +- hasAnswer = answer is not None and answer ++ hasAnswer = answer != None and answer + if hasAnswer: + print(prompt) + +- input = True ++ inputD = True + result = default +- while input: +- choice = str(answer) if hasAnswer else raw_input(prompt).lower() ++ while inputD: ++ choice = str(answer) if hasAnswer else input(prompt).lower() + if choice in firstChoice: + result = True +- input = False ++ inputD = False + elif choice in secondChoice: + result = False +- input = False +- elif choice is "": # Just enter pressed ++ inputD = False ++ elif choice == "": # Just enter pressed + result = default +- input = False ++ inputD = False + else: +- print "input not recognized, please try again: " ++ print("input not recognized, please try again: ") + quit_if_has_answer(hasAnswer) + + return result +@@ -70,83 +70,83 @@ + + 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) ++ inputD = "" ++ hasAnswer = answer != None and (answer or allowEmpty) + if hasAnswer: + print (prompt) + +- while not input: ++ while not inputD: + if get_silent(): + print (prompt) +- input = default ++ inputD = default + elif is_pass: +- input = str(answer) if hasAnswer else get_password(prompt) ++ inputD = str(answer) if hasAnswer else get_password(prompt) + else: +- input = str(answer) if hasAnswer else raw_input(prompt) +- if not input.strip(): ++ inputD = str(answer) if hasAnswer else input(prompt) ++ if not inputD: + # 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) ++ inputD = "" + quit_if_has_answer(hasAnswer) + continue + else: +- input = default ++ inputD = default + if validatorFunction: +- if not validatorFunction(input): +- input = "" ++ if not validatorFunction(inputD): ++ inputD = "" + 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, str(inputD)): ++ print(description) ++ inputD = "" + quit_if_has_answer(hasAnswer) + + if validatorFunction: +- if not validatorFunction(input): +- input = "" ++ if not validatorFunction(inputD): ++ inputD = "" + quit_if_has_answer(hasAnswer) + continue +- return input ++ return inputD + + def get_validated_filepath_input(prompt, description, default = None, answer = None): +- input = False +- hasAnswer = answer is not None and answer +- while not input: ++ inputD = False ++ hasAnswer = answer != None and answer ++ while not inputD: + if get_silent(): + 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 ++ inputD = str(answer) if hasAnswer else input(prompt) ++ if not inputD == None: ++ inputD = inputD ++ if not inputD == None and not "" == inputD and os.path.isfile(inputD): ++ return inputD + else: +- print description ++ print(description) + quit_if_has_answer(hasAnswer) +- input = False ++ inputD = False + + + def get_multi_line_input(prompt, end_line=""): + full_prompt = prompt + if end_line: +- full_prompt += " ([{0}] to finish input):".format(end_line) ++ full_prompt += " ([{}] to finish input):".format(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: +- user_input = line if user_input is None else user_input + "\n" + line ++ user_input = line if user_input == None else user_input + "\n" + line + + + def get_prompt_default(defaultStr=None): +@@ -163,35 +163,35 @@ + answer=None, + confirm_password_prompt="Re-enter password: "): + +- input = True +- while(input): ++ inputD = True ++ while(inputD): + # setup password +- if password_prompt is None: ++ if password_prompt == None: + password_prompt = 'Password (' + password_default + '): ' + +- if password_descr is None: ++ if password_descr == None: + password_descr = "Invalid characters in password. Use only alphanumeric or " \ + "_ or - characters" + + 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 ++ inputD = 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." +- exit(1) +\ 文件尾没有换行符 ++ print("Validation has failed for the last input. Operation has interrupted.") ++ exit(1) +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/python/ambari_server/utils.py apache-ambari-2.7.6-change/ambari-server/src/main/python/ambari_server/utils.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/python/ambari_server/utils.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/python/ambari_server/utils.py 2022-07-11 00:52:36.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +@@ -58,7 +58,8 @@ + elif OSCheck.is_suse_family(): + return '/etc/init.d/postgresql' + else: +- raise Exception("Unsupported OS family '{0}'".format(OSCheck.get_os_family())) ++ return '/etc/rc.d/init.d/postgresql' ++ #raise Exception("Unsupported OS family '{}'".format(OSCheck.get_os_family())) + + + # ToDo: move that function to common-functions +@@ -101,7 +102,7 @@ + exitcode = int(f.read()) + f.close() + os.remove(exitcode_file_path) +- except IOError: ++ except OSError: + pass + return exitcode + +@@ -113,7 +114,7 @@ + try: + pfile = open(pidfile, "w") + pfile.write("%s\n" % pid) +- except IOError as e: ++ except OSError as e: + logger.error("Failed to write PID to " + pidfile + " due to " + str(e)) + pass + finally: +@@ -147,7 +148,7 @@ + os.kill(int(item["pid"]), signal.SIGKILL) + except: + pass +- except IOError as e: ++ except OSError as e: + logger.error("Failed to write PID to " + pidfile + " due to " + str(e)) + pass + finally: +@@ -172,7 +173,7 @@ + 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) +@@ -216,6 +217,7 @@ + for pid in pids: + try: + arg = open(os.path.join(PROC_DIR, pid, PROC_CMDLINE), 'rb').read() ++ arg = str(arg,encoding='utf-8') + if pattern in arg: + found_pids += [{ + "pid": pid, +@@ -245,8 +247,8 @@ + + if os.path.isdir(get_pg_hba_init_files()): # detect actual installed versions of PG and select a more new one + postgre_ver = sorted( +- [fld for fld in os.listdir(get_pg_hba_init_files()) if +- os.path.isdir(os.path.join(get_pg_hba_init_files(), fld))], ++ (fld for fld in os.listdir(get_pg_hba_init_files()) if ++ os.path.isdir(os.path.join(get_pg_hba_init_files(), fld))), + reverse=True) + if len(postgre_ver) > 0: + return postgre_ver[0] +@@ -271,7 +273,7 @@ + + 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()) ++ cmd = "alias basename='echo {}; true' ; alias exit=return; source {} 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, +@@ -334,7 +336,7 @@ + host_fqdn = socket.getfqdn().lower() + fqdn_ip = socket.gethostbyname(host_fqdn) + return host_ip == fqdn_ip +- except socket.error: ++ except OSError: + pass + return False + +@@ -392,7 +394,7 @@ + def get_json_url_from_repo_file(): + repo_file_path = get_ambari_repo_file_full_name() + if os.path.exists(repo_file_path): +- with open(repo_file_path, 'r') as repo_file: ++ with open(repo_file_path) as repo_file: + for line in repo_file: + line = line.rstrip() + if "json.url" in line: +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/python/ambari_server_main.py apache-ambari-2.7.6-change/ambari-server/src/main/python/ambari_server_main.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/python/ambari_server_main.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/python/ambari_server_main.py 2022-07-11 00:52:36.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +@@ -133,8 +133,8 @@ + @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): +@@ -248,18 +248,18 @@ + + 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") + +@@ -275,7 +275,7 @@ + + properties_for_print = [] + logger.info("Ambari server properties config:") +- for key, value in properties.getPropertyDict().items(): ++ for key, value in list(properties.getPropertyDict().items()): + if "passwd" not in key and "password" not in key: + properties_for_print.append(key + "=" + value) + +@@ -322,7 +322,7 @@ + + # 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 @@ + 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,7 +379,7 @@ + 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 + +@@ -400,9 +400,9 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/python/ambari-server.py apache-ambari-2.7.6-change/ambari-server/src/main/python/ambari-server.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/python/ambari-server.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/python/ambari-server.py 2022-07-11 00:52:36.000000000 +0800 +@@ -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 os + import signal + import sys +-from ambari_commons.exceptions import FatalException, NonFatalException ++from ambari_commons.exceptions import FatalException , NonFatalException + from ambari_commons.logging_utils import set_verbose, set_silent, \ + print_info_msg, print_warning_msg, print_error_msg, set_debug_mode_from_options + from ambari_commons.os_check import OSConst +@@ -166,26 +166,26 @@ + 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") + + +@@ -214,7 +214,7 @@ + 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 +@@ -232,13 +232,13 @@ + 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 + + +@@ -282,16 +282,16 @@ + 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((' [{}] {}'.format(iAction, actionDesc[1]))) ++ print(('=' * 75)) + +- choice_prompt = 'Enter choice, (1-{0}): '.format(iAction) +- choice_re = '[1-{0}]'.format(iAction) ++ choice_prompt = 'Enter choice, (1-{}): '.format(iAction) ++ choice_re = '[1-{}]'.format(iAction) + choice = get_validated_string_input(choice_prompt, '0', choice_re, + 'Invalid choice', False, False) + +@@ -318,7 +318,7 @@ + + 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: +@@ -328,7 +328,7 @@ + + 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: +@@ -358,13 +358,13 @@ + 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 {}:".format(action))) + if required_options: +- print " required:{0}".format( +- ";".join([print_opt for print_opt, _ in required_options])) ++ print((" required:{}".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:{}".format( ++ ";".join([print_opt for print_opt, _ in optional_options])))) + + @OsFamilyFuncImpl(OSConst.WINSRV_FAMILY) + def init_action_parser(action, parser): +@@ -439,7 +439,7 @@ + default_purge_resources = ",".join([STACK_DEFINITIONS_RESOURCE_NAME, MPACKS_RESOURCE_NAME]) + add_parser_options('--purge-list', + default=default_purge_resources, +- help="Comma separated list of resources to purge ({0}). By default ({1}) will be purged.".format(purge_resources, default_purge_resources), ++ help="Comma separated list of resources to purge ({}). By default ({}) will be purged.".format(purge_resources, default_purge_resources), + dest="purge_list", + parser=parser, + optional_for_actions=[INSTALL_MPACK_ACTION] +@@ -669,7 +669,7 @@ + default_purge_resources = ",".join([STACK_DEFINITIONS_RESOURCE_NAME, MPACKS_RESOURCE_NAME]) + + parser.add_option('--purge-list', default=default_purge_resources, +- help="Comma separated list of resources to purge ({0}). By default ({1}) will be purged.".format(purge_resources, default_purge_resources), ++ help="Comma separated list of resources to purge ({}). By default ({}) will be purged.".format(purge_resources, default_purge_resources), + dest="purge_list") + parser.add_option('--force', action="store_true", default=False, help="Force install management pack", dest="force") + +@@ -716,13 +716,13 @@ + if db_windows_auth is True: + return True + else: +- if db_username is not None and db_username is not "" and db_password is not None and db_password is not "": ++ if db_username != None and db_username != "" and db_password != None and db_password != "": + return True + return False + + @OsFamilyFuncImpl(OSConst.WINSRV_FAMILY) + def are_cmd_line_db_args_valid(options): +- if (options.database_host is not None and options.database_host is not "" \ ++ if (options.database_host != None and options.database_host is not "" \ + #and options.database_name is not None \ # ambari by default is ok + and are_db_auth_options_ok(options.database_windows_auth, + options.database_username, +@@ -760,8 +760,8 @@ + @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' +@@ -782,8 +782,8 @@ + 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: +@@ -908,7 +908,7 @@ + + 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.{}".format(logging._levelToName[logging_level])) + + def init_logging(): + # init logger +@@ -951,7 +951,7 @@ + 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) +@@ -979,7 +979,7 @@ + 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) + +@@ -991,17 +991,17 @@ + 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 {} for action {}".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: +@@ -1011,7 +1011,7 @@ + pass + except FatalException as e: + if e.reason is not None: +- print_error_msg("Exiting with exit code {0}. \nREASON: {1}".format(e.code, e.reason)) ++ print_error_msg("Exiting with exit code {}. \nREASON: {}".format(e.code, e.reason)) + logger.exception(str(e)) + sys.exit(e.code) + except NonFatalException as e: +@@ -1020,7 +1020,7 @@ + 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) +@@ -1050,7 +1050,7 @@ + try: + main(options, args, parser) + except Exception as e: +- print_error_msg("Unexpected {0}: {1}".format((e).__class__.__name__, str(e)) +\ ++ print_error_msg("Unexpected {}: {}".format((e).__class__.__name__, str(e)) +\ + "\nFor more info run ambari-server with -v or --verbose option") + sys.exit(1) + +@@ -1068,7 +1068,7 @@ + if retcode == 0: + status, pid = is_server_runing() + if status: +- print "restarting ambari server" ++ print("restarting ambari server") + stop(options) + start(options) + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/python/ambari-server-state/Configurator.py apache-ambari-2.7.6-change/ambari-server/src/main/python/ambari-server-state/Configurator.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/python/ambari-server-state/Configurator.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/python/ambari-server-state/Configurator.py 2022-07-11 00:52:36.000000000 +0800 +@@ -133,7 +133,7 @@ + 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:" +@@ -144,13 +144,13 @@ + 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\") :") ++ for service in list(self.servicesPath.keys()): ++ 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": + self.servicesPath.__delitem__(service) +- print(self.servicesPath) ++ print((self.servicesPath)) + else: + raise ValueError( + "Path to the configuration file can't be empty.") #Catch it layter and start input mode automatically +@@ -158,12 +158,12 @@ + + def isFilesExist(self): + "Checking for resources file existing" +- for service in self.servicesPath.keys(): ++ for service in list(self.servicesPath.keys()): + path = self.servicesPath[service] + isExit = exists(path) + errorMessage = "File " + path + " doesn't exist! ("+ service+ " service)" + if not isExit: +- raise IOError(errorMessage) ++ raise OSError(errorMessage) + # else: + # print("File " + path + " exist!") + +@@ -173,7 +173,7 @@ + resultFile.write( str(self.configurations) ) + resultFile.flush() + resultFile.close() +- print("\t\t Result configuration file( "+self.RESULT_FILE_PATH+") was generate successfully.") ++ print(("\t\t Result configuration file( "+self.RESULT_FILE_PATH+") was generate successfully.")) + + + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/python/ambari-server-state/Entities.py apache-ambari-2.7.6-change/ambari-server/src/main/python/ambari-server-state/Entities.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/python/ambari-server-state/Entities.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/python/ambari-server-state/Entities.py 2022-07-11 00:52:36.000000000 +0800 +@@ -114,7 +114,7 @@ + + def __str__(self): + result = "" +- for key in self.keys.keys(): ++ for key in list(self.keys.keys()): + result += "<" + key + ">" + result += self.keys.get(key) + result += "" +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/python/ambari_windows_service.py apache-ambari-2.7.6-change/ambari-server/src/main/python/ambari_windows_service.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/python/ambari_windows_service.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/python/ambari_windows_service.py 2022-07-11 00:52:36.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/python/azuredb_create_generator.py apache-ambari-2.7.6-change/ambari-server/src/main/python/azuredb_create_generator.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/python/azuredb_create_generator.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/python/azuredb_create_generator.py 2022-07-11 00:52:36.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +@@ -21,15 +21,14 @@ + # 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 + + flags = re.DOTALL | re.IGNORECASE +-create_table_re = re.compile("CREATE TABLE ([^\s(]+).*", flags = flags) ++create_table_re = re.compile(r"CREATE TABLE ([^\s(]+).*", flags = flags) + create_index_re = re.compile("CREATE(?: NONCLUSTERED)? INDEX ([^ (]+).*", flags = flags) +-add_fk_const_re = re.compile("ALTER TABLE \S+ ADD CONSTRAINT (\S+) FOREIGN KEY.*", flags = flags) ++add_fk_const_re = re.compile(r"ALTER TABLE \S+ ADD CONSTRAINT (\S+) FOREIGN KEY.*", flags = flags) + + input_sql = "".join(fileinput.input()) + input_statements = re.split(';', input_sql) +@@ -39,9 +38,9 @@ + statement = re.sub( + create_table_re, + dedent('''\ +- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('\g<1>') AND type = 'U') ++ IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('\\g<1>') AND type = 'U') + BEGIN +- \g<0> ++ \\g<0> + END + '''), + statement) +@@ -50,9 +49,9 @@ + statement = re.sub( + create_index_re, + dedent('''\ +- IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = '\g<1>') ++ IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = '\\g<1>') + BEGIN +- \g<0> ++ \\g<0> + END + '''), + statement) +@@ -61,9 +60,9 @@ + statement = re.sub( + add_fk_const_re, + dedent('''\ +- IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('\g<1>') AND type = 'F') ++ IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID('\\g<1>') AND type = 'F') + BEGIN +- \g<0> ++ \\g<0> + END + '''), + statement) +@@ -77,10 +76,10 @@ + deletes = [] + for table in inserts: + if table not in tables: +- deletes.append(" DELETE {0};".format(table)) ++ deletes.append(" DELETE {};".format(table)) + tables.add(table) + deletes.reverse() + delete_sql = "\n".join(deletes) +-sql = re.sub("BEGIN TRANSACTION", "\g<0>\n" + delete_sql, sql, count=1) ++sql = re.sub("BEGIN TRANSACTION", "\\g<0>\n" + delete_sql, sql, count=1) + + print(sql) +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/python/bootstrap.py apache-ambari-2.7.6-change/ambari-server/src/main/python/bootstrap.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/python/bootstrap.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/python/bootstrap.py 2022-07-11 00:52:36.000000000 +0800 +@@ -221,7 +221,7 @@ + return _call + + def try_to_execute(self, action): +- last_retcode = {"exitstatus": 177, "log":"Try to execute '{0}'".format(str(action)), "errormsg":"Execute of '{0}' failed".format(str(action))} ++ last_retcode = {"exitstatus": 177, "log":"Try to execute '{}'".format(str(action)), "errormsg":"Execute of '{}' failed".format(str(action))} + try: + retcode = action() + if isinstance(retcode, int): +@@ -260,7 +260,7 @@ + exit when the main parallel bootstrap thread exits. + All we need to do now is a proper logging and creating .done file + """ +- self.host_log.write("Automatic Agent registration timed out (timeout = {0} seconds). " \ ++ self.host_log.write("Automatic Agent registration timed out (timeout = {} seconds). " \ + "Check your network connectivity and retry registration," \ + " or use manual agent registration.".format(HOST_BOOTSTRAP_TIMEOUT)) + self.createDoneFile(199) +@@ -290,7 +290,7 @@ + self.host_log.write("==========================\n") + self.host_log.write("Creating target directory...") + command = os.path.join(self.shared_state.script_dir, self.CREATE_REMOTING_DIR_SCRIPT_NAME) +- psr = PSR(command, self.host, self.host_log, params="{0} {1}".format(self.host, self.getTempFolder())) ++ psr = PSR(command, self.host, self.host_log, params="{} {}".format(self.host, self.getTempFolder())) + retcode = psr.run() + self.host_log.write("\n") + return retcode +@@ -301,7 +301,7 @@ + self.host_log.write("==========================\n") + self.host_log.write("Unzipping bootstrap archive...") + command = os.path.join(self.shared_state.script_dir, self.UNZIP_REMOTING_SCRIPT_NAME) +- psr = PSR(command, self.host, self.host_log, params="{0} {1} {2}".format(self.host, zipFile, self.getTempFolder())) ++ psr = PSR(command, self.host, self.host_log, params="{} {} {}".format(self.host, zipFile, self.getTempFolder())) + result = psr.run() + self.host_log.write("\n") + return result +@@ -313,7 +313,7 @@ + self.host_log.write("==========================\n") + self.host_log.write("Copying bootstrap archive...") + command = os.path.join(self.shared_state.script_dir, self.SEND_REMOTING_FILE_SCRIPT_NAME) +- psr = PSR(command, self.host, self.host_log, params="{0} {1} {2}".format(self.host, fileToCopy, target)) ++ psr = PSR(command, self.host, self.host_log, params="{} {} {}".format(self.host, fileToCopy, target)) + result = psr.run() + self.host_log.write("\n") + return result +@@ -325,7 +325,7 @@ + self.host_log.write("==========================\n") + self.host_log.write("Copying chocolatey config file...") + command = os.path.join(self.shared_state.script_dir, self.SEND_REMOTING_FILE_SCRIPT_NAME) +- psr = PSR(command, self.host, self.host_log, params="{0} {1} {2}".format(self.host, fileToCopy, target)) ++ psr = PSR(command, self.host, self.host_log, params="{} {} {}".format(self.host, fileToCopy, target)) + result = psr.run() + self.host_log.write("\n") + return result +@@ -335,7 +335,7 @@ + self.host_log.write("Running configure chocolatey script...") + tmpConfig = os.path.join(self.getTempFolder(), self.CHOCOLATEY_CONFIG_FILENAME) + command = os.path.join(self.shared_state.script_dir, self.CONFIGURE_CHOCOLATEY_SCRIPT_NAME) +- psr = PSR(command, self.host, self.host_log, params="{0} {1}".format(self.host, tmpConfig)) ++ psr = PSR(command, self.host, self.host_log, params="{} {}".format(self.host, tmpConfig)) + result = psr.run() + self.host_log.write("\n") + return result +@@ -352,7 +352,7 @@ + self.host_log.write("==========================\n") + self.host_log.write("Running setup agent script...") + command = os.path.join(self.shared_state.script_dir, self.RUN_REMOTING_SCRIPT_NAME) +- psr = PSR(command, self.host, self.host_log, params="{0} \"{1}\"".format(self.host, self.getRunSetupCommand(self.host))) ++ psr = PSR(command, self.host, self.host_log, params="{} \"{}\"".format(self.host, self.getRunSetupCommand(self.host))) + retcode = psr.run() + self.host_log.write("\n") + return retcode +@@ -391,8 +391,8 @@ + std_out = ret["log"] + pass + if last_retcode != 0: +- message = "ERROR: Bootstrap of host {0} fails because previous action " \ +- "finished with non-zero exit code ({1})\nERROR MESSAGE: {2}\nSTDOUT: {3}".format(self.host, last_retcode, err_msg, std_out) ++ message = "ERROR: Bootstrap of host {} fails because previous action " \ ++ "finished with non-zero exit code ({})\nERROR MESSAGE: {}\nSTDOUT: {}".format(self.host, last_retcode, err_msg, std_out) + self.host_log.write(message) + logging.error(message) + +@@ -411,7 +411,7 @@ + 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] + +@@ -430,7 +430,7 @@ + elif OSCheck.is_ubuntu_family(): + return "/etc/apt/sources.list.d" + else: +- raise Exception("Unsupported OS family '{0}'".format(OSCheck.get_os_family())) ++ raise Exception("Unsupported OS family '{}'".format(OSCheck.get_os_family())) + + def getRepoFile(self): + """ Ambari repo file for Ambari.""" +@@ -528,7 +528,7 @@ + (AMBARI_SUDO, "sources.list.d", self.AMBARI_REPO_FILENAME) + + def getRepoFileChmodCommand(self): +- return "{0} chmod 644 {1}".format(AMBARI_SUDO, self.getRepoFile()) ++ return "{} chmod 644 {}".format(AMBARI_SUDO, self.getRepoFile()) + + def copyNeededFiles(self): + # get the params +@@ -579,7 +579,7 @@ + else: + self.host_log.write("==========================\n") + self.host_log.write("Copying required files...") +- self.host_log.write("Ambari repo file not found: {0}".format(self.getRepoFile())) ++ self.host_log.write("Ambari repo file not found: {}".format(self.getRepoFile())) + retcode = -1 + pass + +@@ -659,9 +659,9 @@ + self.host_log.write("Checking 'sudo' package on remote host...") + params = self.shared_state + if OSCheck.is_ubuntu_family(): +- command = "dpkg --get-selections|grep -e '^sudo\s*install'" ++ command = r"dpkg --get-selections|grep -e '^sudo\s*install'" + else: +- command = "rpm -qa | grep -e '^sudo\-'" ++ command = r"rpm -qa | grep -e '^sudo\-'" + command = "[ \"$EUID\" -eq 0 ] || " + command + ssh = SSH(params.user, params.sshPort, params.sshkey_file, self.host, command, + params.bootdir, self.host_log, +@@ -777,8 +777,8 @@ + std_out = ret["log"] + # Checking execution result + if last_retcode != 0: +- message = "ERROR: Bootstrap of host {0} fails because previous action " \ +- "finished with non-zero exit code ({1})\nERROR MESSAGE: {2}\nSTDOUT: {3}".format(self.host, last_retcode, err_msg, std_out) ++ message = "ERROR: Bootstrap of host {} fails because previous action " \ ++ "finished with non-zero exit code ({})\nERROR MESSAGE: {}\nSTDOUT: {}".format(self.host, last_retcode, err_msg, std_out) + self.host_log.write(message) + logging.error(message) + # Try to delete password file +@@ -786,7 +786,7 @@ + retcode = self.try_to_execute(self.deletePasswordFile) + if retcode["exitstatus"] != 0: + message = "WARNING: failed to delete password file " \ +- "at {0}. Please delete it manually".format(self.getPasswordFile()) ++ "at {}. Please delete it manually".format(self.getPasswordFile()) + self.host_log.write(message) + logging.warn(message) + +@@ -824,7 +824,7 @@ + elapsedtime = time.time() - starttime + if elapsedtime > HOST_BOOTSTRAP_TIMEOUT: + # bootstrap timed out +- logging.warn("Bootstrap at host {0} timed out and will be " ++ logging.warn("Bootstrap at host {} timed out and will be " + "interrupted".format(bootstrap.host)) + bootstrap.interruptBootstrap() + finished_list.append(bootstrap) +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/python/os_check_type.py apache-ambari-2.7.6-change/ambari-server/src/main/python/os_check_type.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/python/os_check_type.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/python/os_check_type.py 2022-07-11 00:52:36.000000000 +0800 +@@ -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 @@ + 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 {} and local/current OS family is {}".format( ++ cluster_os, current_os))) + if current_os == cluster_os: + sys.exit(0) + else: +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/python/setupAgent.py apache-ambari-2.7.6-change/ambari-server/src/main/python/setupAgent.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/python/setupAgent.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/python/setupAgent.py 2022-07-11 00:52:36.000000000 +0800 +@@ -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 @@ + 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 +@@ -180,7 +180,7 @@ + log = ret['log'] + except Exception: + log = "Log not found" +- print log ++ print(log) + break + return {"exitstatus": agent_retcode, "log": log} + +@@ -197,8 +197,8 @@ + @OsFamilyFuncImpl(OsFamilyImpl.DEFAULT) + def checkVerbose(): + verbose = False +- cmds = ["bash", "-c", "ps aux | grep 'AmbariAgent.py' | grep ' \-v'"] +- cmdl = ["bash", "-c", "ps aux | grep 'AmbariAgent.py' | grep ' \--verbose'"] ++ cmds = ["bash", "-c", r"ps aux | grep 'AmbariAgent.py' | grep ' \-v'"] ++ cmdl = ["bash", "-c", r"ps aux | grep 'AmbariAgent.py' | grep ' \--verbose'"] + if execOsCommand(cmds)["exitstatus"] == 0 or execOsCommand(cmdl)["exitstatus"] == 0: + verbose = True + return verbose +@@ -239,20 +239,20 @@ + projectVersion = " " + if OSCheck.is_suse_family(): + Command = ["bash", "-c", "zypper --no-gpg-checks --non-interactive -q search -s --match-exact ambari-agent | grep '" + projectVersion + +- "' | cut -d '|' -f 4 | head -n1 | sed -e 's/-\w[^:]*//1' "] ++ r"' | cut -d '|' -f 4 | head -n1 | sed -e 's/-\w[^:]*//1' "] + elif OSCheck.is_windows_family(): + listPackagesCommand = ["cmd", "/c", "choco list ambari-agent --pre --all | findstr " + projectVersion + " > agentPackages.list"] + execOsCommand(listPackagesCommand) + Command = ["cmd", "/c", "powershell", "get-content agentPackages.list | select-object -last 1 | foreach-object {$_ -replace 'ambari-agent ', ''}"] + elif OSCheck.is_ubuntu_family(): + if projectVersion == " ": +- Command = ["bash", "-c", "apt-cache -q show ambari-agent |grep 'Version\:'|cut -d ' ' -f 2|tr -d '\\n'|sed -s 's/[-|~][A-Za-z0-9]*//'"] ++ Command = ["bash", "-c", "apt-cache -q show ambari-agent |grep 'Version\\:'|cut -d ' ' -f 2|tr -d '\\n'|sed -s 's/[-|~][A-Za-z0-9]*//'"] + else: +- Command = ["bash", "-c", "apt-cache -q show ambari-agent |grep 'Version\:'|cut -d ' ' -f 2|grep '" + ++ Command = ["bash", "-c", r"apt-cache -q show ambari-agent |grep 'Version\:'|cut -d ' ' -f 2|grep '" + + 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' "] ++ r"' | sed -re 's/\s+/ /g' | cut -d ' ' -f 2 | head -n1 | sed -e 's/-\w[^:]*//1' "] + return execOsCommand(Command) + + def isAgentPackageAlreadyInstalled(projectVersion): +@@ -271,15 +271,15 @@ + def getAvailableAgentPackageVersions(): + if OSCheck.is_suse_family(): + Command = ["bash", "-c", +- "zypper --no-gpg-checks --non-interactive -q search -s --match-exact ambari-agent | grep ambari-agent | sed -re 's/\s+/ /g' | cut -d '|' -f 4 | tr '\\n' ', ' | sed -s 's/[-|~][A-Za-z0-9]*//g'"] ++ "zypper --no-gpg-checks --non-interactive -q search -s --match-exact ambari-agent | grep ambari-agent | sed -re 's/\\s+/ /g' | cut -d '|' -f 4 | tr '\\n' ', ' | sed -s 's/[-|~][A-Za-z0-9]*//g'"] + elif OSCheck.is_windows_family(): + Command = ["cmd", "/c", "choco list ambari-agent --pre --all | findstr ambari-agent"] + elif OSCheck.is_ubuntu_family(): + Command = ["bash", "-c", +- "apt-cache -q show ambari-agent|grep 'Version\:'|cut -d ' ' -f 2| tr '\\n' ', '|sed -s 's/[-|~][A-Za-z0-9]*//g'"] ++ "apt-cache -q show ambari-agent|grep 'Version\\:'|cut -d ' ' -f 2| tr '\\n' ', '|sed -s 's/[-|~][A-Za-z0-9]*//g'"] + else: + Command = ["bash", "-c", +- "yum -q list all ambari-agent | grep -E '^ambari-agent' | sed -re 's/\s+/ /g' | cut -d ' ' -f 2 | tr '\\n' ', ' | sed -s 's/[-|~][A-Za-z0-9]*//g'"] ++ "yum -q list all ambari-agent | grep -E '^ambari-agent' | sed -re 's/\\s+/ /g' | cut -d ' ' -f 2 | tr '\\n' ', ' | sed -s 's/[-|~][A-Za-z0-9]*//g'"] + return execOsCommand(Command) + + def checkServerReachability(host, port): +@@ -356,7 +356,7 @@ + if (not retcode["exitstatus"] == 0): + return retcode + else: +- return {"exitstatus": 2, "log": "Ambari repo file not found: {0}".format(ambari_repo_file)} ++ return {"exitstatus": 2, "log": "Ambari repo file not found: {}".format(ambari_repo_file)} + pass + elif retcode["exitstatus"] == 1: + if retcode["log"] != None and retcode["log"] != "" and retcode["log"][0].strip() != "": +@@ -369,7 +369,7 @@ + logmessage = "Desired version ("+projectVersion+") of ambari-agent package is not available." + ambari_repo_file = get_ambari_repo_file_full_name() + if not os.path.exists(ambari_repo_file): +- logmessage = logmessage + " " + "Ambari repo file not found: {0}".format(ambari_repo_file) ++ logmessage = logmessage + " " + "Ambari repo file not found: {}".format(ambari_repo_file) + return {"exitstatus": retcode["exitstatus"], "log": logmessage} + pass + else: +@@ -389,7 +389,7 @@ + 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 @@ + logging.basicConfig(level=logging.DEBUG) + ret = main(sys.argv) + retcode = ret["exitstatus"] +- print ret["log"] ++ print((ret["log"])) + sys.exit(retcode) +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/ACCUMULO/1.6.1.2.2.0/package/scripts/accumulo_client.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/ACCUMULO/1.6.1.2.2.0/package/scripts/accumulo_client.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/ACCUMULO/1.6.1.2.2.0/package/scripts/accumulo_client.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/ACCUMULO/1.6.1.2.2.0/package/scripts/accumulo_client.py 2022-07-11 00:52:32.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 resource_management.libraries.functions.stack_features import check_stack_feature + from resource_management.libraries.functions import StackFeature + +-from accumulo_configuration import setup_conf_dir ++from .accumulo_configuration import setup_conf_dir + + + class AccumuloClient(Script): +@@ -35,7 +35,7 @@ + + + def configure(self, env): +- import params ++ from . import params + env.set_params(params) + + setup_conf_dir(name='client') +@@ -46,7 +46,7 @@ + + + def pre_upgrade_restart(self, env, upgrade_type=None): +- import params ++ from . import params + env.set_params(params) + + # this function should not execute if the version can't be determined or +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/ACCUMULO/1.6.1.2.2.0/package/scripts/accumulo_configuration.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/ACCUMULO/1.6.1.2.2.0/package/scripts/accumulo_configuration.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/ACCUMULO/1.6.1.2.2.0/package/scripts/accumulo_configuration.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/ACCUMULO/1.6.1.2.2.0/package/scripts/accumulo_configuration.py 2022-07-11 00:52:32.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + from resource_management.libraries.resources.xml_config import XmlConfig + + def setup_conf_dir(name=None): # 'master' or 'tserver' or 'monitor' or 'gc' or 'tracer' or 'client' +- import params ++ from . import params + + # check if confdir is a link + if not os.path.exists(params.conf_dir) or not os.path.islink(params.conf_dir): +@@ -52,12 +52,12 @@ + configuration_attributes=params.config['configurationAttributes']['accumulo-site'], + owner = params.accumulo_user, + group = params.user_group, +- mode = 0644 ++ mode = 0o644 + ) + + # create env file + File(format("{dest_conf_dir}/accumulo-env.sh"), +- mode=0644, ++ mode=0o644, + group=params.user_group, + owner=params.accumulo_user, + content=InlineTemplate(params.env_sh_template) +@@ -66,7 +66,7 @@ + dest_conf_dir = params.server_conf_dir + # create server conf directory + Directory( params.server_conf_dir, +- mode=0700, ++ mode=0o700, + owner = params.accumulo_user, + group = params.user_group, + create_parents = True +@@ -82,7 +82,7 @@ + configuration_attributes=params.config['configurationAttributes']['accumulo-site'], + owner = params.accumulo_user, + group = params.user_group, +- mode = 0600 ++ mode = 0o600 + ) + + # create pid dir +@@ -91,7 +91,7 @@ + group = params.user_group, + create_parents = True, + cd_access = "a", +- mode = 0755, ++ mode = 0o755, + ) + + # create log dir +@@ -100,12 +100,12 @@ + group = params.user_group, + create_parents = True, + cd_access = "a", +- mode = 0755, ++ mode = 0o755, + ) + + # create env file + File(format("{dest_conf_dir}/accumulo-env.sh"), +- mode=0644, ++ mode=0o644, + group=params.user_group, + owner=params.accumulo_user, + content=InlineTemplate(params.server_env_sh_template) +@@ -128,7 +128,7 @@ + copy_site_property(configs, 'instance.zookeeper.timeout') + copy_site_property(configs, 'trace.span.receivers') + copy_site_property(configs, 'trace.zookeeper.path') +- for key,value in params.config['configurations']['accumulo-site'].iteritems(): ++ for key,value in params.config['configurations']['accumulo-site'].items(): + if key.startswith("trace.span.receiver."): + configs[key] = value + PropertiesFile(format("{dest_conf_dir}/client.conf"), +@@ -140,14 +140,14 @@ + # create log4j.properties files + if (params.log4j_props != None): + File(format("{dest_conf_dir}/log4j.properties"), +- mode=0644, ++ mode=0o644, + group=params.user_group, + owner=params.accumulo_user, + content=params.log4j_props + ) + else: + File(format("{dest_conf_dir}/log4j.properties"), +- mode=0644, ++ mode=0o644, + group=params.user_group, + owner=params.hbase_user + ) +@@ -175,13 +175,13 @@ + type="directory", + action="create_on_execute", + owner=params.accumulo_user, +- mode=0700 ++ mode=0o700 + ) + params.HdfsResource(format("{params.parent_dir}"), + type="directory", + action="create_on_execute", + owner=params.accumulo_user, +- mode=0700 ++ mode=0o700 + ) + params.HdfsResource(None, action="execute") + if params.security_enabled and params.has_secure_user_auth: +@@ -203,7 +203,7 @@ + passfile = format("{params.exec_tmp_dir}/pass") + try: + File(passfile, +- mode=0600, ++ mode=0o600, + group=params.user_group, + owner=params.accumulo_user, + content=InlineTemplate('{{root_password}}\n' +@@ -258,7 +258,7 @@ + cmdfile = format("{params.exec_tmp_dir}/resetcmds") + try: + File(cmdfile, +- mode=0600, ++ mode=0o600, + group=params.user_group, + owner=params.accumulo_user, + content=InlineTemplate('grant -t trace -u {{trace_user}} Table.ALTER_TABLE\n' +@@ -281,7 +281,7 @@ + user=params.accumulo_user) + else: + File(rpassfile, +- mode=0600, ++ mode=0o600, + group=params.user_group, + owner=params.accumulo_user, + content=InlineTemplate('{{root_password}}\n\n') +@@ -304,18 +304,18 @@ + try_remove(cmdfile) + + def copy_site_property(configs, name): +- import params ++ from . import params + if name in params.config['configurations']['accumulo-site']: + configs[name] = params.config['configurations']['accumulo-site'][name] + + def create_user(user, password): +- import params ++ from . import params + rpassfile = format("{params.exec_tmp_dir}/pass0") + passfile = format("{params.exec_tmp_dir}/pass") + cmdfile = format("{params.exec_tmp_dir}/cmds") + try: + File(cmdfile, +- mode=0600, ++ mode=0o600, + group=params.user_group, + owner=params.accumulo_user, + content=InlineTemplate(format("createuser {user}\n" +@@ -331,13 +331,13 @@ + user=params.accumulo_user) + else: + File(rpassfile, +- mode=0600, ++ mode=0o600, + group=params.user_group, + owner=params.accumulo_user, + content=InlineTemplate('{{root_password}}\n\n') + ) + File(passfile, +- mode=0600, ++ mode=0o600, + group=params.user_group, + owner=params.accumulo_user, + content=InlineTemplate(format("{params.root_password}\n" +@@ -364,7 +364,7 @@ + + # create file 'name' from template + def accumulo_TemplateConfig(name, dest_conf_dir, tag=None): +- import params ++ from . import params + + TemplateConfig( format("{dest_conf_dir}/{name}"), + owner = params.accumulo_user, +@@ -374,10 +374,10 @@ + + # create static file 'name' + def accumulo_StaticFile(name, dest_conf_dir): +- import params ++ from . import params + + File(format("{dest_conf_dir}/{name}"), +- mode=0644, ++ mode=0o644, + group=params.user_group, + owner=params.accumulo_user, + content=StaticFile(name) +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/ACCUMULO/1.6.1.2.2.0/package/scripts/accumulo_gc.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/ACCUMULO/1.6.1.2.2.0/package/scripts/accumulo_gc.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/ACCUMULO/1.6.1.2.2.0/package/scripts/accumulo_gc.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/ACCUMULO/1.6.1.2.2.0/package/scripts/accumulo_gc.py 2022-07-11 00:52:32.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + + """ + +-from accumulo_script import AccumuloScript ++from .accumulo_script import AccumuloScript + + if __name__ == "__main__": + AccumuloScript('gc').execute() +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/ACCUMULO/1.6.1.2.2.0/package/scripts/accumulo_master.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/ACCUMULO/1.6.1.2.2.0/package/scripts/accumulo_master.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/ACCUMULO/1.6.1.2.2.0/package/scripts/accumulo_master.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/ACCUMULO/1.6.1.2.2.0/package/scripts/accumulo_master.py 2022-07-11 00:52:32.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + + """ + +-from accumulo_script import AccumuloScript ++from .accumulo_script import AccumuloScript + + if __name__ == "__main__": + AccumuloScript('master').execute() +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/ACCUMULO/1.6.1.2.2.0/package/scripts/accumulo_monitor.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/ACCUMULO/1.6.1.2.2.0/package/scripts/accumulo_monitor.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/ACCUMULO/1.6.1.2.2.0/package/scripts/accumulo_monitor.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/ACCUMULO/1.6.1.2.2.0/package/scripts/accumulo_monitor.py 2022-07-11 00:52:32.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + + """ + +-from accumulo_script import AccumuloScript ++from .accumulo_script import AccumuloScript + + if __name__ == "__main__": + AccumuloScript('monitor').execute() +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/ACCUMULO/1.6.1.2.2.0/package/scripts/accumulo_script.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/ACCUMULO/1.6.1.2.2.0/package/scripts/accumulo_script.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/ACCUMULO/1.6.1.2.2.0/package/scripts/accumulo_script.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/ACCUMULO/1.6.1.2.2.0/package/scripts/accumulo_script.py 2022-07-11 00:52:32.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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,8 +31,8 @@ + from resource_management.libraries.functions.stack_features import check_stack_feature + from resource_management.libraries.functions import StackFeature + +-from accumulo_configuration import setup_conf_dir +-from accumulo_service import accumulo_service ++from .accumulo_configuration import setup_conf_dir ++from .accumulo_service import accumulo_service + + class AccumuloScript(Script): + +@@ -46,14 +46,14 @@ + + + def configure(self, env): +- import params ++ from . import params + env.set_params(params) + + setup_conf_dir(name=self.component) + + + def start(self, env, upgrade_type=None): +- import params ++ from . import params + env.set_params(params) + self.configure(env) # for security + +@@ -61,14 +61,14 @@ + + + def stop(self, env, upgrade_type=None): +- import params ++ from . import params + env.set_params(params) + + accumulo_service( self.component, action = 'stop') + + + def status(self, env): +- import status_params ++ from . import status_params + env.set_params(status_params) + + pid_file = self.get_pid_files()[0] +@@ -76,7 +76,7 @@ + + + def pre_upgrade_restart(self, env, upgrade_type=None): +- import params ++ from . import params + env.set_params(params) + + # this function should not execute if the version can't be determined or +@@ -86,15 +86,15 @@ + + stack_component = stack_select.get_package_name() + +- Logger.info("Executing Accumulo Upgrade pre-restart for {0}".format(stack_component)) ++ Logger.info("Executing Accumulo Upgrade pre-restart for {}".format(stack_component)) + stack_select.select_packages(params.version) + + def get_log_folder(self): +- import params ++ from . import params + return params.log_dir + + def get_pid_files(self): +- import status_params ++ from . import status_params + + pid_file = "{pid_dir}/accumulo-{accumulo_user}-{component}.pid".format( + pid_dir = status_params.pid_dir, +@@ -103,7 +103,7 @@ + return [pid_file] + + def get_user(self): +- import params ++ from . import params + return params.accumulo_user + + if __name__ == "__main__": +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/ACCUMULO/1.6.1.2.2.0/package/scripts/accumulo_service.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/ACCUMULO/1.6.1.2.2.0/package/scripts/accumulo_service.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/ACCUMULO/1.6.1.2.2.0/package/scripts/accumulo_service.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/ACCUMULO/1.6.1.2.2.0/package/scripts/accumulo_service.py 2022-07-11 00:52:32.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + + def accumulo_service( name, + action = 'start'): # 'start' or 'stop' or 'status' +- import params ++ from . import params + + role = name + pid_file = format("{pid_dir}/accumulo-{accumulo_user}-{role}.pid") +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/ACCUMULO/1.6.1.2.2.0/package/scripts/accumulo_tracer.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/ACCUMULO/1.6.1.2.2.0/package/scripts/accumulo_tracer.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/ACCUMULO/1.6.1.2.2.0/package/scripts/accumulo_tracer.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/ACCUMULO/1.6.1.2.2.0/package/scripts/accumulo_tracer.py 2022-07-11 00:52:32.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + + """ + +-from accumulo_script import AccumuloScript ++from .accumulo_script import AccumuloScript + + if __name__ == "__main__": + AccumuloScript('tracer').execute() +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/ACCUMULO/1.6.1.2.2.0/package/scripts/accumulo_tserver.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/ACCUMULO/1.6.1.2.2.0/package/scripts/accumulo_tserver.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/ACCUMULO/1.6.1.2.2.0/package/scripts/accumulo_tserver.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/ACCUMULO/1.6.1.2.2.0/package/scripts/accumulo_tserver.py 2022-07-11 00:52:32.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + + """ + +-from accumulo_script import AccumuloScript ++from .accumulo_script import AccumuloScript + + if __name__ == "__main__": + AccumuloScript('tserver').execute() +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/ACCUMULO/1.6.1.2.2.0/package/scripts/__init__.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/ACCUMULO/1.6.1.2.2.0/package/scripts/__init__.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/ACCUMULO/1.6.1.2.2.0/package/scripts/__init__.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/ACCUMULO/1.6.1.2.2.0/package/scripts/__init__.py 2022-07-11 00:52:32.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/ACCUMULO/1.6.1.2.2.0/package/scripts/params.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/ACCUMULO/1.6.1.2.2.0/package/scripts/params.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/ACCUMULO/1.6.1.2.2.0/package/scripts/params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/ACCUMULO/1.6.1.2.2.0/package/scripts/params.py 2022-07-11 00:52:32.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + from resource_management.libraries.functions import StackFeature + from ambari_commons.ambari_metrics_helper import select_metric_collector_hosts_from_hostnames + +-import status_params ++from . import status_params + + # server configurations + config = Script.get_config() +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/ACCUMULO/1.6.1.2.2.0/package/scripts/service_check.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/ACCUMULO/1.6.1.2.2.0/package/scripts/service_check.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/ACCUMULO/1.6.1.2.2.0/package/scripts/service_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/ACCUMULO/1.6.1.2.2.0/package/scripts/service_check.py 2022-07-11 00:52:32.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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,7 +27,7 @@ + + class AccumuloServiceCheck(Script): + def service_check(self, env): +- import params ++ from . import params + env.set_params(params) + + smokeuser_kinit_cmd = format("{kinit_path_local} -kt {smoke_user_keytab} {smokeuser_principal};") if params.security_enabled else "" +@@ -35,7 +35,7 @@ + cmdfile = format("{exec_tmp_dir}/cmds") + try: + File(cmdfile, +- mode=0600, ++ mode=0o600, + group=params.user_group, + owner=params.smoke_test_user, + content=InlineTemplate('createtable testtable\n' +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/ACCUMULO/1.6.1.2.2.0/package/scripts/status_params.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/ACCUMULO/1.6.1.2.2.0/package/scripts/status_params.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/ACCUMULO/1.6.1.2.2.0/package/scripts/status_params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/ACCUMULO/1.6.1.2.2.0/package/scripts/status_params.py 2022-07-11 00:52:32.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/AMBARI_INFRA_SOLR/0.1.0/package/scripts/collection.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/AMBARI_INFRA_SOLR/0.1.0/package/scripts/collection.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/AMBARI_INFRA_SOLR/0.1.0/package/scripts/collection.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/AMBARI_INFRA_SOLR/0.1.0/package/scripts/collection.py 2022-07-11 00:52:32.000000000 +0800 +@@ -33,7 +33,7 @@ + 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, +@@ -48,7 +48,7 @@ + # IP resolve - for unsecure cluster + host_ip_pairs = {} + if not params.security_enabled: +- keys = host_core_map.keys() ++ keys = list(host_core_map.keys()) + for key in keys: + if command_commons.is_ip(key): + resolved_hostname = command_commons.resolve_ip_to_hostname(key) +@@ -138,7 +138,7 @@ + + 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 @@ + 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 @@ + 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 @@ + 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 @@ + 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 @@ + + Directory( + [format("{core_root_without_backup_dir}")], +- mode=0755, ++ mode=0o755, + cd_access='a', + create_parents=True, + owner=params.infra_solr_user, +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/AMBARI_INFRA_SOLR/0.1.0/package/scripts/command_commons.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/AMBARI_INFRA_SOLR/0.1.0/package/scripts/command_commons.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/AMBARI_INFRA_SOLR/0.1.0/package/scripts/command_commons.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/AMBARI_INFRA_SOLR/0.1.0/package/scripts/command_commons.py 2022-07-11 00:52:32.000000000 +0800 +@@ -301,7 +301,7 @@ + try: + socket.inet_aton(addr) + return True +- except socket.error: ++ except OSError: + return False + + def resolve_ip_to_hostname(ip): +@@ -310,7 +310,7 @@ + Logger.info(format("Resolved {ip} to {host_name}")) + fqdn_name = socket.getaddrinfo(host_name, 0, 0, 0, 0, socket.AI_CANONNAME)[0][3].lower() + return host_name if host_name == fqdn_name else fqdn_name +- except socket.error: ++ except OSError: + pass + return ip + +@@ -318,7 +318,7 @@ + """ + Create hdfs command. Append kinit to the command if required. + """ +- kinit_cmd = "{0} -kt {1} {2};".format(kinit_path_local, params.infra_solr_kerberos_keytab, params.infra_solr_kerberos_principal) if params.security_enabled else "" ++ kinit_cmd = "{} -kt {} {};".format(kinit_path_local, params.infra_solr_kerberos_keytab, params.infra_solr_kerberos_principal) if params.security_enabled else "" + return kinit_cmd + command + + def execute_commad(command): +@@ -331,7 +331,7 @@ + cmd=create_command(format('hdfs dfs -mv {source_dir} {target_dir}')) + returncode, stdout = execute_commad(cmd) + if returncode: +- raise Exception("Unable to move HDFS dir '{0}' to '{1}' (return code: {2})".format(source_dir, target_dir, str(returncode))) ++ raise Exception("Unable to move HDFS dir '{}' to '{}' (return code: {})".format(source_dir, target_dir, str(returncode))) + return stdout.strip() + + def check_hdfs_folder_exists(hdfs_dir): +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/AMBARI_INFRA_SOLR/0.1.0/package/scripts/migrate.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/AMBARI_INFRA_SOLR/0.1.0/package/scripts/migrate.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/AMBARI_INFRA_SOLR/0.1.0/package/scripts/migrate.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/AMBARI_INFRA_SOLR/0.1.0/package/scripts/migrate.py 2022-07-11 00:52:32.000000000 +0800 +@@ -58,5 +58,5 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/AMBARI_INFRA_SOLR/0.1.0/package/scripts/setup_infra_solr.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/AMBARI_INFRA_SOLR/0.1.0/package/scripts/setup_infra_solr.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/AMBARI_INFRA_SOLR/0.1.0/package/scripts/setup_infra_solr.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/AMBARI_INFRA_SOLR/0.1.0/package/scripts/setup_infra_solr.py 2022-07-11 00:52:32.000000000 +0800 +@@ -31,7 +31,7 @@ + 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 @@ + ) + + 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 @@ + ) + + File(params.infra_solr_log, +- mode=0644, ++ mode=0o644, + owner=params.infra_solr_user, + group=params.user_group, + content='' +@@ -56,7 +56,7 @@ + + 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 @@ + 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 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/AMBARI_INFRA_SOLR/0.1.0/package/scripts/status_params.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/AMBARI_INFRA_SOLR/0.1.0/package/scripts/status_params.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/AMBARI_INFRA_SOLR/0.1.0/package/scripts/status_params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/AMBARI_INFRA_SOLR/0.1.0/package/scripts/status_params.py 2022-07-11 00:52:32.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + """ + Licensed to the Apache Software Foundation (ASF) under one +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/AMBARI_INFRA_SOLR/0.1.0/service_advisor.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/AMBARI_INFRA_SOLR/0.1.0/service_advisor.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/AMBARI_INFRA_SOLR/0.1.0/service_advisor.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/AMBARI_INFRA_SOLR/0.1.0/service_advisor.py 2022-07-11 00:52:32.000000000 +0800 +@@ -33,12 +33,12 @@ + 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): + + def __init__(self, *args, **kwargs): +- self.as_super = super(Ambari_Infra_SolrServiceAdvisor, self) ++ self.as_super = super() + self.as_super.__init__(*args, **kwargs) + + # Always call these methods +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/alerts/alert_ambari_metrics_monitor.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/alerts/alert_ambari_metrics_monitor.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/alerts/alert_ambari_metrics_monitor.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/alerts/alert_ambari_metrics_monitor.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + """ + Licensed to the Apache Software Foundation (ASF) under one +@@ -86,7 +86,7 @@ + if configurations is None: + return (RESULT_CODE_UNKNOWN, ['There were no configurations supplied to the script.']) + +- if set([AMS_MONITOR_PID_DIR]).issubset(configurations): ++ if {AMS_MONITOR_PID_DIR}.issubset(configurations): + AMS_MONITOR_PID_PATH = os.path.join(configurations[AMS_MONITOR_PID_DIR], 'ambari-metrics-monitor.pid') + else: + return (RESULT_CODE_UNKNOWN, ['The ams_monitor_pid_dir is a required parameter.']) +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/ams.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/ams.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/ams.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/ams.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + + @OsFamilyFuncImpl(os_family=OSConst.WINSRV_FAMILY) + def ams(name=None): +- import params ++ from . import params + if name == 'collector': + if not check_windows_service_exists(params.ams_collector_win_service_name): + Execute(format("cmd /C cd {ams_collector_home_dir} & ambari-metrics-collector.cmd setup")) +@@ -90,7 +90,7 @@ + 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 @@ + 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 @@ + 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 @@ + configuration_attributes=params.config['configurationAttributes']['core-site'], + owner=params.ams_user, + group=params.user_group, +- mode=0644 ++ mode=0o644 + ) + + else: +@@ -136,7 +136,7 @@ + target = compress_backslashes(glob.glob(os.path.expandvars(target))[0]) + if not os.path.exists(real_link): + #TODO check the symlink destination too. Broken in Python 2.x on Windows. +- Execute('cmd /c mklink "{0}" "{1}"'.format(real_link, target)) ++ Execute('cmd /c mklink "{}" "{}"'.format(real_link, target)) + pass + + elif name == 'monitor': +@@ -156,7 +156,7 @@ + target = compress_backslashes(glob.glob(os.path.expandvars(target))[0]) + if not os.path.exists(real_link): + #TODO check the symlink destination too. Broken in Python 2.x on Windows. +- Execute('cmd /c mklink "{0}" "{1}"'.format(real_link, target)) ++ Execute('cmd /c mklink "{}" "{}"'.format(real_link, target)) + + Directory(params.ams_monitor_conf_dir, + owner=params.ams_user, +@@ -208,7 +208,7 @@ + + @OsFamilyFuncImpl(os_family=OsFamilyImpl.DEFAULT) + def ams(name=None, action=None): +- import params ++ from . import params + + if name == 'collector': + Directory(params.ams_collector_conf_dir, +@@ -231,7 +231,7 @@ + if params.clusterHostInfoDict: + master_components = [] + slave_components = [] +- components = dict(params.clusterHostInfoDict).keys() ++ components = list(dict(params.clusterHostInfoDict).keys()) + known_slave_components = ["nodemanager", "metrics_monitor", "datanode", "hbase_regionserver"] + for component in components: + if component and component.endswith("_hosts"): +@@ -296,7 +296,7 @@ + + 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 +312,7 @@ + group=params.user_group, + cd_access="a", + create_parents = True, +- mode=0755, ++ mode=0o755, + ) + + Directory(params.ams_collector_pid_dir, +@@ -320,13 +320,13 @@ + 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 +340,7 @@ + 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 +348,7 @@ + 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 +363,7 @@ + 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 +372,7 @@ + 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 +388,7 @@ + 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 +397,7 @@ + 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 +423,13 @@ + 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 +458,7 @@ + owner=params.ams_user, + group=params.user_group, + cd_access="a", +- mode=0755, ++ mode=0o755, + create_parents = True + ) + +@@ -507,7 +507,7 @@ + Directory(ams_grafana_directory, + owner=params.ams_user, + group=params.user_group, +- mode=0755, ++ mode=0o755, + create_parents = True, + recursive_ownership = True + ) +@@ -522,7 +522,7 @@ + owner=params.ams_user, + group=params.user_group, + content=InlineTemplate(params.ams_grafana_ini_template), +- mode=0600 ++ mode=0o600 + ) + + if action != 'stop': +@@ -555,7 +555,7 @@ + def export_ca_certs(dir_path): + # export ca certificates on every restart to handle changed truststore content + +- import params ++ from . import params + import tempfile + + ca_certs_path = os.path.join(dir_path, params.metric_truststore_ca_certs) +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/ams_service.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/ams_service.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/ams_service.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/ams_service.py 2022-07-11 00:52:32.000000000 +0800 +@@ -24,12 +24,12 @@ + from resource_management.libraries.functions.format import format + from ambari_commons import OSConst + from ambari_commons.os_family_impl import OsFamilyFuncImpl, OsFamilyImpl +-from hbase_service import hbase_service ++from .hbase_service import hbase_service + import os + + @OsFamilyFuncImpl(os_family=OSConst.WINSRV_FAMILY) + def ams_service(name, action): +- import params ++ from . import params + if name == 'collector': + Service(params.ams_embedded_hbase_win_service_name, action=action) + Service(params.ams_collector_win_service_name, action=action) +@@ -38,7 +38,7 @@ + + @OsFamilyFuncImpl(os_family=OsFamilyImpl.DEFAULT) + def ams_service(name, action): +- import params ++ from . import params + + if name == 'collector': + cmd = format("{ams_collector_script} --config {ams_collector_conf_dir}") +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/functions.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/functions.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/functions.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/functions.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + @param xmn_percent: float (e.g 0.2) + @param xmn_max: integer (e.g 512) + """ +- heapsize = int(re.search('\d+', str(heapsize_str)).group(0)) +- heapsize_unit = re.search('\D+', str(heapsize_str)).group(0) ++ heapsize = int(re.search(r'\d+', str(heapsize_str)).group(0)) ++ heapsize_unit = re.search(r'\D+', str(heapsize_str)).group(0) + + xmn_val = int(math.floor(heapsize*xmn_percent)) + xmn_val -= xmn_val % 8 +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/hbase_master.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/hbase_master.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/hbase_master.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/hbase_master.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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,8 @@ + + import sys + +-from hbase import hbase +-from hbase_service import hbase_service ++from .hbase import hbase ++from .hbase_service import hbase_service + from hbase_decommission import hbase_decommission + from resource_management.libraries.functions.check_process_status import check_process_status + +@@ -31,13 +31,13 @@ + self.install_packages(env) + + def configure(self, env, action = None): +- import params ++ from . import params + env.set_params(params) + + hbase('master', action) + + def start(self, env): +- import params ++ from . import params + env.set_params(params) + self.configure(env, action = 'start') # for security + +@@ -46,7 +46,7 @@ + ) + + def stop(self, env): +- import params ++ from . import params + env.set_params(params) + + hbase_service( 'master', +@@ -54,13 +54,13 @@ + ) + + def status(self, env): +- import status_params ++ from . import status_params + env.set_params(status_params) + pid_file = format("{pid_dir}/hbase-{hbase_user}-master.pid") + check_process_status(pid_file) + + def decommission(self, env): +- import params ++ from . import params + env.set_params(params) + + hbase_decommission(env) +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/hbase.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/hbase.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/hbase.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/hbase.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + + @OsFamilyFuncImpl(os_family=OSConst.WINSRV_FAMILY) + def hbase(name=None, action = None): +- import params ++ from . import params + Directory(params.hbase_conf_dir, + owner = params.hadoop_user, + create_parents = True +@@ -93,7 +93,7 @@ + @OsFamilyFuncImpl(os_family=OsFamilyImpl.DEFAULT) + def hbase(name=None # 'master' or 'regionserver' or 'client' + , action=None): +- import params ++ from . import params + + Directory(params.hbase_conf_dir, + owner = params.hbase_user, +@@ -113,7 +113,7 @@ + owner = params.hbase_user, + group = params.user_group, + cd_access="a", +- mode=0775, ++ mode=0o775, + create_parents = True + ) + +@@ -152,7 +152,7 @@ + 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 +@@ -202,14 +202,14 @@ + 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": +@@ -222,7 +222,7 @@ + type="directory", + action="create_on_execute", + owner=params.hbase_user, +- mode=0775, ++ mode=0o775, + dfs_type=params.dfs_type + ) + +@@ -230,7 +230,7 @@ + type="directory", + action="create_on_execute", + owner=params.hbase_user, +- mode=0711, ++ mode=0o711, + dfs_type=params.dfs_type + ) + +@@ -238,7 +238,7 @@ + + 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 + +@@ -261,20 +261,20 @@ + + 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 + ) + + def hbase_TemplateConfig(name, tag=None, user=None): +- import params ++ from . import params + + TemplateConfig( os.path.join(params.hbase_conf_dir, name), + owner = user, +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/hbase_regionserver.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/hbase_regionserver.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/hbase_regionserver.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/hbase_regionserver.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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,8 @@ + + import sys + +-from hbase import hbase +-from hbase_service import hbase_service ++from .hbase import hbase ++from .hbase_service import hbase_service + from resource_management.libraries.functions.check_process_status import check_process_status + + +@@ -30,13 +30,13 @@ + self.install_packages(env) + + def configure(self, env, action = None): +- import params ++ from . import params + env.set_params(params) + + hbase('regionserver', action) + + def start(self, env): +- import params ++ from . import params + env.set_params(params) + self.configure(env, action = 'start') # for security + +@@ -45,7 +45,7 @@ + ) + + def stop(self, env): +- import params ++ from . import params + env.set_params(params) + + hbase_service( 'regionserver', +@@ -53,13 +53,13 @@ + ) + + def status(self, env): +- import status_params ++ from . import status_params + env.set_params(status_params) + pid_file = format("{pid_dir}/hbase-{hbase_user}-regionserver.pid") + check_process_status(pid_file) + + def decommission(self, env): +- print "Decommission not yet implemented!" ++ print("Decommission not yet implemented!") + + + if __name__ == "__main__": +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/hbase_service.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/hbase_service.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/hbase_service.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/hbase_service.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + name, + action = 'start'): # 'start' or 'stop' or 'status' + +- import params ++ from . import params + + role = name + cmd = format("{daemon_script} --config {hbase_conf_dir}") +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/__init__.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/__init__.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/__init__.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/__init__.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/metrics_collector.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/metrics_collector.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/metrics_collector.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/metrics_collector.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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,21 +22,21 @@ + from resource_management.libraries.functions.security_commons import build_expectations, \ + cached_kinit_executor, get_params_from_filesystem, validate_security_config_properties, \ + FILE_TYPE_XML +-from ams import ams +-from ams_service import ams_service +-from hbase import hbase +-from status import check_service_status ++from .ams import ams ++from .ams_service import ams_service ++from .hbase import hbase ++from .status import check_service_status + from ambari_commons import OSConst + from ambari_commons.os_family_impl import OsFamilyImpl + + class AmsCollector(Script): + def install(self, env): +- import params ++ from . import params + env.set_params(params) + self.install_packages(env) + + def configure(self, env, action = None): +- import params ++ from . import params + env.set_params(params) + if action == 'start' and params.embedded_mode_multiple_instances: + raise Fail("AMS in embedded mode cannot have more than 1 instance. Delete all but 1 instances or switch to Distributed mode ") +@@ -51,27 +51,27 @@ + ams_service('collector', action = 'start') + + def stop(self, env, upgrade_type=None): +- import params ++ from . import params + env.set_params(params) + # Sometimes, stop() may be called before start(), in case restart() is initiated right after installation + self.configure(env, action = 'stop') # for security + ams_service('collector', action = 'stop') + + def status(self, env): +- import status_params ++ from . import status_params + env.set_params(status_params) + check_service_status(env, name='collector') + + def get_log_folder(self): +- import params ++ from . import params + return params.ams_collector_log_dir + + def get_user(self): +- import params ++ from . import params + return params.ams_user + + def get_pid_files(self): +- import status ++ from . import status + return status.get_collector_pid_files() + + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/metrics_grafana.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/metrics_grafana.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/metrics_grafana.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/metrics_grafana.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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,25 +20,25 @@ + + from resource_management import Script, Execute + from resource_management.libraries.functions import format +-from status import check_service_status +-from ams import ams ++from .status import check_service_status ++from .ams import ams + from resource_management.core.logger import Logger + from resource_management.core import sudo + + class AmsGrafana(Script): + def install(self, env): +- import params ++ from . import params + env.set_params(params) + self.install_packages(env) + self.configure(env) # for security + + def configure(self, env, action = None): +- import params ++ from . import params + env.set_params(params) + ams(name='grafana', action=action) + + def start(self, env, upgrade_type=None): +- import params ++ from . import params + env.set_params(params) + self.configure(env, action = 'start') + +@@ -51,9 +51,9 @@ + if not sudo.path_exists(pidfile): + Logger.warning("Pid file doesn't exist after starting of the component.") + else: +- Logger.info("Grafana Server has started with pid: {0}".format(sudo.read_file(pidfile).strip())) ++ Logger.info("Grafana Server has started with pid: {}".format(sudo.read_file(pidfile).strip())) + +- from metrics_grafana_util import create_ams_datasource, create_ams_dashboards, create_grafana_admin_pwd ++ from .metrics_grafana_util import create_ams_datasource, create_ams_dashboards, create_grafana_admin_pwd + + #Set Grafana admin pwd + create_grafana_admin_pwd() +@@ -63,7 +63,7 @@ + create_ams_dashboards() + + def stop(self, env, upgrade_type=None): +- import params ++ from . import params + env.set_params(params) + self.configure(env, action = 'stop') + Execute((format("{ams_grafana_script}"), 'stop'), +@@ -72,12 +72,12 @@ + ) + + def status(self, env): +- import status_params ++ from . import status_params + env.set_params(status_params) + check_service_status(env, name='grafana') + + def get_pid_files(self): +- import status_params ++ from . import status_params + return [status_params.grafana_pid_file] + + if __name__ == "__main__": +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/metrics_grafana_util.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/metrics_grafana_util.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/metrics_grafana_util.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/metrics_grafana_util.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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,16 +17,16 @@ + 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 ++from .service_check import post_metrics_to_collector + from resource_management.core.logger import Logger + from resource_management.core.base import Fail + 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 +@@ -44,7 +44,7 @@ + Server = namedtuple('Server', [ 'protocol', 'host', 'port', 'user', 'password' ]) + + def perform_grafana_get_call(url, server): +- import params ++ from . import params + + grafana_https_enabled = server.protocol.lower() == 'https' + response = None +@@ -52,7 +52,7 @@ + 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,16 +62,16 @@ + ssl_version=Script.get_force_https_protocol_value() + ) + +- userAndPass = b64encode('{0}:{1}'.format(server.user, server.password)) ++ userAndPass = b64encode('{}:{}'.format(server.user, server.password)) + headers = { 'Authorization' : 'Basic %s' % userAndPass } + +- Logger.info("Connecting (GET) to %s:%s%s" % (server.host, server.port, url)) ++ Logger.info("Connecting (GET) to {}:{}{}".format(server.host, server.port, url)) + + conn.request("GET", url, headers = headers) + response = conn.getresponse() +- Logger.info("Http response: %s %s" % (response.status, response.reason)) ++ Logger.info("Http response: {} {}".format(response.status, response.reason)) + break +- except (httplib.HTTPException, socket.error) as ex: ++ except (http.client.HTTPException, OSError) 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)) +@@ -84,11 +84,11 @@ + return response + + def perform_grafana_put_call(url, id, payload, server): +- import params ++ from . import params + + response = None + data = None +- userAndPass = b64encode('{0}:{1}'.format(server.user, server.password)) ++ userAndPass = b64encode('{}:{}'.format(server.user, server.password)) + headers = {"Content-Type": "application/json", + 'Authorization' : 'Basic %s' % userAndPass } + grafana_https_enabled = server.protocol.lower() == 'https' +@@ -97,7 +97,7 @@ + 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 @@ + Logger.info("Http data: %s" % data) + conn.close() + break +- except (httplib.HTTPException, socket.error) as ex: ++ except (http.client.HTTPException, OSError) 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)) +@@ -125,11 +125,11 @@ + return (response, data) + + def perform_grafana_post_call(url, payload, server): +- import params ++ from . import params + + response = None + data = None +- userAndPass = b64encode('{0}:{1}'.format(server.user, server.password)) ++ userAndPass = b64encode('{}:{}'.format(server.user, server.password)) + Logger.debug('POST payload: %s' % payload) + headers = {"Content-Type": "application/json", "Content-Length" : len(payload), + 'Authorization' : 'Basic %s' % userAndPass} +@@ -139,9 +139,9 @@ + 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)) ++ Logger.info("Connecting (POST) to {}:{}{}".format(server.host, server.port, url)) + conn = network.get_http_connection( + server.host, + int(server.port), +@@ -152,7 +152,7 @@ + conn.request("POST", url, payload, headers) + + response = conn.getresponse() +- Logger.info("Http response: %s %s" % (response.status, response.reason)) ++ Logger.info("Http response: {} {}".format(response.status, response.reason)) + if response.status == 401: #Intermittent error thrown from Grafana + if i < params.grafana_connect_attempts - 1: + Logger.info("Connection to Grafana failed. Next retry in %s seconds." +@@ -163,7 +163,7 @@ + Logger.info("Http data: %s" % data) + conn.close() + break +- except (httplib.HTTPException, socket.error) as ex: ++ except (http.client.HTTPException, OSError) 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)) +@@ -176,7 +176,7 @@ + return (response, data) + + def perform_grafana_delete_call(url, server): +- import params ++ from . import params + + grafana_https_enabled = server.protocol.lower() == 'https' + response = None +@@ -185,7 +185,7 @@ + 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,16 +194,16 @@ + ssl_version=Script.get_force_https_protocol_value() + ) + +- userAndPass = b64encode('{0}:{1}'.format(server.user, server.password)) ++ userAndPass = b64encode('{}:{}'.format(server.user, server.password)) + headers = { 'Authorization' : 'Basic %s' % userAndPass } + +- Logger.info("Connecting (DELETE) to %s:%s%s" % (server.host, server.port, url)) ++ Logger.info("Connecting (DELETE) to {}:{}{}".format(server.host, server.port, url)) + + conn.request("DELETE", url, headers = headers) + response = conn.getresponse() +- Logger.info("Http response: %s %s" % (response.status, response.reason)) ++ Logger.info("Http response: {} {}".format(response.status, response.reason)) + break +- except (httplib.HTTPException, socket.error) as ex: ++ except (http.client.HTTPException, OSError) 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)) +@@ -216,9 +216,9 @@ + return response + + def is_unchanged_datasource_url(grafana_datasource_url, new_datasource_host): +- import params ++ from . import params + parsed_url = urlparse(grafana_datasource_url) +- Logger.debug("parsed url: scheme = %s, host = %s, port = %s" % ( ++ Logger.debug("parsed url: scheme = {}, host = {}, port = {}".format( + parsed_url.scheme, parsed_url.hostname, parsed_url.port)) + Logger.debug("collector: scheme = %s, host = %s, port = %s" % + (params.metric_collector_protocol, new_datasource_host, +@@ -243,7 +243,7 @@ + metric_json, headers, ca_certs) + + def create_grafana_admin_pwd(): +- import params ++ from . import params + + serverCall1 = Server(protocol = params.ams_grafana_protocol.strip(), + host = params.ams_grafana_host.strip(), +@@ -284,7 +284,7 @@ + pass + + def create_ams_datasource(): +- import params ++ from . import params + server = Server(protocol = params.ams_grafana_protocol.strip(), + host = params.ams_grafana_host.strip(), + port = params.ams_grafana_port, +@@ -323,7 +323,7 @@ + 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 +@@ -380,7 +380,7 @@ + """ + Create dashboards in grafana from the json files + """ +- import params ++ from . import params + server = Server(protocol = params.ams_grafana_protocol.strip(), + host = params.ams_grafana_host.strip(), + port = params.ams_grafana_port, +@@ -425,9 +425,9 @@ + if dashboard_files: + for dashboard_file in dashboard_files: + try: +- with open(dashboard_file, 'r') as file: ++ with open(dashboard_file) 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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/metrics_monitor.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/metrics_monitor.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/metrics_monitor.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/metrics_monitor.py 2022-07-11 00:52:32.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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,20 +19,20 @@ + """ + + from resource_management.libraries.script.script import Script +-from ams import ams +-from ams_service import ams_service +-from status import check_service_status ++from .ams import ams ++from .ams_service import ams_service ++from .status import check_service_status + from ambari_commons.repo_manager.repo_manager_helper import check_installed_metrics_hadoop_sink_version + + class AmsMonitor(Script): + def install(self, env): +- import params ++ from . import params + env.set_params(params) + self.install_packages(env) + self.configure(env) # for security + + def configure(self, env): +- import params ++ from . import params + env.set_params(params) + ams(name='monitor') + +@@ -44,7 +44,7 @@ + ) + + def stop(self, env, upgrade_type=None): +- import params ++ from . import params + env.set_params(params) + + ams_service( 'monitor', +@@ -52,24 +52,24 @@ + ) + + def status(self, env): +- import status_params ++ from . import status_params + env.set_params(status_params) + check_service_status(env, name='monitor') + + def get_log_folder(self): +- import params ++ from . import params + return params.ams_monitor_log_dir + + def get_pid_files(self): +- import status_params ++ from . import status_params + return [status_params.monitor_pid_file] + + def get_user(self): +- import params ++ from . import params + return params.ams_user + + def check_hadoop_sink_version(self, env): +- import params ++ from . import params + check_installed_metrics_hadoop_sink_version(checked_version=params.min_hadoop_sink_version, + less_valid=False, + equal_valid=True) +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/params_linux.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/params_linux.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/params_linux.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/params_linux.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/params.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/params.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/params.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 + +@@ -33,15 +33,15 @@ + from resource_management.libraries.functions.substitute_vars import substitute_vars + from resource_management.libraries.resources.hdfs_resource import HdfsResource + +-import status_params +-from functions import calc_xmn_from_xms +-from functions import check_append_heap_property +-from functions import trim_heap_property ++from . import status_params ++from .functions import calc_xmn_from_xms ++from .functions import check_append_heap_property ++from .functions import trim_heap_property + + if OSCheck.is_windows_family(): +- from params_windows import * ++ from .params_windows import * + else: +- from params_linux import * ++ from .params_linux import * + # server configurations + config = Script.get_config() + exec_tmp_dir = Script.get_tmp_dir() +@@ -136,16 +136,16 @@ + 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) + data_dir = ambari_agent_config.get('agent', 'prefix') + ver_file = os.path.join(data_dir, 'version') +- f = open(ver_file, "r") ++ f = open(ver_file) + 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 +@@ -355,7 +355,7 @@ + ams_monitor_principal = config['configurations']['ams-hbase-security-site']['ams.monitor.principal'] + + if ams_monitor_keytab and ams_monitor_principal: +- monitor_kinit_cmd = '%s -kt %s %s' % (kinit_path_local, ams_monitor_keytab, ams_monitor_principal.replace('_HOST',_hostname_lowercase)) ++ monitor_kinit_cmd = '{} -kt {} {}'.format(kinit_path_local, ams_monitor_keytab, ams_monitor_principal.replace('_HOST',_hostname_lowercase)) + klist_cmd = '%s' % klist_path_local + + #Ambari metrics log4j settings +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/params_windows.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/params_windows.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/params_windows.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/params_windows.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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,4 +59,4 @@ + except: + pass + +-from service_mapping import * ++from .service_mapping import * +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/service_check.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/service_check.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/service_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/service_check.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 +@@ -49,7 +49,7 @@ + @OsFamilyFuncImpl(os_family=OSConst.WINSRV_FAMILY) + def service_check(self, env): + from resource_management.libraries.functions.windows_service_utils import check_windows_service_exists +- import params ++ from . import params + + env.set_params(params) + +@@ -81,7 +81,7 @@ + if params.metric_collector_https_enabled: + protocol = "https" + port = str(params.metric_collector_port) +- uri = '{0}://{1}:{2}{3}'.format( ++ uri = '{}://{}:{}{}'.format( + protocol, metric_collector_host, port, self.AMS_METRICS_POST_URL) + + call_curl_krb_request(tmp_dir, params.smoke_user_keytab, params.smoke_user_princ, uri, params.kinit_path_local, params.smoke_user, +@@ -102,20 +102,20 @@ + "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' +- uri = '{0}://{1}:{2}{3}'.format( ++ uri = '{}://{}:{}{}'.format( + protocol, metric_collector_host, port, self.AMS_METRICS_GET_URL % encoded_get_metrics_parameters) + + call_curl_krb_request(tmp_dir, params.smoke_user_keytab, params.smoke_user_princ, uri, params.kinit_path_local, params.smoke_user, + self.AMS_READ_TIMEOUT, method, tries = self.AMS_READ_TRIES, current_time = current_time, random_value = random_value1) + else: +- Logger.info("Connecting (GET) to %s:%s%s" % (metric_collector_host, ++ Logger.info("Connecting (GET) to {}:{}{}".format(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), +@@ -125,7 +125,7 @@ + ) + conn.request("GET", self.AMS_METRICS_GET_URL % encoded_get_metrics_parameters) + response = conn.getresponse() +- Logger.info("Http response for host %s : %s %s" % (metric_collector_host, response.status, response.reason)) ++ Logger.info("Http response for host {} : {} {}".format(metric_collector_host, response.status, response.reason)) + + data = response.read() + Logger.info("Http data: %s" % data) +@@ -146,7 +146,7 @@ + if (str(current_time) in metrics_data["metrics"] and str(current_time + 1000) in metrics_data["metrics"] + and floats_eq(metrics_data["metrics"][str(current_time)], random_value1, 0.0000001) + and floats_eq(metrics_data["metrics"][str(current_time + 1000)], current_time, 1)): +- Logger.info("Values %s and %s were found in the response from host %s." % (metric_collector_host, random_value1, current_time)) ++ Logger.info("Values {} and {} were found in the response from host {}.".format(metric_collector_host, random_value1, current_time)) + values_are_present = True + break + pass +@@ -157,17 +157,17 @@ + % (self.AMS_READ_TIMEOUT)) + time.sleep(self.AMS_READ_TIMEOUT) + else: +- raise Fail("Values %s and %s were not found in the response." % (random_value1, current_time)) ++ raise Fail("Values {} and {} were not found in the response.".format(random_value1, current_time)) + else: + break + pass + except Fail as ex: +- Logger.warning("Ambari Metrics service check failed on collector host %s. Reason : %s" % (metric_collector_host, str(ex))) +- raise Fail("Ambari Metrics service check failed on collector host %s. Reason : %s" % (metric_collector_host, str(ex))) ++ Logger.warning("Ambari Metrics service check failed on collector host {}. Reason : {}".format(metric_collector_host, str(ex))) ++ raise Fail("Ambari Metrics service check failed on collector host {}. Reason : {}".format(metric_collector_host, str(ex))) + + @OsFamilyFuncImpl(os_family=OsFamilyImpl.DEFAULT) + def service_check(self, env): +- import params ++ from . import params + + Logger.info("Ambari Metrics service check was started.") + env.set_params(params) +@@ -194,11 +194,11 @@ + def call_curl_krb_request(tmp_dir, user_keytab, user_princ, uri, kinit_path, user, + connection_timeout, method='GET', metric_json='', header='', tries = 1, current_time = 0, random_value = 0): + if method == 'POST': +- Logger.info("Generated metrics for %s:\n%s" % (uri, metric_json)) ++ Logger.info("Generated metrics for {}:\n{}".format(uri, metric_json)) + +- for i in xrange(0, tries): ++ for i in range(0, tries): + try: +- Logger.info("Connecting (%s) to %s" % (method, uri)); ++ Logger.info("Connecting ({}) to {}".format(method, uri)); + + response = None + errmsg = None +@@ -208,23 +208,23 @@ + 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." + % (uri, connection_timeout)) + continue + else: +- raise Fail("Unable to {0} metrics on: {1}. Exception: {2}".format(method, uri, str(exception))) ++ raise Fail("Unable to {} metrics on: {}. Exception: {}".format(method, uri, str(exception))) + finally: + if not response: +- Logger.error("Unable to {0} metrics on: {1}. Error: {2}".format(method, uri, errmsg)) ++ Logger.error("Unable to {} metrics on: {}. Error: {}".format(method, uri, errmsg)) + else: +- Logger.info("%s response from %s: %s, errmsg: %s" % (method, uri, response, errmsg)); ++ Logger.info("{} response from {}: {}, errmsg: {}".format(method, uri, response, errmsg)); + try: + response.close() + except: +- Logger.debug("Unable to close {0} connection to {1}".format(method, uri)) ++ Logger.debug("Unable to close {} connection to {}".format(method, uri)) + + if method == 'GET': + data_json = json.loads(response) +@@ -237,7 +237,7 @@ + if (str(current_time) in metrics_data["metrics"] and str(current_time + 1000) in metrics_data["metrics"] + and floats_eq(metrics_data["metrics"][str(current_time)], random_value, 0.0000001) + and floats_eq(metrics_data["metrics"][str(current_time + 1000)], current_time, 1)): +- Logger.info("Values %s and %s were found in the response from %s." % (uri, random_value, current_time)) ++ Logger.info("Values {} and {} were found in the response from {}.".format(uri, random_value, current_time)) + values_are_present = True + break + pass +@@ -248,7 +248,7 @@ + % (tries)) + time.sleep(connection_timeout) + else: +- raise Fail("Values %s and %s were not found in the response." % (random_value, current_time)) ++ raise Fail("Values {} and {} were not found in the response.".format(random_value, current_time)) + else: + break + pass +@@ -257,11 +257,11 @@ + + 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)) ++ Logger.info("Generated metrics for host {} :\n{}".format(metric_collector_host, metric_json)) + +- Logger.info("Connecting (POST) to %s:%s%s" % (metric_collector_host, ++ Logger.info("Connecting (POST) to {}:{}{}".format(metric_collector_host, + metric_collector_port, + ams_metrics_post_url)) + conn = network.get_http_connection( +@@ -274,8 +274,8 @@ + conn.request("POST", ams_metrics_post_url, metric_json, headers) + + 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: ++ Logger.info("Http response for host {}: {} {}".format(metric_collector_host, response.status, response.reason)) ++ except (http.client.HTTPException, OSError) 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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/service_mapping.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/service_mapping.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/service_mapping.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/service_mapping.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/split_points.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/split_points.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/split_points.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/split_points.py 2022-07-11 00:52:33.000000000 +0800 +@@ -40,7 +40,7 @@ + + def to_number(s): + try: +- return int(re.sub("\D", "", s)) ++ return int(re.sub(r"\D", "", s)) + except ValueError: + return None + +@@ -101,7 +101,7 @@ + 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 @@ + 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,9 +137,9 @@ + # 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: ++ with open(os.path.join(dir, file)) as f: + for metric in f: + service_metrics.add(metric.strip()) + pass +@@ -214,15 +214,15 @@ + 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)) ++ " ams-hbase-site => {}, ams-hbase-env => {}," ++ " services => {}".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 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/status_params.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/status_params.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/status_params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/status_params.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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,9 +24,9 @@ + from ambari_commons import OSCheck + + if OSCheck.is_windows_family(): +- from params_windows import * ++ from .params_windows import * + else: +- from params_linux import * ++ from .params_linux import * + + hbase_pid_dir = config['configurations']['ams-hbase-env']['hbase_pid_dir'] + hbase_user = ams_user +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/status.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/status.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/status.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/status.py 2022-07-11 00:52:33.000000000 +0800 +@@ -32,7 +32,7 @@ + + @OsFamilyFuncImpl(os_family=OsFamilyImpl.DEFAULT) + def check_service_status(env, name): +- import status_params ++ from . import status_params + env.set_params(status_params) + + from resource_management.libraries.functions.check_process_status import check_process_status +@@ -46,7 +46,7 @@ + + @OsFamilyFuncImpl(os_family=OSConst.WINSRV_FAMILY) + def check_service_status(name): +- import service_mapping ++ from . import service_mapping + from resource_management.libraries.functions.windows_service_utils import check_windows_service_status + if name=='collector': + check_windows_service_status(service_mapping.ams_collector_win_service_name) +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/service_advisor.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/service_advisor.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/service_advisor.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/service_advisor.py 2022-07-11 00:52:32.000000000 +0800 +@@ -40,12 +40,12 @@ + 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): + + def __init__(self, *args, **kwargs): +- self.as_super = super(AMBARI_METRICSServiceAdvisor, self) ++ self.as_super = super() + self.as_super.__init__(*args, **kwargs) + + # Always call these methods +@@ -99,14 +99,14 @@ + Modify the set of components whose host assignment is based on other services. + Must be overriden in child class. + """ +- self.notValuableComponents |= set(['METRICS_MONITOR']) ++ self.notValuableComponents |= {'METRICS_MONITOR'} + + def modifyComponentsNotPreferableOnServer(self): + """ + Modify the set of components that are not preferable on the server. + Must be overriden in child class. + """ +- self.notPreferableOnServerComponents |= set(['METRICS_COLLECTOR']) ++ self.notPreferableOnServerComponents |= {'METRICS_COLLECTOR'} + + + def modifyComponentLayoutSchemes(self): +@@ -176,12 +176,12 @@ + total_sinks_count = 0 + # minimum heap size + hbase_heapsize = 500 +- for serviceName, componentsDict in schMemoryMap.items(): +- for componentName, multiplier in componentsDict.items(): ++ for serviceName, componentsDict in list(schMemoryMap.items()): ++ for componentName, multiplier in list(componentsDict.items()): + schCount = len( + self.getHostsWithComponent(serviceName, componentName, services, + hosts)) +- hbase_heapsize += int((schCount * multiplier)) ++ hbase_heapsize += int(schCount * multiplier) + total_sinks_count += schCount + collector_heapsize = int(hbase_heapsize/3 if hbase_heapsize > 2048 else 512) + hbase_heapsize = min(hbase_heapsize, 32768) +@@ -231,7 +231,7 @@ + """ + + def __init__(self, *args, **kwargs): +- self.as_super = super(AMBARI_METRICSRecommender, self) ++ self.as_super = super() + self.as_super.__init__(*args, **kwargs) + + +@@ -458,7 +458,7 @@ + """ + + def __init__(self, *args, **kwargs): +- self.as_super = super(AMBARI_METRICSValidator, self) ++ self.as_super = super() + self.as_super.__init__(*args, **kwargs) + + self.validators = [("ams-hbase-site", self.validateAmsHbaseSiteConfigurationsFromHDP206), +@@ -541,7 +541,7 @@ + if distributed.lower() == "true" and op_mode == "distributed" and \ + hbase_zk_client_port != zkPort and hbase_zk_client_port != "{{zookeeper_clientPort}}": + hbase_zk_client_port_item = self.getErrorItem("In AMS distributed mode, hbase.zookeeper.property.clientPort " +- "should be the cluster zookeeper server port : {0}".format(zkPort)) ++ "should be the cluster zookeeper server port : {}".format(zkPort)) + + if distributed.lower() == "false" and op_mode == "embedded" and \ + hbase_zk_client_port == zkPort and hbase_zk_client_port != "{{zookeeper_clientPort}}": +@@ -593,7 +593,7 @@ + break + # If no local DN in distributed mode + elif collectorHostName not in dn_hosts and distributed.lower() == "true": +- item = self.getWarnItem("It's recommended to install Datanode component on {0} " ++ item = self.getWarnItem("It's recommended to install Datanode component on {} " + "to speed up IO operations between HDFS and Metrics " + "Collector in distributed mode ".format(collectorHostName)) + validationItems.extend([{"config-name": "hbase.cluster.distributed", "item": item}]) +@@ -644,22 +644,22 @@ + minMasterXmn = 0.12 * hbase_master_heapsize + maxMasterXmn = 0.2 * hbase_master_heapsize + if hbase_master_xmn_size < minMasterXmn: +- masterXmnItem = self.getWarnItem("Value is lesser than the recommended minimum Xmn size of {0} " ++ masterXmnItem = self.getWarnItem("Value is lesser than the recommended minimum Xmn size of {} " + "(12% of hbase_master_heapsize)".format(int(ceil(minMasterXmn)))) + + if hbase_master_xmn_size > maxMasterXmn: +- masterXmnItem = self.getWarnItem("Value is greater than the recommended maximum Xmn size of {0} " ++ masterXmnItem = self.getWarnItem("Value is greater than the recommended maximum Xmn size of {} " + "(20% of hbase_master_heapsize)".format(int(floor(maxMasterXmn)))) + + minRegionServerXmn = 0.12 * hbase_regionserver_heapsize + maxRegionServerXmn = 0.2 * hbase_regionserver_heapsize + if hbase_regionserver_xmn_size < minRegionServerXmn: +- regionServerXmnItem = self.getWarnItem("Value is lesser than the recommended minimum Xmn size of {0} " ++ regionServerXmnItem = self.getWarnItem("Value is lesser than the recommended minimum Xmn size of {} " + "(12% of hbase_regionserver_heapsize)" + .format(int(ceil(minRegionServerXmn)))) + + if hbase_regionserver_xmn_size > maxRegionServerXmn: +- regionServerXmnItem = self.getWarnItem("Value is greater than the recommended maximum Xmn size of {0} " ++ regionServerXmnItem = self.getWarnItem("Value is greater than the recommended maximum Xmn size of {} " + "(20% of hbase_regionserver_heapsize)" + .format(int(floor(maxRegionServerXmn)))) + else: +@@ -671,12 +671,12 @@ + minMasterXmn = 0.12 * (hbase_master_heapsize + hbase_regionserver_heapsize) + maxMasterXmn = 0.2 * (hbase_master_heapsize + hbase_regionserver_heapsize) + if hbase_master_xmn_size < minMasterXmn: +- masterXmnItem = self.getWarnItem("Value is lesser than the recommended minimum Xmn size of {0} " ++ masterXmnItem = self.getWarnItem("Value is lesser than the recommended minimum Xmn size of {} " + "(12% of hbase_master_heapsize + hbase_regionserver_heapsize)" + .format(int(ceil(minMasterXmn)))) + + if hbase_master_xmn_size > maxMasterXmn: +- masterXmnItem = self.getWarnItem("Value is greater than the recommended maximum Xmn size of {0} " ++ masterXmnItem = self.getWarnItem("Value is greater than the recommended maximum Xmn size of {} " + "(20% of hbase_master_heapsize + hbase_regionserver_heapsize)" + .format(int(floor(maxMasterXmn)))) + if masterXmnItem: +@@ -693,7 +693,7 @@ + if component["StackServiceComponents"]["hostnames"] is not None: + for hostName in component["StackServiceComponents"]["hostnames"]: + if self.isMasterComponent(component): +- if hostName not in hostMasterComponents.keys(): ++ if hostName not in list(hostMasterComponents.keys()): + hostMasterComponents[hostName] = [] + hostMasterComponents[hostName].append(component["StackServiceComponents"]["component_name"]) + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.2.0/package/scripts/metrics_grafana_util.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.2.0/package/scripts/metrics_grafana_util.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.2.0/package/scripts/metrics_grafana_util.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.2.0/package/scripts/metrics_grafana_util.py 2022-07-11 00:52:32.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + 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,16 +62,16 @@ + ssl_version=Script.get_force_https_protocol_value() + ) + +- userAndPass = b64encode('{0}:{1}'.format(server.user, server.password)) ++ userAndPass = b64encode('{}:{}'.format(server.user, server.password)) + headers = { 'Authorization' : 'Basic %s' % userAndPass } + +- Logger.info("Connecting (GET) to %s:%s%s" % (server.host, server.port, url)) ++ Logger.info("Connecting (GET) to {}:{}{}".format(server.host, server.port, url)) + + conn.request("GET", url, headers = headers) + response = conn.getresponse() +- Logger.info("Http response: %s %s" % (response.status, response.reason)) ++ Logger.info("Http response: {} {}".format(response.status, response.reason)) + break +- except (httplib.HTTPException, socket.error) as ex: ++ except (http.client.HTTPException, OSError) 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 @@ + + response = None + data = None +- userAndPass = b64encode('{0}:{1}'.format(server.user, server.password)) ++ userAndPass = b64encode('{}:{}'.format(server.user, server.password)) + headers = {"Content-Type": "application/json", + 'Authorization' : 'Basic %s' % userAndPass } + grafana_https_enabled = server.protocol.lower() == 'https' +@@ -97,7 +97,7 @@ + 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 @@ + Logger.info("Http data: %s" % data) + conn.close() + break +- except (httplib.HTTPException, socket.error) as ex: ++ except (http.client.HTTPException, OSError) 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 @@ + + response = None + data = None +- userAndPass = b64encode('{0}:{1}'.format(server.user, server.password)) ++ userAndPass = b64encode('{}:{}'.format(server.user, server.password)) + Logger.debug('POST payload: %s' % payload) + headers = {"Content-Type": "application/json", "Content-Length" : len(payload), + 'Authorization' : 'Basic %s' % userAndPass} +@@ -139,9 +139,9 @@ + 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)) ++ Logger.info("Connecting (POST) to {}:{}{}".format(server.host, server.port, url)) + conn = network.get_http_connection( + server.host, + int(server.port), +@@ -152,7 +152,7 @@ + conn.request("POST", url, payload, headers) + + response = conn.getresponse() +- Logger.info("Http response: %s %s" % (response.status, response.reason)) ++ Logger.info("Http response: {} {}".format(response.status, response.reason)) + if response.status == 401: #Intermittent error thrown from Grafana + if i < params.grafana_connect_attempts - 1: + Logger.info("Connection to Grafana failed. Next retry in %s seconds." +@@ -163,7 +163,7 @@ + Logger.info("Http data: %s" % data) + conn.close() + break +- except (httplib.HTTPException, socket.error) as ex: ++ except (http.client.HTTPException, OSError) 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 @@ + 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,16 +194,16 @@ + ssl_version=Script.get_force_https_protocol_value() + ) + +- userAndPass = b64encode('{0}:{1}'.format(server.user, server.password)) ++ userAndPass = b64encode('{}:{}'.format(server.user, server.password)) + headers = { 'Authorization' : 'Basic %s' % userAndPass } + +- Logger.info("Connecting (DELETE) to %s:%s%s" % (server.host, server.port, url)) ++ Logger.info("Connecting (DELETE) to {}:{}{}".format(server.host, server.port, url)) + + conn.request("DELETE", url, headers = headers) + response = conn.getresponse() +- Logger.info("Http response: %s %s" % (response.status, response.reason)) ++ Logger.info("Http response: {} {}".format(response.status, response.reason)) + break +- except (httplib.HTTPException, socket.error) as ex: ++ except (http.client.HTTPException, OSError) 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)) +@@ -218,7 +218,7 @@ + def is_unchanged_datasource_url(grafana_datasource_url, new_datasource_host): + import params + parsed_url = urlparse(grafana_datasource_url) +- Logger.debug("parsed url: scheme = %s, host = %s, port = %s" % ( ++ Logger.debug("parsed url: scheme = {}, host = {}, port = {}".format( + parsed_url.scheme, parsed_url.hostname, parsed_url.port)) + Logger.debug("collector: scheme = %s, host = %s, port = %s" % + (params.metric_collector_protocol, new_datasource_host, +@@ -323,7 +323,7 @@ + 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 +@@ -344,7 +344,7 @@ + if datasource_type == new_datasource_type: + Logger.info("Grafana datasource type validation succeeded.") + else: +- Logger.info("Grafana datasource type validation failed. Old type = %s, New type = %s" % (datasource_type, new_datasource_type)) ++ Logger.info("Grafana datasource type validation failed. Old type = {}, New type = {}".format(datasource_type, new_datasource_type)) + update_datasource = True + + if update_datasource: # Metrics datasource present, but collector host is wrong or the datasource type is outdated. +@@ -438,9 +438,9 @@ + if dashboard_files: + for dashboard_file in dashboard_files: + try: +- with open(dashboard_file, 'r') as file: ++ with open(dashboard_file) 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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/ATLAS/0.1.0.2.3/package/scripts/atlas_client.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/ATLAS/0.1.0.2.3/package/scripts/atlas_client.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/ATLAS/0.1.0.2.3/package/scripts/atlas_client.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/ATLAS/0.1.0.2.3/package/scripts/atlas_client.py 2022-07-11 00:52:32.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/ATLAS/0.1.0.2.3/package/scripts/metadata.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/ATLAS/0.1.0.2.3/package/scripts/metadata.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/ATLAS/0.1.0.2.3/package/scripts/metadata.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/ATLAS/0.1.0.2.3/package/scripts/metadata.py 2022-07-11 00:52:32.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + + # Needed by both Server and Client + Directory(params.conf_dir, +- mode=0755, ++ mode=0o755, + cd_access='a', + owner=params.metadata_user, + group=params.user_group, +@@ -50,14 +50,14 @@ + + if type == "server": + Directory([params.pid_dir], +- mode=0755, ++ mode=0o755, + cd_access='a', + owner=params.metadata_user, + group=params.user_group, + create_parents = True + ) + Directory(format('{conf_dir}/solr'), +- mode=0755, ++ mode=0o755, + cd_access='a', + owner=params.metadata_user, + group=params.user_group, +@@ -65,21 +65,21 @@ + recursive_ownership=True + ) + Directory(params.log_dir, +- mode=0755, ++ mode=0o755, + cd_access='a', + owner=params.metadata_user, + group=params.user_group, + create_parents = True + ) + Directory(params.data_dir, +- mode=0644, ++ mode=0o644, + cd_access='a', + owner=params.metadata_user, + group=params.user_group, + create_parents = True + ) + Directory(params.expanded_war_dir, +- mode=0644, ++ mode=0o644, + cd_access='a', + owner=params.metadata_user, + group=params.user_group, +@@ -93,7 +93,7 @@ + not_if = war_source == war_target) + + File(format("{conf_dir}/atlas-log4j.xml"), +- mode=0644, ++ mode=0o644, + owner=params.metadata_user, + group=params.user_group, + content=InlineTemplate(params.metadata_log4j_content) +@@ -101,7 +101,7 @@ + File(format("{conf_dir}/atlas-env.sh"), + owner=params.metadata_user, + group=params.user_group, +- mode=0755, ++ mode=0o755, + content=InlineTemplate(params.metadata_env_content) + ) + +@@ -124,7 +124,7 @@ + + if params.metadata_solrconfig_content: + File(format("{conf_dir}/solr/solrconfig.xml"), +- mode=0644, ++ mode=0o644, + owner=params.metadata_user, + group=params.user_group, + content=InlineTemplate(params.metadata_solrconfig_content) +@@ -133,7 +133,7 @@ + # Needed by both Server and Client + PropertiesFile(format('{conf_dir}/{conf_file}'), + properties = params.application_properties, +- mode=0600, ++ mode=0o600, + owner=params.metadata_user, + group=params.user_group + ) +@@ -196,7 +196,7 @@ + configuration_attributes=params.config['configurationAttributes']['hdfs-site'], + owner=params.metadata_user, + group=params.user_group, +- mode=0644 ++ mode=0o644 + ) + else: + File(format('{conf_dir}/hdfs-site.xml'), action="delete") +@@ -215,7 +215,7 @@ + configuration_attributes=params.config['configurationAttributes']['core-site'], + owner=params.metadata_user, + group=params.user_group, +- mode=0644 ++ mode=0o644 + ) + + Directory(format('{metadata_home}/'), +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/ATLAS/0.1.0.2.3/package/scripts/params.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/ATLAS/0.1.0.2.3/package/scripts/params.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/ATLAS/0.1.0.2.3/package/scripts/params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/ATLAS/0.1.0.2.3/package/scripts/params.py 2022-07-11 00:52:32.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + """ + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file +@@ -178,7 +178,7 @@ + # This can be None, True, or False + is_atlas_ha_enabled = default("/configurations/application-properties/atlas.server.ha.enabled", None) + additional_ha_props = configs_for_ha(atlas_hosts, metadata_port, is_atlas_ha_enabled, metadata_protocol) +-for k,v in additional_ha_props.iteritems(): ++for k,v in additional_ha_props.items(): + application_properties[k] = v + + +@@ -290,7 +290,7 @@ + kafka_jaas_principal = _kafka_principal_name.replace('_HOST', _hostname_lowercase) + kafka_keytab_path = config['configurations']['kafka-env']['kafka_keytab'] + kafka_bare_jaas_principal = get_bare_principal(_kafka_principal_name) +- kafka_kerberos_params = "-Djava.security.auth.login.config={0}/kafka_jaas.conf".format(kafka_conf_dir) ++ kafka_kerberos_params = "-Djava.security.auth.login.config={}/kafka_jaas.conf".format(kafka_conf_dir) + else: + kafka_kerberos_params = '' + kafka_jaas_principal = None +@@ -399,7 +399,7 @@ + + atlas_repository_configuration = { + 'username' : config['configurations']['ranger-atlas-plugin-properties']['REPOSITORY_CONFIG_USERNAME'], +- 'password' : unicode(config['configurations']['ranger-atlas-plugin-properties']['REPOSITORY_CONFIG_PASSWORD']), ++ 'password' : str(config['configurations']['ranger-atlas-plugin-properties']['REPOSITORY_CONFIG_PASSWORD']), + 'atlas.rest.address' : metadata_server_url, + 'commonNameForCertificate' : config['configurations']['ranger-atlas-plugin-properties']['common.name.for.certificate'], + 'ambari.service.check.user' : policy_user +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/ATLAS/0.1.0.2.3/package/scripts/service_check.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/ATLAS/0.1.0.2.3/package/scripts/service_check.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/ATLAS/0.1.0.2.3/package/scripts/service_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/ATLAS/0.1.0.2.3/package/scripts/service_check.py 2022-07-11 00:52:32.000000000 +0800 +@@ -44,9 +44,9 @@ + try: + Execute(smoke_cmd , user=params.smoke_test_user, tries = 5, + try_sleep = 10) +- except Exception, err: ++ except Exception as err: + atlas_host_call_count = atlas_host_call_count + 1 +- Logger.error("ATLAS service check failed for host {0} with error {1}".format(atlas_host,err)) ++ Logger.error("ATLAS service check failed for host {} with error {}".format(atlas_host,err)) + if atlas_host_call_count == len(params.atlas_hosts): + raise Fail("All instances of ATLAS METADATA SERVER are down.") + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/ATLAS/0.1.0.2.3/package/scripts/setup_ranger_atlas.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/ATLAS/0.1.0.2.3/package/scripts/setup_ranger_atlas.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/ATLAS/0.1.0.2.3/package/scripts/setup_ranger_atlas.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/ATLAS/0.1.0.2.3/package/scripts/setup_ranger_atlas.py 2022-07-11 00:52:32.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + action="create_on_execute", + owner=params.metadata_user, + group=params.user_group, +- mode=0755, ++ mode=0o755, + recursive_chmod=True + ) + params.HdfsResource("/ranger/audit/atlas", +@@ -43,7 +43,7 @@ + action="create_on_execute", + owner=params.metadata_user, + group=params.user_group, +- mode=0700, ++ mode=0o700, + recursive_chmod=True + ) + params.HdfsResource(None, action="execute") +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/ATLAS/0.1.0.2.3/package/scripts/status_params.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/ATLAS/0.1.0.2.3/package/scripts/status_params.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/ATLAS/0.1.0.2.3/package/scripts/status_params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/ATLAS/0.1.0.2.3/package/scripts/status_params.py 2022-07-11 00:52:32.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/DRUID/0.10.1/package/scripts/druid_node.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/DRUID/0.10.1/package/scripts/druid_node.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/DRUID/0.10.1/package/scripts/druid_node.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/DRUID/0.10.1/package/scripts/druid_node.py 2022-07-11 00:52:33.000000000 +0800 +@@ -72,7 +72,7 @@ + db_connection_check_command = None + + if db_connection_check_command: +- sudo.chmod(params.check_db_connection_jar, 0755) ++ sudo.chmod(params.check_db_connection_jar, 0o755) + Execute( db_connection_check_command, + tries=5, + try_sleep=10, +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/DRUID/0.10.1/package/scripts/druid.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/DRUID/0.10.1/package/scripts/druid.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/DRUID/0.10.1/package/scripts/druid.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/DRUID/0.10.1/package/scripts/druid.py 2022-07-11 00:52:33.000000000 +0800 +@@ -36,7 +36,7 @@ + File(format("{params.druid_conf_dir}/druid-env.sh"), + owner=params.druid_user, + content=InlineTemplate(params.druid_env_sh_template), +- mode = 0700 ++ mode = 0o700 + ) + + # common config +@@ -64,12 +64,12 @@ + properties=druid_common_config, + owner=params.druid_user, + group=params.user_group, +- mode = 0600 ++ mode = 0o600 + ) + Logger.info("Created common.runtime.properties") + + File(format("{params.druid_common_conf_dir}/druid-log4j.xml"), +- mode=0644, ++ mode=0o644, + owner=params.druid_user, + group=params.user_group, + content=InlineTemplate(params.log4j_props) +@@ -77,7 +77,7 @@ + Logger.info("Created log4j file") + + File("/etc/logrotate.d/druid", +- mode=0644, ++ mode=0o644, + owner='root', + group='root', + content=InlineTemplate(params.logrotate_props) +@@ -97,7 +97,7 @@ + properties=node_config, + owner=params.druid_user, + group=params.user_group, +- mode = 0600 ++ mode = 0o600 + ) + Logger.info(format("Created druid-{node_type_lowercase} runtime.properties")) + +@@ -134,7 +134,7 @@ + + def mutable_config_dict(config): + rv = {} +- for key, value in config.iteritems(): ++ for key, value in config.items(): + rv[key] = value + return rv + +@@ -166,7 +166,7 @@ + ) + + # create the segment storage dir, users like hive from group hadoop need to write to this directory +- create_hadoop_directory(storage_dir, mode=0775) ++ create_hadoop_directory(storage_dir, mode=0o775) + + # Create HadoopIndexTask hadoopWorkingPath + hadoop_working_path = druid_middlemanager_config['druid.indexer.task.hadoopWorkingPath'] +@@ -176,9 +176,9 @@ + type="directory", + action="create_on_execute", + owner=params.hdfs_user, +- mode=0777, ++ mode=0o777, + ) +- create_hadoop_directory(hadoop_working_path, mode=0775) ++ create_hadoop_directory(hadoop_working_path, mode=0o775) + + # If HDFS is used for storing logs, create Index Task log directory + indexer_logs_type = druid_common_config['druid.indexer.logs.type'] +@@ -187,7 +187,7 @@ + create_hadoop_directory(indexer_logs_directory) + + +-def create_hadoop_directory(hadoop_dir, mode=0755): ++def create_hadoop_directory(hadoop_dir, mode=0o755): + import params + params.HdfsResource(hadoop_dir, + type="directory", +@@ -203,7 +203,7 @@ + import params + Directory( + [params.druid_log_dir, params.druid_pid_dir], +- mode=0755, ++ mode=0o755, + owner=params.druid_user, + group=params.user_group, + create_parents=True, +@@ -215,7 +215,7 @@ + params.druid_broker_conf_dir, params.druid_middlemanager_conf_dir, params.druid_historical_conf_dir, + params.druid_overlord_conf_dir, params.druid_router_conf_dir, params.druid_segment_infoDir, + params.druid_tasks_dir], +- mode=0700, ++ mode=0o700, + cd_access='a', + owner=params.druid_user, + group=params.user_group, +@@ -227,7 +227,7 @@ + for segment_cache_location in segment_cache_locations: + Directory( + segment_cache_location["path"], +- mode=0700, ++ mode=0o700, + owner=params.druid_user, + group=params.user_group, + create_parents=True, +@@ -248,15 +248,15 @@ + def pulldeps(): + import params + extensions_list = eval(params.druid_extensions) +- extensions_string = '{0}'.format("-c ".join(extensions_list)) ++ extensions_string = '{}'.format("-c ".join(extensions_list)) + repository_list = eval(params.druid_repo_list) +- repository_string = '{0}'.format("-r ".join(repository_list)) ++ repository_string = '{}'.format("-r ".join(repository_list)) + if len(extensions_list) > 0: + try: + # Make sure druid user has permissions to write dependencies + Directory( + [params.druid_extensions_dir, params.druid_hadoop_dependencies_dir], +- mode=0755, ++ mode=0o755, + cd_access='a', + owner=params.druid_user, + group=params.user_group, +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/DRUID/0.10.1/package/scripts/params.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/DRUID/0.10.1/package/scripts/params.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/DRUID/0.10.1/package/scripts/params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/DRUID/0.10.1/package/scripts/params.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/DRUID/0.10.1/package/scripts/service_check.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/DRUID/0.10.1/package/scripts/service_check.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/DRUID/0.10.1/package/scripts/service_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/DRUID/0.10.1/package/scripts/service_check.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/DRUID/0.10.1/package/scripts/status_params.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/DRUID/0.10.1/package/scripts/status_params.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/DRUID/0.10.1/package/scripts/status_params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/DRUID/0.10.1/package/scripts/status_params.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/FALCON/0.5.0.2.1/package/scripts/falcon.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/FALCON/0.5.0.2.1/package/scripts/falcon.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/FALCON/0.5.0.2.1/package/scripts/falcon.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/FALCON/0.5.0.2.1/package/scripts/falcon.py 2022-07-11 00:52:33.000000000 +0800 +@@ -52,14 +52,14 @@ + Directory(params.falcon_pid_dir, + owner = params.falcon_user, + create_parents = True, +- mode = 0755, ++ mode = 0o755, + cd_access = "a", + ) + + Directory(params.falcon_log_dir, + owner = params.falcon_user, + create_parents = True, +- mode = 0755, ++ mode = 0o755, + cd_access = "a", + ) + +@@ -72,7 +72,7 @@ + create_parents = True) + + Directory(params.etc_prefix_dir, +- mode = 0755, ++ mode = 0o755, + create_parents = True) + + Directory(params.falcon_conf_dir, +@@ -87,30 +87,30 @@ + + PropertiesFile(params.falcon_conf_dir + '/client.properties', + properties = params.falcon_client_properties, +- mode = 0644, ++ mode = 0o644, + owner = params.falcon_user) + + PropertiesFile(params.falcon_conf_dir + '/runtime.properties', + properties = params.falcon_runtime_properties, +- mode = 0644, ++ mode = 0o644, + owner = params.falcon_user) + + PropertiesFile(params.falcon_conf_dir + '/startup.properties', + properties = params.falcon_startup_properties, +- mode = 0644, ++ mode = 0o644, + owner = params.falcon_user) + + File(params.falcon_conf_dir + '/log4j.properties', + content = InlineTemplate(params.falcon_log4j), + group = params.user_group, +- mode = 0644, ++ mode = 0o644, + owner = params.falcon_user) + + if params.falcon_graph_storage_directory: + Directory(params.falcon_graph_storage_directory, + owner = params.falcon_user, + group = params.user_group, +- mode = 0775, ++ mode = 0o775, + create_parents = True, + cd_access = "a") + +@@ -118,7 +118,7 @@ + Directory(params.falcon_graph_serialize_path, + owner = params.falcon_user, + group = params.user_group, +- mode = 0775, ++ mode = 0o775, + create_parents = True, + cd_access = "a") + +@@ -144,7 +144,7 @@ + type = "directory", + action = "create_on_execute", + owner = params.falcon_user, +- mode = 0755) ++ mode = 0o755) + elif params.store_uri[0:4] == "file": + Directory(params.store_uri[7:], + owner = params.falcon_user, +@@ -155,7 +155,7 @@ + type = "directory", + action = "create_on_execute", + owner = params.falcon_user, +- mode = 0777) ++ mode = 0o777) + + # In HDP 2.4 and earlier, the data-mirroring directory was copied to HDFS. + if params.supports_data_mirroring: +@@ -166,7 +166,7 @@ + group = params.proxyuser_group, + recursive_chown = True, + recursive_chmod = True, +- mode = 0770, ++ mode = 0o770, + source = params.local_data_mirroring_dir) + + # Falcon Extensions were supported in HDP 2.5 and higher. +@@ -181,7 +181,7 @@ + group = params.proxyuser_group, + recursive_chown = True, + recursive_chmod = True, +- mode = 0755, ++ mode = 0o755, + source = params.falcon_extensions_source_dir) + # Create the extensons HiveDR store + params.HdfsResource(os.path.join(params.falcon_extensions_dest_dir, "mirroring"), +@@ -189,7 +189,7 @@ + action = "create_on_execute", + owner = params.falcon_user, + group = params.proxyuser_group, +- mode = 0770) ++ mode = 0o770) + + # At least one HDFS Dir should be created, so execute the change now. + params.HdfsResource(None, action = "execute") +@@ -227,7 +227,7 @@ + try : + File(params.target_jar_file, + content = DownloadSource(params.bdb_resource_name), +- mode = 0755) ++ mode = 0o755) + except : + exc_msg = traceback.format_exc() + exception_message = format("Caught Exception while downloading {bdb_resource_name}:\n{exc_msg}") +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/FALCON/0.5.0.2.1/package/scripts/falcon_server_upgrade.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/FALCON/0.5.0.2.1/package/scripts/falcon_server_upgrade.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/FALCON/0.5.0.2.1/package/scripts/falcon_server_upgrade.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/FALCON/0.5.0.2.1/package/scripts/falcon_server_upgrade.py 2022-07-11 00:52:33.000000000 +0800 +@@ -42,10 +42,10 @@ + + for directory in directoryMappings: + if not os.path.isdir(directory): +- raise Fail("Unable to backup missing directory {0}".format(directory)) ++ raise Fail("Unable to backup missing directory {}".format(directory)) + + archive = os.path.join(absolute_backup_dir, directoryMappings[directory]) +- Logger.info('Compressing {0} to {1}'.format(directory, archive)) ++ Logger.info('Compressing {} to {}'.format(directory, archive)) + + if os.path.exists(archive): + os.remove(archive) +@@ -68,7 +68,7 @@ + directoryMappings[directory]) + + if not os.path.isfile(archive): +- raise Fail("Unable to restore missing backup archive {0}".format(archive)) ++ raise Fail("Unable to restore missing backup archive {}".format(archive)) + + tar_archive.untar_archive(archive, directory) + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/FALCON/0.5.0.2.1/package/scripts/params_windows.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/FALCON/0.5.0.2.1/package/scripts/params_windows.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/FALCON/0.5.0.2.1/package/scripts/params_windows.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/FALCON/0.5.0.2.1/package/scripts/params_windows.py 2022-07-11 00:52:33.000000000 +0800 +@@ -33,14 +33,14 @@ + falcon_home = None + falcon_log_dir = "." + +-if os.environ.has_key("HADOOP_HOME"): ++if "HADOOP_HOME" in os.environ: + stack_root = os.path.abspath(os.path.join(os.environ["HADOOP_HOME"], "..")) + +-if os.environ.has_key("FALCON_CONF_DIR"): ++if "FALCON_CONF_DIR" in os.environ: + falcon_conf_dir = os.environ["FALCON_CONF_DIR"] +-if os.environ.has_key("FALCON_DATA_DIR"): ++if "FALCON_DATA_DIR" in os.environ: + falcon_data_dir = os.environ["FALCON_DATA_DIR"] +-if os.environ.has_key("FALCON_HOME"): ++if "FALCON_HOME" in os.environ: + falcon_home = os.environ["FALCON_HOME"] +-if os.environ.has_key("FALCON_LOG_DIR"): ++if "FALCON_LOG_DIR" in os.environ: + falcon_log_dir = os.environ["FALCON_LOG_DIR"] +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/FLUME/1.4.0.2.0/package/alerts/alert_flume_agent_status.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/FLUME/1.4.0.2.0/package/alerts/alert_flume_agent_status.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/FLUME/1.4.0.2.0/package/alerts/alert_flume_agent_status.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/FLUME/1.4.0.2.0/package/alerts/alert_flume_agent_status.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + """ + Licensed to the Apache Software Foundation (ASF) under one +@@ -75,28 +75,28 @@ + alert_state = RESULT_CODE_OK + + if len(processes) == 0 and len(expected_agents) == 0: +- alert_label = 'No agents defined on {0}'.format(host_name) ++ alert_label = 'No agents defined on {}'.format(host_name) + else: + ok = [] + critical = [] + text_arr = [] + + for process in processes: +- if not process.has_key('status') or process['status'] == 'NOT_RUNNING': ++ if 'status' not in process or process['status'] == 'NOT_RUNNING': + critical.append(process['name']) + else: + ok.append(process['name']) + + if len(critical) > 0: +- text_arr.append("{0} {1} NOT running".format(", ".join(critical), ++ text_arr.append("{} {} NOT running".format(", ".join(critical), + "is" if len(critical) == 1 else "are")) + + if len(ok) > 0: +- text_arr.append("{0} {1} running".format(", ".join(ok), ++ text_arr.append("{} {} running".format(", ".join(ok), + "is" if len(ok) == 1 else "are")) + + plural = len(critical) > 1 or len(ok) > 1 +- alert_label = "Agent{0} {1} {2}".format( ++ alert_label = "Agent{} {} {}".format( + "s" if plural else "", + " and ".join(text_arr), + "on " + host_name) +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/FLUME/1.4.0.2.0/package/scripts/flume_handler.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/FLUME/1.4.0.2.0/package/scripts/flume_handler.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/FLUME/1.4.0.2.0/package/scripts/flume_handler.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/FLUME/1.4.0.2.0/package/scripts/flume_handler.py 2022-07-11 00:52:33.000000000 +0800 +@@ -71,7 +71,7 @@ + # the service should report STARTED (green) ONLY if the desired state is started. otherwise, INSTALLED (red) + if len(expected_agents) > 0: + for proc in processes: +- if not proc.has_key('status') or proc['status'] == 'NOT_RUNNING': ++ if 'status' not in proc or proc['status'] == 'NOT_RUNNING': + raise ComponentIsNotRunning() + elif len(expected_agents) == 0 and 'INSTALLED' == get_desired_state(): + raise ComponentIsNotRunning() +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/FLUME/1.4.0.2.0/package/scripts/flume.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/FLUME/1.4.0.2.0/package/scripts/flume.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/FLUME/1.4.0.2.0/package/scripts/flume.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/FLUME/1.4.0.2.0/package/scripts/flume.py 2022-07-11 00:52:33.000000000 +0800 +@@ -60,7 +60,7 @@ + if params.flume_conf_content is not None: + flume_agents = build_flume_topology(params.flume_conf_content) + +- for agent in flume_agents.keys(): ++ for agent in list(flume_agents.keys()): + flume_agent_conf_dir = os.path.join(params.flume_conf_dir, agent) + flume_agent_conf_file = os.path.join(flume_agent_conf_dir, 'flume.conf') + flume_agent_meta_file = os.path.join(flume_agent_conf_dir, 'ambari-meta.json') +@@ -115,14 +115,14 @@ + owner=params.flume_user, + create_parents=True, + cd_access="a", +- mode=0755, ++ mode=0o755, + ) + + flume_agents = {} + if params.flume_conf_content is not None: + flume_agents = build_flume_topology(params.flume_conf_content) + +- for agent in flume_agents.keys(): ++ for agent in list(flume_agents.keys()): + flume_agent_conf_dir = os.path.join(params.flume_conf_dir, agent) + flume_agent_conf_file = os.path.join(flume_agent_conf_dir, 'flume.conf') + flume_agent_meta_file = os.path.join(flume_agent_conf_dir, 'ambari-meta.json') +@@ -136,17 +136,17 @@ + PropertiesFile(flume_agent_conf_file, + properties=flume_agents[agent], + owner=params.flume_user, +- mode = 0644) ++ mode = 0o644) + + File(flume_agent_log4j_file, + content=InlineTemplate(params.flume_log4j_content,agent_name=agent), + owner=params.flume_user, +- mode = 0644) ++ mode = 0o644) + + File(flume_agent_meta_file, + content = json.dumps(ambari_meta(agent, flume_agents[agent])), + owner=params.flume_user, +- mode = 0644) ++ mode = 0o644) + + File(flume_agent_env_file, + owner=params.flume_user, +@@ -233,7 +233,7 @@ + + if not await_flume_process_termination(pid_file, try_count=10): + show_logs(params.flume_log_dir, params.flume_user) +- raise Fail("Can't stop flume agent: {0}".format(agent)) ++ raise Fail("Can't stop flume agent: {}".format(agent)) + + File(pid_file, action = 'delete') + +@@ -273,13 +273,13 @@ + if lhs.endswith(".sources"): + agent_names.append(part0) + +- if not result.has_key(part0): ++ if part0 not in result: + result[part0] = {} + + result[part0][lhs] = rhs + + # trim out non-agents +- for k in result.keys(): ++ for k in list(result.keys()): + if not k in agent_names: + del result[k] + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/FLUME/1.4.0.2.0/package/scripts/params.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/FLUME/1.4.0.2.0/package/scripts/params.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/FLUME/1.4.0.2.0/package/scripts/params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/FLUME/1.4.0.2.0/package/scripts/params.py 2022-07-11 00:52:33.000000000 +0800 +@@ -87,7 +87,7 @@ + ganglia_server_host = ganglia_server_hosts[0] + + hostname = None +-if config['agentLevelParams'].has_key('hostname'): ++if 'hostname' in config['agentLevelParams']: + hostname = config['agentLevelParams']['hostname'] + + set_instanceId = "false" +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/FLUME/1.4.0.2.0/package/scripts/params_windows.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/FLUME/1.4.0.2.0/package/scripts/params_windows.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/FLUME/1.4.0.2.0/package/scripts/params_windows.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/FLUME/1.4.0.2.0/package/scripts/params_windows.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/GANGLIA/3.5.0/package/scripts/ganglia.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/GANGLIA/3.5.0/package/scripts/ganglia.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/GANGLIA/3.5.0/package/scripts/ganglia.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/GANGLIA/3.5.0/package/scripts/ganglia.py 2022-07-11 00:52:33.000000000 +0800 +@@ -54,7 +54,7 @@ + + File("/etc/init.d/hdp-" + name, + content=StaticFile(name + ".init"), +- mode=0755 ++ mode=0o755 + ) + + +@@ -63,11 +63,11 @@ + + File(params.ganglia_shell_cmds_dir + os.sep + name, + content=StaticFile(name), +- mode=0755 ++ mode=0o755 + ) + + +-def ganglia_TemplateConfig(name, mode=0755, tag=None): ++def ganglia_TemplateConfig(name, mode=0o755, tag=None): + import params + + TemplateConfig(format("{params.ganglia_shell_cmds_dir}/{name}"), +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/GANGLIA/3.5.0/package/scripts/ganglia_server.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/GANGLIA/3.5.0/package/scripts/ganglia_server.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/GANGLIA/3.5.0/package/scripts/ganglia_server.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/GANGLIA/3.5.0/package/scripts/ganglia_server.py 2022-07-11 00:52:33.000000000 +0800 +@@ -87,11 +87,11 @@ + import params + + Directory(os.path.abspath(os.path.join(params.ganglia_runtime_dir, "..")), +- mode=0755, ++ mode=0o755, + create_parents = True + ) + Directory(params.dwoo_path, +- mode=0755, ++ mode=0o755, + create_parents = True, + owner = params.web_user, + recursive_ownership = True, +@@ -108,21 +108,21 @@ + TemplateConfig(rrd_py_file_path, + owner="root", + group="root", +- mode=0755 ++ mode=0o755 + ) + rrd_file_owner = params.gmetad_user + + Directory(params.rrdcached_base_dir, + owner=rrd_file_owner, + group=rrd_file_owner, +- mode=0755, ++ mode=0o755, + create_parents = True + ) + + if OSCheck.is_suse_family() or OSCheck.is_ubuntu_family(): + File( params.ganglia_apache_config_file, + content = Template("ganglia.conf.j2"), +- mode = 0644 ++ mode = 0o644 + ) + + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/GANGLIA/3.5.0/package/scripts/status_params.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/GANGLIA/3.5.0/package/scripts/status_params.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/GANGLIA/3.5.0/package/scripts/status_params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/GANGLIA/3.5.0/package/scripts/status_params.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HAWQ/2.0.0/package/alerts/alert_component_status.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HAWQ/2.0.0/package/alerts/alert_component_status.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HAWQ/2.0.0/package/alerts/alert_component_status.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HAWQ/2.0.0/package/alerts/alert_component_status.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + """ + Licensed to the Apache Software Foundation (ASF) under one +@@ -63,14 +63,14 @@ + component_name = component.capitalize() + is_running = is_component_running(port, COMPONENT_PROCESS_MAP[component]) + if is_running: +- return (RESULT_STATE_OK, ['HAWQ {0} is running'.format(component_name)]) ++ return (RESULT_STATE_OK, ['HAWQ {} is running'.format(component_name)]) + else: +- return (RESULT_STATE_CRITICAL, ['HAWQ {0} is not running'.format(component_name)]) ++ return (RESULT_STATE_CRITICAL, ['HAWQ {} is not running'.format(component_name)]) + + def is_component_running(port, process): + """ + Check if the process is running on the specified port + """ +- cmd = "netstat -tupln | egrep ':{0}\s' | egrep {1}".format(port, process) ++ cmd = r"netstat -tupln | egrep ':{}\s' | egrep {}".format(port, process) + rc, op= call(cmd, timeout=60) + return rc == 0 +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HAWQ/2.0.0/package/alerts/alert_segment_registration_status.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HAWQ/2.0.0/package/alerts/alert_segment_registration_status.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HAWQ/2.0.0/package/alerts/alert_segment_registration_status.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HAWQ/2.0.0/package/alerts/alert_segment_registration_status.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + """ + Licensed to the Apache Software Foundation (ASF) under one +@@ -25,8 +25,8 @@ + + HAWQ_USER = 'gpadmin' + HAWQ_HOME='/usr/local/hawq' +-HAWQ_GREENPLUM_PATH_FILE = "{0}/greenplum_path.sh".format(HAWQ_HOME) +-HAWQ_SLAVES_FILE= "{0}/etc/slaves".format(HAWQ_HOME) ++HAWQ_GREENPLUM_PATH_FILE = "{}/greenplum_path.sh".format(HAWQ_HOME) ++HAWQ_SLAVES_FILE= "{}/etc/slaves".format(HAWQ_HOME) + HAWQMASTER_PORT = '{{hawq-site/hawq_master_address_port}}' + POSTGRES = 'postgres' + +@@ -61,7 +61,7 @@ + logger.debug("Configuration File found") + + if not os.path.isfile(HAWQ_SLAVES_FILE): +- logger.error("[Alert HAWQ] Slaves file is not present in {0}".format(HAWQ_SLAVES_FILE)) ++ logger.error("[Alert HAWQ] Slaves file is not present in {}".format(HAWQ_SLAVES_FILE)) + return (RESULT_STATE_SKIPPED, ['Slaves file is not present in /usr/local/hawq/etc']) + + try: +@@ -77,12 +77,12 @@ + if not segment_diff_len : + return (RESULT_STATE_OK, ['All HAWQ Segments are registered.']) + +- msg = '{0} HAWQ Segments are not registered with HAWQ Master.'.format(segment_diff_len) if (segment_diff_len > 1) else '1 HAWQ Segment is not registered with HAWQ Master.' +- logger.error(" [Alert HAWQ] Segments Unregistered: {0} are unregistered/down.".format(list(segment_diff))) ++ msg = '{} HAWQ Segments are not registered with HAWQ Master.'.format(segment_diff_len) if (segment_diff_len > 1) else '1 HAWQ Segment is not registered with HAWQ Master.' ++ logger.error(" [Alert HAWQ] Segments Unregistered: {} are unregistered/down.".format(list(segment_diff))) + return (RESULT_STATE_WARNING, [msg + " Try restarting HAWQ service if a segment has been added/removed. Check the log file in /var/log/ambari-agent/ambari-alerts.log for more details on unregistered hosts."]) + +- except Exception, ex: +- logger.error('[Alert HAWQ] Could not find HAWQ Segments registration status on {0}'.format(host_name)) ++ except Exception as ex: ++ logger.error('[Alert HAWQ] Could not find HAWQ Segments registration status on {}'.format(host_name)) + logger.exception(str(ex)) + + # Registration status cannot be determined +@@ -95,7 +95,7 @@ + """ + logger.debug("Fetching segment list from HAWQ Master Database.") + query = " SELECT lower(hostname) FROM gp_segment_configuration where role = 'p' and status = 'u' " +- cmd = "source {0} && psql -p {1} -t -d {2} -c \"{3};\"".format(HAWQ_GREENPLUM_PATH_FILE, port, POSTGRES, query) ++ cmd = "source {} && psql -p {} -t -d {} -c \"{};\"".format(HAWQ_GREENPLUM_PATH_FILE, port, POSTGRES, query) + + returncode, command_output = call(cmd, user=HAWQ_USER, timeout=60) + if returncode: +@@ -108,12 +108,12 @@ + """ + Gets the Segment count from HAWQMASTER host from /usr/local/hawq/etc/slaves saved from ambari configurations file. + """ +- logger.debug("Fetching Slaves from Slaves file in {0}".format(HAWQ_SLAVES_FILE)) ++ logger.debug("Fetching Slaves from Slaves file in {}".format(HAWQ_SLAVES_FILE)) + try: +- with open(HAWQ_SLAVES_FILE, "r") as slaves_file: ++ with open(HAWQ_SLAVES_FILE) as slaves_file: + slaves = slaves_file.read() + #regex to read all non empty lines in a file. +- return [segment.lower() for segment in re.findall('\S+' , slaves)] ++ return [segment.lower() for segment in re.findall(r'\S+' , slaves)] + except Exception as ex: +- logger.error("[Alert HAWQ] Get Segment list from Slaves : Could not read slaves from {0}".format(HAWQ_SLAVES_FILE)) ++ logger.error("[Alert HAWQ] Get Segment list from Slaves : Could not read slaves from {}".format(HAWQ_SLAVES_FILE)) + raise ex +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HAWQ/2.0.0/package/alerts/alert_sync_status.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HAWQ/2.0.0/package/alerts/alert_sync_status.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HAWQ/2.0.0/package/alerts/alert_sync_status.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HAWQ/2.0.0/package/alerts/alert_sync_status.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + """ + Licensed to the Apache Software Foundation (ASF) under one +@@ -67,8 +67,8 @@ + return (RESULT_STATE_OK, ['HAWQSTANDBY is in sync with HAWQMASTER.']) + elif summary_state == 'Not Synchronized': + return (RESULT_STATE_WARNING, ['HAWQSTANDBY is not in sync with HAWQMASTER. ERROR: ' + error_message]) +- except Exception, e: +- logger.exception('[Alert] Retrieving HAWQSTANDBY sync status from HAWQMASTER fails on host, {0}:'.format(host_name)) ++ except Exception as e: ++ logger.exception('[Alert] Retrieving HAWQSTANDBY sync status from HAWQMASTER fails on host, {}:'.format(host_name)) + logger.exception(str(e)) + + # Sync status cannot be determined +@@ -82,7 +82,7 @@ + """ + + query = "SELECT summary_state, error_message FROM gp_master_mirroring" +- cmd = "source {0} && psql -p {1} -t --no-align -d {2} -c \"{3};\"".format(HAWQ_GREENPLUM_PATH_FILE, port, POSTGRES, query) ++ cmd = "source {} && psql -p {} -t --no-align -d {} -c \"{};\"".format(HAWQ_GREENPLUM_PATH_FILE, port, POSTGRES, query) + + returncode, output = call(cmd, user=HAWQ_USER, timeout=60) + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HAWQ/2.0.0/package/scripts/common.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HAWQ/2.0.0/package/scripts/common.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HAWQ/2.0.0/package/scripts/common.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HAWQ/2.0.0/package/scripts/common.py 2022-07-11 00:52:33.000000000 +0800 +@@ -22,9 +22,9 @@ + import time + import xml.etree.ElementTree as ET + +-import custom_params +-import hawq_constants +-import utils ++from . import custom_params ++from . import hawq_constants ++from . import utils + from resource_management.core.exceptions import Fail + from resource_management.core.logger import Logger + from resource_management.core.resources.accounts import Group, User +@@ -47,7 +47,7 @@ + """ + Creates HAWQ user with password and default group. + """ +- import params ++ from . import params + Group(hawq_constants.hawq_group, ignore_failures=True) + + User(hawq_constants.hawq_user, +@@ -60,7 +60,7 @@ + """ + Creates HAWQ secured headless user belonging to hadoop group. + """ +- import params ++ from . import params + Group(hawq_constants.hawq_group_secured, ignore_failures=True) + + User(hawq_constants.hawq_user_secured, +@@ -73,7 +73,7 @@ + Creates the master directory (hawq_master_dir or hawq_segment_dir) for HAWQ + """ + utils.create_dir_as_hawq_user(dir_path) +- Execute("chmod 700 {0}".format(dir_path), user=hawq_constants.root_user, timeout=hawq_constants.default_exec_timeout) ++ Execute("chmod 700 {}".format(dir_path), user=hawq_constants.root_user, timeout=hawq_constants.default_exec_timeout) + + def create_temp_dirs(dir_paths): + """ +@@ -87,7 +87,7 @@ + """ + Updates the HAWQ user home directory to be owned by gpadmin:gpadmin. + """ +- command = "chown -R {0}:{1} {2}".format(hawq_constants.hawq_user, hawq_constants.hawq_group, hawq_constants.hawq_home_dir) ++ command = "chown -R {}:{} {}".format(hawq_constants.hawq_user, hawq_constants.hawq_group, hawq_constants.hawq_home_dir) + Execute(command, timeout=hawq_constants.default_exec_timeout) + + +@@ -95,7 +95,7 @@ + """ + Sets up the config files common to master, standby and segment nodes. + """ +- import params ++ from . import params + + params.XmlConfig("hdfs-client.xml", + configurations=params.hdfs_client, +@@ -134,23 +134,23 @@ + """ + Updates /etc/security/limits.d/hawq.conf file with the HAWQ parameters. + """ +- import params ++ from . import params + # Ensure limits directory exists + Directory(hawq_constants.limits_conf_dir, create_parents = True, owner=hawq_constants.root_user, group=hawq_constants.root_user) + + # Generate limits for hawq user + limits_file_content = "#### HAWQ Limits Parameters ###########\n" +- for key, value in params.hawq_limits.iteritems(): ++ for key, value in list(params.hawq_limits.items()): + if not __valid_input(value): +- raise Exception("Value {0} for parameter {1} contains non-numeric characters which are not allowed (except whitespace), please fix the value and retry".format(value, key)) ++ raise Exception("Value {} for parameter {} contains non-numeric characters which are not allowed (except whitespace), please fix the value and retry".format(value, key)) + """ + Content of the file to be written should be of the format + gpadmin soft nofile 290000 + gpadmin hard nofile 290000 + key used in the configuration is of the format soft_nofile, thus strip '_' and replace with 'space' + """ +- limits_file_content += "{0} {1} {2}\n".format(hawq_constants.hawq_user, re.sub("_", " ", key), value.strip()) +- File('{0}/{1}.conf'.format(hawq_constants.limits_conf_dir, hawq_constants.hawq_user), content=limits_file_content, ++ limits_file_content += "{} {} {}\n".format(hawq_constants.hawq_user, re.sub("_", " ", key), value.strip()) ++ File('{}/{}.conf'.format(hawq_constants.limits_conf_dir, hawq_constants.hawq_user), content=limits_file_content, + owner=hawq_constants.hawq_user, group=hawq_constants.hawq_group) + + +@@ -165,12 +165,12 @@ + """ + Convert sysctl configuration dict to text with each property value pair separated on new line + """ +- import params ++ from . import params + sysctl_file_content = "### HAWQ System Parameters ###########\n" +- for key, value in params.hawq_sysctl.iteritems(): ++ for key, value in list(params.hawq_sysctl.items()): + if not __valid_input(value): +- raise Exception("Value {0} for parameter {1} contains non-numeric characters which are not allowed (except whitespace), please fix the value and retry".format(value, key)) +- sysctl_file_content += "{0} = {1}\n".format(key, value) ++ raise Exception("Value {} for parameter {} contains non-numeric characters which are not allowed (except whitespace), please fix the value and retry".format(value, key)) ++ sysctl_file_content += "{} = {}\n".format(key, value) + return sysctl_file_content + + +@@ -192,10 +192,10 @@ + if is_changed: + # Generate file with kernel parameters needed by hawq, only if something + # has been changed by user +- Execute("cp -p {0} {1}".format(hawq_constants.hawq_sysctl_tmp_file, hawq_constants.hawq_sysctl_file)) ++ Execute("cp -p {} {}".format(hawq_constants.hawq_sysctl_tmp_file, hawq_constants.hawq_sysctl_file)) + + # Reload kernel sysctl parameters from hawq file. +- Execute("sysctl -e -p {0}".format(hawq_constants.hawq_sysctl_file), timeout=hawq_constants.default_exec_timeout) ++ Execute("sysctl -e -p {}".format(hawq_constants.hawq_sysctl_file), timeout=hawq_constants.default_exec_timeout) + + # Wipe out temp file + File(hawq_constants.hawq_sysctl_tmp_file, action='delete') +@@ -221,7 +221,7 @@ + + if sysctl_file_dict_original != sysctl_file_dict: + # Backup file +- Execute("cp {0} {1}".format(hawq_constants.sysctl_suse_file, backup_file_name), timeout=hawq_constants.default_exec_timeout) ++ Execute("cp {} {}".format(hawq_constants.sysctl_suse_file, backup_file_name), timeout=hawq_constants.default_exec_timeout) + # Write merged properties to file + utils.write_dict_to_file(sysctl_file_dict, hawq_constants.sysctl_suse_file) + # Reload kernel sysctl parameters from /etc/sysctl.conf +@@ -229,9 +229,9 @@ + + except Exception as e: + Logger.error("Error occurred while updating sysctl.conf file, reverting the contents" + str(e)) +- Execute("cp {0} {1}".format(hawq_constants.sysctl_suse_file, hawq_constants.hawq_sysctl_tmp_file)) +- Execute("mv {0} {1}".format(backup_file_name, hawq_constants.sysctl_suse_file), timeout=hawq_constants.default_exec_timeout) +- Logger.error("Please execute `sysctl -e -p` on the command line manually to reload the contents of file {0}".format( ++ Execute("cp {} {}".format(hawq_constants.sysctl_suse_file, hawq_constants.hawq_sysctl_tmp_file)) ++ Execute("mv {} {}".format(backup_file_name, hawq_constants.sysctl_suse_file), timeout=hawq_constants.default_exec_timeout) ++ Logger.error("Please execute `sysctl -e -p` on the command line manually to reload the contents of file {}".format( + hawq_constants.hawq_sysctl_tmp_file)) + raise Fail("Failed to update sysctl.conf file ") + +@@ -254,13 +254,13 @@ + return current_property_value + raise #If property has not been found + except Exception: +- raise Fail("Unable to read property {0} from local {1}".format(property_name, hawq_site_path)) ++ raise Fail("Unable to read property {} from local {}".format(property_name, hawq_site_path)) + + def validate_configuration(): + """ + Validates if YARN is present in the configuration when the user specifies YARN as HAWQ's resource manager. + """ +- import params ++ from . import params + + # At this point, hawq should be included. + if 'hawq-site' not in params.config['configurations']: +@@ -278,7 +278,7 @@ + If data directory exists start the component, else initialize the component. + Initialization starts the component + """ +- import params ++ from . import params + + __check_dfs_truncate_enforced() + if component_name == hawq_constants.MASTER: +@@ -292,10 +292,10 @@ + owner=data_dir_owner, + group=hawq_constants.hawq_group, + recursive_chown=True, +- mode=0755) ++ mode=0o755) + params.HdfsResource(None, action="execute") + +- options_str = "{0} -a -v".format(component_name) ++ options_str = "{} -a -v".format(component_name) + if os.path.exists(os.path.join(data_dir, hawq_constants.postmaster_opts_filename)): + return utils.exec_hawq_operation(hawq_constants.START, options_str, + not_if=utils.generate_hawq_process_status_cmd(component_name, port)) +@@ -303,7 +303,7 @@ + # Initialize HAWQ + if component_name == hawq_constants.MASTER: + utils.exec_hawq_operation(hawq_constants.INIT, options_str + " --ignore-bad-hosts") +- utils.exec_psql_cmd('create database {0};'.format(hawq_constants.hawq_user), ++ utils.exec_psql_cmd('create database {};'.format(hawq_constants.hawq_user), + params.hawqmaster_host, params.hawq_master_address_port, ignore_error=True) + else: + utils.exec_hawq_operation(hawq_constants.INIT, options_str) +@@ -316,18 +316,18 @@ + port_property_name = hawq_constants.COMPONENT_ATTRIBUTES_MAP[component_name]['port_property'] + port_number = get_local_hawq_site_property_value(port_property_name) + utils.exec_hawq_operation(hawq_constants.STOP, +- "{0} -M {1} -a -v".format(component_name, mode), ++ "{} -M {} -a -v".format(component_name, mode), + only_if=utils.generate_hawq_process_status_cmd(component_name, port_number)) + + def __get_hdfs_dir_owner(): +- import params ++ from . import params + + # Check the owner for hawq_data directory +- kinit_cmd = "{0} -kt {1} {2};".format(params.kinit_path_local, params.hdfs_user_keytab, params.hdfs_principal_name) if params.security_enabled else "" +- cmd = kinit_cmd + "hdfs dfs -ls {0} | sed '1d;s/ */ /g' | cut -d\\ -f3".format(params.hawq_hdfs_data_dir) ++ kinit_cmd = "{} -kt {} {};".format(params.kinit_path_local, params.hdfs_user_keytab, params.hdfs_principal_name) if params.security_enabled else "" ++ cmd = kinit_cmd + "hdfs dfs -ls {} | sed '1d;s/ */ /g' | cut -d\\ -f3".format(params.hawq_hdfs_data_dir) + returncode, stdout = call(cmd, user=params.hdfs_superuser, timeout=300) + if returncode: +- raise Fail("Unable to determine the ownership for HDFS dir {0}".format(params.hawq_hdfs_data_dir)) ++ raise Fail("Unable to determine the ownership for HDFS dir {}".format(params.hawq_hdfs_data_dir)) + return stdout.strip() + + def __check_dfs_truncate_enforced(): +@@ -343,6 +343,6 @@ + dfs_allow_truncate = default("/configurations/hdfs-site/dfs.allow.truncate", None) + if dfs_allow_truncate is None or str(dfs_allow_truncate).lower() != 'true': + if custom_params.enforce_hdfs_truncate: +- raise Fail("**ERROR**: {0}".format(DFS_ALLOW_TRUNCATE_WARNING_MSG)) ++ raise Fail("**ERROR**: {}".format(DFS_ALLOW_TRUNCATE_WARNING_MSG)) + else: +- Logger.error("**WARNING**: {0}".format(DFS_ALLOW_TRUNCATE_WARNING_MSG)) ++ Logger.error("**WARNING**: {}".format(DFS_ALLOW_TRUNCATE_WARNING_MSG)) +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HAWQ/2.0.0/package/scripts/hawq_constants.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HAWQ/2.0.0/package/scripts/hawq_constants.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HAWQ/2.0.0/package/scripts/hawq_constants.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HAWQ/2.0.0/package/scripts/hawq_constants.py 2022-07-11 00:52:33.000000000 +0800 +@@ -43,7 +43,7 @@ + hawq_config_dir = "/usr/local/hawq/etc/" + hawq_pid_dir = "/var/run/hawq/" + hawq_tmp_dir = '/data/hawq/tmp' +-hawq_user_home_dir = os.path.expanduser("~{0}".format(hawq_user)) ++hawq_user_home_dir = os.path.expanduser("~{}".format(hawq_user)) + limits_conf_dir = "/etc/security/limits.d" + sysctl_conf_dir = "/etc/sysctl.d" + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HAWQ/2.0.0/package/scripts/hawqmaster.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HAWQ/2.0.0/package/scripts/hawqmaster.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HAWQ/2.0.0/package/scripts/hawqmaster.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HAWQ/2.0.0/package/scripts/hawqmaster.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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,10 +24,10 @@ + from resource_management.core.source import InlineTemplate + from resource_management.libraries.functions import stack_select + +-import master_helper +-import common +-import hawq_constants +-import utils ++from . import master_helper ++from . import common ++from . import hawq_constants ++from . import utils + + class HawqMaster(Script): + """ +@@ -41,14 +41,14 @@ + + + def configure(self, env): +- import params ++ from . import params + env.set_params(params) + env.set_params(hawq_constants) + master_helper.configure_master() + + + def start(self, env): +- import params ++ from . import params + self.configure(env) + common.validate_configuration() + exchange_ssh_keys = default('/configurations/hawq-env/hawq_ssh_exkeys', None) +@@ -64,7 +64,7 @@ + + + def status(self, env): +- from hawqstatus import assert_component_running ++ from .hawqstatus import assert_component_running + assert_component_running(hawq_constants.MASTER) + + +@@ -73,15 +73,15 @@ + + + def hawq_clear_cache(self, env): +- import params +- from utils import exec_psql_cmd ++ from . import params ++ from .utils import exec_psql_cmd + cmd = "SELECT gp_metadata_cache_clear()" + Logger.info("Clearing HAWQ's HDFS Metadata cache ...") + exec_psql_cmd(cmd, params.hawqmaster_host, params.hawq_master_address_port) + + + def run_hawq_check(self, env): +- import params ++ from . import params + Logger.info("Executing HAWQ Check ...") + params.File(hawq_constants.hawq_hosts_file, content=InlineTemplate("{% for host in hawq_all_hosts %}{{host}}\n{% endfor %}")) + +@@ -107,18 +107,18 @@ + + + def resync_hawq_standby(self,env): +- import params ++ from . import params + Logger.info("HAWQ Standby Master Re-Sync started in fast mode...") + utils.exec_hawq_operation(hawq_constants.INIT, +- "{0} -n -a -v -M {1}".format(hawq_constants.STANDBY, hawq_constants.FAST), ++ "{} -n -a -v -M {}".format(hawq_constants.STANDBY, hawq_constants.FAST), + host_name=params.hawqmaster_host) + + + def remove_hawq_standby(self, env): +- import params ++ from . import params + Logger.info("Removing HAWQ Standby Master ...") + utils.exec_hawq_operation(hawq_constants.INIT, +- "{0} -a -v -r --ignore-bad-hosts".format(hawq_constants.STANDBY), ++ "{} -a -v -r --ignore-bad-hosts".format(hawq_constants.STANDBY), + host_name=params.hawqmaster_host) + + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HAWQ/2.0.0/package/scripts/hawqsegment.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HAWQ/2.0.0/package/scripts/hawqsegment.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HAWQ/2.0.0/package/scripts/hawqsegment.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HAWQ/2.0.0/package/scripts/hawqsegment.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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,8 +19,8 @@ + + from resource_management import Script + +-import common +-import hawq_constants ++from . import common ++from . import hawq_constants + + class HawqSegment(Script): + """ +@@ -33,7 +33,7 @@ + self.configure(env) + + def configure(self, env): +- import params ++ from . import params + + env.set_params(params) + env.set_params(hawq_constants) +@@ -43,17 +43,17 @@ + common.create_temp_dirs(params.hawq_segment_temp_dirs) + + def start(self, env): +- import params ++ from . import params + self.configure(env) + common.validate_configuration() + common.start_component(hawq_constants.SEGMENT, params.hawq_segment_address_port, params.hawq_segment_dir) + + def stop(self, env, mode=hawq_constants.FAST): +- import params ++ from . import params + common.stop_component(hawq_constants.SEGMENT, mode) + + def status(self, env): +- from hawqstatus import assert_component_running ++ from .hawqstatus import assert_component_running + assert_component_running(hawq_constants.SEGMENT) + + def immediate_stop_hawq_segment(self, env): +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HAWQ/2.0.0/package/scripts/hawqstandby.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HAWQ/2.0.0/package/scripts/hawqstandby.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HAWQ/2.0.0/package/scripts/hawqstandby.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HAWQ/2.0.0/package/scripts/hawqstandby.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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,9 +20,9 @@ + from resource_management import Script + from resource_management.core.logger import Logger + +-import common +-import hawq_constants +-import master_helper ++from . import common ++from . import hawq_constants ++from . import master_helper + + class HawqStandby(Script): + """ +@@ -35,13 +35,13 @@ + self.configure(env) + + def configure(self, env): +- import params ++ from . import params + env.set_params(params) + env.set_params(hawq_constants) + master_helper.configure_master() + + def start(self, env): +- import params ++ from . import params + self.configure(env) + common.validate_configuration() + common.start_component(hawq_constants.STANDBY, params.hawq_master_address_port, params.hawq_master_dir) +@@ -50,18 +50,18 @@ + common.stop_component(hawq_constants.STANDBY, hawq_constants.FAST) + + def status(self, env): +- from hawqstatus import assert_component_running ++ from .hawqstatus import assert_component_running + assert_component_running(hawq_constants.STANDBY) + + def activate_hawq_standby(self, env): +- import params +- import utils ++ from . import params ++ from . import utils + Logger.info("Activating HAWQ standby...") + params.XmlConfig("hawq-site.xml", + configurations=params.hawq_site, + configuration_attributes=params.config_attrs['hawq-site']) + utils.exec_hawq_operation(hawq_constants.ACTIVATE, +- "{0} -a -M {1} -v --ignore-bad-hosts".format(hawq_constants.STANDBY, hawq_constants.FAST), ++ "{} -a -M {} -v --ignore-bad-hosts".format(hawq_constants.STANDBY, hawq_constants.FAST), + host_name=params.hawqstandby_host) + + # Stop the new HAWQMASTER as the process might be running at an old port, +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HAWQ/2.0.0/package/scripts/hawqstatus.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HAWQ/2.0.0/package/scripts/hawqstatus.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HAWQ/2.0.0/package/scripts/hawqstatus.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HAWQ/2.0.0/package/scripts/hawqstatus.py 2022-07-11 00:52:33.000000000 +0800 +@@ -19,9 +19,9 @@ + from resource_management.core.shell import call + from resource_management.core.exceptions import ComponentIsNotRunning + +-import common +-import hawq_constants +-import utils ++from . import common ++from . import hawq_constants ++from . import utils + + def assert_component_running(component_name): + """ +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HAWQ/2.0.0/package/scripts/__init__.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HAWQ/2.0.0/package/scripts/__init__.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HAWQ/2.0.0/package/scripts/__init__.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HAWQ/2.0.0/package/scripts/__init__.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HAWQ/2.0.0/package/scripts/master_helper.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HAWQ/2.0.0/package/scripts/master_helper.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HAWQ/2.0.0/package/scripts/master_helper.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HAWQ/2.0.0/package/scripts/master_helper.py 2022-07-11 00:52:33.000000000 +0800 +@@ -24,15 +24,15 @@ + from resource_management.libraries.functions.default import default + from resource_management.core.exceptions import Fail + +-import utils +-import common +-import hawq_constants ++from . import utils ++from . import common ++from . import hawq_constants + + def __setup_master_specific_conf_files(): + """ + Sets up config files only applicable for HAWQ Master and Standby nodes + """ +- import params ++ from . import params + + params.File(hawq_constants.hawq_check_file, + content=params.hawq_check_content) +@@ -45,7 +45,7 @@ + """ + Exchanges ssh keys to setup passwordless ssh for the hawq_user between the HAWQ Master and the HAWQ Segment nodes + """ +- import params ++ from . import params + + failed_hosts = [] + for host in params.hawq_all_hosts: +@@ -58,15 +58,15 @@ + if failed_hosts_cnt > 0: + DEBUG_HELP_MSG = "Please verify the logs below to debug the cause of failure." + if failed_hosts_cnt == len(params.hawq_all_hosts): +- raise Fail("Setting up passwordless ssh failed for all the HAWQ hosts. {0}".format(DEBUG_HELP_MSG)) ++ raise Fail("Setting up passwordless ssh failed for all the HAWQ hosts. {}".format(DEBUG_HELP_MSG)) + else: +- Logger.error("**WARNING**: Setting up passwordless ssh failed with the hosts below, proceeding with HAWQ Master start:\n{0}\n\n{1}".format("\n".join(failed_hosts), DEBUG_HELP_MSG)) ++ Logger.error("**WARNING**: Setting up passwordless ssh failed with the hosts below, proceeding with HAWQ Master start:\n{}\n\n{}".format("\n".join(failed_hosts), DEBUG_HELP_MSG)) + + def configure_master(): + """ + Configures the master node after rpm install + """ +- import params ++ from . import params + common.setup_user() + common.setup_common_configurations() + __setup_master_specific_conf_files() +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HAWQ/2.0.0/package/scripts/params.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HAWQ/2.0.0/package/scripts/params.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HAWQ/2.0.0/package/scripts/params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HAWQ/2.0.0/package/scripts/params.py 2022-07-11 00:52:33.000000000 +0800 +@@ -17,7 +17,7 @@ + """ + + import functools +-import hawq_constants ++from . import hawq_constants + from resource_management import Script + from resource_management.core.resources.system import File + from resource_management.libraries.functions import conf_select +@@ -48,14 +48,14 @@ + user_group = config['configurations']['cluster-env']['user_group'] + + # Convert hawq_password to unicode for crypt() function in case user enters a numeric password +-hawq_password = unicode(config['configurations']['hawq-env']['hawq_password']) ++hawq_password = str(config['configurations']['hawq-env']['hawq_password']) + + + # HAWQ Hostnames + hawqmaster_host = __get_component_host('hawqmaster_hosts') + hawqstandby_host = __get_component_host('hawqstandby_hosts') + hawqsegment_hosts = sorted(default('/clusterHostInfo/hawqsegment_hosts', [])) +-hawq_master_hosts = [host for host in hawqmaster_host, hawqstandby_host if host] ++hawq_master_hosts = [host for host in (hawqmaster_host, hawqstandby_host) if host] + hawq_all_hosts = sorted(set(hawq_master_hosts + hawqsegment_hosts)) + + +@@ -94,18 +94,18 @@ + File = functools.partial(File, + owner=hawq_constants.hawq_user, + group=hawq_constants.hawq_group, +- mode=0644) ++ mode=0o644) + + # XMLConfig partial function + XmlConfig = functools.partial(XmlConfig, + conf_dir=hawq_constants.hawq_config_dir, + owner=hawq_constants.hawq_user, + group=hawq_constants.hawq_group, +- mode=0644) ++ mode=0o644) + + # For service Check + is_pxf_installed = __get_component_host("pxf_hosts") is not None +-namenode_path = "{0}:{1}".format(__get_component_host("namenode_hosts"), hawq_constants.PXF_PORT) if dfs_nameservice is None else dfs_nameservice ++namenode_path = "{}:{}".format(__get_component_host("namenode_hosts"), hawq_constants.PXF_PORT) if dfs_nameservice is None else dfs_nameservice + table_definition = { + "HAWQ": { + "name": "ambari_hawq_test", +@@ -117,13 +117,13 @@ + "name": "ambari_hawq_pxf_hdfs_readable_test", + "create_type": "READABLE EXTERNAL", + "drop_type": "EXTERNAL", +- "description": "(col1 int) LOCATION ('pxf://{0}{1}?PROFILE=HdfsTextSimple') FORMAT 'TEXT'".format(namenode_path, hawq_constants.pxf_hdfs_test_dir) ++ "description": "(col1 int) LOCATION ('pxf://{}{}?PROFILE=HdfsTextSimple') FORMAT 'TEXT'".format(namenode_path, hawq_constants.pxf_hdfs_test_dir) + }, + "EXTERNAL_HDFS_WRITABLE": { + "name": "ambari_hawq_pxf_hdfs_writable_test", + "create_type": "WRITABLE EXTERNAL", + "drop_type": "EXTERNAL", +- "description": "(col1 int) LOCATION ('pxf://{0}{1}?PROFILE=HdfsTextSimple') FORMAT 'TEXT'".format(namenode_path, hawq_constants.pxf_hdfs_test_dir) ++ "description": "(col1 int) LOCATION ('pxf://{}{}?PROFILE=HdfsTextSimple') FORMAT 'TEXT'".format(namenode_path, hawq_constants.pxf_hdfs_test_dir) + } + } + +@@ -153,6 +153,6 @@ + hawq_master_temp_dirs = hawq_site.get('hawq_master_temp_directory') + hawq_segment_temp_dirs = hawq_site.get('hawq_segment_temp_directory') + # Extract hawq hdfs directory from hdfs url. Ex: /hawq/hawq_data from host:8080/hawq/hawq_data +-hawq_hdfs_data_dir = "/{0}".format(hawq_site.get('hawq_dfs_url').split('/', 1)[1]) ++hawq_hdfs_data_dir = "/{}".format(hawq_site.get('hawq_dfs_url').split('/', 1)[1]) + hawq_master_address_port = hawq_site.get('hawq_master_address_port') + hawq_segment_address_port = hawq_site.get('hawq_segment_address_port') +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HAWQ/2.0.0/package/scripts/service_check.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HAWQ/2.0.0/package/scripts/service_check.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HAWQ/2.0.0/package/scripts/service_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HAWQ/2.0.0/package/scripts/service_check.py 2022-07-11 00:52:33.000000000 +0800 +@@ -17,9 +17,9 @@ + """ + + import sys +-import common +-import hawq_constants +-from utils import exec_psql_cmd, exec_ssh_cmd ++from . import common ++from . import hawq_constants ++from .utils import exec_psql_cmd, exec_ssh_cmd + from resource_management.libraries.script import Script + from resource_management.core.exceptions import Fail + from resource_management.core.logger import Logger +@@ -34,7 +34,7 @@ + """ + Runs service check for HAWQ. + """ +- import params ++ from . import params + + self.active_master_host = params.hawqmaster_host + self.active_master_port = params.hawq_master_address_port +@@ -55,7 +55,7 @@ + Logger.info("PXF not installed. Skipping HAWQ-PXF checks...") + + if self.checks_failed != 0: +- Logger.error("** FAILURE **: Service check failed {0} of {1} checks".format(self.checks_failed, self.total_checks)) ++ Logger.error("** FAILURE **: Service check failed {} of {} checks".format(self.checks_failed, self.total_checks)) + sys.exit(1) + + Logger.info("Service check completed successfully") +@@ -65,16 +65,16 @@ + """ + Checks state of HAWQ cluster + """ +- import params ++ from . import params + Logger.info("--- Check state of HAWQ cluster ---") + try: +- command = "source {0} && hawq state -d {1}".format(hawq_constants.hawq_greenplum_path_file, params.hawq_master_dir) ++ command = "source {} && hawq state -d {}".format(hawq_constants.hawq_greenplum_path_file, params.hawq_master_dir) + Logger.info("Executing hawq status check...") + (retcode, out, err) = exec_ssh_cmd(self.active_master_host, command) + if retcode: +- Logger.error("SERVICE CHECK FAILED: hawq state command returned non-zero result: {0}. Out: {1} Error: {2}".format(retcode, out, err)) ++ Logger.error("SERVICE CHECK FAILED: hawq state command returned non-zero result: {}. Out: {} Error: {}".format(retcode, out, err)) + raise Fail("Unexpected result of hawq state command.") +- Logger.info("Output of command:\n{0}".format(str(out) + "\n")) ++ Logger.info("Output of command:\n{}".format(str(out) + "\n")) + except: + self.checks_failed += 1 + +@@ -83,7 +83,7 @@ + """ + Tests to check HAWQ + """ +- import params ++ from . import params + Logger.info("--- Check if HAWQ can write and query from a table ---") + table = params.table_definition['HAWQ'] + try: +@@ -103,7 +103,7 @@ + """ + Tests to check if HAWQ can write and read external tables on HDFS using PXF + """ +- import params ++ from . import params + Logger.info("--- Check if HAWQ can write and query from HDFS using PXF External Tables ---") + table_writable = params.table_definition['EXTERNAL_HDFS_WRITABLE'] + table_readable = params.table_definition['EXTERNAL_HDFS_READABLE'] +@@ -126,41 +126,41 @@ + + + def drop_table(self, table): +- Logger.info("Dropping {0} table if exists".format(table['name'])) +- sql_cmd = "DROP {0} TABLE IF EXISTS {1}".format(table['drop_type'], table['name']) ++ Logger.info("Dropping {} table if exists".format(table['name'])) ++ sql_cmd = "DROP {} TABLE IF EXISTS {}".format(table['drop_type'], table['name']) + exec_psql_cmd(sql_cmd, self.active_master_host, self.active_master_port) + + + def create_table(self, table): +- Logger.info("Creating table {0}".format(table['name'])) +- sql_cmd = "CREATE {0} TABLE {1} {2}".format(table['create_type'], table['name'], table['description']) ++ Logger.info("Creating table {}".format(table['name'])) ++ sql_cmd = "CREATE {} TABLE {} {}".format(table['create_type'], table['name'], table['description']) + exec_psql_cmd(sql_cmd, self.active_master_host, self.active_master_port) + + + def insert_data(self, table): +- Logger.info("Inserting data to table {0}".format(table['name'])) +- sql_cmd = "INSERT INTO {0} SELECT * FROM generate_series(1,10)".format(table['name']) ++ Logger.info("Inserting data to table {}".format(table['name'])) ++ sql_cmd = "INSERT INTO {} SELECT * FROM generate_series(1,10)".format(table['name']) + exec_psql_cmd(sql_cmd, self.active_master_host, self.active_master_port) + + + def query_data(self, table): +- Logger.info("Querying data from table {0}".format(table['name'])) +- sql_cmd = "SELECT * FROM {0}".format(table['name']) ++ Logger.info("Querying data from table {}".format(table['name'])) ++ sql_cmd = "SELECT * FROM {}".format(table['name']) + exec_psql_cmd(sql_cmd, self.active_master_host, self.active_master_port) + + + def validate_data(self, table): + expected_data = "55" +- Logger.info("Validating data inserted, finding sum of all the inserted entries. Expected output: {0}".format(expected_data)) +- sql_cmd = "SELECT sum(col1) FROM {0}".format(table['name']) ++ Logger.info("Validating data inserted, finding sum of all the inserted entries. Expected output: {}".format(expected_data)) ++ sql_cmd = "SELECT sum(col1) FROM {}".format(table['name']) + _, stdout, _ = exec_psql_cmd(sql_cmd, self.active_master_host, self.active_master_port, tuples_only=False) + if expected_data != stdout.strip(): +- Logger.error("Incorrect data returned. Expected Data: {0} Actual Data: {1}".format(expected_data, stdout)) ++ Logger.error("Incorrect data returned. Expected Data: {} Actual Data: {}".format(expected_data, stdout)) + raise Fail("Incorrect data returned.") + + + def delete_pxf_hdfs_test_dir(self): +- import params ++ from . import params + params.HdfsResource(hawq_constants.pxf_hdfs_test_dir, + type="directory", + action="delete_on_execute") +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HAWQ/2.0.0/package/scripts/utils.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HAWQ/2.0.0/package/scripts/utils.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HAWQ/2.0.0/package/scripts/utils.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HAWQ/2.0.0/package/scripts/utils.py 2022-07-11 00:52:33.000000000 +0800 +@@ -21,14 +21,14 @@ + from resource_management.core.exceptions import Fail + from resource_management.core.logger import Logger + +-import hawq_constants ++from . import hawq_constants + + def generate_hawq_process_status_cmd(component_name, port): + """ + Generate a string of command to check if hawq postgres / gpsyncmaster process is running + """ + process_name = hawq_constants.COMPONENT_ATTRIBUTES_MAP[component_name]['process_name'] +- return "netstat -tupln | egrep ':{0}\s' | egrep {1}".format(port, process_name) ++ return r"netstat -tupln | egrep ':{}\s' | egrep {}".format(port, process_name) + + + def create_dir_as_hawq_user(directory): +@@ -42,8 +42,8 @@ + """ + Sets up execution environment and runs a given command as HAWQ user + """ +- export_host = " && export PGHOST=\"{0}\"".format(host_name) if host_name is not None else "" +- hawq_cmd = "source {0}{1} && hawq {2} {3}".format(hawq_constants.hawq_greenplum_path_file, export_host, operation, option) ++ export_host = " && export PGHOST=\"{}\"".format(host_name) if host_name is not None else "" ++ hawq_cmd = "source {}{} && hawq {} {}".format(hawq_constants.hawq_greenplum_path_file, export_host, operation, option) + Execute( + hawq_cmd, + user=hawq_constants.hawq_user, +@@ -57,7 +57,7 @@ + """ + Converts a file with key=value format to dictionary + """ +- with open(file_name, "r") as fh: ++ with open(file_name) as fh: + lines = fh.readlines() + lines = [item for item in lines if '=' in item] + result_dict = dict(item.split("=") for item in lines) +@@ -69,11 +69,11 @@ + Writes a dictionary into a file with key=value format + """ + with open(dest_file, "w") as fh: +- for property_key, property_value in source_dict.items(): ++ for property_key, property_value in list(source_dict.items()): + if property_value is None: + fh.write(property_key + "\n") + else: +- fh.write("{0}={1}\n".format(property_key, property_value)) ++ fh.write("{}={}\n".format(property_key, property_value)) + + + def exec_ssh_cmd(hostname, cmd): +@@ -81,8 +81,8 @@ + Runs the command on the remote host as gpadmin user + """ + # Only gpadmin should be allowed to run command via ssh, thus not exposing user as a parameter +- cmd = "su - {0} -c \"ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null {1} \\\"{2} \\\" \"".format(hawq_constants.hawq_user, hostname, cmd) +- Logger.info("Command executed: {0}".format(cmd)) ++ cmd = "su - {} -c \"ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null {} \\\"{} \\\" \"".format(hawq_constants.hawq_user, hostname, cmd) ++ Logger.info("Command executed: {}".format(cmd)) + process = subprocess32.Popen(cmd, stdout=subprocess32.PIPE, stdin=subprocess32.PIPE, stderr=subprocess32.PIPE, shell=True) + (stdout, stderr) = process.communicate() + return process.returncode, stdout, stderr +@@ -92,16 +92,16 @@ + """ + Sets up execution environment and runs the HAWQ queries + """ +- src_cmd = "export PGPORT={0} && source {1}".format(port, hawq_constants.hawq_greenplum_path_file) ++ src_cmd = "export PGPORT={} && source {}".format(port, hawq_constants.hawq_greenplum_path_file) + if tuples_only: +- cmd = src_cmd + " && psql -d {0} -c \\\\\\\"{1};\\\\\\\"".format(db, command) ++ cmd = src_cmd + " && psql -d {} -c \\\\\\\"{};\\\\\\\"".format(db, command) + else: +- cmd = src_cmd + " && psql -t -d {0} -c \\\\\\\"{1};\\\\\\\"".format(db, command) ++ cmd = src_cmd + " && psql -t -d {} -c \\\\\\\"{};\\\\\\\"".format(db, command) + retcode, out, err = exec_ssh_cmd(host, cmd) + if retcode: +- Logger.error("SQL command executed failed: {0}\nReturncode: {1}\nStdout: {2}\nStderr: {3}".format(cmd, retcode, out, err)) ++ Logger.error("SQL command executed failed: {}\nReturncode: {}\nStdout: {}\nStderr: {}".format(cmd, retcode, out, err)) + if not ignore_error: + raise Fail("SQL command executed failed.") + +- Logger.info("Output:\n{0}".format(out)) ++ Logger.info("Output:\n{}".format(out)) + return retcode, out, err +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HAWQ/2.0.0/service_advisor.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HAWQ/2.0.0/service_advisor.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HAWQ/2.0.0/service_advisor.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HAWQ/2.0.0/service_advisor.py 2022-07-11 00:52:33.000000000 +0800 +@@ -34,12 +34,12 @@ + 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 HAWQ200ServiceAdvisor(service_advisor.ServiceAdvisor): + + def __init__(self, *args, **kwargs): +- self.as_super = super(HAWQ200ServiceAdvisor, self) ++ self.as_super = super() + self.as_super.__init__(*args, **kwargs) + + def getHostsForMasterComponent(self, services, hosts, component, hostsList): +@@ -77,7 +77,7 @@ + # colocate HAWQSEGMENT with DATANODE, if no hosts have been allocated for HAWQSEGMENT + hawqSegment = [component for component in serviceComponents if component["StackServiceComponents"]["component_name"] == "HAWQSEGMENT"][0] + if not self.isComponentHostsPopulated(hawqSegment): +- for hostName in hostsComponentsMap.keys(): ++ for hostName in list(hostsComponentsMap.keys()): + hostComponents = hostsComponentsMap[hostName] + if {"name": "DATANODE"} in hostComponents and {"name": "HAWQSEGMENT"} not in hostComponents: + hostsComponentsMap[hostName].append( { "name": "HAWQSEGMENT" } ) +@@ -102,7 +102,7 @@ + if len(mismatchHosts) > 0: + hostsString = ', '.join(mismatchHosts) + message = "HAWQ Segment must be installed on all DataNodes. " \ +- "The following {0} host(s) do not satisfy the colocation recommendation: {1}".format(len(mismatchHosts), hostsString) ++ "The following {} host(s) do not satisfy the colocation recommendation: {}".format(len(mismatchHosts), hostsString) + items.append( { "type": 'host-component', "level": 'WARN', "message": message, "component-name": 'HAWQSEGMENT' } ) + + # single node case is not analyzed because HAWQ Standby Master will not be present in single node topology due to logic in createComponentLayoutRecommendations() +@@ -137,7 +137,7 @@ + hdfs_site = services["configurations"]["hdfs-site"]["properties"] + putHdfsSiteProperty = self.putProperty(configurations, "hdfs-site", services) + +- for property, desired_value in self.getHDFSSiteDesiredValues(self.isSecurityEnabled(services)).iteritems(): ++ for property, desired_value in list(self.getHDFSSiteDesiredValues(self.isSecurityEnabled(services)).items()): + if property not in hdfs_site or hdfs_site[property] != desired_value: + putHdfsSiteProperty(property, desired_value) + +@@ -146,7 +146,7 @@ + core_site = services["configurations"]["core-site"]["properties"] + putCoreSiteProperty = self.putProperty(configurations, "core-site", services) + +- for property, desired_value in self.getCORESiteDesiredValues().iteritems(): ++ for property, desired_value in list(self.getCORESiteDesiredValues().items()): + if property not in core_site or core_site[property] != desired_value: + putCoreSiteProperty(property, desired_value) + +@@ -160,8 +160,8 @@ + hawqSegmentHosts = set(self.getHosts(componentsList, "HAWQSEGMENT")) + hawqHosts = hawqMasterHosts.union(hawqSegmentHosts) + numSegments = len(hawqSegmentHosts) +- minHawqHostsMemory = min([host['Hosts']['total_mem'] for host in hosts['items'] if host['Hosts']['host_name'] in hawqHosts]) +- minHawqHostsCoreCount = min([host['Hosts']['cpu_count'] for host in hosts['items'] if host['Hosts']['host_name'] in hawqHosts]) ++ minHawqHostsMemory = min(host['Hosts']['total_mem'] for host in hosts['items'] if host['Hosts']['host_name'] in hawqHosts) ++ minHawqHostsCoreCount = min(host['Hosts']['cpu_count'] for host in hosts['items'] if host['Hosts']['host_name'] in hawqHosts) + + hawq_site = services["configurations"]["hawq-site"]["properties"] + hawq_sysctl_env = services["configurations"]["hawq-sysctl-env"]["properties"] +@@ -201,7 +201,7 @@ + hawq_rm_memory_limit_perseg_unit = "MB" + + # hawq_rm_memory_limit_perseg does not support decimal value so trim decimal using int +- putHawqSiteProperty("hawq_rm_memory_limit_perseg", "{0}{1}".format(int(hawq_rm_memory_limit_perseg_value), hawq_rm_memory_limit_perseg_unit)) ++ putHawqSiteProperty("hawq_rm_memory_limit_perseg", "{}{}".format(int(hawq_rm_memory_limit_perseg_value), hawq_rm_memory_limit_perseg_unit)) + + if numSegments and "hawq_rm_nvseg_perquery_limit" in hawq_site: + factor_min = 1 +@@ -228,7 +228,7 @@ + # update YARN RM urls with the values from yarn-site if YARN is installed + if "YARN" in servicesList and "yarn-site" in services["configurations"]: + yarn_site = services["configurations"]["yarn-site"]["properties"] +- for hs_prop, ys_prop in self.getHAWQYARNPropertyMapping().items(): ++ for hs_prop, ys_prop in list(self.getHAWQYARNPropertyMapping().items()): + if hs_prop in hawq_site and ys_prop in yarn_site: + putHawqSiteProperty(hs_prop, yarn_site[ys_prop]) + +@@ -251,7 +251,7 @@ + "hawq_rm_yarn_address": True + } + +- for property, visibility in yarn_mode_properties_visibility.iteritems(): ++ for property, visibility in list(yarn_mode_properties_visibility.items()): + putHawqSitePropertyAttribute(property, "visible", str(visibility if YARN_MODE else not visibility).lower()) + + putHawqSitePropertyAttribute("default_hash_table_bucket_number", "maximum", numSegments * 16 if numSegments * 16 < 10000 else 10000) +@@ -330,7 +330,7 @@ + 'hawq_segment_directory': 'HAWQ Segment directory', + 'hawq_segment_temp_directory': 'HAWQ Segment temp directory' + } +- for property_name, display_name in directories.iteritems(): ++ for property_name, display_name in list(directories.items()): + self.validateIfRootDir(properties, validationItems, property_name, display_name) + + # 2.1 Check if any master or segment directories has multiple values +@@ -338,7 +338,7 @@ + 'hawq_master_directory': 'HAWQ Master directory', + 'hawq_segment_directory': 'HAWQ Segment directory' + } +- for property_name, display_name in directories.iteritems(): ++ for property_name, display_name in list(directories.items()): + self.checkForMultipleDirs(properties, validationItems, property_name, display_name) + + # 3. Check YARN RM address properties +@@ -346,22 +346,22 @@ + servicesList = [service["StackServices"]["service_name"] for service in services["services"]] + if YARN in servicesList and "yarn-site" in configurations: + yarn_site = self.getSiteProperties(configurations, "yarn-site") +- for hs_prop, ys_prop in self.getHAWQYARNPropertyMapping().items(): ++ for hs_prop, ys_prop in list(self.getHAWQYARNPropertyMapping().items()): + if hs_prop in hawq_site and ys_prop in yarn_site and hawq_site[hs_prop] != yarn_site[ys_prop]: +- message = "Expected value: {0} (this property should have the same value as the property {1} in yarn-site)".format(yarn_site[ys_prop], ys_prop) ++ message = "Expected value: {} (this property should have the same value as the property {} in yarn-site)".format(yarn_site[ys_prop], ys_prop) + validationItems.append({"config-name": hs_prop, "item": self.getWarnItem(message)}) + + # 4. Check HAWQ Resource Manager type + HAWQ_GLOBAL_RM_TYPE = "hawq_global_rm_type" + if YARN not in servicesList and HAWQ_GLOBAL_RM_TYPE in hawq_site and hawq_site[HAWQ_GLOBAL_RM_TYPE].upper() == YARN: +- message = "{0} must be set to none if YARN service is not installed".format(HAWQ_GLOBAL_RM_TYPE) ++ message = "{} must be set to none if YARN service is not installed".format(HAWQ_GLOBAL_RM_TYPE) + validationItems.append({"config-name": HAWQ_GLOBAL_RM_TYPE, "item": self.getErrorItem(message)}) + + # 5. Check query limits + if ("default_hash_table_bucket_number" in hawq_site and + "hawq_rm_nvseg_perquery_limit" in hawq_site and + int(hawq_site["default_hash_table_bucket_number"]) > int(hawq_site["hawq_rm_nvseg_perquery_limit"])): +- message = "Default buckets for Hash Distributed tables parameter value should not be greater than the value of Virtual Segments Limit per Query (Total) parameter, currently set to {0}.".format(hawq_site["hawq_rm_nvseg_perquery_limit"]) ++ message = "Default buckets for Hash Distributed tables parameter value should not be greater than the value of Virtual Segments Limit per Query (Total) parameter, currently set to {}.".format(hawq_site["hawq_rm_nvseg_perquery_limit"]) + validationItems.append({"config-name": "default_hash_table_bucket_number", "item": self.getErrorItem(message)}) + + if "hawq_global_rm_type" in hawq_site and "hawq_rm_memory_limit_perseg" in hawq_site: +@@ -401,7 +401,7 @@ + def validateHDFSSiteConfigurations(self, properties, recommendedDefaults, configurations, services, hosts): + hdfs_site = properties + validationItems = [] +- for property, desired_value in self.getHDFSSiteDesiredValues(self.isSecurityEnabled(services)).iteritems(): ++ for property, desired_value in list(self.getHDFSSiteDesiredValues(self.isSecurityEnabled(services)).items()): + if property not in hdfs_site or hdfs_site[property] != desired_value: + message = "HAWQ requires this property to be set to the recommended value of " + desired_value + item = self.getErrorItem(message) if property == "dfs.allow.truncate" else self.getWarnItem(message) +@@ -411,7 +411,7 @@ + def validateCORESiteConfigurations(self, properties, recommendedDefaults, configurations, services, hosts): + core_site = properties + validationItems = [] +- for property, desired_value in self.getCORESiteDesiredValues().iteritems(): ++ for property, desired_value in list(self.getCORESiteDesiredValues().items()): + if property not in core_site or core_site[property] != desired_value: + message = "HAWQ requires this property to be set to the recommended value of " + desired_value + validationItems.append({"config-name": property, "item": self.getWarnItem(message)}) +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/functions.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/functions.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/functions.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/functions.py 2022-07-11 00:52:34.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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,8 +31,8 @@ + @param xmn_percent: float (e.g 0.2) + @param xmn_max: integer (e.g 512) + """ +- heapsize = int(re.search('\d+',heapsize_str).group(0)) +- heapsize_unit = re.search('\D+',heapsize_str).group(0) ++ heapsize = int(re.search(r'\d+',heapsize_str).group(0)) ++ heapsize_unit = re.search(r'\D+',heapsize_str).group(0) + xmn_val = int(math.floor(heapsize*xmn_percent)) + xmn_val -= xmn_val % 8 + +@@ -40,8 +40,8 @@ + return str(result_xmn_val) + heapsize_unit + + def ensure_unit_for_memory(memory_size): +- memory_size_values = re.findall('\d+', str(memory_size)) +- memory_size_unit = re.findall('\D+', str(memory_size)) ++ memory_size_values = re.findall(r'\d+', str(memory_size)) ++ memory_size_unit = re.findall(r'\D+', str(memory_size)) + + if len(memory_size_values) > 0: + unit = 'm' +@@ -49,6 +49,6 @@ + unit = memory_size_unit[0] + if unit not in ['b', 'k', 'm', 'g', 't', 'p']: + raise Exception("Memory size unit error. %s - wrong unit" % unit) +- return "%s%s" % (memory_size_values[0], unit) ++ return "{}{}".format(memory_size_values[0], unit) + else: + raise Exception('Memory size can not be calculated') +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/hbase_client.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/hbase_client.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/hbase_client.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/hbase_client.py 2022-07-11 00:52:34.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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,20 +23,20 @@ + from resource_management.libraries.functions import stack_select + from resource_management.libraries.functions.constants import StackFeature + from resource_management.libraries.functions.stack_features import check_stack_feature +-from hbase import hbase ++from .hbase import hbase + from ambari_commons import OSCheck, OSConst + from ambari_commons.os_family_impl import OsFamilyImpl + from resource_management.core.exceptions import ClientComponentHasNoStatus + + class HbaseClient(Script): + def install(self, env): +- import params ++ from . import params + env.set_params(params) + self.install_packages(env) + self.configure(env) + + def configure(self, env): +- import params ++ from . import params + env.set_params(params) + hbase(name='client') + +@@ -52,7 +52,7 @@ + @OsFamilyImpl(os_family=OsFamilyImpl.DEFAULT) + class HbaseClientDefault(HbaseClient): + def pre_upgrade_restart(self, env, upgrade_type=None): +- import params ++ from . import params + env.set_params(params) + + if params.version and check_stack_feature(StackFeature.ROLLING_UPGRADE, params.version): +@@ -60,8 +60,8 @@ + 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))) + + if __name__ == "__main__": + HbaseClient().execute() +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/hbase_decommission.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/hbase_decommission.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/hbase_decommission.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/hbase_decommission.py 2022-07-11 00:52:34.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + + @OsFamilyFuncImpl(os_family=OSConst.WINSRV_FAMILY) + def hbase_decommission(env): +- import params ++ from . import params + + env.set_params(params) + File(params.region_drainer, content=StaticFile("draining_servers.rb"), owner=params.hbase_user, mode="f") +@@ -45,14 +45,14 @@ + + @OsFamilyFuncImpl(os_family=OsFamilyImpl.DEFAULT) + def hbase_decommission(env): +- import params ++ from . import params + + env.set_params(params) + kinit_cmd = params.kinit_cmd_master + + File(params.region_drainer, + content=StaticFile("draining_servers.rb"), +- mode=0755 ++ mode=0o755 + ) + + if params.hbase_excluded_hosts and params.hbase_excluded_hosts.split(","): +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/hbase_master.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/hbase_master.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/hbase_master.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/hbase_master.py 2022-07-11 00:52:34.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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,28 +28,28 @@ + from resource_management.libraries.functions.security_commons import build_expectations, \ + cached_kinit_executor, get_params_from_filesystem, validate_security_config_properties, \ + FILE_TYPE_XML +-from hbase import hbase +-from hbase_service import hbase_service +-from hbase_decommission import hbase_decommission +-import upgrade +-from setup_ranger_hbase import setup_ranger_hbase ++from .hbase import hbase ++from .hbase_service import hbase_service ++from .hbase_decommission import hbase_decommission ++from . import upgrade ++from .setup_ranger_hbase import setup_ranger_hbase + from ambari_commons import OSCheck, OSConst + from ambari_commons.os_family_impl import OsFamilyImpl + + + class HbaseMaster(Script): + def configure(self, env): +- import params ++ from . import params + env.set_params(params) + hbase(name='master') + + def install(self, env): +- import params ++ from . import params + env.set_params(params) + self.install_packages(env) + + def decommission(self, env): +- import params ++ from . import params + env.set_params(params) + hbase_decommission(env) + +@@ -57,34 +57,34 @@ + @OsFamilyImpl(os_family=OSConst.WINSRV_FAMILY) + class HbaseMasterWindows(HbaseMaster): + def start(self, env): +- import status_params ++ from . import status_params + self.configure(env) + Service(status_params.hbase_master_win_service_name, action="start") + + def stop(self, env): +- import status_params ++ from . import status_params + env.set_params(status_params) + Service(status_params.hbase_master_win_service_name, action="stop") + + def status(self, env): +- import status_params ++ from . import status_params + env.set_params(status_params) + check_windows_service_status(status_params.hbase_master_win_service_name) + + def stop_replication(self, env): +- import params ++ from . import params + env.set_params(params) + File(params.hbase_replication, content=StaticFile("hbase_replication.rb"), owner=params.hbase_user, mode="f") +- remove_replication_values = "remove {0}".format(params.hbase_replication_peers) ++ remove_replication_values = "remove {}".format(params.hbase_replication_peers) + replication_cmd = format( + "cmd /c {hbase_executable} org.jruby.Main {hbase_replication} " + remove_replication_values) + Execute(replication_cmd, user=params.hbase_user, logoutput=True) + + def update_replication(self, env): +- import params ++ from . import params + env.set_params(params) + File(params.hbase_replication, content=StaticFile("hbase_replication.rb"), owner=params.hbase_user, mode="f") +- update_replication_values = "update {0} {1}".format(params.hbase_replication_peers, ++ update_replication_values = "update {} {}".format(params.hbase_replication_peers, + params.hbase_replication_cluster_keys) + update_replication_cmd = format( + "cmd /c {hbase_executable} org.jruby.Main {hbase_replication} " + update_replication_values) +@@ -94,43 +94,43 @@ + @OsFamilyImpl(os_family=OsFamilyImpl.DEFAULT) + class HbaseMasterDefault(HbaseMaster): + def pre_upgrade_restart(self, env, upgrade_type=None): +- import params ++ from . import params + env.set_params(params) + upgrade.prestart(env) + + def start(self, env, upgrade_type=None): +- import params ++ from . import params + env.set_params(params) + self.configure(env) # for security + setup_ranger_hbase(upgrade_type=upgrade_type, service_name="hbase-master") + hbase_service('master', action = 'start') + + def stop(self, env, upgrade_type=None): +- import params ++ from . import params + env.set_params(params) + hbase_service('master', action = 'stop') + + def status(self, env): +- import status_params ++ from . import status_params + env.set_params(status_params) + + check_process_status(status_params.hbase_master_pid_file) + + def stop_replication(self, env, upgrade_type=None): +- import params ++ from . import params + env.set_params(params) +- File(params.hbase_replication, content=StaticFile("hbase_replication.rb"), owner=params.hbase_user, mode=0755) +- remove_replication_values = "remove {0}".format(params.hbase_replication_peers) ++ File(params.hbase_replication, content=StaticFile("hbase_replication.rb"), owner=params.hbase_user, mode=0o755) ++ remove_replication_values = "remove {}".format(params.hbase_replication_peers) + replication_cmd = format( + "{kinit_cmd} {hbase_cmd} --config {hbase_conf_dir} {master_security_config} org.jruby.Main {hbase_replication} " + + remove_replication_values) + Execute(replication_cmd, user=params.hbase_user, logoutput=True) + + def update_replication(self, env, upgrade_type=None): +- import params ++ from . import params + env.set_params(params) +- File(params.hbase_replication, content=StaticFile("hbase_replication.rb"), owner=params.hbase_user, mode=0755) +- update_replication_values = "update {0} {1}".format(params.hbase_replication_peers, ++ File(params.hbase_replication, content=StaticFile("hbase_replication.rb"), owner=params.hbase_user, mode=0o755) ++ update_replication_values = "update {} {}".format(params.hbase_replication_peers, + params.hbase_replication_cluster_keys) + update_replication_cmd = format( + "{kinit_cmd} {hbase_cmd} --config {hbase_conf_dir} {master_security_config} org.jruby.Main {hbase_replication} " +@@ -138,15 +138,15 @@ + Execute(update_replication_cmd, user=params.hbase_user, logoutput=True) + + def get_log_folder(self): +- import params ++ from . import params + return params.log_dir + + def get_user(self): +- import params ++ from . import params + return params.hbase_user + + def get_pid_files(self): +- import status_params ++ from . import status_params + return [status_params.hbase_master_pid_file] + + if __name__ == "__main__": +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/hbase.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/hbase.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/hbase.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/hbase.py 2022-07-11 00:52:34.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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. + + """ +-from urlparse import urlparse ++from urllib.parse import urlparse + + import os + +@@ -40,14 +40,14 @@ + + @OsFamilyFuncImpl(os_family=OSConst.WINSRV_FAMILY) + def hbase(name=None): +- import params ++ from . import params + XmlConfig("hbase-site.xml", + conf_dir = params.hbase_conf_dir, + configurations = params.config['configurations']['hbase-site'], + 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, +@@ -58,13 +58,13 @@ + # name is 'master' or 'regionserver' or 'queryserver' or 'client' + @OsFamilyFuncImpl(os_family=OsFamilyImpl.DEFAULT) + def hbase(name=None): +- import params ++ from . import params + + # ensure that matching LZO libraries are installed for HBase + lzo_utils.install_lzo_if_needed() + + Directory( params.etc_prefix_dir, +- mode=0755 ++ mode=0o755 + ) + + Directory( params.hbase_conf_dir, +@@ -75,7 +75,7 @@ + + Directory(params.java_io_tmpdir, + create_parents = True, +- mode=0777 ++ mode=0o777 + ) + + # If a file location is specified in ioengine parameter, +@@ -90,7 +90,7 @@ + owner = params.hbase_user, + group = params.user_group, + create_parents = True, +- mode = 0755 ++ mode = 0o755 + ) + + parent_dir = os.path.dirname(params.tmp_dir) +@@ -167,7 +167,7 @@ + File(os.path.join(params.limits_conf_dir, 'hbase.conf'), + owner='root', + group='root', +- mode=0644, ++ mode=0o644, + content=Template("hbase.conf.j2") + ) + +@@ -185,26 +185,26 @@ + 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, + ) + + 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 + ) +@@ -219,14 +219,14 @@ + 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") + +@@ -235,7 +235,7 @@ + owner = params.hbase_user, + create_parents = True, + cd_access = "a", +- mode = 0711, ++ mode = 0o711, + ) + + if params.phoenix_enabled: +@@ -244,7 +244,7 @@ + retry_count=params.agent_stack_retry_count) + + def hbase_TemplateConfig(name, tag=None): +- import params ++ from . import params + + TemplateConfig( format("{hbase_conf_dir}/{name}"), + owner = params.hbase_user, +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/hbase_regionserver.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/hbase_regionserver.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/hbase_regionserver.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/hbase_regionserver.py 2022-07-11 00:52:34.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + """ + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file +@@ -33,29 +33,29 @@ + from ambari_commons.constants import UPGRADE_TYPE_ROLLING + from ambari_commons.os_family_impl import OsFamilyImpl + +-from hbase import hbase +-from hbase_service import hbase_service +-import upgrade +-from setup_ranger_hbase import setup_ranger_hbase +-from hbase_decommission import hbase_decommission ++from .hbase import hbase ++from .hbase_service import hbase_service ++from . import upgrade ++from .setup_ranger_hbase import setup_ranger_hbase ++from .hbase_decommission import hbase_decommission + + + class HbaseRegionServer(Script): + def install(self, env): +- import params ++ from . import params + env.set_params(params) + self.install_packages(env) + + def configure(self, env): +- import params ++ from . import params + env.set_params(params) + 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 ++ from . import params + + # Mark Draining ZNode + params.hbase_drain_only = False +@@ -72,7 +72,7 @@ + hbase_decommission(env) + + def graceful_start(self, env, upgrade_type=None): +- import params ++ from . import params + env.set_params(params) + + #Start RegionServer +@@ -95,17 +95,17 @@ + @OsFamilyImpl(os_family=OSConst.WINSRV_FAMILY) + class HbaseRegionServerWindows(HbaseRegionServer): + def start(self, env): +- import status_params ++ from . import status_params + self.configure(env) + Service(status_params.hbase_regionserver_win_service_name, action="start") + + def stop(self, env): +- import status_params ++ from . import status_params + env.set_params(status_params) + Service(status_params.hbase_regionserver_win_service_name, action="stop") + + def status(self, env): +- import status_params ++ from . import status_params + env.set_params(status_params) + check_windows_service_status(status_params.hbase_regionserver_win_service_name) + +@@ -114,17 +114,17 @@ + @OsFamilyImpl(os_family=OsFamilyImpl.DEFAULT) + class HbaseRegionServerDefault(HbaseRegionServer): + def pre_upgrade_restart(self, env, upgrade_type=None): +- import params ++ from . import params + env.set_params(params) + upgrade.prestart(env) + + def post_upgrade_restart(self, env, upgrade_type=None): +- import params ++ from . import params + env.set_params(params) + upgrade.post_regionserver(env) + + def start(self, env, upgrade_type=None): +- import params ++ from . import params + env.set_params(params) + self.configure(env) # for security + setup_ranger_hbase(upgrade_type=upgrade_type, service_name="hbase-regionserver") +@@ -137,7 +137,7 @@ + ) + + def stop(self, env, upgrade_type=None): +- import params ++ from . import params + env.set_params(params) + + if upgrade_type == UPGRADE_TYPE_ROLLING and len(params.rs_hosts) > 5: +@@ -148,21 +148,21 @@ + ) + + def status(self, env): +- import status_params ++ from . import status_params + env.set_params(status_params) + + check_process_status(status_params.regionserver_pid_file) + + def get_log_folder(self): +- import params ++ from . import params + return params.log_dir + + def get_user(self): +- import params ++ from . import params + return params.hbase_user + + def get_pid_files(self): +- import status_params ++ from . import status_params + return [status_params.regionserver_pid_file] + + if __name__ == "__main__": +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/hbase_service.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/hbase_service.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/hbase_service.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/hbase_service.py 2022-07-11 00:52:34.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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,7 +27,7 @@ + name, + action = 'start'): # 'start' or 'stop' or 'status' + +- import params ++ from . import params + + role = name + cmd = format("{daemon_script} --config {hbase_conf_dir}") +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/hbase_upgrade.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/hbase_upgrade.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/hbase_upgrade.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/hbase_upgrade.py 2022-07-11 00:52:34.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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,17 +26,17 @@ + class HbaseMasterUpgrade(Script): + + def take_snapshot(self, env): +- import params ++ from . import params + +- snap_cmd = "echo 'snapshot_all' | {0} shell".format(params.hbase_cmd) ++ snap_cmd = "echo 'snapshot_all' | {} shell".format(params.hbase_cmd) + +- exec_cmd = "{0} {1}".format(params.kinit_cmd, snap_cmd) ++ exec_cmd = "{} {}".format(params.kinit_cmd, snap_cmd) + + Execute(exec_cmd, user=params.hbase_user) + + def restore_snapshot(self, env): +- import params +- print "TODO AMBARI-12698" ++ from . import params ++ print("TODO AMBARI-12698") + + if __name__ == "__main__": + HbaseMasterUpgrade().execute() +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/__init__.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/__init__.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/__init__.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/__init__.py 2022-07-11 00:52:34.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/params_linux.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/params_linux.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/params_linux.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/params_linux.py 2022-07-11 00:52:34.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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,12 +17,12 @@ + limitations under the License. + + """ +-from urlparse import urlparse ++from urllib.parse import urlparse + +-import status_params ++from . import status_params + import ambari_simplejson as json # simplejson is much faster comparing to Python 2.6 json module and has the same functions set. + +-from functions import calc_xmn_from_xms, ensure_unit_for_memory ++from .functions import calc_xmn_from_xms, ensure_unit_for_memory + + from ambari_commons.constants import AMBARI_SUDO_BINARY + from ambari_commons.os_check import OSCheck +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/params.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/params.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/params.py 2022-07-11 00:52:34.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + from resource_management.libraries.functions.default import default + + if OSCheck.is_windows_family(): +- from params_windows import * ++ from .params_windows import * + else: +- from params_linux import * ++ from .params_linux import * + + retryAble = default("/commandParams/command_retry_enabled", False) +\ 文件尾没有换行符 +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/params_windows.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/params_windows.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/params_windows.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/params_windows.py 2022-07-11 00:52:34.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 status_params ++from . import status_params + from resource_management.libraries.script.script import Script + + # server configurations +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/phoenix_queryserver.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/phoenix_queryserver.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/phoenix_queryserver.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/phoenix_queryserver.py 2022-07-11 00:52:34.000000000 +0800 +@@ -21,8 +21,8 @@ + from resource_management.libraries.functions import StackFeature + from resource_management.libraries.functions.stack_features import check_stack_feature + from resource_management.libraries.script import Script +-from phoenix_service import phoenix_service +-from hbase import hbase ++from .phoenix_service import phoenix_service ++from .hbase import hbase + from resource_management.core.exceptions import Fail + from resource_management.libraries.functions.decorator import retry + +@@ -30,35 +30,35 @@ + class PhoenixQueryServer(Script): + + def install(self, env): +- import params ++ from . import params + env.set_params(params) + self.install_packages(env) + + + def configure(self, env): +- import params ++ from . import params + env.set_params(params) + hbase(name='queryserver') + + + def start(self, env, upgrade_type=None): +- import params ++ from . import params + env.set_params(params) + self.configure(env) + phoenix_service('start') + + @retry(times=3, sleep_time=5, err_class=Fail) # XXX PID file is not always created in time. Should be idempotent. + def post_start(self, env=None): +- return super(PhoenixQueryServer, self).post_start(env) ++ return super().post_start(env) + + def stop(self, env, upgrade_type=None): +- import params ++ from . import params + env.set_params(params) + phoenix_service('stop') + + + def pre_upgrade_restart(self, env, upgrade_type=None): +- import params ++ from . import params + env.set_params(params) + + if params.stack_version_formatted and check_stack_feature(StackFeature.PHOENIX, params.stack_version_formatted): +@@ -66,20 +66,20 @@ + + + def status(self, env): +- import status_params ++ from . import status_params + env.set_params(status_params) + phoenix_service('status') + + def get_log_folder(self): +- import params ++ from . import params + return params.log_dir + + def get_user(self): +- import params ++ from . import params + return params.hbase_user + + def get_pid_files(self): +- import status_params ++ from . import status_params + return [status_params.phoenix_pid_file] + + if __name__ == "__main__": +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/phoenix_service.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/phoenix_service.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/phoenix_service.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/phoenix_service.py 2022-07-11 00:52:34.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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,7 +27,7 @@ + # Note: Phoenix Query Server is only applicable to phoenix version stacks and above. + def phoenix_service(action = 'start'): # 'start', 'stop', 'status' + # Note: params should already be imported before calling phoenix_service() +- import status_params ++ from . import status_params + pid_file = status_params.phoenix_pid_file + no_op_test = format("ls {pid_file} >/dev/null 2>&1 && ps -p `cat {pid_file}` >/dev/null 2>&1") + +@@ -51,6 +51,6 @@ + except OSError as exc: + # OSError: [Errno 2] No such file or directory + if exc.errno == errno.ENOENT: +- Logger.info("Did not remove '{0}' as it did not exist".format(pid_file)) ++ Logger.info("Did not remove '{}' as it did not exist".format(pid_file)) + else: + raise +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/service_check.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/service_check.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/service_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/service_check.py 2022-07-11 00:52:34.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + from resource_management.core.resources.system import Execute, File + from resource_management.core.source import StaticFile + from resource_management.core.source import Template +-import functions ++from . import functions + from ambari_commons import OSCheck, OSConst + from ambari_commons.os_family_impl import OsFamilyImpl + +@@ -35,7 +35,7 @@ + @OsFamilyImpl(os_family=OSConst.WINSRV_FAMILY) + class HbaseServiceCheckWindows(HbaseServiceCheck): + def service_check(self, env): +- import params ++ from . import params + env.set_params(params) + smoke_cmd = os.path.join(params.stack_root, "Run-SmokeTests.cmd") + service = "HBASE" +@@ -45,7 +45,7 @@ + @OsFamilyImpl(os_family=OsFamilyImpl.DEFAULT) + class HbaseServiceCheckDefault(HbaseServiceCheck): + def service_check(self, env): +- import params ++ from . import params + env.set_params(params) + + output_file = "/apps/hbase/data/ambarismoketest" +@@ -55,16 +55,16 @@ + + 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 @@ + File( hbase_grant_premissions_file, + owner = params.hbase_user, + group = params.user_group, +- mode = 0644, ++ mode = 0o644, + content = Template('hbase_grant_permissions.j2') + ) + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/setup_ranger_hbase.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/setup_ranger_hbase.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/setup_ranger_hbase.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/setup_ranger_hbase.py 2022-07-11 00:52:34.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 resource_management.core.logger import Logger + + def setup_ranger_hbase(upgrade_type=None, service_name="hbase-master"): +- import params ++ from . import params + + if params.enable_ranger_hbase: + +@@ -40,7 +40,7 @@ + action="create_on_execute", + owner=params.hdfs_user, + group=params.hdfs_user, +- mode=0755, ++ mode=0o755, + recursive_chmod=True + ) + params.HdfsResource("/ranger/audit/hbaseMaster", +@@ -48,7 +48,7 @@ + action="create_on_execute", + owner=params.hbase_user, + group=params.hbase_user, +- mode=0700, ++ mode=0o700, + recursive_chmod=True + ) + params.HdfsResource("/ranger/audit/hbaseRegional", +@@ -56,7 +56,7 @@ + action="create_on_execute", + owner=params.hbase_user, + group=params.hbase_user, +- mode=0700, ++ mode=0o700, + recursive_chmod=True + ) + params.HdfsResource(None, action="execute") +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/status_params.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/status_params.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/status_params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/status_params.py 2022-07-11 00:52:34.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/upgrade.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/upgrade.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/upgrade.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/upgrade.py 2022-07-11 00:52:34.000000000 +0800 +@@ -1,5 +1,4 @@ +- +-#!/usr/bin/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,18 +33,18 @@ + + + def prestart(env): +- import params ++ from . import params + + if params.version and check_stack_feature(StackFeature.ROLLING_UPGRADE, params.version): + stack_select.select_packages(params.version) + + def post_regionserver(env): +- import params ++ from . import params + env.set_params(params) + +- check_cmd = "echo 'status \"simple\"' | {0} shell".format(params.hbase_cmd) ++ check_cmd = "echo 'status \"simple\"' | {} shell".format(params.hbase_cmd) + +- exec_cmd = "{0} {1}".format(params.kinit_cmd, check_cmd) ++ exec_cmd = "{} {}".format(params.kinit_cmd, check_cmd) + is_regionserver_registered(exec_cmd, params.hbase_user, params.hostname, re.IGNORECASE) + + +@@ -94,12 +93,12 @@ + ip_address = socket.gethostbyname(hostname) + bound_ip_address_to_match = ip_address + ":" + match = re.search(bound_ip_address_to_match, out, regex_search_flags) +- except socket.error: ++ except OSError: + # this is merely a backup, so just log that it failed +- Logger.warning("Unable to lookup the IP address of {0}, reverse DNS lookup may not be working.".format(hostname)) ++ Logger.warning("Unable to lookup the IP address of {}, reverse DNS lookup may not be working.".format(hostname)) + pass + + # failed with both a hostname and an IP address, so raise the Fail and let the function auto retry + if not match: + raise Fail( +- "The RegionServer named {0} has not yet registered with the HBase Master".format(hostname)) ++ "The RegionServer named {} has not yet registered with the HBase Master".format(hostname)) +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/alerts/alert_checkpoint_time.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/alerts/alert_checkpoint_time.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/alerts/alert_checkpoint_time.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/alerts/alert_checkpoint_time.py 2022-07-11 00:52:32.000000000 +0800 +@@ -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 +@@ -100,7 +100,7 @@ + + # hdfs-site is required + if not HDFS_SITE_KEY in configurations: +- return (RESULT_STATE_UNKNOWN, ['{0} is a required parameter for the script'.format(HDFS_SITE_KEY)]) ++ return (RESULT_STATE_UNKNOWN, ['{} is a required parameter for the script'.format(HDFS_SITE_KEY)]) + + if NN_HTTP_POLICY_KEY in configurations: + http_policy = configurations[NN_HTTP_POLICY_KEY] +@@ -165,12 +165,12 @@ + uri = nn_address + break + if not uri: +- return (RESULT_STATE_SKIPPED, ['NameNode on host {0} not found (namenode adresses = {1})'.format(host_name, ', '.join(nn_addresses))]) ++ return (RESULT_STATE_SKIPPED, ['NameNode on host {} not found (namenode adresses = {})'.format(host_name, ', '.join(nn_addresses))]) + + current_time = int(round(time.time() * 1000)) + +- last_checkpoint_time_qry = "{0}://{1}/jmx?qry=Hadoop:service=NameNode,name=FSNamesystem".format(scheme,uri) +- journal_transaction_info_qry = "{0}://{1}/jmx?qry=Hadoop:service=NameNode,name=NameNodeInfo".format(scheme,uri) ++ last_checkpoint_time_qry = "{}://{}/jmx?qry=Hadoop:service=NameNode,name=FSNamesystem".format(scheme,uri) ++ journal_transaction_info_qry = "{}://{}/jmx?qry=Hadoop:service=NameNode,name=NameNodeInfo".format(scheme,uri) + + # start out assuming an OK status + label = None +@@ -221,10 +221,10 @@ + # Either too many uncommitted transactions or missed check-pointing for + # long time decided by the thresholds + if is_checkpoint_txn_critical or (float(delta) / int(checkpoint_period)*100 >= int(percent_critical)): +- logger.debug('Raising critical alert: transaction_difference = {0}, checkpoint_tx = {1}'.format(transaction_difference, checkpoint_tx)) ++ logger.debug('Raising critical alert: transaction_difference = {}, checkpoint_tx = {}'.format(transaction_difference, checkpoint_tx)) + result_code = 'CRITICAL' + elif is_checkpoint_txn_warning or (float(delta) / int(checkpoint_period)*100 >= int(percent_warning)): +- logger.debug('Raising warning alert: transaction_difference = {0}, checkpoint_tx = {1}'.format(transaction_difference, checkpoint_tx)) ++ logger.debug('Raising warning alert: transaction_difference = {}, checkpoint_tx = {}'.format(transaction_difference, checkpoint_tx)) + result_code = 'WARNING' + + except: +@@ -243,7 +243,7 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/alerts/alert_datanode_unmounted_data_dir.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/alerts/alert_datanode_unmounted_data_dir.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/alerts/alert_datanode_unmounted_data_dir.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/alerts/alert_datanode_unmounted_data_dir.py 2022-07-11 00:52:32.000000000 +0800 +@@ -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 +@@ -67,18 +67,18 @@ + + # Check required properties + if DFS_DATA_DIR not in configurations: +- return (RESULT_STATE_UNKNOWN, ['{0} is a required parameter for the script'.format(DFS_DATA_DIR)]) ++ return (RESULT_STATE_UNKNOWN, ['{} is a required parameter for the script'.format(DFS_DATA_DIR)]) + + dfs_data_dir = configurations[DFS_DATA_DIR] + + if dfs_data_dir is None: +- return (RESULT_STATE_UNKNOWN, ['{0} is a required parameter for the script and the value is null'.format(DFS_DATA_DIR)]) ++ return (RESULT_STATE_UNKNOWN, ['{} is a required parameter for the script and the value is null'.format(DFS_DATA_DIR)]) + + # This follows symlinks and will return False for a broken link (even in the middle of the linked list) + data_dir_mount_file_exists = True + if not os.path.exists(DATA_DIR_MOUNT_FILE): + data_dir_mount_file_exists = False +- warnings.append("{0} was not found.".format(DATA_DIR_MOUNT_FILE)) ++ warnings.append("{} was not found.".format(DATA_DIR_MOUNT_FILE)) + + normalized_data_dirs = set() # data dirs that have been normalized + data_dirs_not_exist = set() # data dirs that do not exist +@@ -101,7 +101,7 @@ + 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) + +@@ -131,10 +131,10 @@ + data_dirs_on_root = sorted(data_dirs_on_root) + + if data_dirs_not_exist: +- errors.append("The following data dir(s) were not found: {0}\n".format("\n".join(data_dirs_not_exist))) ++ errors.append("The following data dir(s) were not found: {}\n".format("\n".join(data_dirs_not_exist))) + + if data_dirs_unknown: +- errors.append("Cannot find the mount point for the following data dir(s):\n{0}".format("\n".join(data_dirs_unknown))) ++ errors.append("Cannot find the mount point for the following data dir(s):\n{}".format("\n".join(data_dirs_unknown))) + + if data_dir_mount_file_exists: + # This dictionary contains the expected values of +@@ -149,13 +149,13 @@ + data_dirs_unmounted.append(data_dir) + + if len(data_dirs_unmounted) > 0: +- errors.append("Detected data dir(s) that became unmounted and are now writing to the root partition:\n{0}".format("\n".join(data_dirs_unmounted))) ++ errors.append("Detected data dir(s) that became unmounted and are now writing to the root partition:\n{}".format("\n".join(data_dirs_unmounted))) + else: + # Couldn't make guarantees about the expected value of mount points, so rely on this strategy that is likely to work. + # It will report false positives (aka false alarms) if the user actually intended to have + # 1+ data dirs on a mount and 1+ data dirs on the root partition. + if len(data_dirs_on_mount) >= 1 and len(data_dirs_on_root) >= 1: +- errors.append("Detected at least one data dir on a mount point, but these are writing to the root partition:\n{0}".format("\n".join(data_dirs_on_root))) ++ errors.append("Detected at least one data dir on a mount point, but these are writing to the root partition:\n{}".format("\n".join(data_dirs_on_root))) + + # Determine the status based on warnings and errors. + if len(errors) == 0: +@@ -168,7 +168,7 @@ + messages += warnings + + if len(normalized_data_dirs) > 0: +- messages.append("The following data dir(s) are valid:\n{0}".format("\n".join(normalized_data_dirs))) ++ messages.append("The following data dir(s) are valid:\n{}".format("\n".join(normalized_data_dirs))) + else: + messages.append("There are no data directories to analyze.") + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/alerts/alert_ha_namenode_health.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/alerts/alert_ha_namenode_health.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/alerts/alert_ha_namenode_health.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/alerts/alert_ha_namenode_health.py 2022-07-11 00:52:32.000000000 +0800 +@@ -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 + +@@ -84,7 +84,7 @@ + + # hdfs-site is required + if not HDFS_SITE_KEY in configurations: +- return (RESULT_STATE_UNKNOWN, ['{0} is a required parameter for the script'.format(HDFS_SITE_KEY)]) ++ return (RESULT_STATE_UNKNOWN, ['{} is a required parameter for the script'.format(HDFS_SITE_KEY)]) + + if SMOKEUSER_KEY in configurations: + smokeuser = configurations[SMOKEUSER_KEY] +@@ -126,7 +126,7 @@ + # look for dfs.ha.namenodes.foo + nn_unique_ids_key = 'dfs.ha.namenodes.' + name_service + if not nn_unique_ids_key in hdfs_site: +- return (RESULT_STATE_UNKNOWN, ['Unable to find unique namenode alias key {0}'.format(nn_unique_ids_key)]) ++ return (RESULT_STATE_UNKNOWN, ['Unable to find unique namenode alias key {}'.format(nn_unique_ids_key)]) + + namenode_http_fragment = NAMENODE_HTTP_FRAGMENT + jmx_uri_fragment = "http://{0}/jmx?qry=Hadoop:service=NameNode,name=*" +@@ -188,7 +188,7 @@ + # there's only one scenario here; there is exactly 1 active and 1 standby + is_topology_healthy = len(active_namenodes) == 1 and len(standby_namenodes) == 1 + +- result_label = 'Active{0}, Standby{1}, Unknown{2}'.format(str(active_namenodes), ++ result_label = 'Active{}, Standby{}, Unknown{}'.format(str(active_namenodes), + str(standby_namenodes), str(unknown_namenodes)) + + if is_topology_healthy: +@@ -203,7 +203,7 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/alerts/alert_metrics_deviation.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/alerts/alert_metrics_deviation.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/alerts/alert_metrics_deviation.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/alerts/alert_metrics_deviation.py 2022-07-11 00:52:32.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + """ + Licensed to the Apache Software Foundation (ASF) under one +@@ -17,13 +17,13 @@ + 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 urllib.request, urllib.parse, urllib.error + import time +-import urllib2 ++import urllib.request, urllib.error, urllib.parse + import os + import ambari_commons.network as network + +@@ -170,7 +170,7 @@ + + # hdfs-site is required + if not HDFS_SITE_KEY in configurations: +- return (RESULT_STATE_UNKNOWN, ['{0} is a required parameter for the script'.format(HDFS_SITE_KEY)]) ++ return (RESULT_STATE_UNKNOWN, ['{} is a required parameter for the script'.format(HDFS_SITE_KEY)]) + + if METRICS_COLLECTOR_VIP_HOST_KEY in configurations and METRICS_COLLECTOR_VIP_PORT_KEY in configurations: + collector_host = configurations[METRICS_COLLECTOR_VIP_HOST_KEY].split(',')[0] +@@ -178,20 +178,20 @@ + else: + # ams-site/timeline.metrics.service.webapp.address is required + if not METRICS_COLLECTOR_WEBAPP_ADDRESS_KEY in configurations: +- return (RESULT_STATE_UNKNOWN, ['{0} is a required parameter for the script'.format(METRICS_COLLECTOR_WEBAPP_ADDRESS_KEY)]) ++ return (RESULT_STATE_UNKNOWN, ['{} is a required parameter for the script'.format(METRICS_COLLECTOR_WEBAPP_ADDRESS_KEY)]) + else: + collector_webapp_address = configurations[METRICS_COLLECTOR_WEBAPP_ADDRESS_KEY].split(":") + if valid_collector_webapp_address(collector_webapp_address): + collector_host = select_metric_collector_for_sink(app_id.lower()) + collector_port = int(collector_webapp_address[1]) + else: +- return (RESULT_STATE_UNKNOWN, ['{0} value should be set as "fqdn_hostname:port", but set to {1}'.format( ++ return (RESULT_STATE_UNKNOWN, ['{} value should be set as "fqdn_hostname:port", but set to {}'.format( + METRICS_COLLECTOR_WEBAPP_ADDRESS_KEY, configurations[METRICS_COLLECTOR_WEBAPP_ADDRESS_KEY])]) + + namenode_service_rpc_address = None + # hdfs-site is required + if not HDFS_SITE_KEY in configurations: +- return (RESULT_STATE_UNKNOWN, ['{0} is a required parameter for the script'.format(HDFS_SITE_KEY)]) ++ return (RESULT_STATE_UNKNOWN, ['{} is a required parameter for the script'.format(HDFS_SITE_KEY)]) + + hdfs_site = configurations[HDFS_SITE_KEY] + +@@ -202,7 +202,7 @@ + if NAMESERVICE_KEY in configurations and app_id.lower() == 'namenode': + # hdfs-site is required + if not HDFS_SITE_KEY in configurations: +- return (RESULT_STATE_UNKNOWN, ['{0} is a required parameter for the script'.format(HDFS_SITE_KEY)]) ++ return (RESULT_STATE_UNKNOWN, ['{} is a required parameter for the script'.format(HDFS_SITE_KEY)]) + + if SMOKEUSER_KEY in configurations: + smokeuser = configurations[SMOKEUSER_KEY] +@@ -239,7 +239,7 @@ + # look for dfs.ha.namenodes.foo + nn_unique_ids_key = 'dfs.ha.namenodes.' + name_service + if not nn_unique_ids_key in hdfs_site: +- return (RESULT_STATE_UNKNOWN, ['Unable to find unique NameNode alias key {0}'.format(nn_unique_ids_key)]) ++ return (RESULT_STATE_UNKNOWN, ['Unable to find unique NameNode alias key {}'.format(nn_unique_ids_key)]) + + namenode_http_fragment = 'dfs.namenode.http-address.{0}.{1}' + jmx_uri_fragment = "http://{0}/jmx?qry=Hadoop:service=NameNode,name=*" +@@ -283,7 +283,7 @@ + active_namenodes.append(namenode) + + # Only check active NN +- nn_service_rpc_address_key = 'dfs.namenode.servicerpc-address.{0}.{1}'.format(name_service, nn_unique_id) ++ nn_service_rpc_address_key = 'dfs.namenode.servicerpc-address.{}.{}'.format(name_service, nn_unique_id) + if nn_service_rpc_address_key in hdfs_site: + namenode_service_rpc_address = hdfs_site[nn_service_rpc_address_key] + pass +@@ -311,7 +311,7 @@ + "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 +332,7 @@ + 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."]) + +@@ -345,12 +345,12 @@ + # will get large standard deviation for multiple hosts, + # if host1 reports small local values, but host2 reports large local values + for metrics_data in data_json["metrics"]: +- metrics += metrics_data["metrics"].values() ++ metrics += list(metrics_data["metrics"].values()) + pass + + if not metrics or len(metrics) < 2: + number_of_data_points = len(metrics) if metrics else 0 +- return (RESULT_STATE_SKIPPED, ["There are not enough data points to calculate the standard deviation ({0} sampled)".format( ++ return (RESULT_STATE_SKIPPED, ["There are not enough data points to calculate the standard deviation ({} sampled)".format( + number_of_data_points)]) + + minimum_value_multiplier = 1 +@@ -363,7 +363,7 @@ + # Filter out points below min threshold + metrics = [metric for metric in metrics if metric > (minimum_value_threshold * minimum_value_multiplier)] + if len(metrics) < 2: +- return (RESULT_STATE_OK, ['There were no data points above the minimum threshold of {0} seconds'.format(minimum_value_threshold)]) ++ return (RESULT_STATE_OK, ['There were no data points above the minimum threshold of {} seconds'.format(minimum_value_threshold)]) + + mean_value = mean(metrics) + stddev = sample_standard_deviation(metrics) +@@ -377,11 +377,11 @@ + # log the AMS request + if logger.isEnabledFor(logging.DEBUG): + logger.debug(""" +- AMS request parameters - {0} +- AMS response - {1} +- Mean - {2} +- Standard deviation - {3} +- Percentage standard deviation - {4} ++ AMS request parameters - {} ++ AMS response - {} ++ Mean - {} ++ Standard deviation - {} ++ Percentage standard deviation - {} + """.format(encoded_get_metrics_parameters, data_json, mean_value, stddev, deviation_percent)) + + mean_value_localized = locale.format("%.0f", mean_value, grouping=True) +@@ -442,7 +442,7 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/alerts/alert_upgrade_finalized.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/alerts/alert_upgrade_finalized.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/alerts/alert_upgrade_finalized.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/alerts/alert_upgrade_finalized.py 2022-07-11 00:52:32.000000000 +0800 +@@ -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 +@@ -75,7 +75,7 @@ + + # hdfs-site is required + if not HDFS_SITE_KEY in configurations: +- return 'SKIPPED', ['{0} is a required parameter for the script'.format(HDFS_SITE_KEY)] ++ return 'SKIPPED', ['{} is a required parameter for the script'.format(HDFS_SITE_KEY)] + + if NN_HTTP_POLICY_KEY in configurations: + http_policy = configurations[NN_HTTP_POLICY_KEY] +@@ -114,9 +114,9 @@ + break + if not uri: + return 'SKIPPED', [ +- 'NameNode on host {0} not found (namenode adresses = {1})'.format(host_name, ', '.join(nn_addresses))] ++ 'NameNode on host {} not found (namenode adresses = {})'.format(host_name, ', '.join(nn_addresses))] + +- upgrade_finalized_qry = "{0}://{1}/jmx?qry=Hadoop:service=NameNode,name=NameNodeInfo".format(scheme, uri) ++ upgrade_finalized_qry = "{}://{}/jmx?qry=Hadoop:service=NameNode,name=NameNodeInfo".format(scheme, uri) + + # start out assuming an OK status + label = None +@@ -166,7 +166,7 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/files/checkWebUI.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/files/checkWebUI.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/files/checkWebUI.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/files/checkWebUI.py 2022-07-11 00:52:32.000000000 +0800 +@@ -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 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 @@ + 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() + # +@@ -79,7 +79,7 @@ + httpCode = make_connection(host, port, https.lower() == "true", protocol) + + 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 ++ 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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/balancer-emulator/hdfs-command.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/balancer-emulator/hdfs-command.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/balancer-emulator/hdfs-command.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/balancer-emulator/hdfs-command.py 2022-07-11 00:52:32.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/datanode.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/datanode.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/datanode.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/datanode.py 2022-07-11 00:52:32.000000000 +0800 +@@ -16,11 +16,11 @@ + limitations under the License. + + """ +-import datanode_upgrade ++from . import datanode_upgrade + + from ambari_commons.constants import UPGRADE_TYPE_ROLLING + +-from hdfs_datanode import datanode ++from .hdfs_datanode import datanode + from resource_management import Script, Fail, shell, Logger + from resource_management.libraries.script.script import Script + from resource_management.libraries.functions import stack_select +@@ -31,11 +31,11 @@ + from resource_management.libraries.functions.security_commons import build_expectations, \ + cached_kinit_executor, get_params_from_filesystem, validate_security_config_properties, FILE_TYPE_XML + from resource_management.core.logger import Logger +-from hdfs import hdfs, reconfig ++from .hdfs import hdfs, reconfig + from ambari_commons.os_family_impl import OsFamilyImpl + from ambari_commons import OSConst +-from utils import get_hdfs_binary +-from utils import get_dfsadmin_base_command ++from .utils import get_hdfs_binary ++from .utils import get_dfsadmin_base_command + + class DataNode(Script): + +@@ -47,35 +47,35 @@ + + + def install(self, env): +- import params ++ from . import params + env.set_params(params) + self.install_packages(env) + + def configure(self, env): +- import params ++ from . import params + env.set_params(params) + hdfs("datanode") + datanode(action="configure") + + def save_configs(self, env): +- import params ++ from . import params + env.set_params(params) + hdfs("datanode") + + def reload_configs(self, env): +- import params ++ from . import params + env.set_params(params) + Logger.info("RELOAD CONFIGS") + reconfig("datanode", params.dfs_dn_ipc_address) + + def start(self, env, upgrade_type=None): +- import params ++ from . import params + env.set_params(params) + self.configure(env) + datanode(action="start") + + def stop(self, env, upgrade_type=None): +- import params ++ from . import params + env.set_params(params) + # pre-upgrade steps shutdown the datanode, so there's no need to call + +@@ -90,7 +90,7 @@ + self.check_datanode_shutdown(hdfs_binary) + + def status(self, env): +- import status_params ++ from . import status_params + env.set_params(status_params) + datanode(action = "status") + +@@ -111,7 +111,7 @@ + :param hdfs_binary: name/path of the HDFS binary to use + :return: + """ +- import params ++ from . import params + + # override stock retry timeouts since after 30 seconds, the datanode is + # marked as dead and can affect HBase during RU +@@ -137,35 +137,35 @@ + + def pre_upgrade_restart(self, env, upgrade_type=None): + Logger.info("Executing DataNode Stack Upgrade pre-restart") +- import params ++ from . import params + env.set_params(params) + if params.version and check_stack_feature(StackFeature.ROLLING_UPGRADE, params.version): + stack_select.select_packages(params.version) + + def post_upgrade_restart(self, env, upgrade_type=None): + Logger.info("Executing DataNode Stack Upgrade post-restart") +- import params ++ from . import params + env.set_params(params) + hdfs_binary = self.get_hdfs_binary() + # ensure the DataNode has started and rejoined the cluster + datanode_upgrade.post_upgrade_check(hdfs_binary) + + def get_log_folder(self): +- import params ++ from . import params + return params.hdfs_log_dir + + def get_user(self): +- import params ++ from . import params + return params.hdfs_user + + def get_pid_files(self): +- import status_params ++ from . import status_params + return [status_params.datanode_pid_file] + + @OsFamilyImpl(os_family=OSConst.WINSRV_FAMILY) + class DataNodeWindows(DataNode): + def install(self, env): +- import install_params ++ from . import install_params + self.install_packages(env) + + if __name__ == "__main__": +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/datanode_upgrade.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/datanode_upgrade.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/datanode_upgrade.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/datanode_upgrade.py 2022-07-11 00:52:32.000000000 +0800 +@@ -26,7 +26,7 @@ + from resource_management.libraries.functions.decorator import retry + from resource_management.libraries.functions import check_process_status + from resource_management.core import ComponentIsNotRunning +-from utils import get_dfsadmin_base_command ++from .utils import get_dfsadmin_base_command + + + def pre_rolling_upgrade_shutdown(hdfs_binary): +@@ -38,7 +38,7 @@ + :param hdfs_binary: name/path of the HDFS binary to use + :return: Return True if ran ok (even with errors), and False if need to stop the datanode forcefully. + """ +- import params ++ from . import params + + Logger.info('DataNode executing "shutdownDatanode" command in preparation for upgrade...') + if params.security_enabled: +@@ -51,7 +51,7 @@ + if code != 0: + # Due to bug HDFS-7533, DataNode may not always shutdown during stack upgrade, and it is necessary to kill it. + if output is not None and re.search("Shutdown already in progress", output): +- Logger.error("Due to a known issue in DataNode, the command {0} did not work, so will need to shutdown the datanode forcefully.".format(command)) ++ Logger.error("Due to a known issue in DataNode, the command {} did not work, so will need to shutdown the datanode forcefully.".format(command)) + return False + return True + +@@ -63,7 +63,7 @@ + :param hdfs_binary: name/path of the HDFS binary to use + :return: + """ +- import params ++ from . import params + + Logger.info("Checking that the DataNode has rejoined the cluster after upgrade...") + if params.security_enabled: +@@ -74,7 +74,7 @@ + + + def is_datanode_process_running(): +- import params ++ from . import params + try: + check_process_status(params.datanode_pid_file) + return True +@@ -97,7 +97,7 @@ + Logger.info("DataNode process is not running") + raise Fail("DataNode process is not running") + +- import params ++ from . import params + import socket + + try: +@@ -111,10 +111,10 @@ + hostname = params.hostname.lower() + hostname_ip = socket.gethostbyname(params.hostname.lower()) + if hostname in hdfs_output.lower() or hostname_ip in hdfs_output.lower(): +- Logger.info("DataNode {0} reports that it has rejoined the cluster.".format(params.hostname)) ++ Logger.info("DataNode {} reports that it has rejoined the cluster.".format(params.hostname)) + return + else: +- raise Fail("DataNode {0} was not found in the list of live DataNodes".format(params.hostname)) ++ raise Fail("DataNode {} was not found in the list of live DataNodes".format(params.hostname)) + + # return_code is not 0, fail +- raise Fail("Unable to determine if the DataNode has started after upgrade (result code {0})".format(str(return_code))) ++ raise Fail("Unable to determine if the DataNode has started after upgrade (result code {})".format(str(return_code))) +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/hdfs_client.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/hdfs_client.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/hdfs_client.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/hdfs_client.py 2022-07-11 00:52:32.000000000 +0800 +@@ -24,7 +24,7 @@ + from resource_management.libraries.functions.security_commons import build_expectations, \ + cached_kinit_executor, get_params_from_filesystem, validate_security_config_properties, \ + FILE_TYPE_XML +-from hdfs import hdfs ++from .hdfs import hdfs + from ambari_commons.os_family_impl import OsFamilyImpl + from ambari_commons import OSConst + from resource_management.core.exceptions import ClientComponentHasNoStatus +@@ -32,27 +32,27 @@ + class HdfsClient(Script): + + def install(self, env): +- import params ++ from . import params + env.set_params(params) + self.install_packages(env) + self.configure(env) + + def configure(self, env): +- import params ++ from . import params + env.set_params(params) + hdfs() + + def save_configs(self, env): +- import params ++ from . import params + env.set_params(params) + hdfs() + + def start(self, env, upgrade_type=None): +- import params ++ from . import params + env.set_params(params) + + def stop(self, env, upgrade_type=None): +- import params ++ from . import params + env.set_params(params) + + def status(self, env): +@@ -62,7 +62,7 @@ + class HdfsClientDefault(HdfsClient): + + def pre_upgrade_restart(self, env, upgrade_type=None): +- import params ++ from . import params + env.set_params(params) + if params.version and check_stack_feature(StackFeature.ROLLING_UPGRADE, params.version): + stack_select.select_packages(params.version) +@@ -70,7 +70,7 @@ + @OsFamilyImpl(os_family=OSConst.WINSRV_FAMILY) + class HdfsClientWindows(HdfsClient): + def install(self, env): +- import install_params ++ from . import install_params + self.install_packages(env) + self.configure(env) + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/hdfs_datanode.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/hdfs_datanode.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/hdfs_datanode.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/hdfs_datanode.py 2022-07-11 00:52:32.000000000 +0800 +@@ -20,7 +20,7 @@ + from resource_management.core.resources.system import Directory, Execute, File + from resource_management.libraries.functions.check_process_status import check_process_status + from resource_management.libraries.functions.mounted_dirs_helper import handle_mounted_dirs +-from utils import service ++from .utils import service + from ambari_commons.os_family_impl import OsFamilyImpl, OsFamilyFuncImpl + from ambari_commons import OSConst + +@@ -30,7 +30,7 @@ + :param data_dir: The directory to create + :param params: parameters + """ +- import params ++ from . import params + Directory(data_dir, + create_parents = True, + cd_access="a", +@@ -43,10 +43,10 @@ + @OsFamilyFuncImpl(os_family=OsFamilyImpl.DEFAULT) + def datanode(action=None): + if action == "configure": +- import params ++ from . import params + Directory(params.dfs_domain_socket_dir, + create_parents = True, +- mode=0751, ++ mode=0o751, + owner=params.hdfs_user, + group=params.user_group) + +@@ -56,12 +56,12 @@ + 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 + ) + + elif action == "start" or action == "stop": +- import params ++ from . import params + service( + action=action, name="datanode", + user=params.hdfs_user, +@@ -69,7 +69,7 @@ + create_log_dir=True + ) + elif action == "status": +- import status_params ++ from . import status_params + check_process_status(status_params.datanode_pid_file) + + +@@ -78,8 +78,8 @@ + if action == "configure": + pass + elif(action == "start" or action == "stop"): +- import params ++ from . import params + Service(params.datanode_win_service_name, action=action) + elif action == "status": +- import status_params ++ from . import status_params + check_windows_service_status(status_params.datanode_win_service_name) +\ 文件尾没有换行符 +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/hdfs_namenode.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/hdfs_namenode.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/hdfs_namenode.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/hdfs_namenode.py 2022-07-11 00:52:32.000000000 +0800 +@@ -35,8 +35,8 @@ + from resource_management.libraries.functions import Direction + from ambari_commons import OSCheck, OSConst + from ambari_commons.os_family_impl import OsFamilyImpl, OsFamilyFuncImpl +-from utils import get_dfsadmin_base_command +-from utils import set_up_zkfc_security ++from .utils import get_dfsadmin_base_command ++from .utils import set_up_zkfc_security + + if OSCheck.is_windows_family(): + from resource_management.libraries.functions.windows_service_utils import check_windows_service_status +@@ -44,10 +44,10 @@ + from resource_management.core.exceptions import Fail + from resource_management.core.logger import Logger + +-from utils import service, safe_zkfc_op, is_previous_fs_image +-from setup_ranger_hdfs import setup_ranger_hdfs, create_ranger_audit_hdfs_directories ++from .utils import service, safe_zkfc_op, is_previous_fs_image ++from .setup_ranger_hdfs import setup_ranger_hdfs, create_ranger_audit_hdfs_directories + +-import namenode_upgrade ++from . import namenode_upgrade + + def wait_for_safemode_off(hdfs_binary, afterwait_sleep=0, execute_kinit=False, retries=115, sleep_seconds=10): + """ +@@ -55,11 +55,11 @@ + all of the DataNodes, we need for NameNode to receive all of the block reports and leave safemode. + If HA is present, then this command will run individually on each NameNode, which checks for its own address. + """ +- import params ++ from . import params + + sleep_minutes = int(sleep_seconds * retries / 60) + +- Logger.info("Waiting up to {0} minutes for the NameNode to leave Safemode...".format(sleep_minutes)) ++ Logger.info("Waiting up to {} minutes for the NameNode to leave Safemode...".format(sleep_minutes)) + + if params.security_enabled and execute_kinit: + kinit_command = format("{params.kinit_path_local} -kt {params.hdfs_user_keytab} {params.hdfs_principal_name}") +@@ -92,7 +92,7 @@ + raise Fail('"hdfs_binary" parameter is required for function namenode().') + + if action == "configure": +- import params ++ from . import params + #we need this directory to be present before any action(HA manual steps for + #additional namenode) + create_name_dirs(params.dfs_name_dir) +@@ -100,9 +100,9 @@ + # set up failover / secure zookeper ACLs, this feature is supported from HDP 2.6 ownwards + set_up_zkfc_security(params) + elif action == "start": +- Logger.info("Called service {0} with upgrade_type: {1}".format(action, str(upgrade_type))) ++ Logger.info("Called service {} with upgrade_type: {}".format(action, str(upgrade_type))) + setup_ranger_hdfs(upgrade_type=upgrade_type) +- import params ++ from . import params + + File(params.exclude_file_path, + content=Template("exclude_hosts_list.j2"), +@@ -146,7 +146,7 @@ + options = "-rollingUpgrade downgrade" + elif upgrade_type == constants.UPGRADE_TYPE_NON_ROLLING: + is_previous_image_dir = is_previous_fs_image() +- Logger.info("Previous file system image dir present is {0}".format(str(is_previous_image_dir))) ++ Logger.info("Previous file system image dir present is {}".format(str(is_previous_image_dir))) + + if params.upgrade_direction == Direction.UPGRADE: + options = "-rollingUpgrade started" +@@ -160,10 +160,10 @@ + if os.path.exists(namenode_upgrade.get_upgrade_in_progress_marker()): + options = "-rollingUpgrade started" + else: +- Logger.info("The NameNode upgrade marker file {0} does not exist, yet an upgrade is currently suspended. " ++ Logger.info("The NameNode upgrade marker file {} does not exist, yet an upgrade is currently suspended. " + "Assuming that the upgrade of NameNode has not occurred yet.".format(namenode_upgrade.get_upgrade_in_progress_marker())) + +- Logger.info("Options for start command are: {0}".format(options)) ++ Logger.info("Options for start command are: {}".format(options)) + + service( + action="start", +@@ -217,10 +217,10 @@ + + # some informative logging separate from the above logic to keep things a little cleaner + if ensure_safemode_off: +- Logger.info("Waiting for this NameNode to leave Safemode due to the following conditions: HA: {0}, isActive: {1}, upgradeType: {2}".format( ++ Logger.info("Waiting for this NameNode to leave Safemode due to the following conditions: HA: {}, isActive: {}, upgradeType: {}".format( + params.dfs_ha_enabled, is_active_namenode, upgrade_type)) + else: +- Logger.info("Skipping Safemode check due to the following conditions: HA: {0}, isActive: {1}, upgradeType: {2}".format( ++ Logger.info("Skipping Safemode check due to the following conditions: HA: {}, isActive: {}, upgradeType: {}".format( + params.dfs_ha_enabled, is_active_namenode, upgrade_type)) + + +@@ -242,13 +242,13 @@ + Logger.info("Skipping creation of HDFS directories since this is either not the Active NameNode or we did not wait for Safemode to finish.") + + elif action == "stop": +- import params ++ from . import params + service( + action="stop", name="namenode", + user=params.hdfs_user + ) + elif action == "status": +- import status_params ++ from . import status_params + check_process_status(status_params.namenode_pid_file) + elif action == "decommission": + decommission() +@@ -266,7 +266,7 @@ + if action == "configure": + pass + elif action == "start": +- import params ++ from . import params + #TODO: Replace with format_namenode() + namenode_format_marker = os.path.join(params.hadoop_conf_dir,"NN_FORMATTED") + if not os.path.exists(namenode_format_marker): +@@ -275,20 +275,20 @@ + open(namenode_format_marker, 'a').close() + Service(params.namenode_win_service_name, action=action) + elif action == "stop": +- import params ++ from . import params + Service(params.namenode_win_service_name, action=action) + elif action == "status": +- import status_params ++ from . import status_params + check_windows_service_status(status_params.namenode_win_service_name) + elif action == "decommission": + decommission() + + def create_name_dirs(directories): +- import params ++ from . import params + + dirs = directories.split(",") + Directory(dirs, +- mode=0755, ++ mode=0o755, + owner=params.hdfs_user, + group=params.user_group, + create_parents = True, +@@ -297,7 +297,7 @@ + + + def create_hdfs_directories(name_service): +- import params ++ from . import params + + name_services = None if name_service is None else [name_service] + +@@ -305,7 +305,7 @@ + type="directory", + action="create_on_execute", + owner=params.hdfs_user, +- mode=0777, ++ mode=0o777, + nameservices=name_services, + ) + params.HdfsResource(params.smoke_hdfs_user_dir, +@@ -320,7 +320,7 @@ + ) + + def format_namenode(force=None): +- import params ++ from . import params + + old_mark_dir = params.namenode_formatted_old_mark_dirs + mark_dir = params.namenode_formatted_mark_dirs +@@ -440,7 +440,7 @@ + + @OsFamilyFuncImpl(os_family=OsFamilyImpl.DEFAULT) + def refreshProxyUsers(): +- import params ++ from . import params + + if params.security_enabled: + Execute(params.nn_kinit_cmd, +@@ -461,7 +461,7 @@ + + @OsFamilyFuncImpl(os_family=OsFamilyImpl.DEFAULT) + def decommission(): +- import params ++ from . import params + + hdfs_user = params.hdfs_user + conf_dir = params.hadoop_conf_dir +@@ -501,7 +501,7 @@ + + @OsFamilyFuncImpl(os_family=OSConst.WINSRV_FAMILY) + def decommission(): +- import params ++ from . import params + hdfs_user = params.hdfs_user + conf_dir = params.hadoop_conf_dir + +@@ -589,9 +589,9 @@ + + + def find_timeout(): +- import params ++ from . import params + +- if isinstance(params.command_timeout, (int, long)): ++ if isinstance(params.command_timeout, int): + return params.command_timeout + + return int(params.command_timeout) +@@ -608,7 +608,7 @@ + If the other Active NameNode is then restarted, there can be a loss of service if this + NameNode has not entered Standby. + """ +- import params ++ from . import params + + # returns ([('nn1', 'c6401.ambari.apache.org:50070')], [('nn2', 'c6402.ambari.apache.org:50070')], []) + # 0 1 2 +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/hdfs_nfsgateway.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/hdfs_nfsgateway.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/hdfs_nfsgateway.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/hdfs_nfsgateway.py 2022-07-11 00:52:32.000000000 +0800 +@@ -21,7 +21,7 @@ + from resource_management.core.logger import Logger + from resource_management.core.resources import Directory + from resource_management.core import shell +-from utils import service ++from .utils import service + from ambari_commons import subprocess32 + import os + +@@ -56,7 +56,7 @@ + + + def nfsgateway(action=None, format=False): +- import params ++ from . import params + + if action== "start": + prepare_rpcbind() +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/hdfs.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/hdfs.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/hdfs.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/hdfs.py 2022-07-11 00:52:32.000000000 +0800 +@@ -36,7 +36,7 @@ + + @OsFamilyFuncImpl(os_family=OsFamilyImpl.DEFAULT) + def hdfs(name=None): +- import params ++ from . import params + + if params.create_lib_snappy_symlinks: + install_snappy() +@@ -51,7 +51,7 @@ + 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 @@ + content=Template("hdfs_jn_jaas.conf.j2") + ) + +- tc_mode = 0644 ++ tc_mode = 0o644 + tc_owner = "root" + else: + tc_mode = None +@@ -135,7 +135,7 @@ + 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'), +@@ -146,7 +146,7 @@ + install_lzo_if_needed() + + def install_snappy(): +- import params ++ from . import params + Directory([params.so_target_dir_x86, params.so_target_dir_x64], + create_parents = True, + ) +@@ -172,7 +172,7 @@ + + @OsFamilyFuncImpl(os_family=OsFamilyImpl.DEFAULT) + def reconfig(componentName, componentAddress): +- import params ++ from . import params + + if params.security_enabled: + Execute(params.nn_kinit_cmd, +@@ -205,7 +205,7 @@ + + @OsFamilyFuncImpl(os_family=OSConst.WINSRV_FAMILY) + def hdfs(component=None): +- import params ++ from . import params + if component == "namenode": + directories = params.dfs_name_dir.split(",") + Directory(directories, +@@ -226,7 +226,7 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/hdfs_rebalance.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/hdfs_rebalance.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/hdfs_rebalance.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/hdfs_rebalance.py 2022-07-11 00:52:32.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +@@ -47,18 +47,18 @@ + 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'] +- MEMORY_PATTERN = '(?P(?P(\d+)(.|,)?(\d+)?) (?P'+"|".join(MEMORY_SUFFIX)+'))' ++ MEMORY_PATTERN = r'(?P(?P(\d+)(.|,)?(\d+)?) (?P'+"|".join(MEMORY_SUFFIX)+'))' + +- HEADER_BEGIN_PATTERN = re.compile('Time Stamp\w+Iteration#\w+Bytes Already Moved\w+Bytes Left To Move\w+Bytes Being Moved') ++ HEADER_BEGIN_PATTERN = re.compile(r'Time Stamp\w+Iteration#\w+Bytes Already Moved\w+Bytes Left To Move\w+Bytes Being Moved') + PROGRESS_PATTERN = re.compile( +- "(?P.*?)\s+" + +- "(?P\d+)\s+" + +- MEMORY_PATTERN % (1,1,1) + "\s+" + +- MEMORY_PATTERN % (2,2,2) + "\s+" + ++ r"(?P.*?)\s+" + ++ r"(?P\d+)\s+" + ++ MEMORY_PATTERN % (1,1,1) + r"\s+" + ++ MEMORY_PATTERN % (2,2,2) + r"\s+" + + MEMORY_PATTERN % (3,3,3) + ) + PROGRESS_END_PATTERN = re.compile('(The cluster is balanced. Exiting...|The cluster is balanced. Exiting...)') +@@ -114,7 +114,7 @@ + try: + factor = self.MEMORY_SUFFIX.index(multiplier_type) + except ValueError: +- raise AmbariException("Failed to memory value [%s %s]" % (memorySize, multiplier_type)) ++ raise AmbariException("Failed to memory value [{} {}]".format(memorySize, multiplier_type)) + + return float(memorySize) * (1024 ** factor) + def toJson(self): +@@ -136,7 +136,7 @@ + + + def is_balancer_running(): +- import params ++ from . import params + check_balancer_command = "fs -test -e /system/balancer.id" + does_hdfs_file_exist = False + try: +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/hdfs_snamenode.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/hdfs_snamenode.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/hdfs_snamenode.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/hdfs_snamenode.py 2022-07-11 00:52:32.000000000 +0800 +@@ -17,7 +17,7 @@ + + """ + +-from utils import service ++from .utils import service + from resource_management.core.resources.system import Directory, File + from resource_management.core.source import Template + from resource_management.libraries.functions.check_process_status import check_process_status +@@ -27,12 +27,12 @@ + @OsFamilyFuncImpl(os_family=OsFamilyImpl.DEFAULT) + def snamenode(action=None, format=False): + if action == "configure": +- import params ++ from . import params + for fs_checkpoint_dir in params.fs_checkpoint_dirs: + 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, +@@ -46,7 +46,7 @@ + group=params.user_group) + pass + elif action == "start" or action == "stop": +- import params ++ from . import params + service( + action=action, + name="secondarynamenode", +@@ -55,7 +55,7 @@ + create_log_dir=True + ) + elif action == "status": +- import status_params ++ from . import status_params + check_process_status(status_params.snamenode_pid_file) + + +@@ -64,9 +64,9 @@ + if action == "configure": + pass + elif action == "start" or action == "stop": +- import params ++ from . import params + Service(params.snamenode_win_service_name, action=action) + elif action == "status": +- import status_params ++ from . import status_params + check_windows_service_status(status_params.snamenode_win_service_name) + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/journalnode.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/journalnode.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/journalnode.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/journalnode.py 2022-07-11 00:52:32.000000000 +0800 +@@ -28,15 +28,15 @@ + FILE_TYPE_XML + from resource_management.core.logger import Logger + from resource_management.core.resources.system import Directory +-from utils import service +-from hdfs import hdfs +-import journalnode_upgrade ++from .utils import service ++from .hdfs import hdfs ++from . import journalnode_upgrade + from ambari_commons.os_family_impl import OsFamilyImpl + from ambari_commons import OSConst + + class JournalNode(Script): + def install(self, env): +- import params ++ from . import params + env.set_params(params) + self.install_packages(env) + +@@ -45,14 +45,14 @@ + + def pre_upgrade_restart(self, env, upgrade_type=None): + Logger.info("Executing Stack Upgrade pre-restart") +- import params ++ from . import params + env.set_params(params) + + if params.version and check_stack_feature(StackFeature.ROLLING_UPGRADE, params.version): + stack_select.select_packages(params.version) + + def start(self, env, upgrade_type=None): +- import params ++ from . import params + + env.set_params(params) + self.configure(env) +@@ -68,12 +68,12 @@ + return + + Logger.info("Executing Stack Upgrade post-restart") +- import params ++ from . import params + env.set_params(params) + journalnode_upgrade.post_upgrade_check() + + def stop(self, env, upgrade_type=None): +- import params ++ from . import params + + env.set_params(params) + service( +@@ -83,7 +83,7 @@ + ) + + def configure(self, env): +- import params ++ from . import params + + Directory(params.jn_edits_dirs, + create_parents = True, +@@ -96,46 +96,46 @@ + pass + + def status(self, env): +- import status_params ++ from . import status_params + + env.set_params(status_params) + check_process_status(status_params.journalnode_pid_file) + + def get_log_folder(self): +- import params ++ from . import params + return params.hdfs_log_dir + + def get_user(self): +- import params ++ from . import params + return params.hdfs_user + + def get_pid_files(self): +- import status_params ++ from . import status_params + return [status_params.journalnode_pid_file] + + @OsFamilyImpl(os_family=OSConst.WINSRV_FAMILY) + class JournalNodeWindows(JournalNode): + def install(self, env): +- import install_params ++ from . import install_params + self.install_packages(env) + + def start(self, env): +- import params ++ from . import params + self.configure(env) + Service(params.journalnode_win_service_name, action="start") + + def stop(self, env): +- import params ++ from . import params + Service(params.journalnode_win_service_name, action="stop") + + def configure(self, env): +- import params ++ from . import params + env.set_params(params) + hdfs("journalnode") + pass + + def status(self, env): +- import status_params ++ from . import status_params + env.set_params(status_params) + check_windows_service_status(status_params.journalnode_win_service_name) + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/journalnode_upgrade.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/journalnode_upgrade.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/journalnode_upgrade.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/journalnode_upgrade.py 2022-07-11 00:52:32.000000000 +0800 +@@ -23,11 +23,11 @@ + from resource_management.core.resources.system import Execute + from resource_management.libraries.functions.default import default + from resource_management.core.exceptions import Fail +-import utils ++from . import utils + from resource_management.libraries.functions.jmx import get_value_from_jmx +-import namenode_ha_state +-from namenode_ha_state import NAMENODE_STATE, NamenodeHAState +-from utils import get_dfsadmin_base_command ++from . import namenode_ha_state ++from .namenode_ha_state import NAMENODE_STATE, NamenodeHAState ++from .utils import get_dfsadmin_base_command + + + def post_upgrade_check(): +@@ -35,7 +35,7 @@ + Ensure all journal nodes are up and quorum is established during Rolling Upgrade. + :return: + """ +- import params ++ from . import params + Logger.info("Ensuring Journalnode quorum is established") + + if params.security_enabled: +@@ -54,7 +54,7 @@ + + 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)) +@@ -81,7 +81,7 @@ + Roll the logs so that Namenode will be able to connect to the Journalnode. + Must kinit before calling this command. + """ +- import params ++ from . import params + + # TODO, this will need to be doc'ed since existing clusters will need HDFS_CLIENT on all JOURNALNODE hosts + dfsadmin_base_command = get_dfsadmin_base_command('hdfs') +@@ -95,7 +95,7 @@ + :param last_txn_id: Integer of last transaction id + :return: Return true on success, false otherwise + """ +- import params ++ from . import params + + jn_uri = default("/configurations/hdfs-site/dfs.namenode.shared.edits.dir", None) + +@@ -136,15 +136,15 @@ + if node in actual_txn_ids and actual_txn_ids[node] and actual_txn_ids[node] >= last_txn_id: + continue + +- url = '%s://%s:%s' % (protocol, node, params.journalnode_port) ++ url = '{}://{}:{}'.format(protocol, node, params.journalnode_port) + data = utils.get_jmx_data(url, 'Journal-', 'LastWrittenTxId', params.https_only, params.security_enabled) + if data: + actual_txn_ids[node] = int(data) + if actual_txn_ids[node] >= last_txn_id: +- Logger.info("JournalNode %s has a higher transaction id: %s" % (node, str(data))) ++ Logger.info("JournalNode {} has a higher transaction id: {}".format(node, str(data))) + jns_updated += 1 + else: +- Logger.info("JournalNode %s is still on transaction id: %s" % (node, str(data))) ++ Logger.info("JournalNode {} is still on transaction id: {}".format(node, str(data))) + + Logger.info("Sleeping for %d secs" % step_time_secs) + time.sleep(step_time_secs) +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/namenode_ha_state.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/namenode_ha_state.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/namenode_ha_state.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/namenode_ha_state.py 2022-07-11 00:52:32.000000000 +0800 +@@ -39,7 +39,7 @@ + Initializes all fields by querying the Namenode state. + Raises a ValueError if unable to construct the object. + """ +- import params ++ from . import params + + self.name_services = default('/configurations/hdfs-site/dfs.internal.nameservices', None) + if self.name_services is None: +@@ -112,7 +112,7 @@ + if state in self.namenode_state_to_hostnames: + self.namenode_state_to_hostnames[state].add(hostname) + else: +- hostnames = set([hostname, ]) ++ hostnames = {hostname} + self.namenode_state_to_hostnames[state] = hostnames + except: + Logger.error("Could not get namenode state for " + nn_unique_id) +@@ -161,7 +161,7 @@ + :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 list(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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/namenode.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/namenode.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/namenode.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/namenode.py 2022-07-11 00:52:32.000000000 +0800 +@@ -47,11 +47,11 @@ + from ambari_commons import OSConst + + +-import namenode_upgrade +-from hdfs_namenode import namenode, wait_for_safemode_off, refreshProxyUsers, format_namenode +-from hdfs import hdfs, reconfig +-import hdfs_rebalance +-from utils import initiate_safe_zkfc_failover, get_hdfs_binary, get_dfsadmin_base_command ++from . import namenode_upgrade ++from .hdfs_namenode import namenode, wait_for_safemode_off, refreshProxyUsers, format_namenode ++from .hdfs import hdfs, reconfig ++from . import hdfs_rebalance ++from .utils import initiate_safe_zkfc_failover, get_hdfs_binary, get_dfsadmin_base_command + from resource_management.libraries.functions.namenode_ha_utils import get_hdfs_cluster_id_from_jmx + + # The hash algorithm to use to generate digests/hashes +@@ -66,38 +66,38 @@ + return get_hdfs_binary("hadoop-hdfs-namenode") + + def install(self, env): +- import params ++ from . import params + env.set_params(params) + self.install_packages(env) + #TODO we need this for HA because of manual steps + self.configure(env) + + def configure(self, env): +- import params ++ from . import params + env.set_params(params) + hdfs("namenode") + hdfs_binary = self.get_hdfs_binary() + namenode(action="configure", hdfs_binary=hdfs_binary, env=env) + + def save_configs(self, env): +- import params ++ from . import params + env.set_params(params) + hdfs() + + def reload_configs(self, env): +- import params ++ from . import params + env.set_params(params) + Logger.info("RELOAD CONFIGS") + reconfig("namenode", params.namenode_address) + + def reloadproxyusers(self, env): +- import params ++ from . import params + env.set_params(params) + Logger.info("RELOAD HDFS PROXY USERS") + refreshProxyUsers() + + def format(self, env): +- import params ++ from . import params + env.set_params(params) + + if params.security_enabled: +@@ -115,7 +115,7 @@ + ) + + def bootstrap_standby(self, env): +- import params ++ from . import params + env.set_params(params) + + if params.security_enabled: +@@ -129,7 +129,7 @@ + ) + + def start(self, env, upgrade_type=None): +- import params ++ from . import params + env.set_params(params) + self.configure(env) + hdfs_binary = self.get_hdfs_binary() +@@ -148,7 +148,7 @@ + namenode_upgrade.create_upgrade_marker() + + def stop(self, env, upgrade_type=None): +- import params ++ from . import params + env.set_params(params) + hdfs_binary = self.get_hdfs_binary() + if upgrade_type == constants.UPGRADE_TYPE_ROLLING and params.dfs_ha_enabled: +@@ -159,12 +159,12 @@ + namenode(action="stop", hdfs_binary=hdfs_binary, upgrade_type=upgrade_type, env=env) + + def status(self, env): +- import status_params ++ from . import status_params + env.set_params(status_params) + namenode(action="status", env=env) + + def decommission(self, env): +- import params ++ from . import params + env.set_params(params) + hdfs_binary = self.get_hdfs_binary() + namenode(action="decommission", hdfs_binary=hdfs_binary) +@@ -178,7 +178,7 @@ + """ + Restore the snapshot during a Downgrade. + """ +- print "TODO AMBARI-12698" ++ print("TODO AMBARI-12698") + pass + + def prepare_express_upgrade(self, env): +@@ -201,7 +201,7 @@ + Prepare for a NameNode rolling upgrade in order to not lose any data. + hdfs dfsadmin -rollingUpgrade prepare + """ +- import params ++ from . import params + Logger.info("Preparing the NameNodes for a NonRolling (aka Express) Upgrade.") + + if params.security_enabled: +@@ -242,14 +242,14 @@ + + def pre_upgrade_restart(self, env, upgrade_type=None): + Logger.info("Executing Stack Upgrade pre-restart") +- import params ++ from . import params + env.set_params(params) + + stack_select.select_packages(params.version) + + def post_upgrade_restart(self, env, upgrade_type=None): + Logger.info("Executing Stack Upgrade post-restart") +- import params ++ from . import params + env.set_params(params) + + hdfs_binary = self.get_hdfs_binary() +@@ -262,7 +262,7 @@ + ) + + def rebalancehdfs(self, env): +- import params ++ from . import params + env.set_params(params) + + name_node_parameters = json.loads( params.name_node_params ) +@@ -293,7 +293,7 @@ + try: + division_result = current.bytesLeftToMove/first.bytesLeftToMove + except ZeroDivisionError: +- Logger.warning("Division by zero. Bytes Left To Move = {0}. Return 1.0".format(first.bytesLeftToMove)) ++ Logger.warning("Division by zero. Bytes Left To Move = {}. Return 1.0".format(first.bytesLeftToMove)) + return 1.0 + return 1.0 - division_result + +@@ -341,28 +341,28 @@ + "please consult with the HDFS administrators if they have triggred or killed the operation.") + + def get_log_folder(self): +- import params ++ from . import params + return params.hdfs_log_dir + + def get_user(self): +- import params ++ from . import params + return params.hdfs_user + + def get_pid_files(self): +- import status_params ++ from . import status_params + return [status_params.namenode_pid_file] + + @OsFamilyImpl(os_family=OSConst.WINSRV_FAMILY) + class NameNodeWindows(NameNode): + def install(self, env): +- import install_params ++ from . import install_params + self.install_packages(env) + #TODO we need this for HA because of manual steps + self.configure(env) + + def rebalancehdfs(self, env): + from ambari_commons.os_windows import UserHelper, run_os_command_impersonated +- import params ++ from . import params + env.set_params(params) + + hdfs_username, hdfs_domain = UserHelper.parse_user_name(params.hdfs_user, ".") +@@ -387,7 +387,7 @@ + returncode, stdout, err = run_os_command_impersonated(' '.join(command), hdfs_username, Script.get_password(params.hdfs_user), hdfs_domain) + + for line in stdout.split('\n'): +- _print('[balancer] %s %s' % (str(datetime.now()), line )) ++ _print('[balancer] {} {}'.format(str(datetime.now()), line )) + pl = parser.parseLine(line) + if pl: + res = pl.toJson() +@@ -395,7 +395,7 @@ + + self.put_structured_out(res) + elif parser.state == 'PROCESS_FINISED' : +- _print('[balancer] %s %s' % (str(datetime.now()), 'Process is finished' )) ++ _print('[balancer] {} {}'.format(str(datetime.now()), 'Process is finished' )) + self.put_structured_out({'completePercent' : 1}) + break + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/namenode_upgrade.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/namenode_upgrade.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/namenode_upgrade.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/namenode_upgrade.py 2022-07-11 00:52:32.000000000 +0800 +@@ -28,9 +28,9 @@ + from resource_management.libraries.functions.format import format + from resource_management.libraries.functions import get_unique_id_and_date + from resource_management.libraries.functions import Direction, SafeMode +-from utils import get_dfsadmin_base_command ++from .utils import get_dfsadmin_base_command + +-from namenode_ha_state import NamenodeHAState ++from .namenode_ha_state import NamenodeHAState + + + safemode_to_instruction = {SafeMode.ON: "enter", +@@ -43,7 +43,7 @@ + During a NonRolling (aka Express Upgrade), preparing the NameNode requires backing up some data. + Check that there is no "previous" folder inside the NameNode Name Dir. + """ +- import params ++ from . import params + + if params.dfs_ha_enabled: + namenode_ha = NamenodeHAState() +@@ -62,7 +62,7 @@ + if len(problematic_previous_namenode_dirs) > 0: + message = 'WARNING. The following NameNode Name Dir(s) have a "previous" folder from an older version.\n' \ + 'Please back it up first, and then delete it, OR Finalize (E.g., "hdfs dfsadmin -finalizeUpgrade").\n' \ +- 'NameNode Name Dir(s): {0}\n' \ ++ 'NameNode Name Dir(s): {}\n' \ + '***** Then, retry this step. *****'.format(", ".join(problematic_previous_namenode_dirs)) + Logger.error(message) + raise Fail(message) +@@ -72,7 +72,7 @@ + During a NonRolling (aka Express Upgrade), preparing the NameNode requires first entering Safemode. + :param hdfs_binary: name/path of the HDFS binary to use + """ +- import params ++ from . import params + + dfsadmin_base_command = get_dfsadmin_base_command(hdfs_binary) + safe_mode_enter_cmd = dfsadmin_base_command + " -safemode enter" +@@ -80,11 +80,11 @@ + # Safe to call if already in Safe Mode + desired_state = SafeMode.ON + safemode_transition_successful, original_state = reach_safemode_state(params.hdfs_user, desired_state, params.dfs_ha_enabled, hdfs_binary) +- Logger.info("Transition successful: {0}, original state: {1}".format(str(safemode_transition_successful), str(original_state))) ++ Logger.info("Transition successful: {}, original state: {}".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: +- message = "Could not enter safemode. Error: {0}. As the HDFS user, call this command: {1}".format(str(e), safe_mode_enter_cmd) ++ except Exception as e: ++ message = "Could not enter safemode. Error: {}. As the HDFS user, call this command: {}".format(str(e), safe_mode_enter_cmd) + Logger.error(message) + raise Fail(message) + +@@ -93,14 +93,14 @@ + During a NonRolling (aka Express Upgrade), preparing the NameNode requires saving the namespace. + :param hdfs_binary: name/path of the HDFS binary to use + """ +- import params ++ from . import params + + dfsadmin_base_command = get_dfsadmin_base_command(hdfs_binary) + save_namespace_cmd = dfsadmin_base_command + " -saveNamespace" + 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) +@@ -109,12 +109,12 @@ + """ + During a NonRolling (aka Express Upgrade), preparing the NameNode requires backing up the NameNode Name Dirs. + """ +- import params ++ from . import params + + i = 0 + failed_paths = [] + nn_name_dirs = params.dfs_name_dir.split(',') +- backup_destination_root_dir = "{0}/{1}".format(params.namenode_backup_dir, params.stack_version_unformatted) ++ backup_destination_root_dir = "{}/{}".format(params.namenode_backup_dir, params.stack_version_unformatted) + if len(nn_name_dirs) > 0: + Logger.info("Backup the NameNode name directory's CURRENT folder.") + for nn_dir in nn_name_dirs: +@@ -122,7 +122,7 @@ + namenode_current_image = os.path.join(nn_dir, "current") + unique = get_unique_id_and_date() + "_" + str(i) + # Note that /tmp may not be writeable. +- backup_current_folder = "{0}/namenode_{1}/".format(backup_destination_root_dir, unique) ++ backup_current_folder = "{}/namenode_{}/".format(backup_destination_root_dir, unique) + + if os.path.isdir(namenode_current_image) and not os.path.isdir(backup_current_folder): + try: +@@ -130,11 +130,11 @@ + 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 " +- "writeable and copy the directories on your own. Directories: {1}".format(backup_destination_root_dir, ++ Logger.error("Could not backup the NameNode Name Dir(s) to {}, make sure that the destination path is " ++ "writeable and copy the directories on your own. Directories: {}".format(backup_destination_root_dir, + ", ".join(failed_paths))) + + def prepare_upgrade_finalize_previous_upgrades(hdfs_binary): +@@ -142,7 +142,7 @@ + During a NonRolling (aka Express Upgrade), preparing the NameNode requires Finalizing any upgrades that are in progress. + :param hdfs_binary: name/path of the HDFS binary to use + """ +- import params ++ from . import params + + dfsadmin_base_command = get_dfsadmin_base_command(hdfs_binary) + finalize_command = dfsadmin_base_command + " -rollingUpgrade finalize" +@@ -156,7 +156,7 @@ + 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): +@@ -170,7 +170,7 @@ + success will be True + """ + Logger.info("Prepare to transition into safemode state %s" % safemode_state) +- import params ++ from . import params + original_state = SafeMode.UNKNOWN + + dfsadmin_base_command = get_dfsadmin_base_command(hdfs_binary) +@@ -185,7 +185,7 @@ + if code == 0 and out is not None: + Logger.info(out) + re_pattern = r"Safe mode is (\S*)" +- Logger.info("Pattern to search: {0}".format(re_pattern)) ++ Logger.info("Pattern to search: {}".format(re_pattern)) + m = re.search(re_pattern, out, re.IGNORECASE) + if m and len(m.groups()) >= 1: + original_state = m.group(1).upper() +@@ -218,7 +218,7 @@ + 3. Execute a rolling upgrade "query" + :param hdfs_binary: name/path of the HDFS binary to use + """ +- import params ++ from . import params + + if not params.upgrade_direction or params.upgrade_direction not in [Direction.UPGRADE, Direction.DOWNGRADE]: + raise Fail("Could not retrieve upgrade direction: %s" % str(params.upgrade_direction)) +@@ -253,7 +253,7 @@ + :param hdfs_binary: name/path of the HDFS binary to use + """ + Logger.info("Executing Rolling Upgrade finalize") +- import params ++ from . import params + + if params.security_enabled: + kinit_command = format("{params.kinit_path_local} -kt {params.hdfs_user_keytab} {params.hdfs_principal_name}") +@@ -298,7 +298,7 @@ + if not os.path.isfile(namenode_upgrade_in_progress_marker): + File(namenode_upgrade_in_progress_marker) + except: +- Logger.warning("Unable to create NameNode upgrade marker file {0}".format(namenode_upgrade_in_progress_marker)) ++ Logger.warning("Unable to create NameNode upgrade marker file {}".format(namenode_upgrade_in_progress_marker)) + + + def delete_upgrade_marker(): +@@ -316,7 +316,7 @@ + if os.path.isfile(namenode_upgrade_in_progress_marker): + File(namenode_upgrade_in_progress_marker, action='delete') + except: +- error_message = "Unable to remove NameNode upgrade marker file {0}".format(namenode_upgrade_in_progress_marker) ++ error_message = "Unable to remove NameNode upgrade marker file {}".format(namenode_upgrade_in_progress_marker) + Logger.error(error_message) + raise Fail(error_message) + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/nfsgateway.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/nfsgateway.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/nfsgateway.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/nfsgateway.py 2022-07-11 00:52:32.000000000 +0800 +@@ -22,8 +22,8 @@ + from resource_management.libraries.functions.security_commons import build_expectations, \ + cached_kinit_executor, get_params_from_filesystem, validate_security_config_properties, \ + FILE_TYPE_XML +-from hdfs_nfsgateway import nfsgateway +-from hdfs import hdfs ++from .hdfs_nfsgateway import nfsgateway ++from .hdfs import hdfs + from resource_management.libraries.functions import stack_select + from resource_management.libraries.functions import StackFeature + from resource_management.libraries.functions.stack_features import check_stack_feature +@@ -31,56 +31,56 @@ + + class NFSGateway(Script): + def install(self, env): +- import params ++ from . import params + + env.set_params(params) + + self.install_packages(env) + + def pre_upgrade_restart(self, env, upgrade_type=None): +- import params ++ from . import params + env.set_params(params) + + if params.stack_version_formatted and check_stack_feature(StackFeature.NFS, params.stack_version_formatted): + stack_select.select_packages(params.version) + + def start(self, env, upgrade_type=None): +- import params ++ from . import params + env.set_params(params) + + self.configure(env) + nfsgateway(action="start") + + def stop(self, env, upgrade_type=None): +- import params ++ from . import params + env.set_params(params) + + nfsgateway(action="stop") + + def configure(self, env): +- import params ++ from . import params + + env.set_params(params) + hdfs() + nfsgateway(action="configure") + + def status(self, env): +- import status_params ++ from . import status_params + + env.set_params(status_params) + + check_process_status(status_params.nfsgateway_pid_file) + + def get_log_folder(self): +- import params ++ from . import params + return params.hdfs_log_dir + + def get_user(self): +- import params ++ from . import params + return params.hdfs_user + + def get_pid_files(self): +- import status_params ++ from . import status_params + return [status_params.nfsgateway_pid_file] + + if __name__ == "__main__": +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/params_linux.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/params_linux.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/params_linux.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/params_linux.py 2022-07-11 00:52:32.000000000 +0800 +@@ -17,8 +17,8 @@ + + """ + +-import status_params +-import utils ++from . import status_params ++from . import utils + 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 re +@@ -250,7 +250,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']] + +@@ -261,7 +261,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/" +@@ -317,7 +317,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 list(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(",") +@@ -336,7 +336,7 @@ + + # Calculate the namenode id of the other namenode. This is needed during RU to initiate an HA failover using ZKFC. + if namenode_id is not None and len(dfs_ha_namemodes_ids_list) == 2: +- other_namenode_id = list(set(dfs_ha_namemodes_ids_list) - set([namenode_id]))[0] ++ other_namenode_id = list(set(dfs_ha_namemodes_ids_list) - {namenode_id})[0] + + if found: + break +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/params.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/params.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/params.py 2022-07-11 00:52:32.000000000 +0800 +@@ -20,9 +20,9 @@ + from resource_management.libraries.functions.default import default + + if OSCheck.is_windows_family(): +- from params_windows import * ++ from .params_windows import * + else: +- from params_linux import * ++ from .params_linux import * + + nfsgateway_heapsize = config['configurations']['hadoop-env']['nfsgateway_heapsize'] + retryAble = default("/commandParams/command_retry_enabled", False) +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/params_windows.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/params_windows.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/params_windows.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/params_windows.py 2022-07-11 00:52:32.000000000 +0800 +@@ -23,8 +23,8 @@ + from resource_management.libraries.script.script import Script + from resource_management.libraries.functions.default import default + from resource_management.libraries.functions.format import format +-from install_params import exclude_packages +-from status_params import * ++from .install_params import exclude_packages ++from .status_params import * + + config = Script.get_config() + hadoop_conf_dir = None +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/service_check.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/service_check.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/service_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/service_check.py 2022-07-11 00:52:32.000000000 +0800 +@@ -36,7 +36,7 @@ + @OsFamilyImpl(os_family=OsFamilyImpl.DEFAULT) + class HdfsServiceCheckDefault(HdfsServiceCheck): + def service_check(self, env): +- import params ++ from . import params + + env.set_params(params) + unique = functions.get_unique_id_and_date() +@@ -66,7 +66,7 @@ + params.HdfsResource(dir, + type="directory", + action="create_on_execute", +- mode=0777 ++ mode=0o777 + ) + params.HdfsResource(tmp_file, + type="file", +@@ -102,7 +102,7 @@ + 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, +@@ -126,7 +126,7 @@ + @OsFamilyImpl(os_family=OSConst.WINSRV_FAMILY) + class HdfsServiceCheckWindows(HdfsServiceCheck): + def service_check(self, env): +- import params ++ from . import params + env.set_params(params) + + unique = functions.get_unique_id_and_date() +@@ -137,15 +137,15 @@ + + #commands for execution + hadoop_cmd = "cmd /C %s" % (os.path.join(params.hadoop_home, "bin", "hadoop.cmd")) +- create_dir_cmd = "%s fs -mkdir %s" % (hadoop_cmd, dir) +- own_dir = "%s fs -chmod 777 %s" % (hadoop_cmd, dir) +- test_dir_exists = "%s fs -test -e %s" % (hadoop_cmd, dir) +- cleanup_cmd = "%s fs -rm %s" % (hadoop_cmd, tmp_file) +- create_file_cmd = "%s fs -put %s %s" % (hadoop_cmd, os.path.join(params.hadoop_conf_dir, "core-site.xml"), tmp_file) +- test_cmd = "%s fs -test -e %s" % (hadoop_cmd, tmp_file) ++ create_dir_cmd = "{} fs -mkdir {}".format(hadoop_cmd, dir) ++ own_dir = "{} fs -chmod 777 {}".format(hadoop_cmd, dir) ++ test_dir_exists = "{} fs -test -e {}".format(hadoop_cmd, dir) ++ cleanup_cmd = "{} fs -rm {}".format(hadoop_cmd, tmp_file) ++ create_file_cmd = "{} fs -put {} {}".format(hadoop_cmd, os.path.join(params.hadoop_conf_dir, "core-site.xml"), tmp_file) ++ test_cmd = "{} fs -test -e {}".format(hadoop_cmd, tmp_file) + + hdfs_cmd = "cmd /C %s" % (os.path.join(params.hadoop_home, "bin", "hdfs.cmd")) +- safemode_command = "%s dfsadmin -safemode get | %s OFF" % (hdfs_cmd, params.grep_exe) ++ safemode_command = "{} dfsadmin -safemode get | {} OFF".format(hdfs_cmd, params.grep_exe) + + Execute(safemode_command, logoutput=True, try_sleep=3, tries=20) + Execute(create_dir_cmd, user=params.hdfs_user,logoutput=True, ignore_failures=True) +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/setup_ranger_hdfs.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/setup_ranger_hdfs.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/setup_ranger_hdfs.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/setup_ranger_hdfs.py 2022-07-11 00:52:32.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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,7 +27,7 @@ + + + def setup_ranger_hdfs(upgrade_type=None): +- import params ++ from . import params + + if params.enable_ranger_hdfs: + +@@ -95,7 +95,7 @@ + Logger.info('Ranger Hdfs plugin is not enabled') + + def create_ranger_audit_hdfs_directories(): +- import params ++ from . import params + + if params.enable_ranger_hdfs and params.xml_configurations_supported and params.xa_audit_hdfs_is_enabled: + params.HdfsResource("/ranger/audit", +@@ -103,7 +103,7 @@ + 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 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/snamenode.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/snamenode.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/snamenode.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/snamenode.py 2022-07-11 00:52:32.000000000 +0800 +@@ -25,8 +25,8 @@ + cached_kinit_executor, get_params_from_filesystem, validate_security_config_properties, \ + FILE_TYPE_XML + +-from hdfs_snamenode import snamenode +-from hdfs import hdfs ++from .hdfs_snamenode import snamenode ++from .hdfs import hdfs + from ambari_commons.os_family_impl import OsFamilyImpl + from ambari_commons import OSConst + +@@ -34,39 +34,39 @@ + + class SNameNode(Script): + def install(self, env): +- import params ++ from . import params + env.set_params(params) + self.install_packages(env) + + def configure(self, env): +- import params ++ from . import params + env.set_params(params) + hdfs("secondarynamenode") + snamenode(action="configure") + + def save_configs(self, env): +- import params ++ from . import params + env.set_params(params) + hdfs("secondarynamenode") + + def reload_configs(self, env): +- import params ++ from . import params + env.set_params(params) + Logger.info("RELOAD CONFIGS") + + def start(self, env, upgrade_type=None): +- import params ++ from . import params + env.set_params(params) + self.configure(env) + snamenode(action="start") + + def stop(self, env, upgrade_type=None): +- import params ++ from . import params + env.set_params(params) + snamenode(action="stop") + + def status(self, env): +- import status_params ++ from . import status_params + env.set_params(status_params) + snamenode(action="status") + +@@ -75,22 +75,22 @@ + + def pre_upgrade_restart(self, env, upgrade_type=None): + Logger.info("Executing Stack Upgrade pre-restart") +- import params ++ from . import params + env.set_params(params) + + if params.version and check_stack_feature(StackFeature.ROLLING_UPGRADE, params.version): + stack_select.select_packages(params.version) + + def get_log_folder(self): +- import params ++ from . import params + return params.hdfs_log_dir + + def get_user(self): +- import params ++ from . import params + return params.hdfs_user + + def get_pid_files(self): +- import status_params ++ from . import status_params + return [status_params.snamenode_pid_file] + + @OsFamilyImpl(os_family=OSConst.WINSRV_FAMILY) +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/utils.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/utils.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/utils.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/utils.py 2022-07-11 00:52:32.000000000 +0800 +@@ -18,7 +18,7 @@ + """ + import os + import re +-import urllib2 ++import urllib.request, urllib.error, urllib.parse + from ambari_commons import subprocess32 + import ambari_simplejson as json # simplejson is much faster comparing to Python 2.6 json module and has the same functions set. + +@@ -38,7 +38,7 @@ + from resource_management.libraries.functions.namenode_ha_utils import get_namenode_states + from resource_management.libraries.functions.show_logs import show_logs + from ambari_commons.inet_utils import ensure_ssl_using_protocol +-from zkfc_slave import ZkfcSlaveDefault ++from .zkfc_slave import ZkfcSlaveDefault + + ensure_ssl_using_protocol( + Script.get_force_https_protocol_name(), +@@ -51,7 +51,7 @@ + :param action: start or stop + :param env: environment + """ +- Logger.info("Performing action {0} on zkfc.".format(action)) ++ Logger.info("Performing action {} on zkfc.".format(action)) + zkfc = None + if action == "start": + try: +@@ -74,7 +74,7 @@ + If an error occurs, force a failover to happen by killing zkfc on this host. In this case, during the Restart, + will also have to start ZKFC manually. + """ +- import params ++ from . import params + + # Must kinit before running the HDFS command + if params.security_enabled: +@@ -95,7 +95,7 @@ + Logger.info(format("Standby NameNode id: {standby_namenode_id}")) + if unknown_namenodes: + for unknown_namenode in unknown_namenodes: +- Logger.info("NameNode HA state for {0} is unknown".format(unknown_namenode[0])) ++ Logger.info("NameNode HA state for {} is unknown".format(unknown_namenode[0])) + + if params.namenode_id == active_namenode_id and params.other_namenode_id == standby_namenode_id: + # Failover if this NameNode is active and other NameNode is up and in standby (i.e. ready to become active on failover) +@@ -104,7 +104,7 @@ + failover_command = format("hdfs haadmin -ns {dfs_ha_nameservices} -failover {namenode_id} {other_namenode_id}") + check_standby_cmd = format("hdfs haadmin -ns {dfs_ha_nameservices} -getServiceState {namenode_id} | grep standby") + +- msg = "Rolling Upgrade - Initiating a ZKFC failover on active NameNode host {0}.".format(params.hostname) ++ msg = "Rolling Upgrade - Initiating a ZKFC failover on active NameNode host {}.".format(params.hostname) + Logger.info(msg) + code, out = shell.call(failover_command, user=params.hdfs_user, logoutput=True) + Logger.info(format("Rolling Upgrade - failover command returned {code}")) +@@ -132,7 +132,7 @@ + try_sleep=6, + logoutput=True) + else: +- msg = "Rolling Upgrade - Skipping ZKFC failover on NameNode host {0}.".format(params.hostname) ++ msg = "Rolling Upgrade - Skipping ZKFC failover on NameNode host {}.".format(params.hostname) + Logger.info(msg) + + def kill_zkfc(zkfc_user): +@@ -143,7 +143,7 @@ + :param zkfc_user: User that started the ZKFC process. + :return: Return True if ZKFC was killed, otherwise, false. + """ +- import params ++ from . import params + if params.dfs_ha_enabled: + if params.zkfc_pid_file: + check_process = as_user(format("ls {zkfc_pid_file} > /dev/null 2>&1 && ps -p `cat {zkfc_pid_file}` > /dev/null 2>&1"), user=zkfc_user) +@@ -170,7 +170,7 @@ + :param create_pid_dir: Create PID directory + :param create_log_dir: Crate log file directory + """ +- import params ++ from . import params + + options = options if options else "" + pid_dir = format("{hadoop_pid_dir_prefix}/{user}") +@@ -198,13 +198,13 @@ + 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 @@ + if create_log_dir: + if name == "nfs3": + Directory(log_dir, +- mode=0775, ++ mode=0o775, + owner=params.root_user, + group=params.user_group) + else: +@@ -319,14 +319,14 @@ + nn_address = nn_address + "/" + + nn_address = nn_address + "jmx" +- Logger.info("Retrieve modeler: %s, metric: %s from JMX endpoint %s" % (modeler_type, metric, nn_address)) ++ Logger.info("Retrieve modeler: {}, metric: {} from JMX endpoint {}".format(modeler_type, metric, nn_address)) + + if security_enabled: +- import params ++ from . import params + 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) +@@ -366,7 +366,7 @@ + """ + Return true if there's a previous folder in the HDFS namenode directories. + """ +- import params ++ from . import params + if params.dfs_name_dir: + nn_name_dirs = params.dfs_name_dir.split(',') + for nn_dir in nn_name_dirs: +@@ -381,10 +381,10 @@ + :param distro_component_name: e.g., hadoop-hdfs-namenode, hadoop-hdfs-datanode + :return: The hdfs binary to use + """ +- import params ++ from . import params + hdfs_binary = "hdfs" + if params.stack_version_formatted and check_stack_feature(StackFeature.ROLLING_UPGRADE, params.stack_version_formatted): +- hdfs_binary = "{0}/current/{1}/bin/hdfs".format(params.stack_root, distro_component_name) ++ hdfs_binary = "{}/current/{}/bin/hdfs".format(params.stack_root, distro_component_name) + + return hdfs_binary + +@@ -396,7 +396,7 @@ + current namenode's address + :return: the constructed dfsadmin base command + """ +- import params ++ from . import params + dfsadmin_base_command = "" + if params.dfs_ha_enabled and use_specific_namenode: + dfsadmin_base_command = format("{hdfs_binary} dfsadmin -fs hdfs://{params.namenode_rpc}") +@@ -426,6 +426,6 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/zkfc_slave.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/zkfc_slave.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/zkfc_slave.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/zkfc_slave.py 2022-07-11 00:52:32.000000000 +0800 +@@ -17,8 +17,8 @@ + + """ + # this is needed to avoid a circular dependency since utils.py calls this class +-import utils +-from hdfs import hdfs ++from . import utils ++from .hdfs import hdfs + + from ambari_commons import OSConst + from ambari_commons.os_family_impl import OsFamilyImpl +@@ -40,7 +40,7 @@ + + class ZkfcSlave(Script): + def install(self, env): +- import params ++ from . import params + env.set_params(params) + self.install_packages(env) + +@@ -49,14 +49,14 @@ + + @staticmethod + def configure_static(env): +- import params ++ from . import params + env.set_params(params) + hdfs("zkfc_slave") + utils.set_up_zkfc_security(params) + pass + + def format(self, env): +- import params ++ from . import params + env.set_params(params) + + utils.set_up_zkfc_security(params) +@@ -75,12 +75,12 @@ + + @staticmethod + def start_static(env, upgrade_type=None): +- import params ++ from . import params + + 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 + ) +@@ -105,7 +105,7 @@ + + @staticmethod + def stop_static(env, upgrade_type=None): +- import params ++ from . import params + + env.set_params(params) + utils.service( +@@ -119,12 +119,12 @@ + + @staticmethod + def status_static(env): +- import status_params ++ from . import status_params + env.set_params(status_params) + check_process_status(status_params.zkfc_pid_file) + + def disable_security(self, env): +- import params ++ from . import params + + if not params.stack_supports_zk_security: + return +@@ -133,20 +133,20 @@ + zkmigrator.set_acls(params.zk_namespace if params.zk_namespace.startswith('/') else '/' + params.zk_namespace, 'world:anyone:crdwa') + + def get_log_folder(self): +- import params ++ from . import params + return params.hdfs_log_dir + + def get_user(self): +- import params ++ from . import params + return params.hdfs_user + + def get_pid_files(self): +- import status_params ++ from . import status_params + return [status_params.zkfc_pid_file] + + def pre_upgrade_restart(self, env, upgrade_type=None): + Logger.info("Executing Stack Upgrade pre-restart") +- import params ++ from . import params + env.set_params(params) + if check_stack_feature(StackFeature.ZKFC_VERSION_ADVERTISED, params.version_for_stack_feature_checks): + stack_select.select_packages(params.version) +@@ -175,16 +175,16 @@ + @OsFamilyImpl(os_family=OSConst.WINSRV_FAMILY) + class ZkfcSlaveWindows(ZkfcSlave): + def start(self, env): +- import params ++ from . import params + self.configure(env) + Service(params.zkfc_win_service_name, action="start") + + def stop(self, env): +- import params ++ from . import params + Service(params.zkfc_win_service_name, action="stop") + + def status(self, env): +- import status_params ++ from . import status_params + from resource_management.libraries.functions.windows_service_utils import check_windows_service_status + + env.set_params(status_params) +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/alerts/alert_hive_interactive_thrift_port.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/alerts/alert_hive_interactive_thrift_port.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/alerts/alert_hive_interactive_thrift_port.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/alerts/alert_hive_interactive_thrift_port.py 2022-07-11 00:52:34.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + """ + Licensed to the Apache Software Foundation (ASF) under one +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/alerts/alert_hive_metastore.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/alerts/alert_hive_metastore.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/alerts/alert_hive_metastore.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/alerts/alert_hive_metastore.py 2022-07-11 00:52:34.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + """ + Licensed to the Apache Software Foundation (ASF) under one +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/alerts/alert_hive_thrift_port.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/alerts/alert_hive_thrift_port.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/alerts/alert_hive_thrift_port.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/alerts/alert_hive_thrift_port.py 2022-07-11 00:52:34.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + """ + Licensed to the Apache Software Foundation (ASF) under one +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/alerts/alert_llap_app_status.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/alerts/alert_llap_app_status.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/alerts/alert_llap_app_status.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/alerts/alert_llap_app_status.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + """ + Licensed to the Apache Software Foundation (ASF) under one +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/alerts/alert_webhcat_server.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/alerts/alert_webhcat_server.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/alerts/alert_webhcat_server.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/alerts/alert_webhcat_server.py 2022-07-11 00:52:34.000000000 +0800 +@@ -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 ambari_simplejson as json # simplejson is much faster comparing to Python 2.6 json module and has the same functions set. + import socket + import time +-import urllib2 ++import urllib.request, urllib.error, urllib.parse + import traceback + import logging + +@@ -122,7 +122,7 @@ + smokeuser = configurations[SMOKEUSER_KEY] + + # webhcat always uses http, never SSL +- query_url = "http://{0}:{1}/templeton/v1/status?user.name={2}".format(host_name, webhcat_port, smokeuser) ++ query_url = "http://{}:{}/templeton/v1/status?user.name={}".format(host_name, webhcat_port, smokeuser) + + # initialize + total_time = 0 +@@ -187,11 +187,11 @@ + try: + # execute the query for the JSON that includes WebHCat status + start_time = time.time() +- url_response = urllib2.urlopen(query_url, timeout=connection_timeout) ++ url_response = urllib.request.urlopen(query_url, timeout=connection_timeout) + total_time = time.time() - start_time + + json_response = json.loads(url_response.read()) +- except urllib2.HTTPError as httpError: ++ except urllib.error.HTTPError as httpError: + label = CRITICAL_HTTP_MESSAGE.format(httpError.code, query_url, traceback.format_exc()) + return (RESULT_CODE_CRITICAL, [label]) + except: +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hcat_client.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hcat_client.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hcat_client.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hcat_client.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + + """ + +-from hcat import hcat ++from .hcat import hcat + from ambari_commons import OSConst + from ambari_commons.os_family_impl import OsFamilyImpl + from resource_management.core.logger import Logger +@@ -31,12 +31,12 @@ + + class HCatClient(Script): + def install(self, env): +- import params ++ from . import params + self.install_packages(env) + self.configure(env) + + def configure(self, env): +- import params ++ from . import params + env.set_params(params) + hcat() + +@@ -62,7 +62,7 @@ + """ + Logger.info("Executing Hive HCat Client Stack Upgrade pre-restart") + +- import params ++ from . import params + env.set_params(params) + + # this function should not execute if the stack version does not support rolling upgrade +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hcat.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hcat.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hcat.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hcat.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + + @OsFamilyFuncImpl(os_family=OSConst.WINSRV_FAMILY) + def hcat(): +- import params ++ from . import params + + XmlConfig("hive-site.xml", + conf_dir = params.hive_conf_dir, +@@ -47,7 +47,7 @@ + + @OsFamilyFuncImpl(os_family=OsFamilyImpl.DEFAULT) + def hcat(): +- import params ++ from . import params + + Directory(params.hive_conf_dir, + create_parents = True, +@@ -73,7 +73,7 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hcat_service_check.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hcat_service_check.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hcat_service_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hcat_service_check.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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,7 +29,7 @@ + + @OsFamilyFuncImpl(os_family=OSConst.WINSRV_FAMILY) + def hcat_service_check(): +- import params ++ from . import params + smoke_cmd = os.path.join(params.stack_root, "Run-SmokeTests.cmd") + service = "HCatalog" + Execute(format("cmd /C {smoke_cmd} {service}"), user=params.webhcat_user, logoutput=True) +@@ -37,7 +37,7 @@ + + @OsFamilyFuncImpl(os_family=OsFamilyImpl.DEFAULT) + def hcat_service_check(): +- import params ++ from . import params + unique = get_unique_id_and_date() + output_file = format("{hive_apps_whs_dir}/hcatsmoke{unique}") + test_cmd = format("fs -test -e {output_file}") +@@ -50,7 +50,7 @@ + + 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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hive_client.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hive_client.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hive_client.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hive_client.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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,14 +23,14 @@ + from resource_management.libraries.functions.constants import StackFeature + from resource_management.libraries.functions.stack_features import check_stack_feature + from resource_management.core.logger import Logger +-from hive import hive ++from .hive import hive + from ambari_commons.os_family_impl import OsFamilyImpl + from ambari_commons import OSConst + from resource_management.core.exceptions import ClientComponentHasNoStatus + + class HiveClient(Script): + def install(self, env): +- import params ++ from . import params + self.install_packages(env) + self.configure(env) + +@@ -38,7 +38,7 @@ + raise ClientComponentHasNoStatus() + + def configure(self, env): +- import params ++ from . import params + env.set_params(params) + hive(name='client') + +@@ -53,7 +53,7 @@ + def pre_upgrade_restart(self, env, upgrade_type=None): + Logger.info("Executing Hive client Stack Upgrade pre-restart") + +- import params ++ from . import params + env.set_params(params) + if params.version and check_stack_feature(StackFeature.ROLLING_UPGRADE, params.version): + stack_select.select_packages(params.version) +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hive_interactive.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hive_interactive.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hive_interactive.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hive_interactive.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + # Python Imports + import os + import glob +-from urlparse import urlparse ++from urllib.parse import urlparse + + # Resource Management and Common Imports + from resource_management.libraries.script.script import Script +@@ -47,7 +47,7 @@ + + from ambari_commons.os_family_impl import OsFamilyFuncImpl, OsFamilyImpl + from ambari_commons import OSConst +-from hive import fill_conf_dir, jdbc_connector ++from .hive import fill_conf_dir, jdbc_connector + + + @OsFamilyFuncImpl(os_family=OSConst.WINSRV_FAMILY) +@@ -59,7 +59,7 @@ + """ + @OsFamilyFuncImpl(os_family=OsFamilyImpl.DEFAULT) + def hive_interactive(name=None): +- import params ++ from . import params + MB_TO_BYTES = 1048576 + + # if warehouse directory is in DFS +@@ -106,7 +106,7 @@ + params.HdfsResource(None, action="execute") + + Directory(params.hive_interactive_etc_dir_prefix, +- mode=0755 ++ mode=0o755 + ) + + Logger.info("Directories to fill with configs: %s" % str(params.hive_conf_dirs_list)) +@@ -121,18 +121,18 @@ + merged_hive_interactive_site.update(params.config['configurations']['hive-site']) + merged_hive_interactive_site.update(params.config['configurations']['hive-interactive-site']) + for item in exclude_list: +- if item in merged_hive_interactive_site.keys(): ++ if item in list(merged_hive_interactive_site.keys()): + del merged_hive_interactive_site[item] + + ''' + Config 'hive.llap.io.memory.size' calculated value in stack_advisor is in MB as of now. We need to + convert it to bytes before we write it down to config file. + ''' +- if 'hive.llap.io.memory.size' in merged_hive_interactive_site.keys(): ++ if 'hive.llap.io.memory.size' in list(merged_hive_interactive_site.keys()): + hive_llap_io_mem_size_in_mb = merged_hive_interactive_site.get("hive.llap.io.memory.size") +- hive_llap_io_mem_size_in_bytes = long(hive_llap_io_mem_size_in_mb) * MB_TO_BYTES ++ hive_llap_io_mem_size_in_bytes = int(hive_llap_io_mem_size_in_mb) * MB_TO_BYTES + merged_hive_interactive_site['hive.llap.io.memory.size'] = hive_llap_io_mem_size_in_bytes +- Logger.info("Converted 'hive.llap.io.memory.size' value from '{0} MB' to '{1} Bytes' before writing " ++ Logger.info("Converted 'hive.llap.io.memory.size' value from '{} MB' to '{} Bytes' before writing " + "it to config file.".format(hive_llap_io_mem_size_in_mb, hive_llap_io_mem_size_in_bytes)) + + ''' +@@ -170,7 +170,7 @@ + configuration_attributes=params.config['configurationAttributes']['tez-interactive-site'], + owner = params.tez_interactive_user, + group = params.user_group, +- mode = 0664) ++ mode = 0o664) + + ''' + Merge properties from hiveserver2-interactive-site into hiveserver2-site +@@ -200,11 +200,11 @@ + # config from there, as Hive2 client shouldn't have that config. + merged_hive_interactive_site_copy = merged_hive_interactive_site.copy() + for item in exclude_list_for_hive2_client: +- if item in merged_hive_interactive_site.keys(): ++ if item in list(merged_hive_interactive_site.keys()): + del merged_hive_interactive_site_copy[item] + + for conf_dir in hive2_conf_dirs_list: +- mode_identified = 0644 if conf_dir == hive2_client_conf_path else 0600 ++ mode_identified = 0o644 if conf_dir == hive2_client_conf_path else 0o600 + if conf_dir == hive2_client_conf_path: + XmlConfig("hive-site.xml", + conf_dir=conf_dir, +@@ -212,7 +212,7 @@ + configuration_attributes=params.config['configurationAttributes']['hive-interactive-site'], + owner=params.hive_user, + group=params.user_group, +- mode=0644) ++ mode=0o644) + else: + merged_hive_interactive_site = update_credential_provider_path(merged_hive_interactive_site, + 'hive-site', +@@ -226,7 +226,7 @@ + configuration_attributes=params.config['configurationAttributes']['hive-interactive-site'], + owner=params.hive_user, + group=params.user_group, +- mode=0600) ++ mode=0o600) + XmlConfig("hiveserver2-site.xml", + conf_dir=conf_dir, + configurations=merged_hiveserver2_interactive_site, +@@ -307,7 +307,7 @@ + File(os.path.join(params.limits_conf_dir, 'hive.conf'), + owner='root', + group='root', +- mode=0644, ++ mode=0o644, + content=Template("hive.conf.j2")) + + if not os.path.exists(params.target_hive_interactive): +@@ -315,9 +315,9 @@ + + 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) + File(params.start_hiveserver2_interactive_path, +- mode=0755, ++ mode=0o755, + content=Template(format('{start_hiveserver2_interactive_script}'))) + + Directory(params.hive_pid_dir, +@@ -325,25 +325,25 @@ + 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_interactive_var_lib, + create_parents=True, + cd_access='a', + owner=params.hive_user, + group=params.user_group, +- mode=0755) ++ mode=0o755) + + """ + Remove 'org.apache.atlas.hive.hook.HiveHook' value from Hive2/hive-site.xml config 'hive.exec.post.hooks', if exists. + """ + def remove_atlas_hook_if_exists(merged_hive_interactive_site): +- if 'hive.exec.post.hooks' in merged_hive_interactive_site.keys(): ++ if 'hive.exec.post.hooks' in list(merged_hive_interactive_site.keys()): + existing_hive_exec_post_hooks = merged_hive_interactive_site.get('hive.exec.post.hooks') + if existing_hive_exec_post_hooks: + hook_splits = existing_hive_exec_post_hooks.split(",") +@@ -351,7 +351,7 @@ + updated_hooks_str = ",".join((str(hook)).strip() for hook in updated_hook_splits) + if updated_hooks_str != existing_hive_exec_post_hooks: + merged_hive_interactive_site['hive.exec.post.hooks'] = updated_hooks_str +- Logger.info("Updated Hive2/hive-site.xml 'hive.exec.post.hooks' value from : '{0}' to : '{1}'" ++ Logger.info("Updated Hive2/hive-site.xml 'hive.exec.post.hooks' value from : '{}' to : '{}'" + .format(existing_hive_exec_post_hooks, updated_hooks_str)) + else: + Logger.info("No change done to Hive2/hive-site.xml 'hive.exec.post.hooks' value.") +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hive_metastore.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hive_metastore.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hive_metastore.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hive_metastore.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + from resource_management.libraries.functions.security_commons import validate_security_config_properties + from resource_management.libraries.functions.security_commons import FILE_TYPE_XML + from resource_management.core.resources.system import File +-from setup_ranger_hive import setup_ranger_hive_metastore_service ++from .setup_ranger_hive import setup_ranger_hive_metastore_service + +-from hive import create_metastore_schema, hive, jdbc_connector +-from hive_service import hive_service ++from .hive import create_metastore_schema, hive, jdbc_connector ++from .hive_service import hive_service + from ambari_commons.os_family_impl import OsFamilyImpl + from ambari_commons import OSConst + +@@ -47,12 +47,12 @@ + + class HiveMetastore(Script): + def install(self, env): +- import params ++ from . import params + self.install_packages(env) + + + def start(self, env, upgrade_type=None): +- import params ++ from . import params + env.set_params(params) + + # writing configurations on start required for securtity +@@ -66,13 +66,13 @@ + setup_ranger_hive_metastore_service() + + def stop(self, env, upgrade_type=None): +- import params ++ from . import params + env.set_params(params) + hive_service('metastore', action='stop', upgrade_type=upgrade_type) + + + def configure(self, env): +- import params ++ from . import params + env.set_params(params) + hive(name = 'metastore') + +@@ -80,7 +80,7 @@ + @OsFamilyImpl(os_family=OSConst.WINSRV_FAMILY) + class HiveMetastoreWindows(HiveMetastore): + def status(self, env): +- import status_params ++ from . import status_params + from resource_management.libraries.functions import check_windows_service_status + check_windows_service_status(status_params.hive_metastore_win_service_name) + +@@ -88,7 +88,7 @@ + @OsFamilyImpl(os_family=OsFamilyImpl.DEFAULT) + class HiveMetastoreDefault(HiveMetastore): + def status(self, env): +- import status_params ++ from . import status_params + from resource_management.libraries.functions import check_process_status + env.set_params(status_params) + +@@ -98,7 +98,7 @@ + + def pre_upgrade_restart(self, env, upgrade_type=None): + Logger.info("Executing Metastore Stack Upgrade pre-restart") +- import params ++ from . import params + + env.set_params(params) + +@@ -127,8 +127,8 @@ + Should not be invoked for a DOWNGRADE; Metastore only supports schema upgrades. + """ + Logger.info("Upgrading Hive Metastore Schema") +- import status_params +- import params ++ from . import status_params ++ from . import params + env.set_params(params) + + # ensure that configurations are written out before trying to upgrade the schema +@@ -171,7 +171,7 @@ + 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_schematool_ver_bin}/schematool") +@@ -195,15 +195,15 @@ + Execute(command, user=params.hive_user, tries=1, environment=env_dict, logoutput=True) + + def get_log_folder(self): +- import params ++ from . import params + return params.hive_log_dir + + def get_user(self): +- import params ++ from . import params + return params.hive_user + + def get_pid_files(self): +- import status_params ++ from . import status_params + return [status_params.hive_metastore_pid] + + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hive.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hive.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hive.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hive.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 os + import glob +-from urlparse import urlparse ++from urllib.parse import urlparse + + from resource_management.libraries.script.script import Script + from resource_management.libraries.resources.hdfs_resource import HdfsResource +@@ -50,16 +50,16 @@ + + @OsFamilyFuncImpl(os_family=OsFamilyImpl.DEFAULT) + def hive(name=None): +- import params ++ from . import params + + install_lzo_if_needed() + + hive_client_conf_path = format("{stack_root}/current/{component_directory}/conf") + # Permissions 644 for conf dir (client) files, and 600 for conf.server +- mode_identified = 0644 if params.hive_config_dir == hive_client_conf_path else 0600 ++ mode_identified = 0o644 if params.hive_config_dir == hive_client_conf_path else 0o600 + + Directory(params.hive_etc_dir_prefix, +- mode=0755 ++ mode=0o755 + ) + + # We should change configurations for client as well as for server. +@@ -104,7 +104,7 @@ + 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: +@@ -116,7 +116,7 @@ + + 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 name != "client": +@@ -127,10 +127,10 @@ + setup_metastore() + + def setup_hiveserver2(): +- import params ++ from . import params + + File(params.start_hiveserver2_path, +- mode=0755, ++ mode=0o755, + content=Template(format('{start_hiveserver2_script}')) + ) + +@@ -138,7 +138,7 @@ + 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_server_conf_dir, +@@ -146,7 +146,7 @@ + configuration_attributes=params.config['configurationAttributes']['hiveserver2-site'], + owner=params.hive_user, + group=params.user_group, +- mode=0600) ++ mode=0o600) + + # copy tarball to HDFS feature not supported + if not (params.stack_version_formatted_major and check_stack_feature(StackFeature.COPY_TARBALL_TO_HDFS, params.stack_version_formatted_major)): +@@ -154,7 +154,7 @@ + type="directory", + action="create_on_execute", + owner=params.webhcat_user, +- mode=0755 ++ mode=0o755 + ) + + # Create webhcat dirs. +@@ -247,7 +247,7 @@ + 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: + params.HdfsResource(params.hive_repl_cmrootdir, +@@ -255,38 +255,38 @@ + action = "create_on_execute", + owner = params.hive_user, + group=params.user_group, +- mode = 01777) ++ mode = 0o1777) + if params.hive_repl_rootdir: + 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") + + def setup_non_client(): +- import params ++ from . import params + + Directory(params.hive_pid_dir, + create_parents = True, + 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) + + if params.hive_jdbc_target is not None and not os.path.exists(params.hive_jdbc_target): + jdbc_connector(params.hive_jdbc_target, params.hive_previous_jdbc_jar) +@@ -294,7 +294,7 @@ + jdbc_connector(params.hive2_jdbc_target, params.hive2_previous_jdbc_jar) + + def setup_metastore(): +- import params ++ from . import params + + if params.hive_metastore_site_supported: + hivemetastore_site_config = get_config("hivemetastore-site") +@@ -305,17 +305,17 @@ + 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_server_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') + ) + +@@ -326,7 +326,7 @@ + Directory (params.hive_exec_scratchdir, + owner = params.hive_user, + create_parents = True, +- mode=0777) ++ mode=0o777) + + if params.hive_repl_cmrootdir: + params.HdfsResource(params.hive_repl_cmrootdir, +@@ -334,19 +334,19 @@ + action = "create_on_execute", + owner = params.hive_user, + group=params.user_group, +- mode = 01777) ++ mode = 0o1777) + if params.hive_repl_rootdir: + params.HdfsResource(params.hive_repl_rootdir, + type = "directory", + action = "create_on_execute", + owner = params.hive_user, + group=params.user_group, +- mode = 0700) ++ mode = 0o700) + if params.hive_repl_cmrootdir or params.hive_repl_rootdir: + params.HdfsResource(None, action="execute") + + def create_metastore_schema(): +- import params ++ from . import params + + if params.sysprep_skip_hive_schema_create: + Logger.info("Skipping creation of Hive Metastore schema as host is sys prepped") +@@ -382,11 +382,11 @@ + Writes configuration files required by Hive. + """ + def fill_conf_dir(component_conf_dir): +- import params ++ from . import params + hive_client_conf_path = os.path.realpath(format("{stack_root}/current/{component_directory}/conf")) + component_conf_dir = os.path.realpath(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 = 0o644 if component_conf_dir == hive_client_conf_path else 0o600 ++ mode_identified_for_dir = 0o755 if component_conf_dir == hive_client_conf_path else 0o700 + Directory(component_conf_dir, + owner=params.hive_user, + group=params.user_group, +@@ -463,7 +463,7 @@ + Shared by Hive Batch, Hive Metastore, and Hive Interactive + :param target: Target of jdbc jar name, which could be for any of the components above. + """ +- import params ++ from . import params + + if not params.jdbc_jar_name: + return +@@ -517,12 +517,12 @@ + pass + + File(target, +- mode = 0644, ++ mode = 0o644, + ) + + @OsFamilyFuncImpl(os_family=OSConst.WINSRV_FAMILY) + def hive(name=None): +- import params ++ from . import params + + XmlConfig("hive-site.xml", + conf_dir = params.hive_conf_dir, +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hive_server_interactive.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hive_server_interactive.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hive_server_interactive.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hive_server_interactive.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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,11 +52,11 @@ + FILE_TYPE_XML + + # Local Imports +-from setup_ranger_hive import setup_ranger_hive +-from hive_service_interactive import hive_service_interactive +-from hive_interactive import hive_interactive +-from hive_server import HiveServerDefault +-from setup_ranger_hive_interactive import setup_ranger_hive_interactive ++from .setup_ranger_hive import setup_ranger_hive ++from .hive_service_interactive import hive_service_interactive ++from .hive_interactive import hive_interactive ++from .hive_server import HiveServerDefault ++from .setup_ranger_hive_interactive import setup_ranger_hive_interactive + + import traceback + +@@ -67,17 +67,17 @@ + @OsFamilyImpl(os_family=OsFamilyImpl.DEFAULT) + class HiveServerInteractiveDefault(HiveServerInteractive): + def install(self, env): +- import params ++ from . import params + self.install_packages(env) + + def configure(self, env): +- import params ++ from . import params + env.set_params(params) + hive_interactive(name='hiveserver2') + + def pre_upgrade_restart(self, env, upgrade_type=None): + Logger.info("Executing Hive Server Interactive Stack Upgrade pre-restart") +- import params ++ from . import params + env.set_params(params) + + if params.version and check_stack_feature(StackFeature.ROLLING_UPGRADE, params.version): +@@ -100,7 +100,7 @@ + params.HdfsResource(None, action="execute") + + def start(self, env, upgrade_type=None): +- import params ++ from . import params + env.set_params(params) + self.configure(env) + +@@ -124,7 +124,7 @@ + + + def stop(self, env, upgrade_type=None): +- import params ++ from . import params + env.set_params(params) + + if params.security_enabled: +@@ -139,7 +139,7 @@ + Logger.info("LLAP stop is skipped as its a restart command") + + def status(self, env): +- import status_params ++ from . import status_params + env.set_params(status_params) + + # We are not doing 'llap' status check done here as part of status check for 'HSI', as 'llap' status +@@ -153,7 +153,7 @@ + Custom command to Restart LLAP + """ + Logger.info("Custom Command to retart LLAP") +- import params ++ from . import params + env.set_params(params) + + if params.security_enabled: +@@ -163,7 +163,7 @@ + self._llap_start(env) + + def _llap_stop(self, env): +- import params ++ from . import params + Logger.info("Stopping LLAP") + + stop_cmd = ["slider", "stop", params.llap_app_name] +@@ -187,7 +187,7 @@ + Controls the start of LLAP. + """ + def _llap_start(self, env, cleanup=False): +- import params ++ from . import params + env.set_params(params) + + if params.hive_server_interactive_ha: +@@ -201,10 +201,10 @@ + status = self.check_llap_app_status_in_llap_tp(params.llap_app_name, 2, params.hive_server_interactive_ha) + + if status: +- Logger.info("LLAP app '{0}' is already running.".format(params.llap_app_name)) ++ Logger.info("LLAP app '{}' is already running.".format(params.llap_app_name)) + return True + else: +- Logger.info("LLAP app '{0}' is not running. llap will be started.".format(params.llap_app_name)) ++ Logger.info("LLAP app '{}' is not running. llap will be started.".format(params.llap_app_name)) + pass + + # Call for cleaning up the earlier run(s) LLAP package folders. +@@ -226,13 +226,13 @@ + # starts containers one by one and excludes the nodes it gets (adding a delay of ~2sec./machine). When the LLAP + # container memory size configuration is more than half of YARN node memory, AA is implicit and should be avoided. + slider_placement = 4 +- if long(params.llap_daemon_container_size) > (0.5 * long(params.yarn_nm_mem)): ++ if int(params.llap_daemon_container_size) > (0.5 * int(params.yarn_nm_mem)): + slider_placement = 0 +- Logger.info("Setting slider_placement : 0, as llap_daemon_container_size : {0} > 0.5 * " +- "YARN NodeManager Memory({1})".format(params.llap_daemon_container_size, params.yarn_nm_mem)) ++ Logger.info("Setting slider_placement : 0, as llap_daemon_container_size : {} > 0.5 * " ++ "YARN NodeManager Memory({})".format(params.llap_daemon_container_size, params.yarn_nm_mem)) + else: +- Logger.info("Setting slider_placement: 4, as llap_daemon_container_size : {0} <= 0.5 * " +- "YARN NodeManager Memory({1})".format(params.llap_daemon_container_size, params.yarn_nm_mem)) ++ Logger.info("Setting slider_placement: 4, as llap_daemon_container_size : {} <= 0.5 * " ++ "YARN NodeManager Memory({})".format(params.llap_daemon_container_size, params.yarn_nm_mem)) + cmd += format(" --slider-placement {slider_placement} --skiphadoopversion --skiphbasecp --instances {params.num_llap_daemon_running_nodes}") + + # Setup the logger for the ga version only +@@ -241,7 +241,7 @@ + cmd += format(" --instances {params.num_llap_nodes}") + if params.security_enabled: + llap_keytab_splits = params.hive_llap_keytab_file.split("/") +- Logger.debug("llap_keytab_splits : {0}".format(llap_keytab_splits)) ++ Logger.debug("llap_keytab_splits : {}".format(llap_keytab_splits)) + slider_keytab = llap_keytab_splits[-1] + cmd += format(" --slider-keytab-dir .slider/keytabs/{params.hive_user}/ --slider-keytab " + "{slider_keytab} --slider-principal {params.hive_llap_principal}") +@@ -286,7 +286,7 @@ + + Logger.info(format("Run file path: {run_file_path}")) + Execute(run_file_path, user=params.hive_user, logoutput=True) +- Logger.info("Submitted LLAP app name : {0}".format(params.llap_app_name)) ++ Logger.info("Submitted LLAP app name : {}".format(params.llap_app_name)) + + # We need to check the status of LLAP app to figure out it got + # launched properly and is in running state. Then go ahead with Hive Interactive Server start. +@@ -295,10 +295,10 @@ + else: + status = self.check_llap_app_status_in_llap_tp(params.llap_app_name, params.num_retries_for_checking_llap_status) + if status: +- Logger.info("LLAP app '{0}' deployed successfully.".format(params.llap_app_name)) ++ Logger.info("LLAP app '{}' deployed successfully.".format(params.llap_app_name)) + return True + else: +- Logger.error("LLAP app '{0}' deployment unsuccessful.".format(params.llap_app_name)) ++ Logger.error("LLAP app '{}' deployment unsuccessful.".format(params.llap_app_name)) + return False + except: + # Attempt to clean up the packaged application, or potentially rename it with a .bak +@@ -319,7 +319,7 @@ + """ + def _cleanup_past_llap_package_dirs(self): + try: +- import params ++ from . import params + Logger.info("Determining previous run 'LLAP package' folder(s) to be deleted ....") + llap_package_folder_name_prefix = "llap-slider" # Package name is like : llap-sliderYYYY-MM-DD-HH:MM:SS + num_folders_to_retain = 3 # Hardcoding it as of now, as no considerable use was found to provide an env param. +@@ -328,7 +328,7 @@ + + file_names.sort() + del file_names[-num_folders_to_retain:] # Ignore 'num_folders_to_retain' latest package folders. +- Logger.info("Previous run 'LLAP package' folder(s) to be deleted = {0}".format(file_names)) ++ Logger.info("Previous run 'LLAP package' folder(s) to be deleted = {}".format(file_names)) + + if file_names: + for path in file_names: +@@ -338,7 +338,7 @@ + ignore_failures = True + ) + else: +- Logger.info("No '{0}*' folder deleted.".format(llap_package_folder_name_prefix)) ++ Logger.info("No '{}*' folder deleted.".format(llap_package_folder_name_prefix)) + except: + Logger.exception("Exception while doing cleanup for past 'LLAP package(s)':") + +@@ -348,7 +348,7 @@ + Does kinit and copies keytab for Hive/LLAP to HDFS. + """ + def setup_security(self): +- import params ++ from . import params + + self.do_kinit() + +@@ -357,7 +357,7 @@ + Execute(slider_keytab_install_cmd, user=params.hive_user) + + def do_kinit(self): +- import params ++ from . import params + + hive_interactive_kinit_cmd = format("{kinit_path_local} -kt {params.hive_server2_keytab} {params.hive_principal}; ") + Execute(hive_interactive_kinit_cmd, user=params.hive_user) +@@ -366,13 +366,13 @@ + Get llap app status data for LLAP Tech Preview code base. + """ + def _get_llap_app_status_info_in_llap_tp(self, app_name): +- import status_params ++ from . import status_params + LLAP_APP_STATUS_CMD_TIMEOUT = 0 + + llap_status_cmd = format("{stack_root}/current/hive-server2-hive2/bin/hive --service llapstatus --name {app_name} --findAppTimeout {LLAP_APP_STATUS_CMD_TIMEOUT}") + code, output, error = shell.checked_call(llap_status_cmd, user=status_params.hive_user, stderr=subprocess32.PIPE, + logoutput=False) +- Logger.info("Received 'llapstatus' command 'output' : {0}".format(output)) ++ Logger.info("Received 'llapstatus' command 'output' : {}".format(output)) + if code == 0: + return self._make_valid_json(output) + else: +@@ -389,7 +389,7 @@ + 'refresh_rate' : Frequency of polling for llapstatus. + """ + def _get_llap_app_status_info_in_llap_ga(self, percent_desired_instances_to_be_up, total_timeout, refresh_rate): +- import status_params ++ from . import status_params + + # llapstatus comamnd : llapstatus -w -r -i -t + # -w : Watch mode waits until all LLAP daemons are running or subset of the nodes are running (threshold can be specified via -r option) (Default wait until all nodes are running) +@@ -400,7 +400,7 @@ + # example : llapstatus -w -r 0.8 -i 2 -t 150 + llap_status_cmd = format("{stack_root}/current/hive-server2-hive2/bin/hive --service llapstatus -w -r {percent_desired_instances_to_be_up} -i {refresh_rate} -t {total_timeout}") + Logger.info("\n\n\n\n\n"); +- Logger.info("LLAP status command : {0}".format(llap_status_cmd)) ++ Logger.info("LLAP status command : {}".format(llap_status_cmd)) + code, output, error = shell.checked_call(llap_status_cmd, user=status_params.hive_user, quiet=True, stderr=subprocess32.PIPE, + logoutput=True) + +@@ -517,10 +517,10 @@ + curr_time = time.time() + num_retries = int(num_retries) + if num_retries <= 0: +- Logger.info("Read 'num_retries' as : {0}. Setting it to : {1}".format(num_retries, 2)) ++ Logger.info("Read 'num_retries' as : {}. Setting it to : {}".format(num_retries, 2)) + num_retries = 2 + if num_retries > 20: +- Logger.info("Read 'num_retries' as : {0}. Setting it to : {1}".format(num_retries, 20)) ++ Logger.info("Read 'num_retries' as : {}. Setting it to : {}".format(num_retries, 20)) + num_retries = 20 + + @retry(times=num_retries, sleep_time=2, err_class=Fail) +@@ -531,8 +531,8 @@ + try: + status = do_retries() + return status +- except Exception, e: +- Logger.info("LLAP app '{0}' did not come up after a wait of {1} seconds.".format(llap_app_name, ++ except Exception as e: ++ Logger.info("LLAP app '{}' did not come up after a wait of {} seconds.".format(llap_app_name, + time.time() - curr_time)) + traceback.print_exc() + return False +@@ -540,7 +540,7 @@ + def check_llap_app_status_in_llap_ga(self, llap_app_name, num_retries, return_immediately_if_stopped=False): + curr_time = time.time() + total_timeout = int(num_retries) * 20; # Total wait time while checking the status via llapstatus command +- Logger.debug("Calculated 'total_timeout' : {0} using config 'num_retries_for_checking_llap_status' : {1}".format(total_timeout, num_retries)) ++ Logger.debug("Calculated 'total_timeout' : {} using config 'num_retries_for_checking_llap_status' : {}".format(total_timeout, num_retries)) + refresh_rate = 2 # Frequency of checking the llapstatus + percent_desired_instances_to_be_up = 80 # Out of 100. + llap_app_info = self._get_llap_app_status_info_in_llap_ga(percent_desired_instances_to_be_up/100.0, total_timeout, refresh_rate) +@@ -552,11 +552,11 @@ + return False + + def get_log_folder(self): +- import params ++ from . import params + return params.hive_log_dir + + def get_user(self): +- import params ++ from . import params + return params.hive_user + + def _verify_llap_app_status(self, llap_app_info, llap_app_name, return_immediately_if_stopped, curr_time): +@@ -572,7 +572,7 @@ + return False + if llap_app_info['state'].upper() == 'RUNNING_ALL': + Logger.info( +- "LLAP app '{0}' in '{1}' state.".format(llap_app_name, llap_app_info['state'])) ++ "LLAP app '{}' in '{}' state.".format(llap_app_name, llap_app_info['state'])) + return True + elif llap_app_info['state'].upper() == 'RUNNING_PARTIAL': + # Check how many instances were up. +@@ -581,39 +581,39 @@ + desired_instances = llap_app_info['desiredInstances'] + else: + Logger.info( +- "LLAP app '{0}' is in '{1}' state, but 'instances' information not available in JSON received. " \ ++ "LLAP app '{}' is in '{}' state, but 'instances' information not available in JSON received. " \ + "Exiting ....".format(llap_app_name, llap_app_info['state'])) + Logger.info(llap_app_info) + return False + if desired_instances == 0: +- Logger.info("LLAP app '{0}' desired instance are set to 0. Exiting ....".format(llap_app_name)) ++ Logger.info("LLAP app '{}' desired instance are set to 0. Exiting ....".format(llap_app_name)) + return False + + percentInstancesUp = 0 + if live_instances > 0: + percentInstancesUp = float(live_instances) / desired_instances * 100 + if percentInstancesUp >= percent_desired_instances_to_be_up: +- Logger.info("LLAP app '{0}' in '{1}' state. Live Instances : '{2}' >= {3}% of Desired Instances : " \ +- "'{4}'.".format(llap_app_name, llap_app_info['state'], ++ Logger.info("LLAP app '{}' in '{}' state. Live Instances : '{}' >= {}% of Desired Instances : " \ ++ "'{}'.".format(llap_app_name, llap_app_info['state'], + llap_app_info['liveInstances'], + percent_desired_instances_to_be_up, + llap_app_info['desiredInstances'])) + return True + else: +- Logger.info("LLAP app '{0}' in '{1}' state. Live Instances : '{2}'. Desired Instances : " \ +- "'{3}' after {4} secs.".format(llap_app_name, llap_app_info['state'], ++ Logger.info("LLAP app '{}' in '{}' state. Live Instances : '{}'. Desired Instances : " \ ++ "'{}' after {} secs.".format(llap_app_name, llap_app_info['state'], + llap_app_info['liveInstances'], + llap_app_info['desiredInstances'], + time.time() - curr_time)) +- raise Fail("App state is RUNNING_PARTIAL. Live Instances : '{0}', Desired Instance : '{1}'".format(llap_app_info['liveInstances'], ++ raise Fail("App state is RUNNING_PARTIAL. Live Instances : '{}', Desired Instance : '{}'".format(llap_app_info['liveInstances'], + llap_app_info['desiredInstances'])) + elif llap_app_info['state'].upper() in ['APP_NOT_FOUND', 'LAUNCHING', 'COMPLETE']: +- status_str = format("LLAP app '{0}' current state is {1}.".format(llap_app_name, llap_app_info['state'])) ++ status_str = format("LLAP app '{}' current state is {}.".format(llap_app_name, llap_app_info['state'])) + Logger.info(status_str) + raise Fail(status_str) + else: # Covers any unknown that we get. + Logger.info( +- "LLAP app '{0}' current state is '{1}'. Expected : 'RUNNING'.".format(llap_app_name, llap_app_info['state'])) ++ "LLAP app '{}' current state is '{}'. Expected : 'RUNNING'.".format(llap_app_name, llap_app_info['state'])) + return False + + @OsFamilyImpl(os_family=OSConst.WINSRV_FAMILY) +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hive_server.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hive_server.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hive_server.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hive_server.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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,13 +31,13 @@ + from ambari_commons import OSCheck, OSConst + if OSCheck.is_windows_family(): + from resource_management.libraries.functions.windows_service_utils import check_windows_service_status +-from setup_ranger_hive import setup_ranger_hive ++from .setup_ranger_hive import setup_ranger_hive + from ambari_commons.os_family_impl import OsFamilyImpl + from resource_management.core.logger import Logger + +-import hive_server_upgrade +-from hive import hive +-from hive_service import hive_service ++from . import hive_server_upgrade ++from .hive import hive ++from .hive_service import hive_service + from resource_management.core.resources.zkmigrator import ZkMigrator + + +@@ -46,7 +46,7 @@ + self.install_packages(env) + + def configure(self, env): +- import params ++ from . import params + env.set_params(params) + hive(name='hiveserver2') + +@@ -54,25 +54,25 @@ + @OsFamilyImpl(os_family=OSConst.WINSRV_FAMILY) + class HiveServerWindows(HiveServer): + def start(self, env): +- import params ++ from . import params + env.set_params(params) + self.configure(env) # FOR SECURITY + hive_service('hiveserver2', action='start') + + def stop(self, env): +- import params ++ from . import params + env.set_params(params) + hive_service('hiveserver2', action='stop') + + def status(self, env): +- import status_params ++ from . import status_params + check_windows_service_status(status_params.hive_server_win_service_name) + + + @OsFamilyImpl(os_family=OsFamilyImpl.DEFAULT) + class HiveServerDefault(HiveServer): + def start(self, env, upgrade_type=None): +- import params ++ from . import params + env.set_params(params) + self.configure(env) # FOR SECURITY + +@@ -81,7 +81,7 @@ + + + def stop(self, env, upgrade_type=None): +- import params ++ from . import params + env.set_params(params) + + # always de-register the old hive instance so that ZK can route clients +@@ -99,7 +99,7 @@ + + + def status(self, env): +- import status_params ++ from . import status_params + env.set_params(status_params) + + # Recursively check all existing gmetad pid files +@@ -108,7 +108,7 @@ + + def pre_upgrade_restart(self, env, upgrade_type=None): + Logger.info("Executing Hive Server Stack Upgrade pre-restart") +- import params ++ from . import params + env.set_params(params) + + if params.version and check_stack_feature(StackFeature.ROLLING_UPGRADE, params.version): +@@ -139,7 +139,7 @@ + return path + + def disable_security(self, env): +- import params ++ from . import params + zkmigrator = ZkMigrator(params.hive_zookeeper_quorum, params.java_exec, params.java64_home, params.jaas_file, params.hive_user) + if params.hive_cluster_token_zkstore: + zkmigrator.set_acls(self._base_node(params.hive_cluster_token_zkstore), 'world:anyone:crdwa') +@@ -149,15 +149,15 @@ + 'world:anyone:crdwa') + + def get_log_folder(self): +- import params ++ from . import params + return params.hive_log_dir + + def get_user(self): +- import params ++ from . import params + return params.hive_user + + def get_pid_files(self): +- import status_params ++ from . import status_params + return [status_params.hive_pid] + + if __name__ == "__main__": +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hive_server_upgrade.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hive_server_upgrade.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hive_server_upgrade.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hive_server_upgrade.py 2022-07-11 00:52:33.000000000 +0800 +@@ -45,7 +45,7 @@ + This function will obtain the Kerberos ticket if security is enabled. + :return: + """ +- import params ++ from . import params + + Logger.info('HiveServer2 executing "deregister" command to complete upgrade...') + +@@ -77,7 +77,7 @@ + :param stack_version_formatted: Exact stack-version to use in the new path + :return: Hive execute path for the exact stack-version + """ +- import params ++ from . import params + + hive_execute_path = params.execute_path + formatted_stack_version = format_stack_version(stack_version_formatted) +@@ -101,7 +101,7 @@ + + :return: the hiveserver2 version, returned by "hive --version" + """ +- import params ++ from . import params + + try: + # When downgrading the source version should be the version we are downgrading from +@@ -116,19 +116,19 @@ + version_hive_bin = format('{stack_root}/{source_version}/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.') + + if return_code != 0: +- raise Fail('Unable to determine the current HiveServer2 version because of a non-zero return code of {0}'.format(str(return_code))) ++ raise Fail('Unable to determine the current HiveServer2 version because of a non-zero return code of {}'.format(str(return_code))) + +- match = re.search('^(Hive) ([0-9]+.[0-9]+.\S+)', output, re.MULTILINE) ++ match = re.search(r'^(Hive) ([0-9]+.[0-9]+.\S+)', output, re.MULTILINE) + + if match: + current_hive_server_version = match.group(2) + return current_hive_server_version + else: +- raise Fail('The extracted hiveserver2 version "{0}" does not matching any known pattern'.format(output)) ++ raise Fail('The extracted hiveserver2 version "{}" does not matching any known pattern'.format(output)) + + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hive_service_interactive.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hive_service_interactive.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hive_service_interactive.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hive_service_interactive.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + from ambari_commons import OSConst + + # Local Imports +-from hive_service import check_fs_root ++from .hive_service import check_fs_root + + + @OsFamilyFuncImpl(os_family=OSConst.WINSRV_FAMILY) +@@ -40,8 +40,8 @@ + + @OsFamilyFuncImpl(os_family=OsFamilyImpl.DEFAULT) + def hive_service_interactive(name, action='start', upgrade_type=None): +- import params +- import status_params ++ from . import params ++ from . import status_params + + pid_file = status_params.hive_interactive_pid + cmd = format("{start_hiveserver2_interactive_path} {hive_pid_dir}/hive-server2-interactive.out {hive_log_dir}/hive-server2-interactive.err {pid_file} {hive_server_interactive_conf_dir} {hive_log_dir}") +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hive_service.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hive_service.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hive_service.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hive_service.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + + @OsFamilyFuncImpl(os_family=OSConst.WINSRV_FAMILY) + def hive_service(name, action='start', upgrade_type=None): +- import params ++ from . import params + if name == 'metastore': + if action == 'start' or action == 'stop': + Service(params.hive_metastore_win_service_name, action=action) +@@ -54,8 +54,8 @@ + @OsFamilyFuncImpl(os_family=OsFamilyImpl.DEFAULT) + def hive_service(name, action='start', upgrade_type=None): + +- import params +- import status_params ++ from . import params ++ from . import status_params + + if name == 'metastore': + pid_file = status_params.hive_metastore_pid +@@ -138,7 +138,7 @@ + ) + + def validate_connection(target_path_to_jdbc, hive_lib_path): +- import params ++ from . import params + + path_to_jdbc = target_path_to_jdbc + if not params.jdbc_jar_name: +@@ -164,7 +164,7 @@ + + + def check_fs_root(conf_dir, execution_path): +- import params ++ from . import params + + if not params.manage_hive_fsroot: + Logger.info("Skipping fs root check as cluster-env/manage_hive_fsroot is disabled") +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/__init__.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/__init__.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/__init__.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/__init__.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/mysql_server.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/mysql_server.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/mysql_server.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/mysql_server.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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,40 +20,40 @@ + + import sys + import os +-import mysql_users ++from . import mysql_users + from resource_management.libraries.script.script import Script +-from mysql_service import mysql_service +-from mysql_utils import mysql_configure ++from .mysql_service import mysql_service ++from .mysql_utils import mysql_configure + + + class MysqlServer(Script): + def install(self, env): +- import params ++ from . import params + self.install_packages(env) + self.configure(env) + + def clean(self, env): +- import params ++ from . import params + env.set_params(params) + mysql_users.mysql_deluser() + + def configure(self, env): +- import params ++ from . import params + env.set_params(params) + mysql_configure() + + def start(self, env): +- import params ++ from . import params + env.set_params(params) + mysql_service(action='start') + + def stop(self, env): +- import params ++ from . import params + env.set_params(params) + mysql_service(action='stop') + + def status(self, env): +- import status_params ++ from . import status_params + env.set_params(status_params) + + mysql_service(action='status') +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/mysql_service.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/mysql_service.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/mysql_service.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/mysql_service.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 get_daemon_name(): +- import status_params ++ from . import status_params + + for service_file_template in status_params.SERVICE_FILE_TEMPLATES: + for possible_daemon_name in status_params.POSSIBLE_DAEMON_NAMES: +@@ -47,14 +47,14 @@ + except Fail: + raise ComponentIsNotRunning() + elif action == 'stop': +- import params ++ from . import params + Execute(cmd, + logoutput = True, + only_if = status_cmd, + sudo = True, + ) + elif action == 'start': +- import params ++ from . import params + Execute(cmd, + logoutput = True, + not_if = status_cmd, +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/mysql_users.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/mysql_users.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/mysql_users.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/mysql_users.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + from resource_management.core.resources.system import Execute, File + from resource_management.core.source import StaticFile + from resource_management.libraries.functions.format import format +-from mysql_service import get_daemon_name ++from .mysql_service import get_daemon_name + + # Used to add hive access to the needed components + def mysql_adduser(): +- import params ++ from . import params + + File(params.mysql_adduser_path, +- mode=0755, ++ mode=0o755, + content=StaticFile('addMysqlUser.sh') + ) + hive_server_host = format("{hive_server_host}") +@@ -51,10 +51,10 @@ + + # Removes hive access from components + def mysql_deluser(): +- import params ++ from . import params + + File(params.mysql_deluser_path, +- mode=0755, ++ mode=0o755, + content=StaticFile('removeMysqlUser.sh') + ) + hive_server_host = format("{hive_server_host}") +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/mysql_utils.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/mysql_utils.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/mysql_utils.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/mysql_utils.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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,10 +19,10 @@ + """ + + from resource_management.core.resources.system import Execute +-import mysql_users ++from . import mysql_users + + def mysql_configure(): +- import params ++ from . import params + + # required for running hive + replace_bind_address = ('sed','-i','s|^bind-address[ \t]*=.*|bind-address = 0.0.0.0|',params.mysql_configname) +@@ -32,4 +32,3 @@ + + # this also will start mysql-server + mysql_users.mysql_adduser() +- +\ 文件尾没有换行符 +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/params_linux.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/params_linux.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/params_linux.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/params_linux.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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,11 +17,11 @@ + limitations under the License. + + """ +-import status_params ++from . import status_params + import ambari_simplejson as json # simplejson is much faster comparing to Python 2.6 json module and has the same functions set. + import os + +-from urlparse import urlparse ++from urllib.parse import urlparse + + from ambari_commons.constants import AMBARI_SUDO_BINARY + from ambari_commons.os_check import OSCheck +@@ -198,17 +198,17 @@ + # DON'T CHANGE THESE VARIABLE NAMES + # Values don't change from those in copy_tarball.py + webhcat_apps_dir = "/apps/webhcat" +-hive_tar_source = "{0}/{1}/hive/hive.tar.gz".format(STACK_ROOT_PATTERN, STACK_VERSION_PATTERN) +-pig_tar_source = "{0}/{1}/pig/pig.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) +-pig_tar_dest_file = "/{0}/apps/{1}/pig/pig.tar.gz".format(STACK_NAME_PATTERN, STACK_VERSION_PATTERN) +- +-hadoop_streaming_tar_source = "{0}/{1}/hadoop-mapreduce/hadoop-streaming.jar".format(STACK_ROOT_PATTERN, STACK_VERSION_PATTERN) +-sqoop_tar_source = "{0}/{1}/sqoop/sqoop.tar.gz".format(STACK_ROOT_PATTERN, STACK_VERSION_PATTERN) +-hadoop_streaming_tar_dest_dir = "/{0}/apps/{1}/mapreduce/".format(STACK_NAME_PATTERN,STACK_VERSION_PATTERN) +-sqoop_tar_dest_dir = "/{0}/apps/{1}/sqoop/".format(STACK_NAME_PATTERN, STACK_VERSION_PATTERN) ++hive_tar_source = "{}/{}/hive/hive.tar.gz".format(STACK_ROOT_PATTERN, STACK_VERSION_PATTERN) ++pig_tar_source = "{}/{}/pig/pig.tar.gz".format(STACK_ROOT_PATTERN, STACK_VERSION_PATTERN) ++hive_tar_dest_file = "/{}/apps/{}/hive/hive.tar.gz".format(STACK_NAME_PATTERN,STACK_VERSION_PATTERN) ++pig_tar_dest_file = "/{}/apps/{}/pig/pig.tar.gz".format(STACK_NAME_PATTERN, STACK_VERSION_PATTERN) ++ ++hadoop_streaming_tar_source = "{}/{}/hadoop-mapreduce/hadoop-streaming.jar".format(STACK_ROOT_PATTERN, STACK_VERSION_PATTERN) ++sqoop_tar_source = "{}/{}/sqoop/sqoop.tar.gz".format(STACK_ROOT_PATTERN, STACK_VERSION_PATTERN) ++hadoop_streaming_tar_dest_dir = "/{}/apps/{}/mapreduce/".format(STACK_NAME_PATTERN,STACK_VERSION_PATTERN) ++sqoop_tar_dest_dir = "/{}/apps/{}/sqoop/".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 +@@ -242,7 +242,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'] + +@@ -512,7 +512,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 + #Parameter for custom warehouse directory permissions. Permissions are in octal format and need to be converted to decimal + hive_apps_whs_mode = int(default('/configurations/hive-site/custom.hive.warehouse.mode', '0777'), 8) + hive_apps_whs_dir = config['configurations']['hive-site']["hive.metastore.warehouse.dir"] +@@ -615,9 +615,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 + #for create_hdfs_directory + security_param = "true" if security_enabled else "false" + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/params.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/params.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/params.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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,9 +22,9 @@ + from resource_management.libraries.functions.copy_tarball import get_sysprep_skip_copy_tarballs_hdfs + + if OSCheck.is_windows_family(): +- from params_windows import * ++ from .params_windows import * + else: +- from params_linux import * ++ from .params_linux import * + + host_sys_prepped = default("/ambariLevelParams/host_sys_prepped", False) + sysprep_skip_hive_schema_create = host_sys_prepped and default("/configurations/cluster-env/sysprep_skip_hive_schema_create", False) +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/params_windows.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/params_windows.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/params_windows.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/params_windows.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 resource_management.libraries.functions.version import format_stack_version + from resource_management.libraries.script.script import Script +-from status_params import * ++from .status_params import * + + # server configurations + config = Script.get_config() +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/pre_upgrade.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/pre_upgrade.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/pre_upgrade.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/pre_upgrade.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + class HivePreUpgrade(Script): + + def backup_hive_metastore_database_local(self, env): +- import params ++ from . import params + env.set_params(params) + + self.__dump_mysql_db(True) + + def backup_hive_metastore_database_external(self, env): +- import params ++ from . import params + env.set_params(params) + + is_db_here = params.hostname in params.hive_jdbc_connection_url +@@ -87,7 +87,7 @@ + Logger.warning(format("\"{command}\"")) + + def convert_tables(self, env): +- import params ++ from . import params + env.set_params(params) + + source_version = upgrade_summary.get_source_version(service_name = "HIVE") +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/service_check.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/service_check.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/service_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/service_check.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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,8 +22,8 @@ + import time + from ambari_commons import subprocess32 + +-from hcat_service_check import hcat_service_check +-from webhcat_service_check import webhcat_service_check ++from .hcat_service_check import hcat_service_check ++from .webhcat_service_check import webhcat_service_check + from ambari_commons import OSConst + from ambari_commons.os_family_impl import OsFamilyImpl + from resource_management.core.logger import Logger +@@ -42,7 +42,7 @@ + @OsFamilyImpl(os_family=OSConst.WINSRV_FAMILY) + class HiveServiceCheckWindows(HiveServiceCheck): + def service_check(self, env): +- import params ++ from . import params + env.set_params(params) + smoke_cmd = os.path.join(params.stack_root,"Run-SmokeTests.cmd") + service = "HIVE" +@@ -56,11 +56,11 @@ + class HiveServiceCheckDefault(HiveServiceCheck): + + def __init__(self): +- super(HiveServiceCheckDefault, self).__init__() ++ super().__init__() + Logger.initialize_logger() + + def service_check(self, env): +- import params ++ from . import params + env.set_params(params) + + if params.security_enabled: +@@ -100,9 +100,9 @@ + webhcat_service_check() + + def check_hive_server(self, env, server_component_name, kinit_cmd, address_list, server_port, ssl_keystore, ssl_password): +- import params ++ from . import params + env.set_params(params) +- Logger.info("Server Address List : {0}, Port : {1}, SSL KeyStore : {2}".format(address_list, server_port, ssl_keystore)) ++ Logger.info("Server Address List : {}, Port : {}, SSL KeyStore : {}".format(address_list, server_port, ssl_keystore)) + + if not address_list: + raise Fail("Can not find any "+server_component_name+" ,host. Please check configuration.") +@@ -112,7 +112,7 @@ + start_time = time.time() + end_time = start_time + SOCKET_WAIT_SECONDS + +- Logger.info("Waiting for the {0} to start...".format(server_component_name)) ++ Logger.info("Waiting for the {} to start...".format(server_component_name)) + + workable_server_available = False + i = 0 +@@ -126,10 +126,10 @@ + ssl_password=ssl_password, ldap_username=params.hive_ldap_user, + ldap_password=params.hive_ldap_passwd, pam_username=params.hive_pam_username, + pam_password=params.hive_pam_password) +- Logger.info("Successfully connected to {0} on port {1}".format(address, server_port)) ++ Logger.info("Successfully connected to {} on port {}".format(address, server_port)) + workable_server_available = True + except: +- Logger.info("Connection to {0} on port {1} failed".format(address, server_port)) ++ Logger.info("Connection to {} on port {} failed".format(address, server_port)) + time.sleep(5) + + i += 1 +@@ -139,17 +139,17 @@ + elapsed_time = time.time() - start_time + + if not workable_server_available: +- raise Fail("Connection to '{0}' on host: {1} and port {2} failed after {3} seconds" ++ raise Fail("Connection to '{}' on host: {} and port {} failed after {} seconds" + .format(server_component_name, params.hostname, server_port, elapsed_time)) + +- Logger.info("Successfully stayed connected to '{0}' on host: {1} and port {2} after {3} seconds" ++ Logger.info("Successfully stayed connected to '{}' on host: {} and port {} after {} seconds" + .format(server_component_name, params.hostname, server_port, elapsed_time)) + + """ + Performs Service check for LLAP app + """ + def check_llap(self, env, kinit_cmd, address, port, key, hive_auth="NOSASL", transport_mode="binary", http_endpoint="cliservice"): +- import params ++ from . import params + env.set_params(params) + + unique_id = get_unique_id_and_date() +@@ -180,7 +180,7 @@ + # Append LLAP SQL script path + llap_cmd += format(" --hiveconf \"hiveLlapServiceCheck={unique_id}\" -f {stack_root}/current/hive-server2-hive2/scripts/llap/sql/serviceCheckScript.sql") + # Append grep patterns for detecting failure +- llap_cmd += " -e '' 2>&1| awk '{print}'|grep -i -e 'Invalid status\|Invalid URL\|command not found\|Connection refused'" ++ llap_cmd += r" -e '' 2>&1| awk '{print}'|grep -i -e 'Invalid status\|Invalid URL\|command not found\|Connection refused'" + + Execute(llap_cmd, + user=params.hive_user, +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/setup_ranger_hive_interactive.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/setup_ranger_hive_interactive.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/setup_ranger_hive_interactive.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/setup_ranger_hive_interactive.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 resource_management.core.logger import Logger + + def setup_ranger_hive_interactive(upgrade_type = None): +- import params ++ from . import params + + if params.enable_ranger_hive: + +@@ -40,7 +40,7 @@ + action="create_on_execute", + owner=params.hdfs_user, + group=params.hdfs_user, +- mode=0755, ++ mode=0o755, + recursive_chmod=True + ) + params.HdfsResource("/ranger/audit/hive2", +@@ -48,7 +48,7 @@ + action="create_on_execute", + owner=params.hive_user, + group=params.hive_user, +- mode=0700, ++ mode=0o700, + recursive_chmod=True + ) + params.HdfsResource(None, action="execute") +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/setup_ranger_hive.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/setup_ranger_hive.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/setup_ranger_hive.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/setup_ranger_hive.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + from resource_management.libraries.functions.setup_ranger_plugin_xml import generate_ranger_service_config + + def setup_ranger_hive(upgrade_type = None): +- import params ++ from . import params + + if params.enable_ranger_hive: + +@@ -43,7 +43,7 @@ + action="create_on_execute", + owner=params.hdfs_user, + group=params.hdfs_user, +- mode=0755, ++ mode=0o755, + recursive_chmod=True + ) + params.HdfsResource("/ranger/audit/hiveServer2", +@@ -51,7 +51,7 @@ + action="create_on_execute", + owner=params.hive_user, + group=params.hive_user, +- mode=0700, ++ mode=0o700, + recursive_chmod=True + ) + params.HdfsResource(None, action="execute") +@@ -104,7 +104,7 @@ + """ + Creates ranger hive service in ranger admin installed in same cluster for cluster depolyed in cloud env. + """ +- import params ++ from . import params + + if params.has_ranger_admin and params.ranger_hive_metastore_lookup: + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/status_params.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/status_params.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/status_params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/status_params.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/webhcat.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/webhcat.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/webhcat.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/webhcat.py 2022-07-11 00:52:33.000000000 +0800 +@@ -36,7 +36,7 @@ + + @OsFamilyFuncImpl(os_family=OSConst.WINSRV_FAMILY) + def webhcat(): +- import params ++ from . import params + XmlConfig("webhcat-site.xml", + conf_dir=params.hcat_config_dir, + configurations=params.config['configurations']['webhcat-site'] +@@ -50,17 +50,17 @@ + + @OsFamilyFuncImpl(os_family=OsFamilyImpl.DEFAULT) + def webhcat(): +- import params ++ from . import params + + 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) + +@@ -119,14 +119,14 @@ + log4j_webhcat_filename = 'webhcat-log4j.properties' + if (params.log4j_webhcat_props != None): + File(format("{config_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("{config_dir}/{log4j_webhcat_filename}.template")): + File(format("{config_dir}/{log4j_webhcat_filename}"), +- mode=0644, ++ mode=0o644, + group=params.user_group, + owner=params.webhcat_user, + content=StaticFile(format("{config_dir}/{log4j_webhcat_filename}.template")) +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/webhcat_server.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/webhcat_server.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/webhcat_server.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/webhcat_server.py 2022-07-11 00:52:33.000000000 +0800 +@@ -27,30 +27,30 @@ + cached_kinit_executor, get_params_from_filesystem, validate_security_config_properties, \ + FILE_TYPE_XML + from resource_management.core.logger import Logger +-from webhcat import webhcat +-from webhcat_service import webhcat_service ++from .webhcat import webhcat ++from .webhcat_service import webhcat_service + from ambari_commons import OSConst + from ambari_commons.os_family_impl import OsFamilyImpl + + + class WebHCatServer(Script): + def install(self, env): +- import params ++ from . import params + self.install_packages(env) + + def start(self, env, upgrade_type=None): +- import params ++ from . import params + env.set_params(params) + self.configure(env) # FOR SECURITY + webhcat_service(action='start', upgrade_type=upgrade_type) + + def stop(self, env, upgrade_type=None): +- import params ++ from . import params + env.set_params(params) + webhcat_service(action='stop') + + def configure(self, env): +- import params ++ from . import params + env.set_params(params) + webhcat() + +@@ -58,7 +58,7 @@ + @OsFamilyImpl(os_family=OSConst.WINSRV_FAMILY) + class WebHCatServerWindows(WebHCatServer): + def status(self, env): +- import status_params ++ from . import status_params + env.set_params(status_params) + check_windows_service_status(status_params.webhcat_server_win_service_name) + +@@ -66,28 +66,28 @@ + @OsFamilyImpl(os_family=OsFamilyImpl.DEFAULT) + class WebHCatServerDefault(WebHCatServer): + def status(self, env): +- import status_params ++ from . import status_params + env.set_params(status_params) + check_process_status(status_params.webhcat_pid_file) + + def pre_upgrade_restart(self, env, upgrade_type=None): + Logger.info("Executing WebHCat Stack Upgrade pre-restart") +- import params ++ from . import params + env.set_params(params) + + if params.version and check_stack_feature(StackFeature.ROLLING_UPGRADE, params.version): + stack_select.select_packages(params.version) + + def get_log_folder(self): +- import params ++ from . import params + return params.hcat_log_dir + + def get_user(self): +- import params ++ from . import params + return params.webhcat_user + + def get_pid_files(self): +- import status_params ++ from . import status_params + return [status_params.webhcat_pid_file] + + if __name__ == "__main__": +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/webhcat_service_check.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/webhcat_service_check.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/webhcat_service_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/webhcat_service_check.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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(): + Logger.info("Webhcat smoke test - service status") + +- import params ++ from . import params + # AMBARI-11633 [WinTP2] Webhcat service check fails + # Hive doesn't pass the environment variables correctly to child processes, which fails the smoke test. + # Reducing the amount of URLs checked to the minimum required. +@@ -55,21 +55,21 @@ + url_port = params.config["configurations"]["webhcat-site"]["templeton.port"] + + for url_test in url_tests: +- url_request = "http://{0}:{1}/templeton/v1/{2}".format(url_host, url_port, url_test) ++ url_request = "http://{}:{}/templeton/v1/{}".format(url_host, url_port, url_test) + url_response = None + + try: + # execute the query for the JSON that includes WebHCat status +- url_response = urllib2.urlopen(url_request, timeout=30) ++ url_response = urllib.request.urlopen(url_request, timeout=30) + + status = url_response.getcode() + response = url_response.read() + + if status != 200: +- Logger.warning("Webhcat service check status: {0}".format(status)) +- Logger.info("Webhcat service check response: {0}".format(response)) +- except urllib2.HTTPError as he: +- raise Fail("Webhcat check {0} failed: {1}".format(url_request, he.msg)) ++ Logger.warning("Webhcat service check status: {}".format(status)) ++ Logger.info("Webhcat service check response: {}".format(response)) ++ except urllib.error.HTTPError as he: ++ raise Fail("Webhcat check {} failed: {}".format(url_request, he.msg)) + finally: + if url_response is not None: + try: +@@ -80,10 +80,10 @@ + + @OsFamilyFuncImpl(os_family=OsFamilyImpl.DEFAULT) + def webhcat_service_check(): +- import params ++ from . import params + File(format("{tmp_dir}/templetonSmoke.sh"), + content= StaticFile('templetonSmoke.sh'), +- mode=0755 ++ mode=0o755 + ) + + if params.security_enabled: +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/webhcat_service.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/webhcat_service.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/webhcat_service.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/webhcat_service.py 2022-07-11 00:52:33.000000000 +0800 +@@ -31,14 +31,14 @@ + + @OsFamilyFuncImpl(os_family=OSConst.WINSRV_FAMILY) + def webhcat_service(action='start', rolling_restart=False): +- import params ++ from . import params + if action == 'start' or action == 'stop': + Service(params.webhcat_server_win_service_name, action=action) + + + @OsFamilyFuncImpl(os_family=OsFamilyImpl.DEFAULT) + def webhcat_service(action='start', upgrade_type=None): +- import params ++ from . import params + + cmd = format('{webhcat_bin_dir}/webhcat_server.sh') + +@@ -94,7 +94,7 @@ + :param cmd: the command to run to stop the daemon + :return: + """ +- import params ++ from . import params + daemon_cmd = format('{cmd} stop') + + Execute(daemon_cmd, user = params.webhcat_user) +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/KAFKA/0.8.1/package/scripts/kafka_broker.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/KAFKA/0.8.1/package/scripts/kafka_broker.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/KAFKA/0.8.1/package/scripts/kafka_broker.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/KAFKA/0.8.1/package/scripts/kafka_broker.py 2022-07-11 00:52:33.000000000 +0800 +@@ -121,7 +121,7 @@ + Logger.info("The zookeeper.set.acl is false. Skipping reverting ACL") + return + Execute( +- "{0} --zookeeper.connect {1} --zookeeper.acl=unsecure".format(params.kafka_security_migrator, params.zookeeper_connect), \ ++ "{} --zookeeper.connect {} --zookeeper.acl=unsecure".format(params.kafka_security_migrator, params.zookeeper_connect), \ + user=params.kafka_user, \ + environment={ 'JAVA_HOME': params.java64_home }, \ + logoutput=True, \ +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/KAFKA/0.8.1/package/scripts/kafka.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/KAFKA/0.8.1/package/scripts/kafka.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/KAFKA/0.8.1/package/scripts/kafka.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/KAFKA/0.8.1/package/scripts/kafka.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + 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 +@@ -92,7 +92,7 @@ + kafka_server_config['broker.rack']=rack + + Directory(kafka_data_dirs, +- mode=0755, ++ mode=0o755, + cd_access='a', + owner=params.kafka_user, + group=params.user_group, +@@ -114,7 +114,7 @@ + + 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) +@@ -149,14 +149,14 @@ + 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") + ) + +@@ -166,7 +166,7 @@ + + 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 + +@@ -199,7 +199,7 @@ + action="delete") + + Directory(kafka_managed_dir, +- mode=0755, ++ mode=0o755, + cd_access='a', + owner=params.kafka_user, + group=params.user_group, +@@ -231,7 +231,7 @@ + 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, +@@ -255,7 +255,7 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/KAFKA/0.8.1/package/scripts/params.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/KAFKA/0.8.1/package/scripts/params.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/KAFKA/0.8.1/package/scripts/params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/KAFKA/0.8.1/package/scripts/params.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/KAFKA/0.8.1/package/scripts/service_check.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/KAFKA/0.8.1/package/scripts/service_check.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/KAFKA/0.8.1/package/scripts/service_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/KAFKA/0.8.1/package/scripts/service_check.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + topic_exists_cmd_code, topic_exists_cmd_out = shell.call(topic_exists_cmd, logoutput=True, quiet=False, user=params.kafka_user) + + if topic_exists_cmd_code > 0: +- raise Fail("Error encountered when attempting to list topics: {0}".format(topic_exists_cmd_out)) ++ raise Fail("Error encountered when attempting to list topics: {}".format(topic_exists_cmd_out)) + + if not params.kafka_delete_topic_enable: + Logger.info('Kafka delete.topic.enable is not enabled. Skipping topic creation: %s' % topic) +@@ -59,9 +59,9 @@ + under_rep_cmd_code, under_rep_cmd_out = shell.call(under_rep_cmd, logoutput=True, quiet=False, user=params.kafka_user) + + if under_rep_cmd_code > 0: +- raise Fail("Error encountered when attempting find under replicated partitions: {0}".format(under_rep_cmd_out)) ++ raise Fail("Error encountered when attempting find under replicated partitions: {}".format(under_rep_cmd_out)) + elif len(under_rep_cmd_out) > 0 and "Topic" in under_rep_cmd_out: +- raise Fail("Under replicated partitions found: {0}".format(under_rep_cmd_out)) ++ raise Fail("Under replicated partitions found: {}".format(under_rep_cmd_out)) + + def read_kafka_config(self): + import params +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/KAFKA/0.8.1/package/scripts/setup_ranger_kafka.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/KAFKA/0.8.1/package/scripts/setup_ranger_kafka.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/KAFKA/0.8.1/package/scripts/setup_ranger_kafka.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/KAFKA/0.8.1/package/scripts/setup_ranger_kafka.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + """ + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file +@@ -38,7 +38,7 @@ + action="create_on_execute", + owner=params.hdfs_user, + group=params.hdfs_user, +- mode=0755, ++ mode=0o755, + recursive_chmod=True + ) + params.HdfsResource("/ranger/audit/kafka", +@@ -46,7 +46,7 @@ + action="create_on_execute", + owner=params.kafka_user, + group=params.kafka_user, +- mode=0700, ++ mode=0o700, + recursive_chmod=True + ) + params.HdfsResource(None, action="execute") +@@ -79,7 +79,7 @@ + File(params.setup_ranger_env_sh_target, + owner = params.kafka_user, + group = params.user_group, +- mode = 0755 ++ mode = 0o755 + ) + if params.stack_supports_core_site_for_ranger_plugin and params.enable_ranger_kafka and params.kerberos_security_enabled: + if params.has_namenode: +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/KAFKA/0.8.1/package/scripts/status_params.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/KAFKA/0.8.1/package/scripts/status_params.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/KAFKA/0.8.1/package/scripts/status_params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/KAFKA/0.8.1/package/scripts/status_params.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/KAFKA/0.8.1/package/scripts/upgrade.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/KAFKA/0.8.1/package/scripts/upgrade.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/KAFKA/0.8.1/package/scripts/upgrade.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/KAFKA/0.8.1/package/scripts/upgrade.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + Logger.info("Skip running the Kafka ACL migration script since cluster security is not enabled.") + return + +- Logger.info("Upgrade type: {0}, direction: {1}".format(str(upgrade_type), params.upgrade_direction)) ++ Logger.info("Upgrade type: {}, direction: {}".format(str(upgrade_type), params.upgrade_direction)) + + # If the schema upgrade script exists in the version upgrading to, then attempt to upgrade/downgrade it while still using the present bits. + kafka_acls_script = format("{stack_root}/{version_for_stack_feature_checks}/kafka/bin/kafka-acls.sh") +@@ -58,7 +58,7 @@ + + if kafka_acls_script is not None: + if os.path.exists(kafka_acls_script): +- Logger.info("Found Kafka acls script: {0}".format(kafka_acls_script)) ++ Logger.info("Found Kafka acls script: {}".format(kafka_acls_script)) + if params.zookeeper_connect is None: + raise Fail("Could not retrieve property kafka-broker/zookeeper.connect") + +@@ -69,4 +69,4 @@ + user=params.kafka_user, + logoutput=True) + else: +- Logger.info("Did not find Kafka acls script: {0}".format(kafka_acls_script)) ++ Logger.info("Did not find Kafka acls script: {}".format(kafka_acls_script)) +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/KAFKA/0.8.1/package/scripts/utils.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/KAFKA/0.8.1/package/scripts/utils.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/KAFKA/0.8.1/package/scripts/utils.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/KAFKA/0.8.1/package/scripts/utils.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/KERBEROS/1.10.3-10/package/scripts/kerberos_client.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/KERBEROS/1.10.3-10/package/scripts/kerberos_client.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/KERBEROS/1.10.3-10/package/scripts/kerberos_client.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/KERBEROS/1.10.3-10/package/scripts/kerberos_client.py 2022-07-11 00:52:33.000000000 +0800 +@@ -30,7 +30,7 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/KERBEROS/1.10.3-10/package/scripts/service_check.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/KERBEROS/1.10.3-10/package/scripts/service_check.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/KERBEROS/1.10.3-10/package/scripts/service_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/KERBEROS/1.10.3-10/package/scripts/service_check.py 2022-07-11 00:52:33.000000000 +0800 +@@ -49,13 +49,13 @@ + 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) ++ ccache_file_name = HASH_ALGORITHM("{}|{}".format(params.smoke_test_principal, params.smoke_test_keytab_file)).hexdigest() ++ ccache_file_path = "{}{}kerberos_service_check_cc_{}".format(params.tmp_dir, os.sep, ccache_file_name) + + kinit_path_local = functions.get_kinit_path(default('/configurations/kerberos-env/executable_search_paths', None)) +- kinit_command = "{0} -c {1} -kt {2} {3}".format(kinit_path_local, ccache_file_path, params.smoke_test_keytab_file, ++ kinit_command = "{} -c {} -kt {} {}".format(kinit_path_local, ccache_file_path, params.smoke_test_keytab_file, + params.smoke_test_principal) + + try: +@@ -76,10 +76,10 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/KERBEROS/1.10.3-30/package/scripts/kerberos_client.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/KERBEROS/1.10.3-30/package/scripts/kerberos_client.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/KERBEROS/1.10.3-30/package/scripts/kerberos_client.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/KERBEROS/1.10.3-30/package/scripts/kerberos_client.py 2022-07-11 00:52:33.000000000 +0800 +@@ -30,7 +30,7 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/KERBEROS/1.10.3-30/package/scripts/service_check.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/KERBEROS/1.10.3-30/package/scripts/service_check.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/KERBEROS/1.10.3-30/package/scripts/service_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/KERBEROS/1.10.3-30/package/scripts/service_check.py 2022-07-11 00:52:33.000000000 +0800 +@@ -49,13 +49,13 @@ + 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) ++ ccache_file_name = HASH_ALGORITHM("{}|{}".format(params.smoke_test_principal, params.smoke_test_keytab_file)).hexdigest() ++ ccache_file_path = "{}{}kerberos_service_check_cc_{}".format(params.tmp_dir, os.sep, ccache_file_name) + + kinit_path_local = functions.get_kinit_path(default('/configurations/kerberos-env/executable_search_paths', None)) +- kinit_command = "{0} -c {1} -kt {2} {3}".format(kinit_path_local, ccache_file_path, params.smoke_test_keytab_file, ++ kinit_command = "{} -c {} -kt {} {}".format(kinit_path_local, ccache_file_path, params.smoke_test_keytab_file, + params.smoke_test_principal) + + try: +@@ -76,10 +76,10 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/KNOX/0.5.0.2.2/package/files/validateKnoxStatus.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/KNOX/0.5.0.2.2/package/files/validateKnoxStatus.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/KNOX/0.5.0.2.2/package/files/validateKnoxStatus.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/KNOX/0.5.0.2.2/package/files/validateKnoxStatus.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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,10 +32,10 @@ + timeout_seconds = 5 + try: + s = socket.create_connection((options.hostname, int(options.port)),timeout=timeout_seconds) +- print "Successfully connected to %s on port %s" % (options.hostname, options.port) ++ print(("Successfully connected to {} on port {}".format(options.hostname, options.port))) + s.close() +- except socket.error, e: +- print "Connection to %s on port %s failed: %s" % (options.hostname, options.port, e) ++ except OSError as e: ++ print(("Connection to {} on port {} failed: {}".format(options.hostname, options.port, e))) + exit(1) + + if __name__ == "__main__": +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/KNOX/0.5.0.2.2/package/scripts/knox_gateway.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/KNOX/0.5.0.2.2/package/scripts/knox_gateway.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/KNOX/0.5.0.2.2/package/scripts/knox_gateway.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/KNOX/0.5.0.2.2/package/scripts/knox_gateway.py 2022-07-11 00:52:33.000000000 +0800 +@@ -114,7 +114,7 @@ + # keystores which can cause side effects if the upgrade goes wrong + if params.upgrade_direction and params.upgrade_direction == Direction.UPGRADE: + absolute_backup_dir = upgrade.backup_data() +- Logger.info("Knox data was successfully backed up to {0}".format(absolute_backup_dir)) ++ Logger.info("Knox data was successfully backed up to {}".format(absolute_backup_dir)) + + stack_select.select_packages(params.version) + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/KNOX/0.5.0.2.2/package/scripts/knox.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/KNOX/0.5.0.2.2/package/scripts/knox.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/KNOX/0.5.0.2.2/package/scripts/knox.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/KNOX/0.5.0.2.2/package/scripts/knox.py 2022-07-11 00:52:33.000000000 +0800 +@@ -98,7 +98,7 @@ + group = params.knox_group, + create_parents = True, + cd_access = "a", +- mode = 0755, ++ mode = 0o755, + recursive_ownership = True, + ) + +@@ -111,7 +111,7 @@ + ) + + File(format("{params.knox_conf_dir}/gateway-log4j.properties"), +- mode=0644, ++ mode=0o644, + group=params.knox_group, + owner=params.knox_user, + content=InlineTemplate(params.gateway_log4j) +@@ -187,6 +187,6 @@ + group = params.knox_group, + create_parents = True, + cd_access = "a", +- mode = 0755, ++ mode = 0o755, + recursive_ownership = True, + ) +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/KNOX/0.5.0.2.2/package/scripts/params_linux.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/KNOX/0.5.0.2.2/package/scripts/params_linux.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/KNOX/0.5.0.2.2/package/scripts/params_linux.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/KNOX/0.5.0.2.2/package/scripts/params_linux.py 2022-07-11 00:52:33.000000000 +0800 +@@ -107,7 +107,7 @@ + knox_data_dir = format('{stack_root}/current/knox-server/data/') + + knox_group = default("/configurations/knox-env/knox_group", "knox") +-mode = 0644 ++mode = 0o644 + + stack_version_unformatted = config['clusterLevelParams']['stack_version'] + stack_version_formatted = format_stack_version(stack_version_unformatted) +@@ -186,7 +186,7 @@ + else: + return openTag + proto + hdfs_host + ":" + port + servicePath + closeTag + newLine + +-namenode_host_keys = namenode_port_map.keys(); ++namenode_host_keys = list(namenode_port_map.keys()); + if len(namenode_host_keys) > 0: + for host in namenode_host_keys: + webhdfs_service_urls += buildUrlElement("http", host, namenode_port_map[host], "/webhdfs") +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/KNOX/0.5.0.2.2/package/scripts/params_windows.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/KNOX/0.5.0.2.2/package/scripts/params_windows.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/KNOX/0.5.0.2.2/package/scripts/params_windows.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/KNOX/0.5.0.2.2/package/scripts/params_windows.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/KNOX/0.5.0.2.2/package/scripts/service_check.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/KNOX/0.5.0.2.2/package/scripts/service_check.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/KNOX/0.5.0.2.2/package/scripts/service_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/KNOX/0.5.0.2.2/package/scripts/service_check.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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,9 +43,9 @@ + validateKnoxFileName = "validateKnoxStatus.py" + validateKnoxFilePath = os.path.join(temp_dir, validateKnoxFileName) + python_executable = sys.executable +- validateStatusCmd = "%s %s -p %s -n %s" % (python_executable, validateKnoxFilePath, params.knox_host_port, params.knox_host_name) ++ validateStatusCmd = "{} {} -p {} -n {}".format(python_executable, validateKnoxFilePath, params.knox_host_port, params.knox_host_name) + +- print "Test connectivity to knox server" ++ print("Test connectivity to knox server") + + File(validateKnoxFilePath, + content=StaticFile(validateKnoxFileName) +@@ -75,11 +75,11 @@ + else: + smoke_cmd = validateStatusCmd + +- print "Test connectivity to knox server" ++ print("Test connectivity to knox server") + + File(validateKnoxFilePath, + content=StaticFile(validateKnoxFileName), +- mode=0755 ++ mode=0o755 + ) + + Execute(smoke_cmd, +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/KNOX/0.5.0.2.2/package/scripts/setup_ranger_knox.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/KNOX/0.5.0.2.2/package/scripts/setup_ranger_knox.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/KNOX/0.5.0.2.2/package/scripts/setup_ranger_knox.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/KNOX/0.5.0.2.2/package/scripts/setup_ranger_knox.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + action="create_on_execute", + owner=params.hdfs_user, + group=params.hdfs_user, +- mode=0755, ++ mode=0o755, + recursive_chmod=True + ) + params.HdfsResource("/ranger/audit/knox", +@@ -52,7 +52,7 @@ + action="create_on_execute", + owner=params.knox_user, + group=params.knox_user, +- mode=0700, ++ mode=0o700, + recursive_chmod=True + ) + params.HdfsResource(None, action="execute") +@@ -65,7 +65,7 @@ + configuration_attributes=params.config['configurationAttributes']['hdfs-site'], + owner=params.knox_user, + group=params.knox_group, +- mode=0644 ++ mode=0o644 + ) + else: + File(format('{knox_conf_dir}/hdfs-site.xml'), action="delete") +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/KNOX/0.5.0.2.2/package/scripts/status_params.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/KNOX/0.5.0.2.2/package/scripts/status_params.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/KNOX/0.5.0.2.2/package/scripts/status_params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/KNOX/0.5.0.2.2/package/scripts/status_params.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/KNOX/0.5.0.2.2/package/scripts/upgrade.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/KNOX/0.5.0.2.2/package/scripts/upgrade.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/KNOX/0.5.0.2.2/package/scripts/upgrade.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/KNOX/0.5.0.2.2/package/scripts/upgrade.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,5 +1,4 @@ +- +-#!/usr/bin/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 +42,7 @@ + Logger.info('Backing up Knox data directory before upgrade...') + directoryMappings = _get_directory_mappings_during_upgrade() + +- Logger.info("Directory mappings to backup: {0}".format(str(directoryMappings))) ++ Logger.info("Directory mappings to backup: {}".format(str(directoryMappings))) + + absolute_backup_dir = os.path.join(tempfile.gettempdir(), BACKUP_TEMP_DIR) + if not os.path.isdir(absolute_backup_dir): +@@ -51,10 +50,10 @@ + + for directory in directoryMappings: + if not os.path.isdir(directory): +- raise Fail("Unable to backup missing directory {0}".format(directory)) ++ raise Fail("Unable to backup missing directory {}".format(directory)) + + archive = os.path.join(absolute_backup_dir, directoryMappings[directory]) +- Logger.info('Compressing {0} to {1}'.format(directory, archive)) ++ Logger.info('Compressing {} to {}'.format(directory, archive)) + + if os.path.exists(archive): + os.remove(archive) +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/LOGSEARCH/0.5.0/package/alerts/alert_logfeeder.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/LOGSEARCH/0.5.0/package/alerts/alert_logfeeder.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/LOGSEARCH/0.5.0/package/alerts/alert_logfeeder.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/LOGSEARCH/0.5.0/package/alerts/alert_logfeeder.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + """ + Licensed to the Apache Software Foundation (ASF) under one +@@ -67,7 +67,7 @@ + if configurations is None: + return (RESULT_CODE_UNKNOWN, ['There were no configurations supplied to the script.']) + +- if set([LOGFEEDER_PID_DIR]).issubset(configurations): ++ if {LOGFEEDER_PID_DIR}.issubset(configurations): + LOGFEEDER_PID_PATH = os.path.join(configurations[LOGFEEDER_PID_DIR], 'logfeeder.pid') + else: + return (RESULT_CODE_UNKNOWN, ['The logfeeder_pid_dir is a required parameter.']) +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/LOGSEARCH/0.5.0/package/scripts/params.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/LOGSEARCH/0.5.0/package/scripts/params.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/LOGSEARCH/0.5.0/package/scripts/params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/LOGSEARCH/0.5.0/package/scripts/params.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + """ + Licensed to the Apache Software Foundation (ASF) under one +@@ -272,9 +272,9 @@ + + # load config values + +-logsearch_properties = dict(logsearch_properties.items() +\ +- dict(config['configurations']['logsearch-common-properties']).items() +\ +- dict(config['configurations']['logsearch-properties']).items()) ++logsearch_properties = dict(list(logsearch_properties.items()) +\ ++ list(dict(config['configurations']['logsearch-common-properties']).items()) +\ ++ list(dict(config['configurations']['logsearch-properties']).items())) + + # load derivated values + +@@ -374,9 +374,9 @@ + + # load config values + +-logfeeder_properties = dict(logfeeder_properties.items() +\ +- dict(config['configurations']['logsearch-common-properties']).items() +\ +- dict(config['configurations']['logfeeder-properties']).items()) ++logfeeder_properties = dict(list(logfeeder_properties.items()) +\ ++ list(dict(config['configurations']['logsearch-common-properties']).items()) +\ ++ list(dict(config['configurations']['logfeeder-properties']).items())) + + # load derivated values + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/LOGSEARCH/0.5.0/package/scripts/setup_logfeeder.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/LOGSEARCH/0.5.0/package/scripts/setup_logfeeder.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/LOGSEARCH/0.5.0/package/scripts/setup_logfeeder.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/LOGSEARCH/0.5.0/package/scripts/setup_logfeeder.py 2022-07-11 00:52:33.000000000 +0800 +@@ -29,20 +29,20 @@ + import params + + Directory([params.logfeeder_log_dir, params.logfeeder_pid_dir, params.logfeeder_checkpoint_folder], +- mode=0755, ++ mode=0o755, + cd_access='a', + create_parents=True + ) + + Directory([params.logfeeder_dir, params.logsearch_logfeeder_conf], +- mode=0755, ++ mode=0o755, + cd_access='a', + create_parents=True, + recursive_ownership=True + ) + + File(format("{logfeeder_log_dir}/{logfeeder_log}"), +- mode=0644, ++ mode=0o644, + content='' + ) + +@@ -63,21 +63,21 @@ + else: + Directory(params.logsearch_logfeeder_keys_folder, + cd_access='a', +- mode=0755, ++ mode=0o755, + owner=params.logsearch_user, + group=params.user_group + ) + + File(format("{logsearch_logfeeder_keys_folder}/ks_pass.txt"), + content=params.logfeeder_keystore_password, +- mode=0600, ++ mode=0o600, + owner=params.logsearch_user, + group=params.user_group + ) + + File(format("{logsearch_logfeeder_keys_folder}/ts_pass.txt"), + content=params.logfeeder_truststore_password, +- mode=0600, ++ mode=0o600, + owner=params.logsearch_user, + group=params.user_group + ) +@@ -88,7 +88,7 @@ + + File(format("{logsearch_logfeeder_conf}/logfeeder-env.sh"), + content=InlineTemplate(params.logfeeder_env_content), +- mode=0755 ++ mode=0o755 + ) + + File(format("{logsearch_logfeeder_conf}/log4j.xml"), +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/LOGSEARCH/0.5.0/package/scripts/setup_logsearch.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/LOGSEARCH/0.5.0/package/scripts/setup_logsearch.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/LOGSEARCH/0.5.0/package/scripts/setup_logsearch.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/LOGSEARCH/0.5.0/package/scripts/setup_logsearch.py 2022-07-11 00:52:33.000000000 +0800 +@@ -33,7 +33,7 @@ + import params + + Directory([params.logsearch_log_dir, params.logsearch_pid_dir], +- mode=0755, ++ mode=0o755, + cd_access='a', + owner=params.logsearch_user, + group=params.user_group, +@@ -41,7 +41,7 @@ + ) + + Directory([params.logsearch_dir, params.logsearch_server_conf, params.logsearch_config_set_dir], +- mode=0755, ++ mode=0o755, + cd_access='a', + owner=params.logsearch_user, + group=params.user_group, +@@ -51,12 +51,12 @@ + + Directory(params.logsearch_server_keys_folder, + cd_access='a', +- mode=0755, ++ mode=0o755, + owner=params.logsearch_user, + group=params.user_group) + + File(format("{logsearch_log_dir}/{logsearch_log}"), +- mode=0644, ++ mode=0o644, + owner=params.logsearch_user, + group=params.user_group, + content='' +@@ -79,13 +79,13 @@ + else: + File(format("{logsearch_server_keys_folder}/ks_pass.txt"), + content=params.logsearch_keystore_password, +- mode=0600, ++ mode=0o600, + owner= params.logsearch_user, + group=params.user_group + ) + File(format("{logsearch_server_keys_folder}/ts_pass.txt"), + content=params.logsearch_truststore_password, +- mode=0600, ++ mode=0o600, + owner= params.logsearch_user, + group=params.user_group + ) +@@ -108,7 +108,7 @@ + + File(format("{logsearch_server_conf}/logsearch-env.sh"), + content=InlineTemplate(params.logsearch_env_content), +- mode=0755, ++ mode=0o755, + owner=params.logsearch_user, + group=params.user_group + ) +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/LOGSEARCH/0.5.0/package/scripts/status_params.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/LOGSEARCH/0.5.0/package/scripts/status_params.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/LOGSEARCH/0.5.0/package/scripts/status_params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/LOGSEARCH/0.5.0/package/scripts/status_params.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + """ + Licensed to the Apache Software Foundation (ASF) under one +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/LOGSEARCH/0.5.0/service_advisor.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/LOGSEARCH/0.5.0/service_advisor.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/LOGSEARCH/0.5.0/service_advisor.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/LOGSEARCH/0.5.0/service_advisor.py 2022-07-11 00:52:33.000000000 +0800 +@@ -33,12 +33,12 @@ + 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 LogSearchServiceAdvisor(service_advisor.ServiceAdvisor): + + def __init__(self, *args, **kwargs): +- self.as_super = super(LogSearchServiceAdvisor, self) ++ self.as_super = super() + self.as_super.__init__(*args, **kwargs) + + # Always call these methods +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/MAHOUT/1.0.0.2.3/package/scripts/mahout.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/MAHOUT/1.0.0.2.3/package/scripts/mahout.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/MAHOUT/1.0.0.2.3/package/scripts/mahout.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/MAHOUT/1.0.0.2.3/package/scripts/mahout.py 2022-07-11 00:52:32.000000000 +0800 +@@ -46,19 +46,19 @@ + configuration_attributes=params.config['configurationAttributes']['yarn-site'], + owner=params.yarn_user, + group=params.user_group, +- mode=0644 ++ mode=0o644 + ) + + if not is_empty(params.log4j_props): + File(format("{params.mahout_conf_dir}/log4j.properties"), +- mode=0644, ++ mode=0o644, + group=params.user_group, + owner=params.mahout_user, + content=params.log4j_props + ) + elif (os.path.exists(format("{params.mahout_conf_dir}/log4j.properties"))): + File(format("{params.mahout_conf_dir}/log4j.properties"), +- mode=0644, ++ mode=0o644, + group=params.user_group, + owner=params.mahout_user + ) +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/MAHOUT/1.0.0.2.3/package/scripts/params.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/MAHOUT/1.0.0.2.3/package/scripts/params.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/MAHOUT/1.0.0.2.3/package/scripts/params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/MAHOUT/1.0.0.2.3/package/scripts/params.py 2022-07-11 00:52:32.000000000 +0800 +@@ -61,7 +61,7 @@ + hdfs_user_keytab = config['configurations']['hadoop-env']['hdfs_user_keytab'] + 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 + user_group = config['configurations']['cluster-env']['user_group'] + security_enabled = config['configurations']['cluster-env']['security_enabled'] + smoke_user_keytab = config['configurations']['cluster-env']['smokeuser_keytab'] +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/MAHOUT/1.0.0.2.3/package/scripts/service_check.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/MAHOUT/1.0.0.2.3/package/scripts/service_check.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/MAHOUT/1.0.0.2.3/package/scripts/service_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/MAHOUT/1.0.0.2.3/package/scripts/service_check.py 2022-07-11 00:52:32.000000000 +0800 +@@ -36,7 +36,7 @@ + + File( format("{tmp_dir}/sample-mahout-test.txt"), + content = "Test text which will be converted to sequence file.", +- mode = 0755 ++ mode = 0o755 + ) + + params.HdfsResource(format("/user/{smokeuser}"), +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/OOZIE/4.0.0.2.0/package/alerts/alert_check_oozie_server.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/OOZIE/4.0.0.2.0/package/alerts/alert_check_oozie_server.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/OOZIE/4.0.0.2.0/package/alerts/alert_check_oozie_server.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/OOZIE/4.0.0.2.0/package/alerts/alert_check_oozie_server.py 2022-07-11 00:52:32.000000000 +0800 +@@ -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 resource_management.libraries.functions import stack_tools + from ambari_commons.os_check import OSConst, OSCheck + from ambari_commons.os_family_impl import OsFamilyFuncImpl, OsFamilyImpl +-from urlparse import urlparse ++from urllib.parse import urlparse + + STACK_ROOT_PATTERN = "{{ stack_root }}" + RESULT_CODE_OK = 'OK' +@@ -47,7 +47,7 @@ + OOZIE_URL_KEY = '{{oozie-site/oozie.base.url}}' + SECURITY_ENABLED = '{{cluster-env/security_enabled}}' + OOZIE_USER = '{{oozie-env/oozie_user}}' +-OOZIE_CONF_DIR = "{0}/current/oozie-server/conf".format(STACK_ROOT_PATTERN) ++OOZIE_CONF_DIR = "{}/current/oozie-server/conf".format(STACK_ROOT_PATTERN) + OOZIE_CONF_DIR_LEGACY = '/etc/oozie/conf' + OOZIE_HTTPS_PORT = '{{oozie-site/oozie.https.port}}' + OOZIE_ENV_CONTENT = '{{oozie-env/content}}' +@@ -129,7 +129,7 @@ + # Create the kerberos credentials cache (ccache) file and set it in the environment to use + # when executing curl + env = Environment.get_instance() +- ccache_file = "{0}{1}oozie_alert_cc_{2}".format(env.tmp_dir, os.sep, os.getpid()) ++ ccache_file = "{}{}oozie_alert_cc_{}".format(env.tmp_dir, os.sep, os.getpid()) + kerberos_env = {'KRB5CCNAME': ccache_file} + + # Get the configured Kerberos executable search paths, if any +@@ -148,7 +148,7 @@ + if only_kinit: + kinit_command = kinit_part_command + else: +- kinit_command = "{0} -s {1} || ".format(klist_path_local, ccache_file) + kinit_part_command ++ kinit_command = "{} -s {} || ".format(klist_path_local, ccache_file) + kinit_part_command + + # prevent concurrent kinit + kinit_lock = global_lock.get_lock(global_lock.LOCK_TYPE_KERBEROS) +@@ -168,7 +168,7 @@ + if not os.path.exists(oozie_config_directory): + oozie_config_directory = OOZIE_CONF_DIR_LEGACY + +- command = "source {0}/oozie-env.sh ; oozie admin -oozie {1} -status".format( ++ command = "source {}/oozie-env.sh ; oozie admin -oozie {} -status".format( + oozie_config_directory, oozie_url) + + return (command, kerberos_env, user) +@@ -232,10 +232,10 @@ + # execute the command + Execute(command, environment=env, user=user) + +- return (RESULT_CODE_OK, ["Successful connection to {0}".format(oozie_url)]) +- except KerberosPropertiesNotFound, ex: ++ return (RESULT_CODE_OK, ["Successful connection to {}".format(oozie_url)]) ++ except KerberosPropertiesNotFound as ex: + return (RESULT_CODE_UNKNOWN, [str(ex)]) +- except Exception, ex: ++ except Exception as ex: + return (RESULT_CODE_CRITICAL, [str(ex)]) + + def is_security_enabled(configurations): +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/OOZIE/4.0.0.2.0/package/scripts/oozie_client.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/OOZIE/4.0.0.2.0/package/scripts/oozie_client.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/OOZIE/4.0.0.2.0/package/scripts/oozie_client.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/OOZIE/4.0.0.2.0/package/scripts/oozie_client.py 2022-07-11 00:52:32.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + """ + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file +@@ -68,7 +68,7 @@ + return {'configurations': params.oozie_site, + 'configurationAttributes': config['configurationAttributes'][dictionary]} + else: +- return super(OozieClient, self).generate_configs_get_xml_file_content(filename, dictionary) ++ return super().generate_configs_get_xml_file_content(filename, dictionary) + + if __name__ == "__main__": + OozieClient().execute() +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/OOZIE/4.0.0.2.0/package/scripts/oozie.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/OOZIE/4.0.0.2.0/package/scripts/oozie.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/OOZIE/4.0.0.2.0/package/scripts/oozie.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/OOZIE/4.0.0.2.0/package/scripts/oozie.py 2022-07-11 00:52:32.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + """ + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file +@@ -131,7 +131,7 @@ + configuration_attributes=params.config['configurationAttributes']['oozie-site'], + owner = params.oozie_user, + group = params.user_group, +- mode = 0664 ++ mode = 0o664 + ) + File(format("{conf_dir}/oozie-env.sh"), + owner=params.oozie_user, +@@ -149,27 +149,27 @@ + File(os.path.join(params.limits_conf_dir, 'oozie.conf'), + owner='root', + group='root', +- mode=0644, ++ mode=0o644, + content=Template("oozie.conf.j2") + ) + + if (params.log4j_props != None): + File(format("{params.conf_dir}/oozie-log4j.properties"), +- mode=0644, ++ mode=0o644, + group=params.user_group, + owner=params.oozie_user, + content=InlineTemplate(params.log4j_props) + ) + elif (os.path.exists(format("{params.conf_dir}/oozie-log4j.properties"))): + File(format("{params.conf_dir}/oozie-log4j.properties"), +- mode=0644, ++ mode=0o644, + group=params.user_group, + owner=params.oozie_user + ) + + if params.stack_version_formatted and check_stack_feature(StackFeature.OOZIE_ADMIN_USER, params.stack_version_formatted): + File(format("{params.conf_dir}/adminusers.txt"), +- mode=0644, ++ mode=0o644, + group=params.user_group, + owner=params.oozie_user, + content=Template('adminusers.txt.j2', oozie_admin_users=params.oozie_admin_users) +@@ -256,7 +256,7 @@ + Directory( oozie_server_directories, + owner = params.oozie_user, + group = params.user_group, +- mode = 0755, ++ mode = 0o755, + create_parents = True, + cd_access="a", + ) +@@ -315,7 +315,7 @@ + prepare_war(params) + + File(hashcode_file, +- mode = 0644, ++ mode = 0o644, + ) + + if params.stack_version_formatted and check_stack_feature(StackFeature.OOZIE_CREATE_HIVE_TEZ_CONFIGS, params.stack_version_formatted): +@@ -338,7 +338,7 @@ + configuration_attributes=params.config['configurationAttributes']['hive-site'], + owner=params.oozie_user, + group=params.user_group, +- mode=0644 ++ mode=0o644 + ) + if 'tez-site' in params.config['configurations']: + XmlConfig( "tez-site.xml", +@@ -347,7 +347,7 @@ + configuration_attributes=params.config['configurationAttributes']['tez-site'], + owner = params.oozie_user, + group = params.user_group, +- mode = 0664 ++ mode = 0o664 + ) + + # If Atlas is also installed, need to generate Atlas Hive hook (hive-atlas-application.properties file) in directory +@@ -454,7 +454,7 @@ + user=params.hdfs_user, + owner=params.oozie_user, + group=params.hdfs_user, +- mode=0755, ++ mode=0o755, + recursive_chown=True, + recursive_chmod=True, + replace_existing_files=True +@@ -469,7 +469,7 @@ + action="create_on_execute", + owner=params.oozie_user, + group=params.hdfs_user, +- mode=0755, ++ mode=0o755, + replace_existing_files=True + ) + params.HdfsResource(None, action="execute") +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/OOZIE/4.0.0.2.0/package/scripts/oozie_server.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/OOZIE/4.0.0.2.0/package/scripts/oozie_server.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/OOZIE/4.0.0.2.0/package/scripts/oozie_server.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/OOZIE/4.0.0.2.0/package/scripts/oozie_server.py 2022-07-11 00:52:32.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/OOZIE/4.0.0.2.0/package/scripts/oozie_server_upgrade.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/OOZIE/4.0.0.2.0/package/scripts/oozie_server_upgrade.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/OOZIE/4.0.0.2.0/package/scripts/oozie_server_upgrade.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/OOZIE/4.0.0.2.0/package/scripts/oozie_server_upgrade.py 2022-07-11 00:52:32.000000000 +0800 +@@ -57,7 +57,7 @@ + params.version_for_stack_feature_checks) + + # ensure the directory exists +- Directory(params.oozie_libext_dir, mode = 0777) ++ Directory(params.oozie_libext_dir, mode = 0o777) + + # get all hadooplzo* JAR files + # set hadoop-client has not run yet, therefore we cannot use +@@ -76,19 +76,19 @@ + + files = glob.iglob(os.path.join(hadoop_client_new_lib_dir, hadoop_lzo_pattern)) + if not files: +- raise Fail("There are no files at {0} matching {1}".format( ++ raise Fail("There are no files at {} matching {}".format( + hadoop_client_new_lib_dir, hadoop_lzo_pattern)) + + # copy files into libext + files_copied = False + for file in files: + if os.path.isfile(file): +- Logger.info("Copying {0} to {1}".format(str(file), params.oozie_libext_dir)) ++ Logger.info("Copying {} to {}".format(str(file), params.oozie_libext_dir)) + shutil.copy2(file, params.oozie_libext_dir) + files_copied = True + + if not files_copied: +- raise Fail("There are no files at {0} matching {1}".format( ++ raise Fail("There are no files at {} matching {}".format( + hadoop_client_new_lib_dir, hadoop_lzo_pattern)) + + # ExtJS is used to build a working Oozie Web UI - without it, Oozie will startup and work +@@ -112,19 +112,19 @@ + for source_ext_zip_path in source_ext_zip_paths: + if os.path.isfile(source_ext_zip_path): + found_at_least_one_oozie_ext_file = True +- Logger.info("Copying {0} to {1}".format(source_ext_zip_path, params.oozie_libext_dir)) ++ Logger.info("Copying {} to {}".format(source_ext_zip_path, params.oozie_libext_dir)) + Execute(("cp", source_ext_zip_path, params.oozie_libext_dir), sudo=True) + Execute(("chown", format("{oozie_user}:{user_group}"), oozie_ext_zip_target_path), sudo=True) +- File(oozie_ext_zip_target_path, mode=0644) ++ File(oozie_ext_zip_target_path, mode=0o644) + break + + # ExtJS was expected to the be on the system, but was not found + if extjs_included and not found_at_least_one_oozie_ext_file: +- raise Fail("Unable to find any Oozie source extension files from the following paths {0}".format(source_ext_zip_paths)) ++ raise Fail("Unable to find any Oozie source extension files from the following paths {}".format(source_ext_zip_paths)) + + # ExtJS is not expected, so it's OK - just log a warning + if not found_at_least_one_oozie_ext_file: +- Logger.warning("Unable to find ExtJS in any of the following paths. The Oozie UI will not be available. Source Paths: {0}".format(source_ext_zip_paths)) ++ Logger.warning("Unable to find ExtJS in any of the following paths. The Oozie UI will not be available. Source Paths: {}".format(source_ext_zip_paths)) + + # Redownload jdbc driver to a new current location + oozie.download_database_library_if_needed() +@@ -139,8 +139,8 @@ + # copy the Falcon JAR if needed; falcon has not upgraded yet, so we must + # use the versioned falcon directory + if params.has_falcon_host: +- versioned_falcon_jar_directory = "{0}/{1}/falcon/oozie/ext/falcon-oozie-el-extension-*.jar".format(params.stack_root, stack_version) +- Logger.info("Copying {0} to {1}".format(versioned_falcon_jar_directory, params.oozie_libext_dir)) ++ versioned_falcon_jar_directory = "{}/{}/falcon/oozie/ext/falcon-oozie-el-extension-*.jar".format(params.stack_root, stack_version) ++ Logger.info("Copying {} to {}".format(versioned_falcon_jar_directory, params.oozie_libext_dir)) + + Execute(format('{sudo} cp {versioned_falcon_jar_directory} {oozie_libext_dir}')) + Execute(format('{sudo} chown {oozie_user}:{user_group} {oozie_libext_dir}/falcon-oozie-el-extension-*.jar')) +@@ -205,10 +205,10 @@ + # the database upgrade requires the db driver JAR, but since we have + # not yet run to upgrade the current points, we have to use + # the versioned libext directory as the location[[-vufdtffr, +- versioned_libext_dir = "{0}/{1}/oozie/libext".format(params.stack_root, stack_version) ++ versioned_libext_dir = "{}/{}/oozie/libext".format(params.stack_root, stack_version) + oozie.download_database_library_if_needed(target_directory=versioned_libext_dir) + +- database_upgrade_command = "{0}/{1}/oozie/bin/ooziedb.sh upgrade -run".format(params.stack_root, stack_version) ++ database_upgrade_command = "{}/{}/oozie/bin/ooziedb.sh upgrade -run".format(params.stack_root, stack_version) + Execute(database_upgrade_command, user=params.oozie_user, logoutput=True) + + # install new sharelib to HDFS +@@ -240,7 +240,7 @@ + type = "directory", + owner = params.oozie_user, + group = params.user_group, +- mode = 0755, ++ mode = 0o755, + recursive_chmod = True) + + params.HdfsResource(None, action = "execute") +@@ -252,7 +252,7 @@ + stack_version = upgrade_stack[1] + + # install new sharelib to HDFS +- sharelib_command = "{0}/{1}/oozie/bin/oozie-setup.sh sharelib create -fs {2}".format( ++ sharelib_command = "{}/{}/oozie/bin/oozie-setup.sh sharelib create -fs {}".format( + params.stack_root, stack_version, params.fs_root) + + Execute(sharelib_command, user=params.oozie_user, logoutput=True) +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/OOZIE/4.0.0.2.0/package/scripts/oozie_service.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/OOZIE/4.0.0.2.0/package/scripts/oozie_service.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/OOZIE/4.0.0.2.0/package/scripts/oozie_service.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/OOZIE/4.0.0.2.0/package/scripts/oozie_service.py 2022-07-11 00:52:32.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + """ + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file +@@ -97,15 +97,15 @@ + + if upgrade_type is None: + if not os.path.isfile(path_to_jdbc) and params.jdbc_driver_name == "org.postgresql.Driver": +- print format("ERROR: jdbc file {target} is unavailable. Please, follow next steps:\n" \ ++ print((format("ERROR: jdbc file {target} is unavailable. Please, follow next steps:\n" \ + "1) Download postgresql-9.0-801.jdbc4.jar.\n2) Create needed directory: mkdir -p {oozie_home}/libserver/\n" \ + "3) Copy postgresql-9.0-801.jdbc4.jar to newly created dir: cp /path/to/jdbc/postgresql-9.0-801.jdbc4.jar " \ + "{oozie_home}/libserver/\n4) Copy postgresql-9.0-801.jdbc4.jar to libext: cp " \ +- "/path/to/jdbc/postgresql-9.0-801.jdbc4.jar {oozie_home}/libext/\n") ++ "/path/to/jdbc/postgresql-9.0-801.jdbc4.jar {oozie_home}/libext/\n"))) + exit(1) + + if db_connection_check_command: +- sudo.chmod(params.check_db_connection_jar, 0755) ++ sudo.chmod(params.check_db_connection_jar, 0o755) + Execute( db_connection_check_command, + tries=5, + try_sleep=10, +@@ -134,7 +134,7 @@ + params.HdfsResource(format("{hdfs_share_dir}/lib/spark/hive-site.xml"), + action="create_on_execute", + type = 'file', +- mode=0444, ++ mode=0o444, + owner=params.oozie_user, + group=params.user_group, + source=format("{hive_conf_dir}/hive-site.xml"), +@@ -160,7 +160,7 @@ + params.HdfsResource(format("{oozie_hdfs_user_dir}/share"), + type="directory", + action="create_on_execute", +- mode=0755, ++ mode=0o755, + recursive_chmod=True, + ) + params.HdfsResource(None, action="execute") +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/OOZIE/4.0.0.2.0/package/scripts/params_linux.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/OOZIE/4.0.0.2.0/package/scripts/params_linux.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/OOZIE/4.0.0.2.0/package/scripts/params_linux.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/OOZIE/4.0.0.2.0/package/scripts/params_linux.py 2022-07-11 00:52:32.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + + from resource_management.core.utils import PasswordString + from ambari_commons.credential_store_helper import get_password_from_credential_store +-from urlparse import urlparse ++from urllib.parse import urlparse + + import status_params + import os +@@ -119,7 +119,7 @@ + # matches the version of oozie + falcon_home = format("{stack_root}/current/falcon-client") + if stack_version is not None: +- falcon_home = '{0}/{1}/falcon'.format(stack_root, stack_version) ++ falcon_home = '{}/{}/falcon'.format(stack_root, stack_version) + + conf_dir = format("{stack_root}/current/{oozie_root}/conf") + hive_conf_dir = format("{conf_dir}/action-conf/hive") +@@ -144,7 +144,7 @@ + oozie_user = config['configurations']['oozie-env']['oozie_user'] + 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 + service_check_queue_name = default('/configurations/yarn-env/service_check.queue.name', 'default') + + # This config actually contains {oozie_user} +@@ -343,7 +343,7 @@ + else: + log4j_props = None + +-oozie_hdfs_user_mode = 0775 ++oozie_hdfs_user_mode = 0o775 + hdfs_user_keytab = config['configurations']['hadoop-env']['hdfs_user_keytab'] + hdfs_user = config['configurations']['hadoop-env']['hdfs_user'] + hdfs_principal_name = config['configurations']['hadoop-env']['hdfs_principal_name'] +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/OOZIE/4.0.0.2.0/package/scripts/params.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/OOZIE/4.0.0.2.0/package/scripts/params.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/OOZIE/4.0.0.2.0/package/scripts/params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/OOZIE/4.0.0.2.0/package/scripts/params.py 2022-07-11 00:52:32.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/OOZIE/4.0.0.2.0/package/scripts/service_check.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/OOZIE/4.0.0.2.0/package/scripts/service_check.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/OOZIE/4.0.0.2.0/package/scripts/service_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/OOZIE/4.0.0.2.0/package/scripts/service_check.py 2022-07-11 00:52:32.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + """ + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file +@@ -58,11 +58,11 @@ + + File(format("{tmp_dir}/{file_name}"), + content=StaticFile(file_name), +- mode=0755 ++ mode=0o755 + ) + File(format("{tmp_dir}/{prepare_hdfs_file_name}"), + content=StaticFile(prepare_hdfs_file_name), +- mode=0755 ++ mode=0o755 + ) + + os_family = System.get_instance().os_family +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/OOZIE/4.0.0.2.0/package/scripts/status_params.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/OOZIE/4.0.0.2.0/package/scripts/status_params.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/OOZIE/4.0.0.2.0/package/scripts/status_params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/OOZIE/4.0.0.2.0/package/scripts/status_params.py 2022-07-11 00:52:32.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/PIG/0.12.0.2.0/package/scripts/params_linux.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/PIG/0.12.0.2.0/package/scripts/params_linux.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/PIG/0.12.0.2.0/package/scripts/params_linux.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/PIG/0.12.0.2.0/package/scripts/params_linux.py 2022-07-11 00:52:33.000000000 +0800 +@@ -62,7 +62,7 @@ + hdfs_user_keytab = config['configurations']['hadoop-env']['hdfs_user_keytab'] + 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 + user_group = config['configurations']['cluster-env']['user_group'] + security_enabled = config['configurations']['cluster-env']['security_enabled'] + smoke_user_keytab = config['configurations']['cluster-env']['smokeuser_keytab'] +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/PIG/0.12.0.2.0/package/scripts/pig.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/PIG/0.12.0.2.0/package/scripts/pig.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/PIG/0.12.0.2.0/package/scripts/pig.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/PIG/0.12.0.2.0/package/scripts/pig.py 2022-07-11 00:52:33.000000000 +0800 +@@ -43,13 +43,13 @@ + + File(format("{pig_conf_dir}/pig-env.sh"), + owner=params.hdfs_user, +- mode=0755, ++ mode=0o755, + content=InlineTemplate(params.pig_env_sh_template) + ) + + # pig_properties is always set to a default even if it's not in the payload + File(format("{params.pig_conf_dir}/pig.properties"), +- mode=0644, ++ mode=0o644, + group=params.user_group, + owner=params.hdfs_user, + content=params.pig_properties +@@ -57,14 +57,14 @@ + + if (params.log4j_props is not None): + File(format("{params.pig_conf_dir}/log4j.properties"), +- mode=0644, ++ mode=0o644, + group=params.user_group, + owner=params.hdfs_user, + content=params.log4j_props + ) + elif (os.path.exists(format("{params.pig_conf_dir}/log4j.properties"))): + File(format("{params.pig_conf_dir}/log4j.properties"), +- mode=0644, ++ mode=0o644, + group=params.user_group, + owner=params.hdfs_user + ) +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/PIG/0.12.0.2.0/package/scripts/service_check.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/PIG/0.12.0.2.0/package/scripts/service_check.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/PIG/0.12.0.2.0/package/scripts/service_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/PIG/0.12.0.2.0/package/scripts/service_check.py 2022-07-11 00:52:33.000000000 +0800 +@@ -73,7 +73,7 @@ + + File( format("{tmp_dir}/pigSmoke.sh"), + content = StaticFile("pigSmoke.sh"), +- mode = 0755 ++ mode = 0o755 + ) + + # check for Pig-on-M/R +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/PXF/3.0.0/package/alerts/api_status.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/PXF/3.0.0/package/alerts/api_status.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/PXF/3.0.0/package/alerts/api_status.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/PXF/3.0.0/package/alerts/api_status.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + """ + Licensed to the Apache Software Foundation (ASF) under one +@@ -21,8 +21,8 @@ + import logging + import json + import socket +-import urllib2 +-import urllib ++import urllib.request, urllib.error, urllib.parse ++import urllib.request, urllib.parse, urllib.error + + from resource_management.core import shell + from resource_management.libraries.functions.curl_krb_request import curl_krb_request +@@ -70,7 +70,7 @@ + Gets the kerberos delegation token from name node + """ + url = namenode_address + "/webhdfs/v1/?op=GETDELEGATIONTOKEN" +- logger.info("Getting delegation token from {0} for PXF".format(url)) ++ logger.info("Getting delegation token from {} for PXF".format(url)) + response, _, _ = curl_krb_request(Environment.get_instance().tmp_dir, + keytab, + principal, +@@ -96,13 +96,13 @@ + try: + data = None + if body: +- data = urllib.urlencode(body) +- req = urllib2.Request(url, data, header) ++ data = urllib.parse.urlencode(body) ++ req = urllib.request.Request(url, data, header) + +- response = urllib2.urlopen(req) ++ response = urllib.request.urlopen(req) + responseContent = response.read() + return responseContent +- except urllib2.URLError as e: ++ except urllib.error.URLError as e: + if hasattr(e, 'reason'): + logger.error( 'Reason: ' + str(e.reason)) + if hasattr(e, 'code'): +@@ -126,7 +126,7 @@ + if response: + import re + # Extract the v14 from the output +- match = re.search('.*(v\d*).*', response) ++ match = re.search(r'.*(v\d*).*', response) + if match: + return match.group(1) + +@@ -135,11 +135,11 @@ + + def _ensure_kerberos_authentication(user, principal, keytab_file, kinit_path): + kinit_path_local = get_kinit_path(kinit_path) +- shell.checked_call("{0} -kt {1} {2} > /dev/null".format(kinit_path_local, keytab_file, principal), ++ shell.checked_call("{} -kt {} {} > /dev/null".format(kinit_path_local, keytab_file, principal), + user=user) + + def execute(configurations={}, parameters={}, host_name=None): +- BASE_URL = "http://{0}:{1}/pxf/".format(host_name, PXF_PORT) ++ BASE_URL = "http://{}:{}/pxf/".format(host_name, PXF_PORT) + try: + # Get delegation token if security is enabled + if CLUSTER_ENV_SECURITY in configurations and configurations[CLUSTER_ENV_SECURITY].lower() == "true": +@@ -169,7 +169,7 @@ + raise Exception(message) + + except Exception as e: +- message = 'PXF is not functional on host, {0}: {1}'.format(host_name, e) ++ message = 'PXF is not functional on host, {}: {}'.format(host_name, e) + logger.exception(message) + return (RESULT_STATE_WARNING, [message]) + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/PXF/3.0.0/package/scripts/pxf.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/PXF/3.0.0/package/scripts/pxf.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/PXF/3.0.0/package/scripts/pxf.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/PXF/3.0.0/package/scripts/pxf.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + """ + Licensed to the Apache Software Foundation (ASF) under one +@@ -71,7 +71,7 @@ + + def __execute_service_command(self, command): + import pxf_constants +- Execute("service {0} {1}".format(pxf_constants.pxf_service_name, command), ++ Execute("service {} {}".format(pxf_constants.pxf_service_name, command), + timeout=pxf_constants.default_exec_timeout, + logoutput=True) + +@@ -96,18 +96,18 @@ + hdp_stack = "HDP" + + # Create file pxf-env.sh from jinja template +- File("{0}/pxf-env.sh".format(params.pxf_conf_dir), ++ File("{}/pxf-env.sh".format(params.pxf_conf_dir), + content = Template("pxf-env.j2")) + + # Classpath is set for PHD by default. If stack is HDP, set classpath for HDP + if(params.stack_name == hdp_stack): +- shutil.copy2("{0}/pxf-privatehdp.classpath".format(params.pxf_conf_dir), +- "{0}/pxf-private.classpath".format(params.pxf_conf_dir)) ++ shutil.copy2("{}/pxf-privatehdp.classpath".format(params.pxf_conf_dir), ++ "{}/pxf-private.classpath".format(params.pxf_conf_dir)) + +- File('{0}/pxf-public.classpath'.format(params.pxf_conf_dir), ++ File('{}/pxf-public.classpath'.format(params.pxf_conf_dir), + content = params.config['configurations']['pxf-public-classpath']['content'].lstrip()) + +- File('{0}/pxf-profiles.xml'.format(params.pxf_conf_dir), ++ File('{}/pxf-profiles.xml'.format(params.pxf_conf_dir), + content = params.config['configurations']['pxf-profiles']['content'].lstrip()) + + # Default_value of principal => pxf/_HOST@{realm} +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/PXF/3.0.0/package/scripts/pxf_utils.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/PXF/3.0.0/package/scripts/pxf_utils.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/PXF/3.0.0/package/scripts/pxf_utils.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/PXF/3.0.0/package/scripts/pxf_utils.py 2022-07-11 00:52:33.000000000 +0800 +@@ -18,8 +18,8 @@ + from resource_management.core.logger import Logger + + import socket +-import urllib2 +-import urllib ++import urllib.request, urllib.error, urllib.parse ++import urllib.request, urllib.parse, urllib.error + from ambari_commons import subprocess32 + + def makeHTTPCall(url, header={}, body=None): +@@ -30,13 +30,13 @@ + try: + data = None + if body: +- data = urllib.urlencode(body) +- req = urllib2.Request(url, data, header) ++ data = urllib.parse.urlencode(body) ++ req = urllib.request.Request(url, data, header) + +- response = urllib2.urlopen(req) ++ response = urllib.request.urlopen(req) + responseContent = response.read() + return responseContent +- except urllib2.URLError as e: ++ except urllib.error.URLError as e: + if hasattr(e, 'reason'): + Logger.error( 'Reason' + str(e.reason)) + if hasattr(e, 'code'): +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/PXF/3.0.0/package/scripts/service_check.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/PXF/3.0.0/package/scripts/service_check.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/PXF/3.0.0/package/scripts/service_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/PXF/3.0.0/package/scripts/service_check.py 2022-07-11 00:52:33.000000000 +0800 +@@ -83,7 +83,7 @@ + self.run_hive_tests() + + if self.checks_failed: +- Logger.error("***FAILURE*** - {0} out of {1} tests failed.".format(self.checks_failed,self.total_tests)) ++ Logger.error("***FAILURE*** - {} out of {} tests failed.".format(self.checks_failed,self.total_tests)) + sys.exit(1) + Logger.info("Service check completed successfully") + +@@ -98,16 +98,16 @@ + Logger.info(response) + # Sample response: 'PXF protocol version v14' + if not response: +- error_msg = "Fetch PXF version: Could not get response from \nurl = {0}".format(url) ++ error_msg = "Fetch PXF version: Could not get response from \nurl = {}".format(url) + Logger.error(error_msg) + + import re + # Extract the v14 from the output +- match = re.search('.*(v\d*).*', response) ++ match = re.search(r'.*(v\d*).*', response) + if match: + return match.group(1) + +- error_msg = "Fetch PXF Version: Could not find version in \nresponse ={0} \nurl = {1}".format(response, url) ++ error_msg = "Fetch PXF Version: Could not find version in \nresponse ={} \nurl = {}".format(response, url) + Logger.error(error_msg) + + def __check_pxf_read(self, headers): +@@ -118,10 +118,10 @@ + try: + response = makeHTTPCall(url, headers) + if not "PXFFragments" in response: +- Logger.error("Unable to find PXFFragments in the response. Response received from the server:\n{0}".format(response)) ++ Logger.error("Unable to find PXFFragments in the response. Response received from the server:\n{}".format(response)) + raise +- except Exception, ex: +- raise Fail("PXF data read failed: {0}".format(ex)) ++ except Exception as ex: ++ raise Fail("PXF data read failed: {}".format(ex)) + Logger.info("PXF data read successful") + + +@@ -131,14 +131,14 @@ + """ + import params + url = params.namenode_path + "/webhdfs/v1/?op=GETDELEGATIONTOKEN" +- Logger.info("Getting delegation token from {0}".format(url)) ++ Logger.info("Getting delegation token from {}".format(url)) + response, _, _ = curl_krb_request(Environment.get_instance().tmp_dir, keytab, principal, + url, "get_delegation_token", kinit_path, False, "Delegation Token", user) + json_response = json.loads(response) + if json_response['Token'] and json_response['Token']['urlString']: + return json_response['Token']['urlString'] + +- error_msg = "Get Token: Unable to get kerberos delegation token from webhdfs: \nurl = {0}, user = {1}, keytab = {2}, principal = {3}, kinit-path = {4} \nresponse = {5}".format(url, user, keytab, principal, kinit_path, json_response) ++ error_msg = "Get Token: Unable to get kerberos delegation token from webhdfs: \nurl = {}, user = {}, keytab = {}, principal = {}, kinit-path = {} \nresponse = {}".format(url, user, keytab, principal, kinit_path, json_response) + Logger.error(error_msg) + self.checks_failed += 1 + +@@ -147,7 +147,7 @@ + Checks if any YARN/MAPREDUCE2 component is installed on this host + """ + component_list = default("/localComponents", []) +- Logger.info("Checking for YARN/MAPREDUCE2 components in {0}".format(str(component_list))) ++ Logger.info("Checking for YARN/MAPREDUCE2 components in {}".format(str(component_list))) + return any([component in ["RESOURCEMANAGER", "NODEMANAGER", "HISTORYSERVER", "YARN_CLIENT", "MAPREDUCE2_CLIENT"] for component in component_list]) + + # HDFS Routines +@@ -171,9 +171,9 @@ + self.__check_pxf_hdfs_read() + self.__check_pxf_hdfs_write() + +- except Exception, ex: ++ except Exception as ex: + self.checks_failed += 1 +- Logger.error("HDFS test Failed: Exception occurred in HDFS test: {0}".format(ex)) ++ Logger.error("HDFS test Failed: Exception occurred in HDFS test: {}".format(ex)) + + finally: + self.__cleanup_hdfs_data() +@@ -188,7 +188,7 @@ + params.HdfsResource(pxf_constants.pxf_hdfs_test_dir, + type="directory", + action="create_on_execute", +- mode=0777 ++ mode=0o777 + ) + params.HdfsResource(pxf_constants.pxf_hdfs_read_test_file, + type="file", +@@ -196,8 +196,8 @@ + action="create_on_execute" + ) + params.HdfsResource(None, action="execute") +- except Exception, ex: +- raise Fail("HDFS Write: Exception occurred when writing to hdfs: {0} ".format(ex)) ++ except Exception as ex: ++ raise Fail("HDFS Write: Exception occurred when writing to hdfs: {} ".format(ex)) + + def __check_pxf_hdfs_read(self): + """ +@@ -233,10 +233,10 @@ + try: + response = makeHTTPCall(url, headers, body) + if not "wrote" in response: +- error_msg = "PXF HDFS data write: Could not find write in response : \nurl = {0} \nresponse = {1}".format(url, response) ++ error_msg = "PXF HDFS data write: Could not find write in response : \nurl = {} \nresponse = {}".format(url, response) + raise Fail(error_msg) + except: +- error_msg = "PXF HDFS data write test failed with url= {0}".format(url) ++ error_msg = "PXF HDFS data write test failed with url= {}".format(url) + raise Fail(error_msg) + + def __cleanup_hdfs_data(self): +@@ -264,15 +264,15 @@ + Logger.info("Running PXF HBase service checks") + self.__check_if_client_exists("HBase") + self.__create_hbase_scripts() +- kinit_cmd = "{0} -kt {1} {2};".format(params.kinit_path_local, params.hbase_user_keytab, params.hbase_principal_name) if params.security_enabled else "" ++ kinit_cmd = "{} -kt {} {};".format(params.kinit_path_local, params.hbase_user_keytab, params.hbase_principal_name) if params.security_enabled else "" + try: + message = "Creating temporary HBase smoke test table with data" + self.__run_hbase_script(pxf_constants.hbase_populate_data_script, kinit_cmd, message) + self.__check_pxf_hbase_read() + +- except Exception, ex: ++ except Exception as ex: + self.checks_failed += 1 +- Logger.error("HBASE test Failed: Exception occurred in HBASE test: {0}".format(ex)) ++ Logger.error("HBASE test Failed: Exception occurred in HBASE test: {}".format(ex)) + + finally: + message = "Cleaning up HBase smoke test table" +@@ -290,17 +290,17 @@ + "put '{0}', 'row1', 'cf:a', 'value1'\n" \ + "put '{0}', 'row1', 'cf:b', 'value2'".format(pxf_constants.pxf_hbase_test_table) + +- File("{0}".format(os.path.join(params.exec_tmp_dir, pxf_constants.hbase_populate_data_script)), +- content=InlineTemplate("{0}".format(hbase_populate_data_cmds))) ++ File("{}".format(os.path.join(params.exec_tmp_dir, pxf_constants.hbase_populate_data_script)), ++ content=InlineTemplate("{}".format(hbase_populate_data_cmds))) + + hbase_cleanup_data_cmds = "disable '{0}'\n" \ + "drop '{0}'".format(pxf_constants.pxf_hbase_test_table) + +- File("{0}".format(os.path.join(params.exec_tmp_dir, pxf_constants.hbase_cleanup_data_script)), +- content=InlineTemplate("{0}".format(hbase_cleanup_data_cmds))) ++ File("{}".format(os.path.join(params.exec_tmp_dir, pxf_constants.hbase_cleanup_data_script)), ++ content=InlineTemplate("{}".format(hbase_cleanup_data_cmds))) + +- except Exception, ex: +- raise Fail("Create HBASE Script: Could not create hbase_scripts: {0}".format(ex)) ++ except Exception as ex: ++ raise Fail("Create HBASE Script: Could not create hbase_scripts: {}".format(ex)) + + def __run_hbase_script(self, script, kinit_cmd, message): + """ +@@ -336,33 +336,33 @@ + hive_populate_data_cmds = "DROP TABLE IF EXISTS {0};\n" \ + "CREATE TABLE {0} (id INT);\n" \ + "INSERT INTO {0} VALUES (1);".format(pxf_constants.pxf_hive_test_table) +- File("{0}/{1}".format(params.exec_tmp_dir, pxf_constants.hive_populate_data_script), +- content=InlineTemplate("{0}".format(hive_populate_data_cmds))) ++ File("{}/{}".format(params.exec_tmp_dir, pxf_constants.hive_populate_data_script), ++ content=InlineTemplate("{}".format(hive_populate_data_cmds))) + + # Get the parameters required to create jdbc url for beeline + hive_server_port = default("/configurations/hive-site/hive.server2.thrift.port", None) + hive_server_host = default("/clusterHostInfo/hive_server_hosts", None) + if hive_server_host is None or hive_server_port is None: + raise Fail("Input parameters are invalid for beeline connection string, both hive_server_host and " \ +- "hive.server2.thrift.port should be not None. Current values are:\nhive_server_host={0}\n" \ +- "hive.server2.thrift.port={1}".format(hive_server_host, hive_server_port)) +- jdbc_url = "jdbc:hive2://{0}:{1}/default".format(hive_server_host[0], hive_server_port) +- beeline_conn_cmd = "beeline -u '{0}'".format(jdbc_url) ++ "hive.server2.thrift.port should be not None. Current values are:\nhive_server_host={}\n" \ ++ "hive.server2.thrift.port={}".format(hive_server_host, hive_server_port)) ++ jdbc_url = "jdbc:hive2://{}:{}/default".format(hive_server_host[0], hive_server_port) ++ beeline_conn_cmd = "beeline -u '{}'".format(jdbc_url) + + if params.security_enabled: + hive_server_principal = default('/configurations/hive-site/hive.server2.authentication.kerberos.principal', None) + if hive_server_principal is None: + raise Fail("Input parameter invalid for beeline connection string, hive.server2.authentication.kerberos.principal " \ + "should be not None") +- beeline_conn_cmd = "beeline -u '{0};principal={1}'".format(jdbc_url, hive_server_principal) ++ beeline_conn_cmd = "beeline -u '{};principal={}'".format(jdbc_url, hive_server_principal) + + try: + self.__write_hive_data(beeline_conn_cmd) + self.__check_pxf_hive_read() + +- except Exception, ex: ++ except Exception as ex: + self.checks_failed += 1 +- Logger.error("HIVE test Failed: Exception occurred in HIVE test: {0}".format(ex)) ++ Logger.error("HIVE test Failed: Exception occurred in HIVE test: {}".format(ex)) + + finally: + self.__cleanup_hive_data(beeline_conn_cmd) +@@ -374,11 +374,11 @@ + try: + import params + Logger.info("Creating temporary Hive smoke test table with data") +- cmd = "{0} -f {1}".format(beeline_conn_cmd, os.path.join(params.exec_tmp_dir, pxf_constants.hive_populate_data_script)) ++ cmd = "{} -f {}".format(beeline_conn_cmd, os.path.join(params.exec_tmp_dir, pxf_constants.hive_populate_data_script)) + Execute(cmd, logoutput=True, user=params.hdfs_user) + +- except Exception, ex: +- raise Fail("HIVE write: Could not write hive data: {0} \n command = {1}".format(ex, cmd)) ++ except Exception as ex: ++ raise Fail("HIVE write: Could not write hive data: {} \n command = {}".format(ex, cmd)) + + def __check_pxf_hive_read(self): + """ +@@ -398,7 +398,7 @@ + """ + import params + Logger.info("Cleaning up Hive test data") +- cmd = "{0} -e 'DROP TABLE IF EXISTS {1};'".format(beeline_conn_cmd, pxf_constants.pxf_hive_test_table) ++ cmd = "{} -e 'DROP TABLE IF EXISTS {};'".format(beeline_conn_cmd, pxf_constants.pxf_hive_test_table) + Execute(cmd, logoutput=True, user=params.hdfs_user) + + # Package Routines +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/PXF/3.0.0/service_advisor.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/PXF/3.0.0/service_advisor.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/PXF/3.0.0/service_advisor.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/PXF/3.0.0/service_advisor.py 2022-07-11 00:52:33.000000000 +0800 +@@ -31,7 +31,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 PXF300ServiceAdvisor(service_advisor.ServiceAdvisor): + +@@ -39,7 +39,7 @@ + # colocate PXF with NAMENODE and DATANODE, if no hosts have been allocated for PXF + pxf = [component for component in serviceComponents if component["StackServiceComponents"]["component_name"] == "PXF"][0] + if not self.isComponentHostsPopulated(pxf): +- for hostName in hostsComponentsMap.keys(): ++ for hostName in list(hostsComponentsMap.keys()): + hostComponents = hostsComponentsMap[hostName] + if ({"name": "NAMENODE"} in hostComponents or {"name": "DATANODE"} in hostComponents) \ + and {"name": "PXF"} not in hostComponents: +@@ -61,7 +61,7 @@ + if len(mismatchHosts) > 0: + hostsString = ', '.join(mismatchHosts) + message = "PXF must be installed on the NameNode, Standby NameNode and all DataNodes. " \ +- "The following {0} host(s) do not satisfy the colocation recommendation: {1}".format(len(mismatchHosts), hostsString) ++ "The following {} host(s) do not satisfy the colocation recommendation: {}".format(len(mismatchHosts), hostsString) + items.append( { "type": 'host-component', "level": 'WARN', "message": message, "component-name": 'PXF' } ) + + return items +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/RANGER/0.4.0/package/alerts/alert_ranger_admin_passwd_check.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/RANGER/0.4.0/package/alerts/alert_ranger_admin_passwd_check.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/RANGER/0.4.0/package/alerts/alert_ranger_admin_passwd_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/RANGER/0.4.0/package/alerts/alert_ranger_admin_passwd_check.py 2022-07-11 00:52:34.000000000 +0800 +@@ -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 base64 +-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 + from resource_management.core.environment import Environment +@@ -74,8 +74,8 @@ + ranger_link = configurations[RANGER_ADMIN_URL] + if ranger_link.endswith('/'): + ranger_link = ranger_link[:-1] +- ranger_auth_link = '{0}/{1}'.format(ranger_link, 'service/public/api/repository/count') +- ranger_get_user = '{0}/{1}'.format(ranger_link, 'service/xusers/users') ++ ranger_auth_link = '{}/{}'.format(ranger_link, 'service/public/api/repository/count') ++ ranger_get_user = '{}/{}'.format(ranger_link, 'service/xusers/users') + + if ADMIN_USERNAME in configurations: + admin_username = configurations[ADMIN_USERNAME] +@@ -107,24 +107,24 @@ + user_http_code = check_ranger_login(ranger_auth_link, ranger_admin_username, ranger_admin_password) + if user_http_code == 200: + result_code = 'OK' +- label = 'Login Successful for users {0} and {1}'.format(admin_username, ranger_admin_username) ++ label = 'Login Successful for users {} and {}'.format(admin_username, ranger_admin_username) + elif user_http_code == 401: + result_code = 'CRITICAL' +- label = 'User:{0} credentials on Ambari UI are not in sync with Ranger'.format(ranger_admin_username) ++ label = 'User:{} credentials on Ambari UI are not in sync with Ranger'.format(ranger_admin_username) + else: + result_code = 'WARNING' + label = 'Ranger Admin service is not reachable, please restart the service' + else: + result_code = 'OK' +- label = 'Login Successful for user: {0}. User:{1} user not yet synced with Ranger'.format(admin_username, ranger_admin_username) ++ label = 'Login Successful for user: {}. User:{} user not yet synced with Ranger'.format(admin_username, ranger_admin_username) + elif admin_http_code == 401: + result_code = 'CRITICAL' +- label = 'User:{0} credentials on Ambari UI are not in sync with Ranger'.format(admin_username) ++ label = 'User:{} credentials on Ambari UI are not in sync with Ranger'.format(admin_username) + else: + result_code = 'WARNING' + label = 'Ranger Admin service is not reachable, please restart the service' + +- except Exception, e: ++ except Exception as e: + label = str(e) + result_code = 'UNKNOWN' + logger.exception(label) +@@ -140,24 +140,24 @@ + return response code + """ + try: +- usernamepassword = '{0}:{1}'.format(username, password) ++ usernamepassword = '{}:{}'.format(username, password) + base_64_string = base64.encodestring(usernamepassword).replace('\n', '') +- request = urllib2.Request(ranger_auth_link) ++ request = urllib.request.Request(ranger_auth_link) + request.add_header("Content-Type", "application/json") + request.add_header("Accept", "application/json") +- request.add_header("Authorization", "Basic {0}".format(base_64_string)) +- result = urllib2.urlopen(request, timeout=20) ++ request.add_header("Authorization", "Basic {}".format(base_64_string)) ++ result = urllib.request.urlopen(request, timeout=20) + response_code = result.getcode() + if response_code == 200: + response = json.loads(result.read()) + return response_code +- except urllib2.HTTPError, e: +- logger.exception("Error during Ranger service authentication. Http status code - {0}. {1}".format(e.code, e.read())) ++ except urllib.error.HTTPError as e: ++ logger.exception("Error during Ranger service authentication. Http status code - {}. {}".format(e.code, e.read())) + return e.code +- except urllib2.URLError, e: +- logger.exception("Error during Ranger service authentication. {0}".format(e.reason)) ++ except urllib.error.URLError as e: ++ logger.exception("Error during Ranger service authentication. {}".format(e.reason)) + return None +- except Exception, e: ++ except Exception as e: + return 401 + + def get_ranger_user(ranger_get_user, username, password, user): +@@ -169,14 +169,14 @@ + return Boolean if user exist or not + """ + try: +- url = '{0}?name={1}'.format(ranger_get_user, user) +- usernamepassword = '{0}:{1}'.format(username, password) ++ url = '{}?name={}'.format(ranger_get_user, user) ++ usernamepassword = '{}:{}'.format(username, password) + base_64_string = base64.encodestring(usernamepassword).replace('\n', '') +- request = urllib2.Request(url) ++ request = urllib.request.Request(url) + request.add_header("Content-Type", "application/json") + request.add_header("Accept", "application/json") +- request.add_header("Authorization", "Basic {0}".format(base_64_string)) +- result = urllib2.urlopen(request, timeout=20) ++ request.add_header("Authorization", "Basic {}".format(base_64_string)) ++ result = urllib.request.urlopen(request, timeout=20) + response_code = result.getcode() + response = json.loads(result.read()) + if response_code == 200 and len(response['vXUsers']) > 0: +@@ -185,11 +185,11 @@ + return True + else: + return False +- except urllib2.HTTPError, e: +- logger.exception("Error getting user from Ranger service. Http status code - {0}. {1}".format(e.code, e.read())) ++ except urllib.error.HTTPError as e: ++ logger.exception("Error getting user from Ranger service. Http status code - {}. {}".format(e.code, e.read())) + return False +- except urllib2.URLError, e: +- logger.exception("Error getting user from Ranger service. {0}".format(e.reason)) ++ except urllib.error.URLError as e: ++ logger.exception("Error getting user from Ranger service. {}".format(e.reason)) + return False +- except Exception, e: ++ except Exception as e: + return False +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/RANGER/0.4.0/package/scripts/params.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/RANGER/0.4.0/package/scripts/params.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/RANGER/0.4.0/package/scripts/params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/RANGER/0.4.0/package/scripts/params.py 2022-07-11 00:52:34.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + """ + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file +@@ -159,11 +159,11 @@ + + sql_command_invoker = config['configurations']['admin-properties']['SQL_COMMAND_INVOKER'] + db_root_user = config['configurations']['admin-properties']['db_root_user'] +-db_root_password = unicode(config['configurations']['admin-properties']['db_root_password']) ++db_root_password = str(config['configurations']['admin-properties']['db_root_password']) + db_host = config['configurations']['admin-properties']['db_host'] + ranger_db_user = config['configurations']['admin-properties']['db_user'] + ranger_audit_db_user = default('/configurations/admin-properties/audit_db_user', 'rangerlogger') +-ranger_db_password = unicode(config['configurations']['admin-properties']['db_password']) ++ranger_db_password = str(config['configurations']['admin-properties']['db_password']) + + #ranger-env properties + oracle_home = default("/configurations/ranger-env/oracle_home", "-") +@@ -228,12 +228,12 @@ + + ranger_credential_provider_path = config["configurations"]["ranger-admin-site"]["ranger.credential.provider.path"] + ranger_jpa_jdbc_credential_alias = config["configurations"]["ranger-admin-site"]["ranger.jpa.jdbc.credential.alias"] +-ranger_ambari_db_password = unicode(config["configurations"]["admin-properties"]["db_password"]) ++ranger_ambari_db_password = str(config["configurations"]["admin-properties"]["db_password"]) + + ranger_jpa_audit_jdbc_credential_alias = default('/configurations/ranger-admin-site/ranger.jpa.audit.jdbc.credential.alias', 'rangeraudit') + ranger_ambari_audit_db_password = '' + if not is_empty(config["configurations"]["admin-properties"]["audit_db_password"]) and stack_supports_ranger_audit_db: +- ranger_ambari_audit_db_password = unicode(config["configurations"]["admin-properties"]["audit_db_password"]) ++ ranger_ambari_audit_db_password = str(config["configurations"]["admin-properties"]["audit_db_password"]) + + ugsync_jceks_path = config["configurations"]["ranger-ugsync-site"]["ranger.usersync.credstore.filename"] + ugsync_cred_lib = os.path.join(usersync_home,"lib","*") +@@ -242,9 +242,9 @@ + ranger_audit_source_type = config["configurations"]["ranger-admin-site"]["ranger.audit.source.type"] + + if xml_configurations_supported: +- ranger_usersync_keystore_password = unicode(config["configurations"]["ranger-ugsync-site"]["ranger.usersync.keystore.password"]) +- ranger_usersync_ldap_ldapbindpassword = unicode(config["configurations"]["ranger-ugsync-site"]["ranger.usersync.ldap.ldapbindpassword"]) +- ranger_usersync_truststore_password = unicode(config["configurations"]["ranger-ugsync-site"]["ranger.usersync.truststore.password"]) ++ ranger_usersync_keystore_password = str(config["configurations"]["ranger-ugsync-site"]["ranger.usersync.keystore.password"]) ++ ranger_usersync_ldap_ldapbindpassword = str(config["configurations"]["ranger-ugsync-site"]["ranger.usersync.ldap.ldapbindpassword"]) ++ ranger_usersync_truststore_password = str(config["configurations"]["ranger-ugsync-site"]["ranger.usersync.truststore.password"]) + ranger_usersync_keystore_file = config["configurations"]["ranger-ugsync-site"]["ranger.usersync.keystore.file"] + default_dn_name = 'cn=unixauthservice,ou=authenticator,o=mycompany,c=US' + +@@ -390,7 +390,7 @@ + + core_site_auth_to_local_property = '' + for item in range(len(rule_dict)): +- rule_line = 'RULE:[2:$1@$0]({0}@{1})s/.*/{2}/\n'.format(rule_dict[item]['principal'], realm, rule_dict[item]['user']) ++ rule_line = 'RULE:[2:$1@$0]({}@{})s/.*/{}/\n'.format(rule_dict[item]['principal'], realm, rule_dict[item]['user']) + core_site_auth_to_local_property = rule_line + core_site_auth_to_local_property + + core_site_auth_to_local_property = core_site_auth_to_local_property + 'DEFAULT' +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/RANGER/0.4.0/package/scripts/ranger_admin.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/RANGER/0.4.0/package/scripts/ranger_admin.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/RANGER/0.4.0/package/scripts/ranger_admin.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/RANGER/0.4.0/package/scripts/ranger_admin.py 2022-07-11 00:52:34.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + """ + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file +@@ -217,7 +217,7 @@ + if stack_select_packages is None: + raise Fail("Unable to get packages for stack-select") + +- Logger.info("RANGER_ADMIN component will be stack-selected to version {0} using a {1} orchestration".format(params.version, orchestration.upper())) ++ Logger.info("RANGER_ADMIN component will be stack-selected to version {} using a {} orchestration".format(params.version, orchestration.upper())) + + for stack_select_package_name in stack_select_packages: + stack_select.select(stack_select_package_name, params.version) +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/RANGER/0.4.0/package/scripts/ranger_service.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/RANGER/0.4.0/package/scripts/ranger_service.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/RANGER/0.4.0/package/scripts/ranger_service.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/RANGER/0.4.0/package/scripts/ranger_service.py 2022-07-11 00:52:34.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/RANGER/0.4.0/package/scripts/ranger_tagsync.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/RANGER/0.4.0/package/scripts/ranger_tagsync.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/RANGER/0.4.0/package/scripts/ranger_tagsync.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/RANGER/0.4.0/package/scripts/ranger_tagsync.py 2022-07-11 00:52:34.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + owner = params.unix_user, + group = params.unix_group, + only_if = format("test -e {tagsync_jceks_path}"), +- mode = 0640 ++ mode = 0o640 + ) + + update_dot_jceks_crc_ownership(credential_provider_path = params.tagsync_jceks_path, user = params.unix_user, group = params.unix_group) +@@ -122,7 +122,7 @@ + if stack_select_packages is None: + raise Fail("Unable to get packages for stack-select") + +- Logger.info("RANGER_TAGSYNC component will be stack-selected to version {0} using a {1} orchestration".format(params.version, orchestration.upper())) ++ Logger.info("RANGER_TAGSYNC component will be stack-selected to version {} using a {} orchestration".format(params.version, orchestration.upper())) + + for stack_select_package_name in stack_select_packages: + stack_select.select(stack_select_package_name, params.version) +@@ -143,7 +143,7 @@ + owner = params.unix_user, + group = params.unix_group, + only_if = format("test -e {atlas_tagsync_jceks_path}"), +- mode = 0640 ++ mode = 0o640 + ) + + update_dot_jceks_crc_ownership(credential_provider_path = params.atlas_tagsync_jceks_path, user = params.unix_user, group = params.unix_group) +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/RANGER/0.4.0/package/scripts/ranger_usersync.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/RANGER/0.4.0/package/scripts/ranger_usersync.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/RANGER/0.4.0/package/scripts/ranger_usersync.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/RANGER/0.4.0/package/scripts/ranger_usersync.py 2022-07-11 00:52:34.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + File(params.ugsync_policymgr_keystore, + owner = params.unix_user, + group = params.unix_group, +- mode = 0640 ++ mode = 0o640 + ) + + self.configure(env) +@@ -74,7 +74,7 @@ + if upgrade_type == UPGRADE_TYPE_NON_ROLLING and params.upgrade_direction == Direction.UPGRADE: + if params.stack_supports_usersync_non_root and os.path.isfile(params.usersync_services_file): + File(params.usersync_services_file, +- mode = 0755 ++ mode = 0o755 + ) + Execute(('ln','-sf', format('{usersync_services_file}'),'/usr/bin/ranger-usersync'), + not_if=format("ls /usr/bin/ranger-usersync"), +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/RANGER/0.4.0/package/scripts/setup_ranger.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/RANGER/0.4.0/package/scripts/setup_ranger.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/RANGER/0.4.0/package/scripts/setup_ranger.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/RANGER/0.4.0/package/scripts/setup_ranger.py 2022-07-11 00:52:34.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + """ + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file +@@ -48,14 +48,14 @@ + + File(params.downloaded_custom_connector, + content = DownloadSource(params.driver_curl_source), +- mode = 0644 ++ mode = 0o644 + ) + + Execute(('cp', '--remove-destination', params.downloaded_custom_connector, params.driver_curl_target), + path=["/bin", "/usr/bin/"], + sudo=True) + +- File(params.driver_curl_target, mode=0644) ++ File(params.driver_curl_target, mode=0o644) + + ModifyPropertiesFile(format("{ranger_home}/install.properties"), + properties = params.config['configurations']['admin-properties'] +@@ -91,7 +91,7 @@ + + ModifyPropertiesFile(format("{ranger_conf}/ranger_webserver.properties"), + properties = params.config['configurations']['ranger-site'], +- mode=0744 ++ mode=0o744 + ) + + Directory(params.admin_log_dir, +@@ -121,7 +121,7 @@ + owner = params.unix_user + ) + File(params.usersync_services_file, +- mode = 0755, ++ mode = 0o755, + ) + + Directory(params.usersync_log_dir, +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/RANGER/0.4.0/package/scripts/setup_ranger_xml.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/RANGER/0.4.0/package/scripts/setup_ranger_xml.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/RANGER/0.4.0/package/scripts/setup_ranger_xml.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/RANGER/0.4.0/package/scripts/setup_ranger_xml.py 2022-07-11 00:52:34.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + """ + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file +@@ -72,7 +72,7 @@ + + 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, + ) + + cp = format("{check_db_connection_jar}") +@@ -113,7 +113,7 @@ + ) + + Directory(params.ranger_pid_dir, +- mode=0755, ++ mode=0o755, + owner = params.unix_user, + group = params.user_group, + cd_access = "a", +@@ -124,7 +124,7 @@ + content = format("export JAVA_HOME={java_home}"), + owner = params.unix_user, + group = params.unix_group, +- mode = 0755 ++ mode = 0o755 + ) + + if params.stack_supports_pid: +@@ -132,7 +132,7 @@ + content = format("export RANGER_PID_DIR_PATH={ranger_pid_dir}\nexport RANGER_USER={unix_user}"), + owner = params.unix_user, + group = params.unix_group, +- mode=0755 ++ mode=0o755 + ) + + Directory(params.admin_log_dir, +@@ -140,20 +140,20 @@ + group = params.unix_group, + create_parents = True, + cd_access='a', +- mode=0755 ++ mode=0o755 + ) + + File(format('{ranger_conf}/ranger-admin-env-logdir.sh'), + content = format("export RANGER_ADMIN_LOG_DIR={admin_log_dir}"), + owner = params.unix_user, + group = params.unix_group, +- mode=0755 ++ mode=0o755 + ) + + if os.path.isfile(params.ranger_admin_default_file): + File(params.ranger_admin_default_file, owner=params.unix_user, group=params.unix_group) + else: +- Logger.warning('Required file {0} does not exist, copying the file to {1} path'.format(params.ranger_admin_default_file, ranger_conf)) ++ Logger.warning('Required file {} does not exist, copying the file to {} path'.format(params.ranger_admin_default_file, ranger_conf)) + src_file = format('{ranger_home}/ews/webapp/WEB-INF/classes/conf.dist/ranger-admin-default-site.xml') + dst_file = format('{ranger_home}/conf/ranger-admin-default-site.xml') + Execute(('cp', '-f', src_file, dst_file), sudo=True) +@@ -162,7 +162,7 @@ + if os.path.isfile(params.security_app_context_file): + File(params.security_app_context_file, owner=params.unix_user, group=params.unix_group) + else: +- Logger.warning('Required file {0} does not exist, copying the file to {1} path'.format(params.security_app_context_file, ranger_conf)) ++ Logger.warning('Required file {} does not exist, copying the file to {} path'.format(params.security_app_context_file, ranger_conf)) + src_file = format('{ranger_home}/ews/webapp/WEB-INF/classes/conf.dist/security-applicationContext.xml') + dst_file = format('{ranger_home}/conf/security-applicationContext.xml') + Execute(('cp', '-f', src_file, dst_file), sudo=True) +@@ -185,7 +185,7 @@ + content=Template('ranger_admin_pam.j2'), + owner = params.unix_user, + group = params.unix_group, +- mode=0644 ++ mode=0o644 + ) + if os.path.isfile(os.path.join(d, 'ranger-remote')): + Logger.info('ranger-remote PAM file already exists.') +@@ -194,7 +194,7 @@ + content=Template('ranger_remote_pam.j2'), + owner = params.unix_user, + group = params.unix_group, +- mode=0644 ++ mode=0o644 + ) + else: + Logger.error("Unable to use PAM authentication, /etc/pam.d/ directory does not exist.") +@@ -218,10 +218,10 @@ + configuration_attributes=params.config['configurationAttributes']['ranger-admin-site'], + owner=params.unix_user, + group=params.unix_group, +- mode=0644) ++ mode=0o644) + + Directory(os.path.join(ranger_conf,'ranger_jaas'), +- mode=0700, ++ mode=0o700, + owner=params.unix_user, + group=params.unix_group, + ) +@@ -231,7 +231,7 @@ + owner=params.unix_user, + group=params.unix_group, + content=InlineTemplate(params.admin_log4j), +- mode=0644 ++ mode=0o644 + ) + + do_keystore_setup(upgrade_type=upgrade_type) +@@ -246,7 +246,7 @@ + configuration_attributes=params.config['configurationAttributes']['hbase-site'], + owner=params.unix_user, + group=params.unix_group, +- mode=0644 ++ mode=0o644 + ) + + if params.is_namenode_ha_enabled and params.ranger_hdfs_plugin_enabled: +@@ -256,7 +256,7 @@ + configuration_attributes=params.config['configurationAttributes']['hdfs-site'], + owner=params.unix_user, + group=params.unix_group, +- mode=0644 ++ mode=0o644 + ) + + def setup_ranger_db(stack_version=None): +@@ -351,7 +351,7 @@ + owner = params.unix_user, + group = params.unix_group, + only_if = format("test -e {ranger_credential_provider_path}"), +- mode = 0640 ++ mode = 0o640 + ) + + update_dot_jceks_crc_ownership(credential_provider_path = params.ranger_credential_provider_path, user = params.unix_user, group = params.unix_group) +@@ -360,8 +360,8 @@ + import params + if password.strip() == "": + raise Fail("Blank password is not allowed for Bind user. Please enter valid password.") +- if re.search("[\\\`'\"]",password): +- raise Fail("LDAP/AD bind password contains one of the unsupported special characters like \" ' \ `") ++ if re.search("[\\\\`'\"]",password): ++ raise Fail("LDAP/AD bind password contains one of the unsupported special characters like \" ' \\ `") + else: + Logger.info("password validated") + +@@ -378,7 +378,7 @@ + + File(params.downloaded_custom_connector, + content = DownloadSource(params.driver_curl_source), +- mode = 0644 ++ mode = 0o644 + ) + + driver_curl_target = format("{ranger_home}/ews/lib/{jdbc_jar_name}") +@@ -390,7 +390,7 @@ + path=["/bin", "/usr/bin/"], + sudo=True) + +- File(os.path.join(ranger_home, 'ews', 'lib', 'sajdbc4.jar'), mode=0644) ++ File(os.path.join(ranger_home, 'ews', 'lib', 'sajdbc4.jar'), mode=0o644) + + Directory(params.jdbc_libs_dir, + cd_access="a", +@@ -403,7 +403,7 @@ + path=["/bin", "/usr/bin/"], + sudo=True) + +- File(os.path.join(ranger_home, 'ews', 'lib',params.jdbc_jar_name), mode=0644) ++ File(os.path.join(ranger_home, 'ews', 'lib',params.jdbc_jar_name), mode=0o644) + + ModifyPropertiesFile(format("{ranger_home}/install.properties"), + properties = params.config['configurations']['admin-properties'], +@@ -432,7 +432,7 @@ + password_validation(params.ranger_usersync_ldap_ldapbindpassword) + + Directory(params.ranger_pid_dir, +- mode=0755, ++ mode=0o755, + owner = params.unix_user, + group = params.user_group, + cd_access = "a", +@@ -444,7 +444,7 @@ + content = format("export USERSYNC_PID_DIR_PATH={ranger_pid_dir}\nexport UNIX_USERSYNC_USER={unix_user}"), + owner = params.unix_user, + group = params.unix_group, +- mode=0755 ++ mode=0o755 + ) + + Directory(params.usersync_log_dir, +@@ -452,7 +452,7 @@ + group = params.unix_group, + cd_access = 'a', + create_parents=True, +- mode=0755, ++ mode=0o755, + recursive_ownership = True + ) + +@@ -460,7 +460,7 @@ + content = format("export logdir={usersync_log_dir}"), + owner = params.unix_user, + group = params.unix_group, +- mode=0755 ++ mode=0o755 + ) + + Directory(format("{ranger_ugsync_conf}/"), +@@ -477,7 +477,7 @@ + owner=params.unix_user, + group=params.unix_group, + content=InlineTemplate(params.usersync_log4j), +- mode=0644 ++ mode=0o644 + ) + elif upgrade_type is not None and not params.stack_supports_ranger_log4j: + src_file = format('{usersync_home}/conf.dist/log4j.xml') +@@ -497,7 +497,7 @@ + configuration_attributes=params.config['configurationAttributes']['ranger-ugsync-site'], + owner=params.unix_user, + group=params.unix_group, +- mode=0644) ++ mode=0o644) + + if os.path.isfile(params.ranger_ugsync_default_file): + File(params.ranger_ugsync_default_file, owner=params.unix_user, group=params.unix_group) +@@ -506,7 +506,7 @@ + File(params.usgsync_log4j_file, owner=params.unix_user, group=params.unix_group) + + if os.path.isfile(params.cred_validator_file): +- File(params.cred_validator_file, group=params.unix_group, mode=04555) ++ File(params.cred_validator_file, group=params.unix_group, mode=0o4555) + + ranger_credential_helper(params.ugsync_cred_lib, 'usersync.ssl.key.password', params.ranger_usersync_keystore_password, params.ugsync_jceks_path) + +@@ -519,7 +519,7 @@ + owner = params.unix_user, + group = params.unix_group, + only_if = format("test -e {ugsync_jceks_path}"), +- mode = 0640 ++ mode = 0o640 + ) + + update_dot_jceks_crc_ownership(credential_provider_path = params.ugsync_jceks_path, user = params.unix_user, group = params.unix_group) +@@ -530,7 +530,7 @@ + ) + + File(params.usersync_services_file, +- mode = 0755, ++ mode = 0o755, + ) + + if upgrade_type is not None and params.stack_supports_config_versioning: +@@ -552,7 +552,7 @@ + File(params.ranger_usersync_keystore_file, + owner = params.unix_user, + group = params.unix_group, +- mode = 0640 ++ mode = 0o640 + ) + + create_core_site_xml(ranger_ugsync_conf) +@@ -571,7 +571,7 @@ + ) + + Directory(params.ranger_pid_dir, +- mode=0755, ++ mode=0o755, + create_parents=True, + owner = params.unix_user, + group = params.user_group, +@@ -583,7 +583,7 @@ + content = format("export TAGSYNC_PID_DIR_PATH={ranger_pid_dir}\nexport UNIX_TAGSYNC_USER={unix_user}"), + owner = params.unix_user, + group = params.unix_group, +- mode=0755 ++ mode=0o755 + ) + + Directory(params.tagsync_log_dir, +@@ -591,14 +591,14 @@ + owner = params.unix_user, + group = params.unix_group, + cd_access = "a", +- mode=0755 ++ mode=0o755 + ) + + File(format('{ranger_tagsync_conf}/ranger-tagsync-env-logdir.sh'), + content = format("export RANGER_TAGSYNC_LOG_DIR={tagsync_log_dir}"), + owner = params.unix_user, + group = params.unix_group, +- mode=0755 ++ mode=0o755 + ) + + XmlConfig("ranger-tagsync-site.xml", +@@ -607,7 +607,7 @@ + configuration_attributes=params.config['configurationAttributes']['ranger-tagsync-site'], + owner=params.unix_user, + group=params.unix_group, +- mode=0644) ++ mode=0o644) + + if params.stack_supports_ranger_tagsync_ssl_xml_support: + Logger.info("Stack supports tagsync-ssl configurations, performing the same.") +@@ -617,7 +617,7 @@ + + PropertiesFile(format('{ranger_tagsync_conf}/atlas-application.properties'), + properties = params.tagsync_application_properties, +- mode=0755, ++ mode=0o755, + owner=params.unix_user, + group=params.unix_group + ) +@@ -626,11 +626,11 @@ + owner=params.unix_user, + group=params.unix_group, + content=InlineTemplate(params.tagsync_log4j), +- mode=0644 ++ mode=0o644 + ) + + File(params.tagsync_services_file, +- mode = 0755, ++ mode = 0o755, + ) + + Execute(('ln','-sf', format('{tagsync_services_file}'),'/usr/bin/ranger-tagsync'), +@@ -659,7 +659,7 @@ + configuration_attributes=params.config['configurationAttributes']['core-site'], + owner=params.unix_user, + group=params.unix_group, +- mode=0644 ++ mode=0o644 + ) + else: + Logger.warning('HDFS service not installed. Creating core-site.xml file.') +@@ -669,7 +669,7 @@ + configuration_attributes={}, + owner=params.unix_user, + group=params.unix_group, +- mode=0644 ++ mode=0o644 + ) + + def setup_ranger_audit_solr(): +@@ -691,7 +691,7 @@ + content=InlineTemplate(params.ranger_solr_config_content), + owner=params.unix_user, + group=params.unix_group, +- mode=0644 ++ mode=0o644 + ) + + solr_cloud_util.upload_configuration_to_zk( +@@ -747,7 +747,7 @@ + secure_znode(format('{solr_znode}/configs/{ranger_solr_config_set}'), params.solr_jaas_file) + secure_znode(format('{solr_znode}/collections/{ranger_solr_collection_name}'), params.solr_jaas_file) + except ExecutionFailed as execution_exception: +- Logger.error('Error when configuring Solr for Ranger, Kindly check Solr/Zookeeper services to be up and running:\n {0}'.format(execution_exception)) ++ Logger.error('Error when configuring Solr for Ranger, Kindly check Solr/Zookeeper services to be up and running:\n {}'.format(execution_exception)) + + def setup_ranger_admin_passwd_change(): + import params +@@ -796,7 +796,7 @@ + cd_access="a", + owner=params.unix_user, + group=params.unix_group, +- mode=0775, ++ mode=0o775, + create_parents=True) + + # remove plain-text password from xml configs +@@ -812,7 +812,7 @@ + configuration_attributes=params.config['configurationAttributes']['ranger-tagsync-policymgr-ssl'], + owner=params.unix_user, + group=params.unix_group, +- mode=0644) ++ mode=0o644) + + ranger_credential_helper(params.tagsync_cred_lib, 'sslKeyStore', params.ranger_tagsync_keystore_password, params.ranger_tagsync_credential_file) + ranger_credential_helper(params.tagsync_cred_lib, 'sslTrustStore', params.ranger_tagsync_truststore_password, params.ranger_tagsync_credential_file) +@@ -821,7 +821,7 @@ + owner = params.unix_user, + group = params.unix_group, + only_if = format("test -e {ranger_tagsync_credential_file}"), +- mode = 0640 ++ mode = 0o640 + ) + + update_dot_jceks_crc_ownership(credential_provider_path = params.ranger_tagsync_credential_file, user = params.unix_user, group = params.unix_group) +@@ -839,7 +839,7 @@ + configuration_attributes=params.config['configurationAttributes']['atlas-tagsync-ssl'], + owner=params.unix_user, + group=params.unix_group, +- mode=0644) ++ mode=0o644) + + ranger_credential_helper(params.tagsync_cred_lib, 'sslKeyStore', params.atlas_tagsync_keystore_password, params.atlas_tagsync_credential_file) + ranger_credential_helper(params.tagsync_cred_lib, 'sslTrustStore', params.atlas_tagsync_truststore_password, params.atlas_tagsync_credential_file) +@@ -848,7 +848,7 @@ + owner = params.unix_user, + group = params.unix_group, + only_if = format("test -e {atlas_tagsync_credential_file}"), +- mode = 0640 ++ mode = 0o640 + ) + + update_dot_jceks_crc_ownership(credential_provider_path = params.atlas_tagsync_credential_file, user = params.unix_user, group = params.unix_group) +@@ -876,5 +876,5 @@ + owner = user, + group = group, + only_if = format("test -e {dot_jceks_crc_file_path}"), +- mode = 0640 ++ mode = 0o640 + ) +\ 文件尾没有换行符 +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/RANGER/0.4.0/package/scripts/status_params.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/RANGER/0.4.0/package/scripts/status_params.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/RANGER/0.4.0/package/scripts/status_params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/RANGER/0.4.0/package/scripts/status_params.py 2022-07-11 00:52:34.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/RANGER_KMS/0.5.0.2.3/package/scripts/kms.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/RANGER_KMS/0.5.0.2.3/package/scripts/kms.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/RANGER_KMS/0.5.0.2.3/package/scripts/kms.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/RANGER_KMS/0.5.0.2.3/package/scripts/kms.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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,8 +22,8 @@ + import fileinput + import os + import ambari_simplejson as json # simplejson is much faster comparing to Python 2.6 json module and has the same functions set. +-import urllib2, base64, httplib +-from StringIO import StringIO as BytesIO ++import urllib.request, urllib.error, urllib.parse, base64, http.client ++from io import StringIO as BytesIO + from datetime import datetime + from resource_management.core.resources.system import File, Directory, Execute + from resource_management.libraries.resources.xml_config import XmlConfig +@@ -45,9 +45,9 @@ + def password_validation(password, key): + import params + if password.strip() == "": +- raise Fail("Blank password is not allowed for {0} property. Please enter valid password.".format(key)) +- if re.search("[\\\`'\"]",password): +- raise Fail("{0} password contains one of the unsupported special characters like \" ' \ `".format(key)) ++ raise Fail("Blank password is not allowed for {} property. Please enter valid password.".format(key)) ++ if re.search("[\\\\`'\"]",password): ++ raise Fail("{} password contains one of the unsupported special characters like \" ' \\ `".format(key)) + else: + Logger.info("Password validated") + +@@ -126,7 +126,7 @@ + owner = params.kms_user, + group = params.kms_group, + only_if = format('test -e {cred_provider_path}'), +- mode = 0640 ++ mode = 0o640 + ) + + dot_jceks_crc_file_path = os.path.join(os.path.dirname(cred_provider_path), "." + os.path.basename(cred_provider_path) + ".crc") +@@ -135,7 +135,7 @@ + owner = params.kms_user, + group = params.kms_group, + only_if = format("test -e {dot_jceks_crc_file_path}"), +- mode = 0640 ++ mode = 0o640 + ) + + def kms(upgrade_type=None): +@@ -163,7 +163,7 @@ + + 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, + ) + + cp = format("{check_db_connection_jar}") +@@ -197,17 +197,17 @@ + + File(params.downloaded_connector_path, + content = DownloadSource(params.driver_source), +- mode = 0644 ++ mode = 0o644 + ) + + Execute(('cp', '--remove-destination', params.downloaded_connector_path, params.driver_target), + path=["/bin", "/usr/bin/"], + sudo=True) + +- File(params.driver_target, mode=0644) ++ File(params.driver_target, mode=0o644) + + Directory(os.path.join(params.kms_home, 'ews', 'webapp', 'WEB-INF', 'classes', 'lib'), +- mode=0755, ++ mode=0o755, + owner=params.kms_user, + group=params.kms_group + ) +@@ -218,7 +218,7 @@ + sudo=True) + + File('/etc/init.d/ranger-kms', +- mode = 0755 ++ mode = 0o755 + ) + + Directory(format('{kms_home}/'), +@@ -228,7 +228,7 @@ + ) + + Directory(params.ranger_kms_pid_dir, +- mode=0755, ++ mode=0o755, + owner = params.kms_user, + group = params.user_group, + cd_access = "a", +@@ -239,7 +239,7 @@ + content = format("export JAVA_HOME={java_home}"), + owner = params.kms_user, + group = params.kms_group, +- mode = 0755 ++ mode = 0o755 + ) + + if params.stack_supports_pid: +@@ -247,7 +247,7 @@ + content = format("export RANGER_KMS_PID_DIR_PATH={ranger_kms_pid_dir}\nexport KMS_USER={kms_user}"), + owner = params.kms_user, + group = params.kms_group, +- mode=0755 ++ mode=0o755 + ) + + Directory(params.kms_log_dir, +@@ -255,14 +255,14 @@ + group = params.kms_group, + cd_access = 'a', + create_parents=True, +- mode=0755 ++ mode=0o755 + ) + + File(format('{kms_conf_dir}/ranger-kms-env-logdir.sh'), + content = format("export RANGER_KMS_LOG_DIR={kms_log_dir}"), + owner = params.kms_user, + group = params.kms_group, +- mode=0755 ++ mode=0o755 + ) + + Execute(('ln','-sf', format('{kms_home}/ranger-kms'),'/usr/bin/ranger-kms'), +@@ -270,32 +270,32 @@ + only_if=format('ls {kms_home}/ranger-kms'), + sudo=True) + +- File('/usr/bin/ranger-kms', mode = 0755) ++ File('/usr/bin/ranger-kms', mode = 0o755) + + Execute(('ln','-sf', format('{kms_home}/ranger-kms'),'/usr/bin/ranger-kms-services.sh'), + not_if=format('ls /usr/bin/ranger-kms-services.sh'), + only_if=format('ls {kms_home}/ranger-kms'), + sudo=True) + +- File('/usr/bin/ranger-kms-services.sh', mode = 0755) ++ File('/usr/bin/ranger-kms-services.sh', mode = 0o755) + + Execute(('ln','-sf', format('{kms_home}/ranger-kms-initd'),format('{kms_home}/ranger-kms-services.sh')), + not_if=format('ls {kms_home}/ranger-kms-services.sh'), + only_if=format('ls {kms_home}/ranger-kms-initd'), + sudo=True) + +- File(format('{kms_home}/ranger-kms-services.sh'), mode = 0755) ++ File(format('{kms_home}/ranger-kms-services.sh'), mode = 0o755) + + Directory(params.kms_log_dir, + owner = params.kms_user, + group = params.kms_group, +- mode = 0775 ++ mode = 0o775 + ) + + do_keystore_setup(params.credential_provider_path, params.jdbc_alias, params.db_password) + do_keystore_setup(params.credential_provider_path, params.masterkey_alias, params.kms_master_key_password) + if params.stack_support_kms_hsm and params.enable_kms_hsm: +- do_keystore_setup(params.credential_provider_path, params.hms_partition_alias, unicode(params.hms_partition_passwd)) ++ do_keystore_setup(params.credential_provider_path, params.hms_partition_alias, str(params.hms_partition_passwd)) + if params.stack_supports_ranger_kms_ssl and params.ranger_kms_ssl_enabled: + do_keystore_setup(params.ranger_kms_cred_ssl_path, params.ranger_kms_ssl_keystore_alias, params.ranger_kms_ssl_passwd) + +@@ -313,7 +313,7 @@ + configuration_attributes=params.config['configurationAttributes']['dbks-site'], + owner=params.kms_user, + group=params.kms_group, +- mode=0644 ++ mode=0o644 + ) + + ranger_kms_site_copy = {} +@@ -330,7 +330,7 @@ + configuration_attributes=params.config['configurationAttributes']['ranger-kms-site'], + owner=params.kms_user, + group=params.kms_group, +- mode=0644 ++ mode=0o644 + ) + + XmlConfig("kms-site.xml", +@@ -339,14 +339,14 @@ + configuration_attributes=params.config['configurationAttributes']['kms-site'], + owner=params.kms_user, + group=params.kms_group, +- mode=0644 ++ mode=0o644 + ) + + File(os.path.join(params.kms_conf_dir, "kms-log4j.properties"), + owner=params.kms_user, + group=params.kms_group, + content=InlineTemplate(params.kms_log4j), +- mode=0644 ++ mode=0o644 + ) + if params.security_enabled: + # core-site.xml linking required by setup for HDFS encryption +@@ -356,7 +356,7 @@ + configuration_attributes=params.config['configurationAttributes']['core-site'], + owner=params.kms_user, + group=params.kms_group, +- mode=0644 ++ mode=0o644 + ) + else: + File(format('{kms_conf_dir}/core-site.xml'), action="delete") +@@ -377,11 +377,11 @@ + + File(params.downloaded_custom_connector, + content = DownloadSource(params.driver_curl_source), +- mode = 0644 ++ mode = 0o644 + ) + + Directory(os.path.join(kms_home, 'ews', 'lib'), +- mode=0755 ++ mode=0o755 + ) + + if params.db_flavor.lower() == 'sqla': +@@ -398,13 +398,13 @@ + Execute(as_sudo(['yes', '|', 'cp', params.libs_path_in_archive, params.jdbc_libs_dir], auto_escape=False), + path=["/bin", "/usr/bin/"]) + +- File(os.path.join(kms_home, 'ews', 'webapp', 'lib', 'sajdbc4.jar'), mode=0644) ++ File(os.path.join(kms_home, 'ews', 'webapp', 'lib', 'sajdbc4.jar'), mode=0o644) + else: + Execute(('cp', '--remove-destination', params.downloaded_custom_connector, os.path.join(kms_home, 'ews', 'webapp', 'lib')), + path=["/bin", "/usr/bin/"], + sudo=True) + +- File(os.path.join(kms_home, 'ews', 'webapp', 'lib', params.jdbc_jar_name), mode=0644) ++ File(os.path.join(kms_home, 'ews', 'webapp', 'lib', params.jdbc_jar_name), mode=0o644) + + ModifyPropertiesFile(format("{kms_home}/install.properties"), + properties = params.config['configurations']['kms-properties'], +@@ -446,21 +446,21 @@ + File(format('{kms_conf_dir}/ranger-security.xml'), + owner = params.kms_user, + group = params.kms_group, +- mode = 0644, ++ mode = 0o644, + content = format('\n{current_datetime}\n') + ) + + Directory([os.path.join('/etc', 'ranger', params.repo_name), os.path.join('/etc', 'ranger', params.repo_name, 'policycache')], + owner = params.kms_user, + group = params.kms_group, +- mode=0775, ++ mode=0o775, + create_parents = True + ) + + File(os.path.join('/etc', 'ranger', params.repo_name, 'policycache',format('kms_{repo_name}.json')), + owner = params.kms_user, + group = params.kms_group, +- mode = 0644 ++ mode = 0o644 + ) + + # remove plain-text password from xml configs +@@ -476,7 +476,7 @@ + configuration_attributes=params.config['configurationAttributes']['ranger-kms-audit'], + owner=params.kms_user, + group=params.kms_group, +- mode=0744) ++ mode=0o744) + + XmlConfig("ranger-kms-security.xml", + conf_dir=params.kms_conf_dir, +@@ -484,7 +484,7 @@ + configuration_attributes=params.config['configurationAttributes']['ranger-kms-security'], + owner=params.kms_user, + group=params.kms_group, +- mode=0744) ++ mode=0o744) + + # remove plain-text password from xml configs + ranger_kms_policymgr_ssl_copy = {} +@@ -500,7 +500,7 @@ + configuration_attributes=params.config['configurationAttributes']['ranger-kms-policymgr-ssl'], + owner=params.kms_user, + group=params.kms_group, +- mode=0744) ++ mode=0o744) + + if params.xa_audit_db_is_enabled: + cred_setup = params.cred_setup_prefix + ('-f', params.credential_file, '-k', 'auditDBCred', '-v', PasswordString(params.xa_audit_db_password), '-c', '1') +@@ -516,7 +516,7 @@ + owner = params.kms_user, + group = params.kms_group, + only_if = format("test -e {credential_file}"), +- mode = 0640 ++ mode = 0o640 + ) + + dot_jceks_crc_file_path = os.path.join(os.path.dirname(params.credential_file), "." + os.path.basename(params.credential_file) + ".crc") +@@ -525,7 +525,7 @@ + owner = params.kms_user, + group = params.kms_group, + only_if = format("test -e {dot_jceks_crc_file_path}"), +- mode = 0640 ++ mode = 0o640 + ) + + # create ranger kms audit directory +@@ -535,7 +535,7 @@ + action="create_on_execute", + owner=params.hdfs_user, + group=params.hdfs_user, +- mode=0755, ++ mode=0o755, + recursive_chmod=True + ) + params.HdfsResource("/ranger/audit/kms", +@@ -543,7 +543,7 @@ + action="create_on_execute", + owner=params.kms_user, + group=params.kms_group, +- mode=0750, ++ mode=0o750, + recursive_chmod=True + ) + params.HdfsResource(None, action="execute") +@@ -556,7 +556,7 @@ + configuration_attributes=params.config['configurationAttributes']['hdfs-site'], + owner=params.kms_user, + group=params.kms_group, +- mode=0644 ++ mode=0o644 + ) + else: + File(format('{kms_conf_dir}/hdfs-site.xml'), action="delete") +@@ -573,7 +573,7 @@ + + File(jce_target, + content = DownloadSource(format('{jdk_location}/{jce_name}')), +- mode = 0644, ++ mode = 0o644, + ) + + File([format("{java_home}/jre/lib/security/local_policy.jar"), format("{java_home}/jre/lib/security/US_export_policy.jar")], +@@ -619,14 +619,14 @@ + def create_repo(url, data, usernamepassword): + try: + base_url = url + '/service/public/v2/api/service' +- base64string = base64.encodestring('{0}'.format(usernamepassword)).replace('\n', '') ++ base64string = base64.encodestring('{}'.format(usernamepassword)).replace('\n', '') + headers = { + 'Accept': 'application/json', + "Content-Type": "application/json" + } +- request = urllib2.Request(base_url, data, headers) +- request.add_header("Authorization", "Basic {0}".format(base64string)) +- result = urllib2.urlopen(request, timeout=20) ++ request = urllib.request.Request(base_url, data, headers) ++ request.add_header("Authorization", "Basic {}".format(base64string)) ++ result = urllib.request.urlopen(request, timeout=20) + response_code = result.getcode() + response = json.loads(json.JSONEncoder().encode(result.read())) + if response_code == 200: +@@ -635,29 +635,29 @@ + else: + Logger.info('Repository not created') + return False +- except urllib2.URLError, e: +- if isinstance(e, urllib2.HTTPError): +- raise Fail("Error creating service. Http status code - {0}. \n {1}".format(e.code, e.read())) ++ except urllib.error.URLError as e: ++ if isinstance(e, urllib.error.HTTPError): ++ raise Fail("Error creating service. Http status code - {}. \n {}".format(e.code, e.read())) + else: +- raise Fail("Error creating service. Reason - {0}.".format(e.reason)) ++ raise Fail("Error creating service. Reason - {}.".format(e.reason)) + except socket.timeout as e: +- raise Fail("Error creating service. Reason - {0}".format(e)) ++ raise Fail("Error creating service. Reason - {}".format(e)) + + @safe_retry(times=5, sleep_time=8, backoff_factor=1.5, err_class=Fail, return_on_fail=False) + def get_repo(url, name, usernamepassword): + try: + base_url = url + '/service/public/v2/api/service?serviceName=' + name + '&serviceType=kms&isEnabled=true' +- request = urllib2.Request(base_url) ++ request = urllib.request.Request(base_url) + base64string = base64.encodestring(usernamepassword).replace('\n', '') + request.add_header("Content-Type", "application/json") + request.add_header("Accept", "application/json") +- request.add_header("Authorization", "Basic {0}".format(base64string)) +- result = urllib2.urlopen(request, timeout=20) ++ request.add_header("Authorization", "Basic {}".format(base64string)) ++ result = urllib.request.urlopen(request, timeout=20) + response_code = result.getcode() + response = json.loads(result.read()) + if response_code == 200 and len(response) > 0: + for repo in response: +- if repo.get('name').lower() == name.lower() and repo.has_key('name'): ++ if repo.get('name').lower() == name.lower() and 'name' in repo: + Logger.info('KMS repository exist') + return True + else: +@@ -666,13 +666,13 @@ + else: + Logger.info('KMS repository doesnot exist') + return False +- except urllib2.URLError, e: +- if isinstance(e, urllib2.HTTPError): +- raise Fail("Error getting {0} service. Http status code - {1}. \n {2}".format(name, e.code, e.read())) ++ except urllib.error.URLError as e: ++ if isinstance(e, urllib.error.HTTPError): ++ raise Fail("Error getting {} service. Http status code - {}. \n {}".format(name, e.code, e.read())) + else: +- raise Fail("Error getting {0} service. Reason - {1}.".format(name, e.reason)) ++ raise Fail("Error getting {} service. Reason - {}.".format(name, e.reason)) + except socket.timeout as e: +- raise Fail("Error creating service. Reason - {0}".format(e)) ++ raise Fail("Error creating service. Reason - {}".format(e)) + + def check_ranger_service_support_kerberos(user, keytab, principal): + import params +@@ -686,7 +686,7 @@ + if response_code is not None and response_code[0] == 200: + get_repo_name_response = ranger_adm_obj.get_repository_by_name_curl(user, keytab, principal, params.repo_name, 'kms', 'true', is_keyadmin = True) + if get_repo_name_response is not None: +- Logger.info('KMS repository {0} exist'.format(get_repo_name_response['name'])) ++ Logger.info('KMS repository {} exist'.format(get_repo_name_response['name'])) + return True + else: + create_repo_response = ranger_adm_obj.create_repository_curl(user, keytab, principal, params.repo_name, json.dumps(params.kms_ranger_plugin_repo), None, is_keyadmin = True) +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/RANGER_KMS/0.5.0.2.3/package/scripts/kms_server.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/RANGER_KMS/0.5.0.2.3/package/scripts/kms_server.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/RANGER_KMS/0.5.0.2.3/package/scripts/kms_server.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/RANGER_KMS/0.5.0.2.3/package/scripts/kms_server.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/RANGER_KMS/0.5.0.2.3/package/scripts/kms_service.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/RANGER_KMS/0.5.0.2.3/package/scripts/kms_service.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/RANGER_KMS/0.5.0.2.3/package/scripts/kms_service.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/RANGER_KMS/0.5.0.2.3/package/scripts/kms_service.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/RANGER_KMS/0.5.0.2.3/package/scripts/params.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/RANGER_KMS/0.5.0.2.3/package/scripts/params.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/RANGER_KMS/0.5.0.2.3/package/scripts/params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/RANGER_KMS/0.5.0.2.3/package/scripts/params.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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,8 +89,8 @@ + db_host = config['configurations']['kms-properties']['db_host'] + db_name = config['configurations']['kms-properties']['db_name'] + db_user = config['configurations']['kms-properties']['db_user'] +-db_password = unicode(config['configurations']['kms-properties']['db_password']) +-kms_master_key_password = unicode(config['configurations']['kms-properties']['KMS_MASTER_KEY_PASSWD']) ++db_password = str(config['configurations']['kms-properties']['db_password']) ++kms_master_key_password = str(config['configurations']['kms-properties']['KMS_MASTER_KEY_PASSWD']) + credential_provider_path = config['configurations']['dbks-site']['ranger.ks.jpa.jdbc.credential.provider.path'] + jdbc_alias = config['configurations']['dbks-site']['ranger.ks.jpa.jdbc.credential.alias'] + masterkey_alias = config['configurations']['dbks-site']['ranger.ks.masterkey.credential.alias'] +@@ -220,7 +220,7 @@ + xa_previous_jdbc_jar = format("{kms_home}/ews/webapp/lib/{previous_jdbc_jar_name}") if stack_supports_ranger_audit_db else None + + repo_config_username = config['configurations']['kms-properties']['REPOSITORY_CONFIG_USERNAME'] +-repo_config_password = unicode(config['configurations']['kms-properties']['REPOSITORY_CONFIG_PASSWORD']) ++repo_config_password = str(config['configurations']['kms-properties']['REPOSITORY_CONFIG_PASSWORD']) + + kms_plugin_config = { + 'username' : repo_config_username, +@@ -231,8 +231,8 @@ + xa_audit_db_is_enabled = False + if stack_supports_ranger_audit_db: + xa_audit_db_is_enabled = config['configurations']['ranger-kms-audit']['xasecure.audit.destination.db'] +-ssl_keystore_password = unicode(config['configurations']['ranger-kms-policymgr-ssl']['xasecure.policymgr.clientssl.keystore.password']) +-ssl_truststore_password = unicode(config['configurations']['ranger-kms-policymgr-ssl']['xasecure.policymgr.clientssl.truststore.password']) ++ssl_keystore_password = str(config['configurations']['ranger-kms-policymgr-ssl']['xasecure.policymgr.clientssl.keystore.password']) ++ssl_truststore_password = str(config['configurations']['ranger-kms-policymgr-ssl']['xasecure.policymgr.clientssl.truststore.password']) + + #For SQLA explicitly disable audit to DB for Ranger + if xa_audit_db_flavor == 'sqla': +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/RANGER_KMS/0.5.0.2.3/package/scripts/service_check.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/RANGER_KMS/0.5.0.2.3/package/scripts/service_check.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/RANGER_KMS/0.5.0.2.3/package/scripts/service_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/RANGER_KMS/0.5.0.2.3/package/scripts/service_check.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/RANGER_KMS/0.5.0.2.3/package/scripts/status_params.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/RANGER_KMS/0.5.0.2.3/package/scripts/status_params.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/RANGER_KMS/0.5.0.2.3/package/scripts/status_params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/RANGER_KMS/0.5.0.2.3/package/scripts/status_params.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/SLIDER/0.60.0.2.2/package/scripts/__init__.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/SLIDER/0.60.0.2.2/package/scripts/__init__.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/SLIDER/0.60.0.2.2/package/scripts/__init__.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/SLIDER/0.60.0.2.2/package/scripts/__init__.py 2022-07-11 00:52:32.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/SLIDER/0.60.0.2.2/package/scripts/params.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/SLIDER/0.60.0.2.2/package/scripts/params.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/SLIDER/0.60.0.2.2/package/scripts/params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/SLIDER/0.60.0.2.2/package/scripts/params.py 2022-07-11 00:52:32.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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,9 +26,9 @@ + from resource_management.libraries.functions.copy_tarball import get_sysprep_skip_copy_tarballs_hdfs + + if OSCheck.is_windows_family(): +- from params_windows import * ++ from .params_windows import * + else: +- from params_linux import * ++ from .params_linux import * + + # server configurations + config = Script.get_config() +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/SLIDER/0.60.0.2.2/package/scripts/params_windows.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/SLIDER/0.60.0.2.2/package/scripts/params_windows.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/SLIDER/0.60.0.2.2/package/scripts/params_windows.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/SLIDER/0.60.0.2.2/package/scripts/params_windows.py 2022-07-11 00:52:32.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/SLIDER/0.60.0.2.2/package/scripts/service_check.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/SLIDER/0.60.0.2.2/package/scripts/service_check.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/SLIDER/0.60.0.2.2/package/scripts/service_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/SLIDER/0.60.0.2.2/package/scripts/service_check.py 2022-07-11 00:52:32.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + + @OsFamilyFuncImpl(os_family=OSConst.WINSRV_FAMILY) + def service_check(self, env): +- import params ++ from . import params + env.set_params(params) + smoke_cmd = os.path.join(params.stack_root, "Run-SmokeTests.cmd") + service = "SLIDER" +@@ -39,7 +39,7 @@ + + @OsFamilyFuncImpl(os_family=OsFamilyImpl.DEFAULT) + def service_check(self, env): +- import params ++ from . import params + env.set_params(params) + + if params.stack_version_formatted and check_stack_feature(StackFeature.COPY_TARBALL_TO_HDFS, params.stack_version_formatted): +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/SLIDER/0.60.0.2.2/package/scripts/slider_client.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/SLIDER/0.60.0.2.2/package/scripts/slider_client.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/SLIDER/0.60.0.2.2/package/scripts/slider_client.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/SLIDER/0.60.0.2.2/package/scripts/slider_client.py 2022-07-11 00:52:32.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + from resource_management.libraries.functions import stack_select + from resource_management.libraries.functions.constants import StackFeature + from resource_management.libraries.functions.stack_features import check_stack_feature +-from slider import slider ++from .slider import slider + from ambari_commons import OSConst + from ambari_commons.os_family_impl import OsFamilyFuncImpl, OsFamilyImpl + from resource_management.core.exceptions import ClientComponentHasNoStatus +@@ -34,7 +34,7 @@ + @OsFamilyImpl(os_family=OsFamilyImpl.DEFAULT) + class SliderClientLinux(SliderClient): + def pre_upgrade_restart(self, env, upgrade_type=None): +- import params ++ from . import params + env.set_params(params) + + if params.version and check_stack_feature(StackFeature.ROLLING_UPGRADE, params.version): +@@ -45,14 +45,14 @@ + self.configure(env) + + def configure(self, env): +- import params ++ from . import params + env.set_params(params) + slider() + + @OsFamilyImpl(os_family=OSConst.WINSRV_FAMILY) + class SliderClientWindows(SliderClient): + def install(self, env): +- import params ++ from . import params + if params.slider_home is None: + self.install_packages(env) + self.configure(env) +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/SLIDER/0.60.0.2.2/package/scripts/slider.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/SLIDER/0.60.0.2.2/package/scripts/slider.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/SLIDER/0.60.0.2.2/package/scripts/slider.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/SLIDER/0.60.0.2.2/package/scripts/slider.py 2022-07-11 00:52:32.000000000 +0800 +@@ -30,7 +30,7 @@ + + @OsFamilyFuncImpl(os_family=OSConst.WINSRV_FAMILY) + def slider(): +- import params ++ from . import params + + slider_client_config = params.config['configurations']['slider-client'] if 'configurations' in params.config and 'slider-client' in params.config['configurations'] else {} + +@@ -49,7 +49,7 @@ + + @OsFamilyFuncImpl(os_family=OsFamilyImpl.DEFAULT) + def slider(): +- import params ++ from . import params + + Directory(params.slider_conf_dir, + create_parents = True +@@ -60,11 +60,11 @@ + XmlConfig("slider-client.xml", + conf_dir=params.slider_conf_dir, + configurations=slider_client_config, +- mode=0644 ++ mode=0o644 + ) + + File(format("{slider_conf_dir}/slider-env.sh"), +- mode=0755, ++ mode=0o755, + content=InlineTemplate(params.slider_env_sh_template) + ) + +@@ -76,18 +76,18 @@ + ) + + File(format("{storm_slider_conf_dir}/storm-slider-env.sh"), +- mode=0755, ++ mode=0o755, + content=Template('storm-slider-env.sh.j2') + ) + + if (params.log4j_props != None): + File(format("{params.slider_conf_dir}/log4j.properties"), +- mode=0644, ++ mode=0o644, + content=params.log4j_props + ) + elif (os.path.exists(format("{params.slider_conf_dir}/log4j.properties"))): + File(format("{params.slider_conf_dir}/log4j.properties"), +- mode=0644 ++ mode=0o644 + ) + if params.stack_version_formatted and check_stack_feature(StackFeature.COPY_TARBALL_TO_HDFS, params.stack_version_formatted): + File(params.slider_tar_gz, +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/SPARK/1.2.1/package/scripts/livy_service.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/SPARK/1.2.1/package/scripts/livy_service.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/SPARK/1.2.1/package/scripts/livy_service.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/SPARK/1.2.1/package/scripts/livy_service.py 2022-07-11 00:52:34.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/SPARK/1.2.1/package/scripts/params.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/SPARK/1.2.1/package/scripts/params.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/SPARK/1.2.1/package/scripts/params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/SPARK/1.2.1/package/scripts/params.py 2022-07-11 00:52:34.000000000 +0800 +@@ -252,9 +252,9 @@ + + # 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 + is_webhdfs_enabled = hdfs_site['dfs.webhdfs.enabled'] + + if len(livy_livyserver_hosts) > 0: +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/SPARK/1.2.1/package/scripts/setup_livy.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/SPARK/1.2.1/package/scripts/setup_livy.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/SPARK/1.2.1/package/scripts/setup_livy.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/SPARK/1.2.1/package/scripts/setup_livy.py 2022-07-11 00:52:34.000000000 +0800 +@@ -28,7 +28,7 @@ + Directory([params.livy_pid_dir, params.livy_log_dir], + owner=params.livy_user, + group=params.user_group, +- mode=0775, ++ mode=0o775, + create_parents = True + ) + if type == 'server' and action == 'config': +@@ -36,7 +36,7 @@ + type="directory", + action="create_on_execute", + owner=params.livy_user, +- mode=0775 ++ mode=0o775 + ) + params.HdfsResource(None, action="execute") + +@@ -44,7 +44,7 @@ + type="directory", + action="create_on_execute", + owner=params.livy_user, +- mode=0700 ++ mode=0o700 + ) + params.HdfsResource(None, action="execute") + +@@ -53,7 +53,7 @@ + owner=params.livy_user, + group=params.livy_group, + content=InlineTemplate(params.livy_env_sh), +- mode=0644, ++ mode=0o644, + ) + + # create livy.conf in etc/conf dir +@@ -69,7 +69,7 @@ + owner=params.livy_user, + group=params.livy_group, + content=params.livy_log4j_properties, +- mode=0644, ++ mode=0o644, + ) + + # create spark-blacklist.properties in etc/conf dir +@@ -77,11 +77,11 @@ + owner=params.livy_user, + group=params.livy_group, + content=params.livy_spark_blacklist_properties, +- mode=0644, ++ mode=0o644, + ) + + Directory(params.livy_logs_dir, + owner=params.livy_user, + group=params.livy_group, +- mode=0755, ++ mode=0o755, + ) +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/SPARK/1.2.1/package/scripts/setup_spark.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/SPARK/1.2.1/package/scripts/setup_spark.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/SPARK/1.2.1/package/scripts/setup_spark.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/SPARK/1.2.1/package/scripts/setup_spark.py 2022-07-11 00:52:34.000000000 +0800 +@@ -51,7 +51,7 @@ + Directory([params.spark_pid_dir, params.spark_log_dir], + owner=params.spark_user, + group=params.user_group, +- mode=0775, ++ mode=0o775, + create_parents = True, + cd_access = 'a', + ) +@@ -60,7 +60,7 @@ + type="directory", + action="create_on_execute", + owner=params.spark_user, +- mode=0775 ++ mode=0o775 + ) + params.HdfsResource(None, action="execute") + +@@ -69,7 +69,7 @@ + key_value_delimiter = " ", + owner=params.spark_user, + group=params.spark_group, +- mode=0644 ++ mode=0o644 + ) + + # create spark-env.sh in etc/conf dir +@@ -77,7 +77,7 @@ + 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 +@@ -85,7 +85,7 @@ + owner=params.spark_user, + group=params.spark_group, + content=params.spark_log4j_properties, +- mode=0644, ++ mode=0o644, + ) + + #create metrics.properties in etc/conf dir +@@ -93,13 +93,13 @@ + owner=params.spark_user, + group=params.spark_group, + content=InlineTemplate(params.spark_metrics_properties), +- mode=0644 ++ mode=0o644 + ) + + Directory(params.spark_logs_dir, + owner=params.spark_user, + group=params.spark_group, +- mode=0755, ++ mode=0o755, + ) + + if params.is_hive_installed: +@@ -108,7 +108,7 @@ + configurations=params.spark_hive_properties, + owner=params.spark_user, + group=params.spark_group, +- mode=0644) ++ mode=0o644) + + if params.has_spark_thriftserver: + PropertiesFile(params.spark_thrift_server_conf_file, +@@ -116,7 +116,7 @@ + owner = params.hive_user, + group = params.user_group, + key_value_delimiter = " ", +- mode=0644 ++ mode=0o644 + ) + + effective_version = params.version if upgrade_type is not None else params.version_for_stack_feature_checks +@@ -128,7 +128,7 @@ + owner=params.spark_user, + group=params.spark_group, + content=InlineTemplate(params.spark_javaopts_properties), +- mode=0644 ++ mode=0o644 + ) + else: + File(os.path.join(params.spark_conf, 'java-opts'), +@@ -140,6 +140,6 @@ + File(os.path.join(config_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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/SPARK/1.2.1/package/scripts/spark_client.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/SPARK/1.2.1/package/scripts/spark_client.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/SPARK/1.2.1/package/scripts/spark_client.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/SPARK/1.2.1/package/scripts/spark_client.py 2022-07-11 00:52:34.000000000 +0800 +@@ -64,7 +64,7 @@ + config_dir = self.get_config_dir_during_stack_upgrade(env, base_dir, conf_select_name) + + if config_dir: +- Logger.info("stack_upgrade_save_new_config(): Calling conf-select on %s using version %s" % (conf_select_name, str(params.version))) ++ Logger.info("stack_upgrade_save_new_config(): Calling conf-select on {} using version {}".format(conf_select_name, str(params.version))) + + # Because this script was called from ru_execute_tasks.py which already enters an Environment with its own basedir, + # must change it now so this function can find the Jinja Templates for the service. +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/SPARK/1.2.1/package/scripts/spark_service.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/SPARK/1.2.1/package/scripts/spark_service.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/SPARK/1.2.1/package/scripts/spark_service.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/SPARK/1.2.1/package/scripts/spark_service.py 2022-07-11 00:52:34.000000000 +0800 +@@ -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 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/SPARK/1.2.1/package/scripts/status_params.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/SPARK/1.2.1/package/scripts/status_params.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/SPARK/1.2.1/package/scripts/status_params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/SPARK/1.2.1/package/scripts/status_params.py 2022-07-11 00:52:34.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/SPARK2/2.0.0/package/scripts/livy2_service.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/SPARK2/2.0.0/package/scripts/livy2_service.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/SPARK2/2.0.0/package/scripts/livy2_service.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/SPARK2/2.0.0/package/scripts/livy2_service.py 2022-07-11 00:52:32.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/SPARK2/2.0.0/package/scripts/params.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/SPARK2/2.0.0/package/scripts/params.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/SPARK2/2.0.0/package/scripts/params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/SPARK2/2.0.0/package/scripts/params.py 2022-07-11 00:52:32.000000000 +0800 +@@ -238,9 +238,9 @@ + + # 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 + is_webhdfs_enabled = hdfs_site['dfs.webhdfs.enabled'] + + if len(livy2_livyserver_hosts) > 0: +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/SPARK2/2.0.0/package/scripts/setup_livy2.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/SPARK2/2.0.0/package/scripts/setup_livy2.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/SPARK2/2.0.0/package/scripts/setup_livy2.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/SPARK2/2.0.0/package/scripts/setup_livy2.py 2022-07-11 00:52:32.000000000 +0800 +@@ -28,7 +28,7 @@ + Directory([params.livy2_pid_dir, params.livy2_log_dir], + owner=params.livy2_user, + group=params.user_group, +- mode=0775, ++ mode=0o775, + cd_access = 'a', + create_parents = True + ) +@@ -38,7 +38,7 @@ + type="directory", + action="create_on_execute", + owner=params.livy2_user, +- mode=0775 ++ mode=0o775 + ) + params.HdfsResource(None, action="execute") + +@@ -47,7 +47,7 @@ + type="directory", + action="create_on_execute", + owner=params.livy2_user, +- mode=0700 ++ mode=0o700 + ) + params.HdfsResource(None, action="execute") + +@@ -56,7 +56,7 @@ + owner=params.livy2_user, + group=params.livy2_group, + content=InlineTemplate(params.livy2_env_sh), +- mode=0644, ++ mode=0o644, + ) + + # create livy.conf in etc/conf dir +@@ -72,7 +72,7 @@ + owner=params.livy2_user, + group=params.livy2_group, + content=params.livy2_log4j_properties, +- mode=0644, ++ mode=0o644, + ) + + # create spark-blacklist.properties in etc/conf dir +@@ -80,12 +80,12 @@ + owner=params.livy2_user, + group=params.livy2_group, + content=params.livy2_spark_blacklist_properties, +- mode=0644, ++ mode=0o644, + ) + + Directory(params.livy2_logs_dir, + owner=params.livy2_user, + group=params.livy2_group, +- mode=0755, ++ mode=0o755, + ) + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/SPARK2/2.0.0/package/scripts/setup_spark.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/SPARK2/2.0.0/package/scripts/setup_spark.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/SPARK2/2.0.0/package/scripts/setup_spark.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/SPARK2/2.0.0/package/scripts/setup_spark.py 2022-07-11 00:52:32.000000000 +0800 +@@ -41,7 +41,7 @@ + Directory([params.spark_pid_dir, params.spark_log_dir], + owner=params.spark_user, + group=params.user_group, +- mode=0775, ++ mode=0o775, + create_parents = True, + cd_access = 'a', + ) +@@ -50,7 +50,7 @@ + type="directory", + action="create_on_execute", + owner=params.spark_user, +- mode=0775 ++ mode=0o775 + ) + params.HdfsResource(None, action="execute") + +@@ -59,7 +59,7 @@ + key_value_delimiter = " ", + owner=params.spark_user, + group=params.spark_group, +- mode=0644 ++ mode=0o644 + ) + + # create spark-env.sh in etc/conf dir +@@ -67,7 +67,7 @@ + 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 +@@ -75,7 +75,7 @@ + owner=params.spark_user, + group=params.spark_group, + content=params.spark_log4j_properties, +- mode=0644, ++ mode=0o644, + ) + + #create metrics.properties in etc/conf dir +@@ -83,7 +83,7 @@ + owner=params.spark_user, + group=params.spark_group, + content=InlineTemplate(params.spark_metrics_properties), +- mode=0644 ++ mode=0o644 + ) + + if params.is_hive_installed: +@@ -92,7 +92,7 @@ + configurations=params.spark_hive_properties, + owner=params.spark_user, + group=params.spark_group, +- mode=0644) ++ mode=0o644) + + if params.has_spark_thriftserver: + PropertiesFile(params.spark_thrift_server_conf_file, +@@ -100,7 +100,7 @@ + owner = params.hive_user, + group = params.user_group, + key_value_delimiter = " ", +- mode=0644 ++ mode=0o644 + ) + + effective_version = params.version if upgrade_type is not None else params.stack_version_formatted +@@ -112,6 +112,6 @@ + File(os.path.join(params.spark_conf,"spark-thrift-fairscheduler.xml"), + owner=params.spark_user, + group=params.spark_group, +- mode=0755, ++ mode=0o755, + content=InlineTemplate(params.spark_thrift_fairscheduler_content) + ) +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/SPARK2/2.0.0/package/scripts/spark_service.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/SPARK2/2.0.0/package/scripts/spark_service.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/SPARK2/2.0.0/package/scripts/spark_service.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/SPARK2/2.0.0/package/scripts/spark_service.py 2022-07-11 00:52:32.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +@@ -41,11 +41,11 @@ + 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 file in os.listdir(source_dir): + tar.add(os.path.join(source_dir,file),arcname=file) +- os.chmod(output_filename, 0644) ++ os.chmod(output_filename, 0o644) + + + def spark_service(name, upgrade_type=None, action=None): +@@ -70,7 +70,7 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/SPARK2/2.0.0/package/scripts/status_params.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/SPARK2/2.0.0/package/scripts/status_params.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/SPARK2/2.0.0/package/scripts/status_params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/SPARK2/2.0.0/package/scripts/status_params.py 2022-07-11 00:52:32.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/SQOOP/1.4.4.2.0/package/scripts/__init__.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/SQOOP/1.4.4.2.0/package/scripts/__init__.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/SQOOP/1.4.4.2.0/package/scripts/__init__.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/SQOOP/1.4.4.2.0/package/scripts/__init__.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/SQOOP/1.4.4.2.0/package/scripts/params.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/SQOOP/1.4.4.2.0/package/scripts/params.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/SQOOP/1.4.4.2.0/package/scripts/params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/SQOOP/1.4.4.2.0/package/scripts/params.py 2022-07-11 00:52:33.000000000 +0800 +@@ -20,8 +20,8 @@ + from resource_management.libraries.functions.default import default + + if OSCheck.is_windows_family(): +- from params_windows import * ++ from .params_windows import * + else: +- from params_linux import * ++ from .params_linux import * + + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/SQOOP/1.4.4.2.0/package/scripts/service_check.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/SQOOP/1.4.4.2.0/package/scripts/service_check.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/SQOOP/1.4.4.2.0/package/scripts/service_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/SQOOP/1.4.4.2.0/package/scripts/service_check.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + class SqoopServiceCheckDefault(SqoopServiceCheck): + + def service_check(self, env): +- import params ++ from . import params + env.set_params(params) + if params.security_enabled: + Execute(format("{kinit_path_local} -kt {smoke_user_keytab} {smokeuser_principal}"), +@@ -49,7 +49,7 @@ + @OsFamilyImpl(os_family=OSConst.WINSRV_FAMILY) + class SqoopServiceCheckWindows(SqoopServiceCheck): + def service_check(self, env): +- import params ++ from . import params + env.set_params(params) + smoke_cmd = os.path.join(params.stack_root,"Run-SmokeTests.cmd") + service = "SQOOP" +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/SQOOP/1.4.4.2.0/package/scripts/sqoop_client.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/SQOOP/1.4.4.2.0/package/scripts/sqoop_client.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/SQOOP/1.4.4.2.0/package/scripts/sqoop_client.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/SQOOP/1.4.4.2.0/package/scripts/sqoop_client.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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.libraries.functions.format import format + from resource_management.libraries.functions import StackFeature + from resource_management.libraries.functions.stack_features import check_stack_feature +-from sqoop import sqoop ++from .sqoop import sqoop + from ambari_commons.os_family_impl import OsFamilyImpl + from ambari_commons import OSConst + +@@ -36,7 +36,7 @@ + self.configure(env) + + def configure(self, env): +- import params ++ from . import params + env.set_params(params) + sqoop(type='client') + +@@ -46,7 +46,7 @@ + @OsFamilyImpl(os_family=OsFamilyImpl.DEFAULT) + class SqoopClientDefault(SqoopClient): + def pre_upgrade_restart(self, env, upgrade_type=None): +- import params ++ from . import params + env.set_params(params) + + if params.version and check_stack_feature(StackFeature.ROLLING_UPGRADE, params.version): +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/SQOOP/1.4.4.2.0/package/scripts/sqoop.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/SQOOP/1.4.4.2.0/package/scripts/sqoop.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/SQOOP/1.4.4.2.0/package/scripts/sqoop.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/SQOOP/1.4.4.2.0/package/scripts/sqoop.py 2022-07-11 00:52:33.000000000 +0800 +@@ -33,14 +33,14 @@ + + @OsFamilyFuncImpl(os_family=OSConst.WINSRV_FAMILY) + def sqoop(type=None): +- import params ++ from . import params + File(os.path.join(params.sqoop_conf_dir, "sqoop-env.cmd"), + content=InlineTemplate(params.sqoop_env_cmd_template) + ) + + @OsFamilyFuncImpl(os_family=OsFamilyImpl.DEFAULT) + def sqoop(type=None): +- import params ++ from . import params + Link(params.sqoop_lib + "/mysql-connector-java.jar", + to = '/usr/share/java/mysql-connector-java.jar' + ) +@@ -84,7 +84,7 @@ + pass + + def update_config_permissions(names): +- import params ++ from . import params + for filename in names: + full_filename = os.path.join(params.sqoop_conf_dir, filename) + File(full_filename, +@@ -94,8 +94,8 @@ + ) + + def jdbc_connector(): +- import params +- from urllib2 import HTTPError ++ from . import params ++ from urllib.error import HTTPError + from resource_management import Fail + for jar_name in params.sqoop_jdbc_drivers_dict: + if not jar_name or 'mysql' in jar_name: +@@ -113,7 +113,7 @@ + + File(downloaded_custom_connector, + content = DownloadSource(driver_curl_source), +- mode = 0644, ++ mode = 0o644, + ) + except HTTPError: + error_string = format("Could not download {driver_curl_source}\n\ +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/STORM/0.9.1/package/alerts/check_supervisor_process_win.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/STORM/0.9.1/package/alerts/check_supervisor_process_win.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/STORM/0.9.1/package/alerts/check_supervisor_process_win.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/STORM/0.9.1/package/alerts/check_supervisor_process_win.py 2022-07-11 00:52:34.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + """ + Licensed to the Apache Software Foundation (ASF) under one +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/STORM/0.9.1/package/scripts/drpc_server.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/STORM/0.9.1/package/scripts/drpc_server.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/STORM/0.9.1/package/scripts/drpc_server.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/STORM/0.9.1/package/scripts/drpc_server.py 2022-07-11 00:52:34.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/STORM/0.9.1/package/scripts/nimbus_prod.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/STORM/0.9.1/package/scripts/nimbus_prod.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/STORM/0.9.1/package/scripts/nimbus_prod.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/STORM/0.9.1/package/scripts/nimbus_prod.py 2022-07-11 00:52:34.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/STORM/0.9.1/package/scripts/nimbus.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/STORM/0.9.1/package/scripts/nimbus.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/STORM/0.9.1/package/scripts/nimbus.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/STORM/0.9.1/package/scripts/nimbus.py 2022-07-11 00:52:34.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/STORM/0.9.1/package/scripts/pacemaker.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/STORM/0.9.1/package/scripts/pacemaker.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/STORM/0.9.1/package/scripts/pacemaker.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/STORM/0.9.1/package/scripts/pacemaker.py 2022-07-11 00:52:34.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/STORM/0.9.1/package/scripts/params_linux.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/STORM/0.9.1/package/scripts/params_linux.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/STORM/0.9.1/package/scripts/params_linux.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/STORM/0.9.1/package/scripts/params_linux.py 2022-07-11 00:52:34.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/STORM/0.9.1/package/scripts/params.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/STORM/0.9.1/package/scripts/params.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/STORM/0.9.1/package/scripts/params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/STORM/0.9.1/package/scripts/params.py 2022-07-11 00:52:34.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/STORM/0.9.1/package/scripts/params_windows.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/STORM/0.9.1/package/scripts/params_windows.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/STORM/0.9.1/package/scripts/params_windows.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/STORM/0.9.1/package/scripts/params_windows.py 2022-07-11 00:52:34.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/STORM/0.9.1/package/scripts/rest_api.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/STORM/0.9.1/package/scripts/rest_api.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/STORM/0.9.1/package/scripts/rest_api.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/STORM/0.9.1/package/scripts/rest_api.py 2022-07-11 00:52:34.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/STORM/0.9.1/package/scripts/service_check.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/STORM/0.9.1/package/scripts/service_check.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/STORM/0.9.1/package/scripts/service_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/STORM/0.9.1/package/scripts/service_check.py 2022-07-11 00:52:34.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + try_count = 1 + if params.nimbus_hosts and len(params.nimbus_hosts) > 1: + try_count = 3 +- print("Nimbus HA is enabled. The check may be retried up to %d times in order to wait for the Nimbus leader selection" % try_count) ++ print(("Nimbus HA is enabled. The check may be retried up to %d times in order to wait for the Nimbus leader selection" % try_count)) + Execute(cmd, + logoutput=True, + path=params.storm_bin_dir, +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/STORM/0.9.1/package/scripts/service.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/STORM/0.9.1/package/scripts/service.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/STORM/0.9.1/package/scripts/service.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/STORM/0.9.1/package/scripts/service.py 2022-07-11 00:52:34.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + if name == 'ui': + process_grep = "storm.ui.core$" + elif name == "rest_api": +- process_grep = format("{rest_lib_dir}/storm-rest-.*\.jar$") ++ process_grep = format(r"{rest_lib_dir}/storm-rest-.*\.jar$") + else: + process_grep = format("storm.daemon.{name}$") + +@@ -55,7 +55,7 @@ + if action == "start": + if name == "rest_api": + process_cmd = format( +- "{storm_env} ; java -jar {rest_lib_dir}/`ls {rest_lib_dir} | grep -wE storm-rest-[0-9.-]+\.jar` server") ++ r"{storm_env} ; java -jar {rest_lib_dir}/`ls {rest_lib_dir} | grep -wE storm-rest-[0-9.-]+\.jar` server") + cmd = format( + "{process_cmd} {rest_api_conf_file} > {log_dir}/restapi.log 2>&1") + else: +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/STORM/0.9.1/package/scripts/setup_ranger_storm.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/STORM/0.9.1/package/scripts/setup_ranger_storm.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/STORM/0.9.1/package/scripts/setup_ranger_storm.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/STORM/0.9.1/package/scripts/setup_ranger_storm.py 2022-07-11 00:52:34.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + action="create_on_execute", + owner=params.hdfs_user, + group=params.hdfs_user, +- mode=0755, ++ mode=0o755, + recursive_chmod=True + ) + params.HdfsResource("/ranger/audit/storm", +@@ -54,7 +54,7 @@ + action="create_on_execute", + owner=params.storm_user, + group=params.storm_user, +- mode=0700, ++ mode=0o700, + recursive_chmod=True + ) + params.HdfsResource(None, action="execute") +@@ -106,7 +106,7 @@ + Directory(site_files_create_path, + owner = params.storm_user, + group = params.user_group, +- mode=0775, ++ mode=0o775, + create_parents = True, + cd_access = 'a' + ) +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/STORM/0.9.1/package/scripts/status_params.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/STORM/0.9.1/package/scripts/status_params.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/STORM/0.9.1/package/scripts/status_params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/STORM/0.9.1/package/scripts/status_params.py 2022-07-11 00:52:34.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/STORM/0.9.1/package/scripts/storm.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/STORM/0.9.1/package/scripts/storm.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/STORM/0.9.1/package/scripts/storm.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/STORM/0.9.1/package/scripts/storm.py 2022-07-11 00:52:34.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + owner=params.storm_user + ) + +- if params.service_map.has_key(name): ++ if name in params.service_map: + service_name = params.service_map[name] + ServiceConfig(service_name, + action="change_user", +@@ -60,7 +60,7 @@ + Directory(params.log_dir, + owner=params.storm_user, + group=params.user_group, +- mode=0777, ++ mode=0o777, + create_parents = True, + cd_access="a", + ) +@@ -70,7 +70,7 @@ + group=params.user_group, + create_parents = True, + cd_access="a", +- mode=0755, ++ mode=0o755, + ) + + Directory(params.conf_dir, +@@ -82,7 +82,7 @@ + File(format("{limits_conf_dir}/storm.conf"), + owner='root', + group='root', +- mode=0644, ++ mode=0o644, + content=Template("storm.conf.j2") + ) + +@@ -139,7 +139,7 @@ + Directory(params.log4j_dir, + owner=params.storm_user, + group=params.user_group, +- mode=0755, ++ mode=0o755, + create_parents = True + ) + +@@ -155,14 +155,14 @@ + if params.security_enabled: + TemplateConfig(format("{conf_dir}/storm_jaas.conf"), + owner=params.storm_user, +- mode=0644 ++ mode=0o644 + ) + if params.stack_version_formatted and check_stack_feature(StackFeature.ROLLING_UPGRADE, params.stack_version_formatted): + TemplateConfig(format("{conf_dir}/client_jaas.conf"), + owner=params.storm_user, +- mode=0644 ++ mode=0o644 + ) +- minRuid = configurations['_storm.min.ruid'] if configurations.has_key('_storm.min.ruid') else '' ++ minRuid = configurations['_storm.min.ruid'] if '_storm.min.ruid' in configurations else '' + + min_user_ruid = int(minRuid) if minRuid.isdigit() else _find_real_user_min_uid() + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/STORM/0.9.1/package/scripts/storm_upgrade.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/STORM/0.9.1/package/scripts/storm_upgrade.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/STORM/0.9.1/package/scripts/storm_upgrade.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/STORM/0.9.1/package/scripts/storm_upgrade.py 2022-07-11 00:52:34.000000000 +0800 +@@ -74,7 +74,7 @@ + zk_command_location = os.path.join(params.stack_root, params.version, "zookeeper", "bin", "zkCli.sh") + + # create the ZooKeeper delete command +- command = "{0} -server {1}:{2} rmr /storm".format( ++ command = "{} -server {}:{} rmr /storm".format( + zk_command_location, storm_zookeeper_server, params.storm_zookeeper_port) + + # clean out ZK +@@ -87,7 +87,7 @@ + # AMBARI-12094: if security is enabled, then we need to tell zookeeper where the + # JAAS file is located since we don't use kinit directly with STORM + if params.security_enabled: +- env_map['JVMFLAGS'] = "-Djava.security.auth.login.config={0}".format(params.storm_jaas_file) ++ env_map['JVMFLAGS'] = "-Djava.security.auth.login.config={}".format(params.storm_jaas_file) + + Execute(command, user=params.storm_user, environment=env_map, + logoutput=True, tries=1) +@@ -100,7 +100,7 @@ + + # fail if the ZK data could not be cleared + if not zookeeper_data_cleared: +- raise Fail("Unable to clear ZooKeeper Storm data on any of the following ZooKeeper hosts: {0}".format( ++ raise Fail("Unable to clear ZooKeeper Storm data on any of the following ZooKeeper hosts: {}".format( + storm_zookeeper_server_list)) + + +@@ -133,8 +133,8 @@ + json_map["direction"] = upgrade_direction + + temp_directory = params.tmp_dir +- marker_file = os.path.join(temp_directory, "storm-upgrade-{0}.json".format(stack_version)) +- Logger.info("Marker file for upgrade/downgrade of Storm, {0}".format(marker_file)) ++ marker_file = os.path.join(temp_directory, "storm-upgrade-{}.json".format(stack_version)) ++ Logger.info("Marker file for upgrade/downgrade of Storm, {}".format(marker_file)) + + if os.path.exists(marker_file): + Logger.info("The marker file exists.") +@@ -143,33 +143,33 @@ + existing_json_map = json.load(file_pointer) + + if cmp(json_map, existing_json_map) == 0: +- Logger.info("The storm upgrade has already removed the local directories for {0}-{1} for " +- "request {2} and direction {3}. Nothing else to do.".format(stack_name, stack_version, request_id, upgrade_direction)) ++ Logger.info("The storm upgrade has already removed the local directories for {}-{} for " ++ "request {} and direction {}. Nothing else to do.".format(stack_name, stack_version, request_id, upgrade_direction)) + + # Nothing else to do here for this as it appears to have already been + # removed by another component being upgraded + return + else: + Logger.info("The marker file differs from the new value. Will proceed to delete Storm local dir, " +- "and generate new file. Current marker file: {0}".format(str(existing_json_map))) +- except Exception, e: +- Logger.error("The marker file {0} appears to be corrupt; removing it. Error: {1}".format(marker_file, str(e))) ++ "and generate new file. Current marker file: {}".format(str(existing_json_map))) ++ except Exception as e: ++ Logger.error("The marker file {} appears to be corrupt; removing it. Error: {}".format(marker_file, str(e))) + File(marker_file, action="delete") + else: +- Logger.info('The marker file {0} does not exist; will attempt to delete local Storm directory if it exists.'.format(marker_file)) ++ Logger.info('The marker file {} does not exist; will attempt to delete local Storm directory if it exists.'.format(marker_file)) + + # Delete from local directory + if os.path.isdir(storm_local_directory): +- Logger.info("Deleting storm local directory, {0}".format(storm_local_directory)) ++ Logger.info("Deleting storm local directory, {}".format(storm_local_directory)) + Directory(storm_local_directory, action="delete", create_parents = True) + + # Recreate storm local directory +- Logger.info("Recreating storm local directory, {0}".format(storm_local_directory)) +- Directory(storm_local_directory, mode=0755, owner=params.storm_user, ++ Logger.info("Recreating storm local directory, {}".format(storm_local_directory)) ++ Directory(storm_local_directory, mode=0o755, owner=params.storm_user, + group=params.user_group, create_parents = True) + + # The file doesn't exist, so create it +- Logger.info("Saving marker file to {0} with contents: {1}".format(marker_file, str(json_map))) ++ Logger.info("Saving marker file to {} with contents: {}".format(marker_file, str(json_map))) + with open(marker_file, 'w') as file_pointer: + json.dump(json_map, file_pointer, indent=2) + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/STORM/0.9.1/package/scripts/storm_yaml_utils.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/STORM/0.9.1/package/scripts/storm_yaml_utils.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/STORM/0.9.1/package/scripts/storm_yaml_utils.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/STORM/0.9.1/package/scripts/storm_yaml_utils.py 2022-07-11 00:52:34.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/STORM/0.9.1/package/scripts/supervisord_service.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/STORM/0.9.1/package/scripts/supervisord_service.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/STORM/0.9.1/package/scripts/supervisord_service.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/STORM/0.9.1/package/scripts/supervisord_service.py 2022-07-11 00:52:34.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/STORM/0.9.1/package/scripts/supervisor_prod.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/STORM/0.9.1/package/scripts/supervisor_prod.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/STORM/0.9.1/package/scripts/supervisor_prod.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/STORM/0.9.1/package/scripts/supervisor_prod.py 2022-07-11 00:52:34.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/STORM/0.9.1/package/scripts/supervisor.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/STORM/0.9.1/package/scripts/supervisor.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/STORM/0.9.1/package/scripts/supervisor.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/STORM/0.9.1/package/scripts/supervisor.py 2022-07-11 00:52:34.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/STORM/0.9.1/package/scripts/ui_server.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/STORM/0.9.1/package/scripts/ui_server.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/STORM/0.9.1/package/scripts/ui_server.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/STORM/0.9.1/package/scripts/ui_server.py 2022-07-11 00:52:34.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/SUPERSET/0.15.0/package/scripts/params.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/SUPERSET/0.15.0/package/scripts/params.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/SUPERSET/0.15.0/package/scripts/params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/SUPERSET/0.15.0/package/scripts/params.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/SUPERSET/0.15.0/package/scripts/service_check.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/SUPERSET/0.15.0/package/scripts/service_check.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/SUPERSET/0.15.0/package/scripts/service_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/SUPERSET/0.15.0/package/scripts/service_check.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/SUPERSET/0.15.0/package/scripts/status_params.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/SUPERSET/0.15.0/package/scripts/status_params.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/SUPERSET/0.15.0/package/scripts/status_params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/SUPERSET/0.15.0/package/scripts/status_params.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/SUPERSET/0.15.0/package/scripts/superset.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/SUPERSET/0.15.0/package/scripts/superset.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/SUPERSET/0.15.0/package/scripts/superset.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/SUPERSET/0.15.0/package/scripts/superset.py 2022-07-11 00:52:33.000000000 +0800 +@@ -45,7 +45,7 @@ + import params + Directory( + [params.superset_pid_dir, params.superset_log_dir, params.superset_config_dir, params.superset_home_dir], +- mode=0755, ++ mode=0o755, + cd_access='a', + owner=params.superset_user, + group=params.user_group, +@@ -54,7 +54,7 @@ + ) + + File(format("{params.superset_config_dir}/superset-env.sh"), +- mode=0755, ++ mode=0o755, + owner=params.superset_user, + group=params.user_group, + content=InlineTemplate(params.superset_env_sh_template) +@@ -63,7 +63,7 @@ + File(os.path.join(params.superset_bin_dir, 'superset.sh'), + owner=params.superset_user, + group=params.user_group, +- mode=0755, ++ mode=0o755, + content=Template("superset.sh") + ) + superset_config = mutable_config_dict(params.config["configurations"]["superset"]) +@@ -145,13 +145,13 @@ + + def mutable_config_dict(config): + rv = {} +- for key, value in config.iteritems(): ++ for key, value in config.items(): + rv[key] = value + return rv + + def quote_string_values(config): + rv = {} +- for key, value in config.iteritems(): ++ for key, value in config.items(): + rv[key] = quote_string_value(value) + return rv + +@@ -159,7 +159,7 @@ + if value.lower() == "true" or value.lower() == "false" or value.isdigit(): + return value + else: +- return "'{0}'".format(value) ++ return "'{}'".format(value) + + + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/TEZ/0.4.0.2.1/package/scripts/params_linux.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/TEZ/0.4.0.2.1/package/scripts/params_linux.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/TEZ/0.4.0.2.1/package/scripts/params_linux.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/TEZ/0.4.0.2.1/package/scripts/params_linux.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/TEZ/0.4.0.2.1/package/scripts/params.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/TEZ/0.4.0.2.1/package/scripts/params.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/TEZ/0.4.0.2.1/package/scripts/params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/TEZ/0.4.0.2.1/package/scripts/params.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/TEZ/0.4.0.2.1/package/scripts/params_windows.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/TEZ/0.4.0.2.1/package/scripts/params_windows.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/TEZ/0.4.0.2.1/package/scripts/params_windows.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/TEZ/0.4.0.2.1/package/scripts/params_windows.py 2022-07-11 00:52:33.000000000 +0800 +@@ -50,5 +50,5 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/TEZ/0.4.0.2.1/package/scripts/pre_upgrade.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/TEZ/0.4.0.2.1/package/scripts/pre_upgrade.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/TEZ/0.4.0.2.1/package/scripts/pre_upgrade.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/TEZ/0.4.0.2.1/package/scripts/pre_upgrade.py 2022-07-11 00:52:33.000000000 +0800 +@@ -40,7 +40,7 @@ + Logger.info("Before starting Stack Upgrade, check if tez tarball has been copied to HDFS.") + + if params.stack_version_formatted and check_stack_feature(StackFeature.ROLLING_UPGRADE, params.stack_version_formatted): +- Logger.info("Stack version {0} is sufficient to check if need to copy tez.tar.gz to HDFS.".format(params.stack_version_formatted)) ++ Logger.info("Stack version {} is sufficient to check if need to copy tez.tar.gz to HDFS.".format(params.stack_version_formatted)) + + # Force it to copy the current version of the tez tarball, rather than the version the RU will go to. + resource_created = copy_to_hdfs( +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/TEZ/0.4.0.2.1/package/scripts/service_check.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/TEZ/0.4.0.2.1/package/scripts/service_check.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/TEZ/0.4.0.2.1/package/scripts/service_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/TEZ/0.4.0.2.1/package/scripts/service_check.py 2022-07-11 00:52:33.000000000 +0800 +@@ -48,7 +48,7 @@ + + File(format("{tmp_dir}/sample-tez-test"), + content = "foo\nbar\nfoo\nbar\nfoo", +- mode = 0755 ++ mode = 0o755 + ) + + params.HdfsResource("/tmp/tezsmokeoutput", +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/TEZ/0.4.0.2.1/package/scripts/tez_client.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/TEZ/0.4.0.2.1/package/scripts/tez_client.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/TEZ/0.4.0.2.1/package/scripts/tez_client.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/TEZ/0.4.0.2.1/package/scripts/tez_client.py 2022-07-11 00:52:33.000000000 +0800 +@@ -19,7 +19,7 @@ + + """ + import os +-import urlparse ++import urllib.parse + + from ambari_commons import OSConst + from ambari_commons.inet_utils import download_file +@@ -107,7 +107,7 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/TEZ/0.4.0.2.1/package/scripts/tez.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/TEZ/0.4.0.2.1/package/scripts/tez.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/TEZ/0.4.0.2.1/package/scripts/tez.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/TEZ/0.4.0.2.1/package/scripts/tez.py 2022-07-11 00:52:33.000000000 +0800 +@@ -40,7 +40,7 @@ + # ensure that matching LZO libraries are installed for Tez + lzo_utils.install_lzo_if_needed() + +- Directory(params.tez_etc_dir, mode=0755) ++ Directory(params.tez_etc_dir, mode=0o755) + + Directory(config_dir, + owner = params.tez_user, +@@ -53,13 +53,13 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/alerts/alert_nodemanager_health.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/alerts/alert_nodemanager_health.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/alerts/alert_nodemanager_health.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/alerts/alert_nodemanager_health.py 2022-07-11 00:52:32.000000000 +0800 +@@ -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 +@@ -142,15 +142,15 @@ + if host_port is not None: + if ":" in host_port: + uri_host, uri_port = host_port.split(':') +- host_port = '{0}:{1}'.format(host_name, uri_port) ++ host_port = '{}:{}'.format(host_name, uri_port) + else: + host_port = host_name + + # some yarn-site structures don't have the web ui address + if host_port is None: +- host_port = '{0}:{1}'.format(host_name, NODEMANAGER_DEFAULT_PORT) ++ host_port = '{}:{}'.format(host_name, NODEMANAGER_DEFAULT_PORT) + +- query = "{0}://{1}/ws/v1/node/info".format(scheme, host_port) ++ query = "{}://{}/ws/v1/node/info".format(scheme, host_port) + + try: + if kerberos_principal is not None and kerberos_keytab is not None and security_enabled: +@@ -168,9 +168,9 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/alerts/alert_nodemanagers_summary.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/alerts/alert_nodemanagers_summary.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/alerts/alert_nodemanagers_summary.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/alerts/alert_nodemanagers_summary.py 2022-07-11 00:52:32.000000000 +0800 +@@ -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 +@@ -122,7 +122,7 @@ + uri = https_uri + + uri = str(host_name) + ":" + uri.split(":")[1] +- live_nodemanagers_qry = "{0}://{1}/jmx?qry={2}".format(scheme, uri, QRY) ++ live_nodemanagers_qry = "{}://{}/jmx?qry={}".format(scheme, uri, QRY) + convert_to_json_failed = False + response_code = None + try: +@@ -140,7 +140,7 @@ + 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))) +@@ -156,9 +156,9 @@ + + if kerberos_principal is not None and kerberos_keytab is not None and security_enabled: + if response_code in [200, 307] and convert_to_json_failed: +- return ('UNKNOWN', ['HTTP {0} response (metrics unavailable)'.format(str(response_code))]) ++ return ('UNKNOWN', ['HTTP {} response (metrics unavailable)'.format(str(response_code))]) + elif convert_to_json_failed and response_code not in [200, 307]: +- raise Exception("[Alert][NodeManager Health Summary] Getting data from {0} failed with http code {1}".format( ++ raise Exception("[Alert][NodeManager Health Summary] Getting data from {} failed with http code {}".format( + str(live_nodemanagers_qry), str(response_code))) + + unhealthy_count = 0 +@@ -191,7 +191,7 @@ + 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() +@@ -213,7 +213,7 @@ + for jmx_prop_list_item in beans: + if "name" in jmx_prop_list_item and jmx_prop_list_item["name"] == QRY: + if jmx_property not in jmx_prop_list_item: +- raise Exception("Unable to find {0} in JSON from {1} ".format(jmx_property, query)) ++ raise Exception("Unable to find {} in JSON from {} ".format(jmx_property, query)) + json_data = jmx_prop_list_item + + return json_data[jmx_property] +\ 文件尾没有换行符 +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/files/validateYarnComponentStatusWindows.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/files/validateYarnComponentStatusWindows.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/files/validateYarnComponentStatusWindows.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/files/validateYarnComponentStatusWindows.py 2022-07-11 00:52:32.000000000 +0800 +@@ -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 optparse + from ambari_commons import subprocess32 + 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 @@ + 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 @@ + 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 @@ + 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 @@ + 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 @@ + 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 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/scripts/application_timeline_server.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/scripts/application_timeline_server.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/scripts/application_timeline_server.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/scripts/application_timeline_server.py 2022-07-11 00:52:32.000000000 +0800 +@@ -31,8 +31,8 @@ + from resource_management.core.logger import Logger + from resource_management.core.resources.system import Execute + +-from yarn import yarn +-from service import service ++from .yarn import yarn ++from .service import service + from ambari_commons import OSConst + from ambari_commons.os_family_impl import OsFamilyImpl + +@@ -42,18 +42,18 @@ + self.install_packages(env) + + def start(self, env, upgrade_type=None): +- import params ++ from . import params + env.set_params(params) + self.configure(env) # FOR SECURITY + service('timelineserver', action='start') + + def stop(self, env, upgrade_type=None): +- import params ++ from . import params + env.set_params(params) + service('timelineserver', action='stop') + + def configure(self, env): +- import params ++ from . import params + env.set_params(params) + yarn(name='apptimelineserver') + +@@ -68,27 +68,27 @@ + class ApplicationTimelineServerDefault(ApplicationTimelineServer): + def pre_upgrade_restart(self, env, upgrade_type=None): + Logger.info("Executing Stack Upgrade pre-restart") +- import params ++ from . import params + env.set_params(params) + + if params.version and check_stack_feature(StackFeature.ROLLING_UPGRADE, params.version): + stack_select.select_packages(params.version) + + def status(self, env): +- import status_params ++ from . import status_params + env.set_params(status_params) + check_process_status(status_params.yarn_historyserver_pid_file) + + def get_log_folder(self): +- import params ++ from . import params + return params.yarn_log_dir + + def get_user(self): +- import params ++ from . import params + return params.yarn_user + + def get_pid_files(self): +- import status_params ++ from . import status_params + Execute(format("mv {status_params.yarn_historyserver_pid_file_old} {status_params.yarn_historyserver_pid_file}"), + only_if = format("test -e {status_params.yarn_historyserver_pid_file_old}", user=status_params.yarn_user)) + return [status_params.yarn_historyserver_pid_file] +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/scripts/historyserver.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/scripts/historyserver.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/scripts/historyserver.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/scripts/historyserver.py 2022-07-11 00:52:32.000000000 +0800 +@@ -32,9 +32,9 @@ + from resource_management.core.source import Template + from resource_management.core.logger import Logger + +-from install_jars import install_tez_jars +-from yarn import yarn +-from service import service ++from .install_jars import install_tez_jars ++from .yarn import yarn ++from .service import service + from ambari_commons import OSConst + from ambari_commons.os_family_impl import OsFamilyImpl + +@@ -44,12 +44,12 @@ + self.install_packages(env) + + def stop(self, env, upgrade_type=None): +- import params ++ from . import params + env.set_params(params) + service('historyserver', action='stop', serviceName='mapreduce') + + def configure(self, env): +- import params ++ from . import params + env.set_params(params) + yarn(name="historyserver") + +@@ -57,7 +57,7 @@ + @OsFamilyImpl(os_family=OSConst.WINSRV_FAMILY) + class HistoryserverWindows(HistoryServer): + def start(self, env): +- import params ++ from . import params + env.set_params(params) + self.configure(env) + service('historyserver', action='start', serviceName='mapreduce') +@@ -70,7 +70,7 @@ + class HistoryServerDefault(HistoryServer): + def pre_upgrade_restart(self, env, upgrade_type=None): + Logger.info("Executing Stack Upgrade pre-restart") +- import params ++ from . import params + env.set_params(params) + + if params.version and check_stack_feature(StackFeature.ROLLING_UPGRADE, params.version): +@@ -82,7 +82,7 @@ + params.HdfsResource(None, action="execute") + + def start(self, env, upgrade_type=None): +- import params ++ from . import params + env.set_params(params) + self.configure(env) # FOR SECURITY + +@@ -112,20 +112,20 @@ + service('historyserver', action='start', serviceName='mapreduce') + + def status(self, env): +- import status_params ++ from . import status_params + env.set_params(status_params) + check_process_status(status_params.mapred_historyserver_pid_file) + + def get_log_folder(self): +- import params ++ from . import params + return params.mapred_log_dir + + def get_user(self): +- import params ++ from . import params + return params.mapred_user + + def get_pid_files(self): +- import status_params ++ from . import status_params + return [status_params.mapred_historyserver_pid_file] + + if __name__ == "__main__": +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/scripts/install_jars.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/scripts/install_jars.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/scripts/install_jars.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/scripts/install_jars.py 2022-07-11 00:52:32.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + import glob + + def install_tez_jars(): +- import params ++ from . import params + + destination_hdfs_dirs = get_tez_hdfs_dir_paths(params.tez_lib_uris) + +@@ -34,7 +34,7 @@ + type="directory", + action="create_on_execute", + owner=params.tez_user, +- mode=0755 ++ mode=0o755 + ) + + app_dir_path = None +@@ -56,25 +56,25 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/scripts/mapred_service_check.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/scripts/mapred_service_check.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/scripts/mapred_service_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/scripts/mapred_service_check.py 2022-07-11 00:52:32.000000000 +0800 +@@ -38,7 +38,7 @@ + @OsFamilyImpl(os_family=OSConst.WINSRV_FAMILY) + class MapReduce2ServiceCheckWindows(MapReduce2ServiceCheck): + def service_check(self, env): +- import params ++ from . import params + + env.set_params(params) + +@@ -51,11 +51,11 @@ + validateStatusFileName = "validateYarnComponentStatusWindows.py" + validateStatusFilePath = os.path.join(os.path.dirname(params.hadoop_home), "temp", validateStatusFileName) + python_executable = sys.executable +- validateStatusCmd = "{0} {1} {2} -p {3} -s {4}".format( ++ validateStatusCmd = "{} {} {} -p {} -s {}".format( + python_executable, validateStatusFilePath, component_type, component_address, params.hadoop_ssl_enabled) + + if params.security_enabled: +- kinit_cmd = "{0} -kt {1} {2};".format(params.kinit_path_local, params.smoke_user_keytab, params.smokeuser) ++ kinit_cmd = "{} -kt {} {};".format(params.kinit_path_local, params.smoke_user_keytab, params.smokeuser) + smoke_cmd = kinit_cmd + validateStatusCmd + else: + smoke_cmd = validateStatusCmd +@@ -115,7 +115,7 @@ + @OsFamilyImpl(os_family=OsFamilyImpl.DEFAULT) + class MapReduce2ServiceCheckDefault(MapReduce2ServiceCheck): + def service_check(self, env): +- import params ++ from . import params + env.set_params(params) + + jar_path = format("{hadoop_mapred2_jar_location}/{hadoopMapredExamplesJarName}") +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/scripts/mapreduce2_client.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/scripts/mapreduce2_client.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/scripts/mapreduce2_client.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/scripts/mapreduce2_client.py 2022-07-11 00:52:32.000000000 +0800 +@@ -28,7 +28,7 @@ + from resource_management.libraries.functions.constants import StackFeature + from resource_management.libraries.functions.stack_features import check_stack_feature + from resource_management.core.exceptions import ClientComponentHasNoStatus +-from yarn import yarn ++from .yarn import yarn + from ambari_commons import OSConst + from ambari_commons.os_family_impl import OsFamilyImpl + from resource_management.core.logger import Logger +@@ -36,7 +36,7 @@ + + class MapReduce2Client(Script): + def install(self, env): +- import params ++ from . import params + self.install_packages(env) + self.configure(env) + +@@ -45,7 +45,7 @@ + :param env: Python environment + :param config_dir: During rolling upgrade, which config directory to save configs to. + """ +- import params ++ from . import params + env.set_params(params) + yarn(config_dir=config_dir) + +@@ -58,7 +58,7 @@ + careful to only call configure() on the directory of the new version. + :param env: + """ +- import params ++ from . import params + env.set_params(params) + + conf_select_name = "hadoop" +@@ -80,7 +80,7 @@ + @OsFamilyImpl(os_family=OsFamilyImpl.DEFAULT) + class MapReduce2ClientDefault(MapReduce2Client): + def pre_upgrade_restart(self, env, upgrade_type=None): +- import params ++ from . import params + env.set_params(params) + + if params.version and check_stack_feature(StackFeature.ROLLING_UPGRADE, params.version): +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/scripts/nodemanager.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/scripts/nodemanager.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/scripts/nodemanager.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/scripts/nodemanager.py 2022-07-11 00:52:32.000000000 +0800 +@@ -19,7 +19,7 @@ + + """ + +-import nodemanager_upgrade ++from . import nodemanager_upgrade + + from resource_management.libraries.script.script import Script + from resource_management.libraries.functions import stack_select +@@ -31,8 +31,8 @@ + cached_kinit_executor, get_params_from_filesystem, validate_security_config_properties, \ + FILE_TYPE_XML + from resource_management.core.logger import Logger +-from yarn import yarn +-from service import service ++from .yarn import yarn ++from .service import service + from ambari_commons import OSConst + from ambari_commons.os_family_impl import OsFamilyImpl + +@@ -42,18 +42,18 @@ + self.install_packages(env) + + def stop(self, env, upgrade_type=None): +- import params ++ from . import params + env.set_params(params) + service('nodemanager',action='stop') + + def start(self, env, upgrade_type=None): +- import params ++ from . import params + env.set_params(params) + self.configure(env) # FOR SECURITY + service('nodemanager',action='start') + + def configure(self, env): +- import params ++ from . import params + env.set_params(params) + yarn(name="nodemanager") + +@@ -68,7 +68,7 @@ + class NodemanagerDefault(Nodemanager): + def pre_upgrade_restart(self, env, upgrade_type=None): + Logger.info("Executing NodeManager Stack Upgrade pre-restart") +- import params ++ from . import params + env.set_params(params) + + if params.version and check_stack_feature(StackFeature.ROLLING_UPGRADE, params.version): +@@ -76,26 +76,26 @@ + + def post_upgrade_restart(self, env, upgrade_type=None): + Logger.info("Executing NodeManager Stack Upgrade post-restart") +- import params ++ from . import params + env.set_params(params) + + nodemanager_upgrade.post_upgrade_check() + + def status(self, env): +- import status_params ++ from . import status_params + env.set_params(status_params) + check_process_status(status_params.nodemanager_pid_file) + + def get_log_folder(self): +- import params ++ from . import params + return params.yarn_log_dir + + def get_user(self): +- import params ++ from . import params + return params.yarn_user + + def get_pid_files(self): +- import status_params ++ from . import status_params + return [status_params.nodemanager_pid_file] + + if __name__ == "__main__": +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/scripts/nodemanager_upgrade.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/scripts/nodemanager_upgrade.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/scripts/nodemanager_upgrade.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/scripts/nodemanager_upgrade.py 2022-07-11 00:52:32.000000000 +0800 +@@ -34,7 +34,7 @@ + This function will obtain the Kerberos ticket if security is enabled. + :return: + ''' +- import params ++ from . import params + + Logger.info('NodeManager executing "yarn node -list -states=RUNNING" to verify the node has rejoined the cluster...') + if params.security_enabled and params.nodemanager_kinit_cmd: +@@ -56,7 +56,7 @@ + automatically. + :return: + ''' +- import params ++ from . import params + import socket + + command = 'yarn node -list -states=RUNNING' +@@ -68,7 +68,7 @@ + yarn_output = yarn_output.lower() + + if hostname in yarn_output or nodemanager_address in yarn_output or hostname_ip in yarn_output: +- Logger.info('NodeManager with ID \'{0}\' has rejoined the cluster.'.format(nodemanager_address)) ++ Logger.info('NodeManager with ID \'{}\' has rejoined the cluster.'.format(nodemanager_address)) + return + else: +- raise Fail('NodeManager with ID \'{0}\' was not found in the list of running NodeManagers. \'{1}\' output was:\n{2}'.format(nodemanager_address, command, yarn_output)) ++ raise Fail('NodeManager with ID \'{}\' was not found in the list of running NodeManagers. \'{}\' output was:\n{}'.format(nodemanager_address, command, yarn_output)) +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/scripts/params_linux.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/scripts/params_linux.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/scripts/params_linux.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/scripts/params_linux.py 2022-07-11 00:52:32.000000000 +0800 +@@ -40,7 +40,7 @@ + from resource_management.libraries.functions.get_architecture import get_architecture + from resource_management.libraries.functions.setup_ranger_plugin_xml import get_audit_configs, generate_ranger_service_config + +-import status_params ++from . import status_params + + # a map of the Ambari role to the component name + # for use with /current/ +@@ -196,9 +196,9 @@ + + # 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") + +@@ -220,7 +220,7 @@ + + 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') +@@ -231,7 +231,7 @@ + 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') +@@ -272,7 +272,7 @@ + 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 +@@ -538,7 +538,7 @@ + + 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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/scripts/params.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/scripts/params.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/scripts/params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/scripts/params.py 2022-07-11 00:52:32.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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,9 +24,9 @@ + from resource_management.libraries.functions.copy_tarball import get_sysprep_skip_copy_tarballs_hdfs + + if OSCheck.is_windows_family(): +- from params_windows import * ++ from .params_windows import * + else: +- from params_linux import * ++ from .params_linux import * + + sysprep_skip_copy_tarballs_hdfs = get_sysprep_skip_copy_tarballs_hdfs() + retryAble = default("/commandParams/command_retry_enabled", False) +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/scripts/params_windows.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/scripts/params_windows.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/scripts/params_windows.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/scripts/params_windows.py 2022-07-11 00:52:32.000000000 +0800 +@@ -25,7 +25,7 @@ + from resource_management.libraries import functions + from resource_management.libraries.functions import is_empty + import os +-from status_params import * ++from .status_params import * + + # server configurations + config = Script.get_config() +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/scripts/resourcemanager.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/scripts/resourcemanager.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/scripts/resourcemanager.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/scripts/resourcemanager.py 2022-07-11 00:52:32.000000000 +0800 +@@ -40,11 +40,11 @@ + from resource_management.core.resources.zkmigrator import ZkMigrator + from resource_management.libraries.functions import namenode_ha_utils + +-from yarn import yarn +-from service import service ++from .yarn import yarn ++from .service import service + from ambari_commons import OSConst + from ambari_commons.os_family_impl import OsFamilyImpl +-from setup_ranger_yarn import setup_ranger_yarn ++from .setup_ranger_yarn import setup_ranger_yarn + + + class Resourcemanager(Script): +@@ -52,12 +52,12 @@ + self.install_packages(env) + + def stop(self, env, upgrade_type=None): +- import params ++ from . import params + env.set_params(params) + service('resourcemanager', action='stop') + + def configure(self, env): +- import params ++ from . import params + env.set_params(params) + yarn(name='resourcemanager') + +@@ -69,7 +69,7 @@ + @OsFamilyImpl(os_family=OSConst.WINSRV_FAMILY) + class ResourcemanagerWindows(Resourcemanager): + def start(self, env): +- import params ++ from . import params + env.set_params(params) + self.configure(env) + service('resourcemanager', action='start') +@@ -78,7 +78,7 @@ + service('resourcemanager', action='status') + + def decommission(self, env): +- import params ++ from . import params + + env.set_params(params) + yarn_user = params.yarn_user +@@ -107,14 +107,14 @@ + class ResourcemanagerDefault(Resourcemanager): + def pre_upgrade_restart(self, env, upgrade_type=None): + Logger.info("Executing Stack Upgrade post-restart") +- import params ++ from . import params + env.set_params(params) + + if params.version and check_stack_feature(StackFeature.ROLLING_UPGRADE, params.version): + stack_select.select_packages(params.version) + + def start(self, env, upgrade_type=None): +- import params ++ from . import params + + env.set_params(params) + self.configure(env) # FOR SECURITY +@@ -129,14 +129,14 @@ + service('resourcemanager', action='start') + + def status(self, env): +- import status_params ++ from . import status_params + + env.set_params(status_params) + check_process_status(status_params.resourcemanager_pid_file) + pass + + def refreshqueues(self, env): +- import params ++ from . import params + + self.configure(env) + env.set_params(params) +@@ -146,7 +146,7 @@ + ) + + def decommission(self, env): +- import params ++ from . import params + + env.set_params(params) + rm_kinit_cmd = params.rm_kinit_cmd +@@ -177,7 +177,7 @@ + pass + + def disable_security(self, env): +- import params ++ from . import params + if not params.stack_supports_zk_security: + Logger.info("Stack doesn't support zookeeper security") + return +@@ -195,7 +195,7 @@ + zkmigrator.delete_node(params.rm_zk_failover_znode) + + def wait_for_dfs_directories_created(self, *dirs): +- import params ++ from . import params + + ignored_dfs_dirs = HdfsResourceProvider.get_ignored_resources_list(params.hdfs_resource_ignore_file) + +@@ -213,7 +213,7 @@ + + @retry(times=8, sleep_time=20, backoff_factor=1, err_class=Fail) + def wait_for_dfs_directory_created(self, dir_path, ignored_dfs_dirs): +- import params ++ from . import params + + + if not is_empty(dir_path): +@@ -246,15 +246,15 @@ + Logger.info("DFS directory '" + dir_path + "' exists.") + + def get_log_folder(self): +- import params ++ from . import params + return params.yarn_log_dir + + def get_user(self): +- import params ++ from . import params + return params.yarn_user + + def get_pid_files(self): +- import status_params ++ from . import status_params + return [status_params.resourcemanager_pid_file] + + if __name__ == "__main__": +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/scripts/service_check.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/scripts/service_check.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/scripts/service_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/scripts/service_check.py 2022-07-11 00:52:32.000000000 +0800 +@@ -47,7 +47,7 @@ + @OsFamilyImpl(os_family=OSConst.WINSRV_FAMILY) + class ServiceCheckWindows(ServiceCheck): + def service_check(self, env): +- import params ++ from . import params + env.set_params(params) + + yarn_exe = os_utils.quote_path(os.path.join(params.yarn_home, "bin", "yarn.cmd")) +@@ -65,10 +65,10 @@ + validateStatusFileName = "validateYarnComponentStatusWindows.py" + validateStatusFilePath = os.path.join(temp_dir, validateStatusFileName) + python_executable = sys.executable +- validateStatusCmd = "%s %s %s -p %s -s %s" % (python_executable, validateStatusFilePath, component_type, component_address, params.hadoop_ssl_enabled) ++ validateStatusCmd = "{} {} {} -p {} -s {}".format(python_executable, validateStatusFilePath, component_type, component_address, params.hadoop_ssl_enabled) + + if params.security_enabled: +- kinit_cmd = "%s -kt %s %s;" % (params.kinit_path_local, params.smoke_user_keytab, params.smokeuser) ++ kinit_cmd = "{} -kt {} {};".format(params.kinit_path_local, params.smoke_user_keytab, params.smokeuser) + smoke_cmd = kinit_cmd + ' ' + validateStatusCmd + else: + smoke_cmd = validateStatusCmd +@@ -89,7 +89,7 @@ + @OsFamilyImpl(os_family=OsFamilyImpl.DEFAULT) + class ServiceCheckDefault(ServiceCheck): + def service_check(self, env): +- import params ++ from . import params + env.set_params(params) + + params.HdfsResource(format("/user/{smokeuser}"), +@@ -117,7 +117,7 @@ + user=params.smokeuser, + ) + +- m = re.search("appTrackingUrl=(.*),\s", out) ++ m = re.search(r"appTrackingUrl=(.*),\s", out) + app_url = m.group(1) + + splitted_app_url = str(app_url).split('/') +@@ -153,7 +153,7 @@ + raise Fail("Application " + app_url + " state/status is not valid. Should be FINISHED/SUCCEEDED.") + + def get_active_rm_webapp_address(self): +- import params ++ from . import params + active_rm_webapp_address = None + rm_webapp_addresses = params.rm_webapp_addresses_list + if rm_webapp_addresses is not None and len(rm_webapp_addresses) > 0: +@@ -174,7 +174,7 @@ + Logger.warning(format("Cluster info is not available from calling {get_cluster_info_cmd}")) + + if active_rm_webapp_address is None: +- raise Fail('Resource Manager state is not available. Failed to determine the active Resource Manager web application address from {0}'.format(','.join(rm_webapp_addresses))); ++ raise Fail('Resource Manager state is not available. Failed to determine the active Resource Manager web application address from {}'.format(','.join(rm_webapp_addresses))); + return active_rm_webapp_address + + if __name__ == "__main__": +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/scripts/service.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/scripts/service.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/scripts/service.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/scripts/service.py 2022-07-11 00:52:32.000000000 +0800 +@@ -30,8 +30,8 @@ + + @OsFamilyFuncImpl(os_family=OSConst.WINSRV_FAMILY) + def service(componentName, action='start', serviceName='yarn'): +- import status_params +- if status_params.service_map.has_key(componentName): ++ from . import status_params ++ 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) +@@ -41,7 +41,7 @@ + + @OsFamilyFuncImpl(os_family=OsFamilyImpl.DEFAULT) + def service(componentName, action='start', serviceName='yarn'): +- import params ++ from . import params + + if serviceName == 'mapreduce' and componentName == 'historyserver': + if not params.hdfs_tmp_dir or params.hdfs_tmp_dir == None or params.hdfs_tmp_dir.lower() == 'null': +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/scripts/setup_ranger_yarn.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/scripts/setup_ranger_yarn.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/scripts/setup_ranger_yarn.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/scripts/setup_ranger_yarn.py 2022-07-11 00:52:32.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + from resource_management.core.logger import Logger + + def setup_ranger_yarn(): +- import params ++ from . import params + + if params.enable_ranger_yarn: + +@@ -34,7 +34,7 @@ + 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 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/scripts/status_params.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/scripts/status_params.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/scripts/status_params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/scripts/status_params.py 2022-07-11 00:52:32.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/scripts/yarn_client.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/scripts/yarn_client.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/scripts/yarn_client.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/scripts/yarn_client.py 2022-07-11 00:52:32.000000000 +0800 +@@ -25,7 +25,7 @@ + from resource_management.libraries.functions.constants import StackFeature + from resource_management.libraries.functions.stack_features import check_stack_feature + from resource_management.core.exceptions import ClientComponentHasNoStatus +-from yarn import yarn ++from .yarn import yarn + from ambari_commons import OSConst + from ambari_commons.os_family_impl import OsFamilyImpl + +@@ -36,7 +36,7 @@ + self.configure(env) + + def configure(self, env): +- import params ++ from . import params + env.set_params(params) + yarn() + +@@ -52,7 +52,7 @@ + @OsFamilyImpl(os_family=OsFamilyImpl.DEFAULT) + class YarnClientDefault(YarnClient): + def pre_upgrade_restart(self, env, upgrade_type=None): +- import params ++ from . import params + env.set_params(params) + + if params.version and check_stack_feature(StackFeature.ROLLING_UPGRADE, params.version): +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/scripts/yarn.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/scripts/yarn.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/scripts/yarn.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/scripts/yarn.py 2022-07-11 00:52:32.000000000 +0800 +@@ -44,7 +44,7 @@ + :param name: Component name, apptimelineserver, nodemanager, resourcemanager, or None (defaults for client) + :param config_dir: Which config directory to write configs to, which could be different during rolling upgrade. + """ +- import params ++ from . import params + + install_lzo_if_needed() + +@@ -56,7 +56,7 @@ + owner=params.yarn_user, + group=params.user_group, + create_parents=True, +- mode=0755, ++ mode=0o755, + cd_access='a', + ) + +@@ -96,7 +96,7 @@ + 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 @@ + 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 @@ + 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 @@ + 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,23 @@ + 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 +162,19 @@ + + 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 +182,7 @@ + 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, +@@ -288,7 +288,7 @@ + ) + + def setup_historyserver(): +- import params ++ from . import params + + if params.yarn_log_aggregation_enabled: + params.HdfsResource(params.yarn_nm_app_log_dir, +@@ -296,7 +296,7 @@ + type="directory", + owner=params.yarn_user, + group=params.user_group, +- mode=01777, ++ mode=0o1777, + recursive_chmod=True + ) + +@@ -306,7 +306,7 @@ + action="create_on_execute", + type="directory", + owner=params.hdfs_user, +- mode=0777, ++ mode=0o777, + ) + + params.HdfsResource(params.entity_file_history_directory, +@@ -331,7 +331,7 @@ + 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, +@@ -343,7 +343,7 @@ + ) + + def setup_nodemanager(): +- import params ++ from . import params + + # First start after enabling/disabling security + if params.toggle_nm_security: +@@ -374,22 +374,22 @@ + 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 + ) + + def setup_resourcemanager(): +- import params ++ from . import params + + Directory(params.rm_nodes_exclude_dir, +- mode=0755, ++ mode=0o755, + create_parents=True, + cd_access='a', + ) +@@ -400,7 +400,7 @@ + ) + if params.include_hosts: + Directory(params.rm_nodes_include_dir, +- mode=0755, ++ mode=0o755, + create_parents=True, + cd_access='a', + ) +@@ -419,12 +419,12 @@ + action="create_on_execute", + owner=params.yarn_user, + group=params.user_group, +- mode=0700 ++ mode=0o700 + ) + params.HdfsResource(None, action="execute") + + def setup_ats(): +- import params ++ from . import params + + Directory(params.ats_leveldb_dir, + owner=params.yarn_user, +@@ -450,7 +450,7 @@ + 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 +467,7 @@ + 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", +@@ -479,11 +479,11 @@ + params.HdfsResource(None, action="execute") + + def create_log_dir(dir_name): +- import params ++ from . import params + Directory(dir_name, + create_parents = True, + cd_access="a", +- mode=0775, ++ mode=0o775, + owner=params.yarn_user, + group=params.user_group, + ignore_failures=True, +@@ -491,7 +491,7 @@ + + + def create_local_dir(dir_name): +- import params ++ from . import params + + directory_args = {} + +@@ -501,7 +501,7 @@ + Directory(dir_name, + create_parents=True, + cd_access="a", +- mode=0755, ++ mode=0o755, + owner=params.yarn_user, + group=params.user_group, + ignore_failures=True, +@@ -510,7 +510,7 @@ + + @OsFamilyFuncImpl(os_family=OSConst.WINSRV_FAMILY) + def yarn(name = None): +- import params ++ from . import params + XmlConfig("mapred-site.xml", + conf_dir=params.config_dir, + configurations=params.config['configurations']['mapred-site'], +@@ -531,7 +531,7 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/ZEPPELIN/0.6.0/package/scripts/alerts/alert_check_zeppelin.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/ZEPPELIN/0.6.0/package/scripts/alerts/alert_check_zeppelin.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/ZEPPELIN/0.6.0/package/scripts/alerts/alert_check_zeppelin.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/ZEPPELIN/0.6.0/package/scripts/alerts/alert_check_zeppelin.py 2022-07-11 00:52:33.000000000 +0800 +@@ -23,8 +23,9 @@ + from resource_management.core.exceptions import ComponentIsNotRunning + from resource_management.libraries.functions.check_process_status import check_process_status + from resource_management.libraries.script import Script ++import importlib + +-reload(sys) ++importlib.reload(sys) + sys.setdefaultencoding('utf8') + config = Script.get_config() + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/ZEPPELIN/0.6.0/package/scripts/interpreter_json_template.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/ZEPPELIN/0.6.0/package/scripts/interpreter_json_template.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/ZEPPELIN/0.6.0/package/scripts/interpreter_json_template.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/ZEPPELIN/0.6.0/package/scripts/interpreter_json_template.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + """ + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file +@@ -70,7 +70,7 @@ + "master": "yarn-client", + "spark.app.name": "Zeppelin", + "zeppelin.R.image.width": "100%", +- "zeppelin.R.render.options": "out.format \u003d \u0027html\u0027, comment \u003d NA, echo \u003d FALSE, results \u003d \u0027asis\u0027, message \u003d F, warning \u003d F", ++ "zeppelin.R.render.options": "out.format \\u003d \\u0027html\\u0027, comment \\u003d NA, echo \\u003d FALSE, results \\u003d \\u0027asis\\u0027, message \\u003d F, warning \\u003d F", + "zeppelin.R.cmd": "R" + }, + "status": "READY", +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/ZEPPELIN/0.6.0/package/scripts/livy2_config_template.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/ZEPPELIN/0.6.0/package/scripts/livy2_config_template.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/ZEPPELIN/0.6.0/package/scripts/livy2_config_template.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/ZEPPELIN/0.6.0/package/scripts/livy2_config_template.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/ZEPPELIN/0.6.0/package/scripts/master.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/ZEPPELIN/0.6.0/package/scripts/master.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/ZEPPELIN/0.6.0/package/scripts/master.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/ZEPPELIN/0.6.0/package/scripts/master.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + """ + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file +@@ -85,7 +85,7 @@ + source=spark_deps_full_path, + group=params.zeppelin_group, + owner=params.zeppelin_user, +- mode=0444, ++ mode=0o444, + replace_existing_files=True, + ) + +@@ -99,7 +99,7 @@ + group=params.zeppelin_group, + cd_access="a", + create_parents=True, +- mode=0755 ++ mode=0o755 + ) + + def create_zeppelin_hdfs_conf_dir(self, env): +@@ -110,7 +110,7 @@ + group=params.zeppelin_group, + cd_access="a", + create_parents=True, +- mode=0755 ++ mode=0o755 + ) + + def chown_zeppelin_pid_dir(self, env): +@@ -132,7 +132,7 @@ + group=params.zeppelin_group, + cd_access="a", + create_parents=True, +- mode=0755 ++ mode=0o755 + ) + self.chown_zeppelin_pid_dir(env) + +@@ -167,7 +167,7 @@ + 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, +@@ -175,7 +175,7 @@ + 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, +@@ -183,7 +183,7 @@ + configuration_attributes=params.config['configurationAttributes']['core-site'], + owner=params.zeppelin_user, + group=params.zeppelin_group, +- mode=0644) ++ mode=0o644) + + def check_and_copy_notebook_in_hdfs(self, params): + if params.config['configurations']['zeppelin-config']['zeppelin.notebook.dir'].startswith("/"): +@@ -287,7 +287,7 @@ + config_data = self.get_interpreter_settings() + interpreter_settings = config_data['interpreterSettings'] + +- for setting_key in interpreter_json_template.keys(): ++ for setting_key in list(interpreter_json_template.keys()): + if setting_key not in interpreter_settings: + interpreter_settings[setting_key] = interpreter_json_template[ + setting_key] +@@ -387,7 +387,7 @@ + + if params.zeppelin_interpreter: + settings_to_delete = [] +- for settings_key, interpreter in interpreter_settings.items(): ++ for settings_key, interpreter in list(interpreter_settings.items()): + if interpreter['group'] not in params.zeppelin_interpreter: + settings_to_delete.append(settings_key) + +@@ -395,7 +395,7 @@ + del interpreter_settings[key] + + hive_interactive_properties_key = 'hive_interactive' +- for setting_key in interpreter_settings.keys(): ++ for setting_key in list(interpreter_settings.keys()): + interpreter = interpreter_settings[setting_key] + if interpreter['group'] == 'jdbc': + interpreter['dependencies'] = [] +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/ZEPPELIN/0.6.0/package/scripts/params.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/ZEPPELIN/0.6.0/package/scripts/params.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/ZEPPELIN/0.6.0/package/scripts/params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/ZEPPELIN/0.6.0/package/scripts/params.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 extract_spark_version(spark_home): + try: + with open(spark_home + "/RELEASE") as fline: +- return re.search('Spark (\d\.\d).+', fline.readline().rstrip()).group(1) ++ return re.search(r'Spark (\d\.\d).+', fline.readline().rstrip()).group(1) + except: + pass + return None +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/ZEPPELIN/0.6.0/package/scripts/spark2_config_template.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/ZEPPELIN/0.6.0/package/scripts/spark2_config_template.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/ZEPPELIN/0.6.0/package/scripts/spark2_config_template.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/ZEPPELIN/0.6.0/package/scripts/spark2_config_template.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + """ + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file +@@ -40,7 +40,7 @@ + "master": "local[*]", + "spark.app.name": "Zeppelin", + "zeppelin.R.image.width": "100%", +- "zeppelin.R.render.options": "out.format \u003d \u0027html\u0027, comment \u003d NA, echo \u003d FALSE, results \u003d \u0027asis\u0027, message \u003d F, warning \u003d F", ++ "zeppelin.R.render.options": "out.format \\u003d \\u0027html\\u0027, comment \\u003d NA, echo \\u003d FALSE, results \\u003d \\u0027asis\\u0027, message \\u003d F, warning \\u003d F", + "zeppelin.R.cmd": "R" + }, + "status": "READY", +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/ZEPPELIN/0.7.0/package/scripts/alerts/alert_check_zeppelin.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/ZEPPELIN/0.7.0/package/scripts/alerts/alert_check_zeppelin.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/ZEPPELIN/0.7.0/package/scripts/alerts/alert_check_zeppelin.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/ZEPPELIN/0.7.0/package/scripts/alerts/alert_check_zeppelin.py 2022-07-11 00:52:33.000000000 +0800 +@@ -23,8 +23,9 @@ + from resource_management.core.exceptions import ComponentIsNotRunning + from resource_management.libraries.functions.check_process_status import check_process_status + from resource_management.libraries.script import Script ++import importlib + +-reload(sys) ++importlib.reload(sys) + sys.setdefaultencoding('utf8') + config = Script.get_config() + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/ZEPPELIN/0.7.0/package/scripts/interpreter_json_template.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/ZEPPELIN/0.7.0/package/scripts/interpreter_json_template.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/ZEPPELIN/0.7.0/package/scripts/interpreter_json_template.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/ZEPPELIN/0.7.0/package/scripts/interpreter_json_template.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + """ + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file +@@ -70,7 +70,7 @@ + "master": "yarn-client", + "spark.app.name": "Zeppelin", + "zeppelin.R.image.width": "100%", +- "zeppelin.R.render.options": "out.format \u003d \u0027html\u0027, comment \u003d NA, echo \u003d FALSE, results \u003d \u0027asis\u0027, message \u003d F, warning \u003d F", ++ "zeppelin.R.render.options": "out.format \\u003d \\u0027html\\u0027, comment \\u003d NA, echo \\u003d FALSE, results \\u003d \\u0027asis\\u0027, message \\u003d F, warning \\u003d F", + "zeppelin.R.cmd": "R" + }, + "status": "READY", +@@ -149,7 +149,7 @@ + "master": "local[*]", + "spark.app.name": "Zeppelin", + "zeppelin.R.image.width": "100%", +- "zeppelin.R.render.options": "out.format \u003d \u0027html\u0027, comment \u003d NA, echo \u003d FALSE, results \u003d \u0027asis\u0027, message \u003d F, warning \u003d F", ++ "zeppelin.R.render.options": "out.format \\u003d \\u0027html\\u0027, comment \\u003d NA, echo \\u003d FALSE, results \\u003d \\u0027asis\\u0027, message \\u003d F, warning \\u003d F", + "zeppelin.R.cmd": "R" + }, + "status": "READY", +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/ZEPPELIN/0.7.0/package/scripts/master.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/ZEPPELIN/0.7.0/package/scripts/master.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/ZEPPELIN/0.7.0/package/scripts/master.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/ZEPPELIN/0.7.0/package/scripts/master.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + """ + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file +@@ -87,7 +87,7 @@ + source=spark_deps_full_path, + group=params.zeppelin_group, + owner=params.zeppelin_user, +- mode=0444, ++ mode=0o444, + replace_existing_files=True, + ) + +@@ -101,7 +101,7 @@ + group=params.zeppelin_group, + cd_access="a", + create_parents=True, +- mode=0755 ++ mode=0o755 + ) + + def create_zeppelin_hdfs_conf_dir(self, env): +@@ -112,7 +112,7 @@ + group=params.zeppelin_group, + cd_access="a", + create_parents=True, +- mode=0755 ++ mode=0o755 + ) + + def chown_zeppelin_pid_dir(self, env): +@@ -134,13 +134,13 @@ + group=params.zeppelin_group, + cd_access="a", + create_parents=True, +- mode=0755 ++ mode=0o755 + ) + self.chown_zeppelin_pid_dir(env) + + # write out zeppelin-site.xml + my_map = {} +- for key, value in params.config['configurations']['zeppelin-config'].iteritems(): ++ for key, value in params.config['configurations']['zeppelin-config'].items(): + my_map[key]=value + my_map['zeppelin.server.kerberos.keytab']=params.zeppelin_kerberos_keytab + my_map['zeppelin.server.kerberos.principal']=params.zeppelin_kerberos_principal +@@ -175,7 +175,7 @@ + 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, +@@ -183,7 +183,7 @@ + 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, +@@ -191,7 +191,7 @@ + configuration_attributes=params.config['configurationAttributes']['core-site'], + owner=params.zeppelin_user, + group=params.zeppelin_group, +- mode=0644) ++ mode=0o644) + + def check_and_copy_notebook_in_hdfs(self, params): + if params.config['configurations']['zeppelin-config']['zeppelin.notebook.dir'].startswith("/"): +@@ -294,7 +294,7 @@ + config_data = self.get_interpreter_settings() + interpreter_settings = config_data['interpreterSettings'] + +- for setting_key in interpreter_json_template.keys(): ++ for setting_key in list(interpreter_json_template.keys()): + if setting_key not in interpreter_settings: + interpreter_settings[setting_key] = interpreter_json_template[ + setting_key] +@@ -430,7 +430,7 @@ + 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: +@@ -504,7 +504,7 @@ + + if params.zeppelin_interpreter: + settings_to_delete = [] +- for settings_key, interpreter in interpreter_settings.items(): ++ for settings_key, interpreter in list(interpreter_settings.items()): + if interpreter['group'] not in params.zeppelin_interpreter: + settings_to_delete.append(settings_key) + +@@ -512,7 +512,7 @@ + del interpreter_settings[key] + + hive_interactive_properties_key = 'hive_interactive' +- for setting_key in interpreter_settings.keys(): ++ for setting_key in list(interpreter_settings.keys()): + interpreter = interpreter_settings[setting_key] + if interpreter['group'] == 'jdbc' and interpreter['name'] == 'jdbc': + interpreter['dependencies'] = [] +@@ -648,7 +648,7 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/ZEPPELIN/0.7.0/package/scripts/params.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/ZEPPELIN/0.7.0/package/scripts/params.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/ZEPPELIN/0.7.0/package/scripts/params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/ZEPPELIN/0.7.0/package/scripts/params.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 extract_spark_version(spark_home): + try: + with open(spark_home + "/RELEASE") as fline: +- return re.search('Spark (\d\.\d).+', fline.readline().rstrip()).group(1) ++ return re.search(r'Spark (\d\.\d).+', fline.readline().rstrip()).group(1) + except: + pass + return None +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/ZEPPELIN/0.7.0/service_advisor.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/ZEPPELIN/0.7.0/service_advisor.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/ZEPPELIN/0.7.0/service_advisor.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/ZEPPELIN/0.7.0/service_advisor.py 2022-07-11 00:52:33.000000000 +0800 +@@ -39,12 +39,12 @@ + 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): + + def __init__(self, *args, **kwargs): +- self.as_super = super(ZeppelinServiceAdvisor, self) ++ self.as_super = super() + self.as_super.__init__(*args, **kwargs) + + # Always call these methods +@@ -145,7 +145,7 @@ + """ + + def __init__(self, *args, **kwargs): +- self.as_super = super(ZeppelinRecommender, self) ++ self.as_super = super() + self.as_super.__init__(*args, **kwargs) + + def recommendZeppelinConfigurationsFromHDP25(self, configurations, clusterData, services, hosts): +@@ -183,7 +183,7 @@ + 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 = [] + +@@ -200,7 +200,7 @@ + """ + + def __init__(self, *args, **kwargs): +- self.as_super = super(ZeppelinValidator, self) ++ self.as_super = super() + self.as_super.__init__(*args, **kwargs) + + self.validators = [] +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/ZOOKEEPER/3.4.5/package/scripts/params_linux.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/ZOOKEEPER/3.4.5/package/scripts/params_linux.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/ZOOKEEPER/3.4.5/package/scripts/params_linux.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/ZOOKEEPER/3.4.5/package/scripts/params_linux.py 2022-07-11 00:52:33.000000000 +0800 +@@ -18,7 +18,7 @@ + Ambari Agent + + """ +-import status_params ++from . import status_params + import os + + from resource_management.libraries.functions import format +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/ZOOKEEPER/3.4.5/package/scripts/params.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/ZOOKEEPER/3.4.5/package/scripts/params.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/ZOOKEEPER/3.4.5/package/scripts/params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/ZOOKEEPER/3.4.5/package/scripts/params.py 2022-07-11 00:52:33.000000000 +0800 +@@ -21,7 +21,7 @@ + from ambari_commons import OSCheck + + if OSCheck.is_windows_family(): +- from params_windows import * ++ from .params_windows import * + else: +- from params_linux import * ++ from .params_linux import * + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/ZOOKEEPER/3.4.5/package/scripts/params_windows.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/ZOOKEEPER/3.4.5/package/scripts/params_windows.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/ZOOKEEPER/3.4.5/package/scripts/params_windows.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/ZOOKEEPER/3.4.5/package/scripts/params_windows.py 2022-07-11 00:52:33.000000000 +0800 +@@ -21,7 +21,7 @@ + from ambari_commons.str_utils import ensure_double_backslashes + from resource_management.libraries.script.script import Script + from resource_management.libraries.functions import is_empty +-import status_params ++from . import status_params + + # server configurations + config = Script.get_config() +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/ZOOKEEPER/3.4.5/package/scripts/service_check.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/ZOOKEEPER/3.4.5/package/scripts/service_check.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/ZOOKEEPER/3.4.5/package/scripts/service_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/ZOOKEEPER/3.4.5/package/scripts/service_check.py 2022-07-11 00:52:33.000000000 +0800 +@@ -32,7 +32,7 @@ + @OsFamilyImpl(os_family=OsFamilyImpl.DEFAULT) + class ZookeeperServiceCheckLinux(ZookeeperServiceCheck): + def service_check(self, env): +- import params ++ from . import params + env.set_params(params) + + File(params.zk_smoke_out, +@@ -40,7 +40,7 @@ + ) + + File(format("{tmp_dir}/zkSmoke.sh"), +- mode=0755, ++ mode=0o755, + content=StaticFile('zkSmoke.sh') + ) + +@@ -65,7 +65,7 @@ + @OsFamilyImpl(os_family=OSConst.WINSRV_FAMILY) + class ZookeeperServiceCheckWindows(ZookeeperServiceCheck): + def service_check(self, env): +- import params ++ from . import params + env.set_params(params) + + smoke_cmd = os.path.join(params.stack_root,"Run-SmokeTests.cmd") +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/ZOOKEEPER/3.4.5/package/scripts/status_params.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/ZOOKEEPER/3.4.5/package/scripts/status_params.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/ZOOKEEPER/3.4.5/package/scripts/status_params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/ZOOKEEPER/3.4.5/package/scripts/status_params.py 2022-07-11 00:52:33.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/ZOOKEEPER/3.4.5/package/scripts/zookeeper_client.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/ZOOKEEPER/3.4.5/package/scripts/zookeeper_client.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/ZOOKEEPER/3.4.5/package/scripts/zookeeper_client.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/ZOOKEEPER/3.4.5/package/scripts/zookeeper_client.py 2022-07-11 00:52:33.000000000 +0800 +@@ -31,23 +31,23 @@ + from ambari_commons import OSConst + from ambari_commons.os_family_impl import OsFamilyFuncImpl, OsFamilyImpl + +-from zookeeper import zookeeper ++from .zookeeper import zookeeper + + class ZookeeperClient(Script): + def configure(self, env): +- import params ++ from . import params + env.set_params(params) + zookeeper(type='client') + pass + + def start(self, env, upgrade_type=None): +- import params ++ from . import params + env.set_params(params) + self.configure(env) + pass + + def stop(self, env, upgrade_type=None): +- import params ++ from . import params + env.set_params(params) + pass + +@@ -63,7 +63,7 @@ + + def pre_upgrade_restart(self, env, upgrade_type=None): + Logger.info("Executing Stack Upgrade pre-restart") +- import params ++ from . import params + env.set_params(params) + + if params.version and check_stack_feature(StackFeature.ROLLING_UPGRADE, format_stack_version(params.version)): +@@ -73,7 +73,7 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/ZOOKEEPER/3.4.5/package/scripts/zookeeper.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/ZOOKEEPER/3.4.5/package/scripts/zookeeper.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/ZOOKEEPER/3.4.5/package/scripts/zookeeper.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/ZOOKEEPER/3.4.5/package/scripts/zookeeper.py 2022-07-11 00:52:33.000000000 +0800 +@@ -34,7 +34,7 @@ + + @OsFamilyFuncImpl(os_family=OsFamilyImpl.DEFAULT) + def zookeeper(type = None, upgrade_type=None): +- import params ++ from . import params + + Directory(params.config_dir, + owner=params.zk_user, +@@ -56,14 +56,14 @@ + 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 @@ + 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 + ) +@@ -110,7 +110,7 @@ + + @OsFamilyFuncImpl(os_family=OSConst.WINSRV_FAMILY) + def zookeeper(type = None, upgrade_type=None): +- import params ++ from . import params + configFile("zoo.cfg", template_name="zoo.cfg.j2", mode="f") + configFile("configuration.xsl", template_name="configuration.xsl.j2", mode="f") + +@@ -145,7 +145,7 @@ + ) + + def configFile(name, template_name=None, mode=None): +- import params ++ from . import params + + File(os.path.join(params.config_dir, name), + content=Template(template_name), +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/ZOOKEEPER/3.4.5/package/scripts/zookeeper_server.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/ZOOKEEPER/3.4.5/package/scripts/zookeeper_server.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/ZOOKEEPER/3.4.5/package/scripts/zookeeper_server.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/ZOOKEEPER/3.4.5/package/scripts/zookeeper_server.py 2022-07-11 00:52:33.000000000 +0800 +@@ -36,8 +36,8 @@ + from resource_management.libraries.functions.check_process_status import check_process_status + from resource_management.libraries.functions.format import format + from resource_management.libraries.functions.validate import call_and_match_output +-from zookeeper import zookeeper +-from zookeeper_service import zookeeper_service ++from .zookeeper import zookeeper ++from .zookeeper_service import zookeeper_service + from ambari_commons import OSConst + from ambari_commons.os_family_impl import OsFamilyImpl + +@@ -45,18 +45,18 @@ + class ZookeeperServer(Script): + + def configure(self, env, upgrade_type=None): +- import params ++ from . import params + env.set_params(params) + zookeeper(type='server', upgrade_type=upgrade_type) + + def start(self, env, upgrade_type=None): +- import params ++ from . import params + env.set_params(params) + self.configure(env, upgrade_type=upgrade_type) + zookeeper_service(action='start', upgrade_type=upgrade_type) + + def stop(self, env, upgrade_type=None): +- import params ++ from . import params + env.set_params(params) + zookeeper_service(action='stop', upgrade_type=upgrade_type) + +@@ -69,7 +69,7 @@ + + def pre_upgrade_restart(self, env, upgrade_type=None): + Logger.info("Executing Stack Upgrade pre-restart") +- import params ++ from . import params + env.set_params(params) + + if check_stack_feature(StackFeature.ROLLING_UPGRADE, format_stack_version(params.version)): +@@ -81,7 +81,7 @@ + return + + Logger.info("Executing Stack Upgrade post-restart") +- import params ++ from . import params + env.set_params(params) + zk_server_host = random.choice(params.zookeeper_hosts) + cli_shell = format("{zk_cli_shell} -server {zk_server_host}:{client_port}") +@@ -93,7 +93,7 @@ + + quorum_err_message = "Failed to establish zookeeper quorum" + call_and_match_output(create_command, 'Created', quorum_err_message, user=params.zk_user) +- call_and_match_output(list_command, r"\[.*?" + unique + ".*?\]", quorum_err_message, user=params.zk_user) ++ call_and_match_output(list_command, r"\[.*?" + unique + r".*?\]", quorum_err_message, user=params.zk_user) + shell.call(delete_command, user=params.zk_user) + + if params.client_port: +@@ -103,20 +103,20 @@ + Logger.info(out) + + def status(self, env): +- import status_params ++ from . import status_params + env.set_params(status_params) + check_process_status(status_params.zk_pid_file) + + def get_log_folder(self): +- import params ++ from . import params + return params.zk_log_dir + + def get_user(self): +- import params ++ from . import params + return params.zk_user + + def get_pid_files(self): +- import status_params ++ from . import status_params + return [status_params.zk_pid_file] + + +@@ -124,14 +124,14 @@ + class ZookeeperServerWindows(ZookeeperServer): + def install(self, env): + from resource_management.libraries.functions.windows_service_utils import check_windows_service_exists +- import params ++ from . import params + if not check_windows_service_exists(params.zookeeper_win_service_name): + self.install_packages(env) + self.configure(env) + + def status(self, env): + from resource_management.libraries.functions.windows_service_utils import check_windows_service_status +- import status_params ++ from . import status_params + check_windows_service_status(status_params.zookeeper_win_service_name) + + if __name__ == "__main__": +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/ZOOKEEPER/3.4.5/package/scripts/zookeeper_service.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/ZOOKEEPER/3.4.5/package/scripts/zookeeper_service.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/ZOOKEEPER/3.4.5/package/scripts/zookeeper_service.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/ZOOKEEPER/3.4.5/package/scripts/zookeeper_service.py 2022-07-11 00:52:33.000000000 +0800 +@@ -28,7 +28,7 @@ + + @OsFamilyFuncImpl(os_family=OsFamilyImpl.DEFAULT) + def zookeeper_service(action='start', upgrade_type=None): +- import params ++ from . import params + + cmd = format("env ZOOCFGDIR={config_dir} ZOOCFG=zoo.cfg {zk_bin}/zkServer.sh") + +@@ -65,7 +65,7 @@ + + @OsFamilyFuncImpl(os_family=OSConst.WINSRV_FAMILY) + def zookeeper_service(action='start', rolling_restart=False): +- import params ++ from . import params + if action == 'start': + Service(params.zookeeper_win_service_name, action="start") + elif action == 'stop': +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/ZOOKEEPER/3.4.9/service_advisor.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/ZOOKEEPER/3.4.9/service_advisor.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/common-services/ZOOKEEPER/3.4.9/service_advisor.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/common-services/ZOOKEEPER/3.4.9/service_advisor.py 2022-07-11 00:52:33.000000000 +0800 +@@ -37,13 +37,13 @@ + 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): + + def __init__(self, *args, **kwargs): +- self.as_super = super(ZookeeperServiceAdvisor, self) ++ self.as_super = super() + self.as_super.__init__(*args, **kwargs) + + self.initialize_logger("ZookeeperServiceAdvisor") +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/custom_actions/scripts/check_host.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/custom_actions/scripts/check_host.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/custom_actions/scripts/check_host.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/custom_actions/scripts/check_host.py 2022-07-11 00:52:36.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + """ + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file +@@ -83,9 +83,9 @@ + # Package prefixes that are used to find repos (then repos are used to find other packages) + PACKAGES = [ + "^hadoop.*$", "^zookeeper.*$", "^webhcat.*$", "^oozie.*$", "^ambari.*$", "^.+-manager-server-db.*$", +- "^.+-manager-daemons.*$", "^mahout[_\-]\d.*$", "^spark.*$", "^falcon.*$", "^hbase.*$", "^kafka.*$", "^knox.*$", ++ "^.+-manager-daemons.*$", r"^mahout[_\-]\d.*$", "^spark.*$", "^falcon.*$", "^hbase.*$", "^kafka.*$", "^knox.*$", + "^sqoop.*$", "^storm.*$", "^flume.*$","^hcatalog.*$", "^phoenix.*$", "^ranger.*$", "^accumulo.*$", "^hive_.*$", +- "^pig[_\-.].*$" # there's a default 'pigz' package which we should avoid ++ r"^pig[_\-.].*$" # there's a default 'pigz' package which we should avoid + ] + + +@@ -137,7 +137,7 @@ + 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)} + +@@ -145,7 +145,7 @@ + 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)} + +@@ -153,14 +153,14 @@ + 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)} + +@@ -171,7 +171,7 @@ + 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)} +@@ -181,7 +181,7 @@ + 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)} + +@@ -194,10 +194,10 @@ + for check_name in FALLIBLE_CHECKS: + if check_name in structured_output and "exit_code" in structured_output[check_name] \ + and structured_output[check_name]["exit_code"] != 0: +- error_message += "Check {0} was unsuccessful. Exit code: {1}.".format(check_name, \ ++ error_message += "Check {} was unsuccessful. Exit code: {}.".format(check_name, \ + structured_output[check_name]["exit_code"]) + if "message" in structured_output[check_name]: +- error_message += " Message: {0}".format(structured_output[check_name]["message"]) ++ error_message += " Message: {}".format(structured_output[check_name]["message"]) + error_message += "\n" + + Logger.info("Host checks completed.") +@@ -211,7 +211,7 @@ + def execute_transparent_huge_page_check(self, config): + Logger.info("Transparent huge page check started.") + +- thp_regex = "\[(.+)\]" ++ thp_regex = r"\[(.+)\]" + file_name = None + if OSCheck.is_ubuntu_family(): + file_name = THP_FILE_UBUNTU +@@ -367,7 +367,7 @@ + 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) +@@ -375,13 +375,13 @@ + return db_connection_check_structured_output + + if jdk_name.endswith(".exe"): +- install_cmd = "{0} /s INSTALLDIR={1} STATIC=1 WEB_JAVA=0 /L \\var\\log\\ambari-agent".format( ++ install_cmd = "{} /s INSTALLDIR={} STATIC=1 WEB_JAVA=0 /L \\var\\log\\ambari-agent".format( + os_utils.quote_path(jdk_download_target), os_utils.quote_path(java_home), + ) + 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} +@@ -399,10 +399,10 @@ + 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} +@@ -414,7 +414,7 @@ + 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) +@@ -432,7 +432,7 @@ + # 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 " \ +@@ -451,7 +451,7 @@ + db_connection_url, user_name, PasswordString(user_passwd), jdbc_driver_class) + + if db_name == DB_SQLA: +- db_connection_check_command = "LD_LIBRARY_PATH=$LD_LIBRARY_PATH:{0}{1} {2}".format(agent_cache_dir, ++ db_connection_check_command = "LD_LIBRARY_PATH=$LD_LIBRARY_PATH:{}{} {}".format(agent_cache_dir, + LIBS_PATH_IN_ARCHIVE_SQLA, db_connection_check_command) + + code, out = shell.call(db_connection_check_command) +@@ -486,7 +486,7 @@ + try: + host = host.strip() + socket.gethostbyname(host) +- except socket.error,exception: ++ except OSError as exception: + successCount -= 1 + failedCount += 1 + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/custom_actions/scripts/clear_repocache.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/custom_actions/scripts/clear_repocache.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/custom_actions/scripts/clear_repocache.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/custom_actions/scripts/clear_repocache.py 2022-07-11 00:52:36.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + if 0 == code: + structured_output["clear_repocache"] = {"exit_code" : 0, "message": format("Repository cache successfully cleared!")} + else: +- structured_output["clear_repocache"] = {"exit_code": code, "message": "Failed to clear repository cache! {0}".format(str(output))} ++ structured_output["clear_repocache"] = {"exit_code": code, "message": "Failed to clear repository cache! {}".format(str(output))} + self.put_structured_out(structured_output) + + def get_clearcache_cmd(self): +@@ -50,7 +50,7 @@ + Logger.info("Clear repository cache for the Ubuntu OS family"); + return ('/usr/bin/apt-get', 'update') + else: +- raise Exception("Unsupported OS family: '{0}' ".format(OSCheck.get_os_family())) ++ raise Exception("Unsupported OS family: '{}' ".format(OSCheck.get_os_family())) + + if __name__ == "__main__": + ClearRepoCache().execute() +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/custom_actions/scripts/install_packages.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/custom_actions/scripts/install_packages.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/custom_actions/scripts/install_packages.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/custom_actions/scripts/install_packages.py 2022-07-11 00:52:36.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + UBUNTU_REPO_COMPONENTS_POSTFIX = ["main"] + + def __init__(self): +- super(InstallPackages, self).__init__() ++ super().__init__() + + self.repo_mgr = ManagerFactory.get() + self.repo_files = {} +@@ -99,15 +99,15 @@ + try: + if not command_repository.items: + Logger.warning( +- "Repository list is empty. Ambari may not be managing the repositories for {0}.".format( ++ "Repository list is empty. Ambari may not be managing the repositories for {}.".format( + self.repository_version)) + else: + Logger.info( +- "Will install packages for repository version {0}".format(self.repository_version)) ++ "Will install packages for repository version {}".format(self.repository_version)) + new_repo_files = Script.repository_util.create_repo_files() + self.repo_files.update(new_repo_files) + except Exception as err: +- Logger.logger.exception("Cannot install repository files. Error: {0}".format(str(err))) ++ Logger.logger.exception("Cannot install repository files. Error: {}".format(str(err))) + num_errors += 1 + + # Build structured output with initial values +@@ -143,13 +143,13 @@ + num_errors += 1 + except Exception as err: + num_errors += 1 +- Logger.logger.exception("Could not install packages. Error: {0}".format(str(err))) ++ Logger.logger.exception("Could not install packages. Error: {}".format(str(err))) + + try: + lzo_utils.install_lzo_if_needed() + except Exception as err: + num_errors += 1 +- Logger.logger.exception("Could not install LZO packages. Error: {0}".format(str(err))) ++ Logger.logger.exception("Could not install LZO packages. Error: {}".format(str(err))) + + # Provide correct exit code + if num_errors > 0: +@@ -186,11 +186,11 @@ + if 0 == len(restricted_packages): + Logger.info("There are no restricted conf-select packages for this installation") + else: +- Logger.info("Restricting conf-select packages to {0}".format(restricted_packages)) ++ Logger.info("Restricting conf-select packages to {}".format(restricted_packages)) + +- for package_name, directories in conf_select.get_package_dirs().iteritems(): +- 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))) ++ for package_name, directories in list(conf_select.get_package_dirs().items()): ++ Logger.info("Attempting to fix the default conf links for {}".format(package_name)) ++ Logger.info("The following directories will be fixed for {}: {}".format(package_name, str(directories))) + + component_name = None + for directory_struct in directories: +@@ -200,7 +200,7 @@ + if component_name: + stack_version = stack_select.get_stack_version_before_install(component_name) + else: +- Logger.warning("Unable to fix {0} since stack using outdated stack_packages.json".format(package_name)) ++ Logger.warning("Unable to fix {} since stack using outdated stack_packages.json".format(package_name)) + return + + if 0 == len(restricted_packages) or package_name in restricted_packages: +@@ -208,7 +208,7 @@ + conf_select.convert_conf_directories_to_symlinks(package_name, stack_version, directories) + else: + Logger.warning( +- "Unable to fix {0} since there is no known installed version for this component".format(package_name)) ++ "Unable to fix {} since there is no known installed version for this component".format(package_name)) + + def _relink_configurations_with_conf_select(self, stack_id, stack_version): + """ +@@ -224,12 +224,12 @@ + + args = stack_id.upper().split('-') + if len(args) != 2: +- Logger.info("Unrecognized stack id {0}, cannot create config links".format(stack_id)) ++ Logger.info("Unrecognized stack id {}, cannot create config links".format(stack_id)) + return + + target_stack_version = args[1] + if not (target_stack_version and check_stack_feature(StackFeature.CONFIG_VERSIONING, target_stack_version)): +- Logger.info("Configuration symlinks are not needed for {0}".format(stack_version)) ++ Logger.info("Configuration symlinks are not needed for {}".format(stack_version)) + return + + # After upgrading hdf-select package from HDF-2.X to HDF-3.Y, we need to create this symlink +@@ -242,9 +242,9 @@ + if 0 == len(restricted_packages): + Logger.info("There are no restricted conf-select packages for this installation") + else: +- Logger.info("Restricting conf-select packages to {0}".format(restricted_packages)) ++ Logger.info("Restricting conf-select packages to {}".format(restricted_packages)) + +- for package_name, directories in conf_select.get_package_dirs().iteritems(): ++ for package_name, directories in list(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) + +@@ -259,7 +259,7 @@ + self.actual_version = None + self.repo_version_with_build_number = None + if self.repository_version: +- m = re.search("[\d\.]+-\d+", self.repository_version) ++ m = re.search(r"[\d\.]+-\d+", self.repository_version) + if m: + # Contains a build number + self.repo_version_with_build_number = self.repository_version +@@ -267,13 +267,13 @@ + self.put_structured_out(self.structured_output) + + Logger.info("Attempting to determine actual version with build number.") +- Logger.info("Old versions: {0}".format(self.old_versions)) ++ Logger.info("Old versions: {}".format(self.old_versions)) + + new_versions = get_stack_versions(self.stack_root_folder) +- Logger.info("New versions: {0}".format(new_versions)) ++ Logger.info("New versions: {}".format(new_versions)) + + deltas = set(new_versions) - set(self.old_versions) +- Logger.info("Deltas: {0}".format(deltas)) ++ Logger.info("Deltas: {}".format(deltas)) + + # Get version without build number + normalized_repo_version = self.repository_version.split('-')[0] +@@ -284,7 +284,7 @@ + self.put_structured_out(self.structured_output) + write_actual_version_to_history_file(normalized_repo_version, self.actual_version) + Logger.info( +- "Found actual version {0} by checking the delta between versions before and after installing packages".format( ++ "Found actual version {} by checking the delta between versions before and after installing packages".format( + self.actual_version)) + else: + # If the first install attempt does a partial install and is unable to report this to the server, +@@ -297,7 +297,7 @@ + self.actual_version = self.actual_version.strip() + self.structured_output['actual_version'] = self.actual_version + self.put_structured_out(self.structured_output) +- Logger.info("Found actual version {0} by searching for best possible match".format(self.actual_version)) ++ Logger.info("Found actual version {} by searching for best possible match".format(self.actual_version)) + else: + msg = "Could not determine actual version installed. Try reinstalling packages again." + raise Fail(msg) +@@ -309,13 +309,13 @@ + :return: + """ + Logger.info("Installation of packages failed. Checking if installation was partially complete") +- Logger.info("Old versions: {0}".format(self.old_versions)) ++ Logger.info("Old versions: {}".format(self.old_versions)) + + new_versions = get_stack_versions(self.stack_root_folder) +- Logger.info("New versions: {0}".format(new_versions)) ++ Logger.info("New versions: {}".format(new_versions)) + + deltas = set(new_versions) - set(self.old_versions) +- Logger.info("Deltas: {0}".format(deltas)) ++ Logger.info("Deltas: {}".format(deltas)) + + # Get version without build number + normalized_repo_version = self.repository_version.split('-')[0] +@@ -324,7 +324,7 @@ + # Some packages were installed successfully. Log this version to REPO_VERSION_HISTORY_FILE + partial_install_version = next(iter(deltas)).strip() + write_actual_version_to_history_file(normalized_repo_version, partial_install_version) +- Logger.info("Version {0} was partially installed. ".format(partial_install_version)) ++ Logger.info("Version {} was partially installed. ".format(partial_install_version)) + + def find_best_fit_version(self, versions, repo_version): + """ +@@ -340,22 +340,22 @@ + if versions is None or repo_version is None: + return None + +- build_num_match = re.search("[\d\.]+-\d+", repo_version) ++ build_num_match = re.search(r"[\d\.]+-\d+", repo_version) + if build_num_match and repo_version in versions: + # If repo version has build number and is found in the list of versions, return it as the matching version +- Logger.info("Best Fit Version: Resolved from repo version with valid build number: {0}".format(repo_version)) ++ Logger.info("Best Fit Version: Resolved from repo version with valid build number: {}".format(repo_version)) + return repo_version + + # Get version without build number + 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: + # Resolved without conflicts +- Logger.info("Best Fit Version: Resolved from normalized repo version without conflicts: {0}".format(match_versions[0])) ++ Logger.info("Best Fit Version: Resolved from normalized repo version without conflicts: {}".format(match_versions[0])) + return match_versions[0] + + # Resolve conflicts using REPO_VERSION_HISTORY_FILE +@@ -363,7 +363,7 @@ + + # Validate history version retrieved is valid + if history_version in match_versions: +- Logger.info("Best Fit Version: Resolved from normalized repo version using {0}: {1}".format(REPO_VERSION_HISTORY_FILE, history_version)) ++ Logger.info("Best Fit Version: Resolved from normalized repo version using {}: {}".format(REPO_VERSION_HISTORY_FILE, history_version)) + return history_version + + # No matching version +@@ -432,7 +432,7 @@ + self.repo_mgr.upgrade_package(name, installation_context) + except Exception as err: + ret_code = 1 +- Logger.logger.error("Package Manager failed to install packages: {0}".format(str(err))) ++ Logger.logger.error("Package Manager failed to install packages: {}".format(str(err))) + + # Remove already installed packages in case of fail + if packages_were_checked and packages_installed_before: +@@ -466,11 +466,11 @@ + self.check_partial_install() + except Fail as err: + ret_code = 1 +- Logger.logger.exception("Failure while computing actual version. Error: {0}".format(str(err))) ++ Logger.logger.exception("Failure while computing actual version. Error: {}".format(str(err))) + return ret_code + + def abort_handler(self, signum, frame): +- Logger.error("Caught signal {0}, will handle it gracefully. Compute the actual version if possible before exiting.".format(signum)) ++ Logger.error("Caught signal {}, will handle it gracefully. Compute the actual version if possible before exiting.".format(signum)) + self.check_partial_install() + + def filter_package_list(self, package_list): +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/custom_actions/scripts/remove_bits.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/custom_actions/scripts/remove_bits.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/custom_actions/scripts/remove_bits.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/custom_actions/scripts/remove_bits.py 2022-07-11 00:52:36.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + """ + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file +@@ -45,10 +45,10 @@ + + packages_to_remove = ["zookeeper", "hadoop", "hadoop-lzo", "hadoop-hdfs", "hadoop-libhdfs", "hadoop-yarn", "hadoop-client", "hadoop-mapreduce", "hive", "hive-hcatalog", "hive-jdbc", "hive-webhcat", "hcatalog", "webhcat-tar-hive", "webhcat-tar-pig", "oozie", "oozie-client", "pig", "sqoop", "tez" "falcon", "storm", "flume", "hbase", "phoenix"] + packages_to_remove.reverse() +- Logger.info("Packages to remove: {0}".format(" ".join(packages_to_remove))) ++ Logger.info("Packages to remove: {}".format(" ".join(packages_to_remove))) + + for name in packages_to_remove: +- Logger.info("Attempting to remove {0}".format(name)) ++ Logger.info("Attempting to remove {}".format(name)) + Package(name, action="remove") + + if __name__ == "__main__": +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/custom_actions/scripts/remove_previous_stacks.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/custom_actions/scripts/remove_previous_stacks.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/custom_actions/scripts/remove_previous_stacks.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/custom_actions/scripts/remove_previous_stacks.py 2022-07-11 00:52:36.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + """ + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file +@@ -56,19 +56,19 @@ + Package(package, action="remove") + self.remove_stack_folder(structured_output, version) + structured_output["remove_previous_stacks"] = {"exit_code": 0, +- "message": format("Stack version {0} successfully removed!".format(version))} ++ "message": format("Stack version {} successfully removed!".format(version))} + self.put_structured_out(structured_output) + + def remove_stack_folder(self, structured_output, version): + if version and version != '' and stack_root and stack_root != '': + +- Logger.info("Removing {0}/{1}".format(stack_root, version)) ++ Logger.info("Removing {}/{}".format(stack_root, version)) + try: + Execute(('rm', '-f', stack_root + version), + sudo=True) + finally: + structured_output["remove_previous_stacks"] = {"exit_code": -1, +- "message": "Failed to remove version {0}{1}".format(stack_root, version)} ++ "message": "Failed to remove version {}{}".format(stack_root, version)} + self.put_structured_out(structured_output) + + def get_packages_to_remove(self, version): +@@ -88,14 +88,14 @@ + for file in files: + if version in os.path.realpath(stack_root_current + file): + structured_output["remove_previous_stacks"] = {"exit_code": -1, +- "message": "{0} contains symlink to version for remove! {1}".format( ++ "message": "{} contains symlink to version for remove! {}".format( + stack_root_current, version)} + self.put_structured_out(structured_output) +- raise Fail("{0} contains symlink to version for remove! {1}".format(stack_root_current, version)) ++ raise Fail("{} contains symlink to version for remove! {}".format(stack_root_current, version)) + + def get_lower_versions(self, current_version): + versions = get_stack_versions(stack_root) +- Logger.info("available versions: {0}".format(str(versions))) ++ Logger.info("available versions: {}".format(str(versions))) + + lover_versions = [] + for version in versions: +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/custom_actions/scripts/ru_execute_tasks.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/custom_actions/scripts/ru_execute_tasks.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/custom_actions/scripts/ru_execute_tasks.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/custom_actions/scripts/ru_execute_tasks.py 2022-07-11 00:52:36.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + if self.type: + inner.append("Type: %s" % str(self.type)) + if self.script and self.function: +- inner.append("Script: %s - Function: %s" % (str(self.script), str(self.function))) ++ inner.append("Script: {} - Function: {}".format(str(self.script), str(self.function))) + elif self.command: + inner.append("Command: %s" % str(self.command)) + return "Task. %s" % ", ".join(inner) +@@ -79,7 +79,7 @@ + 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) + +@@ -157,7 +157,7 @@ + + task.command = "source /var/lib/ambari-agent/ambari-env.sh ; " + " ".join(command_params) + # Replace redundant whitespace to make the unit tests easier to validate +- task.command = re.sub("\s+", " ", task.command).strip() ++ task.command = re.sub(r"\s+", " ", task.command).strip() + + if task.command: + task.command = replace_variables(task.command, host_name, version) +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/custom_actions/scripts/stack_select_set_all.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/custom_actions/scripts/stack_select_set_all.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/custom_actions/scripts/stack_select_set_all.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/custom_actions/scripts/stack_select_set_all.py 2022-07-11 00:52:36.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + """ + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file +@@ -72,7 +72,7 @@ + cmd = ('ambari-python-wrap', stack_selector_path, 'set', 'all', summary.associated_version) + code, out = shell.call(cmd, sudo=True) + if code != 0: +- raise Exception("Command '{0}' exit code is nonzero".format(cmd)) ++ raise Exception("Command '{}' exit code is nonzero".format(cmd)) + + + def is_host_skippable(stack_selector_path, associated_version): +@@ -83,7 +83,7 @@ + :return: True if this host should be skipped, False otherwise. + """ + if not os.path.exists(stack_selector_path): +- Logger.info("{0} does not have any stack components installed and will not invoke {1}".format( ++ Logger.info("{} does not have any stack components installed and will not invoke {}".format( + socket.gethostname(), stack_selector_path)) + + return True +@@ -93,20 +93,20 @@ + code, out = shell.call(cmd, sudo=True) + + if code != 0: +- Logger.info("{0} is unable to determine which stack versions are available using {1}".format( ++ Logger.info("{} is unable to determine which stack versions are available using {}".format( + socket.gethostname(), stack_selector_path)) + + return True + + # check to see if the output is empty, indicating no versions installed + if not out.strip(): +- Logger.info("{0} has no stack versions installed".format(socket.gethostname())) ++ Logger.info("{} has no stack versions installed".format(socket.gethostname())) + return True + + # some pre-prepped systems may have a version, so there may be a version, so + # add the extra check if it is available + if not associated_version in out: +- Logger.info("{0} is not found in the list of versions {1}".format(associated_version, out)) ++ Logger.info("{} is not found in the list of versions {}".format(associated_version, out)) + return True + + return False +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/custom_actions/scripts/update_repo.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/custom_actions/scripts/update_repo.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/custom_actions/scripts/update_repo.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/custom_actions/scripts/update_repo.py 2022-07-11 00:52:36.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + ) + 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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/custom_actions/scripts/validate_configs.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/custom_actions/scripts/validate_configs.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/custom_actions/scripts/validate_configs.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/custom_actions/scripts/validate_configs.py 2022-07-11 00:52:36.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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,14 +363,14 @@ + 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!') + + def check_directories(self, params): + validation_failed = False + properties_to_check = self.flatten_dict(PROPERTIES_TO_CHECK) +- for property, value in params.items(): ++ for property, value in list(params.items()): + if property in properties_to_check: + if self.dir_exists_or_not_empty_or_cant_be_created(self.get_value(property, params)): + validation_failed = True +@@ -378,7 +378,7 @@ + + def check_users(self, params): + validation_passed = True +- for user, group in self.dict_to_list(USERS_TO_GROUP_MAPPING).items(): ++ for user, group in list(self.dict_to_list(USERS_TO_GROUP_MAPPING).items()): + if user in params and group in params: + username = self.get_value(user, params) + groupname = self.get_value(group, params) +@@ -393,7 +393,7 @@ + + def flatten_dict(self, dic, prefix=CONFIG_PARAM_PREFIX, separator=CONFIG_PARAM_SEPARATOR): + result = [] +- for key, val in dic.items(): ++ for key, val in list(dic.items()): + sum_key = prefix + separator + key + if isinstance(val, dict): + result += self.flatten_dict(val, sum_key, separator) +@@ -422,7 +422,7 @@ + + def dict_to_list(self, dic, prefix=CONFIG_PARAM_PREFIX, separator=CONFIG_PARAM_SEPARATOR): + result = {} +- for key, val in dic.items(): ++ for key, val in list(dic.items()): + sum_key = prefix + separator + key + if isinstance(val, dict): + result.update(self.dict_to_list(val, sum_key, separator)) +@@ -443,7 +443,7 @@ + + result = params[key] + +- pattern = re.compile("\$\{[^\}\$\x0020]+\}") ++ pattern = re.compile("\\$\\{[^\\}\\$\x0020]+\\}") + + for depth in range(0, MAX_SUBST - 1): + match = pattern.search(result) +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/db/newcerts/.gitignore apache-ambari-2.7.6-change/ambari-server/src/main/resources/db/newcerts/.gitignore +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/db/newcerts/.gitignore 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/db/newcerts/.gitignore 1970-01-01 08:00:00.000000000 +0800 +@@ -1,4 +0,0 @@ +-# Ignore everything in this directory +-* +-# Except this file +-!.gitignore +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/.gitignore apache-ambari-2.7.6-change/ambari-server/src/main/resources/.gitignore +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/.gitignore 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/.gitignore 1970-01-01 08:00:00.000000000 +0800 +@@ -1 +0,0 @@ +-Ambari-DDL-AzureDB-CREATE.sql +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/host_scripts/alert_disk_space.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/host_scripts/alert_disk_space.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/host_scripts/alert_disk_space.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/host_scripts/alert_disk_space.py 2022-07-11 00:52:32.000000000 +0800 +@@ -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 @@ + 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 @@ + # 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]) +@@ -109,7 +109,7 @@ + elif percent > warning_percent: + result_code = 'WARNING' + +- label = 'Capacity Used: [{0:.2f}%, {1}], Capacity Total: [{2}]'.format( ++ label = 'Capacity Used: [{:.2f}%, {}], Capacity Total: [{}]'.format( + percent, _get_formatted_size(disk_usage.used), + _get_formatted_size(disk_usage.total)) + +@@ -120,7 +120,7 @@ + # Check absolute disk space value + if disk_usage.free < min_free_space: + result_code = 'WARNING' +- label += '. Total free space is less than {0}'.format(_get_formatted_size(min_free_space)) ++ label += '. Total free space is less than {}'.format(_get_formatted_size(min_free_space)) + + return result_code, label + +@@ -139,7 +139,7 @@ + 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 + +@@ -160,7 +160,7 @@ + total = disk_stats.f_blocks * disk_stats.f_frsize + used = (disk_stats.f_blocks - disk_stats.f_bfree) * disk_stats.f_frsize + else: +- raise NotImplementedError("{0} is not a supported platform for this alert".format(platform.platform())) ++ raise NotImplementedError("{} is not a supported platform for this alert".format(platform.platform())) + + return DiskInfo(total=total, used=used, free=free, path=path) + +@@ -212,4 +212,4 @@ + return '%.1f' % (bytes / 1000000000000.0) + ' TB' + + if __name__ == '__main__': +- print _get_disk_usage(os.getcwd()) ++ print((_get_disk_usage(os.getcwd()))) +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/host_scripts/alert_ulimit.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/host_scripts/alert_ulimit.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/host_scripts/alert_ulimit.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/host_scripts/alert_ulimit.py 2022-07-11 00:52:32.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + """ + Licensed to the Apache Software Foundation (ASF) under one +@@ -70,13 +70,13 @@ + return 'CRITICAL', ['Unable to determine ulimit for open files (-n)'] + + return_code = "OK" +- label = "Ulimit for open files (-n) is {0}".format(soft_ulimit) ++ label = "Ulimit for open files (-n) is {}".format(soft_ulimit) + + if soft_ulimit >= critical_count: +- label = "Ulimit for open files (-n) is {0} which is higher or equal than critical value of {1}".format(soft_ulimit, critical_count) ++ label = "Ulimit for open files (-n) is {} which is higher or equal than critical value of {}".format(soft_ulimit, critical_count) + return_code = 'CRITICAL' + elif soft_ulimit >= warning_count: +- label = "Ulimit for open files (-n) is {0} which is higher or equal than warning value of {1}".format(soft_ulimit, warning_count) ++ label = "Ulimit for open files (-n) is {} which is higher or equal than warning value of {}".format(soft_ulimit, warning_count) + return_code = 'WARNING' + + return return_code, label +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/host_scripts/alert_version_select.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/host_scripts/alert_version_select.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/host_scripts/alert_version_select.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/host_scripts/alert_version_select.py 2022-07-11 00:52:32.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + """ + Licensed to the Apache Software Foundation (ASF) under one +@@ -64,7 +64,7 @@ + + # Check required properties + if STACK_TOOLS not in configurations: +- return (RESULT_STATE_UNKNOWN, ['{0} is a required parameter for the script'.format(STACK_TOOLS)]) ++ return (RESULT_STATE_UNKNOWN, ['{} is a required parameter for the script'.format(STACK_TOOLS)]) + + stack_name = Script.get_stack_name() + +@@ -73,7 +73,7 @@ + stack_tools_str = configurations[STACK_TOOLS] + + if stack_tools_str is None: +- return (RESULT_STATE_UNKNOWN, ['{0} is a required parameter for the script and the value is null'.format(STACK_TOOLS)]) ++ return (RESULT_STATE_UNKNOWN, ['{} is a required parameter for the script and the value is null'.format(STACK_TOOLS)]) + + distro_select = "unknown-distro-select" + try: +@@ -91,18 +91,18 @@ + (code, out, versions) = unsafe_get_stack_versions() + + if code == 0: +- msg.append("{0} ".format(distro_select)) ++ msg.append("{} ".format(distro_select)) + if versions is not None and type(versions) is list and len(versions) > 0: +- msg.append("reported the following versions: {0}".format(", ".join(versions))) ++ msg.append("reported the following versions: {}".format(", ".join(versions))) + return (RESULT_STATE_OK, ["\n".join(msg)]) + else: +- msg.append("{0} could not properly read {1}. Check this directory for unexpected contents.".format(distro_select, stack_root_dir)) ++ msg.append("{} could not properly read {}. Check this directory for unexpected contents.".format(distro_select, stack_root_dir)) + if out is not None: + msg.append(out) + + return (RESULT_STATE_CRITICAL, ["\n".join(msg)]) + else: +- msg.append("No stack root {0} to check.".format(stack_root_dir)) ++ msg.append("No stack root {} 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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/scripts/add_service_api.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/scripts/add_service_api.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/scripts/add_service_api.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/scripts/add_service_api.py 2022-07-11 00:52:32.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +@@ -72,14 +72,14 @@ + + # assign components to hosts + for x in COMPONENTS_TO_HOSTS: +- for component, host in x.iteritems(): ++ for component, host in list(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)) + + # update and create all the service-specific configurations + checked_call('curl -H \'X-Requested-By:anything\'-X GET -u admin:admin {server_url}/api/v1/stacks2/HDP/versions/{stack_version}/stackServices/{service_name}/configurations?fields=* > /tmp/config.json'. + format(server_url=SERVER_URL, stack_version=STACK_VERSION, service_name=SERVICE_NAME)) +- with open('/tmp/config.json', "r") as f: ++ with open('/tmp/config.json') as f: + d = json.load(f) + + configs = {} +@@ -90,29 +90,29 @@ + 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 list(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: ++ with open('/tmp/current_site.json') as f: + fcontent = f.read() + d = json.loads("{"+fcontent+"}") + +- for k,v in site_content.iteritems(): ++ for k,v in list(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 list(CONFIGS_TO_CHANGE.items()): ++ for config_name, config_value in list(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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/scripts/Ambaripreupload.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/scripts/Ambaripreupload.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/scripts/Ambaripreupload.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/scripts/Ambaripreupload.py 2022-07-11 00:52:32.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + tmpfile = tempfile.NamedTemporaryFile() + out = None + with open(tmpfile.name, 'r+') as file: +- get_stack_version_cmd = '/usr/bin/hdp-select status %s > %s' % ('hadoop-mapreduce-historyserver', tmpfile.name) ++ get_stack_version_cmd = '/usr/bin/hdp-select status {} > {}'.format('hadoop-mapreduce-historyserver', tmpfile.name) + code, stdoutdata = shell.call(get_stack_version_cmd) + out = file.read() + pass +@@ -213,7 +213,7 @@ + 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 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']) +@@ -314,8 +314,8 @@ + fp.write(file_content) + + 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) ++ params.HdfsResource(hdfs_path_prefix + '/user/oozie/share/lib/sqoop/{}'.format(sql_driver_filename), ++ owner='hdfs', type='file', action=['create_on_execute'], mode=0o644, source=options.sql_driver_path) + + def create_yarn_service_tarball(): + """ +@@ -342,13 +342,13 @@ + 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 @@ + ) + Directory('/tmp/hbase-hbase', + owner='hbase', +- mode=0775, ++ mode=0o775, + create_parents = True, + cd_access="a", + ) +@@ -396,7 +396,7 @@ + ) + + File(hashcode_file, +- mode = 0644, ++ mode = 0o644, + ) + + prepare_war(params) +@@ -461,13 +461,13 @@ + # 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 @@ + + # 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). +@@ -510,7 +510,7 @@ + Logger.info("Completed tarball copy.") + + if not options.upgrade: +- Logger.info("Executing stack-selector-tool for stack {0} ...".format(stack_version)) ++ Logger.info("Executing stack-selector-tool for stack {} ...".format(stack_version)) + Execute( + ('/usr/bin/hdp-select', 'set', 'all', stack_version), + sudo = True +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/scripts/check_ambari_permissions.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/scripts/check_ambari_permissions.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/scripts/check_ambari_permissions.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/scripts/check_ambari_permissions.py 2022-07-11 00:52:32.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +@@ -68,37 +68,37 @@ + + + def get_YN_input(prompt, default): +- yes = set(['yes', 'ye', 'y']) +- no = set(['no', 'n']) ++ yes = {'yes', 'ye', 'y'} ++ no = {'no', 'n'} + return get_choice_string_input(prompt, default, yes, no) + + + 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: + return False +- elif choice is "": # Just enter pressed ++ elif choice == "": # 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 @@ + 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,94 +135,94 @@ + 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): +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/scripts/cluster_blueprint.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/scripts/cluster_blueprint.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/scripts/cluster_blueprint.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/scripts/cluster_blueprint.py 2022-07-11 00:52:32.000000000 +0800 +@@ -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 +@@ -63,11 +63,11 @@ + elif is_pass: + input = getpass.getpass(prompt) + else: +- input = raw_input(prompt) ++ input = eval(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 @@ + 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 @@ + 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 +@@ -126,7 +126,7 @@ + uri = req.get_full_url() + user = USERNAME + pw = PASSWORD +- raw = "%s:%s" % (user, pw) ++ raw = "{}:{}".format(user, pw) + auth = 'Basic %s' % base64.b64encode(raw).strip() + req.add_unredirected_header('Authorization', auth) + return req +@@ -135,9 +135,9 @@ + + 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): +@@ -148,7 +148,7 @@ + isDefaultJson = True + pass + +- with open(blueprintLocation, "r") as file: ++ with open(blueprintLocation) as file: + blueprint = file.read() + + # Verify json data +@@ -186,7 +186,7 @@ + + # Read from file if available + if not hosts_json and hostsLocation: +- with open(hostsLocation, 'r') as file: ++ with open(hostsLocation) as file: + hosts_json = file.read() + # Verify json data + hostAssignments = json.loads(hosts_json) +@@ -226,7 +226,7 @@ + hostAssignments = '{{"blueprint":"{0}","host_groups":[{1}]}}' + hostGroupHosts = '{{"name":"{0}","hosts":[{1}]}}' + hosts = '{{"fqdn":"{0}"}},' +- logger.debug("Blueprint: {0}, Masters: {1}, Slaves: {2}".format(blueprintName, masters, slaves)) ++ logger.debug("Blueprint: {}, Masters: {}, Slaves: {}".format(blueprintName, masters, slaves)) + mastersUsed = 0 + slavesUsed = 0 + hostGroupsJson = '' +@@ -362,7 +362,7 @@ + + + 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 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/scripts/configs.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/scripts/configs.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/scripts/configs.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/scripts/configs.py 2022-07-11 00:52:32.000000000 +0800 +@@ -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 +@@ -79,9 +79,9 @@ + 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) ++ url = '{}://{}:{}{}'.format(protocol, host, port, api_url) ++ admin_auth = base64.encodestring('{}:{}'.format(login, password)).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) +@@ -91,13 +91,13 @@ + 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: +- raise Exception('Problem with accessing api. Reason: {0}'.format(exc)) ++ raise Exception('Problem with accessing api. Reason: {}'.format(exc)) + return response_body + return do_request + +@@ -107,7 +107,7 @@ + desired_tags = json.loads(response) + current_config_tag = desired_tags[CLUSTERS][DESIRED_CONFIGS][config_type][TAG] + except Exception as exc: +- raise Exception('"{0}" not found in server response. Response:\n{1}'.format(config_type, response)) ++ raise Exception('"{}" not found in server response. Response:\n{}'.format(config_type, response)) + return current_config_tag + + def create_new_desired_config(cluster, config_type, properties, attributes, accessor, version_note): +@@ -122,18 +122,18 @@ + } + } + } +- if len(attributes.keys()) > 0: ++ if len(list(attributes.keys())) > 0: + new_config[CLUSTERS][DESIRED_CONFIGS][ATTRIBUTES] = attributes + request_body = json.dumps(new_config) +- new_file = 'doSet_{0}.json'.format(new_tag) +- logger.info('### PUTting json into: {0}'.format(new_file)) ++ new_file = 'doSet_{}.json'.format(new_tag) ++ logger.info('### PUTting json into: {}'.format(new_file)) + output_to_file(new_file)(new_config) + accessor(CLUSTERS_URL.format(cluster), PUT_REQUEST_TYPE, request_body) +- logger.info('### NEW Site:{0}, Tag:{1}'.format(config_type, new_tag)) ++ logger.info('### NEW Site:{}, Tag:{}'.format(config_type, new_tag)) + + def get_current_config(cluster, config_type, accessor): + config_tag = get_config_tag(cluster, config_type, accessor) +- logger.info("### on (Site:{0}, Tag:{1})".format(config_type, config_tag)) ++ logger.info("### on (Site:{}, Tag:{})".format(config_type, config_tag)) + response = accessor(CONFIGURATION_URL.format(cluster, config_type, config_tag)) + config_by_tag = json.loads(response, object_pairs_hook=OrderedDict) + current_config = config_by_tag[ITEMS][0] +@@ -169,13 +169,13 @@ + if name != None: + name_text = name.text if name.text else "" + else: +- logger.warn("No name is found for one of the properties in {0}, ignoring it".format(path)) ++ logger.warn("No name is found for one of the properties in {}, ignoring it".format(path)) + continue + + if value != None: + value_text = value.text if value.text else "" + else: +- logger.warn("No value is found for \"{0}\" in {1}, using empty string for it".format(name_text, path)) ++ logger.warn("No value is found for \"{}\" in {}, using empty string for it".format(name_text, path)) + value_text = "" + + if final != None: +@@ -191,14 +191,14 @@ + with open(config_file) as in_file: + file_content = in_file.read() + except Exception as e: +- raise Exception('Cannot find file "{0}" to PUT'.format(config_file)) ++ raise Exception('Cannot find file "{}" to PUT'.format(config_file)) + try: + file_properties = json.loads(file_content) + except Exception as e: +- raise Exception('File "{0}" should be in the following JSON format ("properties_attributes" is optional):\n{1}'.format(config_file, FILE_FORMAT)) ++ raise Exception('File "{}" should be in the following JSON format ("properties_attributes" is optional):\n{}'.format(config_file, FILE_FORMAT)) + new_properties = file_properties.get(PROPERTIES, {}) + new_attributes = file_properties.get(ATTRIBUTES, {}) +- logger.info('### PUTting file: "{0}"'.format(config_file)) ++ logger.info('### PUTting file: "{}"'.format(config_file)) + return new_properties, new_attributes + return update + +@@ -206,7 +206,7 @@ + def update(cluster, config_type, accessor): + properties, attributes = get_current_config(cluster, config_type, accessor) + properties.pop(config_name, None) +- for attribute_values in attributes.values(): ++ for attribute_values in list(attributes.values()): + attribute_values.pop(config_name, None) + return properties, attributes + return update +@@ -218,12 +218,12 @@ + 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) + config = {PROPERTIES: properties} +- if len(attributes.keys()) > 0: ++ if len(list(attributes.keys())) > 0: + config[ATTRIBUTES] = attributes + output(config) + +@@ -238,14 +238,14 @@ + elif ext == ".json": + updater = update_from_file(config_file) + else: +- logger.error("File extension {0} is not supported".format(ext)) ++ logger.error("File extension {} is not supported".format(ext)) + return -1 +- logger.info('### from file {0}'.format(config_file)) ++ logger.info('### from file {}'.format(config_file)) + else: + config_name = args[0] + config_value = args[1] + updater = update_specific_property(config_name, config_value) +- logger.info('### new property - "{0}":"{1}"'.format(config_name, config_value)) ++ logger.info('### new property - "{}":"{}"'.format(config_name, config_value)) + update_config(cluster, config_type, updater, accessor, version_note) + return 0 + +@@ -256,7 +256,7 @@ + return -1 + + config_name = args[0] +- logger.info('### on property "{0}"'.format(config_name)) ++ logger.info('### on property "{}"'.format(config_name)) + update_config(cluster, config_type, delete_specific_property(config_name), accessor, version_note) + return 0 + +@@ -266,7 +266,7 @@ + if len(args) > 0: + filename = args[0] + output = output_to_file(filename) +- logger.info('### to file "{0}"'.format(filename)) ++ logger.info('### to file "{}"'.format(filename)) + else: + output = output_to_console + get_config(cluster, config_type, accessor, output) +@@ -316,18 +316,18 @@ + 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] + else: +- logger.error("Incorrect content of {0} file. File should contain Ambari username and password separated by new line.".format(options.credentials_file)) ++ logger.error("Incorrect content of {} file. File should contain Ambari username and password separated by new line.".format(options.credentials_file)) + return -1 + except Exception as e: +- logger.error("You don't have permissions to {0} file".format(options.credentials_file)) ++ logger.error("You don't have permissions to {} file".format(options.credentials_file)) + return -1 + else: +- logger.error("File {0} doesn't exist or you don't have permissions.".format(options.credentials_file)) ++ logger.error("File {} doesn't exist or you don't have permissions.".format(options.credentials_file)) + return -1 + else: + user = options.user +@@ -371,7 +371,7 @@ + action_args = [options.key] + return delete_properties(cluster, config_type, action_args, accessor, version_note) + else: +- logger.error('Action "{0}" is not supported. Supported actions: "get", "set", "delete".'.format(action)) ++ logger.error('Action "{}" is not supported. Supported actions: "get", "set", "delete".'.format(action)) + return -1 + + if __name__ == "__main__": +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/scripts/export_ams_metrics.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/scripts/export_ams_metrics.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/scripts/export_ams_metrics.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/scripts/export_ams_metrics.py 2022-07-11 00:52:32.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 +@@ -60,11 +60,11 @@ + @staticmethod + def get_collector_uri(metricNames, hostname=None): + if hostname: +- return 'http://{0}:{1}/ws/v1/timeline/metrics?metricNames={2}&hostname={3}&appId={4}&startTime={5}&endTime={6}&precision={7}' \ ++ return 'http://{}:{}/ws/v1/timeline/metrics?metricNames={}&hostname={}&appId={}&startTime={}&endTime={}&precision={}' \ + .format(Params.AMS_HOSTNAME, Params.AMS_PORT, metricNames, hostname, Params.AMS_APP_ID, + Params.START_TIME, Params.END_TIME, Params.PRECISION) + else: +- return 'http://{0}:{1}/ws/v1/timeline/metrics?metricNames={2}&appId={3}&startTime={4}&endTime={5}&precision={6}' \ ++ return 'http://{}:{}/ws/v1/timeline/metrics?metricNames={}&appId={}&startTime={}&endTime={}&precision={}' \ + .format(Params.AMS_HOSTNAME, Params.AMS_PORT, metricNames, Params.AMS_APP_ID, Params.START_TIME, + Params.END_TIME, Params.PRECISION) + +@@ -94,10 +94,10 @@ + + @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)) +@@ -146,7 +146,7 @@ + Params.END_TIME = json['END_TIME'] + Params.AGGREGATE = json['AGGREGATE'] + else: +- logger.warn('Not found config file in {0}'.format(os.path.join(Params.INPUT_DIR), "configs")) ++ logger.warn('Not found config file in {}'.format(os.path.join(Params.INPUT_DIR), "configs")) + logger.info('Aborting...') + sys.exit(1) + +@@ -185,7 +185,7 @@ + app_metrics_metadata.append({"metricname": metric, "seriesStartTime": Params.START_TIME, "supportsAggregation": "false", "type": "UNDEFINED"}) + else: + app_metrics_metadata.append({"metricname": metric, "seriesStartTime": Params.START_TIME, "supportsAggregation": "false"}) +- logger.debug("Adding {0} to metadata".format(metric)) ++ logger.debug("Adding {} to metadata".format(metric)) + + return {Params.AMS_APP_ID : app_metrics_metadata} + +@@ -236,14 +236,14 @@ + logger.error('Metrics file is required.') + sys.exit(1) + logger.info('Reading metrics file.') +- with open(Params.METRICS_FILE, 'r') as file: ++ with open(Params.METRICS_FILE) as file: + for line in file: + Params.METRICS.append(line.strip()) + logger.info('Reading hosts file.') + + logger.info('Reading hosts file.') + if Params.HOSTS_FILE and os.path.exists(Params.HOSTS_FILE): +- with open(Params.HOSTS_FILE, 'r') as file: ++ with open(Params.HOSTS_FILE) as file: + for line in file: + Params.HOSTS.append(line.strip()) + else: +@@ -374,9 +374,9 @@ + 'You can use it to visualize information exported by the AMS thin client') + + d = datetime.datetime.now() +- time_suffix = '{0}-{1}-{2}-{3}-{4}-{5}'.format(d.year, d.month, d.day, ++ time_suffix = '{}-{}-{}-{}-{}-{}'.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') + +@@ -480,7 +480,7 @@ + FlaskServer(ams_metrics_processor) + + else: +- logger.warn('Action \'{0}\' not supported. Please use action \'export\' for exporting AMS metrics ' ++ logger.warn('Action \'{}\' not supported. Please use action \'export\' for exporting AMS metrics ' + 'or use action \'run\' for starting REST server'.format(Params.ACTION)) + logger.info('Aborting...') + sys.exit(1) +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/scripts/stack_advisor.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/scripts/stack_advisor.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/scripts/stack_advisor.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/scripts/stack_advisor.py 2022-07-11 00:52:32.000000000 +0800 +@@ -38,7 +38,7 @@ + RECOMMEND_CONFIGURATIONS_FOR_KERBEROS, + RECOMMEND_CONFIGURATION_DEPENDENCIES, + VALIDATE_CONFIGURATIONS] +-USAGE = "Usage: \nPossible actions are: {0}\n".format( str(ALL_ACTIONS) ) ++USAGE = "Usage: \nPossible actions are: {}\n".format( str(ALL_ACTIONS) ) + + SCRIPT_DIRECTORY = os.path.dirname(os.path.abspath(__file__)) + STACKS_DIRECTORY = os.path.join(SCRIPT_DIRECTORY, '../stacks') +@@ -62,11 +62,11 @@ + + def loadJson(path): + try: +- with open(path, 'r') as f: ++ with open(path) as f: + return json.load(f) + except Exception as err: + traceback.print_exc() +- raise StackAdvisorException("Error loading file at: {0}".format(path)) ++ raise StackAdvisorException("Error loading file at: {}".format(path)) + + + def dumpJson(json_object, dump_file): +@@ -75,7 +75,7 @@ + json.dump(json_object, out, indent=1) + except Exception as err: + traceback.print_exc() +- raise StackAdvisorException("Error writing to file {0} : {1}".format(dump_file, str(err))) ++ raise StackAdvisorException("Error writing to file {} : {}".format(dump_file, str(err))) + + + def main(argv=None): +@@ -170,18 +170,18 @@ + with open(path, 'rb') 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) +- except IOError: # file not found ++ print(("StackAdvisor implementation for stack {}, version {} was loaded".format(stackName, version))) ++ except OSError: # 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 {}, version {} 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 @@ + 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: {}".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: {}".format(str(e)))) + sys.exit(2) + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/scripts/takeover_config_merge.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/scripts/takeover_config_merge.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/scripts/takeover_config_merge.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/scripts/takeover_config_merge.py 2022-07-11 00:52:32.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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') +@@ -69,7 +69,7 @@ + + class ShParser(Parser): + def read_data_to_map(self, path): +- with open(path, 'r') as file: ++ with open(path) as file: + file_content = file.read() + return {"content" : file_content}, None + +@@ -82,13 +82,13 @@ + sys.exit(1) + + configurations = {} +- with open(path, 'r') as file: ++ with open(path) as file: + try: +- for name, value in yaml.load(file).iteritems(): ++ for name, value in list(yaml.load(file).items()): + if name != None: + configurations[name] = str(value) + except: +- logger.error("Couldn't parse {0} file. Skipping ...".format(path)) ++ logger.error("Couldn't parse {} file. Skipping ...".format(path)) + return None, None + return configurations, None + +@@ -97,17 +97,17 @@ + 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 list(cp._sections[section].items()): + if name != None: + configurations[name] = value + del configurations['__name__'] +@@ -131,13 +131,13 @@ + if name != None: + name_text = name.text if name.text else "" + else: +- logger.warn("No name is found for one of the properties in {0}, ignoring it".format(path)) ++ logger.warn("No name is found for one of the properties in {}, ignoring it".format(path)) + continue + + if value != None: + value_text = value.text if value.text else "" + else: +- logger.warn("No value is found for \"{0}\" in {1}, using empty string for it".format(name_text, path)) ++ logger.warn("No value is found for \"{}\" in {}, using empty string for it".format(name_text, path)) + value_text = "" + + if final != None: +@@ -145,7 +145,7 @@ + properties_attributes[name_text] = final_text + + configurations[name_text] = value_text +- logger.debug("Following configurations found in {0}:\n{1}".format(path, configurations)) ++ logger.debug("Following configurations found in {}:\n{}".format(path, configurations)) + return configurations, properties_attributes + + class ConfigMerge: +@@ -185,12 +185,12 @@ + if ext in extensions: + file_path = os.path.join(dirName, file) + if ext in ConfigMerge.SUPPORTED_FILENAME_ENDINGS and not ConfigMerge.SUPPORTED_FILENAME_ENDINGS[ext] in root: +- logger.warn("File {0} is not configurable by Ambari. Skipping...".format(file_path)) ++ logger.warn("File {} is not configurable by Ambari. Skipping...".format(file_path)) + continue + 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 list(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 +@@ -199,9 +199,9 @@ + if not config_name: + if file in ConfigMerge.NOT_MAPPED_FILES: + if ConfigMerge.UNKNOWN_FILES_MAPPING_FILE: +- logger.error("File {0} doesn't match any regex from {1}".format(file_path, ConfigMerge.UNKNOWN_FILES_MAPPING_FILE)) ++ logger.error("File {} doesn't match any regex from {}".format(file_path, ConfigMerge.UNKNOWN_FILES_MAPPING_FILE)) + else: +- logger.error("Cannot map {0} to Ambari config type. Please use -u option to specify config mapping for this file. \n" ++ logger.error("Cannot map {} to Ambari config type. Please use -u option to specify config mapping for this file. \n" + "For more information use --help option for script".format(file_path)) + continue + else: +@@ -218,14 +218,14 @@ + 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 list(filepath_to_configurations.items()): ++ for configuration_name, value in list(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]: + property_name_to_value_to_filepaths[configuration_name][value] = [] + +- logger.debug("Iterating over '{0}' with value '{1}' in file '{2}'".format(configuration_name, value, path)) ++ logger.debug("Iterating over '{}' with value '{}' in file '{}'".format(configuration_name, value, path)) + property_name_to_value_to_filepaths[configuration_name][value].append(path) + merged_configurations[configuration_name] = value + +@@ -234,7 +234,7 @@ + @staticmethod + def format_for_blueprint(configurations, attributes): + all_configs = [] +- for configuration_type, configuration_properties in configurations.iteritems(): ++ for configuration_type, configuration_properties in list(configurations.items()): + is_content = False + all_configs.append({}) + +@@ -245,13 +245,13 @@ + + if is_content: + content = LICENSE +- for property_name, property_value in configuration_properties.iteritems(): ++ for property_name, property_value in list(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 list(attributes.items()): + if properties_attributes and configuration_type == configuration_type_attributes: + all_configs[-1][configuration_type].update({"properties_attributes" : {"final" : properties_attributes}}) + +@@ -264,18 +264,18 @@ + @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 list(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 list(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) ++ output += "\n\n=== {} | {} | {} |\nHas conflicts with:\n\n".format(property_name,filepaths[0], value) + continue + for filepath in filepaths: +- output += "| {0} | {1} | {2} |\n".format(property_name, filepath, value) ++ output += "| {} | {} | {} |\n".format(property_name, filepath, value) + + return output + +@@ -283,13 +283,13 @@ + 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 list(self.config_files_map.items()): + filepath_to_configurations = {} + filepath_to_property_attributes = {} + configuration_type = os.path.splitext(filename)[0] + for path_and_parser in paths_and_parsers: + path, parser = path_and_parser +- logger.debug("Read data from {0}".format(path)) ++ logger.debug("Read data from {}".format(path)) + parsed_configurations_from_path, parsed_properties_attributes = parser.read_data_to_map(path) + if parsed_configurations_from_path != None: + filepath_to_configurations[path] = parsed_configurations_from_path +@@ -311,7 +311,7 @@ + has_conflicts = True + conflict_filename = os.path.join(self.OUTPUT_DIR, configuration_type + "-conflicts.txt") + logger.warn( +- "You have configurations conflicts for {0}. Please check {1}".format(configuration_type, conflict_filename)) ++ "You have configurations conflicts for {}. Please check {}".format(configuration_type, conflict_filename)) + with open(conflict_filename, "w") as fp: + fp.write(configuration_conflicts_output) + +@@ -319,7 +319,7 @@ + has_conflicts = True + conflict_filename = os.path.join(self.OUTPUT_DIR, configuration_type + "-attributes-conflicts.txt") + logger.warn( +- "You have property attribute conflicts for {0}. Please check {1}".format(configuration_type, conflict_filename)) ++ "You have property attribute conflicts for {}. Please check {}".format(configuration_type, conflict_filename)) + with open(conflict_filename, "w") as fp: + fp.write(attribute_conflicts_output) + +@@ -328,7 +328,7 @@ + + + result_json_file = os.path.join(self.OUTPUT_DIR, "blueprint.json") +- logger.info("Using '{0}' file as output for blueprint template".format(result_json_file)) ++ logger.info("Using '{}' file as output for blueprint template".format(result_json_file)) + + with open(result_json_file, 'w') as outfile: + outfile.write(json.dumps(ConfigMerge.format_for_blueprint(result_configurations, result_property_attributes), sort_keys=True, indent=4, +@@ -363,7 +363,7 @@ + if configuration_diff_output and configuration_diff_output != "": + conflict_filename = os.path.join(ConfigMerge.OUTPUT_DIR, "file-diff.txt") + logger.warn( +- "You have file diff conflicts. Please check {0}".format(conflict_filename)) ++ "You have file diff conflicts. Please check {}".format(conflict_filename)) + with open(conflict_filename, "w") as fp: + fp.write(configuration_diff_output) + +@@ -380,14 +380,14 @@ + + if configurations_conflicts: + output += "\n\n======= Property diff conflicts ====== " +- for config_name, property in configurations_conflicts.iteritems(): ++ for config_name, property in list(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 list(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 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 list(left_items.items()): ++ for right_key, right_value in list(right_items.items()): + if left_key == right_key: + matches.append(right_key) + if left_value != right_value: +@@ -437,17 +437,17 @@ + @staticmethod + def get_missing_attributes(attributes, matches, file_path): + conflicts = [] +- for key, value in attributes.iteritems(): ++ for key, value in list(attributes.items()): + if not key in matches: +- conflicts.append({key : "Final attribute is missing in {0} file".format(file_path)}) ++ conflicts.append({key : "Final attribute is missing in {} file".format(file_path)}) + return conflicts + + @staticmethod + def get_missing_properties(configurations, matches, file_path): + conflicts = [] +- for key, value in configurations.iteritems(): ++ for key, value in list(configurations.items()): + if not key in matches: +- conflicts.append({key : "Property is missing in {0} file".format(file_path)}) ++ conflicts.append({key : "Property is missing in {} file".format(file_path)}) + return conflicts + + @staticmethod +@@ -455,7 +455,7 @@ + conflicts = [] + for file_name in config_file_paths: + if file_name not in matches: +- conflicts.append({file_name : "Configurations file is missing for {0} directory".format(input_dir)}) ++ conflicts.append({file_name : "Configurations file is missing for {} directory".format(input_dir)}) + return conflicts + + def main(): +@@ -525,13 +525,13 @@ + with open(options.unknown_files_mapping_file) as f: + ConfigMerge.CONTENT_UNKNOWN_FILES_MAPPING_FILE = json.load(f) + else: +- logger.warning("Config mapping file was not found at {0}. " ++ logger.warning("Config mapping file was not found at {}. " + "Please provide it at the given path or provide a different path to it using -u option.".format(options.unknown_files_mapping_file)) + if options.action == "merge" : + ConfigMerge.INPUT_DIR = options.inputDir + file_paths = ConfigMerge.get_all_supported_files_grouped_by_name(directory=ConfigMerge.INPUT_DIR) +- logger.info("Writing logs into '{0}' file".format(logegr_file_name)) +- logger.debug("Following configuration files found:\n{0}".format(file_paths.items())) ++ logger.info("Writing logs into '{}' file".format(logegr_file_name)) ++ logger.debug("Following configuration files found:\n{}".format(list(file_paths.items()))) + config_merge = ConfigMerge(config_files_map=file_paths) + return config_merge.perform_merge() + +@@ -539,26 +539,26 @@ + if options.leftInputDir and os.path.isdir(options.leftInputDir): + ConfigMerge.LEFT_INPUT_DIR = options.leftInputDir + else: +- logger.error("Directory \"{0}\" doesn't exist. Use option \"-h\" for details".format(options.leftInputDir)) ++ logger.error("Directory \"{}\" doesn't exist. Use option \"-h\" for details".format(options.leftInputDir)) + return -1 + + if options.rightInputDir and os.path.isdir(options.rightInputDir): + ConfigMerge.RIGHT_INPUT_DIR = options.rightInputDir + else: +- logger.error("Directory \"{0}\" doesn't exist. Use option \"-h\" for details".format(options.rightInputDir)) ++ logger.error("Directory \"{}\" doesn't exist. Use option \"-h\" for details".format(options.rightInputDir)) + return -1 + +- logger.info("Writing logs into '{0}' file".format(logegr_file_name)) ++ logger.info("Writing logs into '{}' file".format(logegr_file_name)) + + left_file_paths = ConfigMerge.get_all_supported_files_grouped_by_name(directory=ConfigMerge.LEFT_INPUT_DIR) +- logger.debug("Following configuration files found:\n{0} for left directory".format(left_file_paths.items())) ++ logger.debug("Following configuration files found:\n{} for left directory".format(list(left_file_paths.items()))) + right_file_paths = ConfigMerge.get_all_supported_files_grouped_by_name(directory=ConfigMerge.RIGHT_INPUT_DIR) +- logger.debug("Following configuration files found:\n{0} for right directory".format(right_file_paths.items())) ++ logger.debug("Following configuration files found:\n{} for right directory".format(list(right_file_paths.items()))) + config_merge = ConfigMerge(left_file_paths=left_file_paths , right_file_paths=right_file_paths) + return config_merge.perform_diff() + + else: +- logger.error("Action \"{0}\" doesn't supports by script. Use option \"-h\" for details".format(options.action)) ++ logger.error("Action \"{}\" doesn't supports by script. Use option \"-h\" for details".format(options.action)) + return -1 + + if __name__ == "__main__": +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stack-hooks/after-INSTALL/scripts/shared_initialization.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stack-hooks/after-INSTALL/scripts/shared_initialization.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stack-hooks/after-INSTALL/scripts/shared_initialization.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stack-hooks/after-INSTALL/scripts/shared_initialization.py 2022-07-11 00:52:36.000000000 +0800 +@@ -57,7 +57,7 @@ + json_version = load_version(struct_out_file) + + if not json_version: +- Logger.info("There is no advertised version for this component stored in {0}".format(struct_out_file)) ++ Logger.info("There is no advertised version for this component stored in {}".format(struct_out_file)) + return + + # On parallel command execution this should be executed by a single process at a time. +@@ -69,7 +69,7 @@ + def setup_config(): + import params + stackversion = params.stack_version_unformatted +- Logger.info("FS Type: {0}".format(params.dfs_type)) ++ Logger.info("FS Type: {}".format(params.dfs_type)) + + is_hadoop_conf_dir_present = False + if hasattr(params, "hadoop_conf_dir") and params.hadoop_conf_dir is not None and os.path.exists(params.hadoop_conf_dir): +@@ -97,7 +97,7 @@ + ) + + Directory(params.logsearch_logfeeder_conf, +- mode=0755, ++ mode=0o755, + cd_access='a', + create_parents=True + ) +@@ -115,11 +115,11 @@ + Load version from file. Made a separate method for testing + """ + try: +- with open(struct_out_file, 'r') as fp: ++ with open(struct_out_file) as fp: + json_info = json.load(fp) + + return json_info['version'] +- except (IOError, KeyError, TypeError): ++ except (OSError, KeyError, TypeError): + return None + + +@@ -132,13 +132,13 @@ + json_version = load_version(struct_out_file) + + if not json_version: +- Logger.info("Could not load 'version' from {0}".format(struct_out_file)) ++ Logger.info("Could not load 'version' from {}".format(struct_out_file)) + return + + 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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stack-hooks/before-ANY/scripts/params.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stack-hooks/before-ANY/scripts/params.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stack-hooks/before-ANY/scripts/params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stack-hooks/before-ANY/scripts/params.py 2022-07-11 00:52:36.000000000 +0800 +@@ -221,7 +221,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(",") +@@ -240,7 +240,7 @@ + + # Calculate the namenode id of the other namenode. This is needed during RU to initiate an HA failover using ZKFC. + if namenode_id is not None and len(dfs_ha_namemodes_ids_list) == 2: +- other_namenode_id = list(set(dfs_ha_namemodes_ids_list) - set([namenode_id]))[0] ++ other_namenode_id = list(set(dfs_ha_namemodes_ids_list) - {namenode_id})[0] + + if found: + break +@@ -271,7 +271,7 @@ + #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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stack-hooks/before-ANY/scripts/shared_initialization.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stack-hooks/before-ANY/scripts/shared_initialization.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stack-hooks/before-ANY/scripts/shared_initialization.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stack-hooks/before-ANY/scripts/shared_initialization.py 2022-07-11 00:52:36.000000000 +0800 +@@ -63,7 +63,7 @@ + if params.has_hbase_masters: + Directory (params.hbase_tmp_dir, + owner = params.hbase_user, +- mode=0775, ++ mode=0o775, + create_parents = True, + cd_access="a", + ) +@@ -108,7 +108,7 @@ + + import params + +- parts = re.split('\s+', user_and_groups) ++ parts = re.split(r'\s+', user_and_groups) + if len(parts) == 1: + parts.append("") + +@@ -116,8 +116,8 @@ + 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 @@ + + 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 @@ + 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: +@@ -179,7 +179,7 @@ + def setup_hadoop_env(): + import params + stackversion = params.stack_version_unformatted +- Logger.info("FS Type: {0}".format(params.dfs_type)) ++ Logger.info("FS Type: {}".format(params.dfs_type)) + if params.has_hdfs or stackversion.find('Gluster') >= 0 or params.dfs_type == 'HCFS': + if params.security_enabled: + tc_owner = "root" +@@ -187,7 +187,7 @@ + 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): +@@ -200,7 +200,7 @@ + Directory(params.hadoop_java_io_tmpdir, + owner=params.hdfs_user, + group=params.user_group, +- mode=01777 ++ mode=0o1777 + ) + + def setup_java(): +@@ -237,7 +237,7 @@ + ) + + File(jdk_curl_target, +- mode = 0755, ++ mode = 0o755, + ) + + tmp_java_dir = tempfile.mkdtemp(prefix="jdk_tmp_", dir=params.tmp_dir) +@@ -264,7 +264,7 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stack-hooks/before-INSTALL/scripts/repo_initialization.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stack-hooks/before-INSTALL/scripts/repo_initialization.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stack-hooks/before-INSTALL/scripts/repo_initialization.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stack-hooks/before-INSTALL/scripts/repo_initialization.py 2022-07-11 00:52:35.000000000 +0800 +@@ -36,7 +36,7 @@ + if 0 == len(repo_dicts): + Logger.info("Repository list is empty. Ambari may not be managing the repositories.") + else: +- Logger.info("Initializing {0} repositories".format(str(len(repo_dicts)))) ++ Logger.info("Initializing {} repositories".format(str(len(repo_dicts)))) + + for repo in repo_dicts: + if not 'baseUrl' in repo: +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stack-hooks/before-START/files/topology_script.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stack-hooks/before-START/files/topology_script.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stack-hooks/before-START/files/topology_script.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stack-hooks/before-START/files/topology_script.py 2022-07-11 00:52:36.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 sys, os + from string import join +-import ConfigParser ++import configparser + + + DEFAULT_RACK = "/default-rack" +@@ -31,10 +31,10 @@ + 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): +@@ -60,7 +60,7 @@ + def execute(self, args): + rack_map = self.load_rack_map() + rack = self.get_racks(rack_map, args) +- print rack ++ print(rack) + + if __name__ == "__main__": + TopologyScript().execute(sys.argv) +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stack-hooks/before-START/scripts/custom_extensions.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stack-hooks/before-START/scripts/custom_extensions.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stack-hooks/before-START/scripts/custom_extensions.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stack-hooks/before-START/scripts/custom_extensions.py 2022-07-11 00:52:36.000000000 +0800 +@@ -49,7 +49,7 @@ + hadoop_custom_extensions_services = [ service.strip().upper() for service in hadoop_custom_extensions_services.split(",") ] + hadoop_custom_extensions_services.append("YARN") + +- hadoop_custom_extensions_local_dir = "{0}/current/ext/hadoop".format(Script.get_stack_root()) ++ hadoop_custom_extensions_local_dir = "{}/current/ext/hadoop".format(Script.get_stack_root()) + + if params.current_service in hadoop_custom_extensions_services: + clean_extensions(hadoop_custom_extensions_local_dir) +@@ -74,7 +74,7 @@ + hbase_custom_extensions_owner = default("/configurations/hbase-site/hbase.custom-extensions.owner", params.hdfs_user) + hbase_custom_extensions_hdfs_dir = get_config_formatted_value(default("/configurations/hbase-site/hbase.custom-extensions.root", + DEFAULT_HADOOP_HBASE_EXTENSION_DIR.format(params.major_stack_version))) +- hbase_custom_extensions_local_dir = "{0}/current/ext/hbase".format(Script.get_stack_root()) ++ hbase_custom_extensions_local_dir = "{}/current/ext/hbase".format(Script.get_stack_root()) + + impacted_components = ['HBASE_MASTER', 'HBASE_REGIONSERVER', 'PHOENIX_QUERY_SERVER']; + role = params.config.get('role','') +@@ -94,7 +94,7 @@ + hive_custom_extensions_owner = default("/configurations/hive-site/hive.custom-extensions.owner", params.hdfs_user) + hive_custom_extensions_hdfs_dir = DEFAULT_HADOOP_HIVE_EXTENSION_DIR.format(params.major_stack_version) + +- hive_custom_extensions_local_dir = "{0}/current/ext/hive".format(Script.get_stack_root()) ++ hive_custom_extensions_local_dir = "{}/current/ext/hive".format(Script.get_stack_root()) + + impacted_components = ['HIVE_SERVER', 'HIVE_CLIENT']; + role = params.config.get('role','') +@@ -121,7 +121,7 @@ + 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 @@ + 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 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stack-hooks/before-START/scripts/params.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stack-hooks/before-START/scripts/params.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stack-hooks/before-START/scripts/params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stack-hooks/before-START/scripts/params.py 2022-07-11 00:52:36.000000000 +0800 +@@ -90,7 +90,7 @@ + unlimited_key_jce_required = default("/componentLevelParams/unlimited_key_jce_required", False) + jdk_name = default("/ambariLevelParams/jdk_name", None) + java_home = default("/ambariLevelParams/java_home", None) +-java_exec = "{0}/bin/java".format(java_home) if java_home is not None else "/bin/java" ++java_exec = "{}/bin/java".format(java_home) if java_home is not None else "/bin/java" + + #users and groups + has_hadoop_env = 'hadoop-env' in config['configurations'] +@@ -296,7 +296,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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stack-hooks/before-START/scripts/rack_awareness.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stack-hooks/before-START/scripts/rack_awareness.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stack-hooks/before-START/scripts/rack_awareness.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stack-hooks/before-START/scripts/rack_awareness.py 2022-07-11 00:52:36.000000000 +0800 +@@ -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 @@ + 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 @@ + + 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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stack-hooks/before-START/scripts/shared_initialization.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stack-hooks/before-START/scripts/shared_initialization.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stack-hooks/before-START/scripts/shared_initialization.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stack-hooks/before-START/scripts/shared_initialization.py 2022-07-11 00:52:36.000000000 +0800 +@@ -41,7 +41,7 @@ + create_parents = True, + owner='root', + group=params.user_group, +- mode=0775, ++ mode=0o775, + cd_access='a', + ) + if params.has_namenode: +@@ -82,14 +82,14 @@ + 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 @@ + if params.has_hdfs or params.dfs_type == 'HCFS': + # 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") + elif params.dfs_type == 'HCFS' or not WebHDFSUtil.is_webhdfs_available(params.is_webhdfs_enabled, params.dfs_type): + # 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") + ) + if os.path.exists(params.hadoop_conf_dir): +@@ -134,7 +134,7 @@ + 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')): +@@ -163,7 +163,7 @@ + type="directory", + action="create_on_execute", + owner=params.hdfs_user, +- mode=0777 ++ mode=0o777 + ) + params.HdfsResource(params.smoke_hdfs_user_dir, + type="directory", +@@ -184,10 +184,10 @@ + 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))) ++ Logger.warning("Could not check the existence of {} on DFS while starting {}, exception: {}".format(directory, params.current_service, str(exception))) + + def setup_unlimited_key_jce_policy(): + """ +@@ -245,15 +245,15 @@ + jce_zip_source = format("{ambari_server_resources_url}/{custom_jce_name}") + java_security_dir = format("{custom_java_home}/jre/lib/security") + +- Logger.debug("Downloading the unlimited key JCE policy files from {0} to {1}.".format(jce_zip_source, jce_zip_target)) ++ Logger.debug("Downloading the unlimited key JCE policy files from {} to {}.".format(jce_zip_source, jce_zip_target)) + Directory(params.artifact_dir, create_parents=True) + File(jce_zip_target, content=DownloadSource(jce_zip_source)) + +- Logger.debug("Removing existing JCE policy JAR files: {0}.".format(java_security_dir)) ++ Logger.debug("Removing existing JCE policy JAR files: {}.".format(java_security_dir)) + File(format("{java_security_dir}/US_export_policy.jar"), action="delete") + File(format("{java_security_dir}/local_policy.jar"), action="delete") + +- Logger.debug("Unzipping the unlimited key JCE policy files from {0} into {1}.".format(jce_zip_target, java_security_dir)) ++ Logger.debug("Unzipping the unlimited key JCE policy files from {} into {}.".format(jce_zip_target, java_security_dir)) + extract_cmd = ("unzip", "-o", "-j", "-q", jce_zip_target, "-d", java_security_dir) + Execute(extract_cmd, + only_if=format("test -e {java_security_dir} && test -f {jce_zip_target}"), +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/ambari_configuration.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/ambari_configuration.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/ambari_configuration.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/ambari_configuration.py 2022-07-11 00:52:35.000000000 +0800 +@@ -37,7 +37,7 @@ + return None + + +-class AmbariConfiguration(object): ++class AmbariConfiguration: + """ + AmbariConfiguration is a class the encapsulates the Ambari server configuration data. + +@@ -108,7 +108,7 @@ + return AmbariSSODetails(self.get_ambari_sso_configuration()) + + +-class AmbariSSODetails(object): ++class AmbariSSODetails: + """ + AmbariSSODetails encapsulates the SSO configuration data specified in the ambari-server-configuration data + """ +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/hooks/before-ANY/scripts/shared_initialization.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/hooks/before-ANY/scripts/shared_initialization.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/hooks/before-ANY/scripts/shared_initialization.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/hooks/before-ANY/scripts/shared_initialization.py 2022-07-11 00:52:34.000000000 +0800 +@@ -88,7 +88,7 @@ + + File(format("{tmp_dir}/changeUid.sh"), + content=StaticFile("changeToSecureUid.sh"), +- mode=0555) ++ mode=0o555) + Execute(format("{tmp_dir}/changeUid.sh {user} {user_dirs} 2>/dev/null"), + not_if = format("test $(id -u {user}) -gt 1000")) + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/hooks/before-START/scripts/shared_initialization.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/hooks/before-START/scripts/shared_initialization.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/hooks/before-START/scripts/shared_initialization.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/hooks/before-START/scripts/shared_initialization.py 2022-07-11 00:52:34.000000000 +0800 +@@ -39,7 +39,7 @@ + create_parents = True, + owner='root', + group=params.user_group, +- mode=0775 ++ mode=0o775 + ) + Directory(params.hadoop_pid_dir_prefix, + create_parents = True, +@@ -71,14 +71,14 @@ + 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=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, + ) +@@ -123,7 +123,7 @@ + if params.has_namenode: + 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')): +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/FLUME/package/files/alert_flume_agent_status.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/FLUME/package/files/alert_flume_agent_status.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/FLUME/package/files/alert_flume_agent_status.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/FLUME/package/files/alert_flume_agent_status.py 2022-07-11 00:52:34.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + """ + Licensed to the Apache Software Foundation (ASF) under one +@@ -75,28 +75,28 @@ + alert_state = RESULT_CODE_OK + + if len(processes) == 0 and len(expected_agents) == 0: +- alert_label = 'No agents defined on {0}'.format(host_name) ++ alert_label = 'No agents defined on {}'.format(host_name) + else: + ok = [] + critical = [] + text_arr = [] + + for process in processes: +- if not process.has_key('status') or process['status'] == 'NOT_RUNNING': ++ if 'status' not in process or process['status'] == 'NOT_RUNNING': + critical.append(process['name']) + else: + ok.append(process['name']) + + if len(critical) > 0: +- text_arr.append("{0} {1} NOT running".format(", ".join(critical), ++ text_arr.append("{} {} NOT running".format(", ".join(critical), + "is" if len(critical) == 1 else "are")) + + if len(ok) > 0: +- text_arr.append("{0} {1} running".format(", ".join(ok), ++ text_arr.append("{} {} running".format(", ".join(ok), + "is" if len(ok) == 1 else "are")) + + plural = len(critical) > 1 or len(ok) > 1 +- alert_label = "Agent{0} {1} {2}".format( ++ alert_label = "Agent{} {} {}".format( + "s" if plural else "", + " and ".join(text_arr), + "on " + host_name) +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/FLUME/package/scripts/flume_handler.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/FLUME/package/scripts/flume_handler.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/FLUME/package/scripts/flume_handler.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/FLUME/package/scripts/flume_handler.py 2022-07-11 00:52:34.000000000 +0800 +@@ -70,7 +70,7 @@ + # the service should report STARTED (green) ONLY if the desired state is started. otherwise, INSTALLED (red) + if len(expected_agents) > 0: + for proc in processes: +- if not proc.has_key('status') or proc['status'] == 'NOT_RUNNING': ++ if 'status' not in proc or proc['status'] == 'NOT_RUNNING': + raise ComponentIsNotRunning() + elif len(expected_agents) == 0 and 'INSTALLED' == get_desired_state(): + raise ComponentIsNotRunning() +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/FLUME/package/scripts/flume.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/FLUME/package/scripts/flume.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/FLUME/package/scripts/flume.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/FLUME/package/scripts/flume.py 2022-07-11 00:52:34.000000000 +0800 +@@ -42,7 +42,7 @@ + if params.flume_conf_content is not None: + flume_agents = build_flume_topology(params.flume_conf_content) + +- for agent in flume_agents.keys(): ++ for agent in list(flume_agents.keys()): + flume_agent_conf_dir = os.path.join(params.flume_conf_dir, agent) + flume_agent_conf_file = os.path.join(flume_agent_conf_dir, 'flume.conf') + flume_agent_meta_file = os.path.join(flume_agent_conf_dir, 'ambari-meta.json') +@@ -52,15 +52,15 @@ + + PropertiesFile(flume_agent_conf_file, + properties=flume_agents[agent], +- mode = 0644) ++ mode = 0o644) + + File(flume_agent_log4j_file, + content=Template('log4j.properties.j2', agent_name = agent), +- mode = 0644) ++ mode = 0o644) + + File(flume_agent_meta_file, + content = json.dumps(ambari_meta(agent, flume_agents[agent])), +- mode = 0644) ++ mode = 0o644) + + elif action == 'start': + # desired state for service should be STARTED +@@ -148,13 +148,13 @@ + if lhs.endswith(".sources"): + agent_names.append(part0) + +- if not result.has_key(part0): ++ if part0 not in result: + result[part0] = {} + + result[part0][lhs] = rhs + + # trim out non-agents +- for k in result.keys(): ++ for k in list(result.keys()): + if not k in agent_names: + del result[k] + +@@ -248,7 +248,7 @@ + import params + + try: +- with open(os.path.join(params.flume_run_dir, 'ambari-state.txt'), 'r') as fp: ++ with open(os.path.join(params.flume_run_dir, 'ambari-state.txt')) as fp: + return fp.read() + except: + return 'INSTALLED' +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/FLUME/package/scripts/params.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/FLUME/package/scripts/params.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/FLUME/package/scripts/params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/FLUME/package/scripts/params.py 2022-07-11 00:52:34.000000000 +0800 +@@ -66,5 +66,5 @@ + ganglia_server_host = ganglia_server_hosts[0] + + hostname = None +-if config.has_key('hostname'): ++if 'hostname' in config: + hostname = config['hostname'] +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/GANGLIA/package/scripts/ganglia.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/GANGLIA/package/scripts/ganglia.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/GANGLIA/package/scripts/ganglia.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/GANGLIA/package/scripts/ganglia.py 2022-07-11 00:52:34.000000000 +0800 +@@ -50,7 +50,7 @@ + + File("/etc/init.d/hdp-" + name, + content=StaticFile(name + ".init"), +- mode=0755 ++ mode=0o755 + ) + + +@@ -59,11 +59,11 @@ + + File(params.ganglia_shell_cmds_dir + os.sep + name, + content=StaticFile(name), +- mode=0755 ++ mode=0o755 + ) + + +-def ganglia_TemplateConfig(name, mode=0755, tag=None): ++def ganglia_TemplateConfig(name, mode=0o755, tag=None): + import params + + TemplateConfig(format("{params.ganglia_shell_cmds_dir}/{name}"), +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/GANGLIA/package/scripts/ganglia_server.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/GANGLIA/package/scripts/ganglia_server.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/GANGLIA/package/scripts/ganglia_server.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/GANGLIA/package/scripts/ganglia_server.py 2022-07-11 00:52:34.000000000 +0800 +@@ -81,7 +81,7 @@ + import params + + Directory(params.dwoo_path, +- mode=0755, ++ mode=0o755, + create_parents = True + ) + Execute(format("chown -R {web_user} {dwoo_path}")) +@@ -97,21 +97,21 @@ + TemplateConfig(rrd_py_file_path, + owner="root", + group="root", +- mode=0755 ++ mode=0o755 + ) + rrd_file_owner = params.gmetad_user + + Directory(params.rrdcached_base_dir, + owner=rrd_file_owner, + group=rrd_file_owner, +- mode=0755, ++ mode=0o755, + create_parents = True + ) + + if System.get_instance().os_family in ["ubuntu","suse"]: + File( params.ganglia_apache_config_file, + content = Template("ganglia.conf.j2"), +- mode = 0644 ++ mode = 0o644 + ) + + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/GANGLIA/package/scripts/status_params.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/GANGLIA/package/scripts/status_params.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/GANGLIA/package/scripts/status_params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/GANGLIA/package/scripts/status_params.py 2022-07-11 00:52:34.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HBASE/package/scripts/functions.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HBASE/package/scripts/functions.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HBASE/package/scripts/functions.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HBASE/package/scripts/functions.py 2022-07-11 00:52:35.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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,8 +31,8 @@ + @param xmn_percent: float (e.g 0.2) + @param xmn_max: integer (e.g 512) + """ +- heapsize = int(re.search('\d+',heapsize_str).group(0)) +- heapsize_unit = re.search('\D+',heapsize_str).group(0) ++ heapsize = int(re.search(r'\d+',heapsize_str).group(0)) ++ heapsize_unit = re.search(r'\D+',heapsize_str).group(0) + xmn_val = int(math.floor(heapsize*xmn_percent)) + xmn_val -= xmn_val % 8 + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HBASE/package/scripts/hbase_client.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HBASE/package/scripts/hbase_client.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HBASE/package/scripts/hbase_client.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HBASE/package/scripts/hbase_client.py 2022-07-11 00:52:35.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 hbase import hbase ++from .hbase import hbase + + + class HbaseClient(Script): +@@ -30,7 +30,7 @@ + self.configure(env) + + def configure(self, env): +- import params ++ from . import params + env.set_params(params) + + hbase(name='client') +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HBASE/package/scripts/hbase_decommission.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HBASE/package/scripts/hbase_decommission.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HBASE/package/scripts/hbase_decommission.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HBASE/package/scripts/hbase_decommission.py 2022-07-11 00:52:35.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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,14 +22,14 @@ + + + def hbase_decommission(env): +- import params ++ from . import params + + env.set_params(params) + kinit_cmd = params.kinit_cmd + + File(params.region_drainer, + content=StaticFile("draining_servers.rb"), +- mode=0755 ++ mode=0o755 + ) + + if params.hbase_excluded_hosts and params.hbase_excluded_hosts.split(","): +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HBASE/package/scripts/hbase_master.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HBASE/package/scripts/hbase_master.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HBASE/package/scripts/hbase_master.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HBASE/package/scripts/hbase_master.py 2022-07-11 00:52:35.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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,9 +21,9 @@ + import sys + from resource_management import * + +-from hbase import hbase +-from hbase_service import hbase_service +-from hbase_decommission import hbase_decommission ++from .hbase import hbase ++from .hbase_service import hbase_service ++from .hbase_decommission import hbase_decommission + + + class HbaseMaster(Script): +@@ -31,13 +31,13 @@ + self.install_packages(env) + + def configure(self, env): +- import params ++ from . import params + env.set_params(params) + + hbase(name='master') + + def start(self, env): +- import params ++ from . import params + env.set_params(params) + self.configure(env) # for security + +@@ -46,7 +46,7 @@ + ) + + def stop(self, env): +- import params ++ from . import params + env.set_params(params) + + hbase_service( 'master', +@@ -54,13 +54,13 @@ + ) + + def status(self, env): +- import status_params ++ from . import status_params + env.set_params(status_params) + pid_file = format("{pid_dir}/hbase-{hbase_user}-master.pid") + check_process_status(pid_file) + + def decommission(self, env): +- import params ++ from . import params + env.set_params(params) + + hbase_decommission(env) +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HBASE/package/scripts/hbase.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HBASE/package/scripts/hbase.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HBASE/package/scripts/hbase.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HBASE/package/scripts/hbase.py 2022-07-11 00:52:35.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + + def hbase(name=None # 'master' or 'regionserver' or 'client' + ): +- import params ++ from . import params + + Directory( params.hbase_conf_dir, + owner = params.hbase_user, +@@ -40,7 +40,7 @@ + Directory (os.path.join(params.local_dir, "jars"), + owner = params.hbase_user, + group = params.user_group, +- mode=0775, ++ mode=0o775, + create_parents = True + ) + +@@ -110,14 +110,14 @@ + + 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=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 + ) +@@ -129,14 +129,14 @@ + params.HdfsDirectory(params.hbase_staging_dir, + action="create_delayed", + owner=params.hbase_user, +- mode=0711 ++ mode=0o711 + ) + params.HdfsDirectory(None, action="create") + + def hbase_TemplateConfig(name, + tag=None + ): +- import params ++ from . import params + + TemplateConfig( format("{hbase_conf_dir}/{name}"), + owner = params.hbase_user, +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HBASE/package/scripts/hbase_regionserver.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HBASE/package/scripts/hbase_regionserver.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HBASE/package/scripts/hbase_regionserver.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HBASE/package/scripts/hbase_regionserver.py 2022-07-11 00:52:35.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 hbase import hbase +-from hbase_service import hbase_service ++from .hbase import hbase ++from .hbase_service import hbase_service + + + class HbaseRegionServer(Script): +@@ -30,13 +30,13 @@ + self.install_packages(env) + + def configure(self, env): +- import params ++ from . import params + env.set_params(params) + + hbase(name='regionserver') + + def start(self, env): +- import params ++ from . import params + env.set_params(params) + self.configure(env) # for security + +@@ -45,7 +45,7 @@ + ) + + def stop(self, env): +- import params ++ from . import params + env.set_params(params) + + hbase_service( 'regionserver', +@@ -53,13 +53,13 @@ + ) + + def status(self, env): +- import status_params ++ from . import status_params + env.set_params(status_params) + pid_file = format("{pid_dir}/hbase-{hbase_user}-regionserver.pid") + check_process_status(pid_file) + + def decommission(self, env): +- print "Decommission not yet implemented!" ++ print("Decommission not yet implemented!") + + + if __name__ == "__main__": +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HBASE/package/scripts/hbase_service.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HBASE/package/scripts/hbase_service.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HBASE/package/scripts/hbase_service.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HBASE/package/scripts/hbase_service.py 2022-07-11 00:52:35.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + name, + action = 'start'): # 'start' or 'stop' or 'status' + +- import params ++ from . import params + + role = name + cmd = format("{daemon_script} --config {hbase_conf_dir}") +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HBASE/package/scripts/__init__.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HBASE/package/scripts/__init__.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HBASE/package/scripts/__init__.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HBASE/package/scripts/__init__.py 2022-07-11 00:52:35.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HBASE/package/scripts/params.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HBASE/package/scripts/params.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HBASE/package/scripts/params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HBASE/package/scripts/params.py 2022-07-11 00:52:35.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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,9 +18,9 @@ + + """ + +-from functions import calc_xmn_from_xms ++from .functions import calc_xmn_from_xms + from resource_management import * +-import status_params ++from . import status_params + + # server configurations + config = Script.get_config() +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HBASE/package/scripts/service_check.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HBASE/package/scripts/service_check.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HBASE/package/scripts/service_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HBASE/package/scripts/service_check.py 2022-07-11 00:52:35.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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,12 +19,12 @@ + """ + + from resource_management import * +-import functions ++from . import functions + + + class HbaseServiceCheck(Script): + def service_check(self, env): +- import params ++ from . import params + env.set_params(params) + + output_file = "/apps/hbase/data/ambarismoketest" +@@ -34,11 +34,11 @@ + + File( format("{exec_tmp_dir}/hbaseSmokeVerify.sh"), + content = StaticFile("hbaseSmokeVerify.sh"), +- mode = 0755 ++ mode = 0o755 + ) + + File( hbase_servicecheck_file, +- mode = 0755, ++ mode = 0o755, + content = Template('hbase-smoke.sh.j2') + ) + +@@ -49,7 +49,7 @@ + File( hbase_grant_premissions_file, + owner = params.hbase_user, + group = params.user_group, +- mode = 0644, ++ mode = 0o644, + content = Template('hbase_grant_permissions.j2') + ) + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HBASE/package/scripts/status_params.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HBASE/package/scripts/status_params.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HBASE/package/scripts/status_params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HBASE/package/scripts/status_params.py 2022-07-11 00:52:35.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HDFS/package/files/alert_checkpoint_time.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HDFS/package/files/alert_checkpoint_time.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HDFS/package/files/alert_checkpoint_time.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HDFS/package/files/alert_checkpoint_time.py 2022-07-11 00:52:34.000000000 +0800 +@@ -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 json + + LABEL = 'Last Checkpoint: [{h} hours, {m} minutes, {tx} transactions]' +@@ -110,8 +110,8 @@ + + current_time = int(round(time.time() * 1000)) + +- last_checkpoint_time_qry = "{0}://{1}/jmx?qry=Hadoop:service=NameNode,name=FSNamesystem".format(scheme,uri) +- journal_transaction_info_qry = "{0}://{1}/jmx?qry=Hadoop:service=NameNode,name=NameNodeInfo".format(scheme,uri) ++ last_checkpoint_time_qry = "{}://{}/jmx?qry=Hadoop:service=NameNode,name=FSNamesystem".format(scheme,uri) ++ journal_transaction_info_qry = "{}://{}/jmx?qry=Hadoop:service=NameNode,name=NameNodeInfo".format(scheme,uri) + + # start out assuming an OK status + label = None +@@ -139,7 +139,7 @@ + elif (transaction_difference > int(checkpoint_tx)) and (float(delta) / int(checkpoint_period)*100 >= int(percent_warning)): + result_code = 'WARNING' + +- except Exception, e: ++ except Exception as e: + label = str(e) + result_code = 'UNKNOWN' + +@@ -155,7 +155,7 @@ + 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) +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HDFS/package/files/alert_ha_namenode_health.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HDFS/package/files/alert_ha_namenode_health.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HDFS/package/files/alert_ha_namenode_health.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HDFS/package/files/alert_ha_namenode_health.py 2022-07-11 00:52:34.000000000 +0800 +@@ -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 + +@@ -76,7 +76,7 @@ + + # hdfs-site is required + if not HDFS_SITE_KEY in configurations: +- return (RESULT_STATE_UNKNOWN, ['{0} is a required parameter for the script'.format(HDFS_SITE_KEY)]) ++ return (RESULT_STATE_UNKNOWN, ['{} is a required parameter for the script'.format(HDFS_SITE_KEY)]) + + if SMOKEUSER_KEY in configurations: + smokeuser = configurations[SMOKEUSER_KEY] +@@ -113,7 +113,7 @@ + # look for dfs.ha.namenodes.foo + nn_unique_ids_key = 'dfs.ha.namenodes.' + name_service + if not nn_unique_ids_key in hdfs_site: +- return (RESULT_STATE_UNKNOWN, ['Unable to find unique namenode alias key {0}'.format(nn_unique_ids_key)]) ++ return (RESULT_STATE_UNKNOWN, ['Unable to find unique namenode alias key {}'.format(nn_unique_ids_key)]) + + namenode_http_fragment = 'dfs.namenode.http-address.{0}.{1}' + jmx_uri_fragment = "http://{0}/jmx?qry=Hadoop:service=NameNode,name=*" +@@ -174,7 +174,7 @@ + # there's only one scenario here; there is exactly 1 active and 1 standby + is_topology_healthy = len(active_namenodes) == 1 and len(standby_namenodes) == 1 + +- result_label = 'Active{0}, Standby{1}, Unknown{2}'.format(str(active_namenodes), ++ result_label = 'Active{}, Standby{}, Unknown{}'.format(str(active_namenodes), + str(standby_namenodes), str(unknown_namenodes)) + + # Healthy Topology: +@@ -191,7 +191,7 @@ + return (RESULT_STATE_SKIPPED, ['Another host will report this alert']) + else: + # dfs.namenode.rpc-address.service.alias is guaranteed in HA mode +- first_listed_host_key = 'dfs.namenode.rpc-address.{0}.{1}'.format( ++ first_listed_host_key = 'dfs.namenode.rpc-address.{}.{}'.format( + name_service, nn_unique_ids[0]) + + first_listed_host = '' +@@ -213,7 +213,7 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HDFS/package/files/checkWebUI.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HDFS/package/files/checkWebUI.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HDFS/package/files/checkWebUI.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HDFS/package/files/checkWebUI.py 2022-07-11 00:52:34.000000000 +0800 +@@ -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 optparse +-import httplib ++import http.client + + # + # Main. +@@ -36,7 +36,7 @@ + + for host in hosts: + try: +- conn = httplib.HTTPConnection(host, port) ++ conn = http.client.HTTPConnection(host, port) + # This can be modified to get a partial url part to be sent with request + conn.request("GET", "/") + httpCode = conn.getresponse().status +@@ -45,7 +45,7 @@ + httpCode = 404 + + if httpCode != 200: +- print "Cannot access WEB UI on: http://" + host + ":" + port ++ print("Cannot access WEB UI on: http://" + host + ":" + port) + exit(1) + + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HDFS/package/scripts/balancer-emulator/hdfs-command.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HDFS/package/scripts/balancer-emulator/hdfs-command.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HDFS/package/scripts/balancer-emulator/hdfs-command.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HDFS/package/scripts/balancer-emulator/hdfs-command.py 2022-07-11 00:52:34.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HDFS/package/scripts/hdfs_datanode.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HDFS/package/scripts/hdfs_datanode.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HDFS/package/scripts/hdfs_datanode.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HDFS/package/scripts/hdfs_datanode.py 2022-07-11 00:52:34.000000000 +0800 +@@ -29,7 +29,7 @@ + """ + Directory(data_dir, + create_parents = True, +- mode=0755, ++ mode=0o755, + owner=params.hdfs_user, + group=params.user_group, + ignore_failures=True +@@ -41,7 +41,7 @@ + if action == "configure": + Directory(params.dfs_domain_socket_dir, + create_parents = True, +- mode=0751, ++ mode=0o751, + owner=params.hdfs_user, + group=params.user_group) + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HDFS/package/scripts/hdfs_namenode.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HDFS/package/scripts/hdfs_namenode.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HDFS/package/scripts/hdfs_namenode.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HDFS/package/scripts/hdfs_namenode.py 2022-07-11 00:52:34.000000000 +0800 +@@ -74,7 +74,7 @@ + + dirs = directories.split(",") + Directory(dirs, +- mode=0755, ++ mode=0o755, + owner=params.hdfs_user, + group=params.user_group, + create_parents = True +@@ -87,7 +87,7 @@ + params.HdfsDirectory("/tmp", + action="create_delayed", + owner=params.hdfs_user, +- mode=0777 ++ mode=0o777 + ) + params.HdfsDirectory(params.smoke_hdfs_user_dir, + action="create_delayed", +@@ -117,7 +117,7 @@ + else: + File(format("{tmp_dir}/checkForFormat.sh"), + content=StaticFile("checkForFormat.sh"), +- mode=0755) ++ mode=0o755) + Execute(format( + "{tmp_dir}/checkForFormat.sh {hdfs_user} {hadoop_conf_dir} " + "{hadoop_bin_dir} {old_mark_dir} {mark_dir} {dfs_name_dir}"), +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HDFS/package/scripts/hdfs.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HDFS/package/scripts/hdfs.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HDFS/package/scripts/hdfs.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HDFS/package/scripts/hdfs.py 2022-07-11 00:52:34.000000000 +0800 +@@ -37,12 +37,12 @@ + File(os.path.join(params.limits_conf_dir, 'hdfs.conf'), + owner='root', + group='root', +- mode=0644, ++ mode=0o644, + content=Template("hdfs.conf.j2") + ) + + if params.security_enabled: +- tc_mode = 0644 ++ tc_mode = 0o644 + tc_owner = "root" + else: + tc_mode = None +@@ -71,7 +71,7 @@ + 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'), +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HDFS/package/scripts/hdfs_rebalance.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HDFS/package/scripts/hdfs_rebalance.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HDFS/package/scripts/hdfs_rebalance.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HDFS/package/scripts/hdfs_rebalance.py 2022-07-11 00:52:34.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +@@ -43,18 +43,18 @@ + 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'] +- MEMORY_PATTERN = '(?P(?P(\d+)(.|,)?(\d+)?) (?P'+"|".join(MEMORY_SUFFIX)+'))' ++ MEMORY_PATTERN = r'(?P(?P(\d+)(.|,)?(\d+)?) (?P'+"|".join(MEMORY_SUFFIX)+'))' + +- HEADER_BEGIN_PATTERN = re.compile('Time Stamp\w+Iteration#\w+Bytes Already Moved\w+Bytes Left To Move\w+Bytes Being Moved') ++ HEADER_BEGIN_PATTERN = re.compile(r'Time Stamp\w+Iteration#\w+Bytes Already Moved\w+Bytes Left To Move\w+Bytes Being Moved') + PROGRESS_PATTERN = re.compile( +- "(?P.*?)\s+" + +- "(?P\d+)\s+" + +- MEMORY_PATTERN % (1,1,1) + "\s+" + +- MEMORY_PATTERN % (2,2,2) + "\s+" + ++ r"(?P.*?)\s+" + ++ r"(?P\d+)\s+" + ++ MEMORY_PATTERN % (1,1,1) + r"\s+" + ++ MEMORY_PATTERN % (2,2,2) + r"\s+" + + MEMORY_PATTERN % (3,3,3) + ) + PROGRESS_END_PATTERN = re.compile('(The cluster is balanced. Exiting...|The cluster is balanced. Exiting...)') +@@ -110,7 +110,7 @@ + try: + factor = self.MEMORY_SUFFIX.index(multiplier_type) + except ValueError: +- raise AmbariException("Failed to memory value [%s %s]" % (memorySize, multiplier_type)) ++ raise AmbariException("Failed to memory value [{} {}]".format(memorySize, multiplier_type)) + + return float(memorySize) * (1024 ** factor) + def toJson(self): +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HDFS/package/scripts/hdfs_snamenode.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HDFS/package/scripts/hdfs_snamenode.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HDFS/package/scripts/hdfs_snamenode.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HDFS/package/scripts/hdfs_snamenode.py 2022-07-11 00:52:34.000000000 +0800 +@@ -28,7 +28,7 @@ + if action == "configure": + Directory(params.fs_checkpoint_dir, + create_parents = True, +- mode=0755, ++ mode=0o755, + owner=params.hdfs_user, + group=params.user_group) + File(params.exclude_file_path, +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HDFS/package/scripts/namenode.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HDFS/package/scripts/namenode.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HDFS/package/scripts/namenode.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HDFS/package/scripts/namenode.py 2022-07-11 00:52:34.000000000 +0800 +@@ -109,7 +109,7 @@ + cwd=basedir + ) + for line in iter(proc.stdout.readline, ''): +- _print('[balancer] %s %s' % (str(datetime.now()), line )) ++ _print('[balancer] {} {}'.format(str(datetime.now()), line )) + pl = parser.parseLine(line) + if pl: + res = pl.toJson() +@@ -117,7 +117,7 @@ + + self.put_structured_out(res) + elif parser.state == 'PROCESS_FINISED' : +- _print('[balancer] %s %s' % (str(datetime.now()), 'Process is finished' )) ++ _print('[balancer] {} {}'.format(str(datetime.now()), 'Process is finished' )) + self.put_structured_out({'completePercent' : 1}) + break + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HDFS/package/scripts/params.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HDFS/package/scripts/params.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HDFS/package/scripts/params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HDFS/package/scripts/params.py 2022-07-11 00:52:34.000000000 +0800 +@@ -137,7 +137,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 + + namenode_formatted_old_mark_dir = format("{hadoop_pid_dir_prefix}/hdfs/namenode/formatted/") + namenode_formatted_mark_dir = format("/var/lib/hdfs/namenode/formatted/") +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HDFS/package/scripts/utils.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HDFS/package/scripts/utils.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HDFS/package/scripts/utils.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HDFS/package/scripts/utils.py 2022-07-11 00:52:34.000000000 +0800 +@@ -91,11 +91,11 @@ + # a running instance + user = "root" + try: +- with open(hadoop_secure_dn_pid_file, 'r') as f: ++ with open(hadoop_secure_dn_pid_file) as f: + pid = f.read() + os.kill(int(pid), 0) + hadoop_env_exports.update(hadoop_secure_dn_exports) +- except IOError: ++ except OSError: + pass # Can not open pid file + except ValueError: + pass # Pid file content is invalid +@@ -104,8 +104,8 @@ + + + hadoop_env_exports_str = '' +- for exp in hadoop_env_exports.items(): +- hadoop_env_exports_str += "export {0}={1} && ".format(exp[0], exp[1]) ++ for exp in list(hadoop_env_exports.items()): ++ hadoop_env_exports_str += "export {}={} && ".format(exp[0], exp[1]) + + hadoop_daemon = format( + "{hadoop_env_exports_str}" +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/files/alert_hive_thrift_port.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/files/alert_hive_thrift_port.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/files/alert_hive_thrift_port.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/files/alert_hive_thrift_port.py 2022-07-11 00:52:35.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + """ + Licensed to the Apache Software Foundation (ASF) under one +@@ -158,11 +158,11 @@ + result_code = 'OK' + total_time = time.time() - start_time + label = OK_MESSAGE.format(total_time, port) +- except Exception, exception: ++ except Exception as exception: + result_code = 'CRITICAL' + label = CRITICAL_MESSAGE.format(host_name, port, str(exception)) + +- except Exception, e: ++ except Exception as e: + label = str(e) + result_code = 'UNKNOWN' + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/hcat_client.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/hcat_client.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/hcat_client.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/hcat_client.py 2022-07-11 00:52:35.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 .hcat import hcat + + class HCatClient(Script): + def install(self, env): +@@ -28,7 +28,7 @@ + self.configure(env) + + def configure(self, env): +- import params ++ from . import params + + env.set_params(params) + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/hcat.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/hcat.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/hcat.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/hcat.py 2022-07-11 00:52:35.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 . import params + + Directory(params.hive_conf_dir, + create_parents = True, +@@ -49,7 +49,7 @@ + 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.hcat_user, +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/hcat_service_check.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/hcat_service_check.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/hcat_service_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/hcat_service_check.py 2022-07-11 00:52:35.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + from resource_management.libraries.functions import get_unique_id_and_date + + def hcat_service_check(): +- import params ++ from . import params + unique = get_unique_id_and_date() + output_file = format("/apps/hive/warehouse/hcatsmoke{unique}") + test_cmd = format("fs -test -e {output_file}") +@@ -35,7 +35,7 @@ + + 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") +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/hive_client.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/hive_client.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/hive_client.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/hive_client.py 2022-07-11 00:52:35.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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,16 +20,16 @@ + import sys + from resource_management import * + +-from hive import hive ++from .hive import hive + + class HiveClient(Script): + def install(self, env): +- import params ++ from . import params + self.install_packages(env, exclude_packages=params.hive_exclude_packages) + self.configure(env) + + def configure(self, env): +- import params ++ from . import params + env.set_params(params) + + hive(name='client') +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/hive_metastore.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/hive_metastore.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/hive_metastore.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/hive_metastore.py 2022-07-11 00:52:35.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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,24 +21,24 @@ + import sys + from resource_management import * + +-from hive import hive +-from hive_service import hive_service +-from mysql_service import mysql_service ++from .hive import hive ++from .hive_service import hive_service ++from .mysql_service import mysql_service + + class HiveMetastore(Script): + + def install(self, env): +- import params ++ from . import params + self.install_packages(env, exclude_packages=params.hive_exclude_packages) + + def configure(self, env): +- import params ++ from . import params + env.set_params(params) + + hive(name='metastore') + + def start(self, env): +- import params ++ from . import params + env.set_params(params) + self.configure(env) # FOR SECURITY + hive_service( 'metastore', +@@ -46,7 +46,7 @@ + ) + + def stop(self, env): +- import params ++ from . import params + env.set_params(params) + + hive_service( 'metastore', +@@ -54,7 +54,7 @@ + ) + + def status(self, env): +- import status_params ++ from . 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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/hive.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/hive.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/hive.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/hive.py 2022-07-11 00:52:35.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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,14 +24,14 @@ + + + def hive(name=None): +- import params ++ from . import params + + if name == 'hiveserver2': + + params.HdfsDirectory(params.hive_apps_whs_dir, + action="create_delayed", + owner=params.hive_user, +- mode=0777 ++ mode=0o777 + ) + params.HdfsDirectory(params.hive_hdfs_user_dir, + action="create_delayed", +@@ -51,7 +51,7 @@ + configuration_attributes=params.config['configurationAttributes']['hive-site'], + owner=params.hive_user, + group=params.user_group, +- mode=0644) ++ mode=0o644) + + File(format("{hive_config_dir}/hive-env.sh"), + owner=params.hive_user, +@@ -77,7 +77,7 @@ + + if name == 'metastore': + File(params.start_metastore_path, +- mode=0755, ++ mode=0o755, + content=StaticFile('startMetastore.sh') + ) + if params.init_metastore_schema: +@@ -98,7 +98,7 @@ + ) + elif name == 'hiveserver2': + File(params.start_hiveserver2_path, +- mode=0755, ++ mode=0o755, + content=Template(format('{start_hiveserver2_script}')) + ) + +@@ -108,7 +108,7 @@ + crt_directory(params.hive_var_lib) + + def fill_conf_dir(component_conf_dir): +- import params ++ from . import params + + Directory(component_conf_dir, + owner=params.hive_user, +@@ -122,7 +122,7 @@ + configuration_attributes=params.config['configurationAttributes']['mapred-site'], + owner=params.hive_user, + group=params.user_group, +- mode=0644) ++ mode=0o644) + + + crt_file(format("{component_conf_dir}/hive-default.xml.template")) +@@ -131,14 +131,14 @@ + log4j_exec_filename = 'hive-exec-log4j.properties' + if (params.log4j_exec_props != None): + File(format("{component_conf_dir}/{log4j_exec_filename}"), +- mode=0644, ++ mode=0o644, + group=params.user_group, + owner=params.hive_user, + content=params.log4j_exec_props + ) + elif (os.path.exists("{component_conf_dir}/{log4j_exec_filename}.template")): + File(format("{component_conf_dir}/{log4j_exec_filename}"), +- mode=0644, ++ mode=0o644, + group=params.user_group, + owner=params.hive_user, + content=StaticFile(format("{component_conf_dir}/{log4j_exec_filename}.template")) +@@ -147,14 +147,14 @@ + log4j_filename = 'hive-log4j.properties' + if (params.log4j_props != None): + File(format("{component_conf_dir}/{log4j_filename}"), +- mode=0644, ++ mode=0o644, + group=params.user_group, + owner=params.hive_user, + content=params.log4j_props + ) + elif (os.path.exists("{component_conf_dir}/{log4j_filename}.template")): + File(format("{component_conf_dir}/{log4j_filename}"), +- mode=0644, ++ mode=0o644, + group=params.user_group, + owner=params.hive_user, + content=StaticFile(format("{component_conf_dir}/{log4j_filename}.template")) +@@ -162,17 +162,17 @@ + + + def crt_directory(name): +- import params ++ from . 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 . import params + + File(name, + owner=params.hive_user, +@@ -181,7 +181,7 @@ + + + def jdbc_connector(): +- import params ++ from . 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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/hive_server.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/hive_server.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/hive_server.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/hive_server.py 2022-07-11 00:52:35.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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,24 +19,24 @@ + """ + + from resource_management import * +-from hive import hive +-from hive_service import hive_service +-from install_jars import install_tez_jars ++from .hive import hive ++from .hive_service import hive_service ++from .install_jars import install_tez_jars + + class HiveServer(Script): + + def install(self, env): +- import params ++ from . import params + self.install_packages(env, exclude_packages=params.hive_exclude_packages) + + def configure(self, env): +- import params ++ from . import params + env.set_params(params) + + hive(name='hiveserver2') + + def start(self, env): +- import params ++ from . import params + env.set_params(params) + self.configure(env) # FOR SECURITY + +@@ -47,7 +47,7 @@ + ) + + def stop(self, env): +- import params ++ from . import params + env.set_params(params) + + hive_service( 'hiveserver2', +@@ -55,7 +55,7 @@ + ) + + def status(self, env): +- import status_params ++ from . import status_params + env.set_params(status_params) + pid_file = format("{hive_pid_dir}/{hive_pid}") + # Recursively check all existing gmetad pid files +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/hive_service.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/hive_service.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/hive_service.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/hive_service.py 2022-07-11 00:52:35.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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,7 +27,7 @@ + name, + action='start'): + +- import params ++ from . import params + + if name == 'metastore': + pid_file = format("{hive_pid_dir}/{hive_metastore_pid}") +@@ -73,7 +73,7 @@ + end_time = start_time + SOCKET_WAIT_SECONDS + + is_service_socket_valid = False +- print "Waiting for the Hive server to start..." ++ print("Waiting for the Hive server to start...") + while time.time() < end_time: + if check_thrift_port_sasl(address, port, 2, security_enabled=params.security_enabled): + is_service_socket_valid = True +@@ -86,7 +86,7 @@ + if is_service_socket_valid == False: + raise Fail("Connection to Hive server %s on port %s failed after %d seconds" % (address, port, elapsed_time)) + +- print "Successfully connected to Hive at %s on port %s after %d seconds" % (address, port, elapsed_time) ++ print("Successfully connected to Hive at %s on port %s after %d seconds" % (address, port, elapsed_time)) + + elif action == 'stop': + demon_cmd = format("kill `cat {pid_file}` >/dev/null 2>&1 && rm -f {pid_file}") +@@ -95,7 +95,7 @@ + ) + + def check_fs_root(): +- import params ++ from . import params + fs_root_url = format("{fs_root}{hive_apps_whs_dir}") + cmd = format("metatool -listFSRoot 2>/dev/null | grep hdfs://") + code, out = call(cmd, user=params.hive_user) +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/__init__.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/__init__.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/__init__.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/__init__.py 2022-07-11 00:52:35.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/install_jars.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/install_jars.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/install_jars.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/install_jars.py 2022-07-11 00:52:35.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + import fnmatch + + def install_tez_jars(): +- import params ++ from . import params + + destination_hdfs_dirs = get_tez_hdfs_dir_paths(params.tez_lib_uris) + +@@ -33,7 +33,7 @@ + params.HdfsDirectory(hdfs_dir, + action="create_delayed", + owner=params.tez_user, +- mode=0755 ++ mode=0o755 + ) + pass + params.HdfsDirectory(None, action="create") +@@ -64,9 +64,9 @@ + pass + + if app_dir_path: +- for scr_file, dest_file in params.app_dir_files.iteritems(): ++ for scr_file, dest_file in params.app_dir_files.items(): + CopyFromLocal(scr_file, +- mode=0755, ++ mode=0o755, + owner=params.tez_user, + dest_dir=app_dir_path, + dest_file=dest_file, +@@ -78,7 +78,7 @@ + + if lib_dir_path: + CopyFromLocal(params.tez_local_lib_jars, +- mode=0755, ++ mode=0o755, + owner=params.tez_user, + dest_dir=lib_dir_path, + kinnit_if_needed=kinit_if_needed, +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/mysql_server.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/mysql_server.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/mysql_server.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/mysql_server.py 2022-07-11 00:52:35.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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,24 +21,24 @@ + import sys + from resource_management import * + +-from mysql_service import mysql_service ++from .mysql_service import mysql_service + + class MysqlServer(Script): + + def install(self, env): +- import params ++ from . import params + + self.install_packages(env, exclude_packages=params.hive_exclude_packages) + self.configure(env) + + def configure(self, env): +- import params ++ from . import params + env.set_params(params) + + mysql_service(daemon_name=params.daemon_name, action='start') + + File(params.mysql_adduser_path, +- mode=0755, ++ mode=0o755, + content=StaticFile('addMysqlUser.sh') + ) + +@@ -51,19 +51,19 @@ + ) + + def start(self, env): +- import params ++ from . import params + env.set_params(params) + + mysql_service(daemon_name=params.daemon_name, action = 'start') + + def stop(self, env): +- import params ++ from . import params + env.set_params(params) + + mysql_service(daemon_name=params.daemon_name, action = 'stop') + + def status(self, env): +- import status_params ++ from . import status_params + mysql_service(daemon_name=status_params.daemon_name, action = 'status') + + if __name__ == "__main__": +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/mysql_service.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/mysql_service.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/mysql_service.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/mysql_service.py 2022-07-11 00:52:34.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/params.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/params.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/params.py 2022-07-11 00:52:35.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 . import status_params + import os + + # server configurations +@@ -210,7 +210,7 @@ + hive_env_sh_template = config['configurations']['hive-env']['content'] + + hive_hdfs_user_dir = format("/user/{hive_user}") +-hive_hdfs_user_mode = 0700 ++hive_hdfs_user_mode = 0o700 + hive_apps_whs_dir = config['configurations']['hive-site']["hive.metastore.warehouse.dir"] + #for create_hdfs_directory + hostname = config["hostname"] +@@ -256,9 +256,9 @@ + webhcat_apps_dir = "/apps/webhcat" + + hcat_hdfs_user_dir = format("/user/{hcat_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 + #for create_hdfs_directory + security_param = "true" if security_enabled else "false" + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/postgresql_server.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/postgresql_server.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/postgresql_server.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/postgresql_server.py 2022-07-11 00:52:35.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 postgresql_service import postgresql_service ++from .postgresql_service import postgresql_service + + class PostgreSQLServer(Script): + +@@ -30,7 +30,7 @@ + self.configure(env) + + def configure(self, env): +- import params ++ from . import params + env.set_params(params) + + # init the database, the ':' makes the command always return 0 in case the database has +@@ -51,7 +51,7 @@ + + # create the database and hive_metastore_user + File(params.postgresql_adduser_path, +- mode=0755, ++ mode=0o755, + content=StaticFile(format("{postgresql_adduser_file}")) + ) + +@@ -64,23 +64,23 @@ + ) + + def start(self, env): +- import params ++ from . import params + env.set_params(params) + + postgresql_service(postgresql_daemon_name=params.postgresql_daemon_name, action = 'start') + + def stop(self, env): +- import params ++ from . import params + env.set_params(params) + + postgresql_service(postgresql_daemon_name=params.postgresql_daemon_name, action = 'stop') + + def status(self, env): +- import status_params ++ from . import status_params + postgresql_service(postgresql_daemon_name=status_params.postgresql_daemon_name, action = 'status') + + def update_postgresql_conf(self, env): +- import params ++ from . import params + env.set_params(params) + + # change the listen_address to * +@@ -92,7 +92,7 @@ + Execute(format("echo \"standard_conforming_strings = off\" | tee -a {postgresql_conf_path}")) + + def update_pghda_conf(self, env): +- import params ++ from . import params + env.set_params(params) + + # trust hive_metastore_user and postgres locally +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/postgresql_service.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/postgresql_service.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/postgresql_service.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/postgresql_service.py 2022-07-11 00:52:34.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/service_check.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/service_check.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/service_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/service_check.py 2022-07-11 00:52:35.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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,21 +22,21 @@ + import socket + import sys + +-from hcat_service_check import hcat_service_check +-from webhcat_service_check import webhcat_service_check ++from .hcat_service_check import hcat_service_check ++from .webhcat_service_check import webhcat_service_check + + class HiveServiceCheck(Script): + def service_check(self, env): +- import params ++ from . import params + env.set_params(params) + + address=format("{hive_server_host}") + port=int(format("{hive_server_port}")) +- print "Test connectivity to hive server" ++ print("Test connectivity to hive server") + if check_thrift_port_sasl(address, port, security_enabled=params.security_enabled): +- print "Successfully connected to %s on port %s" % (address, port) ++ print("Successfully connected to %s on port %s" % (address, port)) + else: +- print "Connection to %s on port %s failed" % (address, port) ++ print("Connection to %s on port %s failed" % (address, port)) + exit(1) + + hcat_service_check() +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/status_params.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/status_params.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/status_params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/status_params.py 2022-07-11 00:52:35.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/webhcat.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/webhcat.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/webhcat.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/webhcat.py 2022-07-11 00:52:35.000000000 +0800 +@@ -25,12 +25,12 @@ + + + def webhcat(): +- import params ++ from . import params + + params.HdfsDirectory(params.webhcat_apps_dir, + action="create_delayed", + owner=params.webhcat_user, +- mode=0755 ++ mode=0o755 + ) + if params.hcat_hdfs_user_dir != params.webhcat_hdfs_user_dir: + params.HdfsDirectory(params.hcat_hdfs_user_dir, +@@ -47,13 +47,13 @@ + + 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) + +@@ -89,7 +89,7 @@ + + CopyFromLocal(params.hadoop_streeming_jars, + owner=params.webhcat_user, +- mode=0755, ++ mode=0o755, + dest_dir=params.webhcat_apps_dir, + kinnit_if_needed=kinit_if_needed, + hdfs_user=params.hdfs_user, +@@ -100,7 +100,7 @@ + if (os.path.isfile(params.pig_tar_file)): + CopyFromLocal(params.pig_tar_file, + owner=params.webhcat_user, +- mode=0755, ++ mode=0o755, + dest_dir=params.webhcat_apps_dir, + kinnit_if_needed=kinit_if_needed, + hdfs_user=params.hdfs_user, +@@ -111,7 +111,7 @@ + if (os.path.isfile(params.hive_tar_file)): + CopyFromLocal(params.hive_tar_file, + owner=params.webhcat_user, +- mode=0755, ++ mode=0o755, + dest_dir=params.webhcat_apps_dir, + kinnit_if_needed=kinit_if_needed, + hdfs_user=params.hdfs_user, +@@ -122,7 +122,7 @@ + if (len(glob.glob(params.sqoop_tar_file)) > 0): + CopyFromLocal(params.sqoop_tar_file, + owner=params.webhcat_user, +- mode=0755, ++ mode=0o755, + dest_dir=params.webhcat_apps_dir, + kinnit_if_needed=kinit_if_needed, + hdfs_user=params.hdfs_user, +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/webhcat_server.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/webhcat_server.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/webhcat_server.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/webhcat_server.py 2022-07-11 00:52:35.000000000 +0800 +@@ -21,31 +21,31 @@ + import sys + from resource_management import * + +-from webhcat import webhcat +-from webhcat_service import webhcat_service ++from .webhcat import webhcat ++from .webhcat_service import webhcat_service + + class WebHCatServer(Script): + def install(self, env): + self.install_packages(env) + def configure(self, env): +- import params ++ from . import params + env.set_params(params) + webhcat() + + def start(self, env): +- import params ++ from . import params + env.set_params(params) + self.configure(env) # FOR SECURITY + webhcat_service(action = 'start') + + def stop(self, env): +- import params ++ from . import params + env.set_params(params) + + webhcat_service(action = 'stop') + + def status(self, env): +- import status_params ++ from . import status_params + env.set_params(status_params) + check_process_status(status_params.webhcat_pid_file) + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/webhcat_service_check.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/webhcat_service_check.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/webhcat_service_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/webhcat_service_check.py 2022-07-11 00:52:35.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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,10 +21,10 @@ + from resource_management import * + + def webhcat_service_check(): +- import params ++ from . import params + File(format("{tmp_dir}/templetonSmoke.sh"), + content= StaticFile('templetonSmoke.sh'), +- mode=0755 ++ mode=0o755 + ) + + cmd = format("{tmp_dir}/templetonSmoke.sh {webhcat_server_host[0]} {smokeuser} {smokeuser_keytab}" +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/webhcat_service.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/webhcat_service.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/webhcat_service.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/HIVE/package/scripts/webhcat_service.py 2022-07-11 00:52:35.000000000 +0800 +@@ -21,7 +21,7 @@ + from resource_management import * + + def webhcat_service(action='start'): +- import params ++ from . import params + + cmd = format('env HADOOP_HOME={hadoop_home} {webhcat_bin_dir}/webhcat_server.sh') + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/OOZIE/package/files/alert_check_oozie_server.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/OOZIE/package/files/alert_check_oozie_server.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/OOZIE/package/files/alert_check_oozie_server.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/OOZIE/package/files/alert_check_oozie_server.py 2022-07-11 00:52:34.000000000 +0800 +@@ -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 @@ + from ambari_commons.os_check import OSConst, OSCheck + from ambari_commons.os_family_impl import OsFamilyFuncImpl, OsFamilyImpl + import os +-from urlparse import urlparse ++from urllib.parse import urlparse + + RESULT_CODE_OK = 'OK' + RESULT_CODE_CRITICAL = 'CRITICAL' +@@ -85,7 +85,7 @@ + # Create the kerberos credentials cache (ccache) file and set it in the environment to use + # when executing curl + env = Environment.get_instance() +- ccache_file = "{0}{1}oozie_alert_cc_{2}".format(env.tmp_dir, os.sep, os.getpid()) ++ ccache_file = "{}{}oozie_alert_cc_{}".format(env.tmp_dir, os.sep, os.getpid()) + kerberos_env = {'KRB5CCNAME': ccache_file} + + # Get the configured Kerberos executable search paths, if any +@@ -138,8 +138,8 @@ + # execute the command + Execute(command, environment=env) + +- return (RESULT_CODE_OK, ["Successful connection to {0}".format(oozie_url)]) +- except KerberosPropertiesNotFound, ex: ++ return (RESULT_CODE_OK, ["Successful connection to {}".format(oozie_url)]) ++ except KerberosPropertiesNotFound as ex: + return (RESULT_CODE_UNKNOWN, [str(ex)]) +- except Exception, ex: ++ except Exception as ex: + return (RESULT_CODE_CRITICAL, [str(ex)]) +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/OOZIE/package/scripts/oozie_client.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/OOZIE/package/scripts/oozie_client.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/OOZIE/package/scripts/oozie_client.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/OOZIE/package/scripts/oozie_client.py 2022-07-11 00:52:34.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/OOZIE/package/scripts/oozie.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/OOZIE/package/scripts/oozie.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/OOZIE/package/scripts/oozie.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/OOZIE/package/scripts/oozie.py 2022-07-11 00:52:34.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + configuration_attributes=params.config['configurationAttributes']['oozie-site'], + owner = params.oozie_user, + group = params.user_group, +- mode = 0664 ++ mode = 0o664 + ) + File(format("{conf_dir}/oozie-env.sh"), + owner=params.oozie_user, +@@ -58,19 +58,19 @@ + content = Template("catalina.properties.j2"), + owner = params.oozie_user, + group = params.user_group, +- mode = 0755 ++ mode = 0o755 + ) + + if (params.log4j_props != None): + File(format("{params.conf_dir}/oozie-log4j.properties"), +- mode=0644, ++ mode=0o644, + group=params.user_group, + owner=params.oozie_user, + content=params.log4j_props + ) + elif (os.path.exists(format("{params.conf_dir}/oozie-log4j.properties"))): + File(format("{params.conf_dir}/oozie-log4j.properties"), +- mode=0644, ++ mode=0o644, + group=params.user_group, + owner=params.oozie_user + ) +@@ -136,7 +136,7 @@ + oozie_server_directorties = [params.oozie_pid_dir, params.oozie_log_dir, params.oozie_tmp_dir, params.oozie_data_dir, params.oozie_lib_dir, params.oozie_webapps_dir, params.oozie_webapps_conf_dir, params.oozie_server_dir] + Directory( oozie_server_directorties, + owner = params.oozie_user, +- mode = 0755, ++ mode = 0o755, + create_parents = True + ) + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/OOZIE/package/scripts/oozie_server.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/OOZIE/package/scripts/oozie_server.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/OOZIE/package/scripts/oozie_server.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/OOZIE/package/scripts/oozie_server.py 2022-07-11 00:52:34.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/OOZIE/package/scripts/oozie_service.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/OOZIE/package/scripts/oozie_service.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/OOZIE/package/scripts/oozie_service.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/OOZIE/package/scripts/oozie_service.py 2022-07-11 00:52:34.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + """ + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file +@@ -40,11 +40,11 @@ + cmd2 = format("{kinit_if_needed} {put_shared_lib_to_hdfs_cmd} ; hadoop --config {hadoop_conf_dir} dfs -chmod -R 755 {oozie_hdfs_user_dir}/share") + + if not os.path.isfile(params.jdbc_driver_jar) and params.jdbc_driver_name == "org.postgresql.Driver": +- print format("ERROR: jdbc file {jdbc_driver_jar} is unavailable. Please, follow next steps:\n" \ ++ print(format("ERROR: jdbc file {jdbc_driver_jar} is unavailable. Please, follow next steps:\n" \ + "1) Download postgresql-9.0-801.jdbc4.jar.\n2) Create needed directory: mkdir -p {oozie_home}/libserver/\n" \ + "3) Copy postgresql-9.0-801.jdbc4.jar to newly created dir: cp /path/to/jdbc/postgresql-9.0-801.jdbc4.jar " \ + "{oozie_home}/libserver/\n4) Copy postgresql-9.0-801.jdbc4.jar to libext: cp " \ +- "/path/to/jdbc/postgresql-9.0-801.jdbc4.jar {oozie_home}/libext/\n") ++ "/path/to/jdbc/postgresql-9.0-801.jdbc4.jar {oozie_home}/libext/\n")) + exit(1) + + if db_connection_check_command: +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/OOZIE/package/scripts/params.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/OOZIE/package/scripts/params.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/OOZIE/package/scripts/params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/OOZIE/package/scripts/params.py 2022-07-11 00:52:34.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + """ + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file +@@ -144,7 +144,7 @@ + else: + log4j_props = None + +-oozie_hdfs_user_mode = 0775 ++oozie_hdfs_user_mode = 0o775 + #for create_hdfs_directory + hdfs_user_keytab = config['configurations']['hadoop-env']['hdfs_user_keytab'] + hdfs_user = config['configurations']['hadoop-env']['hdfs_user'] +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/OOZIE/package/scripts/service_check.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/OOZIE/package/scripts/service_check.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/OOZIE/package/scripts/service_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/OOZIE/package/scripts/service_check.py 2022-07-11 00:52:34.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + """ + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file +@@ -37,7 +37,7 @@ + + File( format("{tmp_dir}/{file_name}"), + content = StaticFile(file_name), +- mode = 0755 ++ mode = 0o755 + ) + + os_family = System.get_instance().os_family +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/OOZIE/package/scripts/status_params.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/OOZIE/package/scripts/status_params.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/OOZIE/package/scripts/status_params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/OOZIE/package/scripts/status_params.py 2022-07-11 00:52:34.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/PIG/package/scripts/pig.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/PIG/package/scripts/pig.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/PIG/package/scripts/pig.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/PIG/package/scripts/pig.py 2022-07-11 00:52:34.000000000 +0800 +@@ -38,7 +38,7 @@ + + # pig_properties is always set to a default even if it's not in the payload + File(format("{params.pig_conf_dir}/pig.properties"), +- mode=0644, ++ mode=0o644, + group=params.user_group, + owner=params.hdfs_user, + content=params.pig_properties +@@ -46,14 +46,14 @@ + + if (params.log4j_props != None): + File(format("{params.pig_conf_dir}/log4j.properties"), +- mode=0644, ++ mode=0o644, + group=params.user_group, + owner=params.hdfs_user, + content=params.log4j_props + ) + elif (os.path.exists(format("{params.pig_conf_dir}/log4j.properties"))): + File(format("{params.pig_conf_dir}/log4j.properties"), +- mode=0644, ++ mode=0o644, + group=params.user_group, + owner=params.hdfs_user + ) +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/PIG/package/scripts/service_check.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/PIG/package/scripts/service_check.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/PIG/package/scripts/service_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/PIG/package/scripts/service_check.py 2022-07-11 00:52:34.000000000 +0800 +@@ -48,7 +48,7 @@ + + File( format("{tmp_dir}/pigSmoke.sh"), + content = StaticFile("pigSmoke.sh"), +- mode = 0755 ++ mode = 0o755 + ) + + Execute( format("pig {tmp_dir}/pigSmoke.sh"), +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/stack_advisor.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/stack_advisor.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/stack_advisor.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/stack_advisor.py 2022-07-11 00:52:34.000000000 +0800 +@@ -28,7 +28,7 @@ + + + def __init__(self): +- super(BaseBIGTOP08StackAdvisor, self).__init__() ++ super().__init__() + self.initialize_logger("BaseBIGTOP08StackAdvisor") + + self.modifyMastersWithMultipleInstances() +@@ -43,7 +43,7 @@ + Modify the set of masters with multiple instances. + Must be overriden in child class. + """ +- self.mastersWithMultipleInstances |= set(['ZOOKEEPER_SERVER', 'HBASE_MASTER']) ++ self.mastersWithMultipleInstances |= {'ZOOKEEPER_SERVER', 'HBASE_MASTER'} + + def modifyCardinalitiesDict(self): + """ +@@ -70,14 +70,14 @@ + Modify the set of components whose host assignment is based on other services. + Must be overriden in child class. + """ +- self.notValuableComponents |= set(['JOURNALNODE', 'ZKFC', 'GANGLIA_MONITOR']) ++ self.notValuableComponents |= {'JOURNALNODE', 'ZKFC', 'GANGLIA_MONITOR'} + + def modifyComponentsNotPreferableOnServer(self): + """ + Modify the set of components that are not preferable on the server. + Must be overriden in child class. + """ +- self.notPreferableOnServerComponents |= set(['GANGLIA_SERVER']) ++ self.notPreferableOnServerComponents |= {'GANGLIA_SERVER'} + + def modifyComponentLayoutSchemes(self): + """ +@@ -106,7 +106,7 @@ + items = [] + + # Validating NAMENODE and SECONDARY_NAMENODE are on different hosts if possible +- hostsSet = set(super(BaseBIGTOP08StackAdvisor, self).getActiveHosts([host["Hosts"] for host in hosts["items"]])) ++ hostsSet = set(super().getActiveHosts([host["Hosts"] for host in hosts["items"]])) + hostsCount = len(hostsSet) + + componentsListList = [service["components"] for service in services["services"]] +@@ -129,19 +129,19 @@ + if "+" in cardinality: + hostsMin = int(cardinality[:-1]) + if componentHostsCount < hostsMin: +- message = "At least {0} {1} components should be installed in cluster.".format(hostsMin, componentDisplayName) ++ message = "At least {} {} components should be installed in cluster.".format(hostsMin, componentDisplayName) + elif "-" in cardinality: + nums = cardinality.split("-") + hostsMin = int(nums[0]) + hostsMax = int(nums[1]) + if componentHostsCount > hostsMax or componentHostsCount < hostsMin: +- message = "Between {0} and {1} {2} components should be installed in cluster.".format(hostsMin, hostsMax, componentDisplayName) ++ message = "Between {} and {} {} components should be installed in cluster.".format(hostsMin, hostsMax, componentDisplayName) + elif "ALL" == cardinality: + if componentHostsCount != hostsCount: +- message = "{0} component should be installed on all hosts in cluster.".format(componentDisplayName) ++ message = "{} component should be installed on all hosts in cluster.".format(componentDisplayName) + else: + if componentHostsCount != int(cardinality): +- message = "Exactly {0} {1} components should be installed in cluster.".format(int(cardinality), componentDisplayName) ++ message = "Exactly {} {} components should be installed in cluster.".format(int(cardinality), componentDisplayName) + + if message is not None: + items.append({"type": 'host-component', "level": 'ERROR', "message": message, "component-name": componentName}) +@@ -317,7 +317,7 @@ + if defaultValue is None: + return None + if value < defaultValue: +- return self.getWarnItem("Value is less than the recommended default of {0}".format(defaultValue)) ++ return self.getWarnItem("Value is less than the recommended default of {}".format(defaultValue)) + return None + + def validateXmxValue(self, properties, recommendedDefaults, propertyName): +@@ -355,7 +355,7 @@ + class BIGTOP08StackAdvisor(BaseBIGTOP08StackAdvisor): + + def __init__(self): +- super(BIGTOP08StackAdvisor, self).__init__() ++ super().__init__() + + self.modifyMastersWithMultipleInstances() + self.modifyCardinalitiesDict() +@@ -393,14 +393,14 @@ + Modify the set of components whose host assignment is based on other services. + Must be overriden in child class. + """ +- self.notValuableComponents |= set(['APP_TIMELINE_SERVER']) ++ self.notValuableComponents |= {'APP_TIMELINE_SERVER'} + + def modifyComponentsNotPreferableOnServer(self): + """ + Modify the set of components that are not preferable on the server. + Must be overriden in child class. + """ +- self.notPreferableOnServerComponents |= set(['STORM_UI_SERVER', 'DRPC_SERVER', 'STORM_REST_API', 'NIMBUS']) ++ self.notPreferableOnServerComponents |= {'STORM_UI_SERVER', 'DRPC_SERVER', 'STORM_REST_API', 'NIMBUS'} + + def modifyComponentLayoutSchemes(self): + """ +@@ -415,7 +415,7 @@ + }) + + def getServiceConfigurationRecommenderDict(self): +- parentRecommendConfDict = super(BIGTOP08StackAdvisor, self).getServiceConfigurationRecommenderDict() ++ parentRecommendConfDict = super().getServiceConfigurationRecommenderDict() + childRecommendConfDict = { + "OOZIE": self.recommendOozieConfigurations, + "HIVE": self.recommendHiveConfigurations, +@@ -449,7 +449,7 @@ + + "m -Djava.net.preferIPv4Stack=true -XX:+UseNUMA -XX:+UseParallelGC") + + def getServiceConfigurationValidators(self): +- parentValidators = super(BIGTOP08StackAdvisor, self).getServiceConfigurationValidators() ++ parentValidators = super().getServiceConfigurationValidators() + childValidators = { + "HIVE": ["hive-site", self.validateHiveConfigurations], + "TEZ": ["tez-site", self.validateTezConfigurations] +@@ -477,17 +477,17 @@ + + def to_number(s): + try: +- return int(re.sub("\D", "", s)) ++ return int(re.sub(r"\D", "", s)) + except ValueError: + return None + + def checkXmxValueFormat(value): +- p = re.compile('-Xmx(\d+)(b|k|m|g|p|t|B|K|M|G|P|T)?') ++ p = re.compile(r'-Xmx(\d+)(b|k|m|g|p|t|B|K|M|G|P|T)?') + matches = p.findall(value) + return len(matches) == 1 + + def getXmxSize(value): +- p = re.compile("-Xmx(\d+)(.?)") ++ p = re.compile(r"-Xmx(\d+)(.?)") + result = p.findall(value)[0] + if len(result) > 1: + # result[1] - is a space or size formatter (b|k|m|g etc) +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/WEBHCAT/package/files/alert_webhcat_server.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/WEBHCAT/package/files/alert_webhcat_server.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/WEBHCAT/package/files/alert_webhcat_server.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/WEBHCAT/package/files/alert_webhcat_server.py 2022-07-11 00:52:34.000000000 +0800 +@@ -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 subprocess + import socket + import time +-import urllib2 ++import urllib.request, urllib.error, urllib.parse + + from resource_management.core.environment import Environment + from resource_management.core.resources import Execute +@@ -102,7 +102,7 @@ + host_name = socket.getfqdn() + + # webhcat always uses http, never SSL +- query_url = "http://{0}:{1}/templeton/v1/status".format(host_name, webhcat_port) ++ query_url = "http://{}:{}/templeton/v1/status".format(host_name, webhcat_port) + + # initialize + total_time = 0 +@@ -122,7 +122,7 @@ + # Create the kerberos credentials cache (ccache) file and set it in the environment to use + # when executing curl + env = Environment.get_instance() +- ccache_file = "{0}{1}webhcat_alert_cc_{2}".format(env.tmp_dir, sep, getpid()) ++ ccache_file = "{}{}webhcat_alert_cc_{}".format(env.tmp_dir, sep, getpid()) + kerberos_env = {'KRB5CCNAME': ccache_file} + + # Get the configured Kerberos executable search paths, if any +@@ -181,7 +181,7 @@ + raise Exception(stderr) + + json_response = json.loads(stdout) +- except Exception, exception: ++ except Exception as exception: + return (RESULT_CODE_CRITICAL, [str(exception)]) + else: + url_response = None +@@ -189,11 +189,11 @@ + try: + # execute the query for the JSON that includes WebHCat status + start_time = time.time() +- url_response = urllib2.urlopen(query_url, timeout=connection_timeout) ++ url_response = urllib.request.urlopen(query_url, timeout=connection_timeout) + total_time = time.time() - start_time + + json_response = json.loads(url_response.read()) +- except urllib2.HTTPError as httpError: ++ except urllib.error.HTTPError as httpError: + label = CRITICAL_HTTP_MESSAGE.format(httpError.code, query_url) + return (RESULT_CODE_CRITICAL, [label]) + except: +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/YARN/package/files/alert_nodemanager_health.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/YARN/package/files/alert_nodemanager_health.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/YARN/package/files/alert_nodemanager_health.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/YARN/package/files/alert_nodemanager_health.py 2022-07-11 00:52:34.000000000 +0800 +@@ -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 json + import socket +-import urllib2 ++import urllib.request, urllib.error, urllib.parse + from ambari_commons import OSCheck + from ambari_commons.inet_utils import resolve_address + +@@ -105,25 +105,25 @@ + if host_name is None: + host_name = socket.getfqdn() + +- uri = '{0}:{1}'.format(host_name, NODEMANAGER_DEFAULT_PORT) ++ uri = '{}:{}'.format(host_name, NODEMANAGER_DEFAULT_PORT) + + if OSCheck.is_windows_family(): + uri_host, uri_port = uri.split(':') + # on windows 0.0.0.0 is invalid address to connect but on linux it resolved to 127.0.0.1 + uri_host = resolve_address(uri_host) +- uri = '{0}:{1}'.format(uri_host, uri_port) ++ uri = '{}:{}'.format(uri_host, uri_port) + +- query = "{0}://{1}/ws/v1/node/info".format(scheme,uri) ++ query = "{}://{}/ws/v1/node/info".format(scheme,uri) + + try: + # execute the query for the JSON that includes templeton status +- url_response = urllib2.urlopen(query, timeout=connection_timeout) +- except urllib2.HTTPError, httpError: ++ url_response = urllib.request.urlopen(query, timeout=connection_timeout) ++ except urllib.error.HTTPError as httpError: + label = CRITICAL_HTTP_STATUS_MESSAGE.format(str(httpError.code), query, + str(httpError)) + + return (RESULT_CODE_CRITICAL, [label]) +- except Exception, exception: ++ except Exception as exception: + label = CRITICAL_CONNECTION_MESSAGE.format(query, str(exception)) + return (RESULT_CODE_CRITICAL, [label]) + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/YARN/package/files/validateYarnComponentStatus.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/YARN/package/files/validateYarnComponentStatus.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/YARN/package/files/validateYarnComponentStatus.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/YARN/package/files/validateYarnComponentStatus.py 2022-07-11 00:52:34.000000000 +0800 +@@ -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 @@ + (stdout, stderr) = proc.communicate() + response = json.loads(stdout) + if response == None: +- print 'There is no response for url: ' + str(url) ++ print('There is no response for url: ' + str(url)) + raise Exception('There is no response for url: ' + str(url)) + return response + +@@ -58,12 +58,12 @@ + try: + responses[address] = getResponse(path, address, ssl_enabled) + except Exception as e: +- print 'Error checking availability status of component.', e ++ print('Error checking availability status of component.', e) + + if not responses: + exit(1) + +- is_valid = validateAvailabilityResponse(component, responses.values()[0]) ++ is_valid = validateAvailabilityResponse(component, list(responses.values())[0]) + if not is_valid: + exit(1) + +@@ -75,7 +75,7 @@ + if rm_state == STARTED_STATE: + return True + else: +- print 'Resourcemanager is not started' ++ print('Resourcemanager is not started') + return False + + elif component == NODEMANAGER: +@@ -93,7 +93,7 @@ + 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 +@@ -103,12 +103,12 @@ + try: + responses[address] = getResponse(path, address, ssl_enabled) + except Exception as e: +- print 'Error checking ability of component.', e ++ print('Error checking ability of component.', e) + + if not responses: + exit(1) + +- is_valid = validateAbilityResponse(component, responses.values()[0]) ++ is_valid = validateAbilityResponse(component, list(responses.values())[0]) + if not is_valid: + exit(1) + +@@ -117,24 +117,24 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/YARN/package/scripts/application_timeline_server.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/YARN/package/scripts/application_timeline_server.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/YARN/package/scripts/application_timeline_server.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/YARN/package/scripts/application_timeline_server.py 2022-07-11 00:52:34.000000000 +0800 +@@ -21,8 +21,8 @@ + + import sys + from resource_management import * +-from yarn import yarn +-from service import service ++from .yarn import yarn ++from .service import service + + class ApplicationTimelineServer(Script): + +@@ -31,23 +31,23 @@ + #self.configure(env) + + def configure(self, env): +- import params ++ from . import params + env.set_params(params) + yarn(name='apptimelineserver') + + def start(self, env): +- import params ++ from . import params + env.set_params(params) + self.configure(env) # FOR SECURITY + service('historyserver', action='start') + + def stop(self, env): +- import params ++ from . import params + env.set_params(params) + service('historyserver', action='stop') + + def status(self, env): +- import status_params ++ from . import status_params + env.set_params(status_params) + Execute(format("mv {yarn_historyserver_pid_file_old} {yarn_historyserver_pid_file}"), + only_if = format("test -e {yarn_historyserver_pid_file_old}", user=status_params.yarn_user)) +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/YARN/package/scripts/historyserver.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/YARN/package/scripts/historyserver.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/YARN/package/scripts/historyserver.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/YARN/package/scripts/historyserver.py 2022-07-11 00:52:34.000000000 +0800 +@@ -21,31 +21,31 @@ + import sys + from resource_management import * + +-from yarn import yarn +-from service import service ++from .yarn import yarn ++from .service import service + + class HistoryServer(Script): + def install(self, env): + self.install_packages(env) + + def configure(self, env): +- import params ++ from . import params + env.set_params(params) + yarn(name="historyserver") + + def start(self, env): +- import params ++ from . import params + env.set_params(params) + self.configure(env) # FOR SECURITY + service('historyserver', action='start', serviceName='mapreduce') + + def stop(self, env): +- import params ++ from . import params + env.set_params(params) + service('historyserver', action='stop', serviceName='mapreduce') + + def status(self, env): +- import status_params ++ from . import status_params + env.set_params(status_params) + check_process_status(status_params.mapred_historyserver_pid_file) + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/YARN/package/scripts/mapred_service_check.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/YARN/package/scripts/mapred_service_check.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/YARN/package/scripts/mapred_service_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/YARN/package/scripts/mapred_service_check.py 2022-07-11 00:52:34.000000000 +0800 +@@ -23,7 +23,7 @@ + + class MapReduce2ServiceCheck(Script): + def service_check(self, env): +- import params ++ from . import params + env.set_params(params) + + jar_path = format("{hadoop_mapred2_jar_location}/{hadoopMapredExamplesJarName}") +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/YARN/package/scripts/mapreduce2_client.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/YARN/package/scripts/mapreduce2_client.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/YARN/package/scripts/mapreduce2_client.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/YARN/package/scripts/mapreduce2_client.py 2022-07-11 00:52:34.000000000 +0800 +@@ -22,7 +22,7 @@ + import sys + from resource_management import * + +-from yarn import yarn ++from .yarn import yarn + + class MapReduce2Client(Script): + +@@ -31,7 +31,7 @@ + self.configure(env) + + def configure(self, env): +- import params ++ from . import params + env.set_params(params) + yarn() + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/YARN/package/scripts/nodemanager.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/YARN/package/scripts/nodemanager.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/YARN/package/scripts/nodemanager.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/YARN/package/scripts/nodemanager.py 2022-07-11 00:52:34.000000000 +0800 +@@ -22,20 +22,20 @@ + import sys + from resource_management import * + +-from yarn import yarn +-from service import service ++from .yarn import yarn ++from .service import service + + class Nodemanager(Script): + def install(self, env): + self.install_packages(env) + + def configure(self, env): +- import params ++ from . import params + env.set_params(params) + yarn(name="nodemanager") + + def start(self, env): +- import params ++ from . import params + env.set_params(params) + self.configure(env) # FOR SECURITY + service('nodemanager', +@@ -43,7 +43,7 @@ + ) + + def stop(self, env): +- import params ++ from . import params + env.set_params(params) + + service('nodemanager', +@@ -51,7 +51,7 @@ + ) + + def status(self, env): +- import status_params ++ from . import status_params + env.set_params(status_params) + check_process_status(status_params.nodemanager_pid_file) + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/YARN/package/scripts/params.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/YARN/package/scripts/params.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/YARN/package/scripts/params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/YARN/package/scripts/params.py 2022-07-11 00:52:34.000000000 +0800 +@@ -21,7 +21,7 @@ + import os + + from resource_management import * +-import status_params ++from . import status_params + + # server configurations + config = Script.get_config() +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/YARN/package/scripts/resourcemanager.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/YARN/package/scripts/resourcemanager.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/YARN/package/scripts/resourcemanager.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/YARN/package/scripts/resourcemanager.py 2022-07-11 00:52:34.000000000 +0800 +@@ -22,8 +22,8 @@ + import sys + from resource_management import * + +-from yarn import yarn +-from service import service ++from .yarn import yarn ++from .service import service + + + class Resourcemanager(Script): +@@ -32,13 +32,13 @@ + self.configure(env) + + def configure(self, env): +- import params ++ from . import params + + env.set_params(params) + yarn(name='resourcemanager') + + def start(self, env): +- import params ++ from . import params + + env.set_params(params) + self.configure(env) # FOR SECURITY +@@ -47,7 +47,7 @@ + ) + + def stop(self, env): +- import params ++ from . import params + + env.set_params(params) + +@@ -56,14 +56,14 @@ + ) + + def status(self, env): +- import status_params ++ from . import status_params + + env.set_params(status_params) + check_process_status(status_params.resourcemanager_pid_file) + pass + + def refreshqueues(self, env): +- import params ++ from . import params + + self.configure(env) + env.set_params(params) +@@ -73,7 +73,7 @@ + ) + + def decommission(self, env): +- import params ++ from . import params + + env.set_params(params) + rm_kinit_cmd = params.rm_kinit_cmd +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/YARN/package/scripts/service_check.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/YARN/package/scripts/service_check.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/YARN/package/scripts/service_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/YARN/package/scripts/service_check.py 2022-07-11 00:52:34.000000000 +0800 +@@ -24,7 +24,7 @@ + + class ServiceCheck(Script): + def service_check(self, env): +- import params ++ from . import params + env.set_params(params) + + run_yarn_check_cmd = format("yarn --config {hadoop_conf_dir} node -list") +@@ -48,7 +48,7 @@ + + File(validateStatusFilePath, + content=StaticFile(validateStatusFileName), +- mode=0755 ++ mode=0o755 + ) + + Execute(smoke_cmd, +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/YARN/package/scripts/service.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/YARN/package/scripts/service.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/YARN/package/scripts/service.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/YARN/package/scripts/service.py 2022-07-11 00:52:34.000000000 +0800 +@@ -24,7 +24,7 @@ + + def service(componentName, action='start', serviceName='yarn'): + +- import params ++ from . import params + + if serviceName == 'mapreduce' and componentName == 'historyserver': + daemon = format("{mapred_bin}/mr-jobhistory-daemon.sh") +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/YARN/package/scripts/status_params.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/YARN/package/scripts/status_params.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/YARN/package/scripts/status_params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/YARN/package/scripts/status_params.py 2022-07-11 00:52:34.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/YARN/package/scripts/yarn_client.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/YARN/package/scripts/yarn_client.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/YARN/package/scripts/yarn_client.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/YARN/package/scripts/yarn_client.py 2022-07-11 00:52:34.000000000 +0800 +@@ -22,7 +22,7 @@ + import sys + from resource_management import * + +-from yarn import yarn ++from .yarn import yarn + + class YarnClient(Script): + +@@ -31,7 +31,7 @@ + self.configure(env) + + def configure(self, env): +- import params ++ from . import params + env.set_params(params) + yarn() + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/YARN/package/scripts/yarn.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/YARN/package/scripts/yarn.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/YARN/package/scripts/yarn.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/YARN/package/scripts/yarn.py 2022-07-11 00:52:34.000000000 +0800 +@@ -25,7 +25,7 @@ + + + def yarn(name = None): +- import params ++ from . import params + + + if name in ["nodemanager","historyserver"]: +@@ -34,7 +34,7 @@ + action="create_delayed", + owner=params.yarn_user, + group=params.user_group, +- mode=0777, ++ mode=0o777, + recursive_chmod=True + ) + params.HdfsDirectory("/mapred", +@@ -49,14 +49,14 @@ + action="create_delayed", + owner=params.mapred_user, + group=params.user_group, +- mode=0777 ++ mode=0o777 + ) + + params.HdfsDirectory(params.mapreduce_jobhistory_done_dir, + action="create_delayed", + owner=params.mapred_user, + group=params.user_group, +- mode=01777 ++ mode=0o1777 + ) + params.HdfsDirectory(None, action="create") + +@@ -90,7 +90,7 @@ + configuration_attributes=params.config['configurationAttributes']['core-site'], + owner=params.hdfs_user, + group=params.user_group, +- mode=0644 ++ mode=0o644 + ) + + XmlConfig("mapred-site.xml", +@@ -99,7 +99,7 @@ + configuration_attributes=params.config['configurationAttributes']['mapred-site'], + owner=params.yarn_user, + group=params.user_group, +- mode=0644 ++ mode=0o644 + ) + + XmlConfig("yarn-site.xml", +@@ -108,7 +108,7 @@ + configuration_attributes=params.config['configurationAttributes']['yarn-site'], + owner=params.yarn_user, + group=params.user_group, +- mode=0644 ++ mode=0o644 + ) + + XmlConfig("capacity-scheduler.xml", +@@ -117,7 +117,7 @@ + configuration_attributes=params.config['configurationAttributes']['capacity-scheduler'], + owner=params.yarn_user, + group=params.user_group, +- mode=0644 ++ mode=0o644 + ) + + if name == 'resourcemanager': +@@ -138,19 +138,19 @@ + ) + + 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(format("{hadoop_conf_dir}/yarn-env.sh"), + owner=params.yarn_user, + group=params.user_group, +- mode=0755, ++ mode=0o755, + content=InlineTemplate(params.yarn_env_sh_template) + ) + +@@ -158,18 +158,18 @@ + container_executor = format("{yarn_container_bin}/container-executor") + File(container_executor, + group=params.yarn_executor_container_group, +- mode=06050 ++ mode=0o6050 + ) + + File(format("{hadoop_conf_dir}/container-executor.cfg"), + group=params.user_group, +- mode=0644, ++ mode=0o644, + content=Template('container-executor.cfg.j2') + ) + + + if params.security_enabled: +- tc_mode = 0644 ++ tc_mode = 0o644 + tc_owner = "root" + else: + tc_mode = None +@@ -184,7 +184,7 @@ + File(os.path.join(params.hadoop_bin, "task-controller"), + owner="root", + group=params.mapred_tt_group, +- mode=06050 ++ mode=0o6050 + ) + File(os.path.join(params.hadoop_conf_dir, 'taskcontroller.cfg'), + owner = tc_owner, +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/ZOOKEEPER/package/scripts/params.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/ZOOKEEPER/package/scripts/params.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/ZOOKEEPER/package/scripts/params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/ZOOKEEPER/package/scripts/params.py 2022-07-11 00:52:34.000000000 +0800 +@@ -20,7 +20,7 @@ + """ + + from resource_management import * +-import status_params ++from . import status_params + + # server configurations + config = Script.get_config() +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/ZOOKEEPER/package/scripts/service_check.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/ZOOKEEPER/package/scripts/service_check.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/ZOOKEEPER/package/scripts/service_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/ZOOKEEPER/package/scripts/service_check.py 2022-07-11 00:52:34.000000000 +0800 +@@ -23,11 +23,11 @@ + + class ZookeeperServiceCheck(Script): + def service_check(self, env): +- import params ++ from . import params + env.set_params(params) + + File(format("{tmp_dir}/zkSmoke.sh"), +- mode=0755, ++ mode=0o755, + content=StaticFile('zkSmoke.sh') + ) + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/ZOOKEEPER/package/scripts/status_params.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/ZOOKEEPER/package/scripts/status_params.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/ZOOKEEPER/package/scripts/status_params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/ZOOKEEPER/package/scripts/status_params.py 2022-07-11 00:52:34.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/ZOOKEEPER/package/scripts/zookeeper_client.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/ZOOKEEPER/package/scripts/zookeeper_client.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/ZOOKEEPER/package/scripts/zookeeper_client.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/ZOOKEEPER/package/scripts/zookeeper_client.py 2022-07-11 00:52:34.000000000 +0800 +@@ -22,7 +22,7 @@ + import sys + from resource_management import * + +-from zookeeper import zookeeper ++from .zookeeper import zookeeper + + class ZookeeperClient(Script): + def install(self, env): +@@ -30,7 +30,7 @@ + self.configure(env) + + def configure(self, env): +- import params ++ from . import params + env.set_params(params) + + zookeeper(type='client') +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/ZOOKEEPER/package/scripts/zookeeper.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/ZOOKEEPER/package/scripts/zookeeper.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/ZOOKEEPER/package/scripts/zookeeper.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/ZOOKEEPER/package/scripts/zookeeper.py 2022-07-11 00:52:34.000000000 +0800 +@@ -25,7 +25,7 @@ + + + def zookeeper(type = None): +- import params ++ from . import params + + Directory(params.config_dir, + owner=params.zk_user, +@@ -65,20 +65,20 @@ + myid = str(sorted(params.zookeeper_hosts).index(params.hostname) + 1) + + File(format("{zk_data_dir}/myid"), +- mode = 0644, ++ mode = 0o644, + content = myid + ) + + if (params.log4j_props != None): + File(format("{params.config_dir}/log4j.properties"), +- mode=0644, ++ mode=0o644, + group=params.user_group, + owner=params.zk_user, + content=params.log4j_props + ) + elif (os.path.exists(format("{params.config_dir}/log4j.properties"))): + File(format("{params.config_dir}/log4j.properties"), +- mode=0644, ++ mode=0o644, + group=params.user_group, + owner=params.zk_user + ) +@@ -97,7 +97,7 @@ + + + def configFile(name, template_name=None): +- import params ++ from . import params + + File(format("{config_dir}/{name}"), + content=Template(template_name), +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/ZOOKEEPER/package/scripts/zookeeper_server.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/ZOOKEEPER/package/scripts/zookeeper_server.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/ZOOKEEPER/package/scripts/zookeeper_server.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/ZOOKEEPER/package/scripts/zookeeper_server.py 2022-07-11 00:52:34.000000000 +0800 +@@ -22,31 +22,31 @@ + import sys + from resource_management import * + +-from zookeeper import zookeeper +-from zookeeper_service import zookeeper_service ++from .zookeeper import zookeeper ++from .zookeeper_service import zookeeper_service + + class ZookeeperServer(Script): + def install(self, env): + self.install_packages(env) + self.configure(env) + def configure(self, env): +- import params ++ from . import params + env.set_params(params) + zookeeper(type='server') + + def start(self, env): +- import params ++ from . import params + env.set_params(params) + self.configure(env) + zookeeper_service(action = 'start') + + def stop(self, env): +- import params ++ from . import params + env.set_params(params) + zookeeper_service(action = 'stop') + + def status(self, env): +- import status_params ++ from . import status_params + env.set_params(status_params) + check_process_status(status_params.zk_pid_file) + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/ZOOKEEPER/package/scripts/zookeeper_service.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/ZOOKEEPER/package/scripts/zookeeper_service.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/ZOOKEEPER/package/scripts/zookeeper_service.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/BIGTOP/0.8/services/ZOOKEEPER/package/scripts/zookeeper_service.py 2022-07-11 00:52:34.000000000 +0800 +@@ -22,7 +22,7 @@ + from resource_management import * + + def zookeeper_service(action='start'): +- import params ++ from . import params + + cmd = format("env ZOOCFGDIR={config_dir} ZOOCFG=zoo.cfg {zk_bin}/zkServer.sh") + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.0.6/services/stack_advisor.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.0.6/services/stack_advisor.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.0.6/services/stack_advisor.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.0.6/services/stack_advisor.py 2022-07-11 00:52:35.000000000 +0800 +@@ -34,7 +34,7 @@ + class HDP206StackAdvisor(DefaultStackAdvisor): + + def __init__(self): +- super(HDP206StackAdvisor, self).__init__() ++ super().__init__() + self.initialize_logger("HDP206StackAdvisor") + Logger.logger = self.logger + +@@ -50,7 +50,7 @@ + Modify the set of masters with multiple instances. + Must be overriden in child class. + """ +- self.mastersWithMultipleInstances |= set(['ZOOKEEPER_SERVER', 'HBASE_MASTER']) ++ self.mastersWithMultipleInstances |= {'ZOOKEEPER_SERVER', 'HBASE_MASTER'} + + def modifyCardinalitiesDict(self): + """ +@@ -77,14 +77,14 @@ + Modify the set of components whose host assignment is based on other services. + Must be overriden in child class. + """ +- self.notValuableComponents |= set(['JOURNALNODE', 'ZKFC', 'GANGLIA_MONITOR']) ++ self.notValuableComponents |= {'JOURNALNODE', 'ZKFC', 'GANGLIA_MONITOR'} + + def modifyComponentsNotPreferableOnServer(self): + """ + Modify the set of components that are not preferable on the server. + Must be overriden in child class. + """ +- self.notPreferableOnServerComponents |= set(['GANGLIA_SERVER', 'METRICS_COLLECTOR']) ++ self.notPreferableOnServerComponents |= {'GANGLIA_SERVER', 'METRICS_COLLECTOR'} + + def modifyComponentLayoutSchemes(self): + """ +@@ -111,11 +111,11 @@ + + def getComponentLayoutValidations(self, services, hosts): + """Returns array of Validation objects about issues with hostnames components assigned to""" +- items = super(HDP206StackAdvisor, self).getComponentLayoutValidations(services, hosts) ++ items = super().getComponentLayoutValidations(services, hosts) + + # Validating NAMENODE and SECONDARY_NAMENODE are on different hosts if possible + # Use a set for fast lookup +- hostsSet = set(super(HDP206StackAdvisor, self).getActiveHosts([host["Hosts"] for host in hosts["items"]])) #[host["Hosts"]["host_name"] for host in hosts["items"]] ++ hostsSet = set(super().getActiveHosts([host["Hosts"] for host in hosts["items"]])) #[host["Hosts"]["host_name"] for host in hosts["items"]] + hostsCount = len(hostsSet) + + componentsListList = [service["components"] for service in services["services"]] +@@ -138,22 +138,22 @@ + if "+" in cardinality: + hostsMin = int(cardinality[:-1]) + if componentHostsCount < hostsMin: +- message = "at least {0} {1} components should be installed in cluster.".format(hostsMin, componentDisplayName) ++ message = "at least {} {} components should be installed in cluster.".format(hostsMin, componentDisplayName) + elif "-" in cardinality: + nums = cardinality.split("-") + hostsMin = int(nums[0]) + hostsMax = int(nums[1]) + if componentHostsCount > hostsMax or componentHostsCount < hostsMin: +- message = "between {0} and {1} {2} components should be installed in cluster.".format(hostsMin, hostsMax, componentDisplayName) ++ message = "between {} and {} {} components should be installed in cluster.".format(hostsMin, hostsMax, componentDisplayName) + elif "ALL" == cardinality: + if componentHostsCount != hostsCount: +- message = "{0} component should be installed on all hosts in cluster.".format(componentDisplayName) ++ message = "{} component should be installed on all hosts in cluster.".format(componentDisplayName) + else: + if componentHostsCount != int(cardinality): +- message = "exactly {0} {1} components should be installed in cluster.".format(int(cardinality), componentDisplayName) ++ message = "exactly {} {} components should be installed in cluster.".format(int(cardinality), componentDisplayName) + + if message is not None: +- message = "You have selected {0} {1} components. Please consider that {2}".format(componentHostsCount, componentDisplayName, message) ++ message = "You have selected {} {} components. Please consider that {}".format(componentHostsCount, componentDisplayName, message) + items.append({"type": 'host-component', "level": 'ERROR', "message": message, "component-name": componentName}) + + # Validating host-usage +@@ -241,12 +241,12 @@ + if "TEZ" in servicesList: + ambari_user = self.getAmbariUser(services) + ambariHostName = socket.getfqdn() +- putYarnProperty("yarn.timeline-service.http-authentication.proxyuser.{0}.hosts".format(ambari_user), ambariHostName) +- putYarnProperty("yarn.timeline-service.http-authentication.proxyuser.{0}.groups".format(ambari_user), "*") ++ putYarnProperty("yarn.timeline-service.http-authentication.proxyuser.{}.hosts".format(ambari_user), ambariHostName) ++ putYarnProperty("yarn.timeline-service.http-authentication.proxyuser.{}.groups".format(ambari_user), "*") + old_ambari_user = self.getOldAmbariUser(services) + if old_ambari_user is not None: +- putYarnPropertyAttribute("yarn.timeline-service.http-authentication.proxyuser.{0}.hosts".format(old_ambari_user), 'delete', 'true') +- putYarnPropertyAttribute("yarn.timeline-service.http-authentication.proxyuser.{0}.groups".format(old_ambari_user), 'delete', 'true') ++ putYarnPropertyAttribute("yarn.timeline-service.http-authentication.proxyuser.{}.hosts".format(old_ambari_user), 'delete', 'true') ++ putYarnPropertyAttribute("yarn.timeline-service.http-authentication.proxyuser.{}.groups".format(old_ambari_user), 'delete', 'true') + + def recommendMapReduce2Configurations(self, configurations, clusterData, services, hosts): + putMapredProperty = self.putProperty(configurations, "mapred-site", services) +@@ -275,8 +275,8 @@ + if "HDFS" in servicesList: + ambari_user = self.getAmbariUser(services) + props = ( +- "hadoop.proxyuser.{0}.hosts".format(ambari_user), +- "hadoop.proxyuser.{0}.groups".format(ambari_user) ++ "hadoop.proxyuser.{}.hosts".format(ambari_user), ++ "hadoop.proxyuser.{}.groups".format(ambari_user) + ) + for prop in props: + validationItems.append({"config-name": prop, "item": self.validatorNotEmpty(properties, prop)}) +@@ -325,15 +325,15 @@ + # 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 = self.getMountPointForDir(dataDir, mountPoints) + for i in range(len(mountPoints)): +@@ -465,7 +465,7 @@ + else: + + ranger_admin_host = ranger_admin_hosts[0] +- policymgr_external_url = "%s://%s:%s" % (protocol, ranger_admin_host, port) ++ policymgr_external_url = "{}://{}:{}".format(protocol, ranger_admin_host, port) + + putRangerAdminProperty('policymgr_external_url', policymgr_external_url) + +@@ -582,13 +582,13 @@ + userValue = convertToNumber(configurations[configName]["properties"][propertyName]) + maxValue = convertToNumber(recommendedDefaults[configName]["property_attributes"][propertyName]["maximum"]) + if userValue > maxValue: +- validationItems.extend([{"config-name": propertyName, "item": self.getWarnItem("Value is greater than the recommended maximum of {0} ".format(maxValue))}]) ++ validationItems.extend([{"config-name": propertyName, "item": self.getWarnItem("Value is greater than the recommended maximum of {} ".format(maxValue))}]) + if "minimum" in recommendedDefaults[configName]["property_attributes"][propertyName] and \ + propertyName in recommendedDefaults[configName]["properties"]: + userValue = convertToNumber(configurations[configName]["properties"][propertyName]) + minValue = convertToNumber(recommendedDefaults[configName]["property_attributes"][propertyName]["minimum"]) + if userValue < minValue: +- validationItems.extend([{"config-name": propertyName, "item": self.getWarnItem("Value is less than the recommended minimum of {0} ".format(minValue))}]) ++ validationItems.extend([{"config-name": propertyName, "item": self.getWarnItem("Value is less than the recommended minimum of {} ".format(minValue))}]) + items.extend(self.toConfigurationValidationProblems(validationItems, configName)) + pass + +@@ -616,7 +616,7 @@ + # Dictionary from component name to list of dictionary with keys: config-name, property, default. + heapSizeProperties = self.get_heap_size_properties(services) + for component in components: +- if component in heapSizeProperties.keys(): ++ if component in list(heapSizeProperties.keys()): + heapSizePropertiesForComp = heapSizeProperties[component] + for heapSizeProperty in heapSizePropertiesForComp: + try: +@@ -663,7 +663,7 @@ + yarn_nm_mem_in_mb = float(yarn_site['yarn.nodemanager.resource.memory-mb']) + + if yarn_nm_mem_in_mb <= 0.0: +- self.logger.warning("'yarn.nodemanager.resource.memory-mb' current value : {0}. Expected value : > 0".format(yarn_nm_mem_in_mb)) ++ self.logger.warning("'yarn.nodemanager.resource.memory-mb' current value : {}. Expected value : > 0".format(yarn_nm_mem_in_mb)) + + return yarn_nm_mem_in_mb + +@@ -727,7 +727,7 @@ + if len(nmLowMemoryHosts) > 0: + validationItems.append({"config-name": "yarn.nodemanager.resource.memory-mb", + "item": self.getWarnItem( +- "Node manager hosts with high memory usage found (examples : {0}). Consider reducing the allocated " ++ "Node manager hosts with high memory usage found (examples : {}). Consider reducing the allocated " + "memory for containers or moving other co-located components " + "to a different host.".format(",".join(nmLowMemoryHosts[:3])))}) + +@@ -788,7 +788,7 @@ + break; + + if len(warnings) > 0: +- return self.getWarnItem("cluster-env/one_dir_per_partition is enabled but there are multiple data directories on the same mount. Affected hosts: {0}".format(", ".join(sorted(warnings)))) ++ return self.getWarnItem("cluster-env/one_dir_per_partition is enabled but there are multiple data directories on the same mount. Affected hosts: {}".format(", ".join(sorted(warnings)))) + + return None + +@@ -803,7 +803,7 @@ + return [] + + def mergeValidators(self, parentValidators, childValidators): +- for service, configsDict in childValidators.iteritems(): ++ for service, configsDict in childValidators.items(): + if service not in parentValidators: + parentValidators[service] = {} + parentValidators[service].update(configsDict) +@@ -831,7 +831,7 @@ + + def getUserOperationContext(services, contextName): + if services: +- if 'user-context' in services.keys(): ++ if 'user-context' in list(services.keys()): + userContext = services["user-context"] + if contextName in userContext: + return userContext[contextName] +@@ -840,7 +840,7 @@ + # if serviceName is being added + def isServiceBeingAdded(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 \ +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.0.6.GlusterFS/services/YARN/package/files/validateYarnComponentStatus.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.0.6.GlusterFS/services/YARN/package/files/validateYarnComponentStatus.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.0.6.GlusterFS/services/YARN/package/files/validateYarnComponentStatus.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.0.6.GlusterFS/services/YARN/package/files/validateYarnComponentStatus.py 2022-07-11 00:52:35.000000000 +0800 +@@ -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 @@ + (stdout, stderr) = proc.communicate() + response = json.loads(stdout) + if response == None: +- print 'There is no response for url: ' + str(url) ++ print(('There is no response for url: ' + str(url))) + raise Exception('There is no response for url: ' + str(url)) + return response + +@@ -58,12 +58,12 @@ + try: + responses[address] = getResponse(path, address, ssl_enabled) + except Exception as e: +- print 'Error checking availability status of component.', e ++ print(('Error checking availability status of component.', e)) + + if not responses: + exit(1) + +- is_valid = validateAvailabilityResponse(component, responses.values()[0]) ++ is_valid = validateAvailabilityResponse(component, list(responses.values())[0]) + if not is_valid: + exit(1) + +@@ -75,7 +75,7 @@ + if rm_state == STARTED_STATE: + return True + else: +- print 'Resourcemanager is not started' ++ print('Resourcemanager is not started') + return False + + elif component == NODEMANAGER: +@@ -93,7 +93,7 @@ + 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 +@@ -103,12 +103,12 @@ + try: + responses[address] = getResponse(path, address, ssl_enabled) + except Exception as e: +- print 'Error checking ability of component.', e ++ print(('Error checking ability of component.', e)) + + if not responses: + exit(1) + +- is_valid = validateAbilityResponse(component, responses.values()[0]) ++ is_valid = validateAbilityResponse(component, list(responses.values())[0]) + if not is_valid: + exit(1) + +@@ -117,24 +117,24 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.0.6.GlusterFS/services/YARN/package/scripts/application_timeline_server.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.0.6.GlusterFS/services/YARN/package/scripts/application_timeline_server.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.0.6.GlusterFS/services/YARN/package/scripts/application_timeline_server.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.0.6.GlusterFS/services/YARN/package/scripts/application_timeline_server.py 2022-07-11 00:52:35.000000000 +0800 +@@ -21,8 +21,8 @@ + + import sys + from resource_management import * +-from yarn import yarn +-from service import service ++from .yarn import yarn ++from .service import service + + class ApplicationTimelineServer(Script): + +@@ -31,23 +31,23 @@ + #self.configure(env) + + def configure(self, env): +- import params ++ from . import params + env.set_params(params) + yarn() + + def start(self, env): +- import params ++ from . import params + env.set_params(params) + self.configure(env) # FOR SECURITY + service('historyserver', action='start') + + def stop(self, env): +- import params ++ from . import params + env.set_params(params) + service('historyserver', action='stop') + + def status(self, env): +- import status_params ++ from . import status_params + env.set_params(status_params) + check_process_status(status_params.yarn_historyserver_pid_file) + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.0.6.GlusterFS/services/YARN/package/scripts/historyserver.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.0.6.GlusterFS/services/YARN/package/scripts/historyserver.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.0.6.GlusterFS/services/YARN/package/scripts/historyserver.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.0.6.GlusterFS/services/YARN/package/scripts/historyserver.py 2022-07-11 00:52:35.000000000 +0800 +@@ -21,31 +21,31 @@ + import sys + from resource_management import * + +-from yarn import yarn +-from service import service ++from .yarn import yarn ++from .service import service + + class Histroryserver(Script): + def install(self, env): + self.install_packages(env) + + def configure(self, env): +- import params ++ from . import params + env.set_params(params) + yarn(name="historyserver") + + def start(self, env): +- import params ++ from . import params + env.set_params(params) + self.configure(env) # FOR SECURITY + service('historyserver', action='start', serviceName='mapreduce') + + def stop(self, env): +- import params ++ from . import params + env.set_params(params) + service('historyserver', action='stop', serviceName='mapreduce') + + def status(self, env): +- import status_params ++ from . import status_params + env.set_params(status_params) + check_process_status(status_params.mapred_historyserver_pid_file) + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.0.6.GlusterFS/services/YARN/package/scripts/mapred_service_check.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.0.6.GlusterFS/services/YARN/package/scripts/mapred_service_check.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.0.6.GlusterFS/services/YARN/package/scripts/mapred_service_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.0.6.GlusterFS/services/YARN/package/scripts/mapred_service_check.py 2022-07-11 00:52:35.000000000 +0800 +@@ -23,7 +23,7 @@ + + class MapReduce2ServiceCheck(Script): + def service_check(self, env): +- import params ++ from . import params + env.set_params(params) + + jar_path = format("{hadoop_mapred2_jar_location}/{hadoopMapredExamplesJarName}") +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.0.6.GlusterFS/services/YARN/package/scripts/mapreduce2_client.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.0.6.GlusterFS/services/YARN/package/scripts/mapreduce2_client.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.0.6.GlusterFS/services/YARN/package/scripts/mapreduce2_client.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.0.6.GlusterFS/services/YARN/package/scripts/mapreduce2_client.py 2022-07-11 00:52:35.000000000 +0800 +@@ -22,7 +22,7 @@ + import sys + from resource_management import * + +-from yarn import yarn ++from .yarn import yarn + + class MapReduce2Client(Script): + +@@ -31,7 +31,7 @@ + self.configure(env) + + def configure(self, env): +- import params ++ from . import params + env.set_params(params) + yarn() + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.0.6.GlusterFS/services/YARN/package/scripts/nodemanager.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.0.6.GlusterFS/services/YARN/package/scripts/nodemanager.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.0.6.GlusterFS/services/YARN/package/scripts/nodemanager.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.0.6.GlusterFS/services/YARN/package/scripts/nodemanager.py 2022-07-11 00:52:35.000000000 +0800 +@@ -22,20 +22,20 @@ + import sys + from resource_management import * + +-from yarn import yarn +-from service import service ++from .yarn import yarn ++from .service import service + + class Nodemanager(Script): + def install(self, env): + self.install_packages(env) + + def configure(self, env): +- import params ++ from . import params + env.set_params(params) + yarn(name="nodemanager") + + def start(self, env): +- import params ++ from . import params + env.set_params(params) + self.configure(env) # FOR SECURITY + service('nodemanager', +@@ -43,7 +43,7 @@ + ) + + def stop(self, env): +- import params ++ from . import params + env.set_params(params) + + service('nodemanager', +@@ -51,7 +51,7 @@ + ) + + def status(self, env): +- import status_params ++ from . import status_params + env.set_params(status_params) + check_process_status(status_params.nodemanager_pid_file) + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.0.6.GlusterFS/services/YARN/package/scripts/params.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.0.6.GlusterFS/services/YARN/package/scripts/params.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.0.6.GlusterFS/services/YARN/package/scripts/params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.0.6.GlusterFS/services/YARN/package/scripts/params.py 2022-07-11 00:52:35.000000000 +0800 +@@ -20,7 +20,7 @@ + """ + + from resource_management import * +-import status_params ++from . import status_params + + # server configurations + config = Script.get_config() +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.0.6.GlusterFS/services/YARN/package/scripts/resourcemanager.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.0.6.GlusterFS/services/YARN/package/scripts/resourcemanager.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.0.6.GlusterFS/services/YARN/package/scripts/resourcemanager.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.0.6.GlusterFS/services/YARN/package/scripts/resourcemanager.py 2022-07-11 00:52:35.000000000 +0800 +@@ -22,8 +22,8 @@ + import sys + from resource_management import * + +-from yarn import yarn +-from service import service ++from .yarn import yarn ++from .service import service + + + class Resourcemanager(Script): +@@ -32,13 +32,13 @@ + self.configure(env) + + def configure(self, env): +- import params ++ from . import params + + env.set_params(params) + yarn(name='resourcemanager') + + def start(self, env): +- import params ++ from . import params + + env.set_params(params) + self.configure(env) # FOR SECURITY +@@ -47,7 +47,7 @@ + ) + + def stop(self, env): +- import params ++ from . import params + + env.set_params(params) + +@@ -56,14 +56,14 @@ + ) + + def status(self, env): +- import status_params ++ from . import status_params + + env.set_params(status_params) + check_process_status(status_params.resourcemanager_pid_file) + pass + + def decommission(self, env): +- import params ++ from . import params + + env.set_params(params) + nm_kinit_cmd = params.nm_kinit_cmd +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.0.6.GlusterFS/services/YARN/package/scripts/service_check.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.0.6.GlusterFS/services/YARN/package/scripts/service_check.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.0.6.GlusterFS/services/YARN/package/scripts/service_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.0.6.GlusterFS/services/YARN/package/scripts/service_check.py 2022-07-11 00:52:35.000000000 +0800 +@@ -24,7 +24,7 @@ + + class ServiceCheck(Script): + def service_check(self, env): +- import params ++ from . import params + env.set_params(params) + + run_yarn_check_cmd = "/usr/bin/yarn node -list" +@@ -48,7 +48,7 @@ + + File(validateStatusFilePath, + content=StaticFile(validateStatusFileName), +- mode=0755 ++ mode=0o755 + ) + + Execute(smoke_cmd, +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.0.6.GlusterFS/services/YARN/package/scripts/service.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.0.6.GlusterFS/services/YARN/package/scripts/service.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.0.6.GlusterFS/services/YARN/package/scripts/service.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.0.6.GlusterFS/services/YARN/package/scripts/service.py 2022-07-11 00:52:35.000000000 +0800 +@@ -24,7 +24,7 @@ + + def service(componentName, action='start', serviceName='yarn'): + +- import params ++ from . import params + + if (serviceName == 'mapreduce' and componentName == 'historyserver'): + daemon = format("{mapred_bin}/mr-jobhistory-daemon.sh") +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.0.6.GlusterFS/services/YARN/package/scripts/status_params.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.0.6.GlusterFS/services/YARN/package/scripts/status_params.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.0.6.GlusterFS/services/YARN/package/scripts/status_params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.0.6.GlusterFS/services/YARN/package/scripts/status_params.py 2022-07-11 00:52:35.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.0.6.GlusterFS/services/YARN/package/scripts/yarn_client.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.0.6.GlusterFS/services/YARN/package/scripts/yarn_client.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.0.6.GlusterFS/services/YARN/package/scripts/yarn_client.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.0.6.GlusterFS/services/YARN/package/scripts/yarn_client.py 2022-07-11 00:52:35.000000000 +0800 +@@ -22,7 +22,7 @@ + import sys + from resource_management import * + +-from yarn import yarn ++from .yarn import yarn + + class YarnClient(Script): + +@@ -31,7 +31,7 @@ + self.configure(env) + + def configure(self, env): +- import params ++ from . import params + env.set_params(params) + yarn() + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.0.6.GlusterFS/services/YARN/package/scripts/yarn.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.0.6.GlusterFS/services/YARN/package/scripts/yarn.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.0.6.GlusterFS/services/YARN/package/scripts/yarn.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.0.6.GlusterFS/services/YARN/package/scripts/yarn.py 2022-07-11 00:52:35.000000000 +0800 +@@ -24,7 +24,7 @@ + + + def yarn(name = None): +- import params ++ from . import params + + + if name in ["nodemanager","historyserver"]: +@@ -33,7 +33,7 @@ + action="create_delayed", + owner=params.yarn_user, + group=params.user_group, +- mode=0777, ++ mode=0o777, + recursive_chmod=True + ) + params.HdfsDirectory("/mapred", +@@ -48,14 +48,14 @@ + action="create_delayed", + owner=params.mapred_user, + group=params.user_group, +- mode=0777 ++ mode=0o777 + ) + + params.HdfsDirectory(params.mapreduce_jobhistory_done_dir, + action="create_delayed", + owner=params.mapred_user, + group=params.user_group, +- mode=01777 ++ mode=0o1777 + ) + params.HdfsDirectory(None, action="create") + +@@ -92,7 +92,7 @@ + configuration_attributes=params.config['configurationAttributes']['core-site'], + owner=params.hdfs_user, + group=params.user_group, +- mode=0644 ++ mode=0o644 + ) + + XmlConfig("mapred-site.xml", +@@ -101,7 +101,7 @@ + configuration_attributes=params.config['configurationAttributes']['mapred-site'], + owner=params.yarn_user, + group=params.user_group, +- mode=0644 ++ mode=0o644 + ) + + XmlConfig("yarn-site.xml", +@@ -110,7 +110,7 @@ + configuration_attributes=params.config['configurationAttributes']['yarn-site'], + owner=params.yarn_user, + group=params.user_group, +- mode=0644 ++ mode=0o644 + ) + + XmlConfig("capacity-scheduler.xml", +@@ -119,7 +119,7 @@ + configuration_attributes=params.config['configurationAttributes']['capacity-scheduler'], + owner=params.yarn_user, + group=params.user_group, +- mode=0644 ++ mode=0o644 + ) + + if name == 'resourcemanager': +@@ -134,19 +134,19 @@ + ) + + 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(format("{config_dir}/yarn-env.sh"), + owner=params.yarn_user, + group=params.user_group, +- mode=0755, ++ mode=0o755, + content=Template('yarn-env.sh.j2') + ) + +@@ -154,12 +154,12 @@ + container_executor = format("{yarn_container_bin}/container-executor") + File(container_executor, + group=params.yarn_executor_container_group, +- mode=06050 ++ mode=0o6050 + ) + + File(format("{config_dir}/container-executor.cfg"), + group=params.user_group, +- mode=0644, ++ mode=0o644, + content=Template('container-executor.cfg.j2') + ) + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.1/services/stack_advisor.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.1/services/stack_advisor.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.1/services/stack_advisor.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.1/services/stack_advisor.py 2022-07-11 00:52:35.000000000 +0800 +@@ -31,7 +31,7 @@ + class HDP21StackAdvisor(HDP206StackAdvisor): + + def __init__(self): +- super(HDP21StackAdvisor, self).__init__() ++ super().__init__() + self.initialize_logger("HDP21StackAdvisor") + + self.modifyMastersWithMultipleInstances() +@@ -46,7 +46,7 @@ + Modify the set of masters with multiple instances. + Must be overriden in child class. + """ +- self.mastersWithMultipleInstances |= set(['ZOOKEEPER_SERVER', 'HBASE_MASTER']) ++ self.mastersWithMultipleInstances |= {'ZOOKEEPER_SERVER', 'HBASE_MASTER'} + + def modifyCardinalitiesDict(self): + """ +@@ -73,14 +73,14 @@ + Modify the set of components whose host assignment is based on other services. + Must be overriden in child class. + """ +- self.notValuableComponents |= set(['JOURNALNODE', 'ZKFC', 'GANGLIA_MONITOR', 'APP_TIMELINE_SERVER']) ++ self.notValuableComponents |= {'JOURNALNODE', 'ZKFC', 'GANGLIA_MONITOR', 'APP_TIMELINE_SERVER'} + + def modifyComponentsNotPreferableOnServer(self): + """ + Modify the set of components that are not preferable on the server. + Must be overriden in child class. + """ +- self.notPreferableOnServerComponents |= set(['STORM_UI_SERVER', 'DRPC_SERVER', 'STORM_REST_API', 'NIMBUS', 'GANGLIA_SERVER', 'METRICS_COLLECTOR']) ++ self.notPreferableOnServerComponents |= {'STORM_UI_SERVER', 'DRPC_SERVER', 'STORM_REST_API', 'NIMBUS', 'GANGLIA_SERVER', 'METRICS_COLLECTOR'} + + def modifyComponentLayoutSchemes(self): + """ +@@ -93,7 +93,7 @@ + """ + + # since old stack advisors are extending each other they should call parent method first +- super(HDP21StackAdvisor, self).modifyComponentLayoutSchemes() ++ super().modifyComponentLayoutSchemes() + + self.componentLayoutSchemes.update({ + 'APP_TIMELINE_SERVER': {31: 1, "else": 2}, +@@ -101,7 +101,7 @@ + }) + + def getServiceConfigurationRecommenderDict(self): +- parentRecommendConfDict = super(HDP21StackAdvisor, self).getServiceConfigurationRecommenderDict() ++ parentRecommendConfDict = super().getServiceConfigurationRecommenderDict() + childRecommendConfDict = { + "OOZIE": self.recommendOozieConfigurations, + "HIVE": self.recommendHiveConfigurations, +@@ -127,7 +127,7 @@ + self.updateMountProperties("falcon-startup.properties", falcon_mounts, configurations, services, hosts) + + def recommendOozieConfigurations(self, configurations, clusterData, services, hosts): +- super(HDP21StackAdvisor, self).recommendOozieConfigurations(configurations, clusterData, services, hosts) ++ super().recommendOozieConfigurations(configurations, clusterData, services, hosts) + + oozieSiteProperties = self.getSiteProperties(services['configurations'], 'oozie-site') + oozieEnvProperties = self.getSiteProperties(services['configurations'], 'oozie-env') +@@ -140,20 +140,20 @@ + if "falcon-env" in services["configurations"] and "falcon_user" in services["configurations"]["falcon-env"]["properties"]: + falconUser = services["configurations"]["falcon-env"]["properties"]["falcon_user"] + if falconUser is not None: +- putOozieSiteProperty("oozie.service.ProxyUserService.proxyuser.{0}.groups".format(falconUser) , "*") +- putOozieSiteProperty("oozie.service.ProxyUserService.proxyuser.{0}.hosts".format(falconUser) , "*") ++ putOozieSiteProperty("oozie.service.ProxyUserService.proxyuser.{}.groups".format(falconUser) , "*") ++ putOozieSiteProperty("oozie.service.ProxyUserService.proxyuser.{}.hosts".format(falconUser) , "*") + falconUserOldValue = self.getOldValue(services, "falcon-env", "falcon_user") + if falconUserOldValue is not None: + if 'forced-configurations' not in services: + services["forced-configurations"] = [] + putOozieSitePropertyAttribute = self.putPropertyAttribute(configurations, "oozie-site") +- putOozieSitePropertyAttribute("oozie.service.ProxyUserService.proxyuser.{0}.groups".format(falconUserOldValue), 'delete', 'true') +- putOozieSitePropertyAttribute("oozie.service.ProxyUserService.proxyuser.{0}.hosts".format(falconUserOldValue), 'delete', 'true') +- services["forced-configurations"].append({"type" : "oozie-site", "name" : "oozie.service.ProxyUserService.proxyuser.{0}.hosts".format(falconUserOldValue)}) +- services["forced-configurations"].append({"type" : "oozie-site", "name" : "oozie.service.ProxyUserService.proxyuser.{0}.groups".format(falconUserOldValue)}) ++ putOozieSitePropertyAttribute("oozie.service.ProxyUserService.proxyuser.{}.groups".format(falconUserOldValue), 'delete', 'true') ++ putOozieSitePropertyAttribute("oozie.service.ProxyUserService.proxyuser.{}.hosts".format(falconUserOldValue), 'delete', 'true') ++ services["forced-configurations"].append({"type" : "oozie-site", "name" : "oozie.service.ProxyUserService.proxyuser.{}.hosts".format(falconUserOldValue)}) ++ services["forced-configurations"].append({"type" : "oozie-site", "name" : "oozie.service.ProxyUserService.proxyuser.{}.groups".format(falconUserOldValue)}) + if falconUser is not None: +- services["forced-configurations"].append({"type" : "oozie-site", "name" : "oozie.service.ProxyUserService.proxyuser.{0}.hosts".format(falconUser)}) +- services["forced-configurations"].append({"type" : "oozie-site", "name" : "oozie.service.ProxyUserService.proxyuser.{0}.groups".format(falconUser)}) ++ services["forced-configurations"].append({"type" : "oozie-site", "name" : "oozie.service.ProxyUserService.proxyuser.{}.hosts".format(falconUser)}) ++ services["forced-configurations"].append({"type" : "oozie-site", "name" : "oozie.service.ProxyUserService.proxyuser.{}.groups".format(falconUser)}) + + putMapredProperty = self.putProperty(configurations, "oozie-site") + putMapredProperty("oozie.services.ext", +@@ -211,13 +211,13 @@ + ambari_user = self.getAmbariUser(services) + ambariHostName = socket.getfqdn() + webHcatSiteProperty = self.putProperty(configurations, "webhcat-site", services) +- webHcatSiteProperty("webhcat.proxyuser.{0}.hosts".format(ambari_user), ambariHostName) +- webHcatSiteProperty("webhcat.proxyuser.{0}.groups".format(ambari_user), "*") ++ webHcatSiteProperty("webhcat.proxyuser.{}.hosts".format(ambari_user), ambariHostName) ++ webHcatSiteProperty("webhcat.proxyuser.{}.groups".format(ambari_user), "*") + old_ambari_user = self.getOldAmbariUser(services) + if old_ambari_user is not None: + webHcatSitePropertyAttributes = self.putPropertyAttribute(configurations, "webhcat-site") +- webHcatSitePropertyAttributes("webhcat.proxyuser.{0}.hosts".format(old_ambari_user), 'delete', 'true') +- webHcatSitePropertyAttributes("webhcat.proxyuser.{0}.groups".format(old_ambari_user), 'delete', 'true') ++ webHcatSitePropertyAttributes("webhcat.proxyuser.{}.hosts".format(old_ambari_user), 'delete', 'true') ++ webHcatSitePropertyAttributes("webhcat.proxyuser.{}.groups".format(old_ambari_user), 'delete', 'true') + + if "HDFS" in servicesList or "YARN" in servicesList: + if self.is_secured_cluster(services): +@@ -238,7 +238,7 @@ + putTezProperty("tez.queue.name", recommended_tez_queue) + + def getServiceConfigurationValidators(self): +- parentValidators = super(HDP21StackAdvisor, self).getServiceConfigurationValidators() ++ parentValidators = super().getServiceConfigurationValidators() + childValidators = { + "HIVE": {"hive-site": self.validateHiveConfigurations}, + "TEZ": {"tez-site": self.validateTezConfigurations} +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/FALCON/package/scripts/falcon.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/FALCON/package/scripts/falcon.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/FALCON/package/scripts/falcon.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/FALCON/package/scripts/falcon.py 2022-07-11 00:52:35.000000000 +0800 +@@ -39,15 +39,15 @@ + ) + PropertiesFile(params.falcon_conf_dir + '/client.properties', + properties=params.falcon_client_properties, +- mode=0644 ++ mode=0o644 + ) + PropertiesFile(params.falcon_conf_dir + '/runtime.properties', + properties=params.falcon_runtime_properties, +- mode=0644 ++ mode=0o644 + ) + PropertiesFile(params.falcon_conf_dir + '/startup.properties', + properties=params.falcon_startup_properties, +- mode=0644 ++ mode=0o644 + ) + if type == 'server': + if action == 'config': +@@ -55,12 +55,12 @@ + params.HdfsDirectory(params.store_uri, + action="create_delayed", + owner=params.falcon_user, +- mode=0755 ++ mode=0o755 + ) + params.HdfsDirectory(params.flacon_apps_dir, + action="create_delayed", + owner=params.falcon_user, +- mode=0777#TODO change to proper mode ++ mode=0o777#TODO change to proper mode + ) + params.HdfsDirectory(None, action="create") + Directory(params.falcon_local_dir, +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/STORM/package/scripts/drpc_server.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/STORM/package/scripts/drpc_server.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/STORM/package/scripts/drpc_server.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/STORM/package/scripts/drpc_server.py 2022-07-11 00:52:35.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/STORM/package/scripts/nimbus_prod.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/STORM/package/scripts/nimbus_prod.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/STORM/package/scripts/nimbus_prod.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/STORM/package/scripts/nimbus_prod.py 2022-07-11 00:52:35.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/STORM/package/scripts/nimbus.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/STORM/package/scripts/nimbus.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/STORM/package/scripts/nimbus.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/STORM/package/scripts/nimbus.py 2022-07-11 00:52:35.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/STORM/package/scripts/params.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/STORM/package/scripts/params.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/STORM/package/scripts/params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/STORM/package/scripts/params.py 2022-07-11 00:52:35.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/STORM/package/scripts/rest_api.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/STORM/package/scripts/rest_api.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/STORM/package/scripts/rest_api.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/STORM/package/scripts/rest_api.py 2022-07-11 00:52:35.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/STORM/package/scripts/service_check.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/STORM/package/scripts/service_check.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/STORM/package/scripts/service_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/STORM/package/scripts/service_check.py 2022-07-11 00:52:35.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/STORM/package/scripts/service.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/STORM/package/scripts/service.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/STORM/package/scripts/service.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/STORM/package/scripts/service.py 2022-07-11 00:52:35.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + """ + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file +@@ -40,7 +40,7 @@ + if name == 'ui': + process_cmd = "^java.+backtype.storm.ui.core$" + elif name == "rest_api": +- process_cmd = format("{java64_home}/bin/java -jar {rest_lib_dir}/`ls {rest_lib_dir} | grep -wE storm-rest-[0-9.-]+\.jar` server") ++ process_cmd = format(r"{java64_home}/bin/java -jar {rest_lib_dir}/`ls {rest_lib_dir} | grep -wE storm-rest-[0-9.-]+\.jar` server") + else: + process_cmd = format("^java.+backtype.storm.daemon.{name}$") + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/STORM/package/scripts/status_params.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/STORM/package/scripts/status_params.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/STORM/package/scripts/status_params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/STORM/package/scripts/status_params.py 2022-07-11 00:52:35.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/STORM/package/scripts/storm.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/STORM/package/scripts/storm.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/STORM/package/scripts/storm.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/STORM/package/scripts/storm.py 2022-07-11 00:52:35.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/STORM/package/scripts/supervisord_service.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/STORM/package/scripts/supervisord_service.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/STORM/package/scripts/supervisord_service.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/STORM/package/scripts/supervisord_service.py 2022-07-11 00:52:35.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/STORM/package/scripts/supervisor_prod.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/STORM/package/scripts/supervisor_prod.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/STORM/package/scripts/supervisor_prod.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/STORM/package/scripts/supervisor_prod.py 2022-07-11 00:52:35.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/STORM/package/scripts/supervisor.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/STORM/package/scripts/supervisor.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/STORM/package/scripts/supervisor.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/STORM/package/scripts/supervisor.py 2022-07-11 00:52:35.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/STORM/package/scripts/ui_server.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/STORM/package/scripts/ui_server.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/STORM/package/scripts/ui_server.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/STORM/package/scripts/ui_server.py 2022-07-11 00:52:35.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/STORM/package/scripts/yaml_config.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/STORM/package/scripts/yaml_config.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/STORM/package/scripts/yaml_config.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/STORM/package/scripts/yaml_config.py 2022-07-11 00:52:35.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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,7 +29,7 @@ + unquouted = True + + # if is list [a,b,c] +- if re.match('^\w*\[.+\]\w*$', value): ++ if re.match(r'^\w*\[.+\]\w*$', value): + unquouted = True + + try: +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/TEZ/package/scripts/params.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/TEZ/package/scripts/params.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/TEZ/package/scripts/params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/TEZ/package/scripts/params.py 2022-07-11 00:52:35.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/TEZ/package/scripts/tez.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/TEZ/package/scripts/tez.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/TEZ/package/scripts/tez.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/TEZ/package/scripts/tez.py 2022-07-11 00:52:35.000000000 +0800 +@@ -36,7 +36,7 @@ + configuration_attributes=params.config['configurationAttributes']['tez-site'], + owner = params.tez_user, + group = params.user_group, +- mode = 0664 ++ mode = 0o664 + ) + + tez_TemplateConfig( ['tez-env.sh']) +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/YARN/package/files/validateYarnComponentStatus.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/YARN/package/files/validateYarnComponentStatus.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/YARN/package/files/validateYarnComponentStatus.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/YARN/package/files/validateYarnComponentStatus.py 2022-07-11 00:52:35.000000000 +0800 +@@ -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 @@ + (stdout, stderr) = proc.communicate() + response = json.loads(stdout) + if response == None: +- print 'There is no response for url: ' + str(url) ++ print(('There is no response for url: ' + str(url))) + raise Exception('There is no response for url: ' + str(url)) + return response + +@@ -58,12 +58,12 @@ + try: + responses[address] = getResponse(path, address, ssl_enabled) + except Exception as e: +- print 'Error checking availability status of component.', e ++ print(('Error checking availability status of component.', e)) + + if not responses: + exit(1) + +- is_valid = validateAvailabilityResponse(component, responses.values()[0]) ++ is_valid = validateAvailabilityResponse(component, list(responses.values())[0]) + if not is_valid: + exit(1) + +@@ -75,7 +75,7 @@ + if rm_state == STARTED_STATE: + return True + else: +- print 'Resourcemanager is not started' ++ print('Resourcemanager is not started') + return False + + elif component == NODEMANAGER: +@@ -93,7 +93,7 @@ + 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 +@@ -103,12 +103,12 @@ + try: + responses[address] = getResponse(path, address, ssl_enabled) + except Exception as e: +- print 'Error checking ability of component.', e ++ print(('Error checking ability of component.', e)) + + if not responses: + exit(1) + +- is_valid = validateAbilityResponse(component, responses.values()[0]) ++ is_valid = validateAbilityResponse(component, list(responses.values())[0]) + if not is_valid: + exit(1) + +@@ -117,24 +117,24 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/YARN/package/scripts/application_timeline_server.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/YARN/package/scripts/application_timeline_server.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/YARN/package/scripts/application_timeline_server.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/YARN/package/scripts/application_timeline_server.py 2022-07-11 00:52:35.000000000 +0800 +@@ -21,8 +21,8 @@ + + import sys + from resource_management import * +-from yarn import yarn +-from service import service ++from .yarn import yarn ++from .service import service + + class ApplicationTimelineServer(Script): + +@@ -31,23 +31,23 @@ + #self.configure(env) + + def configure(self, env): +- import params ++ from . import params + env.set_params(params) + yarn() + + def start(self, env): +- import params ++ from . import params + env.set_params(params) + self.configure(env) # FOR SECURITY + service('historyserver', action='start') + + def stop(self, env): +- import params ++ from . import params + env.set_params(params) + service('historyserver', action='stop') + + def status(self, env): +- import status_params ++ from . import status_params + env.set_params(status_params) + check_process_status(status_params.yarn_historyserver_pid_file) + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/YARN/package/scripts/historyserver.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/YARN/package/scripts/historyserver.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/YARN/package/scripts/historyserver.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/YARN/package/scripts/historyserver.py 2022-07-11 00:52:35.000000000 +0800 +@@ -21,31 +21,31 @@ + import sys + from resource_management import * + +-from yarn import yarn +-from service import service ++from .yarn import yarn ++from .service import service + + class Histroryserver(Script): + def install(self, env): + self.install_packages(env) + + def configure(self, env): +- import params ++ from . import params + env.set_params(params) + yarn(name="historyserver") + + def start(self, env): +- import params ++ from . import params + env.set_params(params) + self.configure(env) # FOR SECURITY + service('historyserver', action='start', serviceName='mapreduce') + + def stop(self, env): +- import params ++ from . import params + env.set_params(params) + service('historyserver', action='stop', serviceName='mapreduce') + + def status(self, env): +- import status_params ++ from . import status_params + env.set_params(status_params) + check_process_status(status_params.mapred_historyserver_pid_file) + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/YARN/package/scripts/mapred_service_check.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/YARN/package/scripts/mapred_service_check.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/YARN/package/scripts/mapred_service_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/YARN/package/scripts/mapred_service_check.py 2022-07-11 00:52:35.000000000 +0800 +@@ -23,7 +23,7 @@ + + class MapReduce2ServiceCheck(Script): + def service_check(self, env): +- import params ++ from . import params + env.set_params(params) + + jar_path = format("{hadoop_mapred2_jar_location}/{hadoopMapredExamplesJarName}") +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/YARN/package/scripts/mapreduce2_client.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/YARN/package/scripts/mapreduce2_client.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/YARN/package/scripts/mapreduce2_client.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/YARN/package/scripts/mapreduce2_client.py 2022-07-11 00:52:35.000000000 +0800 +@@ -22,7 +22,7 @@ + import sys + from resource_management import * + +-from yarn import yarn ++from .yarn import yarn + + class MapReduce2Client(Script): + +@@ -31,7 +31,7 @@ + self.configure(env) + + def configure(self, env): +- import params ++ from . import params + env.set_params(params) + yarn() + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/YARN/package/scripts/nodemanager.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/YARN/package/scripts/nodemanager.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/YARN/package/scripts/nodemanager.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/YARN/package/scripts/nodemanager.py 2022-07-11 00:52:35.000000000 +0800 +@@ -22,20 +22,20 @@ + import sys + from resource_management import * + +-from yarn import yarn +-from service import service ++from .yarn import yarn ++from .service import service + + class Nodemanager(Script): + def install(self, env): + self.install_packages(env) + + def configure(self, env): +- import params ++ from . import params + env.set_params(params) + yarn(name="nodemanager") + + def start(self, env): +- import params ++ from . import params + env.set_params(params) + self.configure(env) # FOR SECURITY + service('nodemanager', +@@ -43,7 +43,7 @@ + ) + + def stop(self, env): +- import params ++ from . import params + env.set_params(params) + + service('nodemanager', +@@ -51,7 +51,7 @@ + ) + + def status(self, env): +- import status_params ++ from . import status_params + env.set_params(status_params) + check_process_status(status_params.nodemanager_pid_file) + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/YARN/package/scripts/params.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/YARN/package/scripts/params.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/YARN/package/scripts/params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/YARN/package/scripts/params.py 2022-07-11 00:52:35.000000000 +0800 +@@ -20,7 +20,7 @@ + """ + + from resource_management import * +-import status_params ++from . import status_params + + # server configurations + config = Script.get_config() +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/YARN/package/scripts/resourcemanager.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/YARN/package/scripts/resourcemanager.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/YARN/package/scripts/resourcemanager.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/YARN/package/scripts/resourcemanager.py 2022-07-11 00:52:35.000000000 +0800 +@@ -22,8 +22,8 @@ + import sys + from resource_management import * + +-from yarn import yarn +-from service import service ++from .yarn import yarn ++from .service import service + + + class Resourcemanager(Script): +@@ -32,13 +32,13 @@ + self.configure(env) + + def configure(self, env): +- import params ++ from . import params + + env.set_params(params) + yarn(name='resourcemanager') + + def start(self, env): +- import params ++ from . import params + + env.set_params(params) + self.configure(env) # FOR SECURITY +@@ -47,7 +47,7 @@ + ) + + def stop(self, env): +- import params ++ from . import params + + env.set_params(params) + +@@ -56,14 +56,14 @@ + ) + + def status(self, env): +- import status_params ++ from . import status_params + + env.set_params(status_params) + check_process_status(status_params.resourcemanager_pid_file) + pass + + def decommission(self, env): +- import params ++ from . import params + + env.set_params(params) + nm_kinit_cmd = params.nm_kinit_cmd +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/YARN/package/scripts/service_check.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/YARN/package/scripts/service_check.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/YARN/package/scripts/service_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/YARN/package/scripts/service_check.py 2022-07-11 00:52:35.000000000 +0800 +@@ -24,7 +24,7 @@ + + class ServiceCheck(Script): + def service_check(self, env): +- import params ++ from . import params + env.set_params(params) + + run_yarn_check_cmd = "/usr/bin/yarn node -list" +@@ -48,7 +48,7 @@ + + File(validateStatusFilePath, + content=StaticFile(validateStatusFileName), +- mode=0755 ++ mode=0o755 + ) + + Execute(smoke_cmd, +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/YARN/package/scripts/service.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/YARN/package/scripts/service.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/YARN/package/scripts/service.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/YARN/package/scripts/service.py 2022-07-11 00:52:35.000000000 +0800 +@@ -24,7 +24,7 @@ + + def service(componentName, action='start', serviceName='yarn'): + +- import params ++ from . import params + + if (serviceName == 'mapreduce' and componentName == 'historyserver'): + daemon = format("{mapred_bin}/mr-jobhistory-daemon.sh") +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/YARN/package/scripts/status_params.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/YARN/package/scripts/status_params.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/YARN/package/scripts/status_params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/YARN/package/scripts/status_params.py 2022-07-11 00:52:35.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/YARN/package/scripts/yarn_client.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/YARN/package/scripts/yarn_client.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/YARN/package/scripts/yarn_client.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/YARN/package/scripts/yarn_client.py 2022-07-11 00:52:35.000000000 +0800 +@@ -22,7 +22,7 @@ + import sys + from resource_management import * + +-from yarn import yarn ++from .yarn import yarn + + class YarnClient(Script): + +@@ -31,7 +31,7 @@ + self.configure(env) + + def configure(self, env): +- import params ++ from . import params + env.set_params(params) + yarn() + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/YARN/package/scripts/yarn.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/YARN/package/scripts/yarn.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/YARN/package/scripts/yarn.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.1.GlusterFS/services/YARN/package/scripts/yarn.py 2022-07-11 00:52:35.000000000 +0800 +@@ -24,7 +24,7 @@ + + + def yarn(name = None): +- import params ++ from . import params + + + if name in ["nodemanager","historyserver"]: +@@ -33,7 +33,7 @@ + action="create_delayed", + owner=params.yarn_user, + group=params.user_group, +- mode=0777, ++ mode=0o777, + recursive_chmod=True + ) + params.HdfsDirectory("/mapred", +@@ -48,14 +48,14 @@ + action="create_delayed", + owner=params.mapred_user, + group=params.user_group, +- mode=0777 ++ mode=0o777 + ) + + params.HdfsDirectory(params.mapreduce_jobhistory_done_dir, + action="create_delayed", + owner=params.mapred_user, + group=params.user_group, +- mode=01777 ++ mode=0o1777 + ) + params.HdfsDirectory(None, action="create") + +@@ -92,7 +92,7 @@ + configuration_attributes=params.config['configurationAttributes']['core-site'], + owner=params.hdfs_user, + group=params.user_group, +- mode=0644 ++ mode=0o644 + ) + + XmlConfig("mapred-site.xml", +@@ -101,7 +101,7 @@ + configuration_attributes=params.config['configurationAttributes']['mapred-site'], + owner=params.yarn_user, + group=params.user_group, +- mode=0644 ++ mode=0o644 + ) + + XmlConfig("yarn-site.xml", +@@ -110,7 +110,7 @@ + configuration_attributes=params.config['configurationAttributes']['yarn-site'], + owner=params.yarn_user, + group=params.user_group, +- mode=0644 ++ mode=0o644 + ) + + XmlConfig("capacity-scheduler.xml", +@@ -119,7 +119,7 @@ + configuration_attributes=params.config['configurationAttributes']['capacity-scheduler'], + owner=params.yarn_user, + group=params.user_group, +- mode=0644 ++ mode=0o644 + ) + + if name == 'resourcemanager': +@@ -134,19 +134,19 @@ + ) + + 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(format("{config_dir}/yarn-env.sh"), + owner=params.yarn_user, + group=params.user_group, +- mode=0755, ++ mode=0o755, + content=Template('yarn-env.sh.j2') + ) + +@@ -154,12 +154,12 @@ + container_executor = format("{yarn_container_bin}/container-executor") + File(container_executor, + group=params.yarn_executor_container_group, +- mode=06050 ++ mode=0o6050 + ) + + File(format("{config_dir}/container-executor.cfg"), + group=params.user_group, +- mode=0644, ++ mode=0o644, + content=Template('container-executor.cfg.j2') + ) + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.2/services/stack_advisor.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.2/services/stack_advisor.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.2/services/stack_advisor.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.2/services/stack_advisor.py 2022-07-11 00:52:35.000000000 +0800 +@@ -20,7 +20,7 @@ + # Python Imports + import math + from math import floor +-from urlparse import urlparse ++from urllib.parse import urlparse + import os + import fnmatch + import socket +@@ -38,7 +38,7 @@ + class HDP22StackAdvisor(HDP21StackAdvisor): + + def __init__(self): +- super(HDP22StackAdvisor, self).__init__() ++ super().__init__() + self.initialize_logger("HDP22StackAdvisor") + + self.modifyMastersWithMultipleInstances() +@@ -52,7 +52,7 @@ + Modify the set of masters with multiple instances. + Must be overriden in child class. + """ +- self.mastersWithMultipleInstances |= set(['METRICS_COLLECTOR']) ++ self.mastersWithMultipleInstances |= {'METRICS_COLLECTOR'} + + def modifyCardinalitiesDict(self): + """ +@@ -78,7 +78,7 @@ + Modify the set of components whose host assignment is based on other services. + Must be overriden in child class. + """ +- self.notValuableComponents |= set(['METRICS_MONITOR']) ++ self.notValuableComponents |= {'METRICS_MONITOR'} + + def modifyComponentsNotPreferableOnServer(self): + """ +@@ -89,7 +89,7 @@ + pass + + def getServiceConfigurationRecommenderDict(self): +- parentRecommendConfDict = super(HDP22StackAdvisor, self).getServiceConfigurationRecommenderDict() ++ parentRecommendConfDict = super().getServiceConfigurationRecommenderDict() + childRecommendConfDict = { + "HDFS": self.recommendHDFSConfigurations, + "HIVE": self.recommendHIVEConfigurations, +@@ -134,7 +134,7 @@ + putSparkThriftSparkConf("spark.yarn.queue", recommended_spark_queue) + + def recommendYARNConfigurations(self, configurations, clusterData, services, hosts): +- super(HDP22StackAdvisor, self).recommendYARNConfigurations(configurations, clusterData, services, hosts) ++ super().recommendYARNConfigurations(configurations, clusterData, services, hosts) + putYarnProperty = self.putProperty(configurations, "yarn-site", services) + putYarnProperty('yarn.nodemanager.resource.cpu-vcores', clusterData['cpu']) + putYarnProperty('yarn.scheduler.minimum-allocation-vcores', 1) +@@ -185,7 +185,7 @@ + putYarnProperty('hadoop.registry.rm.enabled', 'false') + + def recommendHDFSConfigurations(self, configurations, clusterData, services, hosts): +- super(HDP22StackAdvisor, self).recommendHDFSConfigurations(configurations, clusterData, services, hosts) ++ super().recommendHDFSConfigurations(configurations, clusterData, services, hosts) + putHdfsSiteProperty = self.putProperty(configurations, "hdfs-site", services) + putHdfsSitePropertyAttribute = self.putPropertyAttribute(configurations, "hdfs-site") + putHdfsSiteProperty("dfs.datanode.max.transfer.threads", 16384 if clusterData["hBaseInstalled"] else 4096) +@@ -344,7 +344,7 @@ + putHdfsSitePropertyAttribute('dfs.encryption.key.provider.uri','delete','true') + + def recommendHIVEConfigurations(self, configurations, clusterData, services, hosts): +- super(HDP22StackAdvisor, self).recommendHiveConfigurations(configurations, clusterData, services, hosts) ++ super().recommendHiveConfigurations(configurations, clusterData, services, hosts) + + putHiveServerProperty = self.putProperty(configurations, "hiveserver2-site", services) + putHiveEnvProperty = self.putProperty(configurations, "hive-env", services) +@@ -660,7 +660,7 @@ + + + def recommendHBASEConfigurations(self, configurations, clusterData, services, hosts): +- super(HDP22StackAdvisor, self).recommendHbaseConfigurations(configurations, clusterData, services, hosts) ++ super().recommendHbaseConfigurations(configurations, clusterData, services, hosts) + putHbaseEnvPropertyAttributes = self.putPropertyAttribute(configurations, "hbase-env") + + hmaster_host = self.getHostWithComponent("HBASE", "HBASE_MASTER", services, hosts) +@@ -726,7 +726,7 @@ + bucketcache_offheap_memory = regionserver_max_direct_memory_size - reserved_offheap_memory + hbase_bucketcache_size = bucketcache_offheap_memory + hbase_bucketcache_percentage_in_combinedcache = float(bucketcache_offheap_memory) / hbase_bucketcache_size +- hbase_bucketcache_percentage_in_combinedcache_str = "{0:.4f}".format(math.ceil(hbase_bucketcache_percentage_in_combinedcache * 10000) / 10000.0) ++ hbase_bucketcache_percentage_in_combinedcache_str = "{:.4f}".format(math.ceil(hbase_bucketcache_percentage_in_combinedcache * 10000) / 10000.0) + + # Set values in hbase-site + putHbaseSiteProperty('hfile.block.cache.size', hfile_block_cache_size) +@@ -831,7 +831,7 @@ + rangerClass = 'org.apache.ranger.authorization.hbase.RangerAuthorizationCoprocessor' + + nonRangerClass = 'org.apache.hadoop.hbase.security.access.AccessController' +- hbaseClassConfigs = hbaseCoProcessorConfigs.keys() ++ hbaseClassConfigs = list(hbaseCoProcessorConfigs.keys()) + + for item in range(len(hbaseClassConfigs)): + if 'hbase-site' in services['configurations']: +@@ -841,7 +841,7 @@ + else: + coprocessorConfig = services['configurations']['hbase-site']['properties'][hbaseClassConfigs[item]] + coprocessorClasses = coprocessorConfig.split(",") +- coprocessorClasses = filter(None, coprocessorClasses) # Removes empty string elements from array ++ coprocessorClasses = [_f for _f in coprocessorClasses if _f] # Removes empty string elements from array + if rangerPluginEnabled and rangerPluginEnabled.lower() == 'Yes'.lower(): + if nonRangerClass in coprocessorClasses: + coprocessorClasses.remove(nonRangerClass) +@@ -912,12 +912,12 @@ + pass + + if has_tez_view: +- tez_url = '{0}://{1}:{2}/#/main/view/TEZ/tez_cluster_instance'.format(server_protocol, server_host, server_port) ++ tez_url = '{}://{}:{}/#/main/view/TEZ/tez_cluster_instance'.format(server_protocol, server_host, server_port) + putTezProperty("tez.tez-ui.history-url.base", tez_url) + pass + + def recommendStormConfigurations(self, configurations, clusterData, services, hosts): +- super(HDP22StackAdvisor, self).recommendStormConfigurations(configurations, clusterData, services, hosts) ++ super().recommendStormConfigurations(configurations, clusterData, services, hosts) + putStormSiteProperty = self.putProperty(configurations, "storm-site", services) + putStormSiteAttributes = self.putPropertyAttribute(configurations, "storm-site") + storm_site = getServicesSiteProperties(services, "storm-site") +@@ -1022,7 +1022,7 @@ + + + def recommendRangerConfigurations(self, configurations, clusterData, services, hosts): +- super(HDP22StackAdvisor, self).recommendRangerConfigurations(configurations, clusterData, services, hosts) ++ super().recommendRangerConfigurations(configurations, clusterData, services, hosts) + putRangerEnvProperty = self.putProperty(configurations, "ranger-env") + cluster_env = getServicesSiteProperties(services, "cluster-env") + security_enabled = cluster_env is not None and "security_enabled" in cluster_env and \ +@@ -1031,7 +1031,7 @@ + putRangerEnvProperty("ranger-storm-plugin-enabled", "No") + + def getServiceConfigurationValidators(self): +- parentValidators = super(HDP22StackAdvisor, self).getServiceConfigurationValidators() ++ parentValidators = super().getServiceConfigurationValidators() + childValidators = { + "HDFS": {"hdfs-site": self.validateHDFSConfigurations, + "hadoop-env": self.validateHDFSConfigurationsEnv, +@@ -1075,11 +1075,11 @@ + if int(tez_site[prop_name1]) > yarnMaxAllocationSize: + validationItems.append({"config-name": prop_name1, + "item": self.getWarnItem( +- "{0} should be less than YARN max allocation size ({1})".format(prop_name1, yarnMaxAllocationSize))}) ++ "{} should be less than YARN max allocation size ({})".format(prop_name1, yarnMaxAllocationSize))}) + if int(tez_site[prop_name2]) > yarnMaxAllocationSize: + validationItems.append({"config-name": prop_name2, + "item": self.getWarnItem( +- "{0} should be less than YARN max allocation size ({1})".format(prop_name2, yarnMaxAllocationSize))}) ++ "{} should be less than YARN max allocation size ({})".format(prop_name2, yarnMaxAllocationSize))}) + + return self.toConfigurationValidationProblems(validationItems, "tez-site") + +@@ -1148,21 +1148,21 @@ + mapreduceMapJavaOpts = self.formatXmxSizeToBytes(self.getXmxSize(properties['mapreduce.map.java.opts'])) / (1024.0 * 1024) + mapreduceMapMemoryMb = self.to_number(properties['mapreduce.map.memory.mb']) + if mapreduceMapJavaOpts > mapreduceMapMemoryMb: +- validationItems.append({"config-name": 'mapreduce.map.java.opts', "item": self.getWarnItem("mapreduce.map.java.opts Xmx should be less than mapreduce.map.memory.mb ({0})".format(mapreduceMapMemoryMb))}) ++ validationItems.append({"config-name": 'mapreduce.map.java.opts', "item": self.getWarnItem("mapreduce.map.java.opts Xmx should be less than mapreduce.map.memory.mb ({})".format(mapreduceMapMemoryMb))}) + + if 'mapreduce.reduce.java.opts' in properties and \ + self.checkXmxValueFormat(properties['mapreduce.reduce.java.opts']): + mapreduceReduceJavaOpts = self.formatXmxSizeToBytes(self.getXmxSize(properties['mapreduce.reduce.java.opts'])) / (1024.0 * 1024) + mapreduceReduceMemoryMb = self.to_number(properties['mapreduce.reduce.memory.mb']) + if mapreduceReduceJavaOpts > mapreduceReduceMemoryMb: +- validationItems.append({"config-name": 'mapreduce.reduce.java.opts', "item": self.getWarnItem("mapreduce.reduce.java.opts Xmx should be less than mapreduce.reduce.memory.mb ({0})".format(mapreduceReduceMemoryMb))}) ++ validationItems.append({"config-name": 'mapreduce.reduce.java.opts', "item": self.getWarnItem("mapreduce.reduce.java.opts Xmx should be less than mapreduce.reduce.memory.mb ({})".format(mapreduceReduceMemoryMb))}) + + if 'yarn.app.mapreduce.am.command-opts' in properties and \ + self.checkXmxValueFormat(properties['yarn.app.mapreduce.am.command-opts']): + yarnAppMapreduceAmCommandOpts = self.formatXmxSizeToBytes(self.getXmxSize(properties['yarn.app.mapreduce.am.command-opts'])) / (1024.0 * 1024) + yarnAppMapreduceAmResourceMb = self.to_number(properties['yarn.app.mapreduce.am.resource.mb']) + if yarnAppMapreduceAmCommandOpts > yarnAppMapreduceAmResourceMb: +- validationItems.append({"config-name": 'yarn.app.mapreduce.am.command-opts', "item": self.getWarnItem("yarn.app.mapreduce.am.command-opts Xmx should be less than yarn.app.mapreduce.am.resource.mb ({0})".format(yarnAppMapreduceAmResourceMb))}) ++ validationItems.append({"config-name": 'yarn.app.mapreduce.am.command-opts', "item": self.getWarnItem("yarn.app.mapreduce.am.command-opts Xmx should be less than yarn.app.mapreduce.am.resource.mb ({})".format(yarnAppMapreduceAmResourceMb))}) + + return self.toConfigurationValidationProblems(validationItems, "mapred-site") + +@@ -1189,7 +1189,7 @@ + + + def validateHDFSConfigurations(self, properties, recommendedDefaults, configurations, services, hosts): +- parentValidationProblems = super(HDP22StackAdvisor, self).validateHDFSConfigurations(properties, recommendedDefaults, configurations, services, hosts) ++ parentValidationProblems = super().validateHDFSConfigurations(properties, recommendedDefaults, configurations, services, hosts) + # We can not access property hadoop.security.authentication from the + # other config (core-site). That's why we are using another heuristics here + hdfs_site = properties +@@ -1278,7 +1278,7 @@ + if dfs_http_policy_value not in VALID_HTTP_POLICY_VALUES: + validationItems.append({"config-name": dfs_http_policy, + "item": self.getWarnItem( +- "Invalid property value: {0}. Valid values are {1}".format( ++ "Invalid property value: {}. Valid values are {}".format( + dfs_http_policy_value, VALID_HTTP_POLICY_VALUES))}) + + # determine whether we use secure ports +@@ -1325,7 +1325,7 @@ + elif not data_transfer_protection_value in VALID_TRANSFER_PROTECTION_VALUES: + validationItems.append({"config-name": data_transfer_protection, + "item": self.getWarnItem( +- "Invalid property value: {0}. Valid values are {1}.".format( ++ "Invalid property value: {}. Valid values are {}.".format( + data_transfer_protection_value, VALID_TRANSFER_PROTECTION_VALUES))}) + validationProblems = self.toConfigurationValidationProblems(validationItems, "hdfs-site") + validationProblems.extend(parentValidationProblems) +@@ -1349,21 +1349,21 @@ + validationItems.append({"config-name": prop_name, + "item": self.getWarnItem( + "If Ranger Hive Plugin is enabled."\ +- " {0} under hiveserver2-site needs to be set to {1}".format(prop_name,prop_val))}) ++ " {} under hiveserver2-site needs to be set to {}".format(prop_name,prop_val))}) + prop_name = 'hive.security.authenticator.manager' + prop_val = "org.apache.hadoop.hive.ql.security.SessionStateUserAuthenticator" + if prop_name not in hive_server2 or hive_server2[prop_name] != prop_val: + validationItems.append({"config-name": prop_name, + "item": self.getWarnItem( + "If Ranger Hive Plugin is enabled."\ +- " {0} under hiveserver2-site needs to be set to {1}".format(prop_name,prop_val))}) ++ " {} under hiveserver2-site needs to be set to {}".format(prop_name,prop_val))}) + prop_name = 'hive.security.authorization.enabled' + prop_val = 'true' + if prop_name in hive_server2 and hive_server2[prop_name] != prop_val: + validationItems.append({"config-name": prop_name, + "item": self.getWarnItem( + "If Ranger Hive Plugin is enabled."\ +- " {0} under hiveserver2-site needs to be set to {1}".format(prop_name, prop_val))}) ++ " {} under hiveserver2-site needs to be set to {}".format(prop_name, prop_val))}) + prop_name = 'hive.conf.restricted.list' + prop_vals = 'hive.security.authorization.enabled,hive.security.authorization.manager,hive.security.authenticator.manager'.split(',') + current_vals = [] +@@ -1379,7 +1379,7 @@ + if missing_vals: + validationItems.append({"config-name": prop_name, + "item": self.getWarnItem("If Ranger Hive Plugin is enabled."\ +- " {0} under hiveserver2-site needs to contain missing value {1}".format(prop_name, ','.join(missing_vals)))}) ++ " {} under hiveserver2-site needs to contain missing value {}".format(prop_name, ','.join(missing_vals)))}) + ##Add stack validations for Ranger plugin disabled. + elif not ranger_plugin_enabled: + prop_name = 'hive.security.authorization.manager' +@@ -1388,14 +1388,14 @@ + validationItems.append({"config-name": prop_name, + "item": self.getWarnItem( + "If Ranger Hive Plugin is disabled."\ +- " {0} needs to be set to {1}".format(prop_name,prop_val))}) ++ " {} needs to be set to {}".format(prop_name,prop_val))}) + prop_name = 'hive.security.authenticator.manager' + prop_val = "org.apache.hadoop.hive.ql.security.SessionStateUserAuthenticator" + if prop_name in hive_server2 and hive_server2[prop_name] != prop_val: + validationItems.append({"config-name": prop_name, + "item": self.getWarnItem( + "If Ranger Hive Plugin is disabled."\ +- " {0} needs to be set to {1}".format(prop_name,prop_val))}) ++ " {} needs to be set to {}".format(prop_name,prop_val))}) + return self.toConfigurationValidationProblems(validationItems, "hiveserver2-site") + + def validateWebhcatConfigurations(self, properties, recommendedDefaults, configurations, services, hosts): +@@ -1427,7 +1427,7 @@ + return self.toConfigurationValidationProblems(validationItems, "hive-env") + + def validateHiveConfigurations(self, properties, recommendedDefaults, configurations, services, hosts): +- parentValidationProblems = super(HDP22StackAdvisor, self).validateHiveConfigurations(properties, recommendedDefaults, configurations, services, hosts) ++ parentValidationProblems = super().validateHiveConfigurations(properties, recommendedDefaults, configurations, services, hosts) + hive_site = properties + validationItems = [] + stripe_size_values = [8388608, 16777216, 33554432, 67108864, 134217728, 268435456] +@@ -1435,7 +1435,7 @@ + if stripe_size_property in properties and \ + int(properties[stripe_size_property]) not in stripe_size_values: + validationItems.append({"config-name": stripe_size_property, +- "item": self.getWarnItem("Correct values are {0}".format(stripe_size_values)) ++ "item": self.getWarnItem("Correct values are {}".format(stripe_size_values)) + } + ) + authentication_property = "hive.server2.authentication" +@@ -1486,16 +1486,16 @@ + if prop_name1 in hbase_site and not is_number(hbase_site[prop_name1]): + validationItems.append({"config-name": prop_name1, + "item": self.getWarnItem( +- "{0} should be float value".format(prop_name1))}) ++ "{} should be float value".format(prop_name1))}) + elif prop_name2 in hbase_site and not is_number(hbase_site[prop_name2]): + validationItems.append({"config-name": prop_name2, + "item": self.getWarnItem( +- "{0} should be float value".format(prop_name2))}) ++ "{} should be float value".format(prop_name2))}) + elif prop_name1 in hbase_site and prop_name2 in hbase_site and \ + float(hbase_site[prop_name1]) + float(hbase_site[prop_name2]) > props_max_sum: + validationItems.append({"config-name": prop_name1, + "item": self.getWarnItem( +- "{0} and {1} sum should not exceed {2}".format(prop_name1, prop_name2, props_max_sum))}) ++ "{} and {} sum should not exceed {}".format(prop_name1, prop_name2, props_max_sum))}) + + #Adding Ranger Plugin logic here + ranger_plugin_properties = getSiteProperties(configurations, "ranger-hbase-plugin-properties") +@@ -1508,7 +1508,7 @@ + validationItems.append({"config-name": prop_name, + "item": self.getWarnItem( + "If Ranger HBase Plugin is enabled."\ +- "{0} needs to be set to {1}".format(prop_name,prop_val))}) ++ "{} needs to be set to {}".format(prop_name,prop_val))}) + prop_name = "hbase.coprocessor.master.classes" + prop_val = "com.xasecure.authorization.hbase.XaSecureAuthorizationCoprocessor" + exclude_val = "org.apache.hadoop.hbase.security.access.AccessController" +@@ -1518,7 +1518,7 @@ + validationItems.append({"config-name": prop_name, + "item": self.getWarnItem( + "If Ranger HBase Plugin is enabled."\ +- " {0} needs to contain {1} instead of {2}".format(prop_name,prop_val,exclude_val))}) ++ " {} needs to contain {} instead of {}".format(prop_name,prop_val,exclude_val))}) + prop_name = "hbase.coprocessor.region.classes" + prop_val = "com.xasecure.authorization.hbase.XaSecureAuthorizationCoprocessor" + if (prop_val in hbase_site[prop_name] and exclude_val not in hbase_site[prop_name]): +@@ -1527,7 +1527,7 @@ + validationItems.append({"config-name": prop_name, + "item": self.getWarnItem( + "If Ranger HBase Plugin is enabled."\ +- " {0} needs to contain {1} instead of {2}".format(prop_name,prop_val,exclude_val))}) ++ " {} needs to contain {} instead of {}".format(prop_name,prop_val,exclude_val))}) + + # Validate bucket cache correct config + prop_name = "hbase.bucketcache.ioengine" +@@ -1536,7 +1536,7 @@ + validationItems.append({"config-name": prop_name, + "item": self.getWarnItem( + "Recommended values of " \ +- " {0} is empty or '{1}'".format(prop_name,prop_val))}) ++ " {} is empty or '{}'".format(prop_name,prop_val))}) + + prop_name1 = "hbase.bucketcache.ioengine" + prop_name2 = "hbase.bucketcache.size" +@@ -1545,11 +1545,11 @@ + if prop_name1 in hbase_site and prop_name2 in hbase_site and hbase_site[prop_name1] and not hbase_site[prop_name2]: + validationItems.append({"config-name": prop_name2, + "item": self.getWarnItem( +- "If bucketcache ioengine is enabled, {0} should be set".format(prop_name2))}) ++ "If bucketcache ioengine is enabled, {} should be set".format(prop_name2))}) + if prop_name1 in hbase_site and prop_name3 in hbase_site and hbase_site[prop_name1] and not hbase_site[prop_name3]: + validationItems.append({"config-name": prop_name3, + "item": self.getWarnItem( +- "If bucketcache ioengine is enabled, {0} should be set".format(prop_name3))}) ++ "If bucketcache ioengine is enabled, {} should be set".format(prop_name3))}) + + # Validate hbase.security.authentication. + # Kerberos works only when security enabled. +@@ -1576,7 +1576,7 @@ + if prop_name1 in hbase_site_properties and prop_name in hbase_env and hbase_site_properties[prop_name1] and hbase_site_properties[prop_name1] == "offheap" and not hbase_env[prop_name]: + validationItems.append({"config-name": prop_name, + "item": self.getWarnItem( +- "If bucketcache ioengine is enabled, {0} should be set".format(prop_name))}) ++ "If bucketcache ioengine is enabled, {} should be set".format(prop_name))}) + + return self.toConfigurationValidationProblems(validationItems, "hbase-env") + +@@ -1653,7 +1653,7 @@ + return self.toConfigurationValidationProblems(validationItems, "ranger-storm-plugin-properties") + + def validateYARNEnvConfigurations(self, properties, recommendedDefaults, configurations, services, hosts): +- parentValidationProblems = super(HDP22StackAdvisor, self).validateYARNEnvConfigurations(properties, recommendedDefaults, configurations, services, hosts) ++ parentValidationProblems = super().validateYARNEnvConfigurations(properties, recommendedDefaults, configurations, services, hosts) + validationItems = [] + if "yarn_cgroups_enabled" in properties: + yarn_cgroups_enabled = properties["yarn_cgroups_enabled"].lower() == "true" +@@ -1693,7 +1693,7 @@ + return self.toConfigurationValidationProblems(validationItems, "ranger-env") + + def getAffectedConfigs(self, services): +- affectedConfigs = super(HDP22StackAdvisor, self).getAffectedConfigs(services) ++ affectedConfigs = super().getAffectedConfigs(services) + + # There are configs that are not defined in the stack but added/removed by + # stack-advisor. Here we add such configs in order to clear the config +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.3/services/stack_advisor.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.3/services/stack_advisor.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.3/services/stack_advisor.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.3/services/stack_advisor.py 2022-07-11 00:52:35.000000000 +0800 +@@ -37,7 +37,7 @@ + class HDP23StackAdvisor(HDP22StackAdvisor): + + def __init__(self): +- super(HDP23StackAdvisor, self).__init__() ++ super().__init__() + self.initialize_logger("HDP23StackAdvisor") + + def __getHosts(self, componentsList, componentName): +@@ -49,7 +49,7 @@ + return [] + + def getServiceConfigurationRecommenderDict(self): +- parentRecommendConfDict = super(HDP23StackAdvisor, self).getServiceConfigurationRecommenderDict() ++ parentRecommendConfDict = super().getServiceConfigurationRecommenderDict() + childRecommendConfDict = { + "TEZ": self.recommendTezConfigurations, + "HDFS": self.recommendHDFSConfigurations, +@@ -67,7 +67,7 @@ + return parentRecommendConfDict + + def recommendTezConfigurations(self, configurations, clusterData, services, hosts): +- super(HDP23StackAdvisor, self).recommendTezConfigurations(configurations, clusterData, services, hosts) ++ super().recommendTezConfigurations(configurations, clusterData, services, hosts) + + putTezProperty = self.putProperty(configurations, "tez-site") + +@@ -123,7 +123,7 @@ + pass + + if has_tez_view: +- tez_url = '{0}://{1}:{2}/#/main/view/TEZ/tez_cluster_instance'.format(server_protocol, server_host, server_port) ++ tez_url = '{}://{}:{}/#/main/view/TEZ/tez_cluster_instance'.format(server_protocol, server_host, server_port) + putTezProperty("tez.tez-ui.history-url.base", tez_url) + pass + +@@ -131,10 +131,10 @@ + jvmGCParams = "-XX:+UseParallelGC" + if "ambari-server-properties" in services and "java.home" in services["ambari-server-properties"]: + # JDK8 needs different parameters +- match = re.match(".*\/jdk(1\.\d+)[\-\_\.][^/]*$", services["ambari-server-properties"]["java.home"]) ++ match = re.match(r".*\/jdk(1\.\d+)[\-\_\.][^/]*$", services["ambari-server-properties"]["java.home"]) + if match and len(match.groups()) > 0: + # Is version >= 1.8 +- versionSplits = re.split("\.", match.group(1)) ++ versionSplits = re.split(r"\.", match.group(1)) + if versionSplits and len(versionSplits) > 1 and int(versionSplits[0]) > 0 and int(versionSplits[1]) > 7: + jvmGCParams = "-XX:+UseG1GC -XX:+ResizeTLAB" + # Note: Same calculation is done in 2.6/stack_advisor::recommendTezConfigurations() for 'tez.task.launch.cmd-opts', +@@ -144,7 +144,7 @@ + + + def recommendHBASEConfigurations(self, configurations, clusterData, services, hosts): +- super(HDP23StackAdvisor, self).recommendHBASEConfigurations(configurations, clusterData, services, hosts) ++ super().recommendHBASEConfigurations(configurations, clusterData, services, hosts) + putHbaseSiteProperty = self.putProperty(configurations, "hbase-site", services) + putHbaseSitePropertyAttributes = self.putPropertyAttribute(configurations, "hbase-site") + putHbaseEnvProperty = self.putProperty(configurations, "hbase-env", services) +@@ -195,7 +195,7 @@ + putHbaseSitePropertyAttributes('hbase.region.server.rpc.scheduler.factory.class', 'delete', 'true') + + def recommendHIVEConfigurations(self, configurations, clusterData, services, hosts): +- super(HDP23StackAdvisor, self).recommendHIVEConfigurations(configurations, clusterData, services, hosts) ++ super().recommendHIVEConfigurations(configurations, clusterData, services, hosts) + putHiveSiteProperty = self.putProperty(configurations, "hive-site", services) + putHiveServerProperty = self.putProperty(configurations, "hiveserver2-site", services) + putHiveEnvProperty = self.putProperty(configurations, "hive-env", services) +@@ -209,10 +209,10 @@ + jvmGCParams = "-XX:+UseParallelGC" + if "ambari-server-properties" in services and "java.home" in services["ambari-server-properties"]: + # JDK8 needs different parameters +- match = re.match(".*\/jdk(1\.\d+)[\-\_\.][^/]*$", services["ambari-server-properties"]["java.home"]) ++ match = re.match(r".*\/jdk(1\.\d+)[\-\_\.][^/]*$", services["ambari-server-properties"]["java.home"]) + if match and len(match.groups()) > 0: + # Is version >= 1.8 +- versionSplits = re.split("\.", match.group(1)) ++ versionSplits = re.split(r"\.", match.group(1)) + if versionSplits and len(versionSplits) > 1 and int(versionSplits[0]) > 0 and int(versionSplits[1]) > 7: + jvmGCParams = "-XX:+UseG1GC -XX:+ResizeTLAB" + putHiveSiteProperty('hive.tez.java.opts', "-server -Djava.net.preferIPv4Stack=true -XX:NewRatio=8 -XX:+UseNUMA " + jvmGCParams + " -XX:+PrintGCDetails -verbose:gc -XX:+PrintGCTimeStamps") +@@ -287,13 +287,13 @@ + metadata_port = services['configurations']['application-properties']['properties']['atlas.server.https.port'] + else: + metadata_port = atlas_server_default_https_port +- putHiveSiteProperty('atlas.rest.address', '{0}://{1}:{2}'.format(scheme, atlas_rest_host, metadata_port)) ++ putHiveSiteProperty('atlas.rest.address', '{}://{}:{}'.format(scheme, atlas_rest_host, metadata_port)) + else: + putHiveSitePropertyAttribute('atlas.cluster.name', 'delete', 'true') + putHiveSitePropertyAttribute('atlas.rest.address', 'delete', 'true') + + def recommendHDFSConfigurations(self, configurations, clusterData, services, hosts): +- super(HDP23StackAdvisor, self).recommendHDFSConfigurations(configurations, clusterData, services, hosts) ++ super().recommendHDFSConfigurations(configurations, clusterData, services, hosts) + + putHdfsSiteProperty = self.putProperty(configurations, "hdfs-site", services) + putHdfsSitePropertyAttribute = self.putPropertyAttribute(configurations, "hdfs-site") +@@ -499,14 +499,14 @@ + kmsUserOld = self.getOldValue(services, 'kms-env', 'kms_user') + self.put_proxyuser_value(kmsUser, '*', is_groups=True, services=services, configurations=configurations, put_function=putCoreSiteProperty) + if kmsUserOld is not None and kmsUser != kmsUserOld: +- putCoreSitePropertyAttribute("hadoop.proxyuser.{0}.groups".format(kmsUserOld), 'delete', 'true') +- services["forced-configurations"].append({"type" : "core-site", "name" : "hadoop.proxyuser.{0}.groups".format(kmsUserOld)}) +- services["forced-configurations"].append({"type" : "core-site", "name" : "hadoop.proxyuser.{0}.groups".format(kmsUser)}) ++ putCoreSitePropertyAttribute("hadoop.proxyuser.{}.groups".format(kmsUserOld), 'delete', 'true') ++ services["forced-configurations"].append({"type" : "core-site", "name" : "hadoop.proxyuser.{}.groups".format(kmsUserOld)}) ++ services["forced-configurations"].append({"type" : "core-site", "name" : "hadoop.proxyuser.{}.groups".format(kmsUser)}) + + if "HDFS" in servicesList: + if 'core-site' in services['configurations'] and ('fs.defaultFS' in services['configurations']['core-site']['properties']): + default_fs = services['configurations']['core-site']['properties']['fs.defaultFS'] +- putRangerKmsAuditProperty('xasecure.audit.destination.hdfs.dir', '{0}/{1}/{2}'.format(default_fs,'ranger','audit')) ++ putRangerKmsAuditProperty('xasecure.audit.destination.hdfs.dir', '{}/{}/{}'.format(default_fs,'ranger','audit')) + + required_services = [{'service' : 'YARN', 'config-type': 'yarn-env', 'property-name': 'yarn_user', 'proxy-category': ['hosts', 'users', 'groups']}, + {'service' : 'SPARK', 'config-type': 'livy-env', 'property-name': 'livy_user', 'proxy-category': ['hosts', 'users', 'groups']}] +@@ -523,16 +523,16 @@ + ambari_user = self.getAmbariUser(services) + if security_enabled: + # adding for ambari user +- putRangerKmsSiteProperty('hadoop.kms.proxyuser.{0}.users'.format(ambari_user), '*') +- putRangerKmsSiteProperty('hadoop.kms.proxyuser.{0}.hosts'.format(ambari_user), '*') ++ putRangerKmsSiteProperty('hadoop.kms.proxyuser.{}.users'.format(ambari_user), '*') ++ putRangerKmsSiteProperty('hadoop.kms.proxyuser.{}.hosts'.format(ambari_user), '*') + # adding for HTTP + putRangerKmsSiteProperty('hadoop.kms.proxyuser.HTTP.users', '*') + putRangerKmsSiteProperty('hadoop.kms.proxyuser.HTTP.hosts', '*') + else: + self.deleteKMSProxyUsers(configurations, services, hosts, required_services_for_secure) + # deleting ambari user proxy properties +- putRangerKmsSitePropertyAttribute('hadoop.kms.proxyuser.{0}.hosts'.format(ambari_user), 'delete', 'true') +- putRangerKmsSitePropertyAttribute('hadoop.kms.proxyuser.{0}.users'.format(ambari_user), 'delete', 'true') ++ putRangerKmsSitePropertyAttribute('hadoop.kms.proxyuser.{}.hosts'.format(ambari_user), 'delete', 'true') ++ putRangerKmsSitePropertyAttribute('hadoop.kms.proxyuser.{}.users'.format(ambari_user), 'delete', 'true') + # deleting HTTP proxy properties + putRangerKmsSitePropertyAttribute('hadoop.kms.proxyuser.HTTP.hosts', 'delete', 'true') + putRangerKmsSitePropertyAttribute('hadoop.kms.proxyuser.HTTP.users', 'delete', 'true') +@@ -557,25 +557,25 @@ + service_old_user = self.getOldValue(services, config_type, property_name) + + if 'groups' in proxy_category: +- putRangerKmsSiteProperty('hadoop.kms.proxyuser.{0}.groups'.format(service_user), '*') ++ putRangerKmsSiteProperty('hadoop.kms.proxyuser.{}.groups'.format(service_user), '*') + if 'hosts' in proxy_category: +- putRangerKmsSiteProperty('hadoop.kms.proxyuser.{0}.hosts'.format(service_user), '*') ++ putRangerKmsSiteProperty('hadoop.kms.proxyuser.{}.hosts'.format(service_user), '*') + if 'users' in proxy_category: +- putRangerKmsSiteProperty('hadoop.kms.proxyuser.{0}.users'.format(service_user), '*') ++ putRangerKmsSiteProperty('hadoop.kms.proxyuser.{}.users'.format(service_user), '*') + + if service_old_user is not None and service_user != service_old_user: + if 'groups' in proxy_category: +- putRangerKmsSitePropertyAttribute('hadoop.kms.proxyuser.{0}.groups'.format(service_old_user), 'delete', 'true') +- services["forced-configurations"].append({"type" : "kms-site", "name" : "hadoop.kms.proxyuser.{0}.groups".format(service_old_user)}) +- services["forced-configurations"].append({"type" : "kms-site", "name" : "hadoop.kms.proxyuser.{0}.groups".format(service_user)}) ++ putRangerKmsSitePropertyAttribute('hadoop.kms.proxyuser.{}.groups'.format(service_old_user), 'delete', 'true') ++ services["forced-configurations"].append({"type" : "kms-site", "name" : "hadoop.kms.proxyuser.{}.groups".format(service_old_user)}) ++ services["forced-configurations"].append({"type" : "kms-site", "name" : "hadoop.kms.proxyuser.{}.groups".format(service_user)}) + if 'hosts' in proxy_category: +- putRangerKmsSitePropertyAttribute('hadoop.kms.proxyuser.{0}.hosts'.format(service_old_user), 'delete', 'true') +- services["forced-configurations"].append({"type" : "kms-site", "name" : "hadoop.kms.proxyuser.{0}.hosts".format(service_old_user)}) +- services["forced-configurations"].append({"type" : "kms-site", "name" : "hadoop.kms.proxyuser.{0}.hosts".format(service_user)}) ++ putRangerKmsSitePropertyAttribute('hadoop.kms.proxyuser.{}.hosts'.format(service_old_user), 'delete', 'true') ++ services["forced-configurations"].append({"type" : "kms-site", "name" : "hadoop.kms.proxyuser.{}.hosts".format(service_old_user)}) ++ services["forced-configurations"].append({"type" : "kms-site", "name" : "hadoop.kms.proxyuser.{}.hosts".format(service_user)}) + if 'users' in proxy_category: +- putRangerKmsSitePropertyAttribute('hadoop.kms.proxyuser.{0}.users'.format(service_old_user), 'delete', 'true') +- services["forced-configurations"].append({"type" : "kms-site", "name" : "hadoop.kms.proxyuser.{0}.users".format(service_old_user)}) +- services["forced-configurations"].append({"type" : "kms-site", "name" : "hadoop.kms.proxyuser.{0}.users".format(service_user)}) ++ putRangerKmsSitePropertyAttribute('hadoop.kms.proxyuser.{}.users'.format(service_old_user), 'delete', 'true') ++ services["forced-configurations"].append({"type" : "kms-site", "name" : "hadoop.kms.proxyuser.{}.users".format(service_old_user)}) ++ services["forced-configurations"].append({"type" : "kms-site", "name" : "hadoop.kms.proxyuser.{}.users".format(service_user)}) + + def deleteKMSProxyUsers(self, configurations, services, hosts, requiredServices): + servicesList = [service["StackServices"]["service_name"] for service in services["services"]] +@@ -592,11 +592,11 @@ + service_user = services['configurations'][config_type]['properties'][property_name] + + if 'groups' in proxy_category: +- putRangerKmsSitePropertyAttribute('hadoop.kms.proxyuser.{0}.groups'.format(service_user), 'delete', 'true') ++ putRangerKmsSitePropertyAttribute('hadoop.kms.proxyuser.{}.groups'.format(service_user), 'delete', 'true') + if 'hosts' in proxy_category: +- putRangerKmsSitePropertyAttribute('hadoop.kms.proxyuser.{0}.hosts'.format(service_user), 'delete', 'true') ++ putRangerKmsSitePropertyAttribute('hadoop.kms.proxyuser.{}.hosts'.format(service_user), 'delete', 'true') + if 'users' in proxy_category: +- putRangerKmsSitePropertyAttribute('hadoop.kms.proxyuser.{0}.users'.format(service_user), 'delete', 'true') ++ putRangerKmsSitePropertyAttribute('hadoop.kms.proxyuser.{}.users'.format(service_user), 'delete', 'true') + + def getOracleDBConnectionHostPort(self, db_type, db_host, rangerDbName): + connection_string = self.getDBConnectionHostPort(db_type, db_host) +@@ -615,7 +615,7 @@ + else: + colon_count = db_host.count(':') + if colon_count == 0: +- if DB_TYPE_DEFAULT_PORT_MAP.has_key(db_type): ++ if db_type in DB_TYPE_DEFAULT_PORT_MAP: + connection_string = db_host + ":" + DB_TYPE_DEFAULT_PORT_MAP[db_type] + else: + connection_string = db_host +@@ -628,7 +628,7 @@ + + + def recommendRangerConfigurations(self, configurations, clusterData, services, hosts): +- super(HDP23StackAdvisor, self).recommendRangerConfigurations(configurations, clusterData, services, hosts) ++ super().recommendRangerConfigurations(configurations, clusterData, services, hosts) + servicesList = [service["StackServices"]["service_name"] for service in services["services"]] + putRangerAdminProperty = self.putProperty(configurations, "ranger-admin-site", services) + putRangerEnvProperty = self.putProperty(configurations, "ranger-env", services) +@@ -721,7 +721,7 @@ + zookeeper_host_port = self.getZKHostPortString(services) + ranger_audit_zk_port = '' + if zookeeper_host_port: +- ranger_audit_zk_port = '{0}/{1}'.format(zookeeper_host_port, 'ranger_audits') ++ ranger_audit_zk_port = '{}/{}'.format(zookeeper_host_port, 'ranger_audits') + putRangerAdminProperty('ranger.audit.solr.zookeepers', ranger_audit_zk_port) + else: + putRangerAdminProperty('ranger.audit.solr.zookeepers', 'NONE') +@@ -731,7 +731,7 @@ + if include_hdfs: + if 'core-site' in services['configurations'] and ('fs.defaultFS' in services['configurations']['core-site']['properties']): + default_fs = services['configurations']['core-site']['properties']['fs.defaultFS'] +- putRangerEnvProperty('xasecure.audit.destination.hdfs.dir', '{0}/{1}/{2}'.format(default_fs,'ranger','audit')) ++ putRangerEnvProperty('xasecure.audit.destination.hdfs.dir', '{}/{}/{}'.format(default_fs,'ranger','audit')) + + # Recommend Ranger supported service's audit properties + ranger_services = [ +@@ -787,7 +787,7 @@ + knox_host = knox_hosts[0] + if 'gateway-site' in services['configurations'] and 'gateway.port' in services['configurations']["gateway-site"]["properties"]: + knox_port = services['configurations']["gateway-site"]["properties"]['gateway.port'] +- putRangerAdminProperty('ranger.sso.providerurl', 'https://{0}:{1}/gateway/knoxsso/api/v1/websso'.format(knox_host, knox_port)) ++ putRangerAdminProperty('ranger.sso.providerurl', 'https://{}:{}/gateway/knoxsso/api/v1/websso'.format(knox_host, knox_port)) + + required_services = [ + {'service_name': 'HDFS', 'config_type': 'ranger-hdfs-security'}, +@@ -817,7 +817,7 @@ + if requiredServices[index]['service_name'] in servicesList: + component_config_type = requiredServices[index]['config_type'] + component_name = requiredServices[index]['service_name'] +- component_config_property = 'ranger.plugin.{0}.policy.rest.url'.format(component_name.lower()) ++ component_config_property = 'ranger.plugin.{}.policy.rest.url'.format(component_name.lower()) + if requiredServices[index]['service_name'] == 'RANGER_KMS': + component_config_property = 'ranger.plugin.kms.policy.rest.url' + putRangerSecurityProperty = self.putProperty(configurations, component_config_type, services) +@@ -825,7 +825,7 @@ + putRangerSecurityProperty(component_config_property, policymgr_external_url) + + def recommendYARNConfigurations(self, configurations, clusterData, services, hosts): +- super(HDP23StackAdvisor, self).recommendYARNConfigurations(configurations, clusterData, services, hosts) ++ super().recommendYARNConfigurations(configurations, clusterData, services, hosts) + putYarnSiteProperty = self.putProperty(configurations, "yarn-site", services) + putYarnSitePropertyAttributes = self.putPropertyAttribute(configurations, "yarn-site") + servicesList = [service["StackServices"]["service_name"] for service in services["services"]] +@@ -882,7 +882,7 @@ + putSqoopSitePropertyAttribute('sqoop.job.data.publish.class', 'delete', 'true') + + def recommendStormConfigurations(self, configurations, clusterData, services, hosts): +- super(HDP23StackAdvisor, self).recommendStormConfigurations(configurations, clusterData, services, hosts) ++ super().recommendStormConfigurations(configurations, clusterData, services, hosts) + putStormStartupProperty = self.putProperty(configurations, "storm-site", services) + putStormEnvProperty = self.putProperty(configurations, "storm-env", services) + servicesList = [service["StackServices"]["service_name"] for service in services["services"]] +@@ -932,7 +932,7 @@ + putStormStartupPropertyAttribute(notifier_plugin_property, 'delete', 'true') + + def recommendOozieConfigurations(self, configurations, clusterData, services, hosts): +- super(HDP23StackAdvisor, self).recommendOozieConfigurations(configurations, clusterData, services, hosts) ++ super().recommendOozieConfigurations(configurations, clusterData, services, hosts) + servicesList = [service["StackServices"]["service_name"] for service in services["services"]] + putOozieSiteProperty = self.putProperty(configurations, "oozie-site", services) + putOozieSitePropertyAttributes = self.putPropertyAttribute(configurations, "oozie-site") +@@ -1061,7 +1061,7 @@ + putFalconEnvProperty("falcon.atlas.hook", "false") + + def getServiceConfigurationValidators(self): +- parentValidators = super(HDP23StackAdvisor, self).getServiceConfigurationValidators() ++ parentValidators = super().getServiceConfigurationValidators() + childValidators = { + "HDFS": {"hdfs-site": self.validateHDFSConfigurations}, + "HIVE": {"hiveserver2-site": self.validateHiveServer2Configurations, +@@ -1075,7 +1075,7 @@ + return parentValidators + + def validateHDFSConfigurations(self, properties, recommendedDefaults, configurations, services, hosts): +- parentValidationProblems = super(HDP23StackAdvisor, self).validateHDFSConfigurations(properties, recommendedDefaults, configurations, services, hosts) ++ parentValidationProblems = super().validateHDFSConfigurations(properties, recommendedDefaults, configurations, services, hosts) + + # We can not access property hadoop.security.authentication from the + # other config (core-site). That's why we are using another heuristics here +@@ -1097,7 +1097,7 @@ + + + def validateHiveConfigurations(self, properties, recommendedDefaults, configurations, services, hosts): +- parentValidationProblems = super(HDP23StackAdvisor, self).validateHiveConfigurations(properties, recommendedDefaults, configurations, services, hosts) ++ parentValidationProblems = super().validateHiveConfigurations(properties, recommendedDefaults, configurations, services, hosts) + hive_site = properties + hive_env_properties = self.getSiteProperties(configurations, "hive-env") + validationItems = [] +@@ -1110,19 +1110,19 @@ + validationItems.append({"config-name": prop_name, + "item": self.getWarnItem( + "If Hive using SQL Anywhere db." \ +- " {0} needs to be added with value {1}".format(prop_name,prop_value))}) ++ " {} needs to be added with value {}".format(prop_name,prop_value))}) + elif prop_name in hive_site and hive_site[prop_name] != "org.datanucleus.store.rdbms.adapter.SQLAnywhereAdapter": + validationItems.append({"config-name": prop_name, + "item": self.getWarnItem( + "If Hive using SQL Anywhere db." \ +- " {0} needs to be set to {1}".format(prop_name,prop_value))}) ++ " {} needs to be set to {}".format(prop_name,prop_value))}) + + configurationValidationProblems = self.toConfigurationValidationProblems(validationItems, "hive-site") + configurationValidationProblems.extend(parentValidationProblems) + return configurationValidationProblems + + def validateHiveServer2Configurations(self, properties, recommendedDefaults, configurations, services, hosts): +- parentValidationProblems = super(HDP23StackAdvisor, self).validateHiveServer2Configurations(properties, recommendedDefaults, configurations, services, hosts) ++ parentValidationProblems = super().validateHiveServer2Configurations(properties, recommendedDefaults, configurations, services, hosts) + hive_server2 = properties + validationItems = [] + #Adding Ranger Plugin logic here +@@ -1140,21 +1140,21 @@ + validationItems.append({"config-name": prop_name, + "item": self.getWarnItem( + "If Ranger Hive Plugin is enabled."\ +- " {0} under hiveserver2-site needs to be set to {1}".format(prop_name,prop_val))}) ++ " {} under hiveserver2-site needs to be set to {}".format(prop_name,prop_val))}) + prop_name = 'hive.security.authenticator.manager' + prop_val = "org.apache.hadoop.hive.ql.security.SessionStateUserAuthenticator" + if prop_name in hive_server2 and hive_server2[prop_name] != prop_val: + validationItems.append({"config-name": prop_name, + "item": self.getWarnItem( + "If Ranger Hive Plugin is enabled."\ +- " {0} under hiveserver2-site needs to be set to {1}".format(prop_name,prop_val))}) ++ " {} under hiveserver2-site needs to be set to {}".format(prop_name,prop_val))}) + prop_name = 'hive.security.authorization.enabled' + prop_val = 'true' + if prop_name in hive_server2 and hive_server2[prop_name] != prop_val: + validationItems.append({"config-name": prop_name, + "item": self.getWarnItem( + "If Ranger Hive Plugin is enabled."\ +- " {0} under hiveserver2-site needs to be set to {1}".format(prop_name, prop_val))}) ++ " {} under hiveserver2-site needs to be set to {}".format(prop_name, prop_val))}) + prop_name = 'hive.conf.restricted.list' + prop_vals = 'hive.security.authorization.enabled,hive.security.authorization.manager,hive.security.authenticator.manager'.split(',') + current_vals = [] +@@ -1170,7 +1170,7 @@ + if missing_vals: + validationItems.append({"config-name": prop_name, + "item": self.getWarnItem("If Ranger Hive Plugin is enabled."\ +- " {0} under hiveserver2-site needs to contain missing value {1}".format(prop_name, ','.join(missing_vals)))}) ++ " {} under hiveserver2-site needs to contain missing value {}".format(prop_name, ','.join(missing_vals)))}) + ##Add stack validations for Ranger plugin disabled. + elif not ranger_plugin_enabled: + prop_name = 'hive.security.authorization.manager' +@@ -1179,21 +1179,21 @@ + validationItems.append({"config-name": prop_name, + "item": self.getWarnItem( + "If Ranger Hive Plugin is disabled."\ +- " {0} needs to be set to {1}".format(prop_name,prop_val))}) ++ " {} needs to be set to {}".format(prop_name,prop_val))}) + prop_name = 'hive.security.authenticator.manager' + prop_val = "org.apache.hadoop.hive.ql.security.SessionStateUserAuthenticator" + if prop_name in hive_server2 and hive_server2[prop_name] != prop_val: + validationItems.append({"config-name": prop_name, + "item": self.getWarnItem( + "If Ranger Hive Plugin is disabled."\ +- " {0} needs to be set to {1}".format(prop_name,prop_val))}) ++ " {} needs to be set to {}".format(prop_name,prop_val))}) + + validationProblems = self.toConfigurationValidationProblems(validationItems, "hiveserver2-site") + validationProblems.extend(parentValidationProblems) + return validationProblems + + def validateHBASEConfigurations(self, properties, recommendedDefaults, configurations, services, hosts): +- parentValidationProblems = super(HDP23StackAdvisor, self).validateHBASEConfigurations(properties, recommendedDefaults, configurations, services, hosts) ++ parentValidationProblems = super().validateHBASEConfigurations(properties, recommendedDefaults, configurations, services, hosts) + hbase_site = properties + validationItems = [] + +@@ -1208,7 +1208,7 @@ + validationItems.append({"config-name": prop_name, + "item": self.getWarnItem( + "If Ranger HBase Plugin is enabled."\ +- "{0} needs to be set to {1}".format(prop_name,prop_val))}) ++ "{} needs to be set to {}".format(prop_name,prop_val))}) + prop_name = "hbase.coprocessor.master.classes" + prop_val = "org.apache.ranger.authorization.hbase.RangerAuthorizationCoprocessor" + exclude_val = "org.apache.hadoop.hbase.security.access.AccessController" +@@ -1218,7 +1218,7 @@ + validationItems.append({"config-name": prop_name, + "item": self.getWarnItem( + "If Ranger HBase Plugin is enabled."\ +- " {0} needs to contain {1} instead of {2}".format(prop_name,prop_val,exclude_val))}) ++ " {} needs to contain {} instead of {}".format(prop_name,prop_val,exclude_val))}) + prop_name = "hbase.coprocessor.region.classes" + prop_val = "org.apache.ranger.authorization.hbase.RangerAuthorizationCoprocessor" + if (prop_val in hbase_site[prop_name] and exclude_val not in hbase_site[prop_name]): +@@ -1227,7 +1227,7 @@ + validationItems.append({"config-name": prop_name, + "item": self.getWarnItem( + "If Ranger HBase Plugin is enabled."\ +- " {0} needs to contain {1} instead of {2}".format(prop_name,prop_val,exclude_val))}) ++ " {} needs to contain {} instead of {}".format(prop_name,prop_val,exclude_val))}) + + validationProblems = self.toConfigurationValidationProblems(validationItems, "hbase-site") + validationProblems.extend(parentValidationProblems) +@@ -1248,7 +1248,7 @@ + validationItems.append({"config-name": prop_name, + "item": self.getWarnItem( + "If Ranger Kafka Plugin is enabled."\ +- "{0} needs to be set to {1}".format(prop_name,prop_val))}) ++ "{} needs to be set to {}".format(prop_name,prop_val))}) + + if 'KERBEROS' in servicesList and 'security.inter.broker.protocol' in properties: + interBrokerValue = properties['security.inter.broker.protocol'] +@@ -1257,7 +1257,7 @@ + if interBrokerValue and interBrokerValue not in prop_value: + validationItems.append({"config-name": "listeners", + "item": self.getWarnItem("If kerberos is enabled "\ +- "{0} need to contain {1} as one of "\ ++ "{} need to contain {} as one of "\ + "the protocol".format(prop_name, interBrokerValue))}) + + +@@ -1278,7 +1278,7 @@ + return self.toConfigurationValidationProblems(validationItems,'admin-properties') + + def validateRangerConfigurationsEnv(self, properties, recommendedDefaults, configurations, services, hosts): +- parentValidationProblems = super(HDP23StackAdvisor, self).validateRangerConfigurationsEnv(properties, recommendedDefaults, configurations, services, hosts) ++ parentValidationProblems = super().validateRangerConfigurationsEnv(properties, recommendedDefaults, configurations, services, hosts) + ranger_env_properties = properties + validationItems = [] + security_enabled = self.isSecurityEnabled(services) +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.3.ECS/services/ECS/package/scripts/ecs_client.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.3.ECS/services/ECS/package/scripts/ecs_client.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.3.ECS/services/ECS/package/scripts/ecs_client.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.3.ECS/services/ECS/package/scripts/ecs_client.py 2022-07-11 00:52:35.000000000 +0800 +@@ -58,7 +58,7 @@ + only_if=format("ls {hadoop_conf_dir}")) + + 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") + ) + +@@ -72,7 +72,7 @@ + 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): +@@ -85,7 +85,7 @@ + Directory(params.hadoop_java_io_tmpdir, + owner=params.hdfs_user, + group=params.user_group, +- mode=0777 ++ mode=0o777 + ) + + def create_dirs(self,env): +@@ -95,7 +95,7 @@ + type="directory", + action="create_on_execute", + owner=params.hdfs_user, +- mode=0777 ++ mode=0o777 + ) + params.HdfsResource(params.smoke_hdfs_user_dir, + type="directory", +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.3.ECS/services/ECS/package/scripts/params.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.3.ECS/services/ECS/package/scripts/params.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.3.ECS/services/ECS/package/scripts/params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.3.ECS/services/ECS/package/scripts/params.py 2022-07-11 00:52:35.000000000 +0800 +@@ -44,7 +44,7 @@ + + 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 + + java64_home = config['ambariLevelParams']['java_home'] + java_version = int(config['ambariLevelParams']['java_version']) +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.5/services/stack_advisor.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.5/services/stack_advisor.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.5/services/stack_advisor.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.5/services/stack_advisor.py 2022-07-11 00:52:35.000000000 +0800 +@@ -33,7 +33,7 @@ + class HDP25StackAdvisor(HDP24StackAdvisor): + + def __init__(self): +- super(HDP25StackAdvisor, self).__init__() ++ super().__init__() + self.initialize_logger("HDP25StackAdvisor") + self.HIVE_INTERACTIVE_SITE = 'hive-interactive-site' + self.YARN_ROOT_DEFAULT_QUEUE_NAME = 'default' +@@ -43,7 +43,7 @@ + self.ACCESSIBLE_NODE_LABELS = 'accessible-node-labels' + + def recommendOozieConfigurations(self, configurations, clusterData, services, hosts): +- super(HDP25StackAdvisor,self).recommendOozieConfigurations(configurations, clusterData, services, hosts) ++ super().recommendOozieConfigurations(configurations, clusterData, services, hosts) + putOozieEnvProperty = self.putProperty(configurations, "oozie-env", services) + servicesList = [service["StackServices"]["service_name"] for service in services["services"]] + putOozieSiteProperty = self.putProperty(configurations, "oozie-site", services) +@@ -95,7 +95,7 @@ + currentAdminUsers = services["configurations"]["oozie-env"]["properties"]["oozie_admin_users"] + self.logger.info("Oozie admin users from configuration %s" % currentAdminUsers) + else : +- currentAdminUsers = "{0}, oozie-admin".format(oozieUser) ++ currentAdminUsers = "{}, oozie-admin".format(oozieUser) + self.logger.info("Setting default oozie admin users to %s" % currentAdminUsers) + + +@@ -103,7 +103,7 @@ + self.logger.info("Falcon user %s already member of oozie admin users " % falconUser) + return + +- newAdminUsers = "{0},{1}".format(currentAdminUsers, falconUser) ++ newAdminUsers = "{},{}".format(currentAdminUsers, falconUser) + + self.logger.info("new oozie admin users : %s" % newAdminUsers) + +@@ -111,12 +111,12 @@ + putOozieEnvProperty("oozie_admin_users", newAdminUsers) + + def createComponentLayoutRecommendations(self, services, hosts): +- parentComponentLayoutRecommendations = super(HDP25StackAdvisor, self).createComponentLayoutRecommendations( ++ parentComponentLayoutRecommendations = super().createComponentLayoutRecommendations( + services, hosts) + return parentComponentLayoutRecommendations + + def getComponentLayoutValidations(self, services, hosts): +- parentItems = super(HDP25StackAdvisor, self).getComponentLayoutValidations(services, hosts) ++ parentItems = super().getComponentLayoutValidations(services, hosts) + childItems = [] + + hsi_hosts = self.getHostsForComponent(services, "HIVE", "HIVE_SERVER_INTERACTIVE") +@@ -129,7 +129,7 @@ + return parentItems + + def getServiceConfigurationValidators(self): +- parentValidators = super(HDP25StackAdvisor, self).getServiceConfigurationValidators() ++ parentValidators = super().getServiceConfigurationValidators() + childValidators = { + "ATLAS": {"application-properties": self.validateAtlasConfigurations}, + "HIVE": {"hive-interactive-env": self.validateHiveInteractiveEnvConfigurations, +@@ -145,7 +145,7 @@ + return parentValidators + + def validateStormConfigurations(self, properties, recommendedDefaults, configurations, services, hosts): +- super(HDP25StackAdvisor, self).validateStormConfigurations(properties, recommendedDefaults, configurations, services, hosts) ++ super().validateStormConfigurations(properties, recommendedDefaults, configurations, services, hosts) + validationItems = [] + + servicesList = [service["StackServices"]["service_name"] for service in services["services"]] +@@ -168,7 +168,7 @@ + return self.toConfigurationValidationProblems(validationItems, "storm-site") + + def getCardinalitiesDict(self, hosts): +- result = super(HDP25StackAdvisor, self).getCardinalitiesDict(hosts) ++ result = super().getCardinalitiesDict(hosts) + min_val = 1 + if len(hosts["items"]) > 999: + min_val = 2 +@@ -282,7 +282,7 @@ + return self.toConfigurationValidationProblems(validationItems, "spark2-thrift-sparkconf") + + def validateYARNConfigurations(self, properties, recommendedDefaults, configurations, services, hosts): +- parentValidationProblems = super(HDP25StackAdvisor, self).validateYARNConfigurations(properties, recommendedDefaults, configurations, services, hosts) ++ parentValidationProblems = super().validateYARNConfigurations(properties, recommendedDefaults, configurations, services, hosts) + yarn_site_properties = self.getSiteProperties(configurations, "yarn-site") + servicesList = [service["StackServices"]["service_name"] for service in services["services"]] + componentsListList = [service["components"] for service in services["services"]] +@@ -346,22 +346,22 @@ + # Validate that the selected queue in 'hive.llap.daemon.queue.name' should be sized >= to minimum required + # to run LLAP and Hive2 app. + if llap_queue_cap_perc < min_reqd_queue_cap_perc: +- errMsg1 = "Selected queue '{0}' capacity ({1}%) is less than minimum required capacity ({2}%) for LLAP " \ ++ errMsg1 = "Selected queue '{}' capacity ({}%) is less than minimum required capacity ({}%) for LLAP " \ + "app to run".format(llap_queue_name, llap_queue_cap_perc, min_reqd_queue_cap_perc) + validationItems.append({"config-name": "hive.llap.daemon.queue.name", "item": self.getErrorItem(errMsg1)}) + else: +- self.logger.error("Couldn't retrieve '{0}' queue's capacity from 'capacity-scheduler' while doing validation checks for " ++ self.logger.error("Couldn't retrieve '{}' queue's capacity from 'capacity-scheduler' while doing validation checks for " + "Hive Server Interactive.".format(llap_queue_name)) + + # Validate that current selected queue in 'hive.llap.daemon.queue.name' state is not STOPPED. + llap_selected_queue_state = self.__getQueueStateFromCapacityScheduler(capacity_scheduler_properties, llap_queue_name) + if llap_selected_queue_state: + if llap_selected_queue_state == "STOPPED": +- errMsg2 = "Selected queue '{0}' current state is : '{1}'. It is required to be in 'RUNNING' state for LLAP to run"\ ++ errMsg2 = "Selected queue '{}' current state is : '{}'. It is required to be in 'RUNNING' state for LLAP to run"\ + .format(llap_queue_name, llap_selected_queue_state) + validationItems.append({"config-name": "hive.llap.daemon.queue.name","item": self.getErrorItem(errMsg2)}) + else: +- self.logger.error("Couldn't retrieve '{0}' queue's state from 'capacity-scheduler' while doing validation checks for " ++ self.logger.error("Couldn't retrieve '{}' queue's state from 'capacity-scheduler' while doing validation checks for " + "Hive Server Interactive.".format(llap_queue_name)) + else: + self.logger.error("Couldn't retrieve 'hive.llap.daemon.queue.name' config from 'hive-interactive-site' while doing " +@@ -376,14 +376,14 @@ + 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: +- errMsg3 = " Reducing the 'Maximum Total Concurrent Queries' (value: {0}) is advisable as it is consuming more than 50% of " \ +- "'{1}' queue for LLAP.".format(num_tez_sessions, llap_queue_name) ++ errMsg3 = " Reducing the 'Maximum Total Concurrent Queries' (value: {}) is advisable as it is consuming more than 50% of " \ ++ "'{}' queue for LLAP.".format(num_tez_sessions, llap_queue_name) + validationItems.append({"config-name": "hive.server2.tez.sessions.per.default.queue","item": self.getWarnItem(errMsg3)}) + + # Validate that 'remaining available capacity' in cluster is at least 512 MB, after 'llap' queue is selected, +@@ -392,15 +392,15 @@ + curr_selected_queue_for_llap_cap = float(llap_queue_cap_perc) / 100 * total_cluster_cap + available_cap_in_cluster = total_cluster_cap - curr_selected_queue_for_llap_cap + if available_cap_in_cluster < MIN_ASSUMED_CAP_REQUIRED_FOR_SERVICE_CHECKS: +- errMsg4 = "Capacity used by '{0}' queue is '{1}'. Service checks may not run as remaining available capacity " \ +- "({2}) in cluster is less than 512 MB.".format(self.AMBARI_MANAGED_LLAP_QUEUE_NAME, curr_selected_queue_for_llap_cap, available_cap_in_cluster) ++ errMsg4 = "Capacity used by '{}' queue is '{}'. Service checks may not run as remaining available capacity " \ ++ "({}) in cluster is less than 512 MB.".format(self.AMBARI_MANAGED_LLAP_QUEUE_NAME, curr_selected_queue_for_llap_cap, available_cap_in_cluster) + validationItems.append({"config-name": "hive.llap.daemon.queue.name","item": self.getWarnItem(errMsg4)}) + + validationProblems = self.toConfigurationValidationProblems(validationItems, "hive-interactive-site") + return validationProblems + + def validateHiveConfigurationsEnv(self, properties, recommendedDefaults, configurations, services, hosts): +- parentValidationProblems = super(HDP25StackAdvisor, self).validateHiveConfigurationsEnv(properties, recommendedDefaults, configurations, services, hosts) ++ parentValidationProblems = super().validateHiveConfigurationsEnv(properties, recommendedDefaults, configurations, services, hosts) + hive_site_properties = self.getSiteProperties(configurations, "hive-site") + hive_env_properties = self.getSiteProperties(configurations, "hive-env") + validationItems = [] +@@ -456,7 +456,7 @@ + return validationProblems + + def getServiceConfigurationRecommenderDict(self): +- parentRecommendConfDict = super(HDP25StackAdvisor, self).getServiceConfigurationRecommenderDict() ++ parentRecommendConfDict = super().getServiceConfigurationRecommenderDict() + childRecommendConfDict = { + "RANGER": self.recommendRangerConfigurations, + "HBASE": self.recommendHBASEConfigurations, +@@ -500,7 +500,7 @@ + putSparkThriftSparkConf("spark.yarn.queue", spark_thrift_queue) + + def recommendStormConfigurations(self, configurations, clusterData, services, hosts): +- super(HDP25StackAdvisor, self).recommendStormConfigurations(configurations, clusterData, services, hosts) ++ super().recommendStormConfigurations(configurations, clusterData, services, hosts) + storm_site = self.getServicesSiteProperties(services, "storm-site") + storm_env = self.getServicesSiteProperties(services, "storm-env") + putStormSiteProperty = self.putProperty(configurations, "storm-site", services) +@@ -545,11 +545,11 @@ + putStormSiteProperty('topology.metrics.consumer.register', + '[{"class": "org.apache.hadoop.metrics2.sink.storm.StormTimelineMetricsSink", ' + '"parallelism.hint": 1, ' +- '"whitelist": ["kafkaOffset\\\..+/", "__complete-latency", "__process-latency", ' ++ '"whitelist": ["kafkaOffset\\\\..+/", "__complete-latency", "__process-latency", ' + '"__execute-latency", ' +- '"__receive\\\.population$", "__sendqueue\\\.population$", "__execute-count", "__emit-count", ' +- '"__ack-count", "__fail-count", "memory/heap\\\.usedBytes$", "memory/nonHeap\\\.usedBytes$", ' +- '"GC/.+\\\.count$", "GC/.+\\\.timeMs$"]}]') ++ '"__receive\\\\.population$", "__sendqueue\\\\.population$", "__execute-count", "__emit-count", ' ++ '"__ack-count", "__fail-count", "memory/heap\\\\.usedBytes$", "memory/nonHeap\\\\.usedBytes$", ' ++ '"GC/.+\\\\.count$", "GC/.+\\\\.timeMs$"]}]') + else: + putStormSiteProperty('storm.cluster.metrics.consumer.register', 'null') + putStormSiteProperty('topology.metrics.consumer.register', 'null') +@@ -597,7 +597,7 @@ + else: + metadata_port = atlas_server_default_https_port + +- atlas_rest_address_list = ["{0}://{1}:{2}".format(scheme, hostname, metadata_port) for hostname in atlas_host_names] ++ atlas_rest_address_list = ["{}://{}:{}".format(scheme, hostname, metadata_port) for hostname in atlas_host_names] + atlas_rest_address = ",".join(atlas_rest_address_list) + self.logger.info("Constructing atlas.rest.address=%s" % atlas_rest_address) + return atlas_rest_address +@@ -732,7 +732,7 @@ + putAtlasEnvProperty("atlas_server_max_new_size", atlas_server_max_new_size) + + def recommendHBASEConfigurations(self, configurations, clusterData, services, hosts): +- super(HDP25StackAdvisor, self).recommendHBASEConfigurations(configurations, clusterData, services, hosts) ++ super().recommendHBASEConfigurations(configurations, clusterData, services, hosts) + putHbaseSiteProperty = self.putProperty(configurations, "hbase-site", services) + putCoreSiteProperty = self.putProperty(configurations, "core-site", services) + +@@ -767,7 +767,7 @@ + + def recommendHIVEConfigurations(self, configurations, clusterData, services, hosts): + self.logger.info("DBG: Invoked recommendHiveConfiguration") +- super(HDP25StackAdvisor, self).recommendHIVEConfigurations(configurations, clusterData, services, hosts) ++ super().recommendHIVEConfigurations(configurations, clusterData, services, hosts) + putHiveInteractiveEnvProperty = self.putProperty(configurations, "hive-interactive-env", services) + putHiveInteractiveSiteProperty = self.putProperty(configurations, self.HIVE_INTERACTIVE_SITE, services) + putHiveInteractiveEnvPropertyAttribute = self.putPropertyAttribute(configurations, "hive-interactive-env") +@@ -791,7 +791,7 @@ + + if hive_tez_default_queue: + putHiveInteractiveSiteProperty("hive.server2.tez.default.queues", hive_tez_default_queue) +- self.logger.debug("Updated 'hive.server2.tez.default.queues' config : '{0}'".format(hive_tez_default_queue)) ++ self.logger.debug("Updated 'hive.server2.tez.default.queues' config : '{}'".format(hive_tez_default_queue)) + else: + self.logger.info("DBG: Setting 'num_llap_nodes' config's READ ONLY attribute as 'True'.") + putHiveInteractiveEnvProperty('enable_hive_interactive', 'false') +@@ -803,7 +803,7 @@ + putHiveInteractiveSiteProperty("hive.llap.zk.sm.connectionString", zookeeper_host_port) + + def recommendYARNConfigurations(self, configurations, clusterData, services, hosts): +- super(HDP25StackAdvisor, self).recommendYARNConfigurations(configurations, clusterData, services, hosts) ++ super().recommendYARNConfigurations(configurations, clusterData, services, hosts) + hsi_env_poperties = self.getServicesSiteProperties(services, "hive-interactive-env") + cluster_env = self.getServicesSiteProperties(services, "cluster-env") + +@@ -859,7 +859,7 @@ + is_cluster_create_opr = False + if operation == self.CLUSTER_CREATE_OPERATION: + is_cluster_create_opr = True +- self.logger.info("Is cluster create operation ? = {0}".format(is_cluster_create_opr)) ++ self.logger.info("Is cluster create operation ? = {}".format(is_cluster_create_opr)) + + putHiveInteractiveSiteProperty = self.putProperty(configurations, self.HIVE_INTERACTIVE_SITE, services) + putHiveInteractiveSitePropertyAttribute = self.putPropertyAttribute(configurations, self.HIVE_INTERACTIVE_SITE) +@@ -884,7 +884,7 @@ + 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) + + if hsi_site and "hive.llap.daemon.queue.name" in hsi_site: +@@ -895,7 +895,7 @@ + if capacity_scheduler_properties: + # Get all leaf queues. + leafQueueNames = self.getAllYarnLeafQueues(capacity_scheduler_properties) +- self.logger.info("YARN leaf Queues = {0}".format(leafQueueNames)) ++ self.logger.info("YARN leaf Queues = {}".format(leafQueueNames)) + if len(leafQueueNames) == 0: + self.logger.error("Queue(s) couldn't be retrieved from capacity-scheduler.") + return +@@ -916,7 +916,7 @@ + putHiveInteractiveSiteProperty('hive.llap.daemon.queue.name', first_leaf_queue) + putHiveInteractiveSiteProperty('hive.server2.tez.default.queues', first_leaf_queue) + llap_named_queue_selected_in_curr_invocation = False +- self.logger.info("DBG: llap_named_queue_selected_in_curr_invocation = {0}".format(llap_named_queue_selected_in_curr_invocation)) ++ self.logger.info("DBG: llap_named_queue_selected_in_curr_invocation = {}".format(llap_named_queue_selected_in_curr_invocation)) + + if (len(leafQueueNames) == 2 and (llap_daemon_selected_queue_name and llap_daemon_selected_queue_name == llap_queue_name) or + llap_named_queue_selected_in_curr_invocation) or \ +@@ -924,12 +924,12 @@ + self.logger.info("DBG: Setting 'num_llap_nodes' config's READ ONLY attribute as 'False'.") + putHiveInteractiveEnvPropertyAttribute("num_llap_nodes", "read_only", "false") + selected_queue_is_ambari_managed_llap = True +- self.logger.info("DBG: Selected YARN queue for LLAP is : '{0}'. Current YARN queues : {1}. Setting 'Number of LLAP nodes' " ++ self.logger.info("DBG: Selected YARN queue for LLAP is : '{}'. Current YARN queues : {}. Setting 'Number of LLAP nodes' " + "slider visibility to 'True'".format(llap_queue_name, list(leafQueueNames))) + else: + self.logger.info("DBG: Setting 'num_llap_nodes' config's READ ONLY attribute as 'True'.") + putHiveInteractiveEnvPropertyAttribute("num_llap_nodes", "read_only", "true") +- self.logger.info("Selected YARN queue for LLAP is : '{0}'. Current YARN queues : {1}. Setting 'Number of LLAP nodes' " ++ self.logger.info("Selected YARN queue for LLAP is : '{}'. Current YARN queues : {}. Setting 'Number of LLAP nodes' " + "visibility to 'False'.".format(llap_daemon_selected_queue_name, list(leafQueueNames))) + selected_queue_is_ambari_managed_llap = False + +@@ -939,12 +939,12 @@ + if llap_daemon_selected_queue_name: + llap_selected_queue_state = self.__getQueueStateFromCapacityScheduler(capacity_scheduler_properties, llap_daemon_selected_queue_name) + if llap_selected_queue_state is None or llap_selected_queue_state == "STOPPED": +- self.logger.error("Selected LLAP app queue '{0}' current state is : '{1}'. Setting LLAP configs to default " ++ self.logger.error("Selected LLAP app queue '{}' current state is : '{}'. Setting LLAP configs to default " + "values.".format(llap_daemon_selected_queue_name, llap_selected_queue_state)) + self.recommendDefaultLlapConfiguration(configurations, services, hosts) + return + else: +- self.logger.error("Retrieved LLAP app queue name is : '{0}'. Setting LLAP configs to default values." ++ self.logger.error("Retrieved LLAP app queue name is : '{}'. Setting LLAP configs to default values." + .format(llap_daemon_selected_queue_name)) + self.recommendDefaultLlapConfiguration(configurations, services, hosts) + return +@@ -961,8 +961,8 @@ + # or 'hive.llap.daemon.queue.name' has change in value selection. + # OR + # services['changed-configurations'] is empty implying that this is the Blueprint call. (1st invocation) +- if 'changed-configurations' in services.keys(): +- config_names_to_be_checked = set(['num_llap_nodes', 'enable_hive_interactive']) ++ if 'changed-configurations' in list(services.keys()): ++ config_names_to_be_checked = {'num_llap_nodes', 'enable_hive_interactive'} + changed_configs_in_hive_int_env = self.isConfigPropertiesChanged(services, "hive-interactive-env", config_names_to_be_checked, False) + + # Determine if there is change detected in "hive-interactive-site's" configs based on which we calculate llap configs. +@@ -972,7 +972,7 @@ + if not changed_configs_in_hive_int_env and not llap_concurrency_in_changed_configs and \ + not llap_daemon_queue_in_changed_configs and services["changed-configurations"]: + self.logger.info("DBG: LLAP parameters not modified. Not adjusting LLAP configs.") +- self.logger.info("DBG: Current 'changed-configuration' received is : {0}".format(services["changed-configurations"])) ++ self.logger.info("DBG: Current 'changed-configuration' received is : {}".format(services["changed-configurations"])) + return + + self.logger.info("\nDBG: Performing LLAP config calculations ......") +@@ -980,10 +980,10 @@ + node_manager_cnt = len(node_manager_host_list) + yarn_nm_mem_in_mb = self.get_yarn_nm_mem_in_mb(services, configurations) + total_cluster_capacity = node_manager_cnt * yarn_nm_mem_in_mb +- 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)) ++ self.logger.info("DBG: Calculated total_cluster_capacity : {}, using following : node_manager_cnt : {}, " ++ "yarn_nm_mem_in_mb : {}".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) + +@@ -992,16 +992,16 @@ + else: + self.recommendDefaultLlapConfiguration(configurations, services, hosts) + return +- self.logger.info("DBG Calculated normalized_tez_am_container_size : {0}, using following : tez_am_container_size : {1}, " +- "total_cluster_capacity : {2}".format(normalized_tez_am_container_size, tez_am_container_size, ++ self.logger.info("DBG Calculated normalized_tez_am_container_size : {}, using following : tez_am_container_size : {}, " ++ "total_cluster_capacity : {}".format(normalized_tez_am_container_size, tez_am_container_size, + total_cluster_capacity)) + + # Calculate the available memory for LLAP app + yarn_nm_mem_in_mb_normalized = self._normalizeDown(yarn_nm_mem_in_mb, yarn_min_container_size) + mem_per_thread_for_llap = float(self.calculate_mem_per_thread_for_llap(services, yarn_nm_mem_in_mb_normalized, cpu_per_nm_host, + is_cluster_create_opr, changed_configs_has_enable_hive_int)) +- self.logger.info("DBG: Calculated mem_per_thread_for_llap : {0}, using following: yarn_nm_mem_in_mb_normalized : {1}, " +- "cpu_per_nm_host : {2}".format(mem_per_thread_for_llap, yarn_nm_mem_in_mb_normalized, cpu_per_nm_host)) ++ self.logger.info("DBG: Calculated mem_per_thread_for_llap : {}, using following: yarn_nm_mem_in_mb_normalized : {}, " ++ "cpu_per_nm_host : {}".format(mem_per_thread_for_llap, yarn_nm_mem_in_mb_normalized, cpu_per_nm_host)) + + + if mem_per_thread_for_llap is None: +@@ -1011,17 +1011,17 @@ + # Get calculated value for Slider AM container Size + slider_am_container_size = self._normalizeUp(self.calculate_slider_am_size(yarn_min_container_size), + yarn_min_container_size) +- self.logger.info("DBG: Calculated 'slider_am_container_size' : {0}, using following: yarn_min_container_size : " +- "{1}".format(slider_am_container_size, yarn_min_container_size)) ++ self.logger.info("DBG: Calculated 'slider_am_container_size' : {}, using following: yarn_min_container_size : " ++ "{}".format(slider_am_container_size, yarn_min_container_size)) + + min_memory_required = normalized_tez_am_container_size + slider_am_container_size + self._normalizeUp(mem_per_thread_for_llap, yarn_min_container_size) +- self.logger.info("DBG: Calculated 'min_memory_required': {0} using following : slider_am_container_size: {1}, " +- "normalized_tez_am_container_size : {2}, mem_per_thread_for_llap : {3}, yarn_min_container_size : " +- "{4}".format(min_memory_required, slider_am_container_size, normalized_tez_am_container_size, mem_per_thread_for_llap, yarn_min_container_size)) ++ self.logger.info("DBG: Calculated 'min_memory_required': {} using following : slider_am_container_size: {}, " ++ "normalized_tez_am_container_size : {}, mem_per_thread_for_llap : {}, yarn_min_container_size : " ++ "{}".format(min_memory_required, slider_am_container_size, normalized_tez_am_container_size, mem_per_thread_for_llap, yarn_min_container_size)) + + min_nodes_required = int(math.ceil( min_memory_required / yarn_nm_mem_in_mb_normalized)) +- self.logger.info("DBG: Calculated 'min_node_required': {0}, using following : min_memory_required : {1}, yarn_nm_mem_in_mb_normalized " +- ": {2}".format(min_nodes_required, min_memory_required, yarn_nm_mem_in_mb_normalized)) ++ self.logger.info("DBG: Calculated 'min_node_required': {}, using following : min_memory_required : {}, yarn_nm_mem_in_mb_normalized " ++ ": {}".format(min_nodes_required, min_memory_required, yarn_nm_mem_in_mb_normalized)) + if min_nodes_required > node_manager_cnt: + self.logger.warning("ERROR: Not enough memory/nodes to run LLAP"); + self.recommendDefaultLlapConfiguration(configurations, services, hosts) +@@ -1029,31 +1029,31 @@ + + mem_per_thread_for_llap = float(mem_per_thread_for_llap) + +- self.logger.info("DBG: selected_queue_is_ambari_managed_llap = {0}".format(selected_queue_is_ambari_managed_llap)) ++ self.logger.info("DBG: selected_queue_is_ambari_managed_llap = {}".format(selected_queue_is_ambari_managed_llap)) + if not selected_queue_is_ambari_managed_llap: + llap_daemon_selected_queue_cap = self.__getSelectedQueueTotalCap(capacity_scheduler_properties, llap_daemon_selected_queue_name, total_cluster_capacity) + + if llap_daemon_selected_queue_cap <= 0: +- self.logger.warning("'{0}' queue capacity percentage retrieved = {1}. Expected > 0.".format( ++ self.logger.warning("'{}' queue capacity percentage retrieved = {}. Expected > 0.".format( + llap_daemon_selected_queue_name, llap_daemon_selected_queue_cap)) + self.recommendDefaultLlapConfiguration(configurations, services, hosts) + return + + total_llap_mem_normalized = self._normalizeDown(llap_daemon_selected_queue_cap, yarn_min_container_size) +- self.logger.info("DBG: Calculated '{0}' queue available capacity : {1}, using following: llap_daemon_selected_queue_cap : {2}, " +- "yarn_min_container_size : {3}".format(llap_daemon_selected_queue_name, total_llap_mem_normalized, ++ self.logger.info("DBG: Calculated '{}' queue available capacity : {}, using following: llap_daemon_selected_queue_cap : {}, " ++ "yarn_min_container_size : {}".format(llap_daemon_selected_queue_name, total_llap_mem_normalized, + llap_daemon_selected_queue_cap, yarn_min_container_size)) + '''Rounding up numNodes so that we run more daemons, and utilitze more CPUs. The rest of the calcaulations will take care of cutting this down if required''' + num_llap_nodes_requested = math.ceil(total_llap_mem_normalized / yarn_nm_mem_in_mb_normalized) +- self.logger.info("DBG: Calculated 'num_llap_nodes_requested' : {0}, using following: total_llap_mem_normalized : {1}, " +- "yarn_nm_mem_in_mb_normalized : {2}".format(num_llap_nodes_requested, total_llap_mem_normalized, yarn_nm_mem_in_mb_normalized)) ++ self.logger.info("DBG: Calculated 'num_llap_nodes_requested' : {}, using following: total_llap_mem_normalized : {}, " ++ "yarn_nm_mem_in_mb_normalized : {}".format(num_llap_nodes_requested, total_llap_mem_normalized, yarn_nm_mem_in_mb_normalized)) + # Pouplate the 'num_llap_nodes_requested' in config 'num_llap_nodes', a read only config for non-Ambari managed queue case. + putHiveInteractiveEnvProperty('num_llap_nodes', num_llap_nodes_requested) +- self.logger.info("Setting config 'num_llap_nodes' as : {0}".format(num_llap_nodes_requested)) ++ self.logger.info("Setting config 'num_llap_nodes' as : {}".format(num_llap_nodes_requested)) + queue_am_fraction_perc = float(self.__getQueueAmFractionFromCapacityScheduler(capacity_scheduler_properties, llap_daemon_selected_queue_name)) + hive_tez_am_cap_available = queue_am_fraction_perc * total_llap_mem_normalized +- self.logger.info("DBG: Calculated 'hive_tez_am_cap_available' : {0}, using following: queue_am_fraction_perc : {1}, " +- "total_llap_mem_normalized : {2}".format(hive_tez_am_cap_available, queue_am_fraction_perc, total_llap_mem_normalized)) ++ self.logger.info("DBG: Calculated 'hive_tez_am_cap_available' : {}, using following: queue_am_fraction_perc : {}, " ++ "total_llap_mem_normalized : {}".format(hive_tez_am_cap_available, queue_am_fraction_perc, total_llap_mem_normalized)) + else: # Ambari managed 'llap' named queue at root level. + # Set 'num_llap_nodes_requested' for 1st invocation, as it gets passed as 1 otherwise, read from config. + +@@ -1067,31 +1067,31 @@ + else: + num_llap_nodes_requested = self.get_num_llap_nodes(services, configurations) #Input + total_llap_mem = num_llap_nodes_requested * yarn_nm_mem_in_mb_normalized +- self.logger.info("DBG: Calculated 'total_llap_mem' : {0}, using following: num_llap_nodes_requested : {1}, " +- "yarn_nm_mem_in_mb_normalized : {2}".format(total_llap_mem, num_llap_nodes_requested, yarn_nm_mem_in_mb_normalized)) ++ self.logger.info("DBG: Calculated 'total_llap_mem' : {}, using following: num_llap_nodes_requested : {}, " ++ "yarn_nm_mem_in_mb_normalized : {}".format(total_llap_mem, num_llap_nodes_requested, yarn_nm_mem_in_mb_normalized)) + total_llap_mem_normalized = float(self._normalizeDown(total_llap_mem, yarn_min_container_size)) +- self.logger.info("DBG: Calculated 'total_llap_mem_normalized' : {0}, using following: total_llap_mem : {1}, " +- "yarn_min_container_size : {2}".format(total_llap_mem_normalized, total_llap_mem, yarn_min_container_size)) ++ self.logger.info("DBG: Calculated 'total_llap_mem_normalized' : {}, using following: total_llap_mem : {}, " ++ "yarn_min_container_size : {}".format(total_llap_mem_normalized, total_llap_mem, yarn_min_container_size)) + + # What percent is 'total_llap_mem' of 'total_cluster_capacity' ? + llap_named_queue_cap_fraction = math.ceil(total_llap_mem_normalized / total_cluster_capacity * 100) +- self.logger.info("DBG: Calculated '{0}' queue capacity percent = {1}.".format(llap_queue_name, llap_named_queue_cap_fraction)) ++ self.logger.info("DBG: Calculated '{}' queue capacity percent = {}.".format(llap_queue_name, llap_named_queue_cap_fraction)) + + if llap_named_queue_cap_fraction > 100: +- self.logger.warning("Calculated '{0}' queue size = {1}. Cannot be > 100.".format(llap_queue_name, llap_named_queue_cap_fraction)) ++ self.logger.warning("Calculated '{}' queue size = {}. Cannot be > 100.".format(llap_queue_name, llap_named_queue_cap_fraction)) + self.recommendDefaultLlapConfiguration(configurations, services, hosts) + return + + # Adjust capacity scheduler for the 'llap' named queue. + self.checkAndManageLlapQueue(services, configurations, hosts, llap_queue_name, llap_named_queue_cap_fraction) + hive_tez_am_cap_available = total_llap_mem_normalized +- self.logger.info("DBG: hive_tez_am_cap_available : {0}".format(hive_tez_am_cap_available)) ++ self.logger.info("DBG: hive_tez_am_cap_available : {}".format(hive_tez_am_cap_available)) + + # Common calculations now, irrespective of the queue selected. + + llap_mem_for_tezAm_and_daemons = total_llap_mem_normalized - slider_am_container_size +- self.logger.info("DBG: Calculated 'llap_mem_for_tezAm_and_daemons' : {0}, using following : total_llap_mem_normalized : {1}, " +- "slider_am_container_size : {2}".format(llap_mem_for_tezAm_and_daemons, total_llap_mem_normalized, slider_am_container_size)) ++ self.logger.info("DBG: Calculated 'llap_mem_for_tezAm_and_daemons' : {}, using following : total_llap_mem_normalized : {}, " ++ "slider_am_container_size : {}".format(llap_mem_for_tezAm_and_daemons, total_llap_mem_normalized, slider_am_container_size)) + + if llap_mem_for_tezAm_and_daemons < 2 * yarn_min_container_size: + self.logger.warning("Not enough capacity available on the cluster to run LLAP") +@@ -1104,49 +1104,49 @@ + # Read 'hive.server2.tez.sessions.per.default.queue' prop if it's in changed-configs, else calculate it. + if not llap_concurrency_in_changed_configs: + if max_executors_per_node <= 0: +- self.logger.warning("Calculated 'max_executors_per_node' = {0}. Expected value >= 1.".format(max_executors_per_node)) ++ self.logger.warning("Calculated 'max_executors_per_node' = {}. Expected value >= 1.".format(max_executors_per_node)) + self.recommendDefaultLlapConfiguration(configurations, services, hosts) + return + +- self.logger.info("DBG: Calculated 'max_executors_per_node' : {0}, using following: yarn_nm_mem_in_mb_normalized : {1}, cpu_per_nm_host : {2}, " +- "mem_per_thread_for_llap: {3}".format(max_executors_per_node, yarn_nm_mem_in_mb_normalized, cpu_per_nm_host, mem_per_thread_for_llap)) ++ self.logger.info("DBG: Calculated 'max_executors_per_node' : {}, using following: yarn_nm_mem_in_mb_normalized : {}, cpu_per_nm_host : {}, " ++ "mem_per_thread_for_llap: {}".format(max_executors_per_node, yarn_nm_mem_in_mb_normalized, cpu_per_nm_host, mem_per_thread_for_llap)) + + # Default 1 AM for every 20 executor threads. + # The second part of the min calculates based on mem required for DEFAULT_EXECUTOR_TO_AM_RATIO executors + 1 AM, + # making use of total memory. However, it's possible that total memory will not be used - and the numExecutors is + # instead limited by #CPUs. Use maxPerNode to factor this in. + llap_concurreny_limit = min(math.floor(max_executors_per_node * num_llap_nodes_requested / DEFAULT_EXECUTOR_TO_AM_RATIO), MAX_CONCURRENT_QUERIES) +- self.logger.info("DBG: Calculated 'llap_concurreny_limit' : {0}, using following : max_executors_per_node : {1}, num_llap_nodes_requested : {2}, DEFAULT_EXECUTOR_TO_AM_RATIO " +- ": {3}, MAX_CONCURRENT_QUERIES : {4}".format(llap_concurreny_limit, max_executors_per_node, num_llap_nodes_requested, DEFAULT_EXECUTOR_TO_AM_RATIO, MAX_CONCURRENT_QUERIES)) ++ self.logger.info("DBG: Calculated 'llap_concurreny_limit' : {}, using following : max_executors_per_node : {}, num_llap_nodes_requested : {}, DEFAULT_EXECUTOR_TO_AM_RATIO " ++ ": {}, MAX_CONCURRENT_QUERIES : {}".format(llap_concurreny_limit, max_executors_per_node, num_llap_nodes_requested, DEFAULT_EXECUTOR_TO_AM_RATIO, MAX_CONCURRENT_QUERIES)) + llap_concurrency = min(llap_concurreny_limit, math.floor(llap_mem_for_tezAm_and_daemons / (DEFAULT_EXECUTOR_TO_AM_RATIO * mem_per_thread_for_llap + normalized_tez_am_container_size))) +- self.logger.info("DBG: Calculated 'llap_concurrency' : {0}, using following : llap_concurreny_limit : {1}, llap_mem_for_tezAm_and_daemons : " +- "{2}, DEFAULT_EXECUTOR_TO_AM_RATIO : {3}, mem_per_thread_for_llap : {4}, normalized_tez_am_container_size : " +- "{5}".format(llap_concurrency, llap_concurreny_limit, llap_mem_for_tezAm_and_daemons, DEFAULT_EXECUTOR_TO_AM_RATIO, ++ self.logger.info("DBG: Calculated 'llap_concurrency' : {}, using following : llap_concurreny_limit : {}, llap_mem_for_tezAm_and_daemons : " ++ "{}, DEFAULT_EXECUTOR_TO_AM_RATIO : {}, mem_per_thread_for_llap : {}, normalized_tez_am_container_size : " ++ "{}".format(llap_concurrency, llap_concurreny_limit, llap_mem_for_tezAm_and_daemons, DEFAULT_EXECUTOR_TO_AM_RATIO, + mem_per_thread_for_llap, normalized_tez_am_container_size)) + if llap_concurrency == 0: + llap_concurrency = 1 + 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)) +- 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}))" ++ llap_concurrency = int(math.floor(hive_tez_am_cap_available / normalized_tez_am_container_size)) ++ self.logger.info("DBG: Readjusted 'llap_concurrency' to : {}, as llap_concurrency({}) * normalized_tez_am_container_size({}) > hive_tez_am_cap_available({}))" + .format(llap_concurrency, llap_concurrency, normalized_tez_am_container_size, hive_tez_am_cap_available)) + + if llap_concurrency <= 0: +- self.logger.warning("DBG: Calculated 'LLAP Concurrent Queries' = {0}. Expected value >= 1.".format(llap_concurrency)) ++ self.logger.warning("DBG: Calculated 'LLAP Concurrent Queries' = {}. Expected value >= 1.".format(llap_concurrency)) + self.recommendDefaultLlapConfiguration(configurations, services, hosts) + return +- self.logger.info("DBG: Adjusted 'llap_concurrency' : {0}, using following: hive_tez_am_cap_available : {1}, normalized_tez_am_container_size: " +- "{2}".format(llap_concurrency, hive_tez_am_cap_available, normalized_tez_am_container_size)) ++ self.logger.info("DBG: Adjusted 'llap_concurrency' : {}, using following: hive_tez_am_cap_available : {}, normalized_tez_am_container_size: " ++ "{}".format(llap_concurrency, hive_tez_am_cap_available, normalized_tez_am_container_size)) + 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.logger.warning("'hive.server2.tez.sessions.per.default.queue' current value : {}. Expected value : >= 1".format(llap_concurrency)) + self.recommendDefaultLlapConfiguration(configurations, services, hosts) + return +- self.logger.info("DBG: Read 'llap_concurrency' : {0}".format(llap_concurrency )) ++ self.logger.info("DBG: Read 'llap_concurrency' : {}".format(llap_concurrency )) + else: + llap_concurrency = 1 + self.logger.warning("Couldn't retrieve Hive Server interactive's 'hive.server2.tez.sessions.per.default.queue' config. Setting default value 1.") +@@ -1155,37 +1155,37 @@ + + # Calculate 'Max LLAP Consurrency', irrespective of whether 'llap_concurrency' was read or calculated. + max_llap_concurreny_limit = min(math.floor(max_executors_per_node * num_llap_nodes_requested / MIN_EXECUTOR_TO_AM_RATIO), MAX_CONCURRENT_QUERIES) +- self.logger.info("DBG: Calculated 'max_llap_concurreny_limit' : {0}, using following : max_executors_per_node : {1}, num_llap_nodes_requested " +- ": {2}, MIN_EXECUTOR_TO_AM_RATIO : {3}, MAX_CONCURRENT_QUERIES : {4}".format(max_llap_concurreny_limit, max_executors_per_node, ++ self.logger.info("DBG: Calculated 'max_llap_concurreny_limit' : {}, using following : max_executors_per_node : {}, num_llap_nodes_requested " ++ ": {}, MIN_EXECUTOR_TO_AM_RATIO : {}, MAX_CONCURRENT_QUERIES : {}".format(max_llap_concurreny_limit, max_executors_per_node, + num_llap_nodes_requested, MIN_EXECUTOR_TO_AM_RATIO, + MAX_CONCURRENT_QUERIES)) +- max_llap_concurreny = long(min(max_llap_concurreny_limit, math.floor(llap_mem_for_tezAm_and_daemons / (MIN_EXECUTOR_TO_AM_RATIO * ++ max_llap_concurreny = int(min(max_llap_concurreny_limit, math.floor(llap_mem_for_tezAm_and_daemons / (MIN_EXECUTOR_TO_AM_RATIO * + mem_per_thread_for_llap + normalized_tez_am_container_size)))) +- self.logger.info("DBG: Calculated 'max_llap_concurreny' : {0}, using following : max_llap_concurreny_limit : {1}, llap_mem_for_tezAm_and_daemons : " +- "{2}, MIN_EXECUTOR_TO_AM_RATIO : {3}, mem_per_thread_for_llap : {4}, normalized_tez_am_container_size : " +- "{5}".format(max_llap_concurreny, max_llap_concurreny_limit, llap_mem_for_tezAm_and_daemons, MIN_EXECUTOR_TO_AM_RATIO, ++ self.logger.info("DBG: Calculated 'max_llap_concurreny' : {}, using following : max_llap_concurreny_limit : {}, llap_mem_for_tezAm_and_daemons : " ++ "{}, MIN_EXECUTOR_TO_AM_RATIO : {}, mem_per_thread_for_llap : {}, normalized_tez_am_container_size : " ++ "{}".format(max_llap_concurreny, max_llap_concurreny_limit, llap_mem_for_tezAm_and_daemons, MIN_EXECUTOR_TO_AM_RATIO, + mem_per_thread_for_llap, normalized_tez_am_container_size)) + if int(max_llap_concurreny) < MAX_CONCURRENT_QUERIES_SMALL_CLUSTERS: +- self.logger.info("DBG: Adjusting 'max_llap_concurreny' from {0} to {1}".format(max_llap_concurreny, MAX_CONCURRENT_QUERIES_SMALL_CLUSTERS)) ++ self.logger.info("DBG: Adjusting 'max_llap_concurreny' from {} to {}".format(max_llap_concurreny, MAX_CONCURRENT_QUERIES_SMALL_CLUSTERS)) + max_llap_concurreny = MAX_CONCURRENT_QUERIES_SMALL_CLUSTERS + + if (max_llap_concurreny * normalized_tez_am_container_size) > hive_tez_am_cap_available: + max_llap_concurreny = math.floor(hive_tez_am_cap_available / normalized_tez_am_container_size) + if max_llap_concurreny <= 0: +- self.logger.warning("Calculated 'Max. LLAP Concurrent Queries' = {0}. Expected value > 1".format(max_llap_concurreny)) ++ self.logger.warning("Calculated 'Max. LLAP Concurrent Queries' = {}. Expected value > 1".format(max_llap_concurreny)) + self.recommendDefaultLlapConfiguration(configurations, services, hosts) + return +- self.logger.info("DBG: Adjusted 'max_llap_concurreny' : {0}, using following: hive_tez_am_cap_available : {1}, normalized_tez_am_container_size: " +- "{2}".format(max_llap_concurreny, hive_tez_am_cap_available, normalized_tez_am_container_size)) ++ self.logger.info("DBG: Adjusted 'max_llap_concurreny' : {}, using following: hive_tez_am_cap_available : {}, normalized_tez_am_container_size: " ++ "{}".format(max_llap_concurreny, hive_tez_am_cap_available, normalized_tez_am_container_size)) + + # Calculate value for 'num_llap_nodes', an across cluster config. + tez_am_memory_required = llap_concurrency * normalized_tez_am_container_size +- self.logger.info("DBG: Calculated 'tez_am_memory_required' : {0}, using following : llap_concurrency : {1}, normalized_tez_am_container_size : " +- "{2}".format(tez_am_memory_required, llap_concurrency, normalized_tez_am_container_size)) ++ self.logger.info("DBG: Calculated 'tez_am_memory_required' : {}, using following : llap_concurrency : {}, normalized_tez_am_container_size : " ++ "{}".format(tez_am_memory_required, llap_concurrency, normalized_tez_am_container_size)) + llap_mem_daemon_size = llap_mem_for_tezAm_and_daemons - tez_am_memory_required + + if llap_mem_daemon_size < yarn_min_container_size: +- self.logger.warning("Calculated 'LLAP Daemon Size = {0}'. Expected >= 'YARN Minimum Container Size' ({1})'".format( ++ self.logger.warning("Calculated 'LLAP Daemon Size = {}'. Expected >= 'YARN Minimum Container Size' ({})'".format( + llap_mem_daemon_size, yarn_min_container_size)) + self.recommendDefaultLlapConfiguration(configurations, services, hosts) + return +@@ -1194,29 +1194,29 @@ + self.logger.warning("Not enough memory available for executors.") + self.recommendDefaultLlapConfiguration(configurations, services, hosts) + return +- self.logger.info("DBG: Calculated 'llap_mem_daemon_size' : {0}, using following : llap_mem_for_tezAm_and_daemons : {1}, tez_am_memory_required : " +- "{2}".format(llap_mem_daemon_size, llap_mem_for_tezAm_and_daemons, tez_am_memory_required)) ++ self.logger.info("DBG: Calculated 'llap_mem_daemon_size' : {}, using following : llap_mem_for_tezAm_and_daemons : {}, tez_am_memory_required : " ++ "{}".format(llap_mem_daemon_size, llap_mem_for_tezAm_and_daemons, tez_am_memory_required)) + + llap_daemon_mem_per_node = self._normalizeDown(llap_mem_daemon_size / num_llap_nodes_requested, yarn_min_container_size) + # This value takes into account total cluster capacity, and may not have left enough capcaity on each node to launch an AM. +- self.logger.info("DBG: Calculated 'llap_daemon_mem_per_node' : {0}, using following : llap_mem_daemon_size : {1}, num_llap_nodes_requested : {2}, " +- "yarn_min_container_size: {3}".format(llap_daemon_mem_per_node, llap_mem_daemon_size, num_llap_nodes_requested, yarn_min_container_size)) ++ self.logger.info("DBG: Calculated 'llap_daemon_mem_per_node' : {}, using following : llap_mem_daemon_size : {}, num_llap_nodes_requested : {}, " ++ "yarn_min_container_size: {}".format(llap_daemon_mem_per_node, llap_mem_daemon_size, num_llap_nodes_requested, yarn_min_container_size)) + if llap_daemon_mem_per_node == 0: + # Small cluster. No capacity left on a node after running AMs. + llap_daemon_mem_per_node = self._normalizeUp(mem_per_thread_for_llap, yarn_min_container_size) + num_llap_nodes = math.floor(llap_mem_daemon_size / llap_daemon_mem_per_node) +- self.logger.info("DBG: 'llap_daemon_mem_per_node' : 0, adjusted 'llap_daemon_mem_per_node' : {0}, 'num_llap_nodes' : {1}, using following: llap_mem_daemon_size : {2}, " +- "mem_per_thread_for_llap : {3}".format(llap_daemon_mem_per_node, num_llap_nodes, llap_mem_daemon_size, mem_per_thread_for_llap)) ++ self.logger.info("DBG: 'llap_daemon_mem_per_node' : 0, adjusted 'llap_daemon_mem_per_node' : {}, 'num_llap_nodes' : {}, using following: llap_mem_daemon_size : {}, " ++ "mem_per_thread_for_llap : {}".format(llap_daemon_mem_per_node, num_llap_nodes, llap_mem_daemon_size, mem_per_thread_for_llap)) + elif llap_daemon_mem_per_node < mem_per_thread_for_llap: + # Previously computed value of memory per thread may be too high. Cut the number of nodes. (Alternately reduce memory per node) + llap_daemon_mem_per_node = mem_per_thread_for_llap + num_llap_nodes = math.floor(llap_mem_daemon_size / mem_per_thread_for_llap) +- self.logger.info("DBG: 'llap_daemon_mem_per_node'({0}) < mem_per_thread_for_llap({1}), adjusted 'llap_daemon_mem_per_node' " +- ": {2}".format(llap_daemon_mem_per_node, mem_per_thread_for_llap, llap_daemon_mem_per_node)) ++ self.logger.info("DBG: 'llap_daemon_mem_per_node'({}) < mem_per_thread_for_llap({}), adjusted 'llap_daemon_mem_per_node' " ++ ": {}".format(llap_daemon_mem_per_node, mem_per_thread_for_llap, llap_daemon_mem_per_node)) + else: + # All good. We have a proper value for memoryPerNode. + num_llap_nodes = num_llap_nodes_requested +- self.logger.info("DBG: num_llap_nodes : {0}".format(num_llap_nodes)) ++ self.logger.info("DBG: num_llap_nodes : {}".format(num_llap_nodes)) + + # Make sure we have enough memory on each node to run AMs. + # If nodes vs nodes_requested is different - AM memory is already factored in. +@@ -1230,50 +1230,50 @@ + tez_AMs_per_node_low = int(math.floor(tez_AMs_per_node)) + tez_AMs_per_node_high = int(math.ceil(tez_AMs_per_node)) + min_mem_reserved_per_node = int(max(tez_AMs_per_node_high * normalized_tez_am_container_size, tez_AMs_per_node_low * normalized_tez_am_container_size + slider_am_container_size)) +- self.logger.info("DBG: Determined 'AM reservation per node': {0}, using following : concurrency: {1}, num_llap_nodes: {2}, AMsPerNode: {3}" ++ self.logger.info("DBG: Determined 'AM reservation per node': {}, using following : concurrency: {}, num_llap_nodes: {}, AMsPerNode: {}" + .format(min_mem_reserved_per_node, llap_concurrency, num_llap_nodes, tez_AMs_per_node)) + + max_single_node_mem_available_for_daemon = self._normalizeDown(yarn_nm_mem_in_mb_normalized - min_mem_reserved_per_node, yarn_min_container_size) + if max_single_node_mem_available_for_daemon <=0 or max_single_node_mem_available_for_daemon < mem_per_thread_for_llap: +- self.logger.warning("Not enough capacity available per node for daemons after factoring in AM memory requirements. NM Mem: {0}, " +- "minAMMemPerNode: {1}, available: {2}".format(yarn_nm_mem_in_mb_normalized, min_mem_reserved_per_node, max_single_node_mem_available_for_daemon)) ++ self.logger.warning("Not enough capacity available per node for daemons after factoring in AM memory requirements. NM Mem: {}, " ++ "minAMMemPerNode: {}, available: {}".format(yarn_nm_mem_in_mb_normalized, min_mem_reserved_per_node, max_single_node_mem_available_for_daemon)) + self.recommendDefaultLlapConfiguration(configurations, services, hosts) + + llap_daemon_mem_per_node = min(max_single_node_mem_available_for_daemon, llap_daemon_mem_per_node) +- self.logger.info("DBG: Determined final memPerDaemon: {0}, using following: concurrency: {1}, numNMNodes: {2}, numLlapNodes: {3} " ++ self.logger.info("DBG: Determined final memPerDaemon: {}, using following: concurrency: {}, numNMNodes: {}, numLlapNodes: {} " + .format(llap_daemon_mem_per_node, llap_concurrency, node_manager_cnt, num_llap_nodes)) + + num_executors_per_node_max = self.get_max_executors_per_node(yarn_nm_mem_in_mb_normalized, cpu_per_nm_host, mem_per_thread_for_llap) + if num_executors_per_node_max < 1: +- self.logger.warning("Calculated 'Max. Executors per Node' = {0}. Expected values >= 1.".format(num_executors_per_node_max)) ++ self.logger.warning("Calculated 'Max. Executors per Node' = {}. Expected values >= 1.".format(num_executors_per_node_max)) + self.recommendDefaultLlapConfiguration(configurations, services, hosts) + return +- self.logger.info("DBG: Calculated 'num_executors_per_node_max' : {0}, using following : yarn_nm_mem_in_mb_normalized : {1}, cpu_per_nm_host : {2}, " +- "mem_per_thread_for_llap: {3}".format(num_executors_per_node_max, yarn_nm_mem_in_mb_normalized, cpu_per_nm_host, mem_per_thread_for_llap)) ++ self.logger.info("DBG: Calculated 'num_executors_per_node_max' : {}, using following : yarn_nm_mem_in_mb_normalized : {}, cpu_per_nm_host : {}, " ++ "mem_per_thread_for_llap: {}".format(num_executors_per_node_max, yarn_nm_mem_in_mb_normalized, cpu_per_nm_host, mem_per_thread_for_llap)) + + # NumExecutorsPerNode is not necessarily max - since some capacity would have been reserved for AMs, if this value were based on mem. + num_executors_per_node = min(math.floor(llap_daemon_mem_per_node / mem_per_thread_for_llap), num_executors_per_node_max) + if num_executors_per_node <= 0: +- self.logger.warning("Calculated 'Number of Executors Per Node' = {0}. Expected value >= 1".format(num_executors_per_node)) ++ self.logger.warning("Calculated 'Number of Executors Per Node' = {}. Expected value >= 1".format(num_executors_per_node)) + self.recommendDefaultLlapConfiguration(configurations, services, hosts) + return +- self.logger.info("DBG: Calculated 'num_executors_per_node' : {0}, using following : llap_daemon_mem_per_node : {1}, num_executors_per_node_max : {2}, " +- "mem_per_thread_for_llap: {3}".format(num_executors_per_node, llap_daemon_mem_per_node, num_executors_per_node_max, mem_per_thread_for_llap)) ++ self.logger.info("DBG: Calculated 'num_executors_per_node' : {}, using following : llap_daemon_mem_per_node : {}, num_executors_per_node_max : {}, " ++ "mem_per_thread_for_llap: {}".format(num_executors_per_node, llap_daemon_mem_per_node, num_executors_per_node_max, mem_per_thread_for_llap)) + + # Now figure out how much of the memory will be used by the executors, and how much will be used by the cache. + total_mem_for_executors_per_node = num_executors_per_node * mem_per_thread_for_llap + cache_mem_per_node = llap_daemon_mem_per_node - total_mem_for_executors_per_node +- self.logger.info("DBG: Calculated 'Cache per node' : {0}, using following : llap_daemon_mem_per_node : {1}, total_mem_for_executors_per_node : {2}" ++ self.logger.info("DBG: Calculated 'Cache per node' : {}, using following : llap_daemon_mem_per_node : {}, total_mem_for_executors_per_node : {}" + .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)) +- self.logger.info("DBG: Calculated llap_app_heap_size : {0}, using following : total_mem_for_executors : {1}".format(llap_xmx, total_mem_for_executors_per_node)) ++ self.logger.info("DBG: Calculated llap_app_heap_size : {}, using following : total_mem_for_executors : {}".format(llap_xmx, total_mem_for_executors_per_node)) + + # Calculate 'hive_heapsize' for Hive2/HiveServer2 (HSI) + hive_server_interactive_heapsize = None +@@ -1282,57 +1282,57 @@ + # 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)) ++ self.logger.info("DBG: Calculated 'hive_server_interactive_heapsize' : {}, using following : llap_concurrency : {}, host_mem : " ++ "{}".format(hive_server_interactive_heapsize, llap_concurrency, host_mem)) + + # Done with calculations, updating calculated configs. + 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)) ++ self.logger.info("DBG: Setting 'tez.am.resource.memory.mb' config value as : {}".format(normalized_tez_am_container_size)) + + if not llap_concurrency_in_changed_configs: + min_llap_concurrency = 1 +- putHiveInteractiveSiteProperty('hive.server2.tez.sessions.per.default.queue', long(llap_concurrency)) ++ putHiveInteractiveSiteProperty('hive.server2.tez.sessions.per.default.queue', int(llap_concurrency)) + putHiveInteractiveSitePropertyAttribute('hive.server2.tez.sessions.per.default.queue', "minimum", min_llap_concurrency) + + # Check if 'max_llap_concurreny' < 'llap_concurrency'. + if max_llap_concurreny < llap_concurrency: +- self.logger.info("DBG: Adjusting 'max_llap_concurreny' to : {0}, based on 'llap_concurrency' : {1} and " +- "earlier 'max_llap_concurreny' : {2}. ".format(llap_concurrency, llap_concurrency, max_llap_concurreny)) ++ self.logger.info("DBG: Adjusting 'max_llap_concurreny' to : {}, based on 'llap_concurrency' : {} and " ++ "earlier 'max_llap_concurreny' : {}. ".format(llap_concurrency, llap_concurrency, max_llap_concurreny)) + max_llap_concurreny = llap_concurrency +- putHiveInteractiveSitePropertyAttribute('hive.server2.tez.sessions.per.default.queue', "maximum", long(max_llap_concurreny)) ++ putHiveInteractiveSitePropertyAttribute('hive.server2.tez.sessions.per.default.queue', "maximum", int(max_llap_concurreny)) + +- 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 + if (num_llap_nodes != num_llap_nodes_requested): +- self.logger.info("DBG: User requested num_llap_nodes : {0}, but used/adjusted value for calculations is : {1}".format(num_llap_nodes_requested, num_llap_nodes)) ++ self.logger.info("DBG: User requested num_llap_nodes : {}, but used/adjusted value for calculations is : {}".format(num_llap_nodes_requested, num_llap_nodes)) + else: +- self.logger.info("DBG: Used num_llap_nodes for calculations : {0}".format(num_llap_nodes_requested)) ++ self.logger.info("DBG: Used num_llap_nodes for calculations : {}".format(num_llap_nodes_requested)) + + # Safeguard for not adding "num_llap_nodes_for_llap_daemons" if it doesnt exist in hive-interactive-site. + # This can happen if we upgrade from Ambari 2.4 (with HDP 2.5) to Ambari 2.5, as this config is from 2.6 stack onwards only. + if "hive-interactive-env" in services["configurations"] and \ + "num_llap_nodes_for_llap_daemons" in services["configurations"]["hive-interactive-env"]["properties"]: + 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)) ++ self.logger.info("DBG: Setting config 'num_llap_nodes_for_llap_daemons' as : {}".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) + + # 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)) ++ self.logger.info("DBG: Setting 'hive.tez.container.size' config value as : {}".format(mem_per_thread_for_llap)) + + + putTezInteractiveSiteProperty('tez.runtime.io.sort.mb', tez_runtime_io_sort_mb) +@@ -1343,15 +1343,15 @@ + 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) +- self.logger.info("DBG: Putting num_executors_per_node as {0}".format(num_executors_per_node)) ++ num_executors_per_node = int(num_executors_per_node) ++ self.logger.info("DBG: Putting num_executors_per_node as {}".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) +@@ -1359,11 +1359,11 @@ + if hive_server_interactive_heapsize is not None: + putHiveInteractiveEnvProperty("hive_heapsize", int(hive_server_interactive_heapsize)) + +- llap_io_enabled = 'true' if long(cache_mem_per_node) >= 64 else 'false' ++ llap_io_enabled = 'true' if int(cache_mem_per_node) >= 64 else 'false' + putHiveInteractiveSiteProperty('hive.llap.io.enabled', llap_io_enabled) + +- putHiveInteractiveEnvProperty('llap_heap_size', long(llap_xmx)) +- putHiveInteractiveEnvProperty('slider_am_container_mb', long(slider_am_container_size)) ++ putHiveInteractiveEnvProperty('llap_heap_size', int(llap_xmx)) ++ putHiveInteractiveEnvProperty('slider_am_container_mb', int(slider_am_container_size)) + self.logger.info("DBG: Done putting all configs") + + #TODO: What is this doing? What error will be displayed on the UI if something like this is hit? +@@ -1375,8 +1375,8 @@ + 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)) +- slider_am_container_size = long(self.calculate_slider_am_size(yarn_min_container_size)) ++ yarn_min_container_size = int(self.get_yarn_min_container_size(services, configurations)) ++ slider_am_container_size = int(self.calculate_slider_am_size(yarn_min_container_size)) + + node_manager_host_list = self.getHostsForComponent(services, "YARN", "NODEMANAGER") + node_manager_cnt = len(node_manager_host_list) +@@ -1421,7 +1421,7 @@ + elif hsi_env and 'num_llap_nodes' in hsi_env: + num_llap_nodes = hsi_env['num_llap_nodes'] + else: +- self.logger.error("Couldn't retrieve Hive Server 'num_llap_nodes' config. Setting value to {0}".format(num_llap_nodes)) ++ self.logger.error("Couldn't retrieve Hive Server 'num_llap_nodes' config. Setting value to {}".format(num_llap_nodes)) + + return float(num_llap_nodes) + +@@ -1447,10 +1447,10 @@ + else: + calculated_hive_tez_container_size = 4096 + +- self.logger.info("DBG: Calculated and returning 'hive_tez_container_size' : {0}".format(calculated_hive_tez_container_size)) ++ self.logger.info("DBG: Calculated and returning 'hive_tez_container_size' : {}".format(calculated_hive_tez_container_size)) + return calculated_hive_tez_container_size + else: +- self.logger.info("DBG: Returning 'hive_tez_container_size' : {0}".format(hive_tez_container_size)) ++ self.logger.info("DBG: Returning 'hive_tez_container_size' : {}".format(hive_tez_container_size)) + return hive_tez_container_size + + def get_hive_tez_container_size(self, services): +@@ -1483,13 +1483,13 @@ + # Check if 'llap_headroom_space' is modified in current SA invocation. + if 'hive-interactive-env' in configurations and 'llap_headroom_space' in configurations['hive-interactive-env']['properties']: + hive_container_size = float(configurations['hive-interactive-env']['properties']['llap_headroom_space']) +- self.logger.info("'llap_headroom_space' read from configurations as : {0}".format(llap_headroom_space)) ++ self.logger.info("'llap_headroom_space' read from configurations as : {}".format(llap_headroom_space)) + + if llap_headroom_space is None: + # Check if 'llap_headroom_space' is input in services array. + if 'llap_headroom_space' in services['configurations']['hive-interactive-env']['properties']: + llap_headroom_space = float(services['configurations']['hive-interactive-env']['properties']['llap_headroom_space']) +- self.logger.info("'llap_headroom_space' read from services as : {0}".format(llap_headroom_space)) ++ self.logger.info("'llap_headroom_space' read from services as : {}".format(llap_headroom_space)) + if not llap_headroom_space or llap_headroom_space < 1: + llap_headroom_space = 6144 # 6GB + self.logger.info("Couldn't read 'llap_headroom_space' from services or configurations. Returing default value : 6144 bytes") +@@ -1521,15 +1521,15 @@ + # Check if services["changed-configurations"] is empty and 'yarn.scheduler.minimum-allocation-mb' is modified in current ST invocation. + if not services["changed-configurations"] and yarn_site and yarn_min_allocation_property in yarn_site: + yarn_min_container_size = yarn_site[yarn_min_allocation_property] +- self.logger.info("DBG: 'yarn.scheduler.minimum-allocation-mb' read from output as : {0}".format(yarn_min_container_size)) ++ self.logger.info("DBG: 'yarn.scheduler.minimum-allocation-mb' read from output as : {}".format(yarn_min_container_size)) + + # Check if 'yarn.scheduler.minimum-allocation-mb' is input in services array. + elif yarn_site_properties and yarn_min_allocation_property in yarn_site_properties: + yarn_min_container_size = yarn_site_properties[yarn_min_allocation_property] +- self.logger.info("DBG: 'yarn.scheduler.minimum-allocation-mb' read from services as : {0}".format(yarn_min_container_size)) ++ self.logger.info("DBG: 'yarn.scheduler.minimum-allocation-mb' read from services as : {}".format(yarn_min_container_size)) + + if not yarn_min_container_size: +- self.logger.error("{0} was not found in the configuration".format(yarn_min_allocation_property)) ++ self.logger.error("{} was not found in the configuration".format(yarn_min_allocation_property)) + + return yarn_min_container_size + +@@ -1559,10 +1559,10 @@ + elif total_cluster_capacity > 98304: + calculated_tez_am_resource_memory_mb = 4096 + +- self.logger.info("DBG: Calculated and returning 'tez_am_resource_memory_mb' as : {0}".format(calculated_tez_am_resource_memory_mb)) ++ self.logger.info("DBG: Calculated and returning 'tez_am_resource_memory_mb' as : {}".format(calculated_tez_am_resource_memory_mb)) + return float(calculated_tez_am_resource_memory_mb) + else: +- self.logger.info("DBG: Returning 'tez_am_resource_memory_mb' as : {0}".format(tez_am_resource_memory_mb)) ++ self.logger.info("DBG: Returning 'tez_am_resource_memory_mb' as : {}".format(tez_am_resource_memory_mb)) + return float(tez_am_resource_memory_mb) + + def get_tez_am_resource_memory_mb(self, services): +@@ -1586,10 +1586,10 @@ + 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)) + slider_am_size = self.calculate_slider_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(slider_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) +@@ -1632,7 +1632,7 @@ + capacity_scheduler_properties, received_as_key_value_pair = self.getCapacitySchedulerProperties(services) + if capacity_scheduler_properties: + leafQueueNames = self.getAllYarnLeafQueues(capacity_scheduler_properties) +- cap_sched_config_keys = capacity_scheduler_properties.keys() ++ cap_sched_config_keys = list(capacity_scheduler_properties.keys()) + + yarn_default_queue_capacity = -1 + if 'yarn.scheduler.capacity.root.default.capacity' in cap_sched_config_keys: +@@ -1675,7 +1675,7 @@ + # 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 \ +@@ -1711,7 +1711,7 @@ + # If capacity-scheduler configs are received as a dictionary (generally 1st time), we deposit the changed + # values back as dictionary itself. + # Update existing configs in 'capacity-scheduler'. +- 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': + putCapSchedProperty(prop, 'default,llap') +@@ -1743,11 +1743,11 @@ + + if updated_cap_sched_configs_str or updated_cap_sched_configs_as_dict: + if len(leafQueueNames) == 1: # 'llap' queue didn't exist before +- self.logger.info("Created YARN Queue : '{0}' with capacity : {1}%. Adjusted 'default' queue capacity to : {2}%" \ ++ self.logger.info("Created YARN Queue : '{}' with capacity : {}%. Adjusted 'default' queue capacity to : {}%" \ + .format(llap_queue_name, llap_queue_cap_perc, adjusted_default_queue_cap)) + else: # Queue existed, only adjustments done. +- self.logger.info("Adjusted YARN Queue : '{0}'. Current capacity : {1}%. State: RUNNING.".format(llap_queue_name, llap_queue_cap_perc)) +- self.logger.info("Adjusted 'default' queue capacity to : {0}%".format(adjusted_default_queue_cap)) ++ self.logger.info("Adjusted YARN Queue : '{}'. Current capacity : {}%. State: RUNNING.".format(llap_queue_name, llap_queue_cap_perc)) ++ self.logger.info("Adjusted 'default' queue capacity to : {}%".format(adjusted_default_queue_cap)) + + # Update Hive 'hive.llap.daemon.queue.name' prop to use 'llap' queue. + putHiveInteractiveSiteProperty('hive.llap.daemon.queue.name', llap_queue_name) +@@ -1755,7 +1755,7 @@ + # Update 'hive.llap.daemon.queue.name' prop combo entries and llap capacity slider visibility. + self.setLlapDaemonQueuePropAttributes(services, configurations) + else: +- self.logger.debug("Not creating/adjusting {0} queue. Current YARN queues : {1}".format(llap_queue_name, list(leafQueueNames))) ++ self.logger.debug("Not creating/adjusting {} queue. Current YARN queues : {}".format(llap_queue_name, list(leafQueueNames))) + else: + self.logger.error("Couldn't retrieve 'capacity-scheduler' properties while doing YARN queue adjustment for Hive Server Interactive.") + +@@ -1780,14 +1780,14 @@ + if len(leafQueueNames) == 2 and llap_queue_name in leafQueueNames and 'default' in leafQueueNames: + # Get 'llap' queue state + currLlapQueueState = 'STOPPED' +- if 'yarn.scheduler.capacity.root.'+llap_queue_name+'.state' in capacity_scheduler_properties.keys(): ++ if 'yarn.scheduler.capacity.root.'+llap_queue_name+'.state' in list(capacity_scheduler_properties.keys()): + currLlapQueueState = capacity_scheduler_properties.get('yarn.scheduler.capacity.root.'+llap_queue_name+'.state') + else: +- self.logger.error("{0} queue 'state' property not present in capacity scheduler. Skipping adjusting queues.".format(llap_queue_name)) ++ self.logger.error("{} queue 'state' property not present in capacity scheduler. Skipping adjusting queues.".format(llap_queue_name)) + return + if currLlapQueueState == 'RUNNING': + DEFAULT_MAX_CAPACITY = '100' +- for prop, val in capacity_scheduler_properties.items(): ++ for prop, val in list(capacity_scheduler_properties.items()): + # Update 'default' related configs in 'updated_default_queue_configs' + if llap_queue_name not in prop: + if prop == 'yarn.scheduler.capacity.root.default.capacity': +@@ -1816,19 +1816,19 @@ + elif prop.startswith('yarn.'): + updated_llap_queue_configs = updated_llap_queue_configs + prop + "=" + val + "\n" + else: +- self.logger.debug("{0} queue state is : {1}. Skipping adjusting queues.".format(llap_queue_name, currLlapQueueState)) ++ self.logger.debug("{} queue state is : {}. Skipping adjusting queues.".format(llap_queue_name, currLlapQueueState)) + return + + if updated_default_queue_configs and updated_llap_queue_configs: + putCapSchedProperty("capacity-scheduler", updated_default_queue_configs+updated_llap_queue_configs) +- self.logger.info("Changed YARN '{0}' queue state to 'STOPPED', and capacity to 0%. Adjusted 'default' queue capacity to : {1}%" \ ++ self.logger.info("Changed YARN '{}' queue state to 'STOPPED', and capacity to 0%. Adjusted 'default' queue capacity to : {}%" \ + .format(llap_queue_name, DEFAULT_MAX_CAPACITY)) + + # Update Hive 'hive.llap.daemon.queue.name' prop to use 'default' queue. + putHiveInteractiveSiteProperty('hive.llap.daemon.queue.name', self.YARN_ROOT_DEFAULT_QUEUE_NAME) + putHiveInteractiveSiteProperty('hive.server2.tez.default.queues', self.YARN_ROOT_DEFAULT_QUEUE_NAME) + else: +- self.logger.debug("Not removing '{0}' queue as number of Queues not equal to 2. Current YARN queues : {1}".format(llap_queue_name, list(leafQueueNames))) ++ self.logger.debug("Not removing '{}' queue as number of Queues not equal to 2. Current YARN queues : {}".format(llap_queue_name, list(leafQueueNames))) + else: + self.logger.error("Couldn't retrieve 'capacity-scheduler' properties while doing YARN queue adjustment for Hive Server Interactive.") + +@@ -1858,11 +1858,11 @@ + capacity_scheduler_properties[key] = value + self.logger.info("'capacity-scheduler' configs is set as a single '\\n' separated string in current invocation. " + "count(configurations['capacity-scheduler']['properties']['capacity-scheduler']) = " +- "{0}".format(len(capacity_scheduler_properties))) ++ "{}".format(len(capacity_scheduler_properties))) + else: +- self.logger.info("Read configurations['capacity-scheduler']['properties']['capacity-scheduler'] is : {0}".format(cap_sched_props_as_str)) ++ self.logger.info("Read configurations['capacity-scheduler']['properties']['capacity-scheduler'] is : {}".format(cap_sched_props_as_str)) + else: +- self.logger.info("configurations['capacity-scheduler']['properties']['capacity-scheduler'] : {0}.".format(cap_sched_props_as_str)) ++ self.logger.info("configurations['capacity-scheduler']['properties']['capacity-scheduler'] : {}.".format(cap_sched_props_as_str)) + + # if 'capacity_scheduler_properties' is empty, implies we may have 'capacity-scheduler' configs as dictionary + # in configurations, if 'capacity-scheduler' changed in current invocation. +@@ -1871,7 +1871,7 @@ + capacity_scheduler_properties = cap_sched_props_as_dict + self.logger.info("'capacity-scheduler' changed in current Stack Advisor invocation. Retrieved the configs as dictionary from configurations.") + else: +- self.logger.info("Read configurations['capacity-scheduler']['properties'] is : {0}".format(cap_sched_props_as_dict)) ++ self.logger.info("Read configurations['capacity-scheduler']['properties'] is : {}".format(cap_sched_props_as_dict)) + else: + self.logger.info("'capacity-scheduler' not modified in the current Stack Advisor invocation.") + +@@ -1888,7 +1888,7 @@ + leafQueues = [{"label": str(queueName), "value": queueName} for queueName in leafQueueNames] + leafQueues = sorted(leafQueues, key=lambda q: q['value']) + putHiveInteractiveSitePropertyAttribute("hive.llap.daemon.queue.name", "entries", leafQueues) +- self.logger.info("'hive.llap.daemon.queue.name' config Property Attributes set to : {0}".format(leafQueues)) ++ self.logger.info("'hive.llap.daemon.queue.name' config Property Attributes set to : {}".format(leafQueues)) + else: + self.logger.error("Problem retrieving YARN queues. Skipping updating HIVE Server Interactve " + "'hive.server2.tez.default.queues' property attributes.") +@@ -1898,7 +1898,7 @@ + Retrieves the passed in queue's 'capacity' related key from Capacity Scheduler. + """ + # Identify the key which contains the capacity for 'llap_daemon_selected_queue_name'. +- cap_sched_keys = capacity_scheduler_properties.keys() ++ cap_sched_keys = list(capacity_scheduler_properties.keys()) + llap_selected_queue_cap_key = None + current_selected_queue_for_llap_cap = None + for key in cap_sched_keys: +@@ -1914,7 +1914,7 @@ + Retrieves the passed in queue's 'state' from Capacity Scheduler. + """ + # Identify the key which contains the state for 'llap_daemon_selected_queue_name'. +- cap_sched_keys = capacity_scheduler_properties.keys() ++ cap_sched_keys = list(capacity_scheduler_properties.keys()) + llap_selected_queue_state_key = None + llap_selected_queue_state = None + for key in cap_sched_keys: +@@ -1930,19 +1930,19 @@ + pertaining to passed-in queue is not present. + """ + # Identify the key which contains the AM fraction for 'llap_daemon_selected_queue_name'. +- cap_sched_keys = capacity_scheduler_properties.keys() ++ cap_sched_keys = list(capacity_scheduler_properties.keys()) + llap_selected_queue_am_percent_key = None + for key in cap_sched_keys: + if key.endswith("."+llap_daemon_selected_queue_name+".maximum-am-resource-percent"): + llap_selected_queue_am_percent_key = key +- self.logger.info("AM percent key got for '{0}' queue is : '{1}'".format(llap_daemon_selected_queue_name, llap_selected_queue_am_percent_key)) ++ self.logger.info("AM percent key got for '{}' queue is : '{}'".format(llap_daemon_selected_queue_name, llap_selected_queue_am_percent_key)) + break; + if llap_selected_queue_am_percent_key is None: +- self.logger.info("Returning default AM percent value : '0.1' for queue : {0}".format(llap_daemon_selected_queue_name)) ++ self.logger.info("Returning default AM percent value : '0.1' for queue : {}".format(llap_daemon_selected_queue_name)) + return 0.1 # Default value to use if we couldn't retrieve queue's corresponding AM Percent key. + else: + llap_selected_queue_am_percent = capacity_scheduler_properties.get(llap_selected_queue_am_percent_key) +- self.logger.info("Returning read value for key '{0}' as : '{1}' for queue : '{2}'".format(llap_selected_queue_am_percent_key, ++ self.logger.info("Returning read value for key '{}' as : '{}' for queue : '{}'".format(llap_selected_queue_am_percent_key, + llap_selected_queue_am_percent, + llap_daemon_selected_queue_name)) + return llap_selected_queue_am_percent +@@ -1951,14 +1951,14 @@ + """ + Calculates the total available capacity for the passed-in YARN queue of any level based on the percentages. + """ +- self.logger.info("Entered __getSelectedQueueTotalCap fn() with llap_daemon_selected_queue_name= '{0}'.".format(llap_daemon_selected_queue_name)) ++ self.logger.info("Entered __getSelectedQueueTotalCap fn() with llap_daemon_selected_queue_name= '{}'.".format(llap_daemon_selected_queue_name)) + available_capacity = total_cluster_capacity + queue_cap_key = self.__getQueueCapacityKeyFromCapacityScheduler(capacity_scheduler_properties, llap_daemon_selected_queue_name) + for queue in self._queues_list(queue_cap_key): + queue_cap_key = self.__getQueueCapacityKeyFromCapacityScheduler(capacity_scheduler_properties, queue) + queue_cap_perc = float(capacity_scheduler_properties.get(queue_cap_key)) + available_capacity = queue_cap_perc / 100 * available_capacity +- self.logger.info("Total capacity available for queue {0} is : {1}".format(queue, available_capacity)) ++ self.logger.info("Total capacity available for queue {} is : {}".format(queue, available_capacity)) + # returns the capacity calculated for passed-in queue in 'llap_daemon_selected_queue_name'. + return available_capacity + +@@ -1974,7 +1974,7 @@ + return [] + + def recommendRangerKMSConfigurations(self, configurations, clusterData, services, hosts): +- super(HDP25StackAdvisor, self).recommendRangerKMSConfigurations(configurations, clusterData, services, hosts) ++ super().recommendRangerKMSConfigurations(configurations, clusterData, services, hosts) + + security_enabled = self.isSecurityEnabled(services) + required_services = [{'service' : 'RANGER', 'config-type': 'ranger-env', 'property-name': 'ranger_user', 'proxy-category': ['hosts', 'users', 'groups']}, +@@ -1987,7 +1987,7 @@ + self.deleteKMSProxyUsers(configurations, services, hosts, required_services) + + def recommendRangerConfigurations(self, configurations, clusterData, services, hosts): +- super(HDP25StackAdvisor, self).recommendRangerConfigurations(configurations, clusterData, services, hosts) ++ super().recommendRangerConfigurations(configurations, clusterData, services, hosts) + servicesList = [service["StackServices"]["service_name"] for service in services["services"]] + has_ranger_tagsync = False + +@@ -2016,7 +2016,7 @@ + if application_properties and 'atlas.server.http.port' in application_properties: + atlas_port = application_properties['atlas.server.http.port'] + +- atlas_rest_endpoint = '{0}://{1}:{2}'.format(protocol, atlas_host, atlas_port) ++ atlas_rest_endpoint = '{}://{}:{}'.format(protocol, atlas_host, atlas_port) + + putTagsyncSiteProperty('ranger.tagsync.source.atlas', 'true') + putTagsyncSiteProperty('ranger.tagsync.source.atlasrest.endpoint', atlas_rest_endpoint) +@@ -2057,10 +2057,10 @@ + if 'infra-solr-env' in services['configurations'] and \ + ('infra_solr_znode' in services['configurations']['infra-solr-env']['properties']): + infra_solr_znode = services['configurations']['infra-solr-env']['properties']['infra_solr_znode'] +- ranger_audit_zk_port = '{0}{1}'.format(zookeeper_host_port, infra_solr_znode) ++ ranger_audit_zk_port = '{}{}'.format(zookeeper_host_port, infra_solr_znode) + putRangerAdminProperty('ranger.audit.solr.zookeepers', ranger_audit_zk_port) + elif zookeeper_host_port and is_solr_cloud_enabled and is_external_solr_cloud_enabled: +- ranger_audit_zk_port = '{0}/{1}'.format(zookeeper_host_port, 'ranger_audits') ++ ranger_audit_zk_port = '{}/{}'.format(zookeeper_host_port, 'ranger_audits') + putRangerAdminProperty('ranger.audit.solr.zookeepers', ranger_audit_zk_port) + else: + putRangerAdminProperty('ranger.audit.solr.zookeepers', 'NONE') +@@ -2140,7 +2140,7 @@ + xasecure_audit_destination_hdfs = services['configurations']['ranger-env']['properties']['xasecure.audit.destination.hdfs'] + + if 'core-site' in services['configurations'] and ('fs.defaultFS' in services['configurations']['core-site']['properties']): +- xasecure_audit_destination_hdfs_dir = '{0}/{1}/{2}'.format(services['configurations']['core-site']['properties']['fs.defaultFS'] ,'ranger','audit') ++ xasecure_audit_destination_hdfs_dir = '{}/{}/{}'.format(services['configurations']['core-site']['properties']['fs.defaultFS'] ,'ranger','audit') + + if 'xasecure.audit.destination.solr' in configurations['ranger-env']['properties']: + xasecure_audit_destination_solr = configurations['ranger-env']['properties']['xasecure.audit.destination.solr'] +@@ -2201,7 +2201,7 @@ + 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 = [] + +@@ -2212,4 +2212,4 @@ + putLivyProperty('livy.superusers', ','.join(_superusers)) + + def isComponentUsingCardinalityForLayout(self, componentName): +- return super(HDP25StackAdvisor, self).isComponentUsingCardinalityForLayout (componentName) or componentName in ['SPARK2_THRIFTSERVER', 'LIVY2_SERVER', 'LIVY_SERVER'] ++ return super().isComponentUsingCardinalityForLayout (componentName) or componentName in ['SPARK2_THRIFTSERVER', 'LIVY2_SERVER', 'LIVY_SERVER'] +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.6/services/stack_advisor.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.6/services/stack_advisor.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDP/2.6/services/stack_advisor.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDP/2.6/services/stack_advisor.py 2022-07-11 00:52:35.000000000 +0800 +@@ -30,11 +30,11 @@ + + class HDP26StackAdvisor(HDP25StackAdvisor): + def __init__(self): +- super(HDP26StackAdvisor, self).__init__() ++ super().__init__() + self.initialize_logger("HDP26StackAdvisor") + + def getServiceConfigurationRecommenderDict(self): +- parentRecommendConfDict = super(HDP26StackAdvisor, self).getServiceConfigurationRecommenderDict() ++ parentRecommendConfDict = super().getServiceConfigurationRecommenderDict() + childRecommendConfDict = { + "DRUID": self.recommendDruidConfigurations, + "SUPERSET": self.recommendSupersetConfigurations, +@@ -70,7 +70,7 @@ + :type services dict + :type hosts dict + """ +- super(HDP26StackAdvisor, self).recommendSpark2Configurations(configurations, clusterData, services, hosts) ++ super().recommendSpark2Configurations(configurations, clusterData, services, hosts) + self.__addZeppelinToLivy2SuperUsers(configurations, services) + + def recommendZEPPELINConfigurations(self, configurations, clusterData, services, hosts): +@@ -80,7 +80,7 @@ + :type services dict + :type hosts dict + """ +- super(HDP26StackAdvisor, self).recommendZeppelinConfigurations(configurations, clusterData, services, hosts) ++ super().recommendZeppelinConfigurations(configurations, clusterData, services, hosts) + + cluster_env = self.getServicesSiteProperties(services, "cluster-env") + if cluster_env and "recommendations_full_stack_version" in cluster_env: +@@ -99,7 +99,7 @@ + self.__addZeppelinToLivy2SuperUsers(configurations, services) + + def recommendAtlasConfigurations(self, configurations, clusterData, services, hosts): +- super(HDP26StackAdvisor, self).recommendAtlasConfigurations(configurations, clusterData, services, hosts) ++ super().recommendAtlasConfigurations(configurations, clusterData, services, hosts) + self.recommendAtlasConfigurationsForSSO(configurations, clusterData, services, hosts) + + def recommendAtlasConfigurationsForSSO(self, configurations, clusterData, services, hosts): +@@ -122,7 +122,7 @@ + + if 'gateway-site' in services['configurations'] and 'gateway.port' in services['configurations']["gateway-site"]["properties"]: + knox_port = services['configurations']["gateway-site"]["properties"]['gateway.port'] +- putAtlasApplicationProperty('atlas.sso.knox.providerurl', 'https://{0}:{1}/gateway/knoxsso/api/v1/websso'.format(knox_host, knox_port)) ++ putAtlasApplicationProperty('atlas.sso.knox.providerurl', 'https://{}:{}/gateway/knoxsso/api/v1/websso'.format(knox_host, knox_port)) + + if ambari_sso_details and ambari_sso_details.is_managing_services(): + # If SSO should be enabled for this service +@@ -256,7 +256,7 @@ + putSupersetProperty("SUPERSET_DATABASE_PORT", "") + + def recommendYARNConfigurations(self, configurations, clusterData, services, hosts): +- super(HDP26StackAdvisor, self).recommendYARNConfigurations(configurations, clusterData, services, hosts) ++ super().recommendYARNConfigurations(configurations, clusterData, services, hosts) + putYarnSiteProperty = self.putProperty(configurations, "yarn-site", services) + putYarnEnvProperty = self.putProperty(configurations, "yarn-env", services) + servicesList = [service["StackServices"]["service_name"] for service in services["services"]] +@@ -342,17 +342,17 @@ + if host_mem is not None: + yarn_timeline_app_cache_size = self.calculate_yarn_apptimelineserver_cache_size(host_mem) + putYarnSiteProperty('yarn.timeline-service.entity-group-fs-store.app-cache-size', yarn_timeline_app_cache_size) +- self.logger.info("Updated YARN config 'yarn.timeline-service.entity-group-fs-store.app-cache-size' as : {0}, " +- "using 'host_mem' = {1}".format(yarn_timeline_app_cache_size, host_mem)) ++ self.logger.info("Updated YARN config 'yarn.timeline-service.entity-group-fs-store.app-cache-size' as : {}, " ++ "using 'host_mem' = {}".format(yarn_timeline_app_cache_size, host_mem)) + else: + self.logger.info("Couldn't update YARN config 'yarn.timeline-service.entity-group-fs-store.app-cache-size' as " +- "'host_mem' read = {0}".format(host_mem)) ++ "'host_mem' read = {}".format(host_mem)) + + if yarn_timeline_app_cache_size is not None: + # Calculation for 'ats_heapsize' is in MB. + ats_heapsize = self.calculate_yarn_apptimelineserver_heapsize(host_mem, yarn_timeline_app_cache_size) + putYarnEnvProperty('apptimelineserver_heapsize', ats_heapsize) # Value in MB +- self.logger.info("Updated YARN config 'apptimelineserver_heapsize' as : {0}, ".format(ats_heapsize)) ++ self.logger.info("Updated YARN config 'apptimelineserver_heapsize' as : {}, ".format(ats_heapsize)) + + """ + Calculate YARN config 'apptimelineserver_heapsize' in MB. +@@ -362,7 +362,7 @@ + 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 + + """ +@@ -376,7 +376,7 @@ + yarn_timeline_app_cache_size = 7 + elif host_mem >= 8192: + yarn_timeline_app_cache_size = 10 +- self.logger.info("Calculated and returning 'yarn_timeline_app_cache_size' : {0}".format(yarn_timeline_app_cache_size)) ++ self.logger.info("Calculated and returning 'yarn_timeline_app_cache_size' : {}".format(yarn_timeline_app_cache_size)) + return yarn_timeline_app_cache_size + + +@@ -394,10 +394,10 @@ + + if yarn_site_in_services and yarn_ats_app_cache_size_config in yarn_site_in_services: + yarn_ats_app_cache_size = yarn_site_in_services[yarn_ats_app_cache_size_config] +- self.logger.info("'yarn.scheduler.minimum-allocation-mb' read from services as : {0}".format(yarn_ats_app_cache_size)) ++ self.logger.info("'yarn.scheduler.minimum-allocation-mb' read from services as : {}".format(yarn_ats_app_cache_size)) + + if not yarn_ats_app_cache_size: +- self.logger.error("'{0}' was not found in the services".format(yarn_ats_app_cache_size_config)) ++ self.logger.error("'{}' was not found in the services".format(yarn_ats_app_cache_size_config)) + + return yarn_ats_app_cache_size + +@@ -456,7 +456,7 @@ + return min_cpu + + def getServiceConfigurationValidators(self): +- parentValidators = super(HDP26StackAdvisor, self).getServiceConfigurationValidators() ++ parentValidators = super().getServiceConfigurationValidators() + childValidators = { + "DRUID": {"druid-env": self.validateDruidEnvConfigurations, + "druid-historical": self.validateDruidHistoricalConfigurations, +@@ -532,17 +532,17 @@ + return self.toConfigurationValidationProblems(validationItems, "druid-broker") + + def recommendTezConfigurations(self, configurations, clusterData, services, hosts): +- super(HDP26StackAdvisor, self).recommendTezConfigurations(configurations, clusterData, services, hosts) ++ super().recommendTezConfigurations(configurations, clusterData, services, hosts) + putTezProperty = self.putProperty(configurations, "tez-site") + + # TEZ JVM options + jvmGCParams = "-XX:+UseParallelGC" + if "ambari-server-properties" in services and "java.home" in services["ambari-server-properties"]: + # JDK8 needs different parameters +- match = re.match(".*\/jdk(1\.\d+)[\-\_\.][^/]*$", services["ambari-server-properties"]["java.home"]) ++ match = re.match(r".*\/jdk(1\.\d+)[\-\_\.][^/]*$", services["ambari-server-properties"]["java.home"]) + if match and len(match.groups()) > 0: + # Is version >= 1.8 +- versionSplits = re.split("\.", match.group(1)) ++ versionSplits = re.split(r"\.", match.group(1)) + if versionSplits and len(versionSplits) > 1 and int(versionSplits[0]) > 0 and int(versionSplits[1]) > 7: + jvmGCParams = "-XX:+UseG1GC -XX:+ResizeTLAB" + tez_jvm_opts = "-XX:+PrintGCDetails -verbose:gc -XX:+PrintGCTimeStamps -XX:+UseNUMA " +@@ -552,10 +552,10 @@ + putTezProperty('tez.am.launch.cmd-opts', tez_jvm_updated_opts) + putTezProperty('tez.task.launch.cmd-opts', tez_jvm_updated_opts) + self.logger.info("Updated 'tez-site' config 'tez.task.launch.cmd-opts' and 'tez.am.launch.cmd-opts' as " +- ": {0}".format(tez_jvm_updated_opts)) ++ ": {}".format(tez_jvm_updated_opts)) + + def recommendRangerConfigurations(self, configurations, clusterData, services, hosts): +- super(HDP26StackAdvisor, self).recommendRangerConfigurations(configurations, clusterData, services, hosts) ++ super().recommendRangerConfigurations(configurations, clusterData, services, hosts) + + putRangerUgsyncSite = self.putProperty(configurations, 'ranger-ugsync-site', services) + +@@ -609,7 +609,7 @@ + return self.toConfigurationValidationProblems(validationItems, "ranger-ugsync-site") + + def recommendRangerKMSConfigurations(self, configurations, clusterData, services, hosts): +- super(HDP26StackAdvisor, self).recommendRangerKMSConfigurations(configurations, clusterData, services, hosts) ++ super().recommendRangerKMSConfigurations(configurations, clusterData, services, hosts) + putRangerKmsEnvProperty = self.putProperty(configurations, "kms-env", services) + + ranger_kms_ssl_enabled = False +@@ -626,7 +626,7 @@ + putRangerKmsEnvProperty("kms_port", "9292") + + def recommendHDFSConfigurations(self, configurations, clusterData, services, hosts): +- super(HDP26StackAdvisor, self).recommendHDFSConfigurations(configurations, clusterData, services, hosts) ++ super().recommendHDFSConfigurations(configurations, clusterData, services, hosts) + if 'hadoop-env' in services['configurations'] and 'hdfs_user' in services['configurations']['hadoop-env']['properties']: + hdfs_user = services['configurations']['hadoop-env']['properties']['hdfs_user'] + else: +@@ -647,7 +647,7 @@ + self.logger.info("Not setting HDFS Repo user for Ranger.") + + def recommendHIVEConfigurations(self, configurations, clusterData, services, hosts): +- super(HDP26StackAdvisor, self).recommendHIVEConfigurations(configurations, clusterData, services, hosts) ++ super().recommendHIVEConfigurations(configurations, clusterData, services, hosts) + putHiveAtlasHookProperty = self.putProperty(configurations, "hive-atlas-application.properties", services) + putHiveAtlasHookPropertyAttribute = self.putPropertyAttribute(configurations,"hive-atlas-application.properties") + +@@ -720,12 +720,12 @@ + if hosts and config_type in services['configurations']: + host = hosts[0]['Hosts']['host_name'] + port = services['configurations'][config_type]['properties']['druid.port'] +- return "%s:%s" % (host, port) ++ return "{}:{}".format(host, port) + else: + return default_host + + def recommendHBASEConfigurations(self, configurations, clusterData, services, hosts): +- super(HDP26StackAdvisor, self).recommendHBASEConfigurations(configurations, clusterData, services, hosts) ++ super().recommendHBASEConfigurations(configurations, clusterData, services, hosts) + if 'hbase-env' in services['configurations'] and 'hbase_user' in services['configurations']['hbase-env']['properties']: + hbase_user = services['configurations']['hbase-env']['properties']['hbase_user'] + else: +@@ -746,7 +746,7 @@ + self.logger.info("Not setting Hbase Repo user for Ranger.") + + def recommendKAFKAConfigurations(self, configurations, clusterData, services, hosts): +- super(HDP26StackAdvisor, self).recommendKAFKAConfigurations(configurations, clusterData, services, hosts) ++ super().recommendKAFKAConfigurations(configurations, clusterData, services, hosts) + if 'kafka-env' in services['configurations'] and 'kafka_user' in services['configurations']['kafka-env']['properties']: + kafka_user = services['configurations']['kafka-env']['properties']['kafka_user'] + else: +@@ -792,7 +792,7 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDPWIN/2.1/hooks/after-INSTALL/scripts/hook.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDPWIN/2.1/hooks/after-INSTALL/scripts/hook.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDPWIN/2.1/hooks/after-INSTALL/scripts/hook.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDPWIN/2.1/hooks/after-INSTALL/scripts/hook.py 2022-07-11 00:52:35.000000000 +0800 +@@ -35,8 +35,8 @@ + params.config["hostLevelParams"]["agentCacheDir"], + params.config['ambariLevelParams']['jdk_location'], + ["sqljdbc4.jar", "sqljdbc_auth.dll"]) +- except Exception, e: +- raise Fail("Unable to deploy the required JDBC driver in the class path. Error info: {0}".format(e.message)) ++ except Exception as e: ++ raise Fail("Unable to deploy the required JDBC driver in the class path. Error info: {}".format(e.message)) + + XmlConfig("core-site.xml", + conf_dir=params.hadoop_conf_dir, +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDPWIN/2.1/hooks/after-INSTALL/scripts/params.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDPWIN/2.1/hooks/after-INSTALL/scripts/params.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDPWIN/2.1/hooks/after-INSTALL/scripts/params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDPWIN/2.1/hooks/after-INSTALL/scripts/params.py 2022-07-11 00:52:35.000000000 +0800 +@@ -18,7 +18,7 @@ + """ + from resource_management import * + import os +-from urlparse import urlparse ++from urllib.parse import urlparse + + config = Script.get_config() + hadoop_conf_dir = None +@@ -27,15 +27,15 @@ + hdfs_user = hadoop_user + hadoop_common_bin = "bin" + +-if os.environ.has_key("HADOOP_CONF_DIR"): ++if "HADOOP_CONF_DIR" in os.environ: + hadoop_conf_dir = os.environ["HADOOP_CONF_DIR"] +-if os.environ.has_key("HADOOP_COMMON_HOME"): ++if "HADOOP_COMMON_HOME" in os.environ: + hadoop_common_dir = os.path.join(os.environ["HADOOP_COMMON_HOME"], "share", "hadoop", "common", "lib") + hadoop_common_bin = os.path.join(os.environ["HADOOP_COMMON_HOME"], "bin") +-if os.environ.has_key("HBASE_HOME"): ++if "HBASE_HOME" in os.environ: + hbase_lib_dir = os.path.join(os.environ["HBASE_HOME"], "lib") + +-if os.environ.has_key("HADOOP_NODE_INSTALL_ROOT"): ++if "HADOOP_NODE_INSTALL_ROOT" in os.environ: + hadoop_install_root = os.environ["HADOOP_NODE_INSTALL_ROOT"] + + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDPWIN/2.1/hooks/before-ANY/scripts/setup_jdk.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDPWIN/2.1/hooks/before-ANY/scripts/setup_jdk.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDPWIN/2.1/hooks/before-ANY/scripts/setup_jdk.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDPWIN/2.1/hooks/before-ANY/scripts/setup_jdk.py 2022-07-11 00:52:35.000000000 +0800 +@@ -18,7 +18,7 @@ + """ + + import os +-import urllib2 ++import urllib.request, urllib.error, urllib.parse + + from ambari_commons.inet_utils import download_file + from resource_management import * +@@ -42,7 +42,7 @@ + if not os.path.exists(params.java_home): + os.makedirs(params.java_home) + jdk_setup_savepath = os.path.join(params.java_home, params.jdk_name) +- jdk_download_url = "{0}/{1}".format(params.jdk_location, params.jdk_name) ++ jdk_download_url = "{}/{}".format(params.jdk_location, params.jdk_name) + download_file(jdk_download_url, jdk_setup_savepath) + Execute(_install_cmd.format(jdk_setup_savepath, params.java_home)) + if not _check_installed(): +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDPWIN/2.1/services/stack_advisor.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDPWIN/2.1/services/stack_advisor.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDPWIN/2.1/services/stack_advisor.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDPWIN/2.1/services/stack_advisor.py 2022-07-11 00:52:35.000000000 +0800 +@@ -29,7 +29,7 @@ + class HDPWIN21StackAdvisor(DefaultStackAdvisor): + + def __init__(self): +- super(HDPWIN21StackAdvisor, self).__init__() ++ super().__init__() + + self.initialize_logger("HDPWIN21StackAdvisor") + +@@ -45,7 +45,7 @@ + Modify the set of masters with multiple instances. + Must be overriden in child class. + """ +- self.mastersWithMultipleInstances |= set(['ZOOKEEPER_SERVER', 'HBASE_MASTER']) ++ self.mastersWithMultipleInstances |= {'ZOOKEEPER_SERVER', 'HBASE_MASTER'} + + def modifyCardinalitiesDict(self): + """ +@@ -72,14 +72,14 @@ + Modify the set of components whose host assignment is based on other services. + Must be overriden in child class. + """ +- self.notValuableComponents |= set(['JOURNALNODE', 'ZKFC', 'APP_TIMELINE_SERVER']) ++ self.notValuableComponents |= {'JOURNALNODE', 'ZKFC', 'APP_TIMELINE_SERVER'} + + def modifyComponentsNotPreferableOnServer(self): + """ + Modify the set of components that are not preferable on the server. + Must be overriden in child class. + """ +- self.notPreferableOnServerComponents |= set(['STORM_UI_SERVER', 'DRPC_SERVER', 'STORM_REST_API', 'NIMBUS']) ++ self.notPreferableOnServerComponents |= {'STORM_UI_SERVER', 'DRPC_SERVER', 'STORM_REST_API', 'NIMBUS'} + + def modifyComponentLayoutSchemes(self): + """ +@@ -112,7 +112,7 @@ + items = [] + + # Validating NAMENODE and SECONDARY_NAMENODE are on different hosts if possible +- hostsSet = set(super(HDPWIN21StackAdvisor, self).getActiveHosts([host["Hosts"] for host in hosts["items"]])) ++ hostsSet = set(super().getActiveHosts([host["Hosts"] for host in hosts["items"]])) + hostsCount = len(hostsSet) + + componentsListList = [service["components"] for service in services["services"]] +@@ -135,19 +135,19 @@ + if "+" in cardinality: + hostsMin = int(cardinality[:-1]) + if componentHostsCount < hostsMin: +- message = "At least {0} {1} components should be installed in cluster.".format(hostsMin, componentDisplayName) ++ message = "At least {} {} components should be installed in cluster.".format(hostsMin, componentDisplayName) + elif "-" in cardinality: + nums = cardinality.split("-") + hostsMin = int(nums[0]) + hostsMax = int(nums[1]) + if componentHostsCount > hostsMax or componentHostsCount < hostsMin: +- message = "Between {0} and {1} {2} components should be installed in cluster.".format(hostsMin, hostsMax, componentDisplayName) ++ message = "Between {} and {} {} components should be installed in cluster.".format(hostsMin, hostsMax, componentDisplayName) + elif "ALL" == cardinality: + if componentHostsCount != hostsCount: +- message = "{0} component should be installed on all hosts in cluster.".format(componentDisplayName) ++ message = "{} component should be installed on all hosts in cluster.".format(componentDisplayName) + else: + if componentHostsCount != int(cardinality): +- message = "Exactly {0} {1} components should be installed in cluster.".format(int(cardinality), componentDisplayName) ++ message = "Exactly {} {} components should be installed in cluster.".format(int(cardinality), componentDisplayName) + + if message is not None: + items.append({"type": 'host-component', "level": 'ERROR', "message": message, "component-name": componentName}) +@@ -178,9 +178,9 @@ + changedConfigs = [] + # if services parameter, prefer values, set by user + if services: +- if 'configurations' in services.keys(): ++ if 'configurations' in list(services.keys()): + userConfigs = services['configurations'] +- if 'changed-configurations' in services.keys(): ++ if 'changed-configurations' in list(services.keys()): + changedConfigs = services["changed-configurations"] + + if configType not in config: +@@ -405,12 +405,12 @@ + serviceName = service["StackServices"]["service_name"] + validator = self.validateServiceConfigurations(serviceName) + if validator is not None: +- for siteName, method in validator.items(): ++ for siteName, method in list(validator.items()): + if siteName in recommendedDefaults: + siteProperties = getSiteProperties(configurations, siteName) + if siteProperties is not None: + siteRecommendations = recommendedDefaults[siteName]["properties"] +- self.logger.info("SiteName: %s, method: %s\n" % (siteName, method.__name__)) ++ self.logger.info("SiteName: {}, method: {}\n".format(siteName, method.__name__)) + self.logger.info("Site properties: %s\n" % str(siteProperties)) + self.logger.info("Recommendations: %s\n********\n" % str(siteRecommendations)) + resultItems = method(siteProperties, siteRecommendations, configurations, services, hosts) +@@ -469,13 +469,13 @@ + userValue = convertToNumber(configurations[configName]["properties"][propertyName]) + maxValue = convertToNumber(recommendedDefaults[configName]["property_attributes"][propertyName]["maximum"]) + if userValue > maxValue: +- validationItems.extend([{"config-name": propertyName, "item": self.getWarnItem("Value is greater than the recommended maximum of {0} ".format(maxValue))}]) ++ validationItems.extend([{"config-name": propertyName, "item": self.getWarnItem("Value is greater than the recommended maximum of {} ".format(maxValue))}]) + if "minimum" in recommendedDefaults[configName]["property_attributes"][propertyName] and \ + propertyName in recommendedDefaults[configName]["properties"]: + userValue = convertToNumber(configurations[configName]["properties"][propertyName]) + minValue = convertToNumber(recommendedDefaults[configName]["property_attributes"][propertyName]["minimum"]) + if userValue < minValue: +- validationItems.extend([{"config-name": propertyName, "item": self.getWarnItem("Value is less than the recommended minimum of {0} ".format(minValue))}]) ++ validationItems.extend([{"config-name": propertyName, "item": self.getWarnItem("Value is less than the recommended minimum of {} ".format(minValue))}]) + items.extend(self.toConfigurationValidationProblems(validationItems, configName)) + pass + +@@ -519,7 +519,7 @@ + if defaultValue is None: + return None + if value < defaultValue: +- return self.getWarnItem("Value is less than the recommended default of {0}".format(defaultValue)) ++ return self.getWarnItem("Value is less than the recommended default of {}".format(defaultValue)) + return None + + def validatorEqualsPropertyItem(self, properties1, propertyName1, +@@ -537,7 +537,7 @@ + return self.getErrorItem("Empty value for %s" % propertyName2) + if value1 != value2: + return self.getWarnItem("It is recommended to set equal values " +- "for properties {0} and {1}".format(propertyName1, propertyName2)) ++ "for properties {} and {}".format(propertyName1, propertyName2)) + + return None + +@@ -668,7 +668,7 @@ + mountPoints = {} + for mountPoint in hostInfo["disk_info"]: + mountPoints[mountPoint["mountpoint"]] = to_number(mountPoint["available"]) +- mountPoint = getMountPointForDir(dir, mountPoints.keys()) ++ mountPoint = getMountPointForDir(dir, list(mountPoints.keys())) + + if not mountPoints: + return self.getErrorItem("No disk info found on host {0}", hostInfo["host_name"]) +@@ -695,7 +695,7 @@ + if component["StackServiceComponents"]["hostnames"] is not None: + for hostName in component["StackServiceComponents"]["hostnames"]: + if self.isMasterComponent(component): +- if hostName not in hostMasterComponents.keys(): ++ if hostName not in list(hostMasterComponents.keys()): + hostMasterComponents[hostName] = [] + hostMasterComponents[hostName].append(component["StackServiceComponents"]["component_name"]) + +@@ -774,17 +774,17 @@ + + def to_number(s): + try: +- return int(re.sub("\D", "", s)) ++ return int(re.sub(r"\D", "", s)) + except ValueError: + return None + + def checkXmxValueFormat(value): +- p = re.compile('-Xmx(\d+)(b|k|m|g|p|t|B|K|M|G|P|T)?') ++ p = re.compile(r'-Xmx(\d+)(b|k|m|g|p|t|B|K|M|G|P|T)?') + matches = p.findall(value) + return len(matches) == 1 + + def getXmxSize(value): +- p = re.compile("-Xmx(\d+)(.?)") ++ p = re.compile(r"-Xmx(\d+)(.?)") + result = p.findall(value)[0] + if len(result) > 1: + # result[1] - is a space or size formatter (b|k|m|g etc) +@@ -877,7 +877,7 @@ + def getMemorySizeRequired(components, configurations): + totalMemoryRequired = 512*1024*1024 # 512Mb for OS needs + for component in components: +- if component in getHeapsizeProperties().keys(): ++ if component in list(getHeapsizeProperties().keys()): + heapSizeProperties = getHeapsizeProperties()[component] + for heapSizeProperty in heapSizeProperties: + try: +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDPWIN/2.2/services/stack_advisor.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDPWIN/2.2/services/stack_advisor.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDPWIN/2.2/services/stack_advisor.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDPWIN/2.2/services/stack_advisor.py 2022-07-11 00:52:35.000000000 +0800 +@@ -22,7 +22,7 @@ + import os + import re + import sys +-from urlparse import urlparse ++from urllib.parse import urlparse + + # Local Imports + +@@ -35,7 +35,7 @@ + class HDPWIN22StackAdvisor(HDPWIN21StackAdvisor): + + def __init__(self): +- super(HDPWIN22StackAdvisor, self).__init__() ++ super().__init__() + self.initialize_logger("HDPWIN22StackAdvisor") + + self.modifyMastersWithMultipleInstances() +@@ -49,7 +49,7 @@ + Modify the set of masters with multiple instances. + Must be overriden in child class. + """ +- self.mastersWithMultipleInstances |= set(['METRICS_COLLECTOR']) ++ self.mastersWithMultipleInstances |= {'METRICS_COLLECTOR'} + + def modifyCardinalitiesDict(self): + """ +@@ -75,17 +75,17 @@ + Modify the set of components whose host assignment is based on other services. + Must be overriden in child class. + """ +- self.notValuableComponents |= set(['METRICS_MONITOR']) ++ self.notValuableComponents |= {'METRICS_MONITOR'} + + def modifyComponentsNotPreferableOnServer(self): + """ + Modify the set of components that are not preferable on the server. + Must be overriden in child class. + """ +- self.notPreferableOnServerComponents |= set(['METRICS_COLLECTOR']) ++ self.notPreferableOnServerComponents |= {'METRICS_COLLECTOR'} + + def getServiceConfigurationRecommenderDict(self): +- parentRecommendConfDict = super(HDPWIN22StackAdvisor, self).getServiceConfigurationRecommenderDict() ++ parentRecommendConfDict = super().getServiceConfigurationRecommenderDict() + childRecommendConfDict = { + "HDFS": self.recommendHDFSConfigurations, + "HIVE": self.recommendHIVEConfigurations, +@@ -211,7 +211,7 @@ + putHdfsSitePropertyAttribute('dfs.datanode.failed.volumes.tolerated', 'maximum', dataDirsCount) + + def recommendYARNConfigurations(self, configurations, clusterData, services, hosts): +- super(HDPWIN22StackAdvisor, self).recommendYARNConfigurations(configurations, clusterData, services, hosts) ++ super().recommendYARNConfigurations(configurations, clusterData, services, hosts) + putYarnProperty = self.putProperty(configurations, "yarn-site", services) + putYarnProperty('yarn.nodemanager.resource.cpu-vcores', clusterData['cpu']) + putYarnProperty('yarn.scheduler.minimum-allocation-vcores', 1) +@@ -290,7 +290,7 @@ + putMapredPropertyAttribute("yarn.app.mapreduce.am.resource.mb", "minimum", yarnMinAllocationSize) + + def recommendHIVEConfigurations(self, configurations, clusterData, services, hosts): +- super(HDPWIN22StackAdvisor, self).recommendHiveConfigurations(configurations, clusterData, services, hosts) ++ super().recommendHiveConfigurations(configurations, clusterData, services, hosts) + + hiveSiteProperties = getSiteProperties(services['configurations'], 'hive-site') + hiveEnvProperties = getSiteProperties(services['configurations'], 'hive-env') +@@ -530,7 +530,7 @@ + + + def recommendHBASEConfigurations(self, configurations, clusterData, services, hosts): +- super(HDPWIN22StackAdvisor, self).recommendHbaseEnvConfigurations(configurations, clusterData, services, hosts) ++ super().recommendHbaseEnvConfigurations(configurations, clusterData, services, hosts) + putHbaseEnvPropertyAttributes = self.putPropertyAttribute(configurations, "hbase-env") + + hmaster_host = self.getHostWithComponent("HBASE", "HBASE_MASTER", services, hosts) +@@ -584,7 +584,7 @@ + bucketcache_offheap_memory = regionserver_max_direct_memory_size - reserved_offheap_memory + hbase_bucketcache_size = block_cache_heap + bucketcache_offheap_memory + hbase_bucketcache_percentage_in_combinedcache = float(bucketcache_offheap_memory) / hbase_bucketcache_size +- hbase_bucketcache_percentage_in_combinedcache_str = "{0:.4f}".format(math.ceil(hbase_bucketcache_percentage_in_combinedcache * 10000) / 10000.0) ++ hbase_bucketcache_percentage_in_combinedcache_str = "{:.4f}".format(math.ceil(hbase_bucketcache_percentage_in_combinedcache * 10000) / 10000.0) + + # Set values in hbase-site + putHbaseProperty = self.putProperty(configurations, "hbase-site", services) +@@ -665,7 +665,7 @@ + putTezProperty("tez.session.am.dag.submit.timeout.secs", "600") + + def getServiceConfigurationValidators(self): +- parentValidators = super(HDPWIN22StackAdvisor, self).getServiceConfigurationValidators() ++ parentValidators = super().getServiceConfigurationValidators() + childValidators = { + "HDFS": {"hdfs-site": self.validateHDFSConfigurations, + "hadoop-env": self.validateHDFSConfigurationsEnv}, +@@ -823,7 +823,7 @@ + if dfs_http_policy_value not in VALID_HTTP_POLICY_VALUES: + validationItems.append({"config-name": dfs_http_policy, + "item": self.getWarnItem( +- "Invalid property value: {0}. Valid values are {1}".format( ++ "Invalid property value: {}. Valid values are {}".format( + dfs_http_policy_value, VALID_HTTP_POLICY_VALUES))}) + + # determine whether we use secure ports +@@ -870,12 +870,12 @@ + elif not data_transfer_protection_value in VALID_TRANSFER_PROTECTION_VALUES: + validationItems.append({"config-name": data_transfer_protection, + "item": self.getWarnItem( +- "Invalid property value: {0}. Valid values are {1}.".format( ++ "Invalid property value: {}. Valid values are {}.".format( + data_transfer_protection_value, VALID_TRANSFER_PROTECTION_VALUES))}) + return self.toConfigurationValidationProblems(validationItems, "hdfs-site") + + def validateHiveServer2Configurations(self, properties, recommendedDefaults, configurations, services, hosts): +- super(HDPWIN22StackAdvisor, self).validateHiveConfigurations(properties, recommendedDefaults, configurations, services, hosts) ++ super().validateHiveConfigurations(properties, recommendedDefaults, configurations, services, hosts) + hive_server2 = properties + validationItems = [] + #Adding Ranger Plugin logic here +@@ -892,14 +892,14 @@ + validationItems.append({"config-name": prop_name, + "item": self.getWarnItem( + "If Ranger Hive Plugin is enabled."\ +- " {0} needs to be set to {1}".format(prop_name,prop_val))}) ++ " {} needs to be set to {}".format(prop_name,prop_val))}) + prop_name = 'hive.security.authenticator.manager' + prop_val = "org.apache.hadoop.hive.ql.security.SessionStateUserAuthenticator" + if hive_server2[prop_name] != prop_val: + validationItems.append({"config-name": prop_name, + "item": self.getWarnItem( + "If Ranger Hive Plugin is enabled."\ +- " {0} needs to be set to {1}".format(prop_name,prop_val))}) ++ " {} needs to be set to {}".format(prop_name,prop_val))}) + ##Add stack validations for Ranger plugin disabled. + elif (ranger_plugin_enabled.lower() == 'No'.lower()): + prop_name = 'hive.security.authorization.manager' +@@ -908,14 +908,14 @@ + validationItems.append({"config-name": prop_name, + "item": self.getWarnItem( + "If Ranger Hive Plugin is disabled."\ +- " {0} needs to be set to {1}".format(prop_name,prop_val))}) ++ " {} needs to be set to {}".format(prop_name,prop_val))}) + prop_name = 'hive.security.authenticator.manager' + prop_val = "org.apache.hadoop.hive.ql.security.SessionStateUserAuthenticator" + if hive_server2[prop_name] != prop_val: + validationItems.append({"config-name": prop_name, + "item": self.getWarnItem( + "If Ranger Hive Plugin is disabled."\ +- " {0} needs to be set to {1}".format(prop_name,prop_val))}) ++ " {} needs to be set to {}".format(prop_name,prop_val))}) + return self.toConfigurationValidationProblems(validationItems, "hiveserver2-site") + + def validateHiveConfigurationsEnv(self, properties, recommendedDefaults, configurations, services, hosts): +@@ -931,7 +931,7 @@ + return self.toConfigurationValidationProblems(validationItems, "hive-env") + + def validateHiveConfigurations(self, properties, recommendedDefaults, configurations, services, hosts): +- super(HDPWIN22StackAdvisor, self).validateHiveConfigurations(properties, recommendedDefaults, configurations, services, hosts) ++ super().validateHiveConfigurations(properties, recommendedDefaults, configurations, services, hosts) + hive_site = properties + validationItems = [] + #Adding Ranger Plugin logic here +@@ -948,7 +948,7 @@ + validationItems.append({"config-name": prop_name, + "item": self.getWarnItem( + "If Ranger Hive Plugin is enabled." \ +- " {0} needs to be set to {1}".format(prop_name,prop_val))}) ++ " {} needs to be set to {}".format(prop_name,prop_val))}) + + prop_name = 'hive.conf.restricted.list' + prop_vals = 'hive.security.authorization.enabled,hive.security.authorization.manager,hive.security.authenticator.manager'.split(',') +@@ -963,7 +963,7 @@ + validationItems.append({"config-name": prop_name, + "item": self.getWarnItem( + "If Ranger Hive Plugin is enabled." \ +- " {0} needs to contain {1}".format(prop_name, ','.join(missing_vals)))}) ++ " {} needs to contain {}".format(prop_name, ','.join(missing_vals)))}) + stripe_size_values = [8388608, 16777216, 33554432, 67108864, 134217728, 268435456] + stripe_size_property = "hive.exec.orc.default.stripe.size" + if int(properties[stripe_size_property]) not in stripe_size_values: +@@ -971,7 +971,7 @@ + return self.toConfigurationValidationProblems(validationItems, "hive-site") + + def validateHBASEConfigurations(self, properties, recommendedDefaults, configurations, services, hosts): +- super(HDPWIN22StackAdvisor, self).validateHbaseEnvConfigurations(properties, recommendedDefaults, configurations, services, hosts) ++ super().validateHbaseEnvConfigurations(properties, recommendedDefaults, configurations, services, hosts) + hbase_site = properties + validationItems = [] + +@@ -982,15 +982,15 @@ + if not is_number(hbase_site[prop_name1]): + validationItems.append({"config-name": prop_name1, + "item": self.getWarnItem( +- "{0} should be float value".format(prop_name1))}) ++ "{} should be float value".format(prop_name1))}) + elif not is_number(hbase_site[prop_name2]): + validationItems.append({"config-name": prop_name2, + "item": self.getWarnItem( +- "{0} should be float value".format(prop_name2))}) ++ "{} should be float value".format(prop_name2))}) + elif float(hbase_site[prop_name1]) + float(hbase_site[prop_name2]) > props_max_sum: + validationItems.append({"config-name": prop_name1, + "item": self.getWarnItem( +- "{0} and {1} sum should not exceed {2}".format(prop_name1, prop_name2, props_max_sum))}) ++ "{} and {} sum should not exceed {}".format(prop_name1, prop_name2, props_max_sum))}) + + #Adding Ranger Plugin logic here + ranger_plugin_properties = getSiteProperties(configurations, "ranger-hbase-plugin-properties") +@@ -1003,7 +1003,7 @@ + validationItems.append({"config-name": prop_name, + "item": self.getWarnItem( + "If Ranger HBase Plugin is enabled."\ +- "{0} needs to be set to {1}".format(prop_name,prop_val))}) ++ "{} needs to be set to {}".format(prop_name,prop_val))}) + prop_name = "hbase.coprocessor.master.classes" + prop_val = "com.xasecure.authorization.hbase.XaSecureAuthorizationCoprocessor" + exclude_val = "org.apache.hadoop.hbase.security.access.AccessController" +@@ -1013,7 +1013,7 @@ + validationItems.append({"config-name": prop_name, + "item": self.getWarnItem( + "If Ranger HBase Plugin is enabled."\ +- " {0} needs to contain {1} instead of {2}".format(prop_name,prop_val,exclude_val))}) ++ " {} needs to contain {} instead of {}".format(prop_name,prop_val,exclude_val))}) + prop_name = "hbase.coprocessor.region.classes" + prop_val = "com.xasecure.authorization.hbase.XaSecureAuthorizationCoprocessor" + if (prop_val in hbase_site[prop_name] and exclude_val not in hbase_site[prop_name]): +@@ -1022,7 +1022,7 @@ + validationItems.append({"config-name": prop_name, + "item": self.getWarnItem( + "If Ranger HBase Plugin is enabled."\ +- " {0} needs to contain {1} instead of {2}".format(prop_name,prop_val,exclude_val))}) ++ " {} needs to contain {} instead of {}".format(prop_name,prop_val,exclude_val))}) + + # Validate bucket cache correct config + prop_name = "hbase.bucketcache.ioengine" +@@ -1031,7 +1031,7 @@ + validationItems.append({"config-name": prop_name, + "item": self.getWarnItem( + "Recommended values of " \ +- " {0} is empty or '{1}'".format(prop_name,prop_val))}) ++ " {} is empty or '{}'".format(prop_name,prop_val))}) + + prop_name1 = "hbase.bucketcache.ioengine" + prop_name2 = "hbase.bucketcache.size" +@@ -1040,11 +1040,11 @@ + if prop_name1 in hbase_site and prop_name2 in hbase_site and hbase_site[prop_name1] and not hbase_site[prop_name2]: + validationItems.append({"config-name": prop_name2, + "item": self.getWarnItem( +- "If bucketcache ioengine is enabled, {0} should be set".format(prop_name2))}) ++ "If bucketcache ioengine is enabled, {} should be set".format(prop_name2))}) + if prop_name1 in hbase_site and prop_name3 in hbase_site and hbase_site[prop_name1] and not hbase_site[prop_name3]: + validationItems.append({"config-name": prop_name3, + "item": self.getWarnItem( +- "If bucketcache ioengine is enabled, {0} should be set".format(prop_name3))}) ++ "If bucketcache ioengine is enabled, {} should be set".format(prop_name3))}) + + # Validate hbase.security.authentication. + # Kerberos works only when security enabled. +@@ -1071,7 +1071,7 @@ + if prop_name1 in hbase_site_properties and prop_name in hbase_env and hbase_site_properties[prop_name1] and hbase_site_properties[prop_name1] == "offheap" and not hbase_env[prop_name]: + validationItems.append({"config-name": prop_name, + "item": self.getWarnItem( +- "If bucketcache ioengine is enabled, {0} should be set".format(prop_name))}) ++ "If bucketcache ioengine is enabled, {} should be set".format(prop_name))}) + + return self.toConfigurationValidationProblems(validationItems, "hbase-env") + +@@ -1110,7 +1110,7 @@ + return driverDict.get(databaseType.upper()) + + def getAffectedConfigs(self, services): +- affectedConfigs = super(HDPWIN22StackAdvisor, self).getAffectedConfigs(services) ++ affectedConfigs = super().getAffectedConfigs(services) + + # There are configs that are not defined in the stack but added/removed by + # stack-advisor. Here we add such configs in order to clear the config +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDPWIN/2.3/services/stack_advisor.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDPWIN/2.3/services/stack_advisor.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/HDPWIN/2.3/services/stack_advisor.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/HDPWIN/2.3/services/stack_advisor.py 2022-07-11 00:52:35.000000000 +0800 +@@ -20,7 +20,7 @@ + class HDPWIN23StackAdvisor(HDPWIN22StackAdvisor): + + def getServiceConfigurationRecommenderDict(self): +- parentRecommendConfDict = super(HDPWIN23StackAdvisor, self).getServiceConfigurationRecommenderDict() ++ parentRecommendConfDict = super().getServiceConfigurationRecommenderDict() + childRecommendConfDict = { + "TEZ": self.recommendTezConfigurations, + "OOZIE": self.recommendOozieConfigurations +@@ -29,7 +29,7 @@ + return parentRecommendConfDict + + def recommendTezConfigurations(self, configurations, clusterData, services, hosts): +- super(HDPWIN23StackAdvisor, self).recommendTezConfigurations(configurations, clusterData, services, hosts) ++ super().recommendTezConfigurations(configurations, clusterData, services, hosts) + + putTezProperty = self.putProperty(configurations, "tez-site") + # remove 2gb limit for tez.runtime.io.sort.mb +@@ -44,7 +44,7 @@ + putTezAttribute("tez.runtime.io.sort.mb", "maximum", 2047) + + def recommendOozieConfigurations(self, configurations, clusterData, services, hosts): +- super(HDPWIN23StackAdvisor, self).recommendOozieConfigurations(configurations, clusterData, services, hosts) ++ super().recommendOozieConfigurations(configurations, clusterData, services, hosts) + + oozieSiteProperties = getSiteProperties(services['configurations'], 'oozie-site') + oozieEnvProperties = getSiteProperties(services['configurations'], 'oozie-env') +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/hooks/after-INSTALL/scripts/hook.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/hooks/after-INSTALL/scripts/hook.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/hooks/after-INSTALL/scripts/hook.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/hooks/after-INSTALL/scripts/hook.py 2022-07-11 00:52:35.000000000 +0800 +@@ -22,7 +22,7 @@ + class AfterInstallHook(Hook): + + def hook(self, env): +- print "After Install Hook" ++ print("After Install Hook") + + if __name__ == "__main__": + AfterInstallHook().execute() +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/hooks/before-ANY/scripts/hook.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/hooks/before-ANY/scripts/hook.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/hooks/before-ANY/scripts/hook.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/hooks/before-ANY/scripts/hook.py 2022-07-11 00:52:35.000000000 +0800 +@@ -23,7 +23,7 @@ + class BeforeAnyHook(Hook): + + def hook(self, env): +- print "Before Any Hook" ++ print("Before Any Hook") + import params + env.set_params(params) + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/hooks/before-ANY/scripts/shared_initialization.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/hooks/before-ANY/scripts/shared_initialization.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/hooks/before-ANY/scripts/shared_initialization.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/hooks/before-ANY/scripts/shared_initialization.py 2022-07-11 00:52:35.000000000 +0800 +@@ -72,7 +72,7 @@ + ) + + File(jdk_curl_target, +- mode = 0755, ++ mode = 0o755, + ) + + tmp_java_dir = tempfile.mkdtemp(prefix="jdk_tmp_", dir=params.tmp_dir) +@@ -99,7 +99,7 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/hooks/before-INSTALL/scripts/conf-select.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/hooks/before-INSTALL/scripts/conf-select.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/hooks/before-INSTALL/scripts/conf-select.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/hooks/before-INSTALL/scripts/conf-select.py 2022-07-11 00:52:35.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/hooks/before-INSTALL/scripts/distro-select.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/hooks/before-INSTALL/scripts/distro-select.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/hooks/before-INSTALL/scripts/distro-select.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/hooks/before-INSTALL/scripts/distro-select.py 2022-07-11 00:52:35.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + """ + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file +@@ -51,7 +51,7 @@ + + with open(dest, 'r') as f: + for line in f: +- print line ++ print(line) + + + def versions_file_destination(): +@@ -69,11 +69,11 @@ + if len(args) >= 2: + for line in f: + if args[1] in line: +- print line ++ print(line) + pass + + for line in f: +- print line ++ print(line) + + + def set_version(args): +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/hooks/before-INSTALL/scripts/hook.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/hooks/before-INSTALL/scripts/hook.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/hooks/before-INSTALL/scripts/hook.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/hooks/before-INSTALL/scripts/hook.py 2022-07-11 00:52:35.000000000 +0800 +@@ -38,12 +38,12 @@ + + def hook(self, env): + self.run_custom_hook('before-ANY') +- print "Before Install Hook" ++ print("Before Install Hook") + cache_dir = self.extrakt_var_from_pythonpath(AMBARI_AGENT_CACHE_DIR) + + # this happens if PythonExecutor.py.sed hack was not done. + if not cache_dir: +- print "WARN: Cache dir for the agent could not be detected. Using default cache dir" ++ print("WARN: Cache dir for the agent could not be detected. Using default cache dir") + cache_dir = DEFAULT_AMBARI_AGENT_CACHE_DIR + + conf_select = os.path.join(cache_dir, CONF_SELECT_PY) +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/hooks/before-RESTART/scripts/hook.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/hooks/before-RESTART/scripts/hook.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/hooks/before-RESTART/scripts/hook.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/hooks/before-RESTART/scripts/hook.py 2022-07-11 00:52:35.000000000 +0800 +@@ -23,7 +23,7 @@ + + def hook(self, env): + self.run_custom_hook('before-START') +- print "Before Restart Hook" ++ print("Before Restart Hook") + + if __name__ == "__main__": + BeforeRestartHook().execute() +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/hooks/before-START/scripts/hook.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/hooks/before-START/scripts/hook.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/hooks/before-START/scripts/hook.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/hooks/before-START/scripts/hook.py 2022-07-11 00:52:35.000000000 +0800 +@@ -23,7 +23,7 @@ + + def hook(self, env): + self.run_custom_hook('before-ANY') +- print "Before Start Hook" ++ print("Before Start Hook") + + if __name__ == "__main__": + BeforeStartHook().execute() +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEHBASE/package/alerts/hbase_master_process.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEHBASE/package/alerts/hbase_master_process.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEHBASE/package/alerts/hbase_master_process.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEHBASE/package/alerts/hbase_master_process.py 2022-07-11 00:52:35.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + """ + Licensed to the Apache Software Foundation (ASF) under one +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEHBASE/package/alerts/hbase_regionserver_process.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEHBASE/package/alerts/hbase_regionserver_process.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEHBASE/package/alerts/hbase_regionserver_process.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEHBASE/package/alerts/hbase_regionserver_process.py 2022-07-11 00:52:35.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + """ + Licensed to the Apache Software Foundation (ASF) under one +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEHBASE/package/scripts/hbase_client.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEHBASE/package/scripts/hbase_client.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEHBASE/package/scripts/hbase_client.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEHBASE/package/scripts/hbase_client.py 2022-07-11 00:52:35.000000000 +0800 +@@ -31,7 +31,7 @@ + """ + + def __init__(self): +- super(HBaseClient, self).__init__() ++ super().__init__() + self.component_name = "FAKEHBASE_CLIENT" + + if __name__ == "__main__": +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEHBASE/package/scripts/hbase_master.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEHBASE/package/scripts/hbase_master.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEHBASE/package/scripts/hbase_master.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEHBASE/package/scripts/hbase_master.py 2022-07-11 00:52:35.000000000 +0800 +@@ -39,7 +39,7 @@ + self.keytab_name = "hbase.master.keytab.file" + + def decommission(self, env): +- print "Decommission" ++ print("Decommission") + + if __name__ == "__main__": + HBaseMaster().execute() +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEHBASE/package/scripts/hbase_regionserver.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEHBASE/package/scripts/hbase_regionserver.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEHBASE/package/scripts/hbase_regionserver.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEHBASE/package/scripts/hbase_regionserver.py 2022-07-11 00:52:35.000000000 +0800 +@@ -39,7 +39,7 @@ + self.keytab_name = "hbase.regionserver.keytab.file" + + def decommission(self, env): +- print "Decommission" ++ print("Decommission") + + if __name__ == "__main__": + HBaseFAKERegionServer().execute() +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEHBASE/package/scripts/phoenix_queryserver.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEHBASE/package/scripts/phoenix_queryserver.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEHBASE/package/scripts/phoenix_queryserver.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEHBASE/package/scripts/phoenix_queryserver.py 2022-07-11 00:52:35.000000000 +0800 +@@ -31,7 +31,7 @@ + """ + + def __init__(self): +- super(PhoenixQueryServer, self).__init__() ++ super().__init__() + self.component_name = "FAKEPHOENIX_QUERY_SERVER" + self.principal_conf_name = "hbase-site" + self.principal_name = "phoenix.queryserver.kerberos.principal" +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEHBASE/package/scripts/service_check.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEHBASE/package/scripts/service_check.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEHBASE/package/scripts/service_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEHBASE/package/scripts/service_check.py 2022-07-11 00:52:35.000000000 +0800 +@@ -24,7 +24,7 @@ + class ServiceCheck(Script): + + def service_check(self, env): +- print "Service Check" ++ print("Service Check") + + if __name__ == "__main__": + ServiceCheck().execute() +\ 文件尾没有换行符 +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEHDFS/package/alerts/alert_checkpoint_time.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEHDFS/package/alerts/alert_checkpoint_time.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEHDFS/package/alerts/alert_checkpoint_time.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEHDFS/package/alerts/alert_checkpoint_time.py 2022-07-11 00:52:35.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + """ + Licensed to the Apache Software Foundation (ASF) under one +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEHDFS/package/alerts/alert_datanode_unmounted_data_dir.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEHDFS/package/alerts/alert_datanode_unmounted_data_dir.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEHDFS/package/alerts/alert_datanode_unmounted_data_dir.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEHDFS/package/alerts/alert_datanode_unmounted_data_dir.py 2022-07-11 00:52:35.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + """ + Licensed to the Apache Software Foundation (ASF) under one +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEHDFS/package/alerts/alert_nfs_gateway_process.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEHDFS/package/alerts/alert_nfs_gateway_process.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEHDFS/package/alerts/alert_nfs_gateway_process.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEHDFS/package/alerts/alert_nfs_gateway_process.py 2022-07-11 00:52:35.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + """ + Licensed to the Apache Software Foundation (ASF) under one +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEHDFS/package/alerts/alert_snamenode_process.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEHDFS/package/alerts/alert_snamenode_process.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEHDFS/package/alerts/alert_snamenode_process.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEHDFS/package/alerts/alert_snamenode_process.py 2022-07-11 00:52:35.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + """ + Licensed to the Apache Software Foundation (ASF) under one +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEHDFS/package/alerts/alert_upgrade_finalized.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEHDFS/package/alerts/alert_upgrade_finalized.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEHDFS/package/alerts/alert_upgrade_finalized.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEHDFS/package/alerts/alert_upgrade_finalized.py 2022-07-11 00:52:35.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + """ + Licensed to the Apache Software Foundation (ASF) under one +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEHDFS/package/scripts/datanode.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEHDFS/package/scripts/datanode.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEHDFS/package/scripts/datanode.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEHDFS/package/scripts/datanode.py 2022-07-11 00:52:35.000000000 +0800 +@@ -36,7 +36,7 @@ + """ + + def __init__(self): +- super(FAKEDataNode, self).__init__() ++ super().__init__() + self.component_name = "FAKEDATANODE" + self.principal_conf_name = "hdfs-site" + self.principal_name = "dfs.datanode.kerberos.principal" +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEHDFS/package/scripts/hdfs_client.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEHDFS/package/scripts/hdfs_client.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEHDFS/package/scripts/hdfs_client.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEHDFS/package/scripts/hdfs_client.py 2022-07-11 00:52:35.000000000 +0800 +@@ -31,7 +31,7 @@ + """ + + def __init__(self): +- super(HdfsClient, self).__init__() ++ super().__init__() + self.component_name = "FAKEHDFS_CLIENT" + + if __name__ == "__main__": +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEHDFS/package/scripts/journalnode.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEHDFS/package/scripts/journalnode.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEHDFS/package/scripts/journalnode.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEHDFS/package/scripts/journalnode.py 2022-07-11 00:52:35.000000000 +0800 +@@ -36,7 +36,7 @@ + """ + + def __init__(self): +- super(FAKEJournalNode, self).__init__() ++ super().__init__() + self.component_name = "FAKEJOURNALNODE" + self.principal_conf_name = "hdfs-site" + self.principal_name = "dfs.journalnode.kerberos.principal" +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEHDFS/package/scripts/namenode.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEHDFS/package/scripts/namenode.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEHDFS/package/scripts/namenode.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEHDFS/package/scripts/namenode.py 2022-07-11 00:52:35.000000000 +0800 +@@ -45,7 +45,7 @@ + self.keytab_name = "dfs.namenode.keytab.file" + + def rebalancehdfs(self, env): +- print "Rebalance FAKEHDFS" ++ print("Rebalance FAKEHDFS") + + threshold = 10 + if "namenode" in self.config["commandParams"]: +@@ -54,10 +54,10 @@ + name_node_parameters = json.loads(name_node_params) + threshold = name_node_parameters['threshold'] + +- print "Threshold: %s" % str(threshold) ++ print("Threshold: %s" % str(threshold)) + + def decommission(self): +- print "Rebalance FAKEHDFS" ++ print("Rebalance FAKEHDFS") + + def get_component_name(self): + return "hadoop-hdfs-namenode" +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEHDFS/package/scripts/nfsgateway.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEHDFS/package/scripts/nfsgateway.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEHDFS/package/scripts/nfsgateway.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEHDFS/package/scripts/nfsgateway.py 2022-07-11 00:52:35.000000000 +0800 +@@ -31,7 +31,7 @@ + """ + + def __init__(self): +- super(FAKENFSGateway, self).__init__() ++ super().__init__() + self.component_name = "FAKENFS_GATEWAY" + self.principal_conf_name = "hdfs-site" + self.principal_name = "nfs.kerberos.principal" +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEHDFS/package/scripts/service_check.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEHDFS/package/scripts/service_check.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEHDFS/package/scripts/service_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEHDFS/package/scripts/service_check.py 2022-07-11 00:52:35.000000000 +0800 +@@ -24,7 +24,7 @@ + class ServiceCheck(Script): + + def service_check(self, env): +- print "Service Check" ++ print("Service Check") + + if __name__ == "__main__": + ServiceCheck().execute() +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEHDFS/package/scripts/snamenode.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEHDFS/package/scripts/snamenode.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEHDFS/package/scripts/snamenode.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEHDFS/package/scripts/snamenode.py 2022-07-11 00:52:35.000000000 +0800 +@@ -31,7 +31,7 @@ + """ + + def __init__(self): +- super(SFAKEHNameNode, self).__init__() ++ super().__init__() + self.component_name = "SECONDARY_FAKENAMENODE" + self.principal_conf_name = "hdfs-site" + self.principal_name = "dfs.secondary.namenode.kerberos.principal" +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEHDFS/package/scripts/zkfc_slave.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEHDFS/package/scripts/zkfc_slave.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEHDFS/package/scripts/zkfc_slave.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEHDFS/package/scripts/zkfc_slave.py 2022-07-11 00:52:35.000000000 +0800 +@@ -31,7 +31,7 @@ + """ + + def __init__(self): +- super(ZkfcSlave, self).__init__() ++ super().__init__() + self.component_name = "FAKEZKFC" + self.principal_conf_name = "hadoop-env" + self.principal_name = "hdfs_principal_name" +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEYARN/package/alerts/alert_history_process.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEYARN/package/alerts/alert_history_process.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEYARN/package/alerts/alert_history_process.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEYARN/package/alerts/alert_history_process.py 2022-07-11 00:52:35.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + """ + Licensed to the Apache Software Foundation (ASF) under one +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEYARN/package/alerts/alert_nodemanager_health.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEYARN/package/alerts/alert_nodemanager_health.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEYARN/package/alerts/alert_nodemanager_health.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEYARN/package/alerts/alert_nodemanager_health.py 2022-07-11 00:52:35.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + """ + Licensed to the Apache Software Foundation (ASF) under one +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEYARN/package/alerts/alert_resourcemanager_process.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEYARN/package/alerts/alert_resourcemanager_process.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEYARN/package/alerts/alert_resourcemanager_process.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEYARN/package/alerts/alert_resourcemanager_process.py 2022-07-11 00:52:35.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + """ + Licensed to the Apache Software Foundation (ASF) under one +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEYARN/package/alerts/alert_timeline_process.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEYARN/package/alerts/alert_timeline_process.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEYARN/package/alerts/alert_timeline_process.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEYARN/package/alerts/alert_timeline_process.py 2022-07-11 00:52:35.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + """ + Licensed to the Apache Software Foundation (ASF) under one +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEYARN/package/scripts/application_timeline_server.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEYARN/package/scripts/application_timeline_server.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEYARN/package/scripts/application_timeline_server.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEYARN/package/scripts/application_timeline_server.py 2022-07-11 00:52:35.000000000 +0800 +@@ -31,7 +31,7 @@ + """ + + def __init__(self): +- super(ApplicationTimelineServer, self).__init__() ++ super().__init__() + self.component_name = "FAKEAPP_TIMELINE_SERVER" + self.principal_conf_name = "yarn-site" + self.principal_name = "yarn.timeline-service.principal" +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEYARN/package/scripts/historyserver.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEYARN/package/scripts/historyserver.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEYARN/package/scripts/historyserver.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEYARN/package/scripts/historyserver.py 2022-07-11 00:52:35.000000000 +0800 +@@ -31,7 +31,7 @@ + """ + + def __init__(self): +- super(HistoryServer, self).__init__() ++ super().__init__() + self.component_name = "FAKEHISTORYSERVER" + self.principal_conf_name = "mapred-site" + self.principal_name = "mapreduce.jobhistory.principal" +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEYARN/package/scripts/mapred_service_check.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEYARN/package/scripts/mapred_service_check.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEYARN/package/scripts/mapred_service_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEYARN/package/scripts/mapred_service_check.py 2022-07-11 00:52:35.000000000 +0800 +@@ -24,7 +24,7 @@ + class ServiceCheck(Script): + + def service_check(self, env): +- print "Service Check" ++ print("Service Check") + + if __name__ == "__main__": + ServiceCheck().execute() +\ 文件尾没有换行符 +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEYARN/package/scripts/mapreduce2_client.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEYARN/package/scripts/mapreduce2_client.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEYARN/package/scripts/mapreduce2_client.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEYARN/package/scripts/mapreduce2_client.py 2022-07-11 00:52:35.000000000 +0800 +@@ -31,7 +31,7 @@ + """ + + def __init__(self): +- super(FAKEMapReduce2Client, self).__init__() ++ super().__init__() + self.component_name = "FAKEMAPREDUCE2_CLIENT" + + if __name__ == "__main__": +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEYARN/package/scripts/nodemanager.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEYARN/package/scripts/nodemanager.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEYARN/package/scripts/nodemanager.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEYARN/package/scripts/nodemanager.py 2022-07-11 00:52:35.000000000 +0800 +@@ -31,7 +31,7 @@ + """ + + def __init__(self): +- super(Nodemanager, self).__init__() ++ super().__init__() + self.component_name = "FAKENODEMANAGER" + self.principal_conf_name = "yarn-site" + self.principal_name = "yarn.nodemanager.principal" +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEYARN/package/scripts/resourcemanager.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEYARN/package/scripts/resourcemanager.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEYARN/package/scripts/resourcemanager.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEYARN/package/scripts/resourcemanager.py 2022-07-11 00:52:35.000000000 +0800 +@@ -39,10 +39,10 @@ + self.keytab_name = "yarn.resourcemanager.keytab" + + def decommission(self, env): +- print "Decommission" ++ print("Decommission") + + def refreshqueues(self, env): +- print "Refresh Queues" ++ print("Refresh Queues") + + if __name__ == "__main__": + Resourcemanager().execute() +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEYARN/package/scripts/service_check.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEYARN/package/scripts/service_check.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEYARN/package/scripts/service_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEYARN/package/scripts/service_check.py 2022-07-11 00:52:35.000000000 +0800 +@@ -24,7 +24,7 @@ + class ServiceCheck(Script): + + def service_check(self, env): +- print "Service Check" ++ print("Service Check") + + if __name__ == "__main__": + ServiceCheck().execute() +\ 文件尾没有换行符 +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEYARN/package/scripts/yarn_client.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEYARN/package/scripts/yarn_client.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEYARN/package/scripts/yarn_client.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEYARN/package/scripts/yarn_client.py 2022-07-11 00:52:35.000000000 +0800 +@@ -31,7 +31,7 @@ + """ + + def __init__(self): +- super(YarnClient, self).__init__() ++ super().__init__() + self.component_name = "FAKEYARN_CLIENT" + + if __name__ == "__main__": +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEZOOKEEPER/package/alerts/alert_zk_server_process.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEZOOKEEPER/package/alerts/alert_zk_server_process.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEZOOKEEPER/package/alerts/alert_zk_server_process.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEZOOKEEPER/package/alerts/alert_zk_server_process.py 2022-07-11 00:52:35.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + """ + Licensed to the Apache Software Foundation (ASF) under one +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEZOOKEEPER/package/scripts/service_check.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEZOOKEEPER/package/scripts/service_check.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEZOOKEEPER/package/scripts/service_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEZOOKEEPER/package/scripts/service_check.py 2022-07-11 00:52:35.000000000 +0800 +@@ -24,7 +24,7 @@ + class ServiceCheck(Script): + + def service_check(self, env): +- print "Service Check" ++ print("Service Check") + + if __name__ == "__main__": + ServiceCheck().execute() +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEZOOKEEPER/package/scripts/zookeeper_client.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEZOOKEEPER/package/scripts/zookeeper_client.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEZOOKEEPER/package/scripts/zookeeper_client.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEZOOKEEPER/package/scripts/zookeeper_client.py 2022-07-11 00:52:35.000000000 +0800 +@@ -31,7 +31,7 @@ + """ + + def __init__(self): +- super(ZookeeperClient, self).__init__() ++ super().__init__() + self.component_name = "ZOOKEEPER_CLIENT" + + if __name__ == "__main__": +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEZOOKEEPER/package/scripts/zookeeper_server.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEZOOKEEPER/package/scripts/zookeeper_server.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEZOOKEEPER/package/scripts/zookeeper_server.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/FAKEZOOKEEPER/package/scripts/zookeeper_server.py 2022-07-11 00:52:35.000000000 +0800 +@@ -31,7 +31,7 @@ + """ + + def __init__(self): +- super(ZookeeperServer, self).__init__() ++ super().__init__() + self.component_name = "ZOOKEEPER_SERVER" + self.principal_conf_name = "zookeeper-env" + self.principal_name = "zookeeper_principal_name" +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/GRUMPY/package/scripts/dwarf.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/GRUMPY/package/scripts/dwarf.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/GRUMPY/package/scripts/dwarf.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/GRUMPY/package/scripts/dwarf.py 2022-07-11 00:52:35.000000000 +0800 +@@ -31,7 +31,7 @@ + """ + + def __init__(self): +- super(Grumpy, self).__init__() ++ super().__init__() + self.component_name = "GRUMPY" + self.principal_conf_name = "grumpy-site" + self.principal_name = "grumpy.grumpy.kerberos.principal" +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/GRUMPY/package/scripts/service_check.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/GRUMPY/package/scripts/service_check.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/GRUMPY/package/scripts/service_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/GRUMPY/package/scripts/service_check.py 2022-07-11 00:52:35.000000000 +0800 +@@ -24,7 +24,7 @@ + class ServiceCheck(Script): + + def service_check(self, env): +- print "Service Check" ++ print("Service Check") + + if __name__ == "__main__": + ServiceCheck().execute() +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/HAPPY/package/alerts/alert_happy_process.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/HAPPY/package/alerts/alert_happy_process.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/HAPPY/package/alerts/alert_happy_process.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/HAPPY/package/alerts/alert_happy_process.py 2022-07-11 00:52:35.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + """ + Licensed to the Apache Software Foundation (ASF) under one +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/HAPPY/package/scripts/dwarf.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/HAPPY/package/scripts/dwarf.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/HAPPY/package/scripts/dwarf.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/HAPPY/package/scripts/dwarf.py 2022-07-11 00:52:35.000000000 +0800 +@@ -31,7 +31,7 @@ + """ + + def __init__(self): +- super(Happy, self).__init__() ++ super().__init__() + self.component_name = "HAPPY" + self.principal_conf_name = "happy-site" + self.principal_name = "happy.happy.kerberos.principal" +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/HAPPY/package/scripts/service_check.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/HAPPY/package/scripts/service_check.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/HAPPY/package/scripts/service_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/HAPPY/package/scripts/service_check.py 2022-07-11 00:52:35.000000000 +0800 +@@ -24,7 +24,7 @@ + class ServiceCheck(Script): + + def service_check(self, env): +- print "Service Check" ++ print("Service Check") + + if __name__ == "__main__": + ServiceCheck().execute() +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/KERBEROS/package/scripts/kerberos_client.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/KERBEROS/package/scripts/kerberos_client.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/KERBEROS/package/scripts/kerberos_client.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/KERBEROS/package/scripts/kerberos_client.py 2022-07-11 00:52:35.000000000 +0800 +@@ -27,7 +27,7 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/KERBEROS/package/scripts/kerberos_common.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/KERBEROS/package/scripts/kerberos_common.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/KERBEROS/package/scripts/kerberos_common.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/KERBEROS/package/scripts/kerberos_common.py 2022-07-11 00:52:35.000000000 +0800 +@@ -66,8 +66,8 @@ + output_file.write('[%s]\n' % section_name) + + if section_data is not None: +- for key, value in section_data.iteritems(): +- output_file.write(" %s = %s\n" % (key, value)) ++ for key, value in section_data.items(): ++ output_file.write(" {} = {}\n".format(key, value)) + + + @staticmethod +@@ -86,9 +86,9 @@ + output_file.write(" %s = {\n" % realm_name) + + if realm_data is not None: +- for key, value in realm_data.iteritems(): ++ for key, value in realm_data.items(): + if key in KerberosScript.KRB5_REALM_PROPERTIES: +- output_file.write(" %s = %s\n" % (key, value)) ++ output_file.write(" {} = {}\n".format(key, value)) + + output_file.write(" }\n") + +@@ -98,7 +98,7 @@ + output_file.write('[%s]\n' % section_name) + + if realms_data is not None: +- for realm, realm_data in realms_data.iteritems(): ++ for realm, realm_data in realms_data.items(): + KerberosScript._write_conf_realm(output_file, realm, realm_data) + output_file.write('\n') + +@@ -110,7 +110,7 @@ + owner='root', + create_parents = True, + group='root', +- mode=0755 ++ mode=0o755 + ) + + content = InlineTemplate(params.krb5_conf_template) +@@ -119,7 +119,7 @@ + content=content, + owner='root', + group='root', +- mode=0644 ++ mode=0o644 + ) + + @staticmethod +@@ -167,7 +167,7 @@ + realm = '' + + try: +- command = '%s %s %s -q "%s"' % (kadmin, credential, realm, query.replace('"', '\\"')) ++ command = '{} {} {} -q "{}"'.format(kadmin, credential, realm, query.replace('"', '\\"')) + return shell.checked_call(command) + except: + raise +@@ -192,12 +192,12 @@ + + try: + result_code, output = KerberosScript.invoke_kadmin( +- 'ktadd %s %s %s' % (keytab_file, norandkey, principal), ++ 'ktadd {} {} {}'.format(keytab_file, norandkey, principal), + auth_identity) + + success = (result_code == 0) + except: +- raise Fail("Failed to create keytab for principal: %s (in %s)" % (principal, path)) ++ raise Fail("Failed to create keytab for principal: {} (in {})".format(principal, path)) + + return success + +@@ -210,7 +210,7 @@ + + try: + if KerberosScript.create_keytab_file(principal, temp_path, auth_identity): +- with open(temp_path, 'r') as f: ++ with open(temp_path) as f: + keytab = base64.b64encode(f.read()) + finally: + if os.path.isfile(temp_path): +@@ -252,7 +252,7 @@ + + try: + result_code, output = KerberosScript.invoke_kadmin( +- 'change_password %s %s' % (credentials, principal), ++ 'change_password {} {}'.format(credentials, principal), + auth_identity) + + success = (result_code == 0) +@@ -278,7 +278,7 @@ + + try: + result_code, out = KerberosScript.invoke_kadmin( +- 'addprinc %s %s' % (credentials, principal), ++ 'addprinc {} {}'.format(credentials, principal), + auth_identity) + + success = (result_code == 0) +@@ -327,7 +327,7 @@ + # If a test keytab file is available, simply use it + if (keytab_file is not None) and (os.path.isfile(keytab_file)): + keytab_file = keytab_file.replace("_HOST", params.hostname) +- command = '%s -k -t %s %s' % (kinit_path_local, keytab_file, principal) ++ command = '{} -k -t {} {}'.format(kinit_path_local, keytab_file, principal) + Execute(command, + user = user, + ) +@@ -341,7 +341,7 @@ + os.close(fd) + + try: +- command = '%s -k -t %s %s' % (kinit_path_local, test_keytab_file, principal) ++ command = '{} -k -t {} {}'.format(kinit_path_local, test_keytab_file, principal) + Execute(command, + user = user, + ) +@@ -380,7 +380,7 @@ + keytab_file_path = keytab_file_path.replace("_HOST", params.hostname) + 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 = "root" + group = "root" +@@ -453,14 +453,14 @@ + get_property_value(item, 'keytab_file_path')) + + def __str__(self): +- return "Keytab: %s Principal: %s" % (self.keytab_file_path, self.principal) ++ return "Keytab: {} Principal: {}".format(self.keytab_file_path, self.principal) + + @classmethod + def from_kerberos_records(cls, kerberos_record, hostname): + with_missing_keytab = (each for each in kerberos_record if not MissingKeytabs.keytab_exists(each) or + not MissingKeytabs.keytab_has_principal(each, hostname)) + return MissingKeytabs( +- set(MissingKeytabs.Identity.fromKerberosRecord(each, hostname) for each in with_missing_keytab)) ++ {MissingKeytabs.Identity.fromKerberosRecord(each, hostname) for each in with_missing_keytab}) + + @staticmethod + def keytab_exists(kerberos_record): +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/KERBEROS/package/scripts/service_check.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/KERBEROS/package/scripts/service_check.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/KERBEROS/package/scripts/service_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/KERBEROS/package/scripts/service_check.py 2022-07-11 00:52:35.000000000 +0800 +@@ -24,7 +24,7 @@ + class ServiceCheck(Script): + + def service_check(self, env): +- print "Service Check" ++ print("Service Check") + + if __name__ == "__main__": + ServiceCheck().execute() +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/KERBEROS/package/scripts/utils.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/KERBEROS/package/scripts/utils.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/KERBEROS/package/scripts/utils.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/KERBEROS/package/scripts/utils.py 2022-07-11 00:52:35.000000000 +0800 +@@ -48,7 +48,7 @@ + # 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: +@@ -59,7 +59,7 @@ + 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 {k[prefix_len:]: v for k, v in dictionary.items() if k.startswith(prefix)} + + def split_host_and_port(host): + """ +@@ -100,6 +100,6 @@ + host_and_port = split_host_and_port(host) + + if (host_and_port is not None) and ('host' in host_and_port): +- return "%s:%s" % (host_and_port['host'], port) ++ return "{}:{}".format(host_and_port['host'], port) + else: + return host +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/SLEEPY/package/alerts/alert_sleepy_process.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/SLEEPY/package/alerts/alert_sleepy_process.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/SLEEPY/package/alerts/alert_sleepy_process.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/SLEEPY/package/alerts/alert_sleepy_process.py 2022-07-11 00:52:35.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + """ + Licensed to the Apache Software Foundation (ASF) under one +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/SLEEPY/package/scripts/dwarf.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/SLEEPY/package/scripts/dwarf.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/SLEEPY/package/scripts/dwarf.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/SLEEPY/package/scripts/dwarf.py 2022-07-11 00:52:35.000000000 +0800 +@@ -31,7 +31,7 @@ + """ + + def __init__(self): +- super(Sleepy, self).__init__() ++ super().__init__() + self.component_name = "SLEEPY" + self.principal_conf_name = "sleepy-site" + self.principal_name = "sleepy.sleepy.kerberos.principal" +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/SLEEPY/package/scripts/service_check.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/SLEEPY/package/scripts/service_check.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/SLEEPY/package/scripts/service_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/SLEEPY/package/scripts/service_check.py 2022-07-11 00:52:35.000000000 +0800 +@@ -24,7 +24,7 @@ + class ServiceCheck(Script): + + def service_check(self, env): +- print "Service Check" ++ print("Service Check") + + if __name__ == "__main__": + ServiceCheck().execute() +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/SNOW/package/alerts/alert_snow_process.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/SNOW/package/alerts/alert_snow_process.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/SNOW/package/alerts/alert_snow_process.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/SNOW/package/alerts/alert_snow_process.py 2022-07-11 00:52:35.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + """ + Licensed to the Apache Software Foundation (ASF) under one +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/SNOW/package/scripts/service_check.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/SNOW/package/scripts/service_check.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/SNOW/package/scripts/service_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/SNOW/package/scripts/service_check.py 2022-07-11 00:52:35.000000000 +0800 +@@ -24,7 +24,7 @@ + class ServiceCheck(Script): + + def service_check(self, env): +- print "Service Check" ++ print("Service Check") + + if __name__ == "__main__": + ServiceCheck().execute() +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/SNOW/package/scripts/snow_white.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/SNOW/package/scripts/snow_white.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/SNOW/package/scripts/snow_white.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/SNOW/package/scripts/snow_white.py 2022-07-11 00:52:35.000000000 +0800 +@@ -31,7 +31,7 @@ + """ + + def __init__(self): +- super(SnowWhite, self).__init__() ++ super().__init__() + self.component_name = "SNOW_WHITE" + self.principal_conf_name = "snow-site" + self.principal_name = "snow.white.kerberos.principal" +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/stack_advisor.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/stack_advisor.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/PERF/1.0/services/stack_advisor.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/PERF/1.0/services/stack_advisor.py 2022-07-11 00:52:35.000000000 +0800 +@@ -26,7 +26,7 @@ + class PERF10StackAdvisor(DefaultStackAdvisor): + + def __init__(self): +- super(PERF10StackAdvisor, self).__init__() ++ super().__init__() + self.initialize_logger("PERF10StackAdvisor") + + def getServiceConfigurationRecommenderDict(self): +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/service_advisor.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/service_advisor.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/service_advisor.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/service_advisor.py 2022-07-11 00:52:35.000000000 +0800 +@@ -158,25 +158,25 @@ + if "+" in cardinality: + hostsMin = int(cardinality[:-1]) + if componentHostsCount < hostsMin: +- message = "at least {0} {1} components should be installed in cluster.".format(hostsMin, ++ message = "at least {} {} components should be installed in cluster.".format(hostsMin, + componentDisplayName) + elif "-" in cardinality: + nums = cardinality.split("-") + hostsMin = int(nums[0]) + hostsMax = int(nums[1]) + if componentHostsCount > hostsMax or componentHostsCount < hostsMin: +- message = "between {0} and {1} {2} components should be installed in cluster.".format(hostsMin, hostsMax, ++ message = "between {} and {} {} components should be installed in cluster.".format(hostsMin, hostsMax, + componentDisplayName) + elif "ALL" == cardinality: + if componentHostsCount != hostsCount: +- message = "{0} component should be installed on all hosts in cluster.".format(componentDisplayName) ++ message = "{} component should be installed on all hosts in cluster.".format(componentDisplayName) + else: + if componentHostsCount != int(cardinality): +- message = "exactly {0} {1} components should be installed in cluster.".format(int(cardinality), ++ message = "exactly {} {} components should be installed in cluster.".format(int(cardinality), + componentDisplayName) + + if message is not None: +- message = "You have selected {0} {1} components. Please consider that {2}".format(componentHostsCount, ++ message = "You have selected {} {} components. Please consider that {}".format(componentHostsCount, + componentDisplayName, + message) + items.append( +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/stack_advisor.py apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/stack_advisor.py +--- ambari-release-2.7.6-origin/ambari-server/src/main/resources/stacks/stack_advisor.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/main/resources/stacks/stack_advisor.py 2022-07-11 00:52:35.000000000 +0800 +@@ -29,14 +29,14 @@ + 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 + from resource_management.libraries.functions.data_structure_utils import get_from_dict + from resource_management.core.exceptions import Fail + +-class StackAdvisor(object): ++class StackAdvisor: + """ + Abstract class implemented by all stack advisors. Stack advisors advise on stack specific questions. + +@@ -666,13 +666,13 @@ + break + + if hasattr(service_advisor, best_class_name): +- self.logger.info("ServiceAdvisor implementation for service {0} was loaded".format(service_name)) ++ self.logger.info("ServiceAdvisor implementation for service {} was loaded".format(service_name)) + return getattr(service_advisor, best_class_name)() + else: +- self.logger.error("Failed to load or create ServiceAdvisor implementation for service {0}: " \ +- "Expecting class name {1} but it was not found.".format(service_name, best_class_name)) ++ self.logger.error("Failed to load or create ServiceAdvisor implementation for service {}: " \ ++ "Expecting class name {} but it was not found.".format(service_name, best_class_name)) + except Exception as e: +- self.logger.exception("Failed to load or create ServiceAdvisor implementation for service {0}".format(service_name)) ++ self.logger.exception("Failed to load or create ServiceAdvisor implementation for service {}".format(service_name)) + + return None + +@@ -809,7 +809,7 @@ + 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 + +@@ -894,9 +894,9 @@ + host_groups = recommendations["blueprint"]["host_groups"] + bindings = recommendations["blueprint_cluster_binding"]["host_groups"] + index = 0 +- for key in hostsComponentsMap.keys(): ++ for key in list(hostsComponentsMap.keys()): + index += 1 +- host_group_name = "host-group-{0}".format(index) ++ host_group_name = "host-group-{}".format(index) + host_groups.append( { "name": host_group_name, "components": hostsComponentsMap[key] } ) + bindings.append( { "name": host_group_name, "hosts": [{ "fqdn": key }] } ) + +@@ -1013,7 +1013,7 @@ + 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"] +@@ -1132,12 +1132,12 @@ + if componentHost not in requiredComponentHosts: + requiredComponentHostsAbsent.append(componentHost) + if requiredComponentHostsAbsent: +- message = "{0} requires {1} to be co-hosted on following host(s): {2}.".format(componentDisplayName, ++ message = "{} requires {} to be co-hosted on following host(s): {}.".format(componentDisplayName, + requiredComponentDisplayName, ', '.join(requiredComponentHostsAbsent)) + items.append({ "type": 'host-component', "level": 'ERROR', "message": message, + "component-name": component["StackServiceComponents"]["component_name"]}) + elif scope == "cluster" and not requiredComponentHosts: +- message = "{0} requires {1} to be present in the cluster.".format(componentDisplayName, requiredComponentDisplayName) ++ message = "{} requires {} to be present in the cluster.".format(componentDisplayName, requiredComponentDisplayName) + items.append({ "type": 'host-component', "level": 'ERROR', "message": message, "component-name": component["StackServiceComponents"]["component_name"]}) + return items + +@@ -1347,7 +1347,7 @@ + # 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 \ +@@ -1359,7 +1359,7 @@ + + def getUserOperationContext(self, services, contextName): + if services: +- if 'user-context' in services.keys(): ++ if 'user-context' in list(services.keys()): + userContext = services["user-context"] + if contextName in userContext: + return userContext[contextName] +@@ -1373,12 +1373,12 @@ + uid = None + + if os.path.exists(login_defs): +- with open(login_defs, 'r') as f: ++ with open(login_defs) 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] +@@ -1445,13 +1445,13 @@ + userValue = convertToNumber(configurations[configName]["properties"][propertyName]) + maxValue = convertToNumber(recommendedDefaults[configName]["property_attributes"][propertyName]["maximum"]) + if userValue > maxValue: +- validationItems.extend([{"config-name": propertyName, "item": self.getWarnItem("Value is greater than the recommended maximum of {0} ".format(maxValue))}]) ++ validationItems.extend([{"config-name": propertyName, "item": self.getWarnItem("Value is greater than the recommended maximum of {} ".format(maxValue))}]) + if "minimum" in recommendedDefaults[configName]["property_attributes"][propertyName] and \ + propertyName in recommendedDefaults[configName]["properties"]: + userValue = convertToNumber(configurations[configName]["properties"][propertyName]) + minValue = convertToNumber(recommendedDefaults[configName]["property_attributes"][propertyName]["minimum"]) + if userValue < minValue: +- validationItems.extend([{"config-name": propertyName, "item": self.getWarnItem("Value is less than the recommended minimum of {0} ".format(minValue))}]) ++ validationItems.extend([{"config-name": propertyName, "item": self.getWarnItem("Value is less than the recommended minimum of {} ".format(minValue))}]) + items.extend(self.toConfigurationValidationProblems(validationItems, configName)) + pass + +@@ -1485,7 +1485,7 @@ + siteProperties = self.getSiteProperties(configurations, configType) + if siteProperties is not None: + siteRecommendations = recommendedDefaults[configType]["properties"] +- self.logger.info("SiteName: %s, method: %s" % (configType, method.__name__)) ++ self.logger.info("SiteName: {}, method: {}".format(configType, method.__name__)) + self.logger.info("Site properties: %s" % str(siteProperties)) + self.logger.info("Recommendations: %s" % str(siteRecommendations)) + validationItems = method(siteProperties, siteRecommendations, configurations, services, hosts) +@@ -1501,7 +1501,7 @@ + siteProperties = self.getSiteProperties(configurations, siteName) + if siteProperties is not None: + siteRecommendations = recommendedDefaults[siteName]["properties"] +- self.logger.info("SiteName: %s, method: %s" % (siteName, method.__name__)) ++ self.logger.info("SiteName: {}, method: {}".format(siteName, method.__name__)) + self.logger.info("Recommendations: %s" % str(siteRecommendations)) + return method(siteProperties, siteRecommendations, configurations, services, hosts) + return [] +@@ -1511,7 +1511,7 @@ + serviceName = service["StackServices"]["service_name"] + validator = self.validateServiceConfigurations(serviceName) + if validator is not None: +- for siteName, method in validator.items(): ++ for siteName, method in list(validator.items()): + resultItems = self.validateConfigurationsForSite(configurations, recommendedDefaults, services, hosts, siteName, method) + items.extend(resultItems) + +@@ -1528,7 +1528,7 @@ + + # Override configuration with the config group values + cgServices = services.copy() +- for configName in configGroup["configurations"].keys(): ++ for configName in list(configGroup["configurations"].keys()): + if configName in cgServices["configurations"]: + cgServices["configurations"][configName]["properties"].update( + configGroup["configurations"][configName]['properties']) +@@ -1574,15 +1574,15 @@ + cgRecommendation) + + # Parse results. +- for config in configurations.keys(): ++ for config in list(configurations.keys()): + cgRecommendation["configurations"][config] = {} + cgRecommendation["dependent_configurations"][config] = {} + # property + property_attributes +- for configElement in configurations[config].keys(): ++ for configElement in list(configurations[config].keys()): + cgRecommendation["configurations"][config][configElement] = {} + cgRecommendation["dependent_configurations"][config][ + configElement] = {} +- for property, value in configurations[config][configElement].items(): ++ for property, value in list(configurations[config][configElement].items()): + if config in configGroup["configurations"]: + cgRecommendation["configurations"][config][configElement][ + property] = value +@@ -1898,7 +1898,7 @@ + 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:]: +@@ -1979,22 +1979,22 @@ + def filterConfigs(self, configs, requestedProperties): + + filteredConfigs = {} +- for type, names in configs.items(): +- if 'properties' in names.keys(): ++ for type, names in list(configs.items()): ++ if 'properties' in list(names.keys()): + for name in names['properties']: +- if type in requestedProperties.keys() and \ ++ if type in list(requestedProperties.keys()) and \ + name in requestedProperties[type]: +- if type not in filteredConfigs.keys(): ++ if type not in list(filteredConfigs.keys()): + filteredConfigs[type] = {'properties': {}} + filteredConfigs[type]['properties'][name] = \ + configs[type]['properties'][name] +- if 'property_attributes' in names.keys(): ++ if 'property_attributes' in list(names.keys()): + for name in names['property_attributes']: +- if type in requestedProperties.keys() and \ ++ if type in list(requestedProperties.keys()) and \ + name in requestedProperties[type]: +- if type not in filteredConfigs.keys(): ++ if type not in list(filteredConfigs.keys()): + filteredConfigs[type] = {'property_attributes': {}} +- elif 'property_attributes' not in filteredConfigs[type].keys(): ++ elif 'property_attributes' not in list(filteredConfigs[type].keys()): + filteredConfigs[type]['property_attributes'] = {} + filteredConfigs[type]['property_attributes'][name] = \ + configs[type]['property_attributes'][name] +@@ -2027,7 +2027,7 @@ + size = len(dependencies) + for config in allDependencies: + property = { +- "type": re.sub('\.xml$', '', config['StackConfigurations']['type']), ++ "type": re.sub(r'\.xml$', '', config['StackConfigurations']['type']), + "name": config['StackConfigurations']['property_name'] + } + if property in dependencies or property in changedConfigs: +@@ -2072,9 +2072,9 @@ + changedConfigs = [] + # if services parameter, prefer values, set by user + if services: +- if 'configurations' in services.keys(): ++ if 'configurations' in list(services.keys()): + userConfigs = services['configurations'] +- if 'changed-configurations' in services.keys(): ++ if 'changed-configurations' in list(services.keys()): + changedConfigs = services["changed-configurations"] + + if configType not in config: +@@ -2112,9 +2112,9 @@ + changedConfigs = [] + # if services parameter, prefer values, set by user + if services: +- if 'configurations' in services.keys(): ++ if 'configurations' in list(services.keys()): + userConfigs = services['configurations'] +- if 'changed-configurations' in services.keys(): ++ if 'changed-configurations' in list(services.keys()): + changedConfigs = services["changed-configurations"] + + if configType not in config: +@@ -2345,7 +2345,7 @@ + hostMounts = self.getMountPoints(hosts) + mounts = [] + for m in hostMounts: +- host_mounts = set([item["mountpoint"] for item in m]) ++ host_mounts = {item["mountpoint"] for item in m} + mounts = host_mounts if not mounts else mounts & host_mounts + + return sorted(mounts) +@@ -2548,10 +2548,10 @@ + def getHadoopProxyUsersValidationItems(self, properties, services, hosts, configurations): + validationItems = [] + users = self.getHadoopProxyUsers(services, hosts, configurations) +- for user_name, user_properties in users.iteritems(): +- props = ["hadoop.proxyuser.{0}.hosts".format(user_name)] ++ for user_name, user_properties in users.items(): ++ props = ["hadoop.proxyuser.{}.hosts".format(user_name)] + if "propertyGroups" in user_properties: +- props.append("hadoop.proxyuser.{0}.groups".format(user_name)) ++ props.append("hadoop.proxyuser.{}.groups".format(user_name)) + + for prop in props: + validationItems.append({"config-name": prop, "item": self.validatorNotEmpty(properties, prop)}) +@@ -2568,7 +2568,7 @@ + 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 +@@ -2619,7 +2619,7 @@ + } + + def _getHadoopProxyUsersForService(self, serviceName, serviceUserComponents, services, hosts, configurations): +- self.logger.info("Calculating Hadoop Proxy User recommendations for {0} service.".format(serviceName)) ++ self.logger.info("Calculating Hadoop Proxy User recommendations for {} service.".format(serviceName)) + servicesList = self.get_services_list(services) + resultUsers = {} + +@@ -2637,10 +2637,10 @@ + 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: +@@ -2651,7 +2651,7 @@ + componentHostNames.add(componentHostName) + + componentHostNamesString = ",".join(sorted(componentHostNames)) +- self.logger.info("Host List for [service='{0}'; user='{1}'; components='{2}']: {3}".format(serviceName, user, ','.join(hostSelector), componentHostNamesString)) ++ self.logger.info("Host List for [service='{}'; user='{}'; components='{}']: {}".format(serviceName, user, ','.join(hostSelector), componentHostNamesString)) + + if not proxyPropertyName in proxyUsers: + proxyUsers[proxyPropertyName] = componentHostNamesString +@@ -2676,27 +2676,27 @@ + if "HIVE" in servicesList: + hive_user = get_from_dict(services, ("configurations", "hive-env", "properties", "hive_user"), default_value=None) + 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)}) ++ services["forced-configurations"].append({"type" : "core-site", "name" : "hadoop.proxyuser.{}.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) +- self.logger.info("Updated hadoop.proxyuser.{0}.hosts as : {1}".format(user_name, user_properties["propertyHosts"])) ++ self.logger.info("Updated hadoop.proxyuser.{}.hosts as : {}".format(user_name, user_properties["propertyHosts"])) + if "propertyGroups" in user_properties: + self.put_proxyuser_value(user_name, user_properties["propertyGroups"], is_groups=True, services=services, configurations=configurations, put_function=putCoreSiteProperty) + + # Remove old properties if user was renamed + userOldValue = self.getOldValue(services, user_properties["config"], user_properties["propertyName"]) + if userOldValue is not None and userOldValue != user_name: +- putCoreSitePropertyAttribute("hadoop.proxyuser.{0}.hosts".format(userOldValue), 'delete', 'true') +- services["forced-configurations"].append({"type" : "core-site", "name" : "hadoop.proxyuser.{0}.hosts".format(userOldValue)}) +- services["forced-configurations"].append({"type" : "core-site", "name" : "hadoop.proxyuser.{0}.hosts".format(user_name)}) ++ putCoreSitePropertyAttribute("hadoop.proxyuser.{}.hosts".format(userOldValue), 'delete', 'true') ++ services["forced-configurations"].append({"type" : "core-site", "name" : "hadoop.proxyuser.{}.hosts".format(userOldValue)}) ++ services["forced-configurations"].append({"type" : "core-site", "name" : "hadoop.proxyuser.{}.hosts".format(user_name)}) + + if "propertyGroups" in user_properties: +- putCoreSitePropertyAttribute("hadoop.proxyuser.{0}.groups".format(userOldValue), 'delete', 'true') +- services["forced-configurations"].append({"type" : "core-site", "name" : "hadoop.proxyuser.{0}.groups".format(userOldValue)}) +- services["forced-configurations"].append({"type" : "core-site", "name" : "hadoop.proxyuser.{0}.groups".format(user_name)}) ++ putCoreSitePropertyAttribute("hadoop.proxyuser.{}.groups".format(userOldValue), 'delete', 'true') ++ services["forced-configurations"].append({"type" : "core-site", "name" : "hadoop.proxyuser.{}.groups".format(userOldValue)}) ++ services["forced-configurations"].append({"type" : "core-site", "name" : "hadoop.proxyuser.{}.groups".format(user_name)}) + + self.recommendAmbariProxyUsersForHDFS(services, configurations, servicesList, putCoreSiteProperty, putCoreSitePropertyAttribute) + +@@ -2708,8 +2708,8 @@ + self.put_proxyuser_value(ambari_user, "*", is_groups=True, services=services, configurations=configurations, put_function=putCoreSiteProperty) + old_ambari_user = self.getOldAmbariUser(services) + if old_ambari_user is not None: +- putCoreSitePropertyAttribute("hadoop.proxyuser.{0}.hosts".format(old_ambari_user), 'delete', 'true') +- putCoreSitePropertyAttribute("hadoop.proxyuser.{0}.groups".format(old_ambari_user), 'delete', 'true') ++ putCoreSitePropertyAttribute("hadoop.proxyuser.{}.hosts".format(old_ambari_user), 'delete', 'true') ++ putCoreSitePropertyAttribute("hadoop.proxyuser.{}.groups".format(old_ambari_user), 'delete', 'true') + + def getAmbariUser(self, services): + ambari_user = services['ambari-server-properties']['ambari-server.user'] +@@ -2766,7 +2766,7 @@ + :param replacement_dict: + :return: + """ +- for replacement, original in replacement_dict.iteritems(): ++ for replacement, original in replacement_dict.items(): + data.remove(replacement) + data.add(original) + +@@ -2775,12 +2775,12 @@ + result_value = "*" + result_values_set = self.merge_proxyusers_values(current_value, value) + if len(result_values_set) > 0: +- result_value = ",".join(sorted([val for val in result_values_set if val])) ++ result_value = ",".join(sorted(val for val in result_values_set if val)) + + if is_groups: +- property_name = "hadoop.proxyuser.{0}.groups".format(user_name) ++ property_name = "hadoop.proxyuser.{}.groups".format(user_name) + else: +- property_name = "hadoop.proxyuser.{0}.hosts".format(user_name) ++ property_name = "hadoop.proxyuser.{}.hosts".format(user_name) + + put_function(property_name, result_value) + +@@ -2800,16 +2800,16 @@ + else: + coreSite = {} + if groups: +- property_name = "hadoop.proxyuser.{0}.groups".format(user_name) ++ property_name = "hadoop.proxyuser.{}.groups".format(user_name) + else: +- property_name = "hadoop.proxyuser.{0}.hosts".format(user_name) ++ property_name = "hadoop.proxyuser.{}.hosts".format(user_name) + if property_name in coreSite: + property_value = coreSite[property_name] + if property_value == "*": + return True, set() + else: + property_value, replacement_map = self.preserve_special_values(property_value) +- result_values = set([v.strip() for v in property_value.split(",")]) ++ result_values = {v.strip() for v in property_value.split(",")} + if "core-site" in configurations: + if property_name in configurations["core-site"]['properties']: + additional_value, additional_replacement_map = self.preserve_special_values( +@@ -2824,7 +2824,7 @@ + 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: +@@ -2835,7 +2835,7 @@ + + def getOldValue(self, services, configType, propertyName): + if services: +- if 'changed-configurations' in services.keys(): ++ if 'changed-configurations' in list(services.keys()): + changedConfigs = services["changed-configurations"] + for changedConfig in changedConfigs: + if changedConfig["type"] == configType and changedConfig["name"]== propertyName and "old_value" in changedConfig: +@@ -2902,7 +2902,7 @@ + if defaultValue is None: + return None + if value < defaultValue: +- return self.getWarnItem("Value is less than the recommended default of {0}".format(defaultValue)) ++ return self.getWarnItem("Value is less than the recommended default of {}".format(defaultValue)) + return None + + def validatorGreaterThenDefaultValue(self, properties, recommendedDefaults, propertyName): +@@ -2920,7 +2920,7 @@ + if defaultValue is None: + return None + if value > defaultValue: +- return self.getWarnItem("Value is greater than the recommended default of {0}".format(defaultValue)) ++ return self.getWarnItem("Value is greater than the recommended default of {}".format(defaultValue)) + return None + + def validatorEqualsPropertyItem(self, properties1, propertyName1, +@@ -2938,7 +2938,7 @@ + return self.getErrorItem("Empty value for %s" % propertyName2) + if value1 != value2: + return self.getWarnItem("It is recommended to set equal values " +- "for properties {0} and {1}".format(propertyName1, propertyName2)) ++ "for properties {} and {}".format(propertyName1, propertyName2)) + + return None + +@@ -2951,16 +2951,16 @@ + return self.getErrorItem("Value should be recommended for %s" % propertyName) + recommendedValue = recommendedDefaults.get(propertyName) + if value != recommendedValue: +- return self.getWarnItem("It is recommended to set value {0} " +- "for property {1}".format(recommendedValue, propertyName)) ++ return self.getWarnItem("It is recommended to set value {} " ++ "for property {}".format(recommendedValue, propertyName)) + return None + + def validatorNotEmpty(self, properties, propertyName): + if not propertyName in properties: +- return self.getErrorItem("Value should be set for {0}".format(propertyName)) ++ return self.getErrorItem("Value should be set for {}".format(propertyName)) + value = properties.get(propertyName) + if not value: +- return self.getWarnItem("Empty value for {0}".format(propertyName)) ++ return self.getWarnItem("Empty value for {}".format(propertyName)) + return None + + def validatorNotRootFs(self, properties, recommendedDefaults, propertyName, hostInfo): +@@ -2977,7 +2977,7 @@ + mountPoint = DefaultStackAdvisor.getMountPointForDir(dir, mountPoints) + + if "/" == mountPoint and self.getPreferredMountPoints(hostInfo)[0] != mountPoint: +- return self.getWarnItem("It is not recommended to use root partition for {0}".format(propertyName)) ++ return self.getWarnItem("It is not recommended to use root partition for {}".format(propertyName)) + + return None + +@@ -2996,13 +2996,13 @@ + 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 {}. Mount points: {}".format(dir, ', '.join(list(mountPoints.keys())))) + + if mountPoints[mountPoint] < reqiuredDiskSpace: + msg = "Ambari Metrics disk space requirements not met. \n" \ +@@ -3079,7 +3079,7 @@ + :type all_exists: bool + """ + changedConfigs = services["changed-configurations"] +- changed_config_names_set = set([changedConfig['name'] for changedConfig in changedConfigs if changedConfig['type'] == config_type]) ++ changed_config_names_set = {changedConfig['name'] for changedConfig in changedConfigs if changedConfig['type'] == config_type} + config_names_set = set(config_names) + + configs_intersection = changed_config_names_set & config_names_set +@@ -3108,7 +3108,7 @@ + capacity_scheduler_properties[key] = value + self.logger.info("'capacity-scheduler' configs is passed-in as a single '\\n' separated string. " + "count(services['configurations']['capacity-scheduler']['properties']['capacity-scheduler']) = " +- "{0}".format(len(capacity_scheduler_properties))) ++ "{}".format(len(capacity_scheduler_properties))) + received_as_key_value_pair = False + else: + self.logger.info("Passed-in services['configurations']['capacity-scheduler']['properties']['capacity-scheduler'] is 'null'.") +@@ -3119,19 +3119,19 @@ + # Received configs as a dictionary (Generally on 1st invocation). + capacity_scheduler_properties = services['configurations']["capacity-scheduler"]["properties"] + self.logger.info("'capacity-scheduler' configs is passed-in as a dictionary. " +- "count(services['configurations']['capacity-scheduler']['properties']) = {0}".format(len(capacity_scheduler_properties))) ++ "count(services['configurations']['capacity-scheduler']['properties']) = {}".format(len(capacity_scheduler_properties))) + else: + self.logger.error("Couldn't retrieve 'capacity-scheduler' from services.") + +- self.logger.info("Retrieved 'capacity-scheduler' received as dictionary : '{0}'. configs : {1}" \ +- .format(received_as_key_value_pair, capacity_scheduler_properties.items())) ++ self.logger.info("Retrieved 'capacity-scheduler' received as dictionary : '{}'. configs : {}" \ ++ .format(received_as_key_value_pair, list(capacity_scheduler_properties.items()))) + return capacity_scheduler_properties, received_as_key_value_pair + + 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: +@@ -3210,13 +3210,13 @@ + + @classmethod + def checkXmxValueFormat(cls, value): +- p = re.compile('-Xmx(\d+)(b|k|m|g|p|t|B|K|M|G|P|T)?') ++ p = re.compile(r'-Xmx(\d+)(b|k|m|g|p|t|B|K|M|G|P|T)?') + matches = p.findall(value) + return len(matches) == 1 + + @classmethod + def getXmxSize(cls, value): +- p = re.compile("-Xmx(\d+)(.?)") ++ p = re.compile(r"-Xmx(\d+)(.?)") + result = p.findall(value)[0] + if len(result) > 1: + # result[1] - is a space or size formatter (b|k|m|g etc) +@@ -3245,7 +3245,7 @@ + @classmethod + def to_number(cls, s): + try: +- return int(re.sub("\D", "", s)) ++ return int(re.sub(r"\D", "", s)) + except ValueError: + return None + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/common-services/AMBARI_METRICS/test_service_advisor.py apache-ambari-2.7.6-change/ambari-server/src/test/python/common-services/AMBARI_METRICS/test_service_advisor.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/common-services/AMBARI_METRICS/test_service_advisor.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/common-services/AMBARI_METRICS/test_service_advisor.py 2022-07-11 00:52:31.000000000 +0800 +@@ -21,7 +21,7 @@ + import os + from unittest import TestCase + +-from mock.mock import patch, MagicMock ++from unittest.mock import patch, MagicMock + + + class TestAMBARI_METRICS010ServiceAdvisor(TestCase): +@@ -162,7 +162,7 @@ + 'proxyuser_group': 'users'}}} + + self.serviceAdvisor.getServiceConfigurationRecommendations(configurations, clusterData, services1, hosts) +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + + services1 = { + "services": [ +@@ -226,7 +226,7 @@ + 'hadoop-env': {'properties': {'hdfs_user': 'hdfs', + 'proxyuser_group': 'users'}}} + self.serviceAdvisor.getServiceConfigurationRecommendations(configurations, clusterData, services1, hosts) +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + + + def test_validateAmsSiteConfigurations(self): +@@ -348,7 +348,7 @@ + 'level': 'ERROR', + 'message': "Correct value should be 'distributed' for clusters with more then 1 Metrics collector", + 'type': 'configuration'}] +- self.assertEquals(res, expected) ++ self.assertEqual(res, expected) + + + services = { +@@ -389,7 +389,7 @@ + } + res = self.serviceAdvisor.getAMBARI_METRICSValidator().validateAmsSiteConfigurationsFromHDP206(properties, recommendedDefaults, configurations, services, hosts) + expected = [] +- self.assertEquals(res, expected) ++ self.assertEqual(res, expected) + + def test_validateAmsHbaseSiteConfigurations(self): + configurations = { +@@ -487,7 +487,7 @@ + # only 1 partition, enough disk space, no warnings + res = self.serviceAdvisor.getAMBARI_METRICSValidator().validateAmsHbaseSiteConfigurationsFromHDP206(properties, recommendedDefaults, configurations, services, hosts) + expected = [] +- self.assertEquals(res, expected) ++ self.assertEqual(res, expected) + + + # 1 partition, no enough disk space +@@ -508,7 +508,7 @@ + 'type': 'configuration' + } + ] +- self.assertEquals(res, expected) ++ self.assertEqual(res, expected) + + # 2 partitions + host['Hosts']['disk_info'] = [ +@@ -535,7 +535,7 @@ + } + res = self.serviceAdvisor.getAMBARI_METRICSValidator().validateAmsHbaseSiteConfigurationsFromHDP206(properties, recommendedDefaults, configurations, services, hosts) + expected = [] +- self.assertEquals(res, expected) ++ self.assertEqual(res, expected) + + # dfs.dir & hbase.rootdir crosscheck + root partition + hbase.rootdir == hbase.tmp.dir warnings + properties = { +@@ -570,7 +570,7 @@ + 'type': 'configuration' + } + ] +- self.assertEquals(res, expected) ++ self.assertEqual(res, expected) + + # incorrect hbase.rootdir in distributed mode + properties = { +@@ -596,4 +596,4 @@ + 'type': 'configuration' + } + ] +- self.assertEquals(res, expected) +\ 文件尾没有换行符 ++ self.assertEqual(res, expected) +\ 文件尾没有换行符 +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/common-services/HAWQ/hawq_base_test_case.py apache-ambari-2.7.6-change/ambari-server/src/test/python/common-services/HAWQ/hawq_base_test_case.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/common-services/HAWQ/hawq_base_test_case.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/common-services/HAWQ/hawq_base_test_case.py 2022-07-11 00:52:31.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +@@ -36,7 +36,7 @@ + POSTGRES = 'postgres' + CONF_DIR = '/usr/local/hawq/etc/' + CONFIG_FILE = os.path.join(os.path.dirname(__file__), '../configs/hawq_default.json') +- with open(CONFIG_FILE, "r") as f: ++ with open(CONFIG_FILE) as f: + hawq_config = json.load(f) + + def setUp(self): +@@ -50,7 +50,7 @@ + + self.assertResourceCalled('User', self.GPADMIN, + gid = self.GPADMIN, +- groups = [self.GPADMIN, u'hadoop'], ++ groups = [self.GPADMIN, 'hadoop'], + ignore_failures = True, + password = crypt.crypt(self.config_dict['configurations']['hawq-env']['hawq_password'], "$1$salt$") + ) +@@ -61,7 +61,7 @@ + + self.assertResourceCalled('User', self.POSTGRES, + gid = self.POSTGRES, +- groups = [self.POSTGRES, u'hadoop'], ++ groups = [self.POSTGRES, 'hadoop'], + ignore_failures = True + ) + +@@ -75,7 +75,7 @@ + configuration_attributes = self.getConfig()['configurationAttributes']['hdfs-client'], + group = self.GPADMIN, + owner = self.GPADMIN, +- mode = 0644 ++ mode = 0o644 + ) + + self.assertResourceCalled('XmlConfig', 'yarn-client.xml', +@@ -84,7 +84,7 @@ + configuration_attributes = self.getConfig()['configurationAttributes']['yarn-client'], + group = self.GPADMIN, + owner = self.GPADMIN, +- mode = 0644 ++ mode = 0o644 + ) + + self.assertResourceCalled('XmlConfig', 'hawq-site.xml', +@@ -93,7 +93,7 @@ + configuration_attributes = self.getConfig()['configurationAttributes']['hawq-site'], + group = self.GPADMIN, + owner = self.GPADMIN, +- mode = 0644 ++ mode = 0o644 + ) + + if self.COMPONENT_TYPE == 'master': +@@ -101,14 +101,14 @@ + content = self.getConfig()['configurations']['hawq-check-env']['content'], + owner = self.GPADMIN, + group = self.GPADMIN, +- mode = 0644 ++ mode = 0o644 + ) + + self.assertResourceCalled('File', self.CONF_DIR + 'slaves', + content = InlineTemplate('c6401.ambari.apache.org\nc6402.ambari.apache.org\nc6403.ambari.apache.org\n\n'), + group = self.GPADMIN, + owner = self.GPADMIN, +- mode = 0644 ++ mode = 0o644 + ) + + self.assertResourceCalled('Directory', '/data/hawq/' + self.COMPONENT_TYPE, +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/common-services/HAWQ/test_alert_component_status.py apache-ambari-2.7.6-change/ambari-server/src/test/python/common-services/HAWQ/test_alert_component_status.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/common-services/HAWQ/test_alert_component_status.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/common-services/HAWQ/test_alert_component_status.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 @@ + # System imports + import os + import sys +-from mock.mock import patch ++from unittest.mock import patch + + # Local imports + from stacks.utils.RMFTestCase import RMFTestCase +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/common-services/HAWQ/test_alert_segment_registration_status.py apache-ambari-2.7.6-change/ambari-server/src/test/python/common-services/HAWQ/test_alert_segment_registration_status.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/common-services/HAWQ/test_alert_segment_registration_status.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/common-services/HAWQ/test_alert_segment_registration_status.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 @@ + # System imports + import os + import sys +-from mock.mock import patch ++from unittest.mock import patch + + # Local imports + from stacks.utils.RMFTestCase import RMFTestCase +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/common-services/HAWQ/test_alert_sync_status.py apache-ambari-2.7.6-change/ambari-server/src/test/python/common-services/HAWQ/test_alert_sync_status.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/common-services/HAWQ/test_alert_sync_status.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/common-services/HAWQ/test_alert_sync_status.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 @@ + # System imports + import os + import sys +-from mock.mock import patch ++from unittest.mock import patch + + # Local imports + from stacks.utils.RMFTestCase import RMFTestCase +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/common-services/HAWQ/test_hawqmaster.py apache-ambari-2.7.6-change/ambari-server/src/test/python/common-services/HAWQ/test_hawqmaster.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/common-services/HAWQ/test_hawqmaster.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/common-services/HAWQ/test_hawqmaster.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 mock.mock import patch ++from unittest.mock import patch + from stacks.utils.RMFTestCase import InlineTemplate, UnknownConfigurationMock + from hawq_base_test_case import HawqBaseTestCase + +@@ -77,7 +77,7 @@ + + self.assertResourceCalled('HdfsResource', '/hawq_data', + immutable_paths = self.DEFAULT_IMMUTABLE_PATHS, +- default_fs = u'hdfs://c6401.ambari.apache.org:8020', ++ default_fs = 'hdfs://c6401.ambari.apache.org:8020', + hadoop_bin_dir = '/usr/phd/current/hadoop-client/bin', + hadoop_conf_dir = '/usr/phd/current/hadoop-client/conf', + hdfs_site = self.getConfig()['configurations']['hdfs-site'], +@@ -85,7 +85,7 @@ + action = ['create_on_execute'], + owner = self.GPADMIN, + group = self.GPADMIN, +- user = u'hdfs', ++ user = 'hdfs', + mode = 493, + security_enabled = False, + kinit_path_local = '/usr/bin/kinit', +@@ -97,12 +97,12 @@ + + self.assertResourceCalled('HdfsResource', None, + immutable_paths = self.DEFAULT_IMMUTABLE_PATHS, +- default_fs = u'hdfs://c6401.ambari.apache.org:8020', ++ default_fs = 'hdfs://c6401.ambari.apache.org:8020', + hadoop_bin_dir = '/usr/phd/current/hadoop-client/bin', + hadoop_conf_dir = '/usr/phd/current/hadoop-client/conf', + hdfs_site = self.getConfig()['configurations']['hdfs-site'], + action = ['execute'], +- user = u'hdfs', ++ user = 'hdfs', + security_enabled = False, + kinit_path_local = '/usr/bin/kinit', + keytab = UnknownConfigurationMock(), +@@ -174,7 +174,7 @@ + content = InlineTemplate("{% for host in hawq_all_hosts %}{{host}}\n{% endfor %}"), + group = self.GPADMIN, + owner = self.GPADMIN, +- mode = 0644 ++ mode = 0o644 + ) + + self.assertResourceCalled('Execute', expectedCommand, +@@ -199,7 +199,7 @@ + """ Running HAWQ Check Case 2: Non HDFS-HA, Standalone Resource Management, Kerberized """ + + self.config_dict['configurations']['cluster-env']['security_enabled'] = "true" +- expectedCommand = "{0}{1}--kerberos".format(self.SOURCE_HAWQ_SCRIPT, self.HAWQ_CHECK_COMMAND) ++ expectedCommand = "{}{}--kerberos".format(self.SOURCE_HAWQ_SCRIPT, self.HAWQ_CHECK_COMMAND) + self.__asserts_for_hawq_check(expectedCommand) + + +@@ -207,7 +207,7 @@ + """ Running HAWQ Check Case 3: Non HDFS-HA, YARN Resource Management Non YARN_HA, Not Kerberized """ + + self.config_dict['configurations']['hawq-site']['hawq_global_rm_type'] = "yarn" +- expectedCommand = "{0}{1}--yarn".format(self.SOURCE_HAWQ_SCRIPT, self.HAWQ_CHECK_COMMAND) ++ expectedCommand = "{}{}--yarn".format(self.SOURCE_HAWQ_SCRIPT, self.HAWQ_CHECK_COMMAND) + self.__asserts_for_hawq_check(expectedCommand) + + +@@ -216,7 +216,7 @@ + + self.config_dict['configurations']['cluster-env']['security_enabled'] = "true" + self.config_dict['configurations']['hawq-site']['hawq_global_rm_type'] = "yarn" +- expectedCommand = "{0}{1}--yarn --kerberos".format(self.SOURCE_HAWQ_SCRIPT, self.HAWQ_CHECK_COMMAND) ++ expectedCommand = "{}{}--yarn --kerberos".format(self.SOURCE_HAWQ_SCRIPT, self.HAWQ_CHECK_COMMAND) + self.__asserts_for_hawq_check(expectedCommand) + + +@@ -225,7 +225,7 @@ + + self.config_dict['configurations']['yarn-site']['yarn.resourcemanager.ha.enabled'] = "true" + self.config_dict['configurations']['hawq-site']['hawq_global_rm_type'] = "yarn" +- expectedCommand = "{0}{1}--yarn-ha".format(self.SOURCE_HAWQ_SCRIPT, self.HAWQ_CHECK_COMMAND) ++ expectedCommand = "{}{}--yarn-ha".format(self.SOURCE_HAWQ_SCRIPT, self.HAWQ_CHECK_COMMAND) + self.__asserts_for_hawq_check(expectedCommand) + + +@@ -235,7 +235,7 @@ + self.config_dict['configurations']['cluster-env']['security_enabled'] = "true" + self.config_dict['configurations']['yarn-site']['yarn.resourcemanager.ha.enabled'] = "true" + self.config_dict['configurations']['hawq-site']['hawq_global_rm_type'] = "yarn" +- expectedCommand = "{0}{1}--yarn-ha --kerberos".format(self.SOURCE_HAWQ_SCRIPT, self.HAWQ_CHECK_COMMAND) ++ expectedCommand = "{}{}--yarn-ha --kerberos".format(self.SOURCE_HAWQ_SCRIPT, self.HAWQ_CHECK_COMMAND) + self.__asserts_for_hawq_check(expectedCommand) + + +@@ -243,7 +243,7 @@ + """ Running HAWQ Check Case 7: HDFS-HA, Standalone Resource Management, Not Kerberized """ + + self.config_dict['configurations']['hdfs-site']['dfs.nameservices'] = "haservice" +- expectedCommand = "{0}{1}--hdfs-ha".format(self.SOURCE_HAWQ_SCRIPT, self.HAWQ_CHECK_COMMAND) ++ expectedCommand = "{}{}--hdfs-ha".format(self.SOURCE_HAWQ_SCRIPT, self.HAWQ_CHECK_COMMAND) + self.__asserts_for_hawq_check(expectedCommand) + + +@@ -252,7 +252,7 @@ + + self.config_dict['configurations']['cluster-env']['security_enabled'] = "true" + self.config_dict['configurations']['hdfs-site']['dfs.nameservices'] = "haservice" +- expectedCommand = "{0}{1}--hdfs-ha --kerberos".format(self.SOURCE_HAWQ_SCRIPT, self.HAWQ_CHECK_COMMAND) ++ expectedCommand = "{}{}--hdfs-ha --kerberos".format(self.SOURCE_HAWQ_SCRIPT, self.HAWQ_CHECK_COMMAND) + self.__asserts_for_hawq_check(expectedCommand) + + +@@ -261,7 +261,7 @@ + + self.config_dict['configurations']['hawq-site']['hawq_global_rm_type'] = "yarn" + self.config_dict['configurations']['hdfs-site']['dfs.nameservices'] = "haservice" +- expectedCommand = "{0}{1}--hdfs-ha --yarn".format(self.SOURCE_HAWQ_SCRIPT, self.HAWQ_CHECK_COMMAND) ++ expectedCommand = "{}{}--hdfs-ha --yarn".format(self.SOURCE_HAWQ_SCRIPT, self.HAWQ_CHECK_COMMAND) + self.__asserts_for_hawq_check(expectedCommand) + + +@@ -271,7 +271,7 @@ + self.config_dict['configurations']['cluster-env']['security_enabled'] = "true" + self.config_dict['configurations']['hawq-site']['hawq_global_rm_type'] = "yarn" + self.config_dict['configurations']['hdfs-site']['dfs.nameservices'] = "haservice" +- expectedCommand = "{0}{1}--hdfs-ha --yarn --kerberos".format(self.SOURCE_HAWQ_SCRIPT, self.HAWQ_CHECK_COMMAND) ++ expectedCommand = "{}{}--hdfs-ha --yarn --kerberos".format(self.SOURCE_HAWQ_SCRIPT, self.HAWQ_CHECK_COMMAND) + self.__asserts_for_hawq_check(expectedCommand) + + +@@ -281,7 +281,7 @@ + self.config_dict['configurations']['yarn-site']['yarn.resourcemanager.ha.enabled'] = "true" + self.config_dict['configurations']['hawq-site']['hawq_global_rm_type'] = "yarn" + self.config_dict['configurations']['hdfs-site']['dfs.nameservices'] = "haservice" +- expectedCommand = "{0}{1}--hdfs-ha --yarn-ha".format(self.SOURCE_HAWQ_SCRIPT, self.HAWQ_CHECK_COMMAND) ++ expectedCommand = "{}{}--hdfs-ha --yarn-ha".format(self.SOURCE_HAWQ_SCRIPT, self.HAWQ_CHECK_COMMAND) + self.__asserts_for_hawq_check(expectedCommand) + + +@@ -292,7 +292,7 @@ + self.config_dict['configurations']['yarn-site']['yarn.resourcemanager.ha.enabled'] = "true" + self.config_dict['configurations']['hawq-site']['hawq_global_rm_type'] = "yarn" + self.config_dict['configurations']['hdfs-site']['dfs.nameservices'] = "haservice" +- expectedCommand = "{0}{1}--hdfs-ha --yarn-ha --kerberos".format(self.SOURCE_HAWQ_SCRIPT, self.HAWQ_CHECK_COMMAND) ++ expectedCommand = "{}{}--hdfs-ha --yarn-ha --kerberos".format(self.SOURCE_HAWQ_SCRIPT, self.HAWQ_CHECK_COMMAND) + self.__asserts_for_hawq_check(expectedCommand) + + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/common-services/HAWQ/test_hawqsegment.py apache-ambari-2.7.6-change/ambari-server/src/test/python/common-services/HAWQ/test_hawqsegment.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/common-services/HAWQ/test_hawqsegment.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/common-services/HAWQ/test_hawqsegment.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 mock.mock import patch ++from unittest.mock import patch + from hawq_base_test_case import HawqBaseTestCase + + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/common-services/HAWQ/test_hawqstandby.py apache-ambari-2.7.6-change/ambari-server/src/test/python/common-services/HAWQ/test_hawqstandby.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/common-services/HAWQ/test_hawqstandby.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/common-services/HAWQ/test_hawqstandby.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 mock.mock import patch ++from unittest.mock import patch + from hawq_base_test_case import HawqBaseTestCase + + +@@ -123,7 +123,7 @@ + configuration_attributes = self.getConfig()['configurationAttributes']['hawq-site'], + group = self.GPADMIN, + owner = self.GPADMIN, +- mode = 0644 ++ mode = 0o644 + ) + + self.assertResourceCalled('Execute', self.SOURCE_HAWQ_SCRIPT + 'export PGHOST=\"c6402.ambari.apache.org\" && hawq activate standby -a -M fast -v --ignore-bad-hosts', +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/common-services/HAWQ/test_service_advisor.py apache-ambari-2.7.6-change/ambari-server/src/test/python/common-services/HAWQ/test_service_advisor.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/common-services/HAWQ/test_service_advisor.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/common-services/HAWQ/test_service_advisor.py 2022-07-11 00:52:31.000000000 +0800 +@@ -21,7 +21,7 @@ + import os + from unittest import TestCase + +-from mock.mock import patch, MagicMock ++from unittest.mock import patch, MagicMock + + + class TestHAWQ200ServiceAdvisor(TestCase): +@@ -69,8 +69,8 @@ + def getHostsFromRecommendations(self, recommendations, componentName): + hostGroups = [hostgroup["name"] for hostgroup in recommendations["blueprint"]["host_groups"] if + {"name": componentName} in hostgroup["components"]] +- return set([host["fqdn"] for hostgroup in recommendations["blueprint_cluster_binding"]["host_groups"] if +- hostgroup["name"] in hostGroups for host in hostgroup["hosts"]]) ++ return {host["fqdn"] for hostgroup in recommendations["blueprint_cluster_binding"]["host_groups"] if ++ hostgroup["name"] in hostGroups for host in hostgroup["hosts"]} + + def getComponentsListFromServices(self, services): + componentsListList = [service["components"] for service in services["services"]] +@@ -151,7 +151,7 @@ + # There are 4 available hosts in the cluster + # Recommend HAWQSTANDBY on next available host, c6402.ambari.apache.org + standbyHosts = self.serviceAdvisor.getHostsForMasterComponent(services, None, component, hostsList) +- self.assertEquals(standbyHosts, ["c6402.ambari.apache.org"]) ++ self.assertEqual(standbyHosts, ["c6402.ambari.apache.org"]) + + # Case 2: + # Ambari Server is placed on c6401.ambari.apache.org +@@ -160,7 +160,7 @@ + # Recommend HAWQSTANDBY on next available host, c6403.ambari.apache.org + services["services"][0]["components"][0]["StackServiceComponents"]["hostnames"] = ["c6402.ambari.apache.org"] + standbyHosts = self.serviceAdvisor.getHostsForMasterComponent(services, None, component, hostsList) +- self.assertEquals(standbyHosts, ["c6403.ambari.apache.org"]) ++ self.assertEqual(standbyHosts, ["c6403.ambari.apache.org"]) + + # Case 3: + # Ambari Server is placed on c6401.ambari.apache.org +@@ -169,7 +169,7 @@ + # Recommend HAWQSTANDBY on a host which does not have HAWQMASTER, c6401.ambari.apache.org + hostsList = ["c6401.ambari.apache.org", "c6402.ambari.apache.org"] + standbyHosts = self.serviceAdvisor.getHostsForMasterComponent(services, None, component, hostsList) +- self.assertEquals(standbyHosts, ["c6401.ambari.apache.org"]) ++ self.assertEqual(standbyHosts, ["c6401.ambari.apache.org"]) + + # Case 4: + # Ambari Server is placed on c6401.ambari.apache.org +@@ -179,7 +179,7 @@ + hostsList = ["c6401.ambari.apache.org"] + services["services"][0]["components"][0]["StackServiceComponents"]["hostnames"] = ["c6401.ambari.apache.org"] + standbyHosts = self.serviceAdvisor.getHostsForMasterComponent(services, None, component, hostsList) +- self.assertEquals(standbyHosts, []) ++ self.assertEqual(standbyHosts, []) + + # Case 5: + # Ambari Server is placed on c6401.ambari.apache.org +@@ -191,7 +191,7 @@ + services["services"][0]["components"][0]["StackServiceComponents"]["hostnames"] = ["c6402.ambari.apache.org"] + services["services"][0]["components"][1]["StackServiceComponents"]["hostnames"] = ["c6401.ambari.apache.org"] + standbyHosts = self.serviceAdvisor.getHostsForMasterComponent(services, None, component, hostsList) +- self.assertEquals(standbyHosts, ["c6401.ambari.apache.org"]) ++ self.assertEqual(standbyHosts, ["c6401.ambari.apache.org"]) + + def setupToTestConfigurationRecommendations(self): + configurations = { +@@ -316,9 +316,9 @@ + + self.serviceAdvisor.getServiceConfigurationRecommendations(configurations, None, services, hosts) + hdfs_site_desired_values = self.getDesiredHDFSSiteValues(False) +- for property, value in hdfs_site_desired_values.iteritems(): +- self.assertEquals(configurations["hdfs-site"]["properties"][property], value) +- self.assertEquals(configurations["core-site"]["properties"]["ipc.server.listen.queue.size"], "3300") ++ for property, value in hdfs_site_desired_values.items(): ++ self.assertEqual(configurations["hdfs-site"]["properties"][property], value) ++ self.assertEqual(configurations["core-site"]["properties"]["ipc.server.listen.queue.size"], "3300") + + # Case 2: Security is enabled + # Kerberos causes 1 property to be recommended differently +@@ -327,9 +327,9 @@ + + self.serviceAdvisor.getServiceConfigurationRecommendations(configurations, None, services, hosts) + hdfs_site_desired_values = self.getDesiredHDFSSiteValues(True) +- for property, value in hdfs_site_desired_values.iteritems(): +- self.assertEquals(configurations["hdfs-site"]["properties"][property], value) +- self.assertEquals(configurations["core-site"]["properties"]["ipc.server.listen.queue.size"], "3300") ++ for property, value in hdfs_site_desired_values.items(): ++ self.assertEqual(configurations["hdfs-site"]["properties"][property], value) ++ self.assertEqual(configurations["core-site"]["properties"]["ipc.server.listen.queue.size"], "3300") + + ## Test if hawq_master_address_port is blanked out when HAWQMASTER is placed on Ambari Server host + with patch.object(self.serviceAdvisor.__class__, 'isLocalHost', side_effect=self.isLocalHost_sideEffect): +@@ -337,7 +337,7 @@ + # Blank out hawq_master_address_port + services, configurations, hosts = self.setupToTestConfigurationRecommendations() + self.serviceAdvisor.getServiceConfigurationRecommendations(configurations, None, services, hosts) +- self.assertEquals(configurations["hawq-site"]["properties"]["hawq_master_address_port"], "") ++ self.assertEqual(configurations["hawq-site"]["properties"]["hawq_master_address_port"], "") + + # Case 2: HAWQMASTER is not placed on Ambari Server Host + # Retain hawq_master_address_port from existing configurations +@@ -345,7 +345,7 @@ + services["services"][0]["components"][0]["StackServiceComponents"]["hostnames"] = ["c6404.ambari.apache.org"] # Set HAWQMASTER Host + original_hawq_master_address_port = configurations["hawq-site"]["properties"]["hawq_master_address_port"] + self.serviceAdvisor.getServiceConfigurationRecommendations(configurations, None, services, hosts) +- self.assertEquals(configurations["hawq-site"]["properties"]["hawq_master_address_port"], original_hawq_master_address_port) ++ self.assertEqual(configurations["hawq-site"]["properties"]["hawq_master_address_port"], original_hawq_master_address_port) + + ## Test if hawq_rm_nvcore_limit_perseg is set according to the hosts core count + +@@ -355,7 +355,7 @@ + # Set hawq_rm_nvcore_limit_perseg to 2 + services, configurations, hosts = self.setupToTestConfigurationRecommendations() + self.serviceAdvisor.getServiceConfigurationRecommendations(configurations, None, services, hosts) +- self.assertEquals(configurations["hawq-site"]["properties"]["hawq_rm_nvcore_limit_perseg"], "2") ++ self.assertEqual(configurations["hawq-site"]["properties"]["hawq_rm_nvcore_limit_perseg"], "2") + + # Case 2: User is coming to configs page for first time + # HAWQ Hosts Core Count: c6401.ambari.apache.org - 2, c6402.ambari.apache.org - 1, c6404.ambari.apache.org - 2 +@@ -364,7 +364,7 @@ + services, configurations, hosts = self.setupToTestConfigurationRecommendations() + hosts["items"][1]["Hosts"]["cpu_count"] = 1 # Set c6402 cpu_count to 1 + self.serviceAdvisor.getServiceConfigurationRecommendations(configurations, None, services, hosts) +- self.assertEquals(configurations["hawq-site"]["properties"]["hawq_rm_nvcore_limit_perseg"], "1") ++ self.assertEqual(configurations["hawq-site"]["properties"]["hawq_rm_nvcore_limit_perseg"], "1") + + ## Test if vm.overcommit_memory is set correctly + +@@ -372,14 +372,14 @@ + # Set vm.overcommit_memory as 2 + services, configurations, hosts = self.setupToTestConfigurationRecommendations() + self.serviceAdvisor.getServiceConfigurationRecommendations(configurations, None, services, hosts) +- self.assertEquals(configurations["hawq-sysctl-env"]["properties"]["vm.overcommit_memory"], "2") ++ self.assertEqual(configurations["hawq-sysctl-env"]["properties"]["vm.overcommit_memory"], "2") + + # Case 2: One machine has total_mem below 32GB + # Set vm.overcommit_memory as 1 + services, configurations, hosts = self.setupToTestConfigurationRecommendations() + hosts["items"][0]["Hosts"]["total_mem"] = 33554431 + self.serviceAdvisor.getServiceConfigurationRecommendations(configurations, None, services, hosts) +- self.assertEquals(configurations["hawq-sysctl-env"]["properties"]["vm.overcommit_memory"], "1") ++ self.assertEqual(configurations["hawq-sysctl-env"]["properties"]["vm.overcommit_memory"], "1") + + ## Test if vm.overcommit_ratio is set correctly + +@@ -405,7 +405,7 @@ + services, configurations, hosts = self.setupToTestConfigurationRecommendations() + hosts["items"][0]["Hosts"]["total_mem"] = 2097152 + self.serviceAdvisor.getServiceConfigurationRecommendations(configurations, None, services, hosts) +- self.assertEquals(configurations["hawq-sysctl-env"]["properties"]["vm.overcommit_memory"], "1") ++ self.assertEqual(configurations["hawq-sysctl-env"]["properties"]["vm.overcommit_memory"], "1") + self.assertEqual(configurations["hawq-site"]["properties"]["hawq_rm_memory_limit_perseg"], "1536MB") + + # Case 2: Minimum host memory is 16GB +@@ -416,7 +416,7 @@ + hosts["items"][1]["Hosts"]["total_mem"] = 26777216 + hosts["items"][3]["Hosts"]["total_mem"] = 36777216 + self.serviceAdvisor.getServiceConfigurationRecommendations(configurations, None, services, hosts) +- self.assertEquals(configurations["hawq-sysctl-env"]["properties"]["vm.overcommit_memory"], "1") ++ self.assertEqual(configurations["hawq-sysctl-env"]["properties"]["vm.overcommit_memory"], "1") + self.assertEqual(configurations["hawq-site"]["properties"]["hawq_rm_memory_limit_perseg"], "12GB") + + # Case 3: Minimum host memory is 64GB +@@ -429,8 +429,8 @@ + hosts["items"][3]["Hosts"]["total_mem"] = 87108864 + services["configurations"]["hawq-sysctl-env"]["properties"]["vm.overcommit_ratio"] = "50" + self.serviceAdvisor.getServiceConfigurationRecommendations(configurations, None, services, hosts) +- self.assertEquals(configurations["hawq-sysctl-env"]["properties"]["vm.overcommit_memory"], "2") +- self.assertEquals(configurations["hawq-sysctl-env"]["properties"]["vm.overcommit_ratio"], "50") ++ self.assertEqual(configurations["hawq-sysctl-env"]["properties"]["vm.overcommit_memory"], "2") ++ self.assertEqual(configurations["hawq-sysctl-env"]["properties"]["vm.overcommit_ratio"], "50") + self.assertEqual(configurations["hawq-site"]["properties"]["hawq_rm_memory_limit_perseg"], "24GB") + + # Case 4: Minimum host memory is 512GB +@@ -443,9 +443,9 @@ + hosts["items"][3]["Hosts"]["total_mem"] = 736870912 + services["configurations"]["hawq-sysctl-env"]["properties"]["vm.overcommit_ratio"] = "50" + self.serviceAdvisor.getServiceConfigurationRecommendations(configurations, None, services, hosts) +- self.assertEquals(configurations["hawq-sysctl-env"]["properties"]["vm.overcommit_memory"], "2") +- self.assertEquals(configurations["hawq-sysctl-env"]["properties"]["vm.overcommit_ratio"], "50") +- self.assertEquals(configurations["hawq-site"]["properties"]["hawq_rm_memory_limit_perseg"], "218GB") ++ self.assertEqual(configurations["hawq-sysctl-env"]["properties"]["vm.overcommit_memory"], "2") ++ self.assertEqual(configurations["hawq-sysctl-env"]["properties"]["vm.overcommit_ratio"], "50") ++ self.assertEqual(configurations["hawq-site"]["properties"]["hawq_rm_memory_limit_perseg"], "218GB") + + # Case 5: Minimum host memory is 1024GB + # Set vm.overcommit_memory set to 2 +@@ -457,8 +457,8 @@ + hosts["items"][3]["Hosts"]["total_mem"] = 3073741824 + services["configurations"]["hawq-sysctl-env"]["properties"]["vm.overcommit_ratio"] = "50" + self.serviceAdvisor.getServiceConfigurationRecommendations(configurations, None, services, hosts) +- self.assertEquals(configurations["hawq-sysctl-env"]["properties"]["vm.overcommit_memory"], "2") +- self.assertEquals(configurations["hawq-sysctl-env"]["properties"]["vm.overcommit_ratio"], "50") ++ self.assertEqual(configurations["hawq-sysctl-env"]["properties"]["vm.overcommit_memory"], "2") ++ self.assertEqual(configurations["hawq-sysctl-env"]["properties"]["vm.overcommit_ratio"], "50") + self.assertEqual(configurations["hawq-site"]["properties"]["hawq_rm_memory_limit_perseg"], "436GB") + + # Case 6: Minimum host memory is 1024GB +@@ -471,8 +471,8 @@ + hosts["items"][3]["Hosts"]["total_mem"] = 3073741824 + services["configurations"]["hawq-sysctl-env"]["properties"]["vm.overcommit_ratio"] = "75" + self.serviceAdvisor.getServiceConfigurationRecommendations(configurations, None, services, hosts) +- self.assertEquals(configurations["hawq-sysctl-env"]["properties"]["vm.overcommit_memory"], "2") +- self.assertEquals(configurations["hawq-sysctl-env"]["properties"]["vm.overcommit_ratio"], "75") ++ self.assertEqual(configurations["hawq-sysctl-env"]["properties"]["vm.overcommit_memory"], "2") ++ self.assertEqual(configurations["hawq-sysctl-env"]["properties"]["vm.overcommit_ratio"], "75") + self.assertEqual(configurations["hawq-site"]["properties"]["hawq_rm_memory_limit_perseg"], "730GB") + + ## Test if default_hash_table_bucket_number and hawq_rm_nvseg_perquery_perseg_limit are set correctly +@@ -482,9 +482,9 @@ + services, configurations, hosts = self.setupToTestConfigurationRecommendations() + componentsList = self.getComponentsListFromServices(services) + hawqSegmentHosts = self.getHosts(componentsList, "HAWQSEGMENT") +- self.assertEquals(len(hawqSegmentHosts["hostnames"]), 2) ++ self.assertEqual(len(hawqSegmentHosts["hostnames"]), 2) + self.serviceAdvisor.getServiceConfigurationRecommendations(configurations, None, services, hosts) +- self.assertEquals(configurations["hawq-site"]["properties"]["default_hash_table_bucket_number"], "12") ++ self.assertEqual(configurations["hawq-site"]["properties"]["default_hash_table_bucket_number"], "12") + + # Case 2: No. of HAWQSEGMENTs - 100 + # Set default_hash_table_bucket_number to 500 +@@ -492,9 +492,9 @@ + componentsList = self.getComponentsListFromServices(services) + hawqSegmentHosts = self.getHosts(componentsList, "HAWQSEGMENT") + hawqSegmentHosts["hostnames"] = ["host" + str(i) for i in range(100)] +- self.assertEquals(len(hawqSegmentHosts["hostnames"]), 100) ++ self.assertEqual(len(hawqSegmentHosts["hostnames"]), 100) + self.serviceAdvisor.getServiceConfigurationRecommendations(configurations, None, services, hosts) +- self.assertEquals(configurations["hawq-site"]["properties"]["default_hash_table_bucket_number"], "500") ++ self.assertEqual(configurations["hawq-site"]["properties"]["default_hash_table_bucket_number"], "500") + + # Case 3: No. of HAWQSEGMENTs - 512 + # Set default_hash_table_bucket_number to 512 +@@ -502,9 +502,9 @@ + componentsList = self.getComponentsListFromServices(services) + hawqSegmentHosts = self.getHosts(componentsList, "HAWQSEGMENT") + hawqSegmentHosts["hostnames"] = ["host" + str(i) for i in range(512)] +- self.assertEquals(len(hawqSegmentHosts["hostnames"]), 512) ++ self.assertEqual(len(hawqSegmentHosts["hostnames"]), 512) + self.serviceAdvisor.getServiceConfigurationRecommendations(configurations, None, services, hosts) +- self.assertEquals(configurations["hawq-site"]["properties"]["default_hash_table_bucket_number"], "512") ++ self.assertEqual(configurations["hawq-site"]["properties"]["default_hash_table_bucket_number"], "512") + + # Case 4: No. of HAWQSEGMENTs - 513 + # Set default_hash_table_bucket_number to 512 +@@ -512,9 +512,9 @@ + componentsList = self.getComponentsListFromServices(services) + hawqSegmentHosts = self.getHosts(componentsList, "HAWQSEGMENT") + hawqSegmentHosts["hostnames"] = ["host" + str(i) for i in range(513)] +- self.assertEquals(len(hawqSegmentHosts["hostnames"]), 513) ++ self.assertEqual(len(hawqSegmentHosts["hostnames"]), 513) + self.serviceAdvisor.getServiceConfigurationRecommendations(configurations, None, services, hosts) +- self.assertEquals(configurations["hawq-site"]["properties"]["default_hash_table_bucket_number"], "512") ++ self.assertEqual(configurations["hawq-site"]["properties"]["default_hash_table_bucket_number"], "512") + + # Case 5: No. of HAWQSEGMENTs - 3 and minimum host memory is 1.5GB + # Set default_hash_table_bucket_number to 12 +@@ -523,9 +523,9 @@ + componentsList = self.getComponentsListFromServices(services) + hawqSegmentHosts = self.getHosts(componentsList, "HAWQSEGMENT") + hawqSegmentHosts["hostnames"] = ["host" + str(i) for i in range(3)] +- self.assertEquals(len(hawqSegmentHosts["hostnames"]), 3) ++ self.assertEqual(len(hawqSegmentHosts["hostnames"]), 3) + self.serviceAdvisor.getServiceConfigurationRecommendations(configurations, None, services, hosts) +- self.assertEquals(configurations["hawq-site"]["properties"]["default_hash_table_bucket_number"], "12") ++ self.assertEqual(configurations["hawq-site"]["properties"]["default_hash_table_bucket_number"], "12") + + # Case 6: No. of HAWQSEGMENTs - 513 and minimum host memory is 1.5GB + # Set default_hash_table_bucket_number to 12 +@@ -534,9 +534,9 @@ + componentsList = self.getComponentsListFromServices(services) + hawqSegmentHosts = self.getHosts(componentsList, "HAWQSEGMENT") + hawqSegmentHosts["hostnames"] = ["host" + str(i) for i in range(513)] +- self.assertEquals(len(hawqSegmentHosts["hostnames"]), 513) ++ self.assertEqual(len(hawqSegmentHosts["hostnames"]), 513) + self.serviceAdvisor.getServiceConfigurationRecommendations(configurations, None, services, hosts) +- self.assertEquals(configurations["hawq-site"]["properties"]["default_hash_table_bucket_number"], "512") ++ self.assertEqual(configurations["hawq-site"]["properties"]["default_hash_table_bucket_number"], "512") + + # Case 7: No. of HAWQSEGMENTs - 0 + # Set default_hash_table_bucket_number to 12 +@@ -545,9 +545,9 @@ + hawqSegmentHosts = self.getHosts(componentsList, "HAWQSEGMENT") + hawqSegmentHosts["hostnames"] = [] + original_default_hash_table_bucket_number = services["configurations"]["hawq-site"]["properties"]["default_hash_table_bucket_number"] +- self.assertEquals(len(hawqSegmentHosts["hostnames"]), 0) ++ self.assertEqual(len(hawqSegmentHosts["hostnames"]), 0) + self.serviceAdvisor.getServiceConfigurationRecommendations(configurations, None, services, hosts) +- self.assertEquals(configurations["hawq-site"]["properties"]["default_hash_table_bucket_number"], original_default_hash_table_bucket_number) ++ self.assertEqual(configurations["hawq-site"]["properties"]["default_hash_table_bucket_number"], original_default_hash_table_bucket_number) + + ## Test if output.replace-datanode-on-failure correctly + +@@ -557,9 +557,9 @@ + componentsList = self.getComponentsListFromServices(services) + hawqSegmentHosts = self.getHosts(componentsList, "HAWQSEGMENT") + hawqSegmentHosts["hostnames"] = ["host" + str(i) for i in range(3)] +- self.assertEquals(len(hawqSegmentHosts["hostnames"]), 3) ++ self.assertEqual(len(hawqSegmentHosts["hostnames"]), 3) + self.serviceAdvisor.getServiceConfigurationRecommendations(configurations, None, services, hosts) +- self.assertEquals(configurations["hdfs-client"]["properties"]["output.replace-datanode-on-failure"], "false") ++ self.assertEqual(configurations["hdfs-client"]["properties"]["output.replace-datanode-on-failure"], "false") + + # Case 2: No. of HAWQSEGMENTs - 4 + # Set output.replace-datanode-on-failure to true +@@ -567,9 +567,9 @@ + componentsList = self.getComponentsListFromServices(services) + hawqSegmentHosts = self.getHosts(componentsList, "HAWQSEGMENT") + hawqSegmentHosts["hostnames"] = ["host" + str(i) for i in range(4)] +- self.assertEquals(len(hawqSegmentHosts["hostnames"]), 4) ++ self.assertEqual(len(hawqSegmentHosts["hostnames"]), 4) + self.serviceAdvisor.getServiceConfigurationRecommendations(configurations, None, services, hosts) +- self.assertEquals(configurations["hdfs-client"]["properties"]["output.replace-datanode-on-failure"], "true") ++ self.assertEqual(configurations["hdfs-client"]["properties"]["output.replace-datanode-on-failure"], "true") + + ## Test if RM properties visibility is set correctly + +@@ -585,7 +585,7 @@ + "hawq_rm_yarn_address": "true" + } + self.serviceAdvisor.getServiceConfigurationRecommendations(configurations, None, services, hosts) +- for property, status in properties_visibility.iteritems(): ++ for property, status in properties_visibility.items(): + self.assertEqual(configurations["hawq-site"]["property_attributes"][property]["visible"], status) + + # Case 2: When hawq_global_rm_type is none +@@ -600,7 +600,7 @@ + "hawq_rm_yarn_address": "false" + } + self.serviceAdvisor.getServiceConfigurationRecommendations(configurations, None, services, hosts) +- for property, status in properties_visibility.iteritems(): ++ for property, status in properties_visibility.items(): + self.assertEqual(configurations["hawq-site"]["property_attributes"][property]["visible"], status) + + ## Test if maximum range of default_hash_table_bucket_number is set correctly +@@ -611,9 +611,9 @@ + componentsList = self.getComponentsListFromServices(services) + hawqSegmentHosts = self.getHosts(componentsList, "HAWQSEGMENT") + hawqSegmentHosts["hostnames"] = ["host" + str(i) for i in range(624)] +- self.assertEquals(len(hawqSegmentHosts["hostnames"]), 624) ++ self.assertEqual(len(hawqSegmentHosts["hostnames"]), 624) + self.serviceAdvisor.getServiceConfigurationRecommendations(configurations, None, services, hosts) +- self.assertEquals(configurations["hawq-site"]["property_attributes"]["default_hash_table_bucket_number"]["maximum"], "9984") ++ self.assertEqual(configurations["hawq-site"]["property_attributes"]["default_hash_table_bucket_number"]["maximum"], "9984") + + # Case 2: No. of HAWQSEGMENTs - 1000 + # Set default_hash_table_bucket_number maximum range to 10000 +@@ -621,9 +621,9 @@ + componentsList = self.getComponentsListFromServices(services) + hawqSegmentHosts = self.getHosts(componentsList, "HAWQSEGMENT") + hawqSegmentHosts["hostnames"] = ["host" + str(i) for i in range(1000)] +- self.assertEquals(len(hawqSegmentHosts["hostnames"]), 1000) ++ self.assertEqual(len(hawqSegmentHosts["hostnames"]), 1000) + self.serviceAdvisor.getServiceConfigurationRecommendations(configurations, None, services, hosts) +- self.assertEquals(configurations["hawq-site"]["property_attributes"]["default_hash_table_bucket_number"]["maximum"], "10000") ++ self.assertEqual(configurations["hawq-site"]["property_attributes"]["default_hash_table_bucket_number"]["maximum"], "10000") + + def test_createComponentLayoutRecommendations_hawq_3_Hosts(self): + """ Test that HAWQSTANDBY is recommended on a 3-node cluster """ +@@ -634,7 +634,7 @@ + + hosts = self.load_json("hosts-3-hosts.json") + hostsList = [host["Hosts"]["host_name"] for host in hosts["items"]] +- self.assertEquals(len(hostsList), 3) ++ self.assertEqual(len(hostsList), 3) + + self.insertHAWQServiceAdvisorInfo(services) + recommendations = self.serviceAdvisor.recommendComponentLayout(services, hosts) +@@ -648,7 +648,7 @@ + recommendations["recommendations"]["blueprint"]["host_groups"]] + for sublist in componentsListList: + hostComponents = [item["name"] for item in sublist] +- self.assertFalse(set(['HAWQMASTER', 'HAWQSTANDBY']).issubset(hostComponents)) ++ self.assertFalse({'HAWQMASTER', 'HAWQSTANDBY'}.issubset(hostComponents)) + + def test_createComponentLayoutRecommendations_hawq_1_Host(self): + +@@ -658,7 +658,7 @@ + + hosts = self.load_json("hosts-1-host.json") + hostsList = [host["Hosts"]["host_name"] for host in hosts["items"]] +- self.assertEquals(len(hostsList), 1) ++ self.assertEqual(len(hostsList), 1) + + self.insertHAWQServiceAdvisorInfo(services) + recommendations = self.serviceAdvisor.recommendComponentLayout(services, hosts) +@@ -678,7 +678,7 @@ + + hosts = self.load_json("hosts-3-hosts.json") + hostsList = [host["Hosts"]["host_name"] for host in hosts["items"]] +- self.assertEquals(len(hostsList), 3) ++ self.assertEqual(len(hostsList), 3) + + self.insertHAWQServiceAdvisorInfo(services) + recommendations = self.serviceAdvisor.recommendComponentLayout(services, hosts) +@@ -726,11 +726,11 @@ + ] + } + +- hawqSegmentHosts = set(["c6401.ambari.apache.org", "c6402.ambari.apache.org", "c6403.ambari.apache.org"]) ++ hawqSegmentHosts = {"c6401.ambari.apache.org", "c6402.ambari.apache.org", "c6403.ambari.apache.org"} + self.insertHAWQServiceAdvisorInfo(services) + recommendations = self.serviceAdvisor.createComponentLayoutRecommendations(services, hosts) + hostNames = self.getHostsFromRecommendations(recommendations, "HAWQSEGMENT") +- self.assertEquals(set(hostNames), hawqSegmentHosts) ++ self.assertEqual(set(hostNames), hawqSegmentHosts) + + def test_createComponentLayoutRecommendations_hawqsegment_add_service_wizard_to_be_installed(self): + """ Test that HAWQSEGMENT gets recommended correctly during Add Service Wizard, when HAWQ is selected for installation """ +@@ -771,11 +771,11 @@ + ] + } + +- hawqSegmentHosts = set(["c6401.ambari.apache.org", "c6403.ambari.apache.org"]) ++ hawqSegmentHosts = {"c6401.ambari.apache.org", "c6403.ambari.apache.org"} + self.insertHAWQServiceAdvisorInfo(services) + recommendations = self.serviceAdvisor.createComponentLayoutRecommendations(services, hosts) + hostNames = self.getHostsFromRecommendations(recommendations, "HAWQSEGMENT") +- self.assertEquals(set(hostNames), hawqSegmentHosts) ++ self.assertEqual(set(hostNames), hawqSegmentHosts) + + def test_createComponentLayoutRecommendations_hawqsegment_add_service_wizard_already_installed(self): + """ Test that HAWQSEGMENT does not get recommended during Add Service Wizard, when HAWQ has already been installed """ +@@ -831,11 +831,11 @@ + ] + } + +- hawqSegmentHosts = set(["c6402.ambari.apache.org"]) ++ hawqSegmentHosts = {"c6402.ambari.apache.org"} + self.insertHAWQServiceAdvisorInfo(services) + recommendations = self.serviceAdvisor.createComponentLayoutRecommendations(services, hosts) + hostNames = self.getHostsFromRecommendations(recommendations, "HAWQSEGMENT") +- self.assertEquals(set(hostNames), hawqSegmentHosts) ++ self.assertEqual(set(hostNames), hawqSegmentHosts) + + def test_getComponentLayoutValidations_hawqsegment_not_co_located_with_datanode(self): + """ Test validation warning for HAWQ segment not colocated with DATANODE """ +@@ -857,11 +857,11 @@ + 'component-name': 'HAWQSEGMENT', + 'message': 'HAWQ Segment must be installed on all DataNodes. The following 2 host(s) do not satisfy the colocation recommendation: c6401.ambari.apache.org, c6402.ambari.apache.org', + } +- self.assertEquals(validations[0], expected) ++ self.assertEqual(validations[0], expected) + + datanodeComponent["hostnames"] = ['c6401.ambari.apache.org'] + validations = self.serviceAdvisor.getComponentLayoutValidations(services, hosts) +- self.assertEquals(len(validations), 0) ++ self.assertEqual(len(validations), 0) + + @patch('socket.getfqdn', side_effect=fqdn_mock_result) + def test_getComponentLayoutValidations_hawq_3_Hosts(self, socket_mock): +@@ -872,30 +872,30 @@ + componentsList = self.getComponentsListFromServices(services) + hawqMasterHosts = self.getHosts(componentsList, "HAWQMASTER")["hostnames"] + hawqStandbyHosts = self.getHosts(componentsList, "HAWQSTANDBY")["hostnames"] +- self.assertEquals(len(hawqMasterHosts), 1) +- self.assertEquals(len(hawqStandbyHosts), 1) +- self.assertNotEquals(hawqMasterHosts[0], hawqStandbyHosts[0]) ++ self.assertEqual(len(hawqMasterHosts), 1) ++ self.assertEqual(len(hawqStandbyHosts), 1) ++ self.assertNotEqual(hawqMasterHosts[0], hawqStandbyHosts[0]) + + hosts = self.load_json("hosts-3-hosts.json") + hostsList = [host["Hosts"]["host_name"] for host in hosts["items"]] +- self.assertEquals(len(hostsList), 3) ++ self.assertEqual(len(hostsList), 3) + + self.insertHAWQServiceAdvisorInfo(services) + validations = self.serviceAdvisor.getComponentLayoutValidations(services, hosts) +- self.assertEquals(len(validations), 0) ++ self.assertEqual(len(validations), 0) + + # case-2: HAWQ masters are collocated + services = self.load_json("services-master_standby_colo-3-hosts.json") + componentsList = self.getComponentsListFromServices(services) + hawqMasterHosts = self.getHosts(componentsList, "HAWQMASTER")["hostnames"] + hawqStandbyHosts = self.getHosts(componentsList, "HAWQSTANDBY")["hostnames"] +- self.assertEquals(len(hawqMasterHosts), 1) +- self.assertEquals(len(hawqStandbyHosts), 1) +- self.assertEquals(hawqMasterHosts[0], hawqStandbyHosts[0]) ++ self.assertEqual(len(hawqMasterHosts), 1) ++ self.assertEqual(len(hawqStandbyHosts), 1) ++ self.assertEqual(hawqMasterHosts[0], hawqStandbyHosts[0]) + + self.insertHAWQServiceAdvisorInfo(services) + validations = self.serviceAdvisor.getComponentLayoutValidations(services, hosts) +- self.assertEquals(len(validations), 1) ++ self.assertEqual(len(validations), 1) + expected = { + 'component-name': 'HAWQSTANDBY', + 'message': 'HAWQ Master and HAWQ Standby Master cannot be deployed on the same host.', +@@ -903,21 +903,21 @@ + 'host': 'c6403.ambari.apache.org', + 'level': 'ERROR' + } +- self.assertEquals(validations[0], expected) ++ self.assertEqual(validations[0], expected) + + # case-3: HAWQ Master and Ambari Server are collocated + services = self.load_json("services-master_ambari_colo-3-hosts.json") + componentsList = self.getComponentsListFromServices(services) + hawqMasterHosts = self.getHosts(componentsList, "HAWQMASTER")["hostnames"] + hawqStandbyHosts = self.getHosts(componentsList, "HAWQSTANDBY")["hostnames"] +- self.assertEquals(len(hawqMasterHosts), 1) +- self.assertEquals(len(hawqStandbyHosts), 1) +- self.assertNotEquals(hawqMasterHosts[0], hawqStandbyHosts[0]) +- self.assertEquals(hawqMasterHosts[0], "c6401.ambari.apache.org") ++ self.assertEqual(len(hawqMasterHosts), 1) ++ self.assertEqual(len(hawqStandbyHosts), 1) ++ self.assertNotEqual(hawqMasterHosts[0], hawqStandbyHosts[0]) ++ self.assertEqual(hawqMasterHosts[0], "c6401.ambari.apache.org") + + self.insertHAWQServiceAdvisorInfo(services) + validations = self.serviceAdvisor.getComponentLayoutValidations(services, hosts) +- self.assertEquals(len(validations), 1) ++ self.assertEqual(len(validations), 1) + expected = { + 'component-name': 'HAWQMASTER', + 'message': 'The default Postgres port (5432) on the Ambari Server conflicts with the default HAWQ Masters port. ' + +@@ -927,21 +927,21 @@ + 'host': 'c6401.ambari.apache.org', + 'level': 'WARN' + } +- self.assertEquals(validations[0], expected) ++ self.assertEqual(validations[0], expected) + + # case-4: HAWQ Standby and Ambari Server are collocated + services = self.load_json("services-standby_ambari_colo-3-hosts.json") + componentsList = self.getComponentsListFromServices(services) + hawqMasterHosts = self.getHosts(componentsList, "HAWQMASTER")["hostnames"] + hawqStandbyHosts = self.getHosts(componentsList, "HAWQSTANDBY")["hostnames"] +- self.assertEquals(len(hawqMasterHosts), 1) +- self.assertEquals(len(hawqStandbyHosts), 1) +- self.assertNotEquals(hawqMasterHosts[0], hawqStandbyHosts[0]) +- self.assertEquals(hawqStandbyHosts[0], "c6401.ambari.apache.org") ++ self.assertEqual(len(hawqMasterHosts), 1) ++ self.assertEqual(len(hawqStandbyHosts), 1) ++ self.assertNotEqual(hawqMasterHosts[0], hawqStandbyHosts[0]) ++ self.assertEqual(hawqStandbyHosts[0], "c6401.ambari.apache.org") + + self.insertHAWQServiceAdvisorInfo(services) + validations = self.serviceAdvisor.getComponentLayoutValidations(services, hosts) +- self.assertEquals(len(validations), 1) ++ self.assertEqual(len(validations), 1) + expected = { + 'component-name': 'HAWQSTANDBY', + 'message': 'The default Postgres port (5432) on the Ambari Server conflicts with the default HAWQ Masters port. ' + +@@ -951,7 +951,7 @@ + 'host': 'c6401.ambari.apache.org', + 'level': 'WARN' + } +- self.assertEquals(validations[0], expected) ++ self.assertEqual(validations[0], expected) + + @patch('socket.getfqdn', side_effect=fqdn_mock_result) + def test_getComponentLayoutValidations_nohawq_3_Hosts(self, socket_mock): +@@ -962,16 +962,16 @@ + componentsList = self.getComponentsListFromServices(services) + hawqMasterHosts = self.getHosts(componentsList, "HAWQMASTER") + hawqStandbyHosts = self.getHosts(componentsList, "HAWQSTANDBY") +- self.assertEquals(len(hawqMasterHosts), 0) +- self.assertEquals(len(hawqStandbyHosts), 0) ++ self.assertEqual(len(hawqMasterHosts), 0) ++ self.assertEqual(len(hawqStandbyHosts), 0) + + hosts = self.load_json("hosts-3-hosts.json") + hostsList = [host["Hosts"]["host_name"] for host in hosts["items"]] +- self.assertEquals(len(hostsList), 3) ++ self.assertEqual(len(hostsList), 3) + + self.insertHAWQServiceAdvisorInfo(services) + validations = self.serviceAdvisor.getComponentLayoutValidations(services, hosts) +- self.assertEquals(len(validations), 0) ++ self.assertEqual(len(validations), 0) + + def test_validateHAWQSiteConfigurations(self): + services = self.load_json("services-hawq-3-hosts.json") +@@ -1282,7 +1282,7 @@ + self.assertEqual(len(problems), 10) + + # check individual properties +- for property in desired_values.keys(): ++ for property in list(desired_values.keys()): + # populate all properties as to desired configuration + configurations["hdfs-site"]["properties"] = desired_values.copy() + # test when the given property is missing +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/common-services/HAWQ/test_utils.py apache-ambari-2.7.6-change/ambari-server/src/test/python/common-services/HAWQ/test_utils.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/common-services/HAWQ/test_utils.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/common-services/HAWQ/test_utils.py 2022-07-11 00:52:31.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +@@ -25,4 +25,4 @@ + + def test_generate_hawq_process_status_cmd(self): + cmd = utils.generate_hawq_process_status_cmd("master", 12345) +- self.assertEqual(cmd, "netstat -tupln | egrep ':12345\s' | egrep postgres") ++ self.assertEqual(cmd, r"netstat -tupln | egrep ':12345\s' | egrep postgres") +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/common-services/LOGSEARCH/test_service_advisor.py apache-ambari-2.7.6-change/ambari-server/src/test/python/common-services/LOGSEARCH/test_service_advisor.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/common-services/LOGSEARCH/test_service_advisor.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/common-services/LOGSEARCH/test_service_advisor.py 2022-07-11 00:52:31.000000000 +0800 +@@ -143,7 +143,7 @@ + return ["c6401.ambari.apache.org", "c6402.ambari.apache.org"] + self.serviceAdvisor.getComponentHostNames = return_c6401_hostname + self.serviceAdvisor.getServiceConfigurationRecommendations(self.configurations, self.clusterData, services, self.hosts) +- self.assertEquals(self.configurations, expected) ++ self.assertEqual(self.configurations, expected) + + def test_recommendLogsearchConfigurationWhenSolrIsExternal(self): + expected = { +@@ -199,4 +199,4 @@ + return [] + self.serviceAdvisor.getComponentHostNames = return_c6401_hostname + self.serviceAdvisor.getServiceConfigurationRecommendations(self.configurations, self.clusterData, services, self.hosts) +- self.assertEquals(self.configurations, expected) ++ self.assertEqual(self.configurations, expected) +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/common-services/PXF/test_alerts_api_status.py apache-ambari-2.7.6-change/ambari-server/src/test/python/common-services/PXF/test_alerts_api_status.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/common-services/PXF/test_alerts_api_status.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/common-services/PXF/test_alerts_api_status.py 2022-07-11 00:52:31.000000000 +0800 +@@ -20,7 +20,7 @@ + import os + import sys + +-from mock.mock import patch ++from unittest.mock import patch + + # Local imports + from stacks.utils.RMFTestCase import RMFTestCase +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/common-services/PXF/test_pxf.py apache-ambari-2.7.6-change/ambari-server/src/test/python/common-services/PXF/test_pxf.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/common-services/PXF/test_pxf.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/common-services/PXF/test_pxf.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 json + import os + +-from mock.mock import patch ++from unittest.mock import patch + from stacks.utils.RMFTestCase import Template, RMFTestCase + + +@@ -35,7 +35,7 @@ + BASH_SHELL = '/bin/bash' + DEFAULT_TIMEOUT = 600 + CONFIG_FILE = os.path.join(os.path.dirname(__file__), '../configs/pxf_default.json') +- with open(CONFIG_FILE, "r") as f: ++ with open(CONFIG_FILE) as f: + pxf_config = json.load(f) + + def setUp(self): +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/common-services/PXF/test_service_advisor.py apache-ambari-2.7.6-change/ambari-server/src/test/python/common-services/PXF/test_service_advisor.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/common-services/PXF/test_service_advisor.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/common-services/PXF/test_service_advisor.py 2022-07-11 00:52:31.000000000 +0800 +@@ -82,13 +82,13 @@ + # Case 1: Test pxf-hbase.jar classpath line was added to content + expected = "# Some hbase-env content text\n\n#Add pxf-hbase.jar to HBASE_CLASSPATH\n" + self.PXF_PATH + self.serviceAdvisor.getServiceConfigurationRecommendations(services["configurations"], None, services, None) +- self.assertEquals(services["configurations"]["hbase-env"]["properties"]["content"], expected) ++ self.assertEqual(services["configurations"]["hbase-env"]["properties"]["content"], expected) + + # Case 2: Test pxf-hbase.jar classpath line is not added again if content already has it + services["configurations"]["hbase-env"]["properties"]["content"] = self.PXF_PATH + expected = self.PXF_PATH + self.serviceAdvisor.getServiceConfigurationRecommendations(services["configurations"], None, services, None) +- self.assertEquals(services["configurations"]["hbase-env"]["properties"]["content"], expected) ++ self.assertEqual(services["configurations"]["hbase-env"]["properties"]["content"], expected) + + def test_getConfigurationsValidationItems(self): + services = { +@@ -133,12 +133,12 @@ + } + ] + items = self.serviceAdvisor.getServiceConfigurationsValidationItems(properties, properties, services, None) +- self.assertEquals(items, expected) ++ self.assertEqual(items, expected) + + # Case 2: No warning should be generated if PXF_PATH is present in hbase-env + properties = services["configurations"]["hbase-env"]["properties"]["content"] = self.PXF_PATH + items = self.serviceAdvisor.getServiceConfigurationsValidationItems(properties, properties, services, None) +- self.assertEquals(items, []) ++ self.assertEqual(items, []) + + + def test_createComponentLayoutRecommendations_pxf_cluster_install(self): +@@ -189,7 +189,7 @@ + ] + } + +- pxfHosts = set(["c6401.ambari.apache.org", "c6402.ambari.apache.org", "c6403.ambari.apache.org"]) ++ pxfHosts = {"c6401.ambari.apache.org", "c6402.ambari.apache.org", "c6403.ambari.apache.org"} + + self.insertPXFServiceAdvisorInfo(services) + recommendations = self.serviceAdvisor.createComponentLayoutRecommendations(services, hosts) +@@ -197,7 +197,7 @@ + {"name": "PXF"} in hostgroup["components"]] + hostNames = [host["fqdn"] for hostgroup in recommendations["blueprint_cluster_binding"]["host_groups"] if + hostgroup["name"] in hostGroups for host in hostgroup["hosts"]] +- self.assertEquals(set(hostNames), pxfHosts) ++ self.assertEqual(set(hostNames), pxfHosts) + + + def test_createComponentLayoutRecommendations_pxf_add_service_wizard_to_be_installed(self): +@@ -248,7 +248,7 @@ + ] + } + +- pxfHosts = set(["c6401.ambari.apache.org", "c6402.ambari.apache.org", "c6403.ambari.apache.org"]) ++ pxfHosts = {"c6401.ambari.apache.org", "c6402.ambari.apache.org", "c6403.ambari.apache.org"} + + self.insertPXFServiceAdvisorInfo(services) + recommendations = self.serviceAdvisor.createComponentLayoutRecommendations(services, hosts) +@@ -256,7 +256,7 @@ + {"name": "PXF"} in hostgroup["components"]] + hostNames = [host["fqdn"] for hostgroup in recommendations["blueprint_cluster_binding"]["host_groups"] if + hostgroup["name"] in hostGroups for host in hostgroup["hosts"]] +- self.assertEquals(set(hostNames), pxfHosts) ++ self.assertEqual(set(hostNames), pxfHosts) + + + def test_createComponentLayoutRecommendations_pxf_add_service_wizard_already_installed(self): +@@ -323,7 +323,7 @@ + ] + } + +- pxfHosts = set(["c6402.ambari.apache.org"]) ++ pxfHosts = {"c6402.ambari.apache.org"} + + self.insertPXFServiceAdvisorInfo(services) + recommendations = self.serviceAdvisor.createComponentLayoutRecommendations(services, hosts) +@@ -331,7 +331,7 @@ + {"name": "PXF"} in hostgroup["components"]] + hostNames = [host["fqdn"] for hostgroup in recommendations["blueprint_cluster_binding"]["host_groups"] if + hostgroup["name"] in hostGroups for host in hostgroup["hosts"]] +- self.assertEquals(set(hostNames), pxfHosts) ++ self.assertEqual(set(hostNames), pxfHosts) + + def test_getComponentLayoutValidations_pxf_not_co_located_with_nn(self): + """ Test warning is generated when PXF is not co-located with NAMENODE """ +@@ -348,17 +348,17 @@ + + hosts = self.load_json("hosts-3-hosts.json") + hostsList = [host["Hosts"]["host_name"] for host in hosts["items"]] +- self.assertEquals(len(hostsList), 3) ++ self.assertEqual(len(hostsList), 3) + + validations = [validation for validation in self.serviceAdvisor.getServiceComponentLayoutValidations(services, hosts) if validation["component-name"] == "PXF"] +- self.assertEquals(len(validations), 1) ++ self.assertEqual(len(validations), 1) + expected = { + "type": 'host-component', + "level": 'WARN', + "component-name": 'PXF', + "message": 'PXF must be installed on the NameNode, Standby NameNode and all DataNodes. The following 1 host(s) do not satisfy the colocation recommendation: c6401.ambari.apache.org' + } +- self.assertEquals(validations[0], expected) ++ self.assertEqual(validations[0], expected) + + + def test_getComponentLayoutValidations_pxf_not_co_located_with_dn(self): +@@ -376,17 +376,17 @@ + + hosts = self.load_json("hosts-3-hosts.json") + hostsList = [host["Hosts"]["host_name"] for host in hosts["items"]] +- self.assertEquals(len(hostsList), 3) ++ self.assertEqual(len(hostsList), 3) + + validations = [validation for validation in self.serviceAdvisor.getServiceComponentLayoutValidations(services, hosts) if validation["component-name"] == "PXF"] +- self.assertEquals(len(validations), 1) ++ self.assertEqual(len(validations), 1) + expected = { + "type": 'host-component', + "level": 'WARN', + "component-name": 'PXF', + "message": 'PXF must be installed on the NameNode, Standby NameNode and all DataNodes. The following 2 host(s) do not satisfy the colocation recommendation: c6402.ambari.apache.org, c6403.ambari.apache.org' + } +- self.assertEquals(validations[0], expected) ++ self.assertEqual(validations[0], expected) + + + def test_getComponentLayoutValidations_pxf_not_co_located_with_nn_or_dn(self): +@@ -404,17 +404,17 @@ + + hosts = self.load_json("hosts-3-hosts.json") + hostsList = [host["Hosts"]["host_name"] for host in hosts["items"]] +- self.assertEquals(len(hostsList), 3) ++ self.assertEqual(len(hostsList), 3) + + validations = [validation for validation in self.serviceAdvisor.getServiceComponentLayoutValidations(services, hosts) if validation["component-name"] == "PXF"] +- self.assertEquals(len(validations), 1) ++ self.assertEqual(len(validations), 1) + expected = { + "type": 'host-component', + "level": 'WARN', + "component-name": 'PXF', + "message": 'PXF must be installed on the NameNode, Standby NameNode and all DataNodes. The following 1 host(s) do not satisfy the colocation recommendation: c6403.ambari.apache.org' + } +- self.assertEquals(validations[0], expected) ++ self.assertEqual(validations[0], expected) + + + def test_getComponentLayoutValidations_pxf_co_located_with_nn_and_dn(self): +@@ -432,7 +432,7 @@ + + hosts = self.load_json("hosts-3-hosts.json") + hostsList = [host["Hosts"]["host_name"] for host in hosts["items"]] +- self.assertEquals(len(hostsList), 3) ++ self.assertEqual(len(hostsList), 3) + + validations = [validation for validation in self.serviceAdvisor.getServiceComponentLayoutValidations(services, hosts) if validation["component-name"] == "PXF"] +- self.assertEquals(len(validations), 0) ++ self.assertEqual(len(validations), 0) +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/custom_actions/TestCheckHost.py apache-ambari-2.7.6-change/ambari-server/src/test/python/custom_actions/TestCheckHost.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/custom_actions/TestCheckHost.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/custom_actions/TestCheckHost.py 2022-07-11 00:52:32.000000000 +0800 +@@ -27,8 +27,8 @@ + from resource_management import Script, ConfigDictionary + from resource_management.core.exceptions import Fail + from resource_management.core.logger import Logger +-from mock.mock import patch +-from mock.mock import MagicMock ++from unittest.mock import patch ++from unittest.mock import MagicMock + from unittest import TestCase + + from check_host import CheckHost +@@ -57,7 +57,7 @@ + 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 @@ + + 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 @@ + 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 @@ + 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,7 +159,7 @@ + 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}}) + + # test, db connection success +@@ -169,7 +169,7 @@ + + 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 +@@ -192,7 +192,7 @@ + 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 + +@@ -206,7 +206,7 @@ + mock_socket.return_value = "192.168.1.1" + jsonFilePath = os.path.join(TestCheckHost.current_dir+"/../../resources/custom_actions", "check_host_ip_addresses.json") + +- with open(jsonFilePath, "r") as jsonFile: ++ with open(jsonFilePath) as jsonFile: + jsonPayload = json.load(jsonFile) + + mock_config.return_value = ConfigDictionary(jsonPayload) +@@ -231,16 +231,16 @@ + + 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)) +@@ -250,7 +250,7 @@ + def testInvalidCheck(self, structured_out_mock, get_tmp_dir_mock, mock_config): + jsonFilePath = os.path.join(TestCheckHost.current_dir+"/../../resources/custom_actions", "invalid_check.json") + +- with open(jsonFilePath, "r") as jsonFile: ++ with open(jsonFilePath) as jsonFile: + jsonPayload = json.load(jsonFile) + + mock_config.return_value = ConfigDictionary(jsonPayload) +@@ -282,7 +282,7 @@ + getUMask_mock, checkLiveServices_mock, javaProcs_mock, put_structured_out_mock, + get_tmp_dir_mock, get_config_mock, systemmock): + jsonFilePath = os.path.join(TestCheckHost.current_dir+"/../../resources/custom_actions", "check_last_agent_env.json") +- with open(jsonFilePath, "r") as jsonFile: ++ with open(jsonFilePath) as jsonFile: + jsonPayload = json.load(jsonFile) + + get_config_mock.return_value = ConfigDictionary(jsonPayload) +@@ -336,7 +336,7 @@ + getUMask_mock, checkLiveServices_mock, javaProcs_mock, put_structured_out_mock, + get_tmp_dir_mock, get_config_mock, systemmock): + jsonFilePath = os.path.join(TestCheckHost.current_dir, "..", "..", "resources", "custom_actions", "check_last_agent_env.json") +- with open(jsonFilePath, "r") as jsonFile: ++ with open(jsonFilePath) as jsonFile: + jsonPayload = json.load(jsonFile) + + get_config_mock.return_value = ConfigDictionary(jsonPayload) +@@ -401,13 +401,13 @@ + 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)) +@@ -442,14 +442,14 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/custom_actions/TestClearRepoCache.py apache-ambari-2.7.6-change/ambari-server/src/test/python/custom_actions/TestClearRepoCache.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/custom_actions/TestClearRepoCache.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/custom_actions/TestClearRepoCache.py 2022-07-11 00:52:32.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 os, sys + +-from mock.mock import patch +-from mock.mock import MagicMock ++from unittest.mock import patch ++from unittest.mock import MagicMock + from unittest import TestCase + + from resource_management import * +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/custom_actions/TestInstallPackages.py apache-ambari-2.7.6-change/ambari-server/src/test/python/custom_actions/TestInstallPackages.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/custom_actions/TestInstallPackages.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/custom_actions/TestInstallPackages.py 2022-07-11 00:52:32.000000000 +0800 +@@ -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 select + + from stacks.utils.RMFTestCase import * +-from mock.mock import patch, MagicMock ++from unittest.mock import patch, MagicMock + from resource_management.core.base import Resource + from resource_management.core.exceptions import Fail + from resource_management.libraries.script import Script +@@ -78,7 +78,7 @@ + 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("resource_management.libraries.functions.list_ambari_managed_repos.list_ambari_managed_repos") +@@ -124,22 +124,22 @@ + 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, +@@ -167,7 +167,7 @@ + ] + + config_file = self.get_src_folder() + "/test/python/custom_actions/configs/install_packages_config.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + command_json = json.load(f) + + command_json['repositoryFile']['repositories'] = [] +@@ -195,7 +195,7 @@ + os_type=('Redhat', '6.4', 'Final'), + ) + except Fail as e: +- self.assertEquals(e.message, "Failed to distribute repositories/install packages") ++ self.assertEqual(e.message, "Failed to distribute repositories/install packages") + else: + self.assertFalse("Packages can't be installed without repos") + +@@ -244,23 +244,23 @@ + 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, + ) +@@ -312,23 +312,23 @@ + 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, + ) +@@ -400,23 +400,23 @@ + 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, +@@ -470,23 +470,23 @@ + 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, + ) +@@ -533,7 +533,7 @@ + + + config_file = self.get_src_folder() + "/test/python/custom_actions/configs/install_packages_repository_file.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + command_json = json.load(f) + + command_json['repositoryFile']['repoVersion'] = '2.2.0.1-990' +@@ -548,23 +548,23 @@ + 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, + ) +@@ -591,7 +591,7 @@ + ] + + config_file = self.get_src_folder() + "/test/python/custom_actions/configs/install_packages_config.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + command_json = json.load(f) + + command_json['repositoryFile']['repoVersion'] = VERSION_STUB +@@ -618,12 +618,12 @@ + 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() +@@ -637,7 +637,7 @@ + read_actual_version_from_history_file_mock.return_value = VERSION_STUB + + config_file = self.get_src_folder() + "/test/python/custom_actions/configs/install_packages_config.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + command_json = json.load(f) + + command_json['repositoryFile']['repoVersion'] = VERSION_STUB +@@ -654,7 +654,7 @@ + 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}) +@@ -685,7 +685,7 @@ + read_actual_version_from_history_file_mock.return_value = None + + config_file = self.get_src_folder() + "/test/python/custom_actions/configs/install_packages_config.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + command_json = json.load(f) + + command_json['roleParams']['repository_version'] = VERSION_STUB_WITHOUT_BUILD_NUMBER +@@ -719,7 +719,7 @@ + + + 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}) +@@ -754,7 +754,7 @@ + read_actual_version_from_history_file_mock.return_value = None + + config_file = self.get_src_folder() + "/test/python/custom_actions/configs/install_packages_config.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + command_json = json.load(f) + + command_json['repositoryFile']['repoVersion'] = VERSION_STUB_WITHOUT_BUILD_NUMBER +@@ -787,7 +787,7 @@ + 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}) + +@@ -806,7 +806,7 @@ + read_actual_version_from_history_file_mock.return_value = None + + config_file = self.get_src_folder() + "/test/python/custom_actions/configs/install_packages_config.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + command_json = json.load(f) + + command_json['repositoryFile']['repoVersion'] = VERSION_STUB +@@ -828,7 +828,7 @@ + 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}) +@@ -855,7 +855,7 @@ + ] + + config_file = self.get_src_folder() + "/test/python/custom_actions/configs/install_packages_config.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + command_json = json.load(f) + + command_json['roleParams']['repository_version'] = VERSION_STUB_WITHOUT_BUILD_NUMBER +@@ -882,12 +882,12 @@ + 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() +@@ -901,7 +901,7 @@ + read_actual_version_from_history_file_mock.return_value = VERSION_STUB + + config_file = self.get_src_folder() + "/test/python/custom_actions/configs/install_packages_config.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + command_json = json.load(f) + + command_json['repositoryFile']['repoVersion'] = VERSION_STUB_WITHOUT_BUILD_NUMBER +@@ -918,7 +918,7 @@ + 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}) +@@ -945,7 +945,7 @@ + ] + + config_file = self.get_src_folder() + "/test/python/custom_actions/configs/install_packages_config.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + command_json = json.load(f) + + command_json['repositoryFile']['repoVersion'] = '2.2.0.1-500' # User specified wrong build number +@@ -972,12 +972,12 @@ + 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() +@@ -991,7 +991,7 @@ + read_actual_version_from_history_file_mock.return_value = VERSION_STUB + + config_file = self.get_src_folder() + "/test/python/custom_actions/configs/install_packages_config.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + command_json = json.load(f) + + command_json['roleParams']['repository_version'] = '2.2.0.1-500' # User specified wrong build number +@@ -1008,7 +1008,7 @@ + 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}) +@@ -1039,7 +1039,7 @@ + read_actual_version_from_history_file_mock.return_value = None + + config_file = self.get_src_folder() + "/test/python/custom_actions/configs/install_packages_config.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + command_json = json.load(f) + + command_json['repositoryFile']['repoVersion'] = VERSION_STUB_WITHOUT_BUILD_NUMBER +@@ -1071,7 +1071,7 @@ + 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}) + +@@ -1090,7 +1090,7 @@ + read_actual_version_from_history_file_mock.return_value = None + + config_file = self.get_src_folder() + "/test/python/custom_actions/configs/install_packages_config.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + command_json = json.load(f) + + command_json['roleParams']['repository_version'] = VERSION_STUB +@@ -1112,7 +1112,7 @@ + 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}) +@@ -1138,7 +1138,7 @@ + ] + + config_file = self.get_src_folder() + "/test/python/custom_actions/configs/install_packages_config.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + command_json = json.load(f) + + command_json['roleParams']['repository_version'] = VERSION_STUB +@@ -1166,12 +1166,12 @@ + 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() +@@ -1185,7 +1185,7 @@ + read_actual_version_from_history_file_mock.return_value = VERSION_STUB + + config_file = self.get_src_folder() + "/test/python/custom_actions/configs/install_packages_config.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + command_json = json.load(f) + + command_json['roleParams']['repository_version'] = VERSION_STUB +@@ -1203,7 +1203,7 @@ + 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}) +@@ -1254,23 +1254,23 @@ + 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, +@@ -1283,6 +1283,6 @@ + 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__) +\ 文件尾没有换行符 +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/custom_actions/TestRemoveBits.py apache-ambari-2.7.6-change/ambari-server/src/test/python/custom_actions/TestRemoveBits.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/custom_actions/TestRemoveBits.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/custom_actions/TestRemoveBits.py 2022-07-11 00:52:32.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +@@ -23,10 +23,10 @@ + import select + import install_packages + +-from mock.mock import patch +-from mock.mock import MagicMock ++from unittest.mock import patch ++from unittest.mock import MagicMock + from stacks.utils.RMFTestCase import * +-from mock.mock import patch, MagicMock ++from unittest.mock import patch, MagicMock + from resource_management.core.base import Resource + from resource_management.core.exceptions import Fail + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/custom_actions/TestRemoveStackVersion.py apache-ambari-2.7.6-change/ambari-server/src/test/python/custom_actions/TestRemoveStackVersion.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/custom_actions/TestRemoveStackVersion.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/custom_actions/TestRemoveStackVersion.py 2022-07-11 00:52:32.000000000 +0800 +@@ -67,11 +67,11 @@ + 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'), +@@ -109,7 +109,7 @@ + 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("resource_management.libraries.functions.list_ambari_managed_repos.list_ambari_managed_repos") +@@ -143,10 +143,10 @@ + 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() +\ 文件尾没有换行符 +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/custom_actions/TestRepoVersionHistory.py apache-ambari-2.7.6-change/ambari-server/src/test/python/custom_actions/TestRepoVersionHistory.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/custom_actions/TestRepoVersionHistory.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/custom_actions/TestRepoVersionHistory.py 2022-07-11 00:52:32.000000000 +0800 +@@ -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 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/custom_actions/test_ru_execute_tasks.py apache-ambari-2.7.6-change/ambari-server/src/test/python/custom_actions/test_ru_execute_tasks.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/custom_actions/test_ru_execute_tasks.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/custom_actions/test_ru_execute_tasks.py 2022-07-11 00:52:32.000000000 +0800 +@@ -23,8 +23,8 @@ + import json + from ambari_commons.os_family_impl import OsFamilyFuncImpl, OsFamilyImpl + +-from mock.mock import patch +-from mock.mock import MagicMock ++from unittest.mock import patch ++from unittest.mock import MagicMock + + # Module imports + from stacks.utils.RMFTestCase import * +@@ -98,7 +98,7 @@ + # Mock the config objects + json_file_path = os.path.join(self.get_custom_actions_dir(), "ru_execute_tasks_namenode_prepare.json") + self.assertTrue(os.path.isfile(json_file_path)) +- with open(json_file_path, "r") as json_file: ++ with open(json_file_path) as json_file: + json_payload = json.load(json_file) + + config_dict = ConfigDictionary(json_payload) +@@ -143,7 +143,7 @@ + # Mock the config objects + json_file_path = os.path.join(self.get_custom_actions_dir(), "ru_execute_tasks_namenode_prepare.json") + self.assertTrue(os.path.isfile(json_file_path)) +- with open(json_file_path, "r") as json_file: ++ with open(json_file_path) as json_file: + json_payload = json.load(json_file) + + del json_payload['commandParams']['service_package_folder'] +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/custom_actions/test_stack_select_set_all.py apache-ambari-2.7.6-change/ambari-server/src/test/python/custom_actions/test_stack_select_set_all.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/custom_actions/test_stack_select_set_all.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/custom_actions/test_stack_select_set_all.py 2022-07-11 00:52:32.000000000 +0800 +@@ -22,8 +22,8 @@ + import os + import json + +-from mock.mock import patch +-from mock.mock import MagicMock ++from unittest.mock import patch ++from unittest.mock import MagicMock + + from stacks.utils.RMFTestCase import experimental_mock + patch('resource_management.libraries.functions.decorator.experimental', experimental_mock).start() +@@ -73,7 +73,7 @@ + json_file_path = os.path.join(self.get_custom_actions_dir(), "ru_execute_tasks_namenode_prepare.json") + self.assertTrue(os.path.isfile(json_file_path)) + +- with open(json_file_path, "r") as json_file: ++ with open(json_file_path) as json_file: + json_payload = json.load(json_file) + + json_payload["configurations"]["cluster-env"]["stack_tools"] = self.get_stack_tools() +@@ -107,7 +107,7 @@ + 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") +@@ -124,7 +124,7 @@ + "ru_execute_tasks_namenode_prepare.json") + self.assertTrue(os.path.isfile(json_file_path)) + +- with open(json_file_path, "r") as json_file: ++ with open(json_file_path) as json_file: + json_payload = json.load(json_file) + + json_payload["configurations"]["cluster-env"]["stack_tools"] = self.get_stack_tools() +@@ -159,7 +159,7 @@ + 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") +@@ -176,7 +176,7 @@ + "ru_execute_tasks_namenode_prepare.json") + self.assertTrue(os.path.isfile(json_file_path)) + +- with open(json_file_path, "r") as json_file: ++ with open(json_file_path) as json_file: + json_payload = json.load(json_file) + + json_payload["configurations"]["cluster-env"]["stack_tools"] = self.get_stack_tools() +@@ -211,7 +211,7 @@ + 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") +@@ -223,7 +223,7 @@ + json_file_path = os.path.join(self.get_custom_actions_dir(), "ru_execute_tasks_namenode_prepare.json") + self.assertTrue(os.path.isfile(json_file_path)) + +- with open(json_file_path, "r") as json_file: ++ with open(json_file_path) as json_file: + json_payload = json.load(json_file) + + json_payload["configurations"]["cluster-env"]["stack_tools"] = self.get_stack_tools() +@@ -262,7 +262,7 @@ + json_file_path = os.path.join(self.get_custom_actions_dir(), "ru_execute_tasks_namenode_prepare.json") + self.assertTrue(os.path.isfile(json_file_path)) + +- with open(json_file_path, "r") as json_file: ++ with open(json_file_path) as json_file: + json_payload = json.load(json_file) + + json_payload["configurations"]["cluster-env"]["stack_tools"] = self.get_stack_tools() +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/custom_actions/TestUpdateRepo.py apache-ambari-2.7.6-change/ambari-server/src/test/python/custom_actions/TestUpdateRepo.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/custom_actions/TestUpdateRepo.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/custom_actions/TestUpdateRepo.py 2022-07-11 00:52:32.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 os, sys + +-from mock.mock import patch +-from mock.mock import MagicMock ++from unittest.mock import patch ++from unittest.mock import MagicMock + from unittest import TestCase + + from resource_management import * +@@ -92,8 +92,8 @@ + 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 @@ + try: + with Environment('/') as env: + updateRepo.actionexecute(None) +- except Exception, exception: ++ except Exception as exception: + failed = True + + self.assertFalse(file_mock.called) +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/host_scripts/TestAlertDiskSpace.py apache-ambari-2.7.6-change/ambari-server/src/test/python/host_scripts/TestAlertDiskSpace.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/host_scripts/TestAlertDiskSpace.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/host_scripts/TestAlertDiskSpace.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 alert_disk_space +-from mock.mock import patch, MagicMock ++from unittest.mock import patch, MagicMock + from ambari_commons.os_check import OSCheck + from stacks.utils.RMFTestCase import * + +@@ -38,8 +38,8 @@ + + # / 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 @@ + + # / 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 @@ + + # / 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 @@ + + # / 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 @@ + + # / 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 @@ + + # < 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 -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/host_scripts/TestAlertUlimit.py apache-ambari-2.7.6-change/ambari-server/src/test/python/host_scripts/TestAlertUlimit.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/host_scripts/TestAlertUlimit.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/host_scripts/TestAlertUlimit.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 alert_ulimit +-from mock.mock import patch, MagicMock ++from unittest.mock import patch, MagicMock + from unittest import TestCase + + +@@ -31,14 +31,14 @@ + # 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'])) +\ 文件尾没有换行符 ++ self.assertEqual(res, ('CRITICAL', ['Ulimit for open files (-n) is 1000000 which is higher or equal than critical value of 800000'])) +\ 文件尾没有换行符 +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/mpacks/mystack-ambari-mpack-1.0.0.0/hooks/after_install.py apache-ambari-2.7.6-change/ambari-server/src/test/python/mpacks/mystack-ambari-mpack-1.0.0.0/hooks/after_install.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/mpacks/mystack-ambari-mpack-1.0.0.0/hooks/after_install.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/mpacks/mystack-ambari-mpack-1.0.0.0/hooks/after_install.py 2022-07-11 00:52:31.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/mpacks/mystack-ambari-mpack-1.0.0.0/hooks/before_install.py apache-ambari-2.7.6-change/ambari-server/src/test/python/mpacks/mystack-ambari-mpack-1.0.0.0/hooks/before_install.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/mpacks/mystack-ambari-mpack-1.0.0.0/hooks/before_install.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/mpacks/mystack-ambari-mpack-1.0.0.0/hooks/before_install.py 2022-07-11 00:52:31.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/mpacks/mystack-ambari-mpack-1.0.0.1/hooks/after_install.py apache-ambari-2.7.6-change/ambari-server/src/test/python/mpacks/mystack-ambari-mpack-1.0.0.1/hooks/after_install.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/mpacks/mystack-ambari-mpack-1.0.0.1/hooks/after_install.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/mpacks/mystack-ambari-mpack-1.0.0.1/hooks/after_install.py 2022-07-11 00:52:31.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/mpacks/mystack-ambari-mpack-1.0.0.1/hooks/after_upgrade.py apache-ambari-2.7.6-change/ambari-server/src/test/python/mpacks/mystack-ambari-mpack-1.0.0.1/hooks/after_upgrade.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/mpacks/mystack-ambari-mpack-1.0.0.1/hooks/after_upgrade.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/mpacks/mystack-ambari-mpack-1.0.0.1/hooks/after_upgrade.py 2022-07-11 00:52:32.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/mpacks/mystack-ambari-mpack-1.0.0.1/hooks/before_install.py apache-ambari-2.7.6-change/ambari-server/src/test/python/mpacks/mystack-ambari-mpack-1.0.0.1/hooks/before_install.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/mpacks/mystack-ambari-mpack-1.0.0.1/hooks/before_install.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/mpacks/mystack-ambari-mpack-1.0.0.1/hooks/before_install.py 2022-07-11 00:52:31.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/mpacks/mystack-ambari-mpack-1.0.0.1/hooks/before_upgrade.py apache-ambari-2.7.6-change/ambari-server/src/test/python/mpacks/mystack-ambari-mpack-1.0.0.1/hooks/before_upgrade.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/mpacks/mystack-ambari-mpack-1.0.0.1/hooks/before_upgrade.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/mpacks/mystack-ambari-mpack-1.0.0.1/hooks/before_upgrade.py 2022-07-11 00:52:31.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/AMBARI_METRICS/test_metrics_collector.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/AMBARI_METRICS/test_metrics_collector.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/AMBARI_METRICS/test_metrics_collector.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/AMBARI_METRICS/test_metrics_collector.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 mock.mock import MagicMock, patch ++from unittest.mock import MagicMock, patch + from stacks.utils.RMFTestCase import * + + @patch("tempfile.mkdtemp", new = MagicMock(return_value='/some_tmp_dir')) +@@ -45,7 +45,7 @@ + ) + self.assertResourceCalled('Execute', 'ambari-sudo.sh openssl pkcs12 -in /some_tmp_dir/truststore.p12 -out /etc/ambari-metrics-collector/conf/ca.pem -cacerts -nokeys -passin pass:bigdata', + ) +- self.assertResourceCalled('Execute', ('chown', u'ams:hadoop', '/etc/ambari-metrics-collector/conf/ca.pem'), ++ self.assertResourceCalled('Execute', ('chown', 'ams:hadoop', '/etc/ambari-metrics-collector/conf/ca.pem'), + sudo=True + ) + self.assertResourceCalled('Execute', ('chmod', '644', '/etc/ambari-metrics-collector/conf/ca.pem'), +@@ -173,7 +173,7 @@ + owner = 'ams', + group = 'hadoop', + content = InlineTemplate(self.getConfig()['configurations']['ams-hbase-log4j']['content']), +- mode=0644, ++ mode=0o644, + ) + self.assertResourceCalled('File', '/etc/ambari-metrics-collector/conf/ams-env.sh', + owner = 'ams', +@@ -184,18 +184,18 @@ + group = 'hadoop', + cd_access = 'a', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('Directory', '/var/run/ambari-metrics-collector', + owner = 'ams', + cd_access = 'a', + group = 'hadoop', + create_parents = True, +- mode=0755, ++ mode=0o755, + ) + self.assertResourceCalled('File', '/usr/lib/ams-hbase/bin/hadoop', + owner = 'ams', +- mode=0755 ++ mode=0o755 + ) + self.assertResourceCalled('Directory', '/etc/security/limits.d', + owner = 'root', +@@ -205,14 +205,14 @@ + self.assertResourceCalled('File', '/etc/security/limits.d/ams.conf', + owner='root', + group='root', +- mode=0644, ++ mode=0o644, + content=Template("ams.conf.j2") + ) + if distributed: + self.assertResourceCalled('XmlConfig', 'hdfs-site.xml', + owner = 'ams', + group = 'hadoop', +- mode=0644, ++ mode=0o644, + conf_dir = '/etc/ambari-metrics-collector/conf', + configurations = self.getConfig()['configurations']['hdfs-site'], + configuration_attributes = self.getConfig()['configurationAttributes']['hdfs-site'] +@@ -220,7 +220,7 @@ + self.assertResourceCalled('XmlConfig', 'hdfs-site.xml', + owner = 'ams', + group = 'hadoop', +- mode=0644, ++ mode=0o644, + conf_dir = '/etc/ams-hbase/conf', + configurations = self.getConfig()['configurations']['hdfs-site'], + configuration_attributes = self.getConfig()['configurationAttributes']['hdfs-site'] +@@ -228,7 +228,7 @@ + self.assertResourceCalled('XmlConfig', 'core-site.xml', + owner = 'ams', + group = 'hadoop', +- mode=0644, ++ mode=0o644, + conf_dir = '/etc/ambari-metrics-collector/conf', + configurations = self.getConfig()['configurations']['core-site'], + configuration_attributes = self.getConfig()['configurationAttributes']['core-site'] +@@ -236,7 +236,7 @@ + self.assertResourceCalled('XmlConfig', 'core-site.xml', + owner = 'ams', + group = 'hadoop', +- mode=0644, ++ mode=0o644, + conf_dir = '/etc/ams-hbase/conf', + configurations = self.getConfig()['configurations']['core-site'], + configuration_attributes = self.getConfig()['configurationAttributes']['core-site'] +@@ -261,7 +261,7 @@ + owner = 'ams', + cd_access = 'a', + group = 'hadoop', +- mode = 0775, ++ mode = 0o775, + create_parents = True + ) + +@@ -306,13 +306,13 @@ + self.assertResourceCalled('Directory', '/var/run/ambari-metrics-collector/', + owner = 'ams', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + cd_access = "a", + ) + self.assertResourceCalled('Directory', '/var/log/ambari-metrics-collector', + owner = 'ams', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + cd_access = "a", + ) + +@@ -327,7 +327,7 @@ + user = 'hdfs', + dfs_type = '', + owner = 'ams', +- mode = 0775, ++ mode = 0o775, + hadoop_conf_dir = '/etc/hadoop/conf', + type = 'directory', + action = ['create_on_execute'], hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', +@@ -344,7 +344,7 @@ + user = 'hdfs', + dfs_type = '', + owner = 'ams', +- mode = 0711, ++ mode = 0o711, + hadoop_conf_dir = '/etc/hadoop/conf', + type = 'directory', + action = ['create_on_execute'], hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', +@@ -367,7 +367,7 @@ + dfs_type = '', + ) + self.assertResourceCalled('File', '/var/run/ambari-metrics-collector//distributed_mode', action=["create"], +- mode=0644, owner='ams') ++ mode=0o644, owner='ams') + else: + self.assertResourceCalled('Directory', '/var/lib/ambari-metrics-collector/hbase', + owner = 'ams', +@@ -386,6 +386,6 @@ + self.assertResourceCalled('File', '/etc/ams-hbase/conf/log4j.properties', + owner = 'ams', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + content = InlineTemplate(self.getConfig()['configurations']['ams-hbase-log4j']['content']) + ) +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/AMBARI_METRICS/test_metrics_grafana.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/AMBARI_METRICS/test_metrics_grafana.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/AMBARI_METRICS/test_metrics_grafana.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/AMBARI_METRICS/test_metrics_grafana.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 mock.mock import MagicMock, patch ++from unittest.mock import MagicMock, patch + from stacks.utils.RMFTestCase import * + import os, sys + +@@ -49,23 +49,23 @@ + ) + self.maxDiff=None + self.assert_configure() +- self.assertResourceCalled('Execute', ('chown', u'-R', u'ams', '/etc/ambari-metrics-grafana/conf'), ++ self.assertResourceCalled('Execute', ('chown', '-R', 'ams', '/etc/ambari-metrics-grafana/conf'), + sudo = True + ) +- self.assertResourceCalled('Execute', ('chown', u'-R', u'ams', '/var/log/ambari-metrics-grafana'), ++ self.assertResourceCalled('Execute', ('chown', '-R', 'ams', '/var/log/ambari-metrics-grafana'), + sudo = True + ) +- self.assertResourceCalled('Execute', ('chown', u'-R', u'ams', '/var/lib/ambari-metrics-grafana'), ++ self.assertResourceCalled('Execute', ('chown', '-R', 'ams', '/var/lib/ambari-metrics-grafana'), + sudo = True + ) +- self.assertResourceCalled('Execute', ('chown', u'-R', u'ams', '/var/run/ambari-metrics-grafana'), ++ self.assertResourceCalled('Execute', ('chown', '-R', 'ams', '/var/run/ambari-metrics-grafana'), + sudo = True + ) + self.assertResourceCalled('Execute', 'ambari-sudo.sh /usr/jdk64/jdk1.7.0_45/bin/keytool -importkeystore -srckeystore /etc/security/clientKeys/all.jks -destkeystore /some_tmp_dir/truststore.p12 -srcalias c6402.ambari.apache.org -deststoretype PKCS12 -srcstorepass bigdata -deststorepass bigdata', + ) + self.assertResourceCalled('Execute', 'ambari-sudo.sh openssl pkcs12 -in /some_tmp_dir/truststore.p12 -out /etc/ambari-metrics-grafana/conf/ca.pem -cacerts -nokeys -passin pass:bigdata', + ) +- self.assertResourceCalled('Execute', ('chown', u'ams:hadoop', '/etc/ambari-metrics-grafana/conf/ca.pem'), ++ self.assertResourceCalled('Execute', ('chown', 'ams:hadoop', '/etc/ambari-metrics-grafana/conf/ca.pem'), + sudo = True + ) + self.assertResourceCalled('Execute', ('chmod', '644', '/etc/ambari-metrics-grafana/conf/ca.pem'), +@@ -94,7 +94,7 @@ + self.assertResourceCalled('Directory', ams_grafana_directory, + owner = 'ams', + group = 'hadoop', +- mode=0755, ++ mode=0o755, + create_parents = True, + recursive_ownership = True + ) +@@ -109,5 +109,5 @@ + owner = 'ams', + group = 'hadoop', + content = InlineTemplate(self.getConfig()['configurations']['ams-env']['content']), +- mode = 0600 ++ mode = 0o600 + ) +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/AMBARI_METRICS/test_metrics_monitor.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/AMBARI_METRICS/test_metrics_monitor.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/AMBARI_METRICS/test_metrics_monitor.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/AMBARI_METRICS/test_metrics_monitor.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 mock.mock import MagicMock, patch ++from unittest.mock import MagicMock, patch + from stacks.utils.RMFTestCase import * + + @patch("tempfile.mkdtemp", new = MagicMock(return_value='/some_tmp_dir')) +@@ -43,7 +43,7 @@ + ) + self.assertResourceCalled('Execute', 'ambari-sudo.sh openssl pkcs12 -in /some_tmp_dir/truststore.p12 -out /etc/ambari-metrics-monitor/conf/ca.pem -cacerts -nokeys -passin pass:bigdata', + ) +- self.assertResourceCalled('Execute', ('chown', u'ams:hadoop', '/etc/ambari-metrics-monitor/conf/ca.pem'), ++ self.assertResourceCalled('Execute', ('chown', 'ams:hadoop', '/etc/ambari-metrics-monitor/conf/ca.pem'), + sudo=True + ) + self.assertResourceCalled('Execute', ('chmod', '644', '/etc/ambari-metrics-monitor/conf/ca.pem'), +@@ -81,7 +81,7 @@ + self.assertResourceCalled('Directory', '/var/log/ambari-metrics-monitor', + owner = 'ams', + group = 'hadoop', +- mode = 0755, ++ mode = 0o755, + create_parents = True + ) + +@@ -90,7 +90,7 @@ + owner = 'ams', + group = 'hadoop', + content = InlineTemplate(self.getConfig()['configurations']['ams-log4j']['content']), +- mode=0644, ++ mode=0o644, + ) + self.assertResourceCalled('XmlConfig', 'ams-site.xml', + owner = 'ams', +@@ -113,7 +113,7 @@ + self.assertResourceCalled('Directory', '/var/run/ambari-metrics-monitor', + owner = 'ams', + group = 'hadoop', +- mode = 0755, ++ mode = 0o755, + cd_access = 'a', + create_parents = True + ) +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/common/test_stack_advisor.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/common/test_stack_advisor.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/common/test_stack_advisor.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/common/test_stack_advisor.py 2022-07-11 00:52:31.000000000 +0800 +@@ -282,35 +282,35 @@ + services["services"][1]["components"][0]["StackServiceComponents"]["hostnames"] = ["c6402.ambari.apache.org", "c6403.ambari.apache.org"] + recommendations = self.stackAdvisor.createComponentLayoutRecommendations(services, hosts) + # Assert that dependencies are ignored when there are conditions and cluster scope +- self.assertEquals(recommendations['blueprint']['host_groups'][3]['components'][0]['name'], 'NAMENODE') +- self.assertEquals(len(recommendations['blueprint']['host_groups'][3]['components']), 1) ++ self.assertEqual(recommendations['blueprint']['host_groups'][3]['components'][0]['name'], 'NAMENODE') ++ self.assertEqual(len(recommendations['blueprint']['host_groups'][3]['components']), 1) + + nameNodeDependencies["scope"] = "host" + recommendations = self.stackAdvisor.createComponentLayoutRecommendations(services, hosts) + # Assert that dependencies are ignored when there are conditions (even for host scope) +- self.assertEquals(recommendations['blueprint']['host_groups'][3]['components'][0]['name'], 'NAMENODE') +- self.assertEquals(len(recommendations['blueprint']['host_groups'][3]['components']), 1) ++ self.assertEqual(recommendations['blueprint']['host_groups'][3]['components'][0]['name'], 'NAMENODE') ++ self.assertEqual(len(recommendations['blueprint']['host_groups'][3]['components']), 1) + + nameNodeDependencies["scope"] = "cluster" + originalConditions = nameNodeDependencies["conditions"] + nameNodeDependencies["conditions"] = [] + recommendations = self.stackAdvisor.createComponentLayoutRecommendations(services, hosts) + # Assert that dependencies are ignored when scope is cluster +- self.assertEquals(recommendations['blueprint']['host_groups'][3]['components'][0]['name'], 'NAMENODE') +- self.assertEquals(len(recommendations['blueprint']['host_groups'][3]['components']), 1) ++ self.assertEqual(recommendations['blueprint']['host_groups'][3]['components'][0]['name'], 'NAMENODE') ++ self.assertEqual(len(recommendations['blueprint']['host_groups'][3]['components']), 1) + + nameNodeDependencies["scope"] = "host" + recommendations = self.stackAdvisor.createComponentLayoutRecommendations(services, hosts) + # Assert that dependencies are enforced for host scope without conditions + #self.assertEquals(recommendations, "") +- self.assertEquals(len(recommendations['blueprint']['host_groups'][0]['components']), 2) ++ self.assertEqual(len(recommendations['blueprint']['host_groups'][0]['components']), 2) + + services["services"][1]["components"][0]["StackServiceComponents"]["is_master"] = False + services["services"][1]["components"][0]["StackServiceComponents"]["component_category"] = "CLIENT" + recommendations = self.stackAdvisor.createComponentLayoutRecommendations(services, hosts) + # Assert that dependencies are ignored when depending on client components +- self.assertEquals(recommendations['blueprint']['host_groups'][3]['components'][0]['name'], 'NAMENODE') +- self.assertEquals(len(recommendations['blueprint']['host_groups'][3]['components']), 1) ++ self.assertEqual(recommendations['blueprint']['host_groups'][3]['components'][0]['name'], 'NAMENODE') ++ self.assertEqual(len(recommendations['blueprint']['host_groups'][3]['components']), 1) + + # Tests for slave component with dependencies + services["services"][0]["components"][0]["StackServiceComponents"]["component_category"] = "SLAVE" +@@ -322,33 +322,33 @@ + nameNodeDependencies["conditions"] = originalConditions + recommendations = self.stackAdvisor.createComponentLayoutRecommendations(services, hosts) + # Assert that dependencies are ignored when there are conditions and cluster scope +- self.assertEquals(recommendations['blueprint']['host_groups'][2]['components'][0]['name'], 'NAMENODE') +- self.assertEquals(len(recommendations['blueprint']['host_groups'][2]['components']), 1) +- self.assertEquals(recommendations['blueprint']['host_groups'][3]['components'][0]['name'], 'NAMENODE') +- self.assertEquals(len(recommendations['blueprint']['host_groups'][3]['components']), 1) ++ self.assertEqual(recommendations['blueprint']['host_groups'][2]['components'][0]['name'], 'NAMENODE') ++ self.assertEqual(len(recommendations['blueprint']['host_groups'][2]['components']), 1) ++ self.assertEqual(recommendations['blueprint']['host_groups'][3]['components'][0]['name'], 'NAMENODE') ++ self.assertEqual(len(recommendations['blueprint']['host_groups'][3]['components']), 1) + + nameNodeDependencies["scope"] = "host" + recommendations = self.stackAdvisor.createComponentLayoutRecommendations(services, hosts) + # Assert that dependencies are ignored when there are conditions (even for host scope) +- self.assertEquals(recommendations['blueprint']['host_groups'][2]['components'][0]['name'], 'NAMENODE') +- self.assertEquals(len(recommendations['blueprint']['host_groups'][2]['components']), 1) +- self.assertEquals(recommendations['blueprint']['host_groups'][3]['components'][0]['name'], 'NAMENODE') +- self.assertEquals(len(recommendations['blueprint']['host_groups'][3]['components']), 1) ++ self.assertEqual(recommendations['blueprint']['host_groups'][2]['components'][0]['name'], 'NAMENODE') ++ self.assertEqual(len(recommendations['blueprint']['host_groups'][2]['components']), 1) ++ self.assertEqual(recommendations['blueprint']['host_groups'][3]['components'][0]['name'], 'NAMENODE') ++ self.assertEqual(len(recommendations['blueprint']['host_groups'][3]['components']), 1) + + nameNodeDependencies["scope"] = "cluster" + nameNodeDependencies["conditions"] = [] + recommendations = self.stackAdvisor.createComponentLayoutRecommendations(services, hosts) + # Assert that dependencies are ignored when scope is cluster +- self.assertEquals(recommendations['blueprint']['host_groups'][2]['components'][0]['name'], 'NAMENODE') +- self.assertEquals(len(recommendations['blueprint']['host_groups'][2]['components']), 1) +- self.assertEquals(recommendations['blueprint']['host_groups'][3]['components'][0]['name'], 'NAMENODE') +- self.assertEquals(len(recommendations['blueprint']['host_groups'][3]['components']), 1) ++ self.assertEqual(recommendations['blueprint']['host_groups'][2]['components'][0]['name'], 'NAMENODE') ++ self.assertEqual(len(recommendations['blueprint']['host_groups'][2]['components']), 1) ++ self.assertEqual(recommendations['blueprint']['host_groups'][3]['components'][0]['name'], 'NAMENODE') ++ self.assertEqual(len(recommendations['blueprint']['host_groups'][3]['components']), 1) + + nameNodeDependencies["scope"] = "host" + recommendations = self.stackAdvisor.createComponentLayoutRecommendations(services, hosts) + # Assert that dependencies are enforced when host scope and no conditions +- self.assertEquals(recommendations['blueprint']['host_groups'][1]['components'][1]['name'], 'NAMENODE') +- self.assertEquals(len(recommendations['blueprint']['host_groups'][1]['components']), 2) ++ self.assertEqual(recommendations['blueprint']['host_groups'][1]['components'][1]['name'], 'NAMENODE') ++ self.assertEqual(len(recommendations['blueprint']['host_groups'][1]['components']), 2) + + + def test_validateRequiredComponentsPresent(self): +@@ -504,7 +504,7 @@ + services = self.prepareServices(servicesInfo) + result = self.stackAdvisor.get_service_component_meta("GANGLIA", "GANGLIA_MONITOR", services) + +- self.assertEquals(True, "hostnames" in result) ++ self.assertEqual(True, "hostnames" in result) + self.assertEqual(expected, result["hostnames"]) + + +@@ -592,7 +592,7 @@ + 'type': 'configuration' + } + ] +- self.assertEquals(expectedItems, items) ++ self.assertEqual(expectedItems, items) + + def test_validationHostIsNotUsedForNonValuableComponent(self): + servicesInfo = [ +@@ -748,7 +748,7 @@ + + # Cluster create call + result = self.stackAdvisor.getConfigurationClusterSummary(servicesList, hosts, components, services) +- self.assertEquals(result, expected) ++ self.assertEqual(result, expected) + + # Validate configuration call - pick user specified value which is same as what was set + services = {"services": +@@ -793,7 +793,7 @@ + "advisor_context": {'call_type': 'validateConfigurations'} + } + result = self.stackAdvisor.getConfigurationClusterSummary(servicesList, hosts, components, services) +- self.assertEquals(result, expected) ++ self.assertEqual(result, expected) + + # Validate configuration call - pick user specified value + services = {"services": +@@ -858,7 +858,7 @@ + "referenceNodeManagerHost": hosts["items"][0]["Hosts"] + } + result = self.stackAdvisor.getConfigurationClusterSummary(servicesList, hosts, components, services) +- self.assertEquals(result, expected_2048) ++ self.assertEqual(result, expected_2048) + + # Recommend attribute call - pick user specified value + services = {"services": +@@ -907,7 +907,7 @@ + } + + result = self.stackAdvisor.getConfigurationClusterSummary(servicesList, hosts, components, services) +- self.assertEquals(result, expected_2048) ++ self.assertEqual(result, expected_2048) + + # Add service and not adding YARN - pick user specified value + services = {"services": +@@ -957,7 +957,7 @@ + } + + result = self.stackAdvisor.getConfigurationClusterSummary(servicesList, hosts, components, services) +- self.assertEquals(result, expected_2048) ++ self.assertEqual(result, expected_2048) + + # Add service and adding YARN - compute the value + services = {"services": +@@ -1006,7 +1006,7 @@ + } + + result = self.stackAdvisor.getConfigurationClusterSummary(servicesList, hosts, components, services) +- self.assertEquals(result, expected) ++ self.assertEqual(result, expected) + + # Recommend config dependencies call - pick user specified value + services = {"services": +@@ -1071,7 +1071,7 @@ + "referenceNodeManagerHost": hosts["items"][0]["Hosts"] + } + result = self.stackAdvisor.getConfigurationClusterSummary(servicesList, hosts, components, services) +- self.assertEquals(result, expected_2048) ++ self.assertEqual(result, expected_2048) + + # Recommend config dependencies call - pick user specified value of 4096 for min + services = {"services": +@@ -1136,7 +1136,7 @@ + "referenceNodeManagerHost": hosts["items"][0]["Hosts"] + } + result = self.stackAdvisor.getConfigurationClusterSummary(servicesList, hosts, components, services) +- self.assertEquals(result, expected_4096) ++ self.assertEqual(result, expected_4096) + + + +@@ -1184,7 +1184,7 @@ + + # Test - Cluster data with 1 host + result = self.stackAdvisor.getConfigurationClusterSummary(servicesList, hosts, components, None) +- self.assertEquals(result, expected) ++ self.assertEqual(result, expected) + + # Test - Cluster data with 2 hosts - pick minimum memory + servicesList.append("YARN") +@@ -1253,7 +1253,7 @@ + expected["ramPerContainer"] = 128 + expected["reservedRam"] = 1 + result = self.stackAdvisor.getConfigurationClusterSummary(servicesList, hosts, components, services) +- self.assertEquals(result, expected) ++ self.assertEqual(result, expected) + + + def test_getConfigurationClusterSummary_withHBaseAnd48gbRam(self): +@@ -1298,7 +1298,7 @@ + + result = self.stackAdvisor.getConfigurationClusterSummary(servicesList, hosts, components, None) + +- self.assertEquals(result, expected) ++ self.assertEqual(result, expected) + + def test_recommendStormConfigurations(self): + # no AMS +@@ -1317,7 +1317,7 @@ + } + + self.stackAdvisor.recommendStormConfigurations(configurations, None, services, None) +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + + # with AMS + configurations = {} +@@ -1341,7 +1341,7 @@ + } + + self.stackAdvisor.recommendStormConfigurations(configurations, None, services, None) +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + + def test_recommendYARNConfigurations(self): + configurations = {} +@@ -1369,7 +1369,7 @@ + } + + self.stackAdvisor.recommendYARNConfigurations(configurations, clusterData, services, None) +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + + def test_recommendMapReduce2Configurations_mapMemoryLessThan2560(self): + configurations = {} +@@ -1395,7 +1395,7 @@ + } + + self.stackAdvisor.recommendMapReduce2Configurations(configurations, clusterData, None, None) +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + + def test_getConfigurationClusterSummary_noHostsWithoutHBase(self): + servicesList = [] +@@ -1423,7 +1423,7 @@ + "yarnMinContainerSize" : 170 + } + +- self.assertEquals(result, expected) ++ self.assertEqual(result, expected) + + def prepareHosts(self, hostsNames): + hosts = { "items": [] } +@@ -1476,20 +1476,20 @@ + componentName = component["name"] + try: + actualComponentHostsMap[componentName] +- except KeyError, err: ++ except KeyError as err: + actualComponentHostsMap[componentName] = [] + for host in hosts: + if host not in actualComponentHostsMap[componentName]: + actualComponentHostsMap[componentName].append(host) + +- for componentName in componentsHostsMap.keys(): ++ for componentName in list(componentsHostsMap.keys()): + expectedHosts = componentsHostsMap[componentName] + actualHosts = actualComponentHostsMap[componentName] + self.checkEqual(expectedHosts, actualHosts) + + def checkEqual(self, l1, l2): + if not len(l1) == len(l2) or not sorted(l1) == sorted(l2): +- raise AssertionError("list1={0}, list2={1}".format(l1, l2)) ++ raise AssertionError("list1={}, list2={}".format(l1, l2)) + + def assertValidationResult(self, expectedItems, result): + actualItems = [] +@@ -1497,7 +1497,7 @@ + next = {"message": item["message"], "level": item["level"]} + try: + next["host"] = item["host"] +- except KeyError, err: ++ except KeyError as err: + pass + actualItems.append(next) + self.checkEqual(expectedItems, actualItems) +@@ -1554,10 +1554,10 @@ + } + + clusterData = self.stackAdvisor.getConfigurationClusterSummary(servicesList, hosts, components, None) +- self.assertEquals(clusterData['hbaseRam'], 8) ++ self.assertEqual(clusterData['hbaseRam'], 8) + + self.stackAdvisor.recommendHbaseConfigurations(configurations, clusterData, services, hosts) +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + + + def test_recommendRangerConfigurations(self): +@@ -1619,7 +1619,7 @@ + } + recommendedConfigurations = {} + self.stackAdvisor.recommendRangerConfigurations(recommendedConfigurations, clusterData, services, None) +- self.assertEquals(recommendedConfigurations, expected, "Test for not existing DB_FLAVOR and http enabled, HDP-2.3") ++ self.assertEqual(recommendedConfigurations, expected, "Test for not existing DB_FLAVOR and http enabled, HDP-2.3") + + # Recommend for DB_FLAVOR POSTGRES and https enabled, HDP-2.3 + configurations = { +@@ -1646,7 +1646,7 @@ + } + recommendedConfigurations = {} + self.stackAdvisor.recommendRangerConfigurations(recommendedConfigurations, clusterData, services, None) +- self.assertEquals(recommendedConfigurations, expected, "Test for DB_FLAVOR POSTGRES and https enabled, HDP-2.3") ++ self.assertEqual(recommendedConfigurations, expected, "Test for DB_FLAVOR POSTGRES and https enabled, HDP-2.3") + + # Recommend for DB_FLAVOR ORACLE and https enabled, HDP-2.2 + configurations = { +@@ -1675,7 +1675,7 @@ + recommendedConfigurations = {} + services['services'][0]['StackServices']['service_version'] = "0.4.0" + self.stackAdvisor.recommendRangerConfigurations(recommendedConfigurations, clusterData, services, None) +- self.assertEquals(recommendedConfigurations, expected, "Test for DB_FLAVOR ORACLE and https enabled, HDP-2.2") ++ self.assertEqual(recommendedConfigurations, expected, "Test for DB_FLAVOR ORACLE and https enabled, HDP-2.2") + + # Test Recommend LDAP values + services["ambari-server-properties"] = { +@@ -1713,7 +1713,7 @@ + } + recommendedConfigurations = {} + self.stackAdvisor.recommendRangerConfigurations(recommendedConfigurations, clusterData, services, None) +- self.assertEquals(recommendedConfigurations, expected, "Test Recommend LDAP values") ++ self.assertEqual(recommendedConfigurations, expected, "Test Recommend LDAP values") + + # Test Ranger Audit properties + del services["ambari-server-properties"] +@@ -1756,7 +1756,7 @@ + + recommendedConfigurations = {} + self.stackAdvisor.recommendRangerConfigurations(recommendedConfigurations, clusterData, services, None) +- self.assertEquals(recommendedConfigurations, expected, "Test Ranger Audit properties") ++ self.assertEqual(recommendedConfigurations, expected, "Test Ranger Audit properties") + + + +@@ -1976,7 +1976,7 @@ + # Apart from testing other HDFS recommendations, also tests 'hadoop.proxyuser.hive.hosts' config value which includes both HiveServer + # and Hive Server Interactive Host (installed on different host compared to HiveServer). + self.stackAdvisor.recommendHDFSConfigurations(configurations, clusterData, services1, hosts) +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + + + +@@ -2111,7 +2111,7 @@ + # Apart from testing other HDFS recommendations, also tests 'hadoop.proxyuser.hive.hosts' config value which includes both HiveServer + # and Hive Server Interactive Host (installed on same host compared to HiveServer). + self.stackAdvisor.recommendHDFSConfigurations(configurations, clusterData, services2, hosts) +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + + + +@@ -2242,7 +2242,7 @@ + 'namenode_opt_newsize': '128'}}} + + self.stackAdvisor.recommendHDFSConfigurations(configurations, clusterData, services3, hosts) +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + + # Verify dfs.namenode.rpc-address is recommended to be deleted when NN HA + configurations["hdfs-site"]["properties"]['dfs.internal.nameservices'] = "mycluster" +@@ -2265,7 +2265,7 @@ + } + } + self.stackAdvisor.recommendHDFSConfigurations(configurations, clusterData, services3, hosts) +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + + hosts = { + "items": [ +@@ -2318,7 +2318,7 @@ + } + } + self.stackAdvisor.recommendHDFSConfigurations(configurations, clusterData, services3, hosts) +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + + + +@@ -2359,7 +2359,7 @@ + + result = self.stackAdvisor.getZKHostPortString(services) + expected = "zk.host1:2183,zk.host2:2183,zk.host3:2183" +- self.assertEquals(result, expected) ++ self.assertEqual(result, expected) + + def test_validateHDFSConfigurations(self): + configurations = {} +@@ -2400,7 +2400,7 @@ + res_expected = [] + + res = self.stackAdvisor.validateHDFSConfigurationsEnv(properties, recommendedDefaults, configurations, '', '') +- self.assertEquals(res, res_expected) ++ self.assertEqual(res, res_expected) + + # 2) fail: namenode_heapsize, namenode_opt_maxnewsize < recommended + properties['namenode_heapsize'] = '1022' +@@ -2417,7 +2417,7 @@ + 'type': 'configuration'}] + + res = self.stackAdvisor.validateHDFSConfigurationsEnv(properties, recommendedDefaults, configurations, '', '') +- self.assertEquals(res, res_expected) ++ self.assertEqual(res, res_expected) + + @patch("socket.getfqdn", new=lambda: 'test-mock-ambari-server-hostname1') + def test_recommendHadoopProxyUsers(self): +@@ -2510,7 +2510,7 @@ + } + + self.stackAdvisor.recommendHadoopProxyUsers(configurations, services, hosts) +- self.assertEquals(expected, configurations['core-site']['properties']) ++ self.assertEqual(expected, configurations['core-site']['properties']) + + @patch("socket.getfqdn", new=lambda: 'test-mock-ambari-server-hostname1') + def test_validateHDFSConfigurationsCoreSite(self): +@@ -2559,7 +2559,7 @@ + # 1) ok: HDFS and Ambari proxyusers are present + res_expected = [] + res = self.stackAdvisor.validateHDFSConfigurationsCoreSite(properties, recommendedDefaults, configurations, services, hosts) +- self.assertEquals(res, res_expected) ++ self.assertEqual(res, res_expected) + + # 2) fail: gpl is not allowed + services["gpl-license-accepted"] = False +@@ -2579,7 +2579,7 @@ + 'level': 'NOT_APPLICABLE'}] + + res = self.stackAdvisor.validateHDFSConfigurationsCoreSite(properties, {}, configurations, services, hosts) +- self.assertEquals(res, res_expected) ++ self.assertEqual(res, res_expected) + services["gpl-license-accepted"] = True + + # 3) fail: test filter function: two RESOURCE_MANAGERs, hadoop.proxyuser.yarn-user.hosts is expected to be set +@@ -2590,13 +2590,13 @@ + 'message': 'Value should be set for hadoop.proxyuser.yarn-user.hosts', + 'type': 'configuration'}] + res = self.stackAdvisor.validateHDFSConfigurationsCoreSite(properties, recommendedDefaults, configurations, services, hosts) +- self.assertEquals(res, res_expected) ++ self.assertEqual(res, res_expected) + + # 4) ok: test filter function: only one RESOURCE_MANAGER + services['services'][1]['components'][0]['StackServiceComponents']['hostnames'] = ["host1"] + res_expected = [] + res = self.stackAdvisor.validateHDFSConfigurationsCoreSite(properties, recommendedDefaults, configurations, services, hosts) +- self.assertEquals(res, res_expected) ++ self.assertEqual(res, res_expected) + + # 5) fail: some proxyusers are empty or absent: + del properties['hadoop.proxyuser.ambari-user.hosts'] +@@ -2612,7 +2612,7 @@ + 'config-name': 'hadoop.proxyuser.ambari-user.hosts', + 'level': 'ERROR'}] + res = self.stackAdvisor.validateHDFSConfigurationsCoreSite(properties, recommendedDefaults, configurations, services, hosts) +- self.assertEquals(res, res_expected) ++ self.assertEqual(res, res_expected) + + def test_getHadoopProxyUsers(self): + # input data stub +@@ -2648,7 +2648,7 @@ + 'yarn-user': {'propertyName': 'yarn_user', 'config': 'yarn-env', 'propertyHosts': 'host1,host2'} + } + res = self.stackAdvisor.getHadoopProxyUsers(services, hosts, configurations) +- self.assertEquals(res, res_expected) ++ self.assertEqual(res, res_expected) + + # 2) test filter function: only one RESOURCE_MANAGER + services['services'][1]['components'][0]['StackServiceComponents']['hostnames'] = ["host1"] +@@ -2656,7 +2656,7 @@ + 'hdfs-user': {'propertyName': 'hdfs_user', 'config': 'hadoop-env', 'propertyHosts': '*', 'propertyGroups': '*'} + } + res = self.stackAdvisor.getHadoopProxyUsers(services, hosts, configurations) +- self.assertEquals(res, res_expected) ++ self.assertEqual(res, res_expected) + + # def test_validateHDFSConfigurationsCoreSite(self): + # +@@ -2748,13 +2748,13 @@ + 'message': "cluster-env/one_dir_per_partition is enabled but there are multiple data directories on the same mount. Affected hosts: host2", + 'type': 'configuration'}] + validation_problems = self.stackAdvisor.validateHDFSConfigurations(properties, recommendedDefaults, configurations, services, hosts) +- self.assertEquals(validation_problems, expected) ++ self.assertEqual(validation_problems, expected) + + # One data directory. + properties['dfs.datanode.data.dir'] = '/hadoop/hdfs/data' + expected = [] + validation_problems = self.stackAdvisor.validateHDFSConfigurations(properties, recommendedDefaults, configurations, services, hosts) +- self.assertEquals(validation_problems, expected) ++ self.assertEqual(validation_problems, expected) + + + def test_validateStormSiteConfigurations(self): +@@ -2787,7 +2787,7 @@ + # positive + res = self.stackAdvisor.validateStormConfigurations(properties, recommendedDefaults, configurations, services, None) + expected = [] +- self.assertEquals(res, expected) ++ self.assertEqual(res, expected) + properties['metrics.reporter.register'] = '' + + res = self.stackAdvisor.validateStormConfigurations(properties, recommendedDefaults, configurations, services, None) +@@ -2800,7 +2800,7 @@ + 'type': 'configuration' + } + ] +- self.assertEquals(res, expected) ++ self.assertEqual(res, expected) + + def test_getHostsWithComponent(self): + services = {"services": +@@ -2928,28 +2928,28 @@ + } + + datanodes = self.stackAdvisor.getHostsWithComponent("HDFS", "DATANODE", services, hosts) +- self.assertEquals(len(datanodes), 2) +- self.assertEquals(datanodes, hosts["items"]) ++ self.assertEqual(len(datanodes), 2) ++ self.assertEqual(datanodes, hosts["items"]) + datanode = self.stackAdvisor.getHostWithComponent("HDFS", "DATANODE", services, hosts) +- self.assertEquals(datanode, hosts["items"][0]) ++ self.assertEqual(datanode, hosts["items"][0]) + namenodes = self.stackAdvisor.getHostsWithComponent("HDFS", "NAMENODE", services, hosts) +- self.assertEquals(len(namenodes), 1) ++ self.assertEqual(len(namenodes), 1) + # [host2] +- self.assertEquals(namenodes, [hosts["items"][1]]) ++ self.assertEqual(namenodes, [hosts["items"][1]]) + namenode = self.stackAdvisor.getHostWithComponent("HDFS", "NAMENODE", services, hosts) + # host2 +- self.assertEquals(namenode, hosts["items"][1]) ++ self.assertEqual(namenode, hosts["items"][1]) + + # not installed + nodemanager = self.stackAdvisor.getHostWithComponent("YARN", "NODEMANAGER", services, hosts) +- self.assertEquals(nodemanager, None) ++ self.assertEqual(nodemanager, None) + + # unknown component + unknown_component = self.stackAdvisor.getHostWithComponent("YARN", "UNKNOWN", services, hosts) +- self.assertEquals(nodemanager, None) ++ self.assertEqual(nodemanager, None) + # unknown service + unknown_component = self.stackAdvisor.getHostWithComponent("UNKNOWN", "NODEMANAGER", services, hosts) +- self.assertEquals(nodemanager, None) ++ self.assertEqual(nodemanager, None) + + def test_mergeValidators(self): + childValidators = { +@@ -2987,15 +2987,15 @@ + } + + self.stackAdvisor.mergeValidators(parentValidators, childValidators) +- self.assertEquals(expected, parentValidators) ++ self.assertEqual(expected, parentValidators) + + def test_getProperMountPoint(self): + hostInfo = None +- self.assertEquals(["/"], self.stackAdvisor.getPreferredMountPoints(hostInfo)) ++ self.assertEqual(["/"], self.stackAdvisor.getPreferredMountPoints(hostInfo)) + hostInfo = {"some_key": []} +- self.assertEquals(["/"], self.stackAdvisor.getPreferredMountPoints(hostInfo)) ++ self.assertEqual(["/"], self.stackAdvisor.getPreferredMountPoints(hostInfo)) + hostInfo["disk_info"] = [] +- self.assertEquals(["/"], self.stackAdvisor.getPreferredMountPoints(hostInfo)) ++ self.assertEqual(["/"], self.stackAdvisor.getPreferredMountPoints(hostInfo)) + # root mountpoint with low space available + hostInfo["disk_info"].append( + { +@@ -3004,7 +3004,7 @@ + "mountpoint" : "/" + } + ) +- self.assertEquals(["/"], self.stackAdvisor.getPreferredMountPoints(hostInfo)) ++ self.assertEqual(["/"], self.stackAdvisor.getPreferredMountPoints(hostInfo)) + # tmpfs with more space available + hostInfo["disk_info"].append( + { +@@ -3013,7 +3013,7 @@ + "mountpoint" : "/dev/shm" + } + ) +- self.assertEquals(["/"], self.stackAdvisor.getPreferredMountPoints(hostInfo)) ++ self.assertEqual(["/"], self.stackAdvisor.getPreferredMountPoints(hostInfo)) + # /boot with more space available + hostInfo["disk_info"].append( + { +@@ -3022,7 +3022,7 @@ + "mountpoint" : "/boot/grub" + } + ) +- self.assertEquals(["/"], self.stackAdvisor.getPreferredMountPoints(hostInfo)) ++ self.assertEqual(["/"], self.stackAdvisor.getPreferredMountPoints(hostInfo)) + # /boot with more space available + hostInfo["disk_info"].append( + { +@@ -3031,7 +3031,7 @@ + "mountpoint" : "/mnt/external_hdd" + } + ) +- self.assertEquals(["/"], self.stackAdvisor.getPreferredMountPoints(hostInfo)) ++ self.assertEqual(["/"], self.stackAdvisor.getPreferredMountPoints(hostInfo)) + # virtualbox fs with more space available + hostInfo["disk_info"].append( + { +@@ -3040,7 +3040,7 @@ + "mountpoint" : "/vagrant" + } + ) +- self.assertEquals(["/"], self.stackAdvisor.getPreferredMountPoints(hostInfo)) ++ self.assertEqual(["/"], self.stackAdvisor.getPreferredMountPoints(hostInfo)) + # proper mountpoint with more space available + hostInfo["disk_info"].append( + { +@@ -3049,7 +3049,7 @@ + "mountpoint" : "/grid/0" + } + ) +- self.assertEquals(["/grid/0", "/"], self.stackAdvisor.getPreferredMountPoints(hostInfo)) ++ self.assertEqual(["/grid/0", "/"], self.stackAdvisor.getPreferredMountPoints(hostInfo)) + # proper mountpoint with more space available + hostInfo["disk_info"].append( + { +@@ -3058,7 +3058,7 @@ + "mountpoint" : "/grid/1" + } + ) +- self.assertEquals(["/grid/1", "/grid/0", "/"], self.stackAdvisor.getPreferredMountPoints(hostInfo)) ++ self.assertEqual(["/grid/1", "/grid/0", "/"], self.stackAdvisor.getPreferredMountPoints(hostInfo)) + + def test_validateNonRootFs(self): + hostInfo = {"disk_info": [ +@@ -3083,7 +3083,7 @@ + recommendedDefaults = {"property1": "file:///grid/0/var/dir"} + warn = self.stackAdvisor.validatorNotRootFs(properties, recommendedDefaults, 'property1', hostInfo) + self.assertTrue(warn != None) +- self.assertEquals({'message': 'It is not recommended to use root partition for property1', 'level': 'WARN'}, warn) ++ self.assertEqual({'message': 'It is not recommended to use root partition for property1', 'level': 'WARN'}, warn) + + # Set by user /var mountpoint, which is non-root , but not preferable - no warning + hostInfo["disk_info"].append( +@@ -3121,7 +3121,7 @@ + ]} + warn = self.stackAdvisor.validatorEnoughDiskSpace(properties, 'property1', hostInfo, reqiuredDiskSpace) + self.assertTrue(warn != None) +- self.assertEquals({'message': errorMsg, 'level': 'WARN'}, warn) ++ self.assertEqual({'message': errorMsg, 'level': 'WARN'}, warn) + + # non-local FS, HDFS + properties = {"property1": "hdfs://h1"} +@@ -3132,42 +3132,42 @@ + self.assertTrue(self.stackAdvisor.validatorEnoughDiskSpace(properties, 'property1', hostInfo, reqiuredDiskSpace) == None) + + def test_round_to_n(self): +- self.assertEquals(self.stack_advisor_impl.round_to_n(0), 0) +- self.assertEquals(self.stack_advisor_impl.round_to_n(1000), 1024) +- self.assertEquals(self.stack_advisor_impl.round_to_n(2000), 2048) +- self.assertEquals(self.stack_advisor_impl.round_to_n(4097), 4096) ++ self.assertEqual(self.stack_advisor_impl.round_to_n(0), 0) ++ self.assertEqual(self.stack_advisor_impl.round_to_n(1000), 1024) ++ self.assertEqual(self.stack_advisor_impl.round_to_n(2000), 2048) ++ self.assertEqual(self.stack_advisor_impl.round_to_n(4097), 4096) + + def test_getMountPointForDir(self): +- self.assertEquals(self.stackAdvisor.getMountPointForDir("/var/log", ["/"]), "/") +- self.assertEquals(self.stackAdvisor.getMountPointForDir("/var/log", ["/var", "/"]), "/var") +- self.assertEquals(self.stackAdvisor.getMountPointForDir("file:///var/log", ["/var", "/"]), "/var") +- self.assertEquals(self.stackAdvisor.getMountPointForDir("hdfs:///hdfs_path", ["/var", "/"]), None) +- self.assertEquals(self.stackAdvisor.getMountPointForDir("relative/path", ["/var", "/"]), None) ++ self.assertEqual(self.stackAdvisor.getMountPointForDir("/var/log", ["/"]), "/") ++ self.assertEqual(self.stackAdvisor.getMountPointForDir("/var/log", ["/var", "/"]), "/var") ++ self.assertEqual(self.stackAdvisor.getMountPointForDir("file:///var/log", ["/var", "/"]), "/var") ++ self.assertEqual(self.stackAdvisor.getMountPointForDir("hdfs:///hdfs_path", ["/var", "/"]), None) ++ self.assertEqual(self.stackAdvisor.getMountPointForDir("relative/path", ["/var", "/"]), None) + + def test_parseCardinality(self): +- self.assertEquals(self.stackAdvisor.parseCardinality("ALL", 5), (5, 5)) +- self.assertEquals(self.stackAdvisor.parseCardinality("2+", 5), (2, 5)) +- self.assertEquals(self.stackAdvisor.parseCardinality("1-3", 5), (1, 3)) +- self.assertEquals(self.stackAdvisor.parseCardinality("3", 5), (3, 3)) +- self.assertEquals(self.stackAdvisor.parseCardinality(None, 5), (None, None)) +- self.assertEquals(self.stackAdvisor.parseCardinality("invalid", 3), (None, None)) ++ self.assertEqual(self.stackAdvisor.parseCardinality("ALL", 5), (5, 5)) ++ self.assertEqual(self.stackAdvisor.parseCardinality("2+", 5), (2, 5)) ++ self.assertEqual(self.stackAdvisor.parseCardinality("1-3", 5), (1, 3)) ++ self.assertEqual(self.stackAdvisor.parseCardinality("3", 5), (3, 3)) ++ self.assertEqual(self.stackAdvisor.parseCardinality(None, 5), (None, None)) ++ self.assertEqual(self.stackAdvisor.parseCardinality("invalid", 3), (None, None)) + + def test_getValidatorEqualsToRecommendedItem(self): + properties = {"property1": "value1"} + recommendedDefaults = {"property1": "value1"} +- self.assertEquals(self.stackAdvisor.validatorEqualsToRecommendedItem(properties, recommendedDefaults, "property1"), None) ++ self.assertEqual(self.stackAdvisor.validatorEqualsToRecommendedItem(properties, recommendedDefaults, "property1"), None) + properties = {"property1": "value1"} + recommendedDefaults = {"property1": "value2"} + expected = {'message': 'It is recommended to set value value2 for property property1', 'level': 'WARN'} +- self.assertEquals(self.stackAdvisor.validatorEqualsToRecommendedItem(properties, recommendedDefaults, "property1"), expected) ++ self.assertEqual(self.stackAdvisor.validatorEqualsToRecommendedItem(properties, recommendedDefaults, "property1"), expected) + properties = {} + recommendedDefaults = {"property1": "value2"} + expected = {'level': 'ERROR', 'message': 'Value should be set for property1'} +- self.assertEquals(self.stackAdvisor.validatorEqualsToRecommendedItem(properties, recommendedDefaults, "property1"), expected) ++ self.assertEqual(self.stackAdvisor.validatorEqualsToRecommendedItem(properties, recommendedDefaults, "property1"), expected) + properties = {"property1": "value1"} + recommendedDefaults = {} + expected = {'level': 'ERROR', 'message': 'Value should be recommended for property1'} +- self.assertEquals(self.stackAdvisor.validatorEqualsToRecommendedItem(properties, recommendedDefaults, "property1"), expected) ++ self.assertEqual(self.stackAdvisor.validatorEqualsToRecommendedItem(properties, recommendedDefaults, "property1"), expected) + + def test_getServicesSiteProperties(self): + import imp, os +@@ -3209,7 +3209,7 @@ + "ranger.service.http.enabled": "true", + } + siteProperties = stack_advisor.getServicesSiteProperties(services, "ranger-admin-site") +- self.assertEquals(siteProperties, expected) ++ self.assertEqual(siteProperties, expected) + + def test_createComponentLayoutRecommendations_addService_1freeHost(self): + """ +@@ -3269,7 +3269,7 @@ + # Assert that the list is empty for host-group-1 + self.assertFalse(recommendations['blueprint']['host_groups'][0]['components']) + # Assert that DATANODE is placed on host-group-2 +- self.assertEquals(recommendations['blueprint']['host_groups'][1]['components'][0]['name'], 'DATANODE') ++ self.assertEqual(recommendations['blueprint']['host_groups'][1]['components'][0]['name'], 'DATANODE') + + def test_validateYARNConfigurations(self): + configurations = { +@@ -3380,7 +3380,7 @@ + } + ] + items = self.stackAdvisor.validateYARNConfigurations(properties, recommendedDefaults, configurations, services, hosts) +- self.assertEquals(expectedItems, items) ++ self.assertEqual(expectedItems, items) + + + recommendedDefaults = {'yarn.nodemanager.resource.memory-mb' : '10240', +@@ -3406,5 +3406,5 @@ + ] + + items = self.stackAdvisor.validateYARNConfigurations(properties, recommendedDefaults, configurations, services, {}) +- self.assertEquals(expectedItems, items) ++ self.assertEqual(expectedItems, items) + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/FLUME/test_flume.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/FLUME/test_flume.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/FLUME/test_flume.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/FLUME/test_flume.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 mock.mock import MagicMock, call, patch ++from unittest.mock import MagicMock, call, patch + from stacks.utils.RMFTestCase import * + import resource_management.core.source + import os +@@ -64,7 +64,7 @@ + + + self.assertResourceCalled('Execute', "ambari-sudo.sh su flume -l -s /bin/bash -c 'export PATH=/bin JAVA_HOME=/usr/jdk64/jdk1.7.0_45 ; /usr/bin/flume-ng agent --name a1 --conf /etc/flume/conf/a1 --conf-file /etc/flume/conf/a1/flume.conf -Dflume.monitoring.type=org.apache.hadoop.metrics2.sink.flume.FlumeTimelineMetricsSink -Dflume.monitoring.node=c6402.ambari.apache.org:6189 > /var/log/flume/a1.out 2>&1' &", +- environment = {'JAVA_HOME': u'/usr/jdk64/jdk1.7.0_45'}, ++ environment = {'JAVA_HOME': '/usr/jdk64/jdk1.7.0_45'}, + wait_for_finish = False, + ) + self.assertResourceCalled('Execute', "ambari-sudo.sh [RMF_ENV_PLACEHOLDER] -H -E pgrep -o -u flume -f '^/usr/jdk64/jdk1.7.0_45.*a1.*' | ambari-sudo.sh [RMF_ENV_PLACEHOLDER] -H -E tee /var/run/flume/a1.pid && test ${PIPESTATUS[0]} -eq 0", +@@ -98,7 +98,7 @@ + + + self.assertResourceCalled('Execute', "ambari-sudo.sh su flume -l -s /bin/bash -c 'export PATH=/bin JAVA_HOME=/usr/jdk64/jdk1.7.0_45 ; /usr/bin/flume-ng agent --name a1 --conf /etc/flume/conf/a1 --conf-file /etc/flume/conf/a1/flume.conf > /var/log/flume/a1.out 2>&1' &", +- environment = {'JAVA_HOME': u'/usr/jdk64/jdk1.7.0_45'}, ++ environment = {'JAVA_HOME': '/usr/jdk64/jdk1.7.0_45'}, + wait_for_finish = False, + ) + self.assertResourceCalled('Execute', "ambari-sudo.sh [RMF_ENV_PLACEHOLDER] -H -E pgrep -o -u flume -f '^/usr/jdk64/jdk1.7.0_45.*a1.*' | ambari-sudo.sh [RMF_ENV_PLACEHOLDER] -H -E tee /var/run/flume/a1.pid && test ${PIPESTATUS[0]} -eq 0", +@@ -200,7 +200,7 @@ + + # call_args[0] is a tuple, whose first element is the actual call argument + struct_out = structured_out_mock.call_args[0][0] +- self.assertTrue(struct_out.has_key('processes')) ++ self.assertTrue('processes' in struct_out) + + self.assertNoMoreResources() + +@@ -225,7 +225,7 @@ + + # call_args[0] is a tuple, whose first element is the actual call argument + struct_out = structured_out_mock.call_args[0][0] +- self.assertTrue(struct_out.has_key('processes')) ++ self.assertTrue('processes' in struct_out) + self.assertNoMoreResources() + + def assert_configure_default(self, check_mc=True): +@@ -243,7 +243,7 @@ + group = 'hadoop', + create_parents = True, + cd_access = 'a', +- mode=0755 ++ mode=0o755 + ) + + self.assertResourceCalled('Directory', +@@ -253,7 +253,7 @@ + self.assertResourceCalled('PropertiesFile', + '/etc/flume/conf/a1/flume.conf', + owner='flume', +- mode = 0644, ++ mode = 0o644, + properties = build_flume( + self.getConfig()['configurations']['flume-conf']['content'])['a1']) + +@@ -261,13 +261,13 @@ + '/etc/flume/conf/a1/log4j.properties', + content = InlineTemplate(self.getConfig()['configurations']['flume-log4j']['content'],agent_name='a1'), + owner='flume', +- mode = 0644) ++ mode = 0o644) + + self.assertResourceCalled('File', + '/etc/flume/conf/a1/ambari-meta.json', + owner='flume', + content='{"channels_count": 1, "sinks_count": 1, "sources_count": 1}', +- mode = 0644) ++ mode = 0o644) + + self.assertResourceCalled('File', "/etc/flume/conf/a1/flume-env.sh", + owner="flume", +@@ -297,7 +297,7 @@ + group = 'hadoop', + create_parents = True, + cd_access = 'a', +- mode=0755) ++ mode=0o755) + + top = build_flume(self.getConfig()['configurations']['flume-conf']['content']) + +@@ -308,18 +308,18 @@ + self.assertResourceCalled('PropertiesFile', + '/etc/flume/conf/a1/flume.conf', + owner='flume', +- mode = 0644, ++ mode = 0o644, + properties = top['a1']) + self.assertResourceCalled('File', + '/etc/flume/conf/a1/log4j.properties', + owner='flume', + content = InlineTemplate(self.getConfig()['configurations']['flume-log4j']['content'],agent_name='a1'), +- mode = 0644) ++ mode = 0o644) + self.assertResourceCalled('File', + '/etc/flume/conf/a1/ambari-meta.json', + owner='flume', + content='{"channels_count": 1, "sinks_count": 1, "sources_count": 1}', +- mode = 0644) ++ mode = 0o644) + + self.assertResourceCalled('File', "/etc/flume/conf/a1/flume-env.sh", + owner="flume", +@@ -331,19 +331,19 @@ + '/etc/flume/conf/b1', + owner='flume') + self.assertResourceCalled('PropertiesFile', '/etc/flume/conf/b1/flume.conf', +- mode = 0644, ++ mode = 0o644, + owner='flume', + properties = top['b1']) + self.assertResourceCalled('File', + '/etc/flume/conf/b1/log4j.properties', + owner='flume', + content = InlineTemplate(self.getConfig()['configurations']['flume-log4j']['content'],agent_name='b1'), +- mode = 0644) ++ mode = 0o644) + self.assertResourceCalled('File', + '/etc/flume/conf/b1/ambari-meta.json', + owner='flume', + content='{"channels_count": 1, "sinks_count": 1, "sources_count": 1}', +- mode = 0644) ++ mode = 0o644) + self.assertResourceCalled('File', "/etc/flume/conf/b1/flume-env.sh", + owner="flume", + content=InlineTemplate(self.getConfig()['configurations']['flume-env']['content']) +@@ -397,7 +397,7 @@ + + + self.assertResourceCalled('Execute', "ambari-sudo.sh su flume -l -s /bin/bash -c 'export PATH=/bin JAVA_HOME=/usr/jdk64/jdk1.7.0_45 ; /usr/bin/flume-ng agent --name b1 --conf /etc/flume/conf/b1 --conf-file /etc/flume/conf/b1/flume.conf -Dflume.monitoring.type=ganglia -Dflume.monitoring.hosts=c6401.ambari.apache.org:8655 > /var/log/flume/b1.out 2>&1' &", +- environment = {'JAVA_HOME': u'/usr/jdk64/jdk1.7.0_45'}, ++ environment = {'JAVA_HOME': '/usr/jdk64/jdk1.7.0_45'}, + wait_for_finish = False, + ) + +@@ -468,7 +468,7 @@ + cd_access = 'a', + group = 'hadoop', + create_parents = True, +- mode=0755) ++ mode=0o755) + + self.assertResourceCalled('Directory', + '/etc/flume/conf/a1', +@@ -477,7 +477,7 @@ + self.assertResourceCalled('PropertiesFile', + '/etc/flume/conf/a1/flume.conf', + owner='flume', +- mode = 0644, ++ mode = 0o644, + properties = build_flume( + self.getConfig()['configurations']['flume-conf']['content'])['a1']) + +@@ -485,13 +485,13 @@ + '/etc/flume/conf/a1/log4j.properties', + owner='flume', + content = InlineTemplate(self.getConfig()['configurations']['flume-log4j']['content'],agent_name='a1'), +- mode = 0644) ++ mode = 0o644) + + self.assertResourceCalled('File', + '/etc/flume/conf/a1/ambari-meta.json', + owner='flume', + content='{"channels_count": 1, "sinks_count": 1, "sources_count": 1}', +- mode = 0644) ++ mode = 0o644) + + content = InlineTemplate(self.getConfig()['configurations']['flume-env']['content']) + +@@ -523,7 +523,7 @@ + group = 'hadoop', + create_parents = True, + cd_access = 'a', +- mode=0755) ++ mode=0o755) + + self.assertResourceCalled('Directory', + '/usr/hdp/current/flume-server/conf/a1', +@@ -532,7 +532,7 @@ + self.assertResourceCalled('PropertiesFile', + '/usr/hdp/current/flume-server/conf/a1/flume.conf', + owner='flume', +- mode = 0644, ++ mode = 0o644, + properties = build_flume( + self.getConfig()['configurations']['flume-conf']['content'])['a1']) + +@@ -540,13 +540,13 @@ + '/usr/hdp/current/flume-server/conf/a1/log4j.properties', + content = InlineTemplate(self.getConfig()['configurations']['flume-log4j']['content'],agent_name='a1'), + owner='flume', +- mode = 0644) ++ mode = 0o644) + + self.assertResourceCalled('File', + '/usr/hdp/current/flume-server/conf/a1/ambari-meta.json', + content='{"channels_count": 1, "sinks_count": 1, "sources_count": 1}', + owner='flume', +- mode = 0644) ++ mode = 0o644) + + content = InlineTemplate(self.getConfig()['configurations']['flume-env']['content']) + +@@ -585,13 +585,13 @@ + if lhs.endswith(".sources"): + agent_names.append(part0) + +- if not result.has_key(part0): ++ if part0 not in result: + result[part0] = {} + + result[part0][lhs] = rhs + + # trim out non-agents +- for k in result.keys(): ++ for k in list(result.keys()): + if not k in agent_names: + del result[k] + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/FLUME/test_service_check.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/FLUME/test_service_check.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/FLUME/test_service_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/FLUME/test_service_check.py 2022-07-11 00:52:31.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/GANGLIA/test_ganglia_monitor.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/GANGLIA/test_ganglia_monitor.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/GANGLIA/test_ganglia_monitor.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/GANGLIA/test_ganglia_monitor.py 2022-07-11 00:52:31.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +@@ -116,81 +116,81 @@ + ) + self.assertResourceCalled('File', '/etc/init.d/hdp-gmetad', + content = StaticFile('gmetad.init'), +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('File', '/etc/init.d/hdp-gmond', + content = StaticFile('gmond.init'), +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('File', '/usr/libexec/hdp/ganglia/checkGmond.sh', + content = StaticFile('checkGmond.sh'), +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('File', '/usr/libexec/hdp/ganglia/checkRrdcached.sh', + content = StaticFile('checkRrdcached.sh'), +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('File', '/usr/libexec/hdp/ganglia/gmetadLib.sh', + content = StaticFile('gmetadLib.sh'), +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('File', '/usr/libexec/hdp/ganglia/gmondLib.sh', + content = StaticFile('gmondLib.sh'), +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('File', '/usr/libexec/hdp/ganglia/rrdcachedLib.sh', + content = StaticFile('rrdcachedLib.sh'), +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('File', '/usr/libexec/hdp/ganglia/setupGanglia.sh', + content = StaticFile('setupGanglia.sh'), +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('File', '/usr/libexec/hdp/ganglia/startGmetad.sh', + content = StaticFile('startGmetad.sh'), +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('File', '/usr/libexec/hdp/ganglia/startGmond.sh', + content = StaticFile('startGmond.sh'), +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('File', '/usr/libexec/hdp/ganglia/startRrdcached.sh', + content = StaticFile('startRrdcached.sh'), +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('File', '/usr/libexec/hdp/ganglia/stopGmetad.sh', + content = StaticFile('stopGmetad.sh'), +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('File', '/usr/libexec/hdp/ganglia/stopGmond.sh', + content = StaticFile('stopGmond.sh'), +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('File', '/usr/libexec/hdp/ganglia/stopRrdcached.sh', + content = StaticFile('stopRrdcached.sh'), +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('File', '/usr/libexec/hdp/ganglia/teardownGanglia.sh', + content = StaticFile('teardownGanglia.sh'), +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('TemplateConfig', '/usr/libexec/hdp/ganglia/gangliaClusters.conf', + owner = 'root', + template_tag = None, + group = 'root', +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('TemplateConfig', '/usr/libexec/hdp/ganglia/gangliaEnv.sh', + owner = 'root', + template_tag = None, + group = 'root', +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('TemplateConfig', '/usr/libexec/hdp/ganglia/gangliaLib.sh', + owner = 'root', + template_tag = None, + group = 'root', +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('Execute', '/usr/libexec/hdp/ganglia/setupGanglia.sh -c HDPSlaves -o root -g hadoop', + path = ['/usr/libexec/hdp/ganglia', +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/GANGLIA/test_ganglia_server.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/GANGLIA/test_ganglia_server.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/GANGLIA/test_ganglia_server.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/GANGLIA/test_ganglia_server.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 @@ + ''' + + from stacks.utils.RMFTestCase import * +-from mock.mock import MagicMock, call, patch ++from unittest.mock import MagicMock, call, patch + + from only_for_platform import not_for_platform, PLATFORM_WINDOWS + +@@ -88,81 +88,81 @@ + ) + self.assertResourceCalled('File', '/etc/init.d/hdp-gmetad', + content = StaticFile('gmetad.init'), +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('File', '/etc/init.d/hdp-gmond', + content = StaticFile('gmond.init'), +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('File', '/usr/libexec/hdp/ganglia/checkGmond.sh', + content = StaticFile('checkGmond.sh'), +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('File', '/usr/libexec/hdp/ganglia/checkRrdcached.sh', + content = StaticFile('checkRrdcached.sh'), +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('File', '/usr/libexec/hdp/ganglia/gmetadLib.sh', + content = StaticFile('gmetadLib.sh'), +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('File', '/usr/libexec/hdp/ganglia/gmondLib.sh', + content = StaticFile('gmondLib.sh'), +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('File', '/usr/libexec/hdp/ganglia/rrdcachedLib.sh', + content = StaticFile('rrdcachedLib.sh'), +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('File', '/usr/libexec/hdp/ganglia/setupGanglia.sh', + content = StaticFile('setupGanglia.sh'), +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('File', '/usr/libexec/hdp/ganglia/startGmetad.sh', + content = StaticFile('startGmetad.sh'), +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('File', '/usr/libexec/hdp/ganglia/startGmond.sh', + content = StaticFile('startGmond.sh'), +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('File', '/usr/libexec/hdp/ganglia/startRrdcached.sh', + content = StaticFile('startRrdcached.sh'), +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('File', '/usr/libexec/hdp/ganglia/stopGmetad.sh', + content = StaticFile('stopGmetad.sh'), +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('File', '/usr/libexec/hdp/ganglia/stopGmond.sh', + content = StaticFile('stopGmond.sh'), +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('File', '/usr/libexec/hdp/ganglia/stopRrdcached.sh', + content = StaticFile('stopRrdcached.sh'), +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('File', '/usr/libexec/hdp/ganglia/teardownGanglia.sh', + content = StaticFile('teardownGanglia.sh'), +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('TemplateConfig', '/usr/libexec/hdp/ganglia/gangliaClusters.conf', + owner = 'root', + template_tag = None, + group = 'root', +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('TemplateConfig', '/usr/libexec/hdp/ganglia/gangliaEnv.sh', + owner = 'root', + template_tag = None, + group = 'root', +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('TemplateConfig', '/usr/libexec/hdp/ganglia/gangliaLib.sh', + owner = 'root', + template_tag = None, + group = 'root', +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('Execute', '/usr/libexec/hdp/ganglia/setupGanglia.sh -t -o root -g hadoop', + path = ['/usr/libexec/hdp/ganglia', +@@ -172,14 +172,14 @@ + '/usr/bin'], + ) + self.assertResourceCalled('Directory', '/var/run/ganglia', +- mode=0755, ++ mode=0o755, + create_parents = True + ) + self.assertResourceCalled('Directory', '/var/lib/ganglia-web/dwoo', + owner = 'wwwrun', + create_parents = True, + recursive_ownership = True, +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('Directory', '/srv/www/cgi-bin', + create_parents = True, +@@ -187,17 +187,17 @@ + self.assertResourceCalled('TemplateConfig', '/srv/www/cgi-bin/rrd.py', + owner = "root", + group = "root", +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('Directory', '/var/lib/ganglia/rrds', + owner = 'nobody', + group = 'nobody', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('File', '/etc/apache2/conf.d/ganglia.conf', + content = Template('ganglia.conf.j2'), +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/etc/ganglia/gmetad.conf', + owner = 'root', +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/HBASE/test_hbase_client.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/HBASE/test_hbase_client.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/HBASE/test_hbase_client.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/HBASE/test_hbase_client.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 + +-from mock.mock import MagicMock, call, patch ++from unittest.mock import MagicMock, call, patch + from stacks.utils.RMFTestCase import * + + @patch("platform.linux_distribution", new = MagicMock(return_value="Linux")) +@@ -41,7 +41,7 @@ + ) + + self.assertResourceCalled('Directory', '/etc/hbase', +- mode = 0755 ++ mode = 0o755 + ) + self.assertResourceCalled('Directory', '/etc/hbase/conf', + owner = 'hbase', +@@ -50,13 +50,13 @@ + ) + self.assertResourceCalled('Directory', '/tmp', + create_parents = True, +- mode = 0777 ++ mode = 0o777 + ) + self.assertResourceCalled('Directory', '/hadoop', + create_parents = True, + cd_access = 'a', + ) +- self.assertResourceCalled('Execute', ('chmod', '1777', u'/hadoop'), ++ self.assertResourceCalled('Execute', ('chmod', '1777', '/hadoop'), + sudo = True, + ) + self.assertResourceCalled('XmlConfig', 'hbase-site.xml', +@@ -98,7 +98,7 @@ + content = Template('hbase.conf.j2'), + owner = 'root', + group = 'root', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('TemplateConfig', '/etc/hbase/conf/hadoop-metrics2-hbase.properties', + owner = 'hbase', +@@ -114,7 +114,7 @@ + ) + self.assertResourceCalled('File', + '/etc/hbase/conf/log4j.properties', +- mode=0644, ++ mode=0o644, + group='hadoop', + owner='hbase', + content=InlineTemplate('log4jproperties\nline2') +@@ -130,7 +130,7 @@ + target = RMFTestCase.TARGET_COMMON_SERVICES + ) + self.assertResourceCalled('Directory', '/etc/hbase', +- mode = 0755 ++ mode = 0o755 + ) + self.assertResourceCalled('Directory', '/etc/hbase/conf', + owner = 'hbase', +@@ -139,13 +139,13 @@ + ) + self.assertResourceCalled('Directory', '/tmp', + create_parents = True, +- mode = 0777 ++ mode = 0o777 + ) + self.assertResourceCalled('Directory', '/hadoop', + create_parents = True, + cd_access = 'a', + ) +- self.assertResourceCalled('Execute', ('chmod', '1777', u'/hadoop'), ++ self.assertResourceCalled('Execute', ('chmod', '1777', '/hadoop'), + sudo = True, + ) + self.assertResourceCalled('XmlConfig', 'hbase-site.xml', +@@ -187,7 +187,7 @@ + content = Template('hbase.conf.j2'), + owner = 'root', + group = 'root', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('TemplateConfig', '/etc/hbase/conf/hadoop-metrics2-hbase.properties', + owner = 'hbase', +@@ -199,7 +199,7 @@ + ) + self.assertResourceCalled('File', + '/etc/hbase/conf/log4j.properties', +- mode=0644, ++ mode=0o644, + group='hadoop', + owner='hbase', + content=InlineTemplate('log4jproperties\nline2') +@@ -230,7 +230,7 @@ + call_mock.side_effects = [(0, None), (0, None)] + + config_file = self.get_src_folder()+"/test/python/stacks/2.0.6/configs/client-upgrade.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + version = '2.3.0.0-1234' + json_content['commandParams']['version'] = version +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/HBASE/test_hbase_master.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/HBASE/test_hbase_master.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/HBASE/test_hbase_master.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/HBASE/test_hbase_master.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 json +-from mock.mock import MagicMock, patch ++from unittest.mock import MagicMock, patch + from stacks.utils.RMFTestCase import * + + @patch("platform.linux_distribution", new = MagicMock(return_value="Linux")) +@@ -84,7 +84,7 @@ + get_provider.return_value = pkg_manager + + config_file = self.get_src_folder()+"/test/python/stacks/2.0.6/configs/hbase_with_phx.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + version = '2.3.0.1-1234' + +@@ -190,7 +190,7 @@ + + self.assertResourceCalled('File', '/usr/lib/hbase/bin/draining_servers.rb', + content = StaticFile('draining_servers.rb'), +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('Execute', ' /usr/lib/hbase/bin/hbase --config /etc/hbase/conf org.jruby.Main /usr/lib/hbase/bin/draining_servers.rb add host1', + logoutput = True, +@@ -221,7 +221,7 @@ + + self.assertResourceCalled('File', '/usr/lib/hbase/bin/draining_servers.rb', + content = StaticFile('draining_servers.rb'), +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('Execute', ' /usr/lib/hbase/bin/hbase --config /etc/hbase/conf org.jruby.Main /usr/lib/hbase/bin/draining_servers.rb remove host1', + logoutput = True, +@@ -289,7 +289,7 @@ + + self.assertResourceCalled('File', '/usr/lib/hbase/bin/draining_servers.rb', + content = StaticFile('draining_servers.rb'), +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('Execute', '/usr/bin/kinit -kt /etc/security/keytabs/hbase.service.keytab hbase/c6401.ambari.apache.org@EXAMPLE.COM; /usr/lib/hbase/bin/hbase --config /etc/hbase/conf -Djava.security.auth.login.config=/etc/hbase/conf/hbase_client_jaas.conf org.jruby.Main /usr/lib/hbase/bin/draining_servers.rb add host1', + logoutput = True, +@@ -303,7 +303,7 @@ + + def assert_configure_default(self, bucketcache_ioengine_as_file=False): + self.assertResourceCalled('Directory', '/etc/hbase', +- mode = 0755 ++ mode = 0o755 + ) + self.assertResourceCalled('Directory', '/etc/hbase/conf', + owner = 'hbase', +@@ -312,21 +312,21 @@ + ) + self.assertResourceCalled('Directory', '/tmp', + create_parents = True, +- mode = 0777 ++ mode = 0o777 + ) + if bucketcache_ioengine_as_file: + self.assertResourceCalled('Directory', '/mnt/bucket', + create_parents = True, + owner = 'hbase', + group = 'hadoop', +- mode = 0755 ++ mode = 0o755 + ) + pass + self.assertResourceCalled('Directory', '/hadoop', + create_parents = True, + cd_access = 'a', + ) +- self.assertResourceCalled('Execute', ('chmod', '1777', u'/hadoop'), ++ self.assertResourceCalled('Execute', ('chmod', '1777', '/hadoop'), + sudo = True, + ) + self.assertResourceCalled('XmlConfig', 'hbase-site.xml', +@@ -368,7 +368,7 @@ + content = Template('hbase.conf.j2'), + owner = 'root', + group = 'root', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('TemplateConfig', '/etc/hbase/conf/hadoop-metrics2-hbase.properties', + owner = 'hbase', +@@ -381,18 +381,18 @@ + self.assertResourceCalled('Directory', '/var/run/hbase', + owner = 'hbase', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + cd_access = 'a', + ) + self.assertResourceCalled('Directory', '/var/log/hbase', + owner = 'hbase', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + cd_access = 'a', + ) + self.assertResourceCalled('File', + '/etc/hbase/conf/log4j.properties', +- mode=0644, ++ mode=0o644, + group='hadoop', + owner='hbase', + content=InlineTemplate('log4jproperties\nline2') +@@ -425,7 +425,7 @@ + hadoop_bin_dir = '/usr/bin', + type = 'directory', + action = ['create_on_execute'], hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', hdfs_site=self.getConfig()['configurations']['hdfs-site'], principal_name=UnknownConfigurationMock(), default_fs='hdfs://c6401.ambari.apache.org:8020', +- mode = 0711, ++ mode = 0o711, + ) + self.assertResourceCalled('HdfsResource', None, + immutable_paths = self.DEFAULT_IMMUTABLE_PATHS, +@@ -442,7 +442,7 @@ + + def assert_configure_secured(self): + self.assertResourceCalled('Directory', '/etc/hbase', +- mode = 0755 ++ mode = 0o755 + ) + self.assertResourceCalled('Directory', '/etc/hbase/conf', + owner = 'hbase', +@@ -451,13 +451,13 @@ + ) + self.assertResourceCalled('Directory', '/tmp', + create_parents = True, +- mode = 0777 ++ mode = 0o777 + ) + self.assertResourceCalled('Directory', '/hadoop', + create_parents = True, + cd_access = 'a', + ) +- self.assertResourceCalled('Execute', ('chmod', '1777', u'/hadoop'), ++ self.assertResourceCalled('Execute', ('chmod', '1777', '/hadoop'), + sudo = True, + ) + self.assertResourceCalled('XmlConfig', 'hbase-site.xml', +@@ -499,7 +499,7 @@ + content = Template('hbase.conf.j2'), + owner = 'root', + group = 'root', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('TemplateConfig', '/etc/hbase/conf/hadoop-metrics2-hbase.properties', + owner = 'hbase', +@@ -516,18 +516,18 @@ + self.assertResourceCalled('Directory', '/var/run/hbase', + owner = 'hbase', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + cd_access = 'a', + ) + self.assertResourceCalled('Directory', '/var/log/hbase', + owner = 'hbase', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + cd_access = 'a', + ) + self.assertResourceCalled('File', + '/etc/hbase/conf/log4j.properties', +- mode=0644, ++ mode=0o644, + group='hadoop', + owner='hbase', + content=InlineTemplate('log4jproperties\nline2') +@@ -559,7 +559,7 @@ + hadoop_bin_dir = '/usr/bin', + type = 'directory', + action = ['create_on_execute'], hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', hdfs_site=self.getConfig()['configurations']['hdfs-site'], principal_name='hdfs', default_fs='hdfs://c6401.ambari.apache.org:8020', +- mode = 0711, ++ mode = 0o711, + ) + self.assertResourceCalled('HdfsResource', None, + immutable_paths = self.DEFAULT_IMMUTABLE_PATHS, +@@ -583,7 +583,7 @@ + target = RMFTestCase.TARGET_COMMON_SERVICES) + + self.assertResourceCalled('Directory', '/etc/hbase', +- mode = 0755) ++ mode = 0o755) + + self.assertResourceCalled('Directory', '/usr/hdp/current/hbase-master/conf', + owner = 'hbase', +@@ -591,14 +591,14 @@ + create_parents = True) + self.assertResourceCalled('Directory', '/tmp', + create_parents = True, +- mode = 0777 ++ mode = 0o777 + ) + self.assertResourceCalled('Directory', '/hadoop', + create_parents = True, + cd_access = 'a', + ) + +- self.assertResourceCalled('Execute', ('chmod', '1777', u'/hadoop'), ++ self.assertResourceCalled('Execute', ('chmod', '1777', '/hadoop'), + sudo = True, + ) + +@@ -644,7 +644,7 @@ + content = Template('hbase.conf.j2'), + owner = 'root', + group = 'root', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('TemplateConfig', '/usr/hdp/current/hbase-master/conf/hadoop-metrics2-hbase.properties', + owner = 'hbase', +@@ -657,20 +657,20 @@ + self.assertResourceCalled('Directory', '/var/run/hbase', + owner = 'hbase', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + cd_access = 'a', + ) + + self.assertResourceCalled('Directory', '/var/log/hbase', + owner = 'hbase', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + cd_access = 'a', + ) + + self.assertResourceCalled('File', + '/usr/hdp/current/hbase-master/conf/log4j.properties', +- mode=0644, ++ mode=0o644, + group='hadoop', + owner='hbase', + content=InlineTemplate('log4jproperties\nline2')) +@@ -706,7 +706,7 @@ + hadoop_conf_dir = '/etc/hadoop/conf', + type = 'directory', + action = ['create_on_execute'], hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', +- mode = 0711, ++ mode = 0o711, + ) + self.assertResourceCalled('HdfsResource', None, + immutable_paths = self.DEFAULT_IMMUTABLE_PATHS, +@@ -747,7 +747,7 @@ + call_mock.side_effects = [(0, None), (0, None)] + + config_file = self.get_src_folder()+"/test/python/stacks/2.0.6/configs/default.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + version = '2.2.1.0-3242' + json_content['commandParams']['version'] = version +@@ -771,7 +771,7 @@ + call_mock.side_effects = [(0, None), (0, None)] + + config_file = self.get_src_folder()+"/test/python/stacks/2.0.6/configs/default.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + version = '2.3.0.0-1234' + json_content['commandParams']['version'] = version +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/HBASE/test_hbase_regionserver.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/HBASE/test_hbase_regionserver.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/HBASE/test_hbase_regionserver.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/HBASE/test_hbase_regionserver.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 upgrade +-from mock.mock import MagicMock, patch ++from unittest.mock import MagicMock, patch + from stacks.utils.RMFTestCase import * + + @patch.object(upgrade, 'check_process_status', new = MagicMock()) +@@ -133,7 +133,7 @@ + + def assert_configure_default(self): + self.assertResourceCalled('Directory', '/etc/hbase', +- mode = 0755 ++ mode = 0o755 + ) + self.assertResourceCalled('Directory', '/etc/hbase/conf', + owner = 'hbase', +@@ -142,13 +142,13 @@ + ) + self.assertResourceCalled('Directory', '/tmp', + create_parents = True, +- mode = 0777 ++ mode = 0o777 + ) + self.assertResourceCalled('Directory', '/hadoop', + create_parents = True, + cd_access = 'a', + ) +- self.assertResourceCalled('Execute', ('chmod', '1777', u'/hadoop'), ++ self.assertResourceCalled('Execute', ('chmod', '1777', '/hadoop'), + sudo = True, + ) + self.assertResourceCalled('XmlConfig', 'hbase-site.xml', +@@ -190,7 +190,7 @@ + content = Template('hbase.conf.j2'), + owner = 'root', + group = 'root', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('TemplateConfig', '/etc/hbase/conf/hadoop-metrics2-hbase.properties', + owner = 'hbase', +@@ -203,18 +203,18 @@ + self.assertResourceCalled('Directory', '/var/run/hbase', + owner = 'hbase', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + cd_access = 'a', + ) + self.assertResourceCalled('Directory', '/var/log/hbase', + owner = 'hbase', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + cd_access = 'a', + ) + self.assertResourceCalled('File', + '/etc/hbase/conf/log4j.properties', +- mode=0644, ++ mode=0o644, + group='hadoop', + owner='hbase', + content=InlineTemplate('log4jproperties\nline2') +@@ -222,7 +222,7 @@ + + def assert_configure_secured(self): + self.assertResourceCalled('Directory', '/etc/hbase', +- mode = 0755 ++ mode = 0o755 + ) + self.assertResourceCalled('Directory', '/etc/hbase/conf', + owner = 'hbase', +@@ -231,13 +231,13 @@ + ) + self.assertResourceCalled('Directory', '/tmp', + create_parents = True, +- mode = 0777 ++ mode = 0o777 + ) + self.assertResourceCalled('Directory', '/hadoop', + create_parents = True, + cd_access = 'a', + ) +- self.assertResourceCalled('Execute', ('chmod', '1777', u'/hadoop'), ++ self.assertResourceCalled('Execute', ('chmod', '1777', '/hadoop'), + sudo = True, + ) + self.assertResourceCalled('XmlConfig', 'hbase-site.xml', +@@ -279,7 +279,7 @@ + content = Template('hbase.conf.j2'), + owner = 'root', + group = 'root', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('TemplateConfig', '/etc/hbase/conf/hadoop-metrics2-hbase.properties', + owner = 'hbase', +@@ -296,18 +296,18 @@ + self.assertResourceCalled('Directory', '/var/run/hbase', + owner = 'hbase', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + cd_access = 'a', + ) + self.assertResourceCalled('Directory', '/var/log/hbase', + owner = 'hbase', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + cd_access = 'a', + ) + self.assertResourceCalled('File', + '/etc/hbase/conf/log4j.properties', +- mode=0644, ++ mode=0o644, + group='hadoop', + owner='hbase', + content=InlineTemplate('log4jproperties\nline2') +@@ -322,7 +322,7 @@ + target = RMFTestCase.TARGET_COMMON_SERVICES) + + self.assertResourceCalled('Directory', '/etc/hbase', +- mode = 0755) ++ mode = 0o755) + + self.assertResourceCalled('Directory', '/usr/hdp/current/hbase-regionserver/conf', + owner = 'hbase', +@@ -330,7 +330,7 @@ + create_parents = True) + self.assertResourceCalled('Directory', '/tmp', + create_parents = True, +- mode = 0777 ++ mode = 0o777 + ) + + self.assertResourceCalled('Directory', '/hadoop', +@@ -338,7 +338,7 @@ + cd_access = 'a', + ) + +- self.assertResourceCalled('Execute', ('chmod', '1777', u'/hadoop'), ++ self.assertResourceCalled('Execute', ('chmod', '1777', '/hadoop'), + sudo = True, + ) + +@@ -383,7 +383,7 @@ + content = Template('hbase.conf.j2'), + owner = 'root', + group = 'root', +- mode = 0644, ++ mode = 0o644, + ) + + self.assertResourceCalled('TemplateConfig', '/usr/hdp/current/hbase-regionserver/conf/hadoop-metrics2-hbase.properties', +@@ -397,20 +397,20 @@ + self.assertResourceCalled('Directory', '/var/run/hbase', + owner = 'hbase', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + cd_access = 'a', + ) + + self.assertResourceCalled('Directory', '/var/log/hbase', + owner = 'hbase', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + cd_access = 'a', + ) + + self.assertResourceCalled('File', + '/usr/hdp/current/hbase-regionserver/conf/log4j.properties', +- mode=0644, ++ mode=0o644, + group='hadoop', + owner='hbase', + content=InlineTemplate('log4jproperties\nline2')) +@@ -429,7 +429,7 @@ + target = RMFTestCase.TARGET_COMMON_SERVICES) + + self.assertResourceCalled('Directory', '/etc/hbase', +- mode = 0755) ++ mode = 0o755) + + self.assertResourceCalled('Directory', '/usr/hdp/current/hbase-regionserver/conf', + owner = 'hbase', +@@ -437,7 +437,7 @@ + create_parents = True) + self.assertResourceCalled('Directory', '/tmp', + create_parents = True, +- mode = 0777 ++ mode = 0o777 + ) + + self.assertResourceCalled('Directory', '/hadoop', +@@ -445,7 +445,7 @@ + cd_access = 'a', + ) + +- self.assertResourceCalled('Execute', ('chmod', '1777', u'/hadoop'), ++ self.assertResourceCalled('Execute', ('chmod', '1777', '/hadoop'), + sudo = True, + ) + +@@ -492,7 +492,7 @@ + content = Template('hbase.conf.j2'), + owner = 'root', + group = 'root', +- mode = 0644, ++ mode = 0o644, + ) + + self.assertResourceCalled('TemplateConfig', '/usr/hdp/current/hbase-regionserver/conf/hadoop-metrics2-hbase.properties', +@@ -506,20 +506,20 @@ + self.assertResourceCalled('Directory', '/var/run/hbase', + owner = 'hbase', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + cd_access = 'a', + ) + + self.assertResourceCalled('Directory', '/var/log/hbase', + owner = 'hbase', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + cd_access = 'a', + ) + + self.assertResourceCalled('File', + '/usr/hdp/current/hbase-regionserver/conf/log4j.properties', +- mode=0644, ++ mode=0o644, + group='hadoop', + owner='hbase', + content=InlineTemplate('log4jproperties\nline2')) +@@ -534,7 +534,7 @@ + + def test_pre_upgrade_restart(self): + config_file = self.get_src_folder()+"/test/python/stacks/2.0.6/configs/default.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + version = '2.2.1.0-3242' + json_content['commandParams']['version'] = version +@@ -552,7 +552,7 @@ + @patch('time.sleep') + def test_post_rolling_restart(self, sleep_mock): + config_file = self.get_src_folder()+"/test/python/stacks/2.0.6/configs/default.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + version = '2.2.1.0-3242' + json_content['commandParams']['version'] = version +@@ -573,7 +573,7 @@ + call_mock.side_effects = [(0, None), (0, None)] + + config_file = self.get_src_folder()+"/test/python/stacks/2.0.6/configs/default.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + version = '2.3.0.0-1234' + json_content['commandParams']['version'] = version +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/HBASE/test_hbase_service_check.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/HBASE/test_hbase_service_check.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/HBASE/test_hbase_service_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/HBASE/test_hbase_service_check.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 mock.mock import MagicMock, call, patch ++from unittest.mock import MagicMock, call, patch + from stacks.utils.RMFTestCase import * + import datetime + import resource_management.libraries.functions +@@ -38,15 +38,15 @@ + ) + self.assertResourceCalled('File', '/tmp/hbaseSmokeVerify.sh', + content = StaticFile('hbaseSmokeVerify.sh'), +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('File', '/tmp/hbase-smoke-cleanup.sh', + content = StaticFile('hbase-smoke-cleanup.sh'), +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('File', '/tmp/hbase-smoke.sh', + content = Template('hbase-smoke.sh.j2'), +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('Execute', ' /usr/lib/hbase/bin/hbase --config /etc/hbase/conf shell /tmp/hbase-smoke.sh && /tmp/hbaseSmokeVerify.sh /etc/hbase/conf /usr/lib/hbase/bin/hbase && /usr/lib/hbase/bin/hbase --config /etc/hbase/conf shell /tmp/hbase-smoke-cleanup.sh', + logoutput = True, +@@ -67,21 +67,21 @@ + ) + self.assertResourceCalled('File', '/tmp/hbaseSmokeVerify.sh', + content = StaticFile('hbaseSmokeVerify.sh'), +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('File', '/tmp/hbase-smoke-cleanup.sh', + content = StaticFile('hbase-smoke-cleanup.sh'), +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('File', '/tmp/hbase-smoke.sh', + content = Template('hbase-smoke.sh.j2'), +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('File', '/tmp/hbase_grant_permissions.sh', + content = Template('hbase_grant_permissions.j2'), + owner = 'hbase', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('Execute', '/usr/bin/kinit -kt /etc/security/keytabs/hbase.headless.keytab hbase; /usr/lib/hbase/bin/hbase shell /tmp/hbase_grant_permissions.sh', + user = 'hbase', +@@ -105,15 +105,15 @@ + ) + self.assertResourceCalled('File', '/tmp/hbaseSmokeVerify.sh', + content = StaticFile('hbaseSmokeVerify.sh'), +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('File', '/tmp/hbase-smoke-cleanup.sh', + content = StaticFile('hbase-smoke-cleanup.sh'), +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('File', '/tmp/hbase-smoke.sh', + content = Template('hbase-smoke.sh.j2'), +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('Execute', ' /usr/hdp/current/hbase-client/bin/hbase --config /usr/hdp/current/hbase-client/conf shell /tmp/hbase-smoke.sh && /tmp/hbaseSmokeVerify.sh /usr/hdp/current/hbase-client/conf /usr/hdp/current/hbase-client/bin/hbase && /usr/hdp/current/hbase-client/bin/hbase --config /usr/hdp/current/hbase-client/conf shell /tmp/hbase-smoke-cleanup.sh', + logoutput = True, +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/HBASE/test_phoenix_queryserver.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/HBASE/test_phoenix_queryserver.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/HBASE/test_phoenix_queryserver.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/HBASE/test_phoenix_queryserver.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 sys + import unittest + +-from mock.mock import MagicMock, patch ++from unittest.mock import MagicMock, patch + from stacks.utils.RMFTestCase import * + + +@@ -168,7 +168,7 @@ + target = RMFTestCase.TARGET_COMMON_SERVICES) + + self.assertResourceCalled('Directory', '/etc/hbase', +- mode = 0755) ++ mode = 0o755) + + self.assertResourceCalled('Directory', + '/usr/hdp/current/hbase-regionserver/conf', +@@ -209,7 +209,7 @@ + + self.assertResourceCalled('File', + '/usr/lib/phoenix/bin/log4j.properties', +- mode = 0644, ++ mode = 0o644, + group = 'hadoop', + owner = 'hbase', + content = 'log4jproperties\nline2') +@@ -223,7 +223,7 @@ + + def assert_configure_default(self): + self.assertResourceCalled('Directory', '/etc/hbase', +- mode = 0755 ++ mode = 0o755 + ) + self.assertResourceCalled('Directory', + '/usr/hdp/current/hbase-regionserver/conf', +@@ -233,13 +233,13 @@ + ) + self.assertResourceCalled('Directory', '/tmp', + create_parents = True, +- mode = 0777 ++ mode = 0o777 + ) + self.assertResourceCalled('Directory', '/hadoop', + create_parents = True, + cd_access = 'a', + ) +- self.assertResourceCalled('Execute', ('chmod', '1777', u'/hadoop'), ++ self.assertResourceCalled('Execute', ('chmod', '1777', '/hadoop'), + sudo = True, + ) + self.assertResourceCalled('XmlConfig', 'hbase-site.xml', +@@ -290,7 +290,7 @@ + content = Template('hbase.conf.j2'), + owner = 'root', + group = 'root', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('TemplateConfig', + '/usr/hdp/current/hbase-regionserver/conf/hadoop-metrics2-hbase.properties', +@@ -305,18 +305,18 @@ + self.assertResourceCalled('Directory', '/var/run/hbase', + owner = 'hbase', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + cd_access = 'a', + ) + self.assertResourceCalled('Directory', '/var/log/hbase', + owner = 'hbase', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + cd_access = 'a', + ) + self.assertResourceCalled('File', + '/usr/hdp/current/hbase-regionserver/conf/log4j.properties', +- mode = 0644, ++ mode = 0o644, + group = 'hadoop', + owner = 'hbase', + content = InlineTemplate('log4jproperties\nline2') +@@ -324,7 +324,7 @@ + + def assert_configure_secured(self): + self.assertResourceCalled('Directory', '/etc/hbase', +- mode = 0755 ++ mode = 0o755 + ) + self.assertResourceCalled('Directory', + '/usr/hdp/current/hbase-regionserver/conf', +@@ -334,13 +334,13 @@ + ) + self.assertResourceCalled('Directory', '/tmp', + create_parents = True, +- mode = 0777 ++ mode = 0o777 + ) + self.assertResourceCalled('Directory', '/hadoop', + create_parents = True, + cd_access = 'a', + ) +- self.assertResourceCalled('Execute', ('chmod', '1777', u'/hadoop'), ++ self.assertResourceCalled('Execute', ('chmod', '1777', '/hadoop'), + sudo = True, + ) + self.assertResourceCalled('XmlConfig', 'hbase-site.xml', +@@ -391,7 +391,7 @@ + content = Template('hbase.conf.j2'), + owner = 'root', + group = 'root', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('TemplateConfig', + '/usr/hdp/current/hbase-regionserver/conf/hadoop-metrics2-hbase.properties', +@@ -411,18 +411,18 @@ + self.assertResourceCalled('Directory', '/var/run/hbase', + owner = 'hbase', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + cd_access = 'a', + ) + self.assertResourceCalled('Directory', '/var/log/hbase', + owner = 'hbase', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + cd_access = 'a', + ) + self.assertResourceCalled('File', + '/usr/hdp/current/hbase-regionserver/conf/log4j.properties', +- mode = 0644, ++ mode = 0o644, + group = 'hadoop', + owner = 'hbase', + content = InlineTemplate('log4jproperties\nline2') +@@ -431,7 +431,7 @@ + @patch("resource_management.core.sudo.path_isdir", new = MagicMock(return_value = True)) + def test_upgrade_restart(self): + config_file = self.get_src_folder()+"/test/python/stacks/2.3/configs/hbase_default.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + + json_content['commandParams']['version'] = '2.3.0.0-1234' +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/HDFS/test_alert_checkpoint_time.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/HDFS/test_alert_checkpoint_time.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/HDFS/test_alert_checkpoint_time.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/HDFS/test_alert_checkpoint_time.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 json + import time + +-from mock.mock import patch, MagicMock ++from unittest.mock import patch, MagicMock + + # Local imports + from stacks.utils.RMFTestCase import * +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/HDFS/test_alert_datanode_unmounted_data_dir.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/HDFS/test_alert_datanode_unmounted_data_dir.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/HDFS/test_alert_datanode_unmounted_data_dir.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/HDFS/test_alert_datanode_unmounted_data_dir.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 logging + +-from mock.mock import patch ++from unittest.mock import patch + + # Local imports + from stacks.utils.RMFTestCase import * +@@ -93,7 +93,7 @@ + [status, messages] = alert.execute(configurations=configs) + self.assertEqual(status, RESULT_STATE_WARNING) + self.assertTrue(messages is not None and len(messages) == 1) +- self.assertTrue("{0} was not found".format(DATA_DIR_MOUNT_HIST_FILE_PATH) in messages[0]) ++ self.assertTrue("{} was not found".format(DATA_DIR_MOUNT_HIST_FILE_PATH) in messages[0]) + + @patch("resource_management.libraries.functions.file_system.get_and_cache_mount_points") + @patch("resource_management.libraries.functions.mounted_dirs_helper.get_dir_to_mount_from_file") +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/HDFS/test_alert_metrics_deviation.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/HDFS/test_alert_metrics_deviation.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/HDFS/test_alert_metrics_deviation.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/HDFS/test_alert_metrics_deviation.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 sys + from ambari_commons import ambari_metrics_helper +-from mock.mock import patch, MagicMock ++from unittest.mock import patch, MagicMock + + # Local imports + from stacks.utils.RMFTestCase import * +@@ -67,7 +67,7 @@ + 'metric.deviation.critical.threshold': 200.0, + 'appId': 'NAMENODE', + 'minimumValue': 30.0, +- 'kerberos.kinit.timer': 14400000L, ++ 'kerberos.kinit.timer': 14400000, + 'metricName': 'metric1', + 'metric.units': 'ms' + } +@@ -237,28 +237,28 @@ + [status, messages] = alert.execute(configurations=configs, parameters=parameters, host_name=_host_name) + self.assertEqual(status, RESULT_STATE_OK) + self.assertTrue(messages is not None and len(messages) == 1) +- self.assertEquals('There were no data points above the minimum threshold of 30 seconds',messages[0]) ++ self.assertEqual('There were no data points above the minimum threshold of 30 seconds',messages[0]) + + # Unable to calculate the standard deviation for 1 data point + response.read.return_value = '{"metrics":[{"metricname":"metric1","metrics":{"1459966360838":40000}}]}' + [status, messages] = alert.execute(configurations=configs, parameters=parameters, host_name=_host_name) + self.assertEqual(status, RESULT_STATE_SKIPPED) + self.assertTrue(messages is not None and len(messages) == 1) +- self.assertEquals('There are not enough data points to calculate the standard deviation (1 sampled)', messages[0]) ++ self.assertEqual('There are not enough data points to calculate the standard deviation (1 sampled)', messages[0]) + + # OK + response.read.return_value = '{"metrics":[{"metricname":"metric1","metrics":{"1459966360838":40000,"1459966370838":50000}}]}' + [status, messages] = alert.execute(configurations=configs, parameters=parameters, host_name=_host_name) + self.assertEqual(status, RESULT_STATE_OK) + self.assertTrue(messages is not None and len(messages) == 1) +- self.assertEquals('The variance for this alert is 7071ms which is within 100% of the 45000ms average (45000ms is the limit)', messages[0]) ++ self.assertEqual('The variance for this alert is 7071ms which is within 100% of the 45000ms average (45000ms is the limit)', messages[0]) + + # Warning + response.read.return_value = '{"metrics":[{"metricname":"metric1","metrics":{"1459966360838":40000,"1459966370838":1000000}}]}' + [status, messages] = alert.execute(configurations=configs, parameters=parameters, host_name=_host_name) + self.assertEqual(status, RESULT_STATE_WARNING) + self.assertTrue(messages is not None and len(messages) == 1) +- self.assertEquals('The variance for this alert is 678823ms which is 131% of the 520000ms average (520000ms is the limit)', messages[0]) ++ self.assertEqual('The variance for this alert is 678823ms which is 131% of the 520000ms average (520000ms is the limit)', messages[0]) + + # HTTP request to AMS failed + response.read.return_value = '' +@@ -266,11 +266,11 @@ + [status, messages] = alert.execute(configurations=configs, parameters=parameters, host_name=_host_name) + self.assertEqual(status, RESULT_STATE_UNKNOWN) + self.assertTrue(messages is not None and len(messages) == 1) +- self.assertEquals('Unable to retrieve metrics from the Ambari Metrics service.', messages[0]) ++ self.assertEqual('Unable to retrieve metrics from the Ambari Metrics service.', messages[0]) + + # Unable to connect to AMS + conn_mock.side_effect = Exception('Unable to connect to AMS') + [status, messages] = alert.execute(configurations=configs, parameters=parameters, host_name=_host_name) + self.assertEqual(status, RESULT_STATE_UNKNOWN) + self.assertTrue(messages is not None and len(messages) == 1) +- self.assertEquals('Unable to retrieve metrics from the Ambari Metrics service.', messages[0]) ++ self.assertEqual('Unable to retrieve metrics from the Ambari Metrics service.', messages[0]) +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/HDFS/test_datanode.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/HDFS/test_datanode.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/HDFS/test_datanode.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/HDFS/test_datanode.py 2022-07-11 00:52:31.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +@@ -59,7 +59,7 @@ + self.assertResourceCalled('Directory', '/var/run/hadoop', + owner = 'hdfs', + group = 'hadoop', +- mode = 0755 ++ mode = 0o755 + ) + self.assertResourceCalled('Directory', '/var/run/hadoop/hdfs', + owner = 'hdfs', +@@ -129,7 +129,7 @@ + self.assertResourceCalled('Directory', '/var/run/hadoop', + owner = 'hdfs', + group = 'hadoop', +- mode = 0755 ++ mode = 0o755 + ) + self.assertResourceCalled('Directory', '/var/run/hadoop/hdfs', + owner = 'hdfs', +@@ -169,7 +169,7 @@ + self.assertResourceCalled('Directory', '/var/run/hadoop', + owner = 'hdfs', + group = 'hadoop', +- mode = 0755 ++ mode = 0o755 + ) + self.assertResourceCalled('Directory', '/var/run/hadoop/hdfs', + owner = 'hdfs', +@@ -212,7 +212,7 @@ + self.assertResourceCalled('Directory', '/var/run/hadoop', + owner = 'hdfs', + group = 'hadoop', +- mode = 0755 ++ mode = 0o755 + ) + self.assertResourceCalled('Directory', '/var/run/hadoop/hdfs', + owner = 'hdfs', +@@ -343,7 +343,7 @@ + content = Template('hdfs.conf.j2'), + owner = 'root', + group = 'root', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('XmlConfig', 'hdfs-site.xml', + owner = 'hdfs', +@@ -358,7 +358,7 @@ + conf_dir = '/usr/hdp/current/hadoop-client/conf', + configurations = self.getConfig()['configurations']['core-site'], + configuration_attributes = self.getConfig()['configurationAttributes']['core-site'], +- mode = 0644 ++ mode = 0o644 + ) + self.assertResourceCalled('File', '/usr/hdp/current/hadoop-client/conf/slaves', + content = Template('slaves.j2'), +@@ -368,18 +368,18 @@ + self.assertResourceCalled('Directory', '/var/lib/hadoop-hdfs', + owner = 'hdfs', + group = 'hadoop', +- mode = 0751, ++ mode = 0o751, + create_parents = True, + ) + self.assertResourceCalled('Directory', '/var/lib/ambari-agent/data/datanode', +- mode = 0755, ++ mode = 0o755, + create_parents = True + ) + self.assertResourceCalled('Directory', '/hadoop/hdfs/data', + owner = 'hdfs', + ignore_failures = True, + group = 'hadoop', +- mode = 0750, ++ mode = 0o750, + create_parents = True, + cd_access='a' + ) +@@ -387,7 +387,7 @@ + self.assertResourceCalled('File', '/var/lib/ambari-agent/data/datanode/dfs_data_dir_mount.hist', + owner = 'hdfs', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + content = content + ) + +@@ -418,7 +418,7 @@ + content = Template('hdfs.conf.j2'), + owner = 'root', + group = 'root', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', conf_dir + '/hdfs_dn_jaas.conf', + content = Template('hdfs_dn_jaas.conf.j2'), +@@ -444,7 +444,7 @@ + conf_dir = conf_dir, + configurations = self.getConfig()['configurations']['core-site'], + configuration_attributes = self.getConfig()['configurationAttributes']['core-site'], +- mode = 0644 ++ mode = 0o644 + ) + self.assertResourceCalled('File', conf_dir + '/slaves', + content = Template('slaves.j2'), +@@ -454,18 +454,18 @@ + self.assertResourceCalled('Directory', '/var/lib/hadoop-hdfs', + owner = 'hdfs', + group = 'hadoop', +- mode = 0751, ++ mode = 0o751, + create_parents = True, + ) + self.assertResourceCalled('Directory', '/var/lib/ambari-agent/data/datanode', +- mode = 0755, ++ mode = 0o755, + create_parents = True + ) + self.assertResourceCalled('Directory', '/hadoop/hdfs/data', + owner = 'hdfs', + ignore_failures = True, + group = 'hadoop', +- mode = 0750, ++ mode = 0o750, + create_parents = True, + cd_access='a' + ) +@@ -473,7 +473,7 @@ + self.assertResourceCalled('File', '/var/lib/ambari-agent/data/datanode/dfs_data_dir_mount.hist', + owner = 'hdfs', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + content = content + ) + +@@ -573,7 +573,7 @@ + mocks_dict = mocks_dict + ) + self.fail('Missing DataNode should have caused a failure') +- except Fail,fail: ++ except Fail as fail: + self.assertTrue(mocks_dict['call'].called) + self.assertEqual(mocks_dict['call'].call_count,30) + +@@ -594,7 +594,7 @@ + mocks_dict = mocks_dict + ) + self.fail('Invalid return code should cause a failure') +- except Fail,fail: ++ except Fail as fail: + self.assertTrue(mocks_dict['call'].called) + self.assertEqual(mocks_dict['call'].call_count,30) + +@@ -624,12 +624,12 @@ + command_args=["rolling"]) + + raise Fail("Expected a fail since datanode didn't report a shutdown") +- except Exception, err: ++ except Exception as err: + expected_message = "DataNode has not yet deregistered from the NameNode..." + if str(err.message) != expected_message: + self.fail("Expected this exception to be thrown. " + expected_message + ". Got this instead, " + str(err.message)) + +- self.assertEquals( ++ self.assertEqual( + ('hdfs dfsadmin -fs hdfs://c6401.ambari.apache.org:8020 -D ipc.client.connect.max.retries=5 -D ipc.client.connect.retry.interval=1000 -getDatanodeInfo 0.0.0.0:8010'), + mocks_dict['checked_call'].call_args_list[0][0][0]) + +@@ -658,12 +658,12 @@ + command_args=["rolling"]) + + raise Fail("Expected a fail since datanode didn't report a shutdown") +- except Exception, err: ++ except Exception as err: + expected_message = "DataNode has not yet deregistered from the NameNode..." + if str(err.message) != expected_message: + self.fail("Expected this exception to be thrown. " + expected_message + ". Got this instead, " + str(err.message)) + +- self.assertEquals( ++ self.assertEqual( + ('hdfs dfsadmin -fs hdfs://ns1 -D ipc.client.connect.max.retries=5 -D ipc.client.connect.retry.interval=1000 -getDatanodeInfo 0.0.0.0:8010'), + mocks_dict['checked_call'].call_args_list[0][0][0]) + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/HDFS/test_hdfs_client.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/HDFS/test_hdfs_client.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/HDFS/test_hdfs_client.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/HDFS/test_hdfs_client.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 json +-from mock.mock import MagicMock, patch ++from unittest.mock import MagicMock, patch + import tempfile + import tarfile + import contextlib +@@ -52,25 +52,25 @@ + ) + self.assertResourceCalled('XmlConfig', 'hdfs-site.xml', + conf_dir = '/tmp/123', +- mode=0644, ++ mode=0o644, + configuration_attributes = self.getConfig()['configurationAttributes']['hdfs-site'], + configurations = self.getConfig()['configurations']['hdfs-site'], + ) + self.assertResourceCalled('File', '/tmp/123/hadoop-env.sh', +- mode=0644, ++ mode=0o644, + content = InlineTemplate(self.getConfig()['configurations']['hadoop-env']['content']), + ) + self.assertResourceCalled('File', '/tmp/123/log4j.properties', +- mode=0644, ++ mode=0o644, + content = InlineTemplate(self.getConfig()['configurations']['hdfs-log4j']['content']+ + self.getConfig()['configurations']['yarn-log4j']['content']), + ) + self.assertResourceCalled('PropertiesFile', '/tmp/123/runtime.properties', +- mode=0644, ++ mode=0o644, + properties = UnknownConfigurationMock(), + ) + self.assertResourceCalled('PropertiesFile', '/tmp/123/startup.properties', +- mode=0644, ++ mode=0o644, + properties = UnknownConfigurationMock(), + ) + self.assertResourceCalled('Directory', '/tmp/123', +@@ -94,7 +94,7 @@ + @patch("resource_management.core.shell.call") + def test_pre_upgrade_restart_23(self, call_mock): + config_file = self.get_src_folder()+"/test/python/stacks/2.0.6/configs/default.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + version = '2.3.0.0-1234' + json_content['commandParams']['version'] = version +@@ -114,7 +114,7 @@ + + def test_pre_upgrade_restart(self): + config_file = self.get_src_folder()+"/test/python/stacks/2.0.6/configs/default.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + version = '2.2.1.0-3242' + json_content['commandParams']['version'] = version +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/HDFS/test_journalnode.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/HDFS/test_journalnode.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/HDFS/test_journalnode.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/HDFS/test_journalnode.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 json + import os + from stacks.utils.RMFTestCase import * +-from mock.mock import MagicMock, patch ++from unittest.mock import MagicMock, patch + from resource_management.libraries.script.script import Script + + @patch.object(Script, 'format_package_name', new = MagicMock()) +@@ -54,7 +54,7 @@ + self.assertResourceCalled('Directory', '/var/run/hadoop', + owner = 'hdfs', + group = 'hadoop', +- mode = 0755 ++ mode = 0o755 + ) + self.assertResourceCalled('Directory', '/var/run/hadoop/hdfs', + owner = 'hdfs', +@@ -114,7 +114,7 @@ + self.assertResourceCalled('Directory', '/var/run/hadoop', + owner = 'hdfs', + group = 'hadoop', +- mode = 0755 ++ mode = 0o755 + ) + self.assertResourceCalled('Directory', '/var/run/hadoop/hdfs', + owner = 'hdfs', +@@ -179,7 +179,7 @@ + content = Template('hdfs.conf.j2'), + owner = 'root', + group = 'root', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('XmlConfig', 'hdfs-site.xml', + owner = 'hdfs', +@@ -194,7 +194,7 @@ + conf_dir = '/etc/hadoop/conf', + configurations = self.getConfig()['configurations']['core-site'], + configuration_attributes = self.getConfig()['configurationAttributes']['core-site'], +- mode = 0644 ++ mode = 0o644 + ) + self.assertResourceCalled('File', '/etc/hadoop/conf/slaves', + content = Template('slaves.j2'), +@@ -230,7 +230,7 @@ + content = Template('hdfs.conf.j2'), + owner = 'root', + group = 'root', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/etc/hadoop/conf/hdfs_dn_jaas.conf', + content = Template('hdfs_dn_jaas.conf.j2'), +@@ -255,7 +255,7 @@ + conf_dir = '/etc/hadoop/conf', + configurations = self.getConfig()['configurations']['core-site'], + configuration_attributes = self.getConfig()['configurationAttributes']['core-site'], +- mode = 0644 ++ mode = 0o644 + ) + self.assertResourceCalled('File', '/etc/hadoop/conf/slaves', + content = Template('slaves.j2'), +@@ -280,13 +280,13 @@ + namenode_status_standby_file = os.path.join(RMFTestCase._getStackTestsFolder(), + self.UPGRADE_STACK_VERSION, "configs", "journalnode-upgrade-namenode-status-standby.json") + +- journalnode_jmx = open(journalnode_jmx_file, 'r').read() +- namenode_jmx = open(namenode_jmx_file, 'r').read() +- namenode_status_active = open(namenode_status_active_file, 'r').read() +- namenode_status_standby = open(namenode_status_standby_file, 'r').read() ++ journalnode_jmx = open(journalnode_jmx_file).read() ++ namenode_jmx = open(namenode_jmx_file).read() ++ namenode_status_active = open(namenode_status_active_file).read() ++ namenode_status_standby = open(namenode_status_standby_file).read() + + import utils +- import urllib2 ++ import urllib.request, urllib.error, urllib.parse + from namenode_ha_state import NamenodeHAState + + url_stream_mock = MagicMock() +@@ -317,7 +317,7 @@ + curl_krb_request_mock = MagicMock(side_effect=(num_journalnodes * [(namenode_jmx, "", 1), (journalnode_jmx, "", 1)])) + + config_file = self.get_src_folder()+"/test/python/stacks/2.2/configs/journalnode-upgrade.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + + # add one more host that is not part of the hdfs-site/dfs.namenode.shared.edits.dir property +@@ -382,7 +382,7 @@ + + def test_pre_upgrade_restart(self): + config_file = self.get_src_folder()+"/test/python/stacks/2.0.6/configs/default.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + version = '2.2.1.0-3242' + json_content['commandParams']['version'] = version +@@ -399,7 +399,7 @@ + @patch("resource_management.core.shell.call") + def test_pre_upgrade_restart_23(self, call_mock): + config_file = self.get_src_folder()+"/test/python/stacks/2.0.6/configs/default.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + version = '2.3.0.0-1234' + json_content['commandParams']['version'] = version +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/HDFS/test_namenode.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/HDFS/test_namenode.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/HDFS/test_namenode.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/HDFS/test_namenode.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 @@ + self.assertResourceCalled('Directory', '/var/run/hadoop', + owner = 'hdfs', + group = 'hadoop', +- mode = 0755 ++ mode = 0o755 + ) + self.assertResourceCalled('Directory', '/var/run/hadoop/hdfs', + owner = 'hdfs', +@@ -118,7 +118,7 @@ + hadoop_conf_dir = '/etc/hadoop/conf', + type = 'directory', + action = ['create_on_execute'], hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', +- mode = 0777, ++ mode = 0o777, + nameservices = None, + ) + self.assertResourceCalled('HdfsResource', '/user/ambari-qa', +@@ -136,7 +136,7 @@ + hadoop_conf_dir = '/etc/hadoop/conf', + type = 'directory', + action = ['create_on_execute'], hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', +- mode = 0770, ++ mode = 0o770, + nameservices = None, + ) + self.assertResourceCalled('HdfsResource', None, +@@ -196,7 +196,7 @@ + self.assertResourceCalled('Directory', '/var/run/hadoop', + owner = 'hdfs', + group = 'hadoop', +- mode = 0755 ++ mode = 0o755 + ) + self.assertResourceCalled('Directory', '/var/run/hadoop/hdfs', + owner = 'hdfs', +@@ -237,7 +237,7 @@ + hadoop_conf_dir = '/etc/hadoop/conf', + type = 'directory', + action = ['create_on_execute'], hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', +- mode = 0777, ++ mode = 0o777, + nameservices = None, + ) + self.assertResourceCalled('HdfsResource', '/user/ambari-qa', +@@ -255,7 +255,7 @@ + hadoop_conf_dir = '/etc/hadoop/conf', + type = 'directory', + action = ['create_on_execute'], hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', +- mode = 0770, ++ mode = 0o770, + nameservices = None, + ) + self.assertResourceCalled('HdfsResource', None, +@@ -328,7 +328,7 @@ + self.assertResourceCalled('Directory', '/var/run/hadoop', + owner = 'hdfs', + group = 'hadoop', +- mode = 0755 ++ mode = 0o755 + ) + self.assertResourceCalled('Directory', '/var/run/hadoop/hdfs', + owner = 'hdfs', +@@ -369,7 +369,7 @@ + hadoop_conf_dir = '/etc/hadoop/conf', + type = 'directory', + action = ['create_on_execute'], hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', hdfs_site=self.getConfig()['configurations']['hdfs-site'], principal_name='hdfs', default_fs='hdfs://c6401.ambari.apache.org:8020', +- mode = 0777, ++ mode = 0o777, + nameservices = None + ) + self.assertResourceCalled('HdfsResource', '/user/ambari-qa', +@@ -384,7 +384,7 @@ + hadoop_conf_dir = '/etc/hadoop/conf', + type = 'directory', + action = ['create_on_execute'], hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', hdfs_site=self.getConfig()['configurations']['hdfs-site'], principal_name='hdfs', default_fs='hdfs://c6401.ambari.apache.org:8020', +- mode = 0770, ++ mode = 0o770, + nameservices = None, + ) + self.assertResourceCalled('HdfsResource', None, +@@ -438,7 +438,7 @@ + self.assertResourceCalled('Directory', '/var/run/hadoop', + owner = 'hdfs', + group = 'hadoop', +- mode = 0755 ++ mode = 0o755 + ) + self.assertResourceCalled('Directory', '/var/run/hadoop/hdfs', + owner = 'hdfs', +@@ -479,7 +479,7 @@ + hadoop_conf_dir = '/etc/hadoop/conf', + type = 'directory', + action = ['create_on_execute'], hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', +- mode = 0777, ++ mode = 0o777, + nameservices = ['ns1'], + ) + self.assertResourceCalled('HdfsResource', '/user/ambari-qa', +@@ -497,7 +497,7 @@ + hadoop_conf_dir = '/etc/hadoop/conf', + type = 'directory', + action = ['create_on_execute'], hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', +- mode = 0770, ++ mode = 0o770, + nameservices = ['ns1'], + ) + self.assertResourceCalled('HdfsResource', None, +@@ -540,7 +540,7 @@ + self.assertResourceCalled('Directory', '/var/run/hadoop', + owner = 'hdfs', + group = 'hadoop', +- mode = 0755 ++ mode = 0o755 + ) + self.assertResourceCalled('Directory', '/var/run/hadoop/hdfs', + owner = 'hdfs', +@@ -581,7 +581,7 @@ + hadoop_conf_dir = '/etc/hadoop/conf', + type = 'directory', + action = ['create_on_execute'], hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', +- mode = 0777, ++ mode = 0o777, + nameservices = ['ns1'], + ) + self.assertResourceCalled('HdfsResource', '/user/ambari-qa', +@@ -599,7 +599,7 @@ + hadoop_conf_dir = '/etc/hadoop/conf', + type = 'directory', + action = ['create_on_execute'], hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', +- mode = 0770, ++ mode = 0o770, + nameservices = ['ns1'], + ) + self.assertResourceCalled('HdfsResource', None, +@@ -644,7 +644,7 @@ + self.assertResourceCalled('Directory', '/var/run/hadoop', + owner = 'hdfs', + group = 'hadoop', +- mode = 0755 ++ mode = 0o755 + ) + self.assertResourceCalled('Directory', '/var/run/hadoop/hdfs', + owner = 'hdfs', +@@ -688,7 +688,7 @@ + hadoop_conf_dir = '/etc/hadoop/conf', + type = 'directory', + action = ['create_on_execute'], hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', +- mode = 0777, ++ mode = 0o777, + nameservices = None, + ) + self.assertResourceCalled('HdfsResource', '/user/ambari-qa', +@@ -706,7 +706,7 @@ + hadoop_conf_dir = '/etc/hadoop/conf', + type = 'directory', + action = ['create_on_execute'], hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', +- mode = 0770, ++ mode = 0o770, + nameservices = None, + ) + self.assertResourceCalled('HdfsResource', None, +@@ -763,7 +763,7 @@ + self.assertResourceCalled('Directory', '/var/run/hadoop', + owner = 'hdfs', + group = 'hadoop', +- mode = 0755 ++ mode = 0o755 + ) + self.assertResourceCalled('Directory', '/var/run/hadoop/hdfs', + owner = 'hdfs', +@@ -804,7 +804,7 @@ + hadoop_conf_dir = '/etc/hadoop/conf', + type = 'directory', + action = ['create_on_execute'], hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', +- mode = 0777, ++ mode = 0o777, + nameservices = None, + ) + self.assertResourceCalled('HdfsResource', '/user/ambari-qa', +@@ -822,7 +822,7 @@ + hadoop_conf_dir = '/etc/hadoop/conf', + type = 'directory', + action = ['create_on_execute'], hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', +- mode = 0770, ++ mode = 0o770, + nameservices = None, + ) + self.assertResourceCalled('HdfsResource', None, +@@ -875,7 +875,7 @@ + self.assertResourceCalled('Directory', '/var/run/hadoop', + owner = 'hdfs', + group = 'hadoop', +- mode = 0755 ++ mode = 0o755 + ) + + # TODO: Using shell.call() to bootstrap standby which is patched to return status code '5' (i.e. already bootstrapped) +@@ -903,7 +903,7 @@ + self.assertTrue(call_mocks.called) + self.assertEqual(1, call_mocks.call_count) + calls = [ +- call('hdfs namenode -bootstrapStandby -nonInteractive', logoutput=False, user=u'hdfs')] ++ call('hdfs namenode -bootstrapStandby -nonInteractive', logoutput=False, user='hdfs')] + call_mocks.assert_has_calls(calls, any_order=False) + + # tests namenode start command when NameNode HA is enabled, and +@@ -941,7 +941,7 @@ + self.assertResourceCalled('Directory', '/var/run/hadoop', + owner = 'hdfs', + group = 'hadoop', +- mode = 0755 ++ mode = 0o755 + ) + + # TODO: Using shell.call() to bootstrap standby which is patched to return status code '5' (i.e. already bootstrapped) +@@ -969,8 +969,8 @@ + self.assertTrue(call_mocks.called) + self.assertEqual(2, call_mocks.call_count) + calls = [ +- call('hdfs namenode -bootstrapStandby -nonInteractive -force', logoutput=False, user=u'hdfs'), +- call('hdfs namenode -bootstrapStandby -nonInteractive -force', logoutput=False, user=u'hdfs')] ++ call('hdfs namenode -bootstrapStandby -nonInteractive -force', logoutput=False, user='hdfs'), ++ call('hdfs namenode -bootstrapStandby -nonInteractive -force', logoutput=False, user='hdfs')] + call_mocks.assert_has_calls(calls, any_order=True) + + +@@ -1006,7 +1006,7 @@ + self.assertResourceCalled('Directory', '/var/run/hadoop', + owner = 'hdfs', + group = 'hadoop', +- mode = 0755 ++ mode = 0o755 + ) + + # TODO: Using shell.call() to bootstrap standby which is patched to return status code '5' (i.e. already bootstrapped) +@@ -1034,8 +1034,8 @@ + self.assertTrue(call_mocks.called) + self.assertEqual(2, call_mocks.call_count) + calls = [ +- call('hdfs namenode -bootstrapStandby -nonInteractive -force', logoutput=False, user=u'hdfs'), +- call('hdfs namenode -bootstrapStandby -nonInteractive -force', logoutput=False, user=u'hdfs')] ++ call('hdfs namenode -bootstrapStandby -nonInteractive -force', logoutput=False, user='hdfs'), ++ call('hdfs namenode -bootstrapStandby -nonInteractive -force', logoutput=False, user='hdfs')] + call_mocks.assert_has_calls(calls, any_order=True) + + def test_decommission_default(self): +@@ -1144,7 +1144,7 @@ + content = Template('hdfs.conf.j2'), + owner = 'root', + group = 'root', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('XmlConfig', 'hdfs-site.xml', + owner = 'hdfs', +@@ -1159,7 +1159,7 @@ + conf_dir = '/etc/hadoop/conf', + configurations = self.getConfig()['configurations']['core-site'], + configuration_attributes = self.getConfig()['configurationAttributes']['core-site'], +- mode = 0644 ++ mode = 0o644 + ) + self.assertResourceCalled('File', '/etc/hadoop/conf/slaves', + content = Template('slaves.j2'), +@@ -1170,7 +1170,7 @@ + owner = 'hdfs', + group = 'hadoop', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + cd_access='a' + ) + +@@ -1196,7 +1196,7 @@ + content = Template('hdfs.conf.j2'), + owner = 'root', + group = 'root', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/etc/hadoop/conf/hdfs_dn_jaas.conf', + content = Template('hdfs_dn_jaas.conf.j2'), +@@ -1227,7 +1227,7 @@ + conf_dir = '/etc/hadoop/conf', + configurations = self.getConfig()['configurations']['core-site'], + configuration_attributes = self.getConfig()['configurationAttributes']['core-site'], +- mode = 0644 ++ mode = 0o644 + ) + self.assertResourceCalled('File', '/etc/hadoop/conf/slaves', + content = Template('slaves.j2'), +@@ -1238,7 +1238,7 @@ + owner = 'hdfs', + group = 'hadoop', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + cd_access='a' + ) + +@@ -1277,8 +1277,8 @@ + ) + tempdir = tempfile.gettempdir() + ccache_path = os.path.join(tempfile.gettempdir(), "hdfs_rebalance_cc_676e87466798ee1b4128732da3effe26e7dfc902e2c9ebdfde4331d2") +- kinit_cmd = "/usr/bin/kinit -c {0} -kt /etc/security/keytabs/hdfs.headless.keytab hdfs@EXAMPLE.COM".format(ccache_path) +- rebalance_cmd = "ambari-sudo.sh su hdfs -l -s /bin/bash -c 'export PATH=/bin:/usr/bin KRB5CCNAME={0} ; hdfs --config /etc/hadoop/conf balancer -threshold -1'".format(ccache_path) ++ kinit_cmd = "/usr/bin/kinit -c {} -kt /etc/security/keytabs/hdfs.headless.keytab hdfs@EXAMPLE.COM".format(ccache_path) ++ rebalance_cmd = "ambari-sudo.sh su hdfs -l -s /bin/bash -c 'export PATH=/bin:/usr/bin KRB5CCNAME={} ; hdfs --config /etc/hadoop/conf balancer -threshold -1'".format(ccache_path) + + self.assertResourceCalled('Execute', kinit_cmd, + user = 'hdfs', +@@ -1305,7 +1305,7 @@ + stack_version = self.STACK_VERSION, target = RMFTestCase.TARGET_COMMON_SERVICES ) + + self.fail("Expected a failure since the ranger install.properties was missing") +- except Fail, failure: ++ except Fail as failure: + pass + + self.assertTrue(isfile_mock.called) +@@ -1346,10 +1346,10 @@ + pass + + self.assertFalse(0 == len(Script.structuredOut)) +- self.assertTrue(Script.structuredOut.has_key("upgrade_type")) +- self.assertTrue(Script.structuredOut.has_key("direction")) +- self.assertEquals("rolling_upgrade", Script.structuredOut["upgrade_type"]) +- self.assertEquals("UPGRADE", Script.structuredOut["direction"]) ++ self.assertTrue("upgrade_type" in Script.structuredOut) ++ self.assertTrue("direction" in Script.structuredOut) ++ self.assertEqual("rolling_upgrade", Script.structuredOut["upgrade_type"]) ++ self.assertEqual("UPGRADE", Script.structuredOut["direction"]) + + @patch("resource_management.libraries.script.Script.post_start") + @patch("resource_management.libraries.functions.namenode_ha_utils.get_namenode_states") +@@ -1623,10 +1623,10 @@ + call_mocks = [(0, None), (0, None), (0, None), (0, None), (0, None), (0, None), (0, None)], + mocks_dict = mocks_dict) + import sys +- self.assertEquals("/etc/hadoop/conf", sys.modules["params"].hadoop_conf_dir) +- self.assertEquals("/usr/lib/hadoop/libexec", sys.modules["params"].hadoop_libexec_dir) +- self.assertEquals("/usr/bin", sys.modules["params"].hadoop_bin_dir) +- self.assertEquals("/usr/lib/hadoop/sbin", sys.modules["params"].hadoop_bin) ++ self.assertEqual("/etc/hadoop/conf", sys.modules["params"].hadoop_conf_dir) ++ self.assertEqual("/usr/lib/hadoop/libexec", sys.modules["params"].hadoop_libexec_dir) ++ self.assertEqual("/usr/bin", sys.modules["params"].hadoop_bin_dir) ++ self.assertEqual("/usr/lib/hadoop/sbin", sys.modules["params"].hadoop_bin) + + @patch.object(shell, "call") + @patch("resource_management.core.sudo.path_isdir", new = MagicMock(return_value = True)) +@@ -1650,10 +1650,10 @@ + call_mocks = [(0, None), (0, None), (0, None), (0, None), (0, None), (0, None), (0, None)], + mocks_dict = mocks_dict) + import sys +- self.assertEquals("/etc/hadoop/conf", sys.modules["params"].hadoop_conf_dir) +- self.assertEquals("/usr/hdp/{0}/hadoop/libexec".format(version), sys.modules["params"].hadoop_libexec_dir) +- self.assertEquals("/usr/hdp/{0}/hadoop/bin".format(version), sys.modules["params"].hadoop_bin_dir) +- self.assertEquals("/usr/hdp/{0}/hadoop/sbin".format(version), sys.modules["params"].hadoop_bin) ++ self.assertEqual("/etc/hadoop/conf", sys.modules["params"].hadoop_conf_dir) ++ self.assertEqual("/usr/hdp/{}/hadoop/libexec".format(version), sys.modules["params"].hadoop_libexec_dir) ++ self.assertEqual("/usr/hdp/{}/hadoop/bin".format(version), sys.modules["params"].hadoop_bin_dir) ++ self.assertEqual("/usr/hdp/{}/hadoop/sbin".format(version), sys.modules["params"].hadoop_bin) + + @patch.object(shell, "call") + def test_pre_upgrade_restart_23_params(self, call_mock): +@@ -1679,10 +1679,10 @@ + + + import sys +- self.assertEquals("/usr/hdp/2.3.0.0-1234/hadoop/conf", sys.modules["params"].hadoop_conf_dir) +- self.assertEquals("/usr/hdp/2.3.0.0-1234/hadoop/libexec", sys.modules["params"].hadoop_libexec_dir) +- self.assertEquals("/usr/hdp/2.3.0.0-1234/hadoop/bin", sys.modules["params"].hadoop_bin_dir) +- self.assertEquals("/usr/hdp/2.3.0.0-1234/hadoop/sbin", sys.modules["params"].hadoop_bin) ++ self.assertEqual("/usr/hdp/2.3.0.0-1234/hadoop/conf", sys.modules["params"].hadoop_conf_dir) ++ self.assertEqual("/usr/hdp/2.3.0.0-1234/hadoop/libexec", sys.modules["params"].hadoop_libexec_dir) ++ self.assertEqual("/usr/hdp/2.3.0.0-1234/hadoop/bin", sys.modules["params"].hadoop_bin_dir) ++ self.assertEqual("/usr/hdp/2.3.0.0-1234/hadoop/sbin", sys.modules["params"].hadoop_bin) + + + @patch("namenode_upgrade.create_upgrade_marker", MagicMock()) +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/HDFS/test_nfsgateway.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/HDFS/test_nfsgateway.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/HDFS/test_nfsgateway.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/HDFS/test_nfsgateway.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 json + from stacks.utils.RMFTestCase import * +-from mock.mock import MagicMock, patch ++from unittest.mock import MagicMock, patch + from resource_management.libraries.script.script import Script + + from only_for_platform import not_for_platform, PLATFORM_WINDOWS +@@ -61,7 +61,7 @@ + self.assertResourceCalled('Directory', '/var/run/hadoop', + owner = 'root', + group = 'root', +- mode = 0755 ++ mode = 0o755 + ) + self.assertResourceCalled('Directory', '/var/run/hadoop/root', + owner = 'root', +@@ -71,7 +71,7 @@ + self.assertResourceCalled('Directory', '/var/log/hadoop/root', + owner = 'root', + group = 'hadoop', +- mode = 0775 ++ mode = 0o775 + ) + self.assertResourceCalled('File', '/var/run/hadoop/root/hadoop_privileged_nfs3.pid', + action = ['delete'], +@@ -79,9 +79,9 @@ + ) + self.assertResourceCalled('Execute', 'ambari-sudo.sh [RMF_ENV_PLACEHOLDER] -H -E /usr/lib/hadoop/sbin/hadoop-daemon.sh --config /etc/hadoop/conf start nfs3', + environment = {'HADOOP_LIBEXEC_DIR': '/usr/lib/hadoop/libexec', +- 'HADOOP_PRIVILEGED_NFS_LOG_DIR': u'/var/log/hadoop/root', +- 'HADOOP_PRIVILEGED_NFS_PID_DIR': u'/var/run/hadoop/root', +- 'HADOOP_PRIVILEGED_NFS_USER': u'hdfs'}, ++ 'HADOOP_PRIVILEGED_NFS_LOG_DIR': '/var/log/hadoop/root', ++ 'HADOOP_PRIVILEGED_NFS_PID_DIR': '/var/run/hadoop/root', ++ 'HADOOP_PRIVILEGED_NFS_USER': 'hdfs'}, + not_if = "ambari-sudo.sh [RMF_ENV_PLACEHOLDER] -H -E test -f /var/run/hadoop/root/hadoop_privileged_nfs3.pid && ambari-sudo.sh [RMF_ENV_PLACEHOLDER] -H -E pgrep -F /var/run/hadoop/root/hadoop_privileged_nfs3.pid", + ) + self.assertNoMoreResources() +@@ -96,9 +96,9 @@ + ) + self.assertResourceCalled('Execute', 'ambari-sudo.sh [RMF_ENV_PLACEHOLDER] -H -E /usr/lib/hadoop/sbin/hadoop-daemon.sh --config /etc/hadoop/conf stop nfs3', + environment = {'HADOOP_LIBEXEC_DIR': '/usr/lib/hadoop/libexec', +- 'HADOOP_PRIVILEGED_NFS_LOG_DIR': u'/var/log/hadoop/root', +- 'HADOOP_PRIVILEGED_NFS_PID_DIR': u'/var/run/hadoop/root', +- 'HADOOP_PRIVILEGED_NFS_USER': u'hdfs'}, ++ 'HADOOP_PRIVILEGED_NFS_LOG_DIR': '/var/log/hadoop/root', ++ 'HADOOP_PRIVILEGED_NFS_PID_DIR': '/var/run/hadoop/root', ++ 'HADOOP_PRIVILEGED_NFS_USER': 'hdfs'}, + only_if = "ambari-sudo.sh [RMF_ENV_PLACEHOLDER] -H -E test -f /var/run/hadoop/root/hadoop_privileged_nfs3.pid && ambari-sudo.sh [RMF_ENV_PLACEHOLDER] -H -E pgrep -F /var/run/hadoop/root/hadoop_privileged_nfs3.pid") + + self.assertResourceCalled('File', '/var/run/hadoop/root/hadoop_privileged_nfs3.pid', action = ['delete']) +@@ -129,7 +129,7 @@ + self.assertResourceCalled('Directory', '/var/run/hadoop', + owner = 'root', + group = 'root', +- mode = 0755 ++ mode = 0o755 + ) + self.assertResourceCalled('Directory', '/var/run/hadoop/root', + owner = 'root', +@@ -139,7 +139,7 @@ + self.assertResourceCalled('Directory', '/var/log/hadoop/root', + owner = 'root', + group = 'hadoop', +- mode = 0775 ++ mode = 0o775 + ) + self.assertResourceCalled('File', '/var/run/hadoop/root/hadoop_privileged_nfs3.pid', + action = ['delete'], +@@ -147,9 +147,9 @@ + ) + self.assertResourceCalled('Execute', 'ambari-sudo.sh [RMF_ENV_PLACEHOLDER] -H -E /usr/lib/hadoop/sbin/hadoop-daemon.sh --config /etc/hadoop/conf start nfs3', + environment = {'HADOOP_LIBEXEC_DIR': '/usr/lib/hadoop/libexec', +- 'HADOOP_PRIVILEGED_NFS_LOG_DIR': u'/var/log/hadoop/root', +- 'HADOOP_PRIVILEGED_NFS_PID_DIR': u'/var/run/hadoop/root', +- 'HADOOP_PRIVILEGED_NFS_USER': u'hdfs'}, ++ 'HADOOP_PRIVILEGED_NFS_LOG_DIR': '/var/log/hadoop/root', ++ 'HADOOP_PRIVILEGED_NFS_PID_DIR': '/var/run/hadoop/root', ++ 'HADOOP_PRIVILEGED_NFS_USER': 'hdfs'}, + not_if = "ambari-sudo.sh [RMF_ENV_PLACEHOLDER] -H -E test -f /var/run/hadoop/root/hadoop_privileged_nfs3.pid && ambari-sudo.sh [RMF_ENV_PLACEHOLDER] -H -E pgrep -F /var/run/hadoop/root/hadoop_privileged_nfs3.pid", + ) + self.assertNoMoreResources() +@@ -164,9 +164,9 @@ + ) + self.assertResourceCalled('Execute', 'ambari-sudo.sh [RMF_ENV_PLACEHOLDER] -H -E /usr/lib/hadoop/sbin/hadoop-daemon.sh --config /etc/hadoop/conf stop nfs3', + environment = {'HADOOP_LIBEXEC_DIR': '/usr/lib/hadoop/libexec', +- 'HADOOP_PRIVILEGED_NFS_LOG_DIR': u'/var/log/hadoop/root', +- 'HADOOP_PRIVILEGED_NFS_PID_DIR': u'/var/run/hadoop/root', +- 'HADOOP_PRIVILEGED_NFS_USER': u'hdfs'}, ++ 'HADOOP_PRIVILEGED_NFS_LOG_DIR': '/var/log/hadoop/root', ++ 'HADOOP_PRIVILEGED_NFS_PID_DIR': '/var/run/hadoop/root', ++ 'HADOOP_PRIVILEGED_NFS_USER': 'hdfs'}, + only_if = "ambari-sudo.sh [RMF_ENV_PLACEHOLDER] -H -E test -f /var/run/hadoop/root/hadoop_privileged_nfs3.pid && ambari-sudo.sh [RMF_ENV_PLACEHOLDER] -H -E pgrep -F /var/run/hadoop/root/hadoop_privileged_nfs3.pid") + + self.assertResourceCalled('File', '/var/run/hadoop/root/hadoop_privileged_nfs3.pid', action = ['delete']) +@@ -194,7 +194,7 @@ + content = Template('hdfs.conf.j2'), + owner = 'root', + group = 'root', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('XmlConfig', 'hdfs-site.xml', + owner = 'hdfs', +@@ -209,7 +209,7 @@ + conf_dir = '/etc/hadoop/conf', + configurations = self.getConfig()['configurations']['core-site'], + configuration_attributes = self.getConfig()['configurationAttributes']['core-site'], +- mode = 0644 ++ mode = 0o644 + ) + self.assertResourceCalled('File', '/etc/hadoop/conf/slaves', + content = Template('slaves.j2'), +@@ -243,7 +243,7 @@ + content = Template('hdfs.conf.j2'), + owner = 'root', + group = 'root', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/etc/hadoop/conf/hdfs_dn_jaas.conf', + content = Template('hdfs_dn_jaas.conf.j2'), +@@ -268,7 +268,7 @@ + conf_dir = '/etc/hadoop/conf', + configurations = self.getConfig()['configurations']['core-site'], + configuration_attributes = self.getConfig()['configurationAttributes']['core-site'], +- mode = 0644 ++ mode = 0o644 + ) + self.assertResourceCalled('File', '/etc/hadoop/conf/slaves', + content = Template('slaves.j2'), +@@ -283,7 +283,7 @@ + def test_pre_upgrade_restart(self, call_mock): + call_mock.side_effects = [(0, None), (0, None)] + config_file = self.get_src_folder()+"/test/python/stacks/2.0.6/configs/default.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + version = '2.3.1.0-3242' + json_content['commandParams']['version'] = version +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/HDFS/test_service_check.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/HDFS/test_service_check.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/HDFS/test_service_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/HDFS/test_service_check.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 @@ + ''' + from stacks.utils.RMFTestCase import * + import resource_management.libraries.functions +-from mock.mock import MagicMock, call, patch ++from unittest.mock import MagicMock, call, patch + + @patch.object(resource_management.libraries.functions, "get_unique_id_and_date", new = MagicMock(return_value='')) + class TestServiceCheck(RMFTestCase): +@@ -74,7 +74,7 @@ + action = ['create_on_execute'], hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', + hadoop_conf_dir = '/etc/hadoop/conf', + type = 'directory', +- mode = 0777, ++ mode = 0o777, + ) + self.assertResourceCalled('HdfsResource', '/tmp/', + immutable_paths = self.DEFAULT_IMMUTABLE_PATHS, +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/HDFS/test_snamenode.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/HDFS/test_snamenode.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/HDFS/test_snamenode.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/HDFS/test_snamenode.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 @@ + ''' + from stacks.utils.RMFTestCase import * + from ambari_commons import OSCheck +-from mock.mock import MagicMock, patch ++from unittest.mock import MagicMock, patch + + class TestSNamenode(RMFTestCase): + COMMON_SERVICES_PACKAGE_DIR = "HDFS/2.1.0.2.0/package" +@@ -58,7 +58,7 @@ + self.assertResourceCalled('Directory', '/var/run/hadoop', + owner = 'hdfs', + group = 'hadoop', +- mode = 0755 ++ mode = 0o755 + ) + self.assertResourceCalled('Directory', '/var/run/hadoop/hdfs', + owner = 'hdfs', +@@ -128,7 +128,7 @@ + self.assertResourceCalled('Directory', '/var/run/hadoop', + owner = 'hdfs', + group = 'hadoop', +- mode = 0755 ++ mode = 0o755 + ) + self.assertResourceCalled('Directory', '/var/run/hadoop/hdfs', + owner = 'hdfs', +@@ -187,7 +187,7 @@ + content = Template('hdfs.conf.j2'), + owner = 'root', + group = 'root', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('XmlConfig', 'hdfs-site.xml', + owner = 'hdfs', +@@ -202,7 +202,7 @@ + conf_dir = '/etc/hadoop/conf', + configurations = self.getConfig()['configurations']['core-site'], + configuration_attributes = self.getConfig()['configurationAttributes']['core-site'], +- mode = 0644 ++ mode = 0o644 + ) + self.assertResourceCalled('File', '/etc/hadoop/conf/slaves', + content = Template('slaves.j2'), +@@ -212,14 +212,14 @@ + self.assertResourceCalled('Directory', '/hadoop/hdfs/namesecondary', + owner = 'hdfs', + group = 'hadoop', +- mode = 0755, ++ mode = 0o755, + create_parents = True, + cd_access='a' + ) + self.assertResourceCalled('Directory', '/hadoop/hdfs/namesecondary2', + owner = 'hdfs', + group = 'hadoop', +- mode = 0755, ++ mode = 0o755, + create_parents = True, + cd_access='a' + ) +@@ -246,7 +246,7 @@ + content = Template('hdfs.conf.j2'), + owner = 'root', + group = 'root', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/etc/hadoop/conf/hdfs_dn_jaas.conf', + content = Template('hdfs_dn_jaas.conf.j2'), +@@ -271,7 +271,7 @@ + conf_dir = '/etc/hadoop/conf', + configurations = self.getConfig()['configurations']['core-site'], + configuration_attributes = self.getConfig()['configurationAttributes']['core-site'], +- mode = 0644 ++ mode = 0o644 + ) + self.assertResourceCalled('File', '/etc/hadoop/conf/slaves', + content = Template('slaves.j2'), +@@ -281,7 +281,7 @@ + self.assertResourceCalled('Directory', '/hadoop/hdfs/namesecondary', + owner = 'hdfs', + group = 'hadoop', +- mode = 0755, ++ mode = 0o755, + create_parents = True, + cd_access='a' + ) +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/HDFS/test_zkfc.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/HDFS/test_zkfc.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/HDFS/test_zkfc.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/HDFS/test_zkfc.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 @@ + ''' + from stacks.utils.RMFTestCase import * + from ambari_commons import OSCheck +-from mock.mock import MagicMock, patch ++from unittest.mock import MagicMock, patch + from resource_management.core import shell + + class TestZkfc(RMFTestCase): +@@ -55,7 +55,7 @@ + content = Template('hdfs.conf.j2'), + owner = 'root', + group = 'root', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('XmlConfig', 'hdfs-site.xml', + owner = 'hdfs', +@@ -70,7 +70,7 @@ + conf_dir = '/etc/hadoop/conf', + configurations = self.getConfig()['configurations']['core-site'], + configuration_attributes = self.getConfig()['configurationAttributes']['core-site'], +- mode = 0644 ++ mode = 0o644 + ) + self.assertResourceCalled('File', '/etc/hadoop/conf/slaves', + content = Template('slaves.j2'), +@@ -80,12 +80,12 @@ + self.assertResourceCalled('Directory', '/var/run/hadoop', + owner = 'hdfs', + group = 'hadoop', +- mode = 0755 ++ mode = 0o755 + ) + self.assertResourceCalled('Directory', '/var/run/hadoop', + owner = 'hdfs', + group = 'hadoop', +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('Directory', '/var/run/hadoop/hdfs', + owner = 'hdfs', +@@ -152,7 +152,7 @@ + content = Template('hdfs.conf.j2'), + owner = 'root', + group = 'root', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/etc/hadoop/conf/hdfs_dn_jaas.conf', + content = Template('hdfs_dn_jaas.conf.j2'), +@@ -182,7 +182,7 @@ + conf_dir = '/etc/hadoop/conf', + configurations = self.getConfig()['configurations']['core-site'], + configuration_attributes = self.getConfig()['configurationAttributes']['core-site'], +- mode = 0644 ++ mode = 0o644 + ) + self.assertResourceCalled('File', '/etc/hadoop/conf/slaves', + content = Template('slaves.j2'), +@@ -192,12 +192,12 @@ + self.assertResourceCalled('Directory', '/var/run/hadoop', + owner = 'hdfs', + group = 'hadoop', +- mode = 0755 ++ mode = 0o755 + ) + self.assertResourceCalled('Directory', '/var/run/hadoop', + owner = 'hdfs', + group = 'hadoop', +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('Directory', '/var/run/hadoop/hdfs', + owner = 'hdfs', +@@ -263,7 +263,7 @@ + content = Template('hdfs.conf.j2'), + owner = 'root', + group = 'root', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('XmlConfig', 'hdfs-site.xml', + owner = 'hdfs', +@@ -278,7 +278,7 @@ + conf_dir = '/etc/hadoop/conf', + configurations = self.getConfig()['configurations']['core-site'], + configuration_attributes = self.getConfig()['configurationAttributes']['core-site'], +- mode = 0644 ++ mode = 0o644 + ) + self.assertResourceCalled('File', '/etc/hadoop/conf/slaves', + content = Template('slaves.j2'), +@@ -288,13 +288,13 @@ + self.assertResourceCalled('Directory', '/var/run/hadoop', + owner = 'hdfs', + group = 'hadoop', +- mode = 0755 ++ mode = 0o755 + ) + # TODO: verify that the znode initialization occurs prior to ZKFC startup + self.assertResourceCalled('Directory', '/var/run/hadoop', + owner = 'hdfs', + group = 'hadoop', +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('Directory', '/var/run/hadoop/hdfs', + owner = 'hdfs', +@@ -345,7 +345,7 @@ + content = Template('hdfs.conf.j2'), + owner = 'root', + group = 'root', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('XmlConfig', 'hdfs-site.xml', + owner = 'hdfs', +@@ -360,7 +360,7 @@ + conf_dir = '/etc/hadoop/conf', + configurations = self.getConfig()['configurations']['core-site'], + configuration_attributes = self.getConfig()['configurationAttributes']['core-site'], +- mode = 0644 ++ mode = 0o644 + ) + self.assertResourceCalled('File', '/etc/hadoop/conf/slaves', + content = Template('slaves.j2'), +@@ -370,13 +370,13 @@ + self.assertResourceCalled('Directory', '/var/run/hadoop', + owner = 'hdfs', + group = 'hadoop', +- mode = 0755 ++ mode = 0o755 + ) + # TODO: verify that the znode initialization occurs prior to ZKFC startup + self.assertResourceCalled('Directory', '/var/run/hadoop', + owner = 'hdfs', + group = 'hadoop', +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('Directory', '/var/run/hadoop/hdfs', + owner = 'hdfs', +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/HIVE/test_hcat_client.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/HIVE/test_hcat_client.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/HIVE/test_hcat_client.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/HIVE/test_hcat_client.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 json +-from mock.mock import MagicMock, call, patch ++from unittest.mock import MagicMock, call, patch + from stacks.utils.RMFTestCase import * + + class TestHcatClient(RMFTestCase): +@@ -52,7 +52,7 @@ + self.assertResourceCalled('XmlConfig', 'hive-site.xml', + owner = 'hive', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + conf_dir = '/usr/hdp/current/hive-server2/conf', + configurations = self.getConfig()['configurations']['hive-site'], + configuration_attributes = self.getConfig()['configurationAttributes']['hive-site'] +@@ -91,7 +91,7 @@ + self.assertResourceCalled('XmlConfig', 'hive-site.xml', + owner = 'hive', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + conf_dir = '/usr/hdp/current/hive-server2/conf', + configurations = self.getConfig()['configurations']['hive-site'], + configuration_attributes = self.getConfig()['configurationAttributes']['hive-site'] +@@ -108,7 +108,7 @@ + @patch("resource_management.core.shell.call") + def test_pre_upgrade_restart(self, call_mock): + config_file = self.get_src_folder()+"/test/python/stacks/2.0.6/configs/default.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + + version = '2.3.0.0-1234' +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/HIVE/test_hive_client.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/HIVE/test_hive_client.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/HIVE/test_hive_client.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/HIVE/test_hive_client.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 json +-from mock.mock import MagicMock, call, patch ++from unittest.mock import MagicMock, call, patch + from stacks.utils.RMFTestCase import * + + class TestHiveClient(RMFTestCase): +@@ -37,18 +37,18 @@ + target = RMFTestCase.TARGET_COMMON_SERVICES + ) + self.assertResourceCalled('Directory', '/etc/hive', +- mode = 0755 ++ mode = 0o755 + ) + self.assertResourceCalled('Directory', '/usr/hdp/current/hive-client/conf', + owner = 'hive', + group = 'hadoop', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('XmlConfig', 'mapred-site.xml', + group = 'hadoop', + conf_dir = '/usr/hdp/current/hive-client/conf', +- mode = 0644, ++ mode = 0o644, + configuration_attributes = self.getConfig()['configurationAttributes']['mapred-site'], + owner = 'hive', + configurations = self.getConfig()['configurations']['mapred-site'], +@@ -56,29 +56,29 @@ + self.assertResourceCalled('File', '/usr/hdp/current/hive-client/conf/hive-default.xml.template', + owner = 'hive', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/usr/hdp/current/hive-client/conf/hive-env.sh.template', + owner = 'hive', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/usr/hdp/current/hive-client/conf/hive-exec-log4j.properties', + content = InlineTemplate('log4jproperties\nline2'), + owner = 'hive', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/usr/hdp/current/hive-client/conf/hive-log4j.properties', + content = InlineTemplate('log4jproperties\nline2'), + owner = 'hive', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('XmlConfig', 'hive-site.xml', + group = 'hadoop', + conf_dir = '/usr/hdp/current/hive-client/conf', +- mode = 0644, ++ mode = 0o644, + configuration_attributes = self.getConfig()['configurationAttributes']['hive-site'], + owner = 'hive', + configurations = self.getConfig()['configurations']['hive-site'], +@@ -87,7 +87,7 @@ + content = InlineTemplate(self.getConfig()['configurations']['hive-env']['content']), + owner = 'hive', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('Directory', '/etc/security/limits.d', + owner = 'root', +@@ -98,11 +98,11 @@ + content = Template('hive.conf.j2'), + owner = 'root', + group = 'root', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/usr/lib/ambari-agent/DBConnectionVerification.jar', + content = DownloadSource('http://c6401.ambari.apache.org:8080/resources/DBConnectionVerification.jar'), +- mode = 0644, ++ mode = 0o644, + ) + self.assertNoMoreResources() + +@@ -118,18 +118,18 @@ + target = RMFTestCase.TARGET_COMMON_SERVICES + ) + self.assertResourceCalled('Directory', '/etc/hive', +- mode = 0755 ++ mode = 0o755 + ) + self.assertResourceCalled('Directory', '/usr/hdp/current/hive-client/conf', + owner = 'hive', + group = 'hadoop', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('XmlConfig', 'mapred-site.xml', + group = 'hadoop', + conf_dir = '/usr/hdp/current/hive-client/conf', +- mode = 0644, ++ mode = 0o644, + configuration_attributes = self.getConfig()['configurationAttributes']['mapred-site'], + owner = 'hive', + configurations = self.getConfig()['configurations']['mapred-site'], +@@ -137,29 +137,29 @@ + self.assertResourceCalled('File', '/usr/hdp/current/hive-client/conf/hive-default.xml.template', + owner = 'hive', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/usr/hdp/current/hive-client/conf/hive-env.sh.template', + owner = 'hive', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/usr/hdp/current/hive-client/conf/hive-exec-log4j.properties', + content = InlineTemplate('log4jproperties\nline2'), + owner = 'hive', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/usr/hdp/current/hive-client/conf/hive-log4j.properties', + content = InlineTemplate('log4jproperties\nline2'), + owner = 'hive', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('XmlConfig', 'hive-site.xml', + group = 'hadoop', + conf_dir = '/usr/hdp/current/hive-client/conf', +- mode = 0644, ++ mode = 0o644, + configuration_attributes = self.getConfig()['configurationAttributes']['hive-site'], + owner = 'hive', + configurations = self.getConfig()['configurations']['hive-site'], +@@ -168,7 +168,7 @@ + content = InlineTemplate(self.getConfig()['configurations']['hive-env']['content']), + owner = 'hive', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('Directory', '/etc/security/limits.d', + owner = 'root', +@@ -179,7 +179,7 @@ + content = Template('hive.conf.j2'), + owner = 'root', + group = 'root', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/usr/hdp/current/hive-client/conf/zkmigrator_jaas.conf', + content = Template('zkmigrator_jaas.conf.j2'), +@@ -188,13 +188,13 @@ + ) + self.assertResourceCalled('File', '/usr/lib/ambari-agent/DBConnectionVerification.jar', + content = DownloadSource('http://c6401.ambari.apache.org:8080/resources/DBConnectionVerification.jar'), +- mode = 0644, ++ mode = 0o644, + ) + self.assertNoMoreResources() + + def test_pre_upgrade_restart(self): + config_file = self.get_src_folder()+"/test/python/stacks/2.0.6/configs/default.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + version = '2.2.1.0-3242' + json_content['commandParams']['version'] = version +@@ -214,7 +214,7 @@ + def test_pre_upgrade_restart_23(self, call_mock, os_path__exists_mock): + config_file = self.get_src_folder()+"/test/python/stacks/2.0.6/configs/default.json" + os_path__exists_mock.return_value = False +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + version = '2.3.0.0-1234' + json_content['commandParams']['version'] = version +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/HIVE/test_hive_metastore.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/HIVE/test_hive_metastore.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/HIVE/test_hive_metastore.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/HIVE/test_hive_metastore.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 mock.mock import MagicMock, call, patch ++from unittest.mock import MagicMock, call, patch + from stacks.utils.RMFTestCase import * + + from resource_management.libraries.functions import stack_features +@@ -64,19 +64,19 @@ + self.assert_init_schema() + self.assertResourceCalled('Execute', '/tmp/start_metastore_script /var/log/hive/hive.out /var/log/hive/hive.err /var/run/hive/hive.pid /usr/hdp/current/hive-server2/conf/conf.server /var/log/hive', + environment = { 'HIVE_CMD': '/usr/hdp/current/hive-server2/bin/hive', +- 'JAVA_HOME': u'/usr/jdk64/jdk1.7.0_45'}, ++ 'JAVA_HOME': '/usr/jdk64/jdk1.7.0_45'}, + not_if = "ls /var/run/hive/hive.pid >/dev/null 2>&1 && ps -p 123 >/dev/null 2>&1", + user = 'hive', + path = ['/bin:/usr/hdp/current/hive-server2/bin:/usr/hdp/current/hadoop-client/bin'], + ) +- self.assertResourceCalled('Execute', (u'/usr/jdk64/jdk1.7.0_45/bin/java', ++ self.assertResourceCalled('Execute', ('/usr/jdk64/jdk1.7.0_45/bin/java', + '-cp', + '/usr/lib/ambari-agent/DBConnectionVerification.jar:/usr/hdp/current/hive-server2/lib/mysql-connector-java.jar', + 'org.apache.ambari.server.DBConnectionVerification', +- u'jdbc:mysql://c6402.ambari.apache.org/hive?createDatabaseIfNotExist=true', +- u'hive', ++ 'jdbc:mysql://c6402.ambari.apache.org/hive?createDatabaseIfNotExist=true', ++ 'hive', + PasswordString("!`\"' 1"), +- u'com.mysql.jdbc.Driver'), ++ 'com.mysql.jdbc.Driver'), + path = ['/usr/sbin:/sbin:/usr/local/bin:/bin:/usr/bin'], + tries = 5, + try_sleep = 10, +@@ -131,19 +131,19 @@ + self.assert_init_schema() + self.assertResourceCalled('Execute', '/tmp/start_metastore_script /var/log/hive/hive.out /var/log/hive/hive.err /var/run/hive/hive.pid /usr/hdp/current/hive-server2/conf/conf.server /var/log/hive', + environment = { 'HIVE_CMD': '/usr/hdp/current/hive-server2/bin/hive', +- 'JAVA_HOME': u'/usr/jdk64/jdk1.7.0_45'}, ++ 'JAVA_HOME': '/usr/jdk64/jdk1.7.0_45'}, + not_if = "ls /var/run/hive/hive.pid >/dev/null 2>&1 && ps -p 123 >/dev/null 2>&1", + user = 'hive', + path = ['/bin:/usr/hdp/current/hive-server2/bin:/usr/hdp/2.1.0.0-1234/hadoop/bin'], + ) +- self.assertResourceCalled('Execute', (u'/usr/jdk64/jdk1.7.0_45/bin/java', ++ self.assertResourceCalled('Execute', ('/usr/jdk64/jdk1.7.0_45/bin/java', + '-cp', + '/usr/lib/ambari-agent/DBConnectionVerification.jar:/usr/hdp/current/hive-server2/lib/mysql-connector-java.jar', + 'org.apache.ambari.server.DBConnectionVerification', +- u'jdbc:mysql://c6402.ambari.apache.org/hive?createDatabaseIfNotExist=true', +- u'hive', ++ 'jdbc:mysql://c6402.ambari.apache.org/hive?createDatabaseIfNotExist=true', ++ 'hive', + PasswordString("!`\"' 1"), +- u'com.mysql.jdbc.Driver'), ++ 'com.mysql.jdbc.Driver'), + path = ['/usr/sbin:/sbin:/usr/local/bin:/bin:/usr/bin'], + tries = 5, + try_sleep = 10, +@@ -178,52 +178,52 @@ + + def assert_configure_default(self): + self.assertResourceCalled('Directory', '/etc/hive', +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('Directory', '/usr/hdp/current/hive-server2/conf', + owner = 'hive', + group = 'hadoop', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('XmlConfig', 'mapred-site.xml', + group = 'hadoop', + conf_dir = '/usr/hdp/current/hive-server2/conf', +- mode = 0644, +- configuration_attributes = {u'final': {u'mapred.healthChecker.script.path': u'true', +- u'mapreduce.jobtracker.staging.root.dir': u'true'}}, ++ mode = 0o644, ++ configuration_attributes = {'final': {'mapred.healthChecker.script.path': 'true', ++ 'mapreduce.jobtracker.staging.root.dir': 'true'}}, + owner = 'hive', + configurations = self.getConfig()['configurations']['mapred-site'], + ) + self.assertResourceCalled('File', '/usr/hdp/current/hive-server2/conf/hive-default.xml.template', + owner = 'hive', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/usr/hdp/current/hive-server2/conf/hive-env.sh.template', + owner = 'hive', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/usr/hdp/current/hive-server2/conf/hive-exec-log4j.properties', + content = InlineTemplate('log4jproperties\nline2'), + owner = 'hive', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/usr/hdp/current/hive-server2/conf/hive-log4j.properties', + content = InlineTemplate('log4jproperties\nline2'), + owner = 'hive', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('XmlConfig', 'hive-site.xml', + group = 'hadoop', + conf_dir = '/usr/hdp/current/hive-server2/conf/conf.server', +- mode = 0600, +- configuration_attributes = {u'final': {u'hive.optimize.bucketmapjoin.sortedmerge': u'true', +- u'javax.jdo.option.ConnectionDriverName': u'true', +- u'javax.jdo.option.ConnectionPassword': u'true'}}, ++ mode = 0o600, ++ configuration_attributes = {'final': {'hive.optimize.bucketmapjoin.sortedmerge': 'true', ++ 'javax.jdo.option.ConnectionDriverName': 'true', ++ 'javax.jdo.option.ConnectionPassword': 'true'}}, + owner = 'hive', + configurations = self.getConfig()['configurations']['hive-site'], + ) +@@ -231,7 +231,7 @@ + content = InlineTemplate(self.getConfig()['configurations']['hive-env']['content']), + owner = 'hive', + group = 'hadoop', +- mode = 0600, ++ mode = 0o600, + ) + self.assertResourceCalled('Directory', '/etc/security/limits.d', + owner = 'root', +@@ -242,32 +242,32 @@ + content = Template('hive.conf.j2'), + owner = 'root', + group = 'root', +- mode = 0644, ++ mode = 0o644, + ) + + self.assertResourceCalled('File', '/usr/lib/ambari-agent/DBConnectionVerification.jar', + content = DownloadSource('http://c6401.ambari.apache.org:8080/resources/DBConnectionVerification.jar'), +- mode = 0644, ++ mode = 0o644, + ) + + self.assertResourceCalled('Directory', '/var/run/hive', + owner = 'hive', + group = 'hadoop', +- mode = 0755, ++ mode = 0o755, + create_parents = True, + cd_access = 'a', + ) + self.assertResourceCalled('Directory', '/var/log/hive', + owner = 'hive', + group = 'hadoop', +- mode = 0755, ++ mode = 0o755, + create_parents = True, + cd_access = 'a', + ) + self.assertResourceCalled('Directory', '/var/lib/hive', + owner = 'hive', + group = 'hadoop', +- mode = 0755, ++ mode = 0o755, + create_parents = True, + cd_access = 'a', + ) +@@ -284,17 +284,17 @@ + sudo = True, + ) + self.assertResourceCalled('File', '/usr/hdp/current/hive-server2/lib/mysql-connector-java.jar', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/usr/hdp/current/hive-server2/conf/conf.server/hadoop-metrics2-hivemetastore.properties', + owner = 'hive', + group = 'hadoop', + content = Template('hadoop-metrics2-hivemetastore.properties.j2'), +- mode = 0600, ++ mode = 0o600, + ) + self.assertResourceCalled('File', '/tmp/start_metastore_script', + content = StaticFile('startMetastore.sh'), +- mode = 0755, ++ mode = 0o755, + ) + + def assert_init_schema(self): +@@ -305,52 +305,52 @@ + + def assert_configure_secured(self): + self.assertResourceCalled('Directory', '/etc/hive', +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('Directory', '/usr/hdp/current/hive-server2/conf', + owner = 'hive', + group = 'hadoop', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('XmlConfig', 'mapred-site.xml', + group = 'hadoop', + conf_dir = '/usr/hdp/current/hive-server2/conf', +- mode = 0644, +- configuration_attributes = {u'final': {u'mapred.healthChecker.script.path': u'true', +- u'mapreduce.jobtracker.staging.root.dir': u'true'}}, ++ mode = 0o644, ++ configuration_attributes = {'final': {'mapred.healthChecker.script.path': 'true', ++ 'mapreduce.jobtracker.staging.root.dir': 'true'}}, + owner = 'hive', + configurations = self.getConfig()['configurations']['mapred-site'], + ) + self.assertResourceCalled('File', '/usr/hdp/current/hive-server2/conf/hive-default.xml.template', + owner = 'hive', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/usr/hdp/current/hive-server2/conf/hive-env.sh.template', + owner = 'hive', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/usr/hdp/current/hive-server2/conf/hive-exec-log4j.properties', + content = InlineTemplate('log4jproperties\nline2'), + owner = 'hive', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/usr/hdp/current/hive-server2/conf/hive-log4j.properties', + content = InlineTemplate('log4jproperties\nline2'), + owner = 'hive', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('XmlConfig', 'hive-site.xml', + group = 'hadoop', + conf_dir = '/usr/hdp/current/hive-server2/conf/conf.server', +- mode = 0600, +- configuration_attributes = {u'final': {u'hive.optimize.bucketmapjoin.sortedmerge': u'true', +- u'javax.jdo.option.ConnectionDriverName': u'true', +- u'javax.jdo.option.ConnectionPassword': u'true'}}, ++ mode = 0o600, ++ configuration_attributes = {'final': {'hive.optimize.bucketmapjoin.sortedmerge': 'true', ++ 'javax.jdo.option.ConnectionDriverName': 'true', ++ 'javax.jdo.option.ConnectionPassword': 'true'}}, + owner = 'hive', + configurations = self.getConfig()['configurations']['hive-site'], + ) +@@ -358,7 +358,7 @@ + content = InlineTemplate(self.getConfig()['configurations']['hive-env']['content']), + owner = 'hive', + group = 'hadoop', +- mode = 0600, ++ mode = 0o600, + ) + self.assertResourceCalled('Directory', '/etc/security/limits.d', + owner = 'root', +@@ -369,7 +369,7 @@ + content = Template('hive.conf.j2'), + owner = 'root', + group = 'root', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/usr/hdp/current/hive-server2/conf/conf.server/zkmigrator_jaas.conf', + content = Template('zkmigrator_jaas.conf.j2'), +@@ -378,26 +378,26 @@ + ) + self.assertResourceCalled('File', '/usr/lib/ambari-agent/DBConnectionVerification.jar', + content = DownloadSource('http://c6401.ambari.apache.org:8080/resources/DBConnectionVerification.jar'), +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('Directory', '/var/run/hive', + owner = 'hive', + group = 'hadoop', +- mode = 0755, ++ mode = 0o755, + create_parents = True, + cd_access = 'a', + ) + self.assertResourceCalled('Directory', '/var/log/hive', + owner = 'hive', + group = 'hadoop', +- mode = 0755, ++ mode = 0o755, + create_parents = True, + cd_access = 'a', + ) + self.assertResourceCalled('Directory', '/var/lib/hive', + owner = 'hive', + group = 'hadoop', +- mode = 0755, ++ mode = 0o755, + create_parents = True, + cd_access = 'a', + ) +@@ -413,17 +413,17 @@ + sudo = True, + ) + self.assertResourceCalled('File', '/usr/hdp/current/hive-server2/lib/mysql-connector-java.jar', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/usr/hdp/current/hive-server2/conf/conf.server/hadoop-metrics2-hivemetastore.properties', + owner = 'hive', + group = 'hadoop', + content = Template('hadoop-metrics2-hivemetastore.properties.j2'), +- mode = 0600, ++ mode = 0o600, + ) + self.assertResourceCalled('File', '/tmp/start_metastore_script', + content = StaticFile('startMetastore.sh'), +- mode = 0755, ++ mode = 0o755, + ) + + @patch("resource_management.core.shell.call") +@@ -434,7 +434,7 @@ + get_stack_version_mock.return_value = '2.3.0.0-1234' + + config_file = self.get_src_folder()+"/test/python/stacks/2.0.6/configs/default.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + + version = "2.3.0.0-1234" +@@ -453,33 +453,33 @@ + target = RMFTestCase.TARGET_COMMON_SERVICES) + + self.assertResourceCalled('Directory', '/etc/hive', +- mode = 0755) ++ mode = 0o755) + + self.assertResourceCalled('Directory', '/usr/hdp/current/hive-server2/conf', + owner = 'hive', + group = 'hadoop', + create_parents = True, +- mode = 0755) ++ mode = 0o755) + + self.assertResourceCalled('XmlConfig', 'mapred-site.xml', + group = 'hadoop', + conf_dir = '/usr/hdp/current/hive-server2/conf', +- mode = 0644, +- configuration_attributes = {u'final': {u'mapred.healthChecker.script.path': u'true', +- u'mapreduce.jobtracker.staging.root.dir': u'true'}}, ++ mode = 0o644, ++ configuration_attributes = {'final': {'mapred.healthChecker.script.path': 'true', ++ 'mapreduce.jobtracker.staging.root.dir': 'true'}}, + owner = 'hive', + configurations = self.getConfig()['configurations']['mapred-site']) + + self.assertResourceCalled('File', '/usr/hdp/current/hive-server2/conf/hive-default.xml.template', + owner = 'hive', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + ) + + self.assertResourceCalled('File', '/usr/hdp/current/hive-server2/conf/hive-env.sh.template', + owner = 'hive', + group = 'hadoop', +- mode = 0644) ++ mode = 0o644) + + self.assertResourceCalled('File', '/usr/hdp/current/hive-server2/conf/hive-exec-log4j.properties', + content = InlineTemplate('log4jproperties\nline2'), +@@ -496,10 +496,10 @@ + self.assertResourceCalled('XmlConfig', 'hive-site.xml', + group = 'hadoop', + conf_dir = '/usr/hdp/current/hive-server2/conf/conf.server', +- mode = 0600, +- configuration_attributes = {u'final': {u'hive.optimize.bucketmapjoin.sortedmerge': u'true', +- u'javax.jdo.option.ConnectionDriverName': u'true', +- u'javax.jdo.option.ConnectionPassword': u'true'}}, ++ mode = 0o600, ++ configuration_attributes = {'final': {'hive.optimize.bucketmapjoin.sortedmerge': 'true', ++ 'javax.jdo.option.ConnectionDriverName': 'true', ++ 'javax.jdo.option.ConnectionPassword': 'true'}}, + owner = 'hive', + configurations = self.getConfig()['configurations']['hive-site']) + +@@ -507,7 +507,7 @@ + content = InlineTemplate(self.getConfig()['configurations']['hive-env']['content']), + owner = 'hive', + group = 'hadoop', +- mode = 0600) ++ mode = 0o600) + + self.assertResourceCalled('Directory', '/etc/security/limits.d', + owner = 'root', +@@ -518,31 +518,31 @@ + content = Template('hive.conf.j2'), + owner = 'root', + group = 'root', +- mode = 0644) ++ mode = 0o644) + + self.assertResourceCalled('File', '/usr/lib/ambari-agent/DBConnectionVerification.jar', + content = DownloadSource('http://c6401.ambari.apache.org:8080/resources/DBConnectionVerification.jar'), +- mode = 0644, ++ mode = 0o644, + ) + + self.assertResourceCalled('Directory', '/var/run/hive', + owner = 'hive', + group = 'hadoop', +- mode = 0755, ++ mode = 0o755, + create_parents = True, + cd_access = 'a') + + self.assertResourceCalled('Directory', '/var/log/hive', + owner = 'hive', + group = 'hadoop', +- mode = 0755, ++ mode = 0o755, + create_parents = True, + cd_access = 'a') + + self.assertResourceCalled('Directory', '/var/lib/hive', + owner = 'hive', + group = 'hadoop', +- mode = 0755, ++ mode = 0o755, + create_parents = True, + cd_access = 'a') + +@@ -558,17 +558,17 @@ + sudo = True) + + self.assertResourceCalled('File', '/usr/hdp/current/hive-server2/lib/mysql-connector-java.jar', +- mode = 0644) ++ mode = 0o644) + + self.assertResourceCalled('File', '/usr/hdp/current/hive-server2/conf/conf.server/hadoop-metrics2-hivemetastore.properties', + owner = 'hive', + group = 'hadoop', + content = Template('hadoop-metrics2-hivemetastore.properties.j2'), +- mode = 0600, ++ mode = 0o600, + ) + self.assertResourceCalled('File', '/tmp/start_metastore_script', + content = StaticFile('startMetastore.sh'), +- mode = 0755) ++ mode = 0o755) + + self.maxDiff = None + +@@ -577,19 +577,19 @@ + user = 'hive') + + self.assertResourceCalled('Execute', '/tmp/start_metastore_script /var/log/hive/hive.out /var/log/hive/hive.err /var/run/hive/hive.pid /usr/hdp/current/hive-server2/conf/conf.server /var/log/hive', +- environment = {'JAVA_HOME': u'/usr/jdk64/jdk1.7.0_45', 'HIVE_CMD': '/usr/hdp/current/hive-server2/bin/hive'}, ++ environment = {'JAVA_HOME': '/usr/jdk64/jdk1.7.0_45', 'HIVE_CMD': '/usr/hdp/current/hive-server2/bin/hive'}, + not_if = None, + user = 'hive', + path = ['/bin:/usr/hdp/current/hive-server2/bin:/usr/hdp/2.3.0.0-1234/hadoop/bin']) + +- self.assertResourceCalled('Execute', (u'/usr/jdk64/jdk1.7.0_45/bin/java', ++ self.assertResourceCalled('Execute', ('/usr/jdk64/jdk1.7.0_45/bin/java', + '-cp', + '/usr/lib/ambari-agent/DBConnectionVerification.jar:/usr/hdp/current/hive-server2/lib/mysql-connector-java.jar', + 'org.apache.ambari.server.DBConnectionVerification', +- u'jdbc:mysql://c6402.ambari.apache.org/hive?createDatabaseIfNotExist=true', +- u'hive', ++ 'jdbc:mysql://c6402.ambari.apache.org/hive?createDatabaseIfNotExist=true', ++ 'hive', + PasswordString("aaa"), +- u'com.mysql.jdbc.Driver'), ++ 'com.mysql.jdbc.Driver'), + path = ['/usr/sbin:/sbin:/usr/local/bin:/bin:/usr/bin'], + tries = 5, + try_sleep = 10, +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/HIVE/test_hive_server.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/HIVE/test_hive_server.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/HIVE/test_hive_server.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/HIVE/test_hive_server.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 stacks.utils.RMFTestCase import * + +-from mock.mock import MagicMock, patch ++from unittest.mock import MagicMock, patch + from resource_management.libraries.functions import version + from resource_management.core import shell + from resource_management.libraries.script.script import Script +@@ -95,19 +95,19 @@ + ) + self.assertResourceCalled('Execute', '/tmp/start_hiveserver2_script /var/log/hive/hive-server2.out /var/log/hive/hive-server2.err /var/run/hive/hive-server.pid /usr/hdp/current/hive-server2/conf/conf.server /var/log/hive', + environment = { 'HIVE_CMD': '/usr/hdp/current/hive-server2/bin/hive', +- 'JAVA_HOME': u'/usr/jdk64/jdk1.7.0_45'}, ++ 'JAVA_HOME': '/usr/jdk64/jdk1.7.0_45'}, + not_if = "ls /var/run/hive/hive-server.pid >/dev/null 2>&1 && ps -p 123 >/dev/null 2>&1", + user = 'hive', + path = ['/bin:/usr/hdp/current/hive-server2/bin:mock_hadoop_dir'], + ) +- self.assertResourceCalled('Execute', (u'/usr/jdk64/jdk1.7.0_45/bin/java', ++ self.assertResourceCalled('Execute', ('/usr/jdk64/jdk1.7.0_45/bin/java', + '-cp', + '/usr/lib/ambari-agent/DBConnectionVerification.jar:/usr/hdp/current/hive-server2/lib/mysql-connector-java.jar', + 'org.apache.ambari.server.DBConnectionVerification', +- u'jdbc:mysql://c6402.ambari.apache.org/hive?createDatabaseIfNotExist=true', +- u'hive', ++ 'jdbc:mysql://c6402.ambari.apache.org/hive?createDatabaseIfNotExist=true', ++ 'hive', + PasswordString("!`\"' 1"), +- u'com.mysql.jdbc.Driver'), ++ 'com.mysql.jdbc.Driver'), + path = ['/usr/sbin:/sbin:/usr/local/bin:/bin:/usr/bin'], + tries = 5, + try_sleep = 10, +@@ -131,19 +131,19 @@ + + self.assertResourceCalled('Execute', '/tmp/start_hiveserver2_script /var/log/hive/hive-server2.out /var/log/hive/hive-server2.err /var/run/hive/hive-server.pid /usr/hdp/current/hive-server2/conf/conf.server /var/log/hive', + environment = {'HIVE_CMD': '/usr/hdp/current/hive-server2/bin/hive', +- 'JAVA_HOME': u'/usr/jdk64/jdk1.7.0_45'}, ++ 'JAVA_HOME': '/usr/jdk64/jdk1.7.0_45'}, + not_if = "ls /var/run/hive/hive-server.pid >/dev/null 2>&1 && ps -p 123 >/dev/null 2>&1", + user = 'hive', + path = ['/bin:/usr/hdp/current/hive-server2/bin:mock_hadoop_dir'], + ) +- self.assertResourceCalled('Execute', (u'/usr/jdk64/jdk1.7.0_45/bin/java', ++ self.assertResourceCalled('Execute', ('/usr/jdk64/jdk1.7.0_45/bin/java', + '-cp', + '/usr/lib/ambari-agent/DBConnectionVerification.jar:/usr/hdp/current/hive-server2/lib/mysql-connector-java.jar', + 'org.apache.ambari.server.DBConnectionVerification', +- u'jdbc:mysql://c6402.ambari.apache.org/hive?createDatabaseIfNotExist=true', +- u'hive', ++ 'jdbc:mysql://c6402.ambari.apache.org/hive?createDatabaseIfNotExist=true', ++ 'hive', + PasswordString("!`\"' 1"), +- u'com.mysql.jdbc.Driver'), ++ 'com.mysql.jdbc.Driver'), + path = ['/usr/sbin:/sbin:/usr/local/bin:/bin:/usr/bin'], + tries = 5, + try_sleep = 10, +@@ -167,20 +167,20 @@ + ) + self.assertResourceCalled('Execute', '/tmp/start_hiveserver2_script /var/log/hive/hive-server2.out /var/log/hive/hive-server2.err /var/run/hive/hive-server.pid /usr/hdp/current/hive-server2/conf/conf.server /var/log/hive', + environment = { 'HIVE_CMD': '/usr/hdp/current/hive-server2/bin/hive', +- 'JAVA_HOME': u'/usr/jdk64/jdk1.7.0_45'}, ++ 'JAVA_HOME': '/usr/jdk64/jdk1.7.0_45'}, + not_if = "ls /var/run/hive/hive-server.pid >/dev/null 2>&1 && ps -p 123 >/dev/null 2>&1", + user = 'hive', + path = ['/bin:/usr/hdp/current/hive-server2/bin:mock_hadoop_dir'], + ) + +- self.assertResourceCalled('Execute', (u'/usr/jdk64/jdk1.7.0_45/bin/java', ++ self.assertResourceCalled('Execute', ('/usr/jdk64/jdk1.7.0_45/bin/java', + '-cp', + '/usr/lib/ambari-agent/DBConnectionVerification.jar:/usr/hdp/current/hive-server2/lib/mysql-connector-java.jar', + 'org.apache.ambari.server.DBConnectionVerification', +- u'jdbc:mysql://c6402.ambari.apache.org/hive?createDatabaseIfNotExist=true', +- u'hive', ++ 'jdbc:mysql://c6402.ambari.apache.org/hive?createDatabaseIfNotExist=true', ++ 'hive', + PasswordString("!`\"' 1"), +- u'com.mysql.jdbc.Driver'), ++ 'com.mysql.jdbc.Driver'), + path = ['/usr/sbin:/sbin:/usr/local/bin:/bin:/usr/bin'], + tries = 5, + try_sleep = 10, +@@ -206,20 +206,20 @@ + ) + self.assertResourceCalled('Execute', '/tmp/start_hiveserver2_script /var/log/hive/hive-server2.out /var/log/hive/hive-server2.err /var/run/hive/hive-server.pid /usr/hdp/current/hive-server2/conf/conf.server /var/log/hive', + environment = { 'HIVE_CMD': '/usr/hdp/current/hive-server2/bin/hive', +- 'JAVA_HOME': u'/usr/jdk64/jdk1.7.0_45'}, ++ 'JAVA_HOME': '/usr/jdk64/jdk1.7.0_45'}, + not_if = "ls /var/run/hive/hive-server.pid >/dev/null 2>&1 && ps -p 123 >/dev/null 2>&1", + user = 'hive', + path = ['/bin:/usr/hdp/current/hive-server2/bin:mock_hadoop_dir'], + ) + +- self.assertResourceCalled('Execute', (u'/usr/jdk64/jdk1.7.0_45/bin/java', ++ self.assertResourceCalled('Execute', ('/usr/jdk64/jdk1.7.0_45/bin/java', + '-cp', + '/usr/lib/ambari-agent/DBConnectionVerification.jar:/usr/hdp/current/hive-server2/lib/mysql-connector-java.jar', + 'org.apache.ambari.server.DBConnectionVerification', +- u'jdbc:mysql://c6402.ambari.apache.org/hive?createDatabaseIfNotExist=true', +- u'hive', ++ 'jdbc:mysql://c6402.ambari.apache.org/hive?createDatabaseIfNotExist=true', ++ 'hive', + PasswordString("!`\"' 1"), +- u'com.mysql.jdbc.Driver'), ++ 'com.mysql.jdbc.Driver'), + path = ['/usr/sbin:/sbin:/usr/local/bin:/bin:/usr/bin'], + tries = 5, + try_sleep = 10, +@@ -245,20 +245,20 @@ + ) + self.assertResourceCalled('Execute', '/tmp/start_hiveserver2_script /var/log/hive/hive-server2.out /var/log/hive/hive-server2.err /var/run/hive/hive-server.pid /usr/hdp/current/hive-server2/conf/conf.server /var/log/hive', + environment = { 'HIVE_CMD': '/usr/hdp/current/hive-server2/bin/hive', +- 'JAVA_HOME': u'/usr/jdk64/jdk1.7.0_45'}, ++ 'JAVA_HOME': '/usr/jdk64/jdk1.7.0_45'}, + not_if = "ls /var/run/hive/hive-server.pid >/dev/null 2>&1 && ps -p 123 >/dev/null 2>&1", + user = 'hive', + path = ['/bin:/usr/hdp/current/hive-server2/bin:mock_hadoop_dir'], + ) + +- self.assertResourceCalled('Execute', (u'/usr/jdk64/jdk1.7.0_45/bin/java', ++ self.assertResourceCalled('Execute', ('/usr/jdk64/jdk1.7.0_45/bin/java', + '-cp', + '/usr/lib/ambari-agent/DBConnectionVerification.jar:/usr/hdp/current/hive-server2/lib/mysql-connector-java.jar', + 'org.apache.ambari.server.DBConnectionVerification', +- u'jdbc:mysql://c6402.ambari.apache.org/hive?createDatabaseIfNotExist=true', +- u'hive', ++ 'jdbc:mysql://c6402.ambari.apache.org/hive?createDatabaseIfNotExist=true', ++ 'hive', + PasswordString("!`\"' 1"), +- u'com.mysql.jdbc.Driver'), ++ 'com.mysql.jdbc.Driver'), + path = ['/usr/sbin:/sbin:/usr/local/bin:/bin:/usr/bin'], + tries = 5, + try_sleep = 10, +@@ -307,7 +307,7 @@ + @patch("socket.socket") + def test_start_secured(self, socket_mock, check_fs_root_mock, copy_to_hfds_mock): + config_file = self.get_src_folder()+"/test/python/stacks/2.0.6/configs/secured.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + + json_content['commandParams']['version'] = '2.3.0.0-1234' +@@ -326,19 +326,19 @@ + self.assert_configure_secured() + self.assertResourceCalled('Execute', '/tmp/start_hiveserver2_script /var/log/hive/hive-server2.out /var/log/hive/hive-server2.err /var/run/hive/hive-server.pid /usr/hdp/current/hive-server2/conf/conf.server /var/log/hive', + environment = { 'HIVE_CMD': '/usr/hdp/current/hive-server2/bin/hive', +- 'JAVA_HOME': u'/usr/jdk64/jdk1.7.0_45'}, ++ 'JAVA_HOME': '/usr/jdk64/jdk1.7.0_45'}, + not_if = "ls /var/run/hive/hive-server.pid >/dev/null 2>&1 && ps -p 123 >/dev/null 2>&1", + user = 'hive', + path = ['/bin:/usr/hdp/current/hive-server2/bin:mock_hadoop_dir'], + ) +- self.assertResourceCalled('Execute', (u'/usr/jdk64/jdk1.7.0_45/bin/java', ++ self.assertResourceCalled('Execute', ('/usr/jdk64/jdk1.7.0_45/bin/java', + '-cp', + '/usr/lib/ambari-agent/DBConnectionVerification.jar:/usr/hdp/current/hive-server2/lib/mysql-connector-java.jar', + 'org.apache.ambari.server.DBConnectionVerification', +- u'jdbc:mysql://c6402.ambari.apache.org/hive?createDatabaseIfNotExist=true', +- u'hive', ++ 'jdbc:mysql://c6402.ambari.apache.org/hive?createDatabaseIfNotExist=true', ++ 'hive', + PasswordString("!`\"' 1"), +- u'com.mysql.jdbc.Driver'), ++ 'com.mysql.jdbc.Driver'), + path = ['/usr/sbin:/sbin:/usr/local/bin:/bin:/usr/bin'], + tries = 5, + try_sleep = 10, +@@ -382,53 +382,53 @@ + return + + self.assertResourceCalled('Directory', '/etc/hive', +- mode=0755, ++ mode=0o755, + ) + self.assertResourceCalled('Directory', '/usr/hdp/current/hive-server2/conf', + owner='hive', + group='hadoop', + create_parents = True, +- mode = 0755 ++ mode = 0o755 + ) + + self.assertResourceCalled('XmlConfig', 'mapred-site.xml', + group='hadoop', + conf_dir='/usr/hdp/current/hive-server2/conf', +- mode=0644, +- configuration_attributes={u'final': {u'mapred.healthChecker.script.path': u'true', +- u'mapreduce.jobtracker.staging.root.dir': u'true'}}, ++ mode=0o644, ++ configuration_attributes={'final': {'mapred.healthChecker.script.path': 'true', ++ 'mapreduce.jobtracker.staging.root.dir': 'true'}}, + owner='hive', + configurations=self.getConfig()['configurations']['mapred-site'], + ) + self.assertResourceCalled('File', '/usr/hdp/current/hive-server2/conf/hive-default.xml.template', + owner='hive', + group='hadoop', +- mode=0644 ++ mode=0o644 + ) + self.assertResourceCalled('File', '/usr/hdp/current/hive-server2/conf/hive-env.sh.template', + owner='hive', + group='hadoop', +- mode=0644 ++ mode=0o644 + ) + self.assertResourceCalled('File', '/usr/hdp/current/hive-server2/conf/hive-exec-log4j.properties', + content=InlineTemplate('log4jproperties\nline2'), + owner='hive', + group='hadoop', +- mode=0644, ++ mode=0o644, + ) + self.assertResourceCalled('File', '/usr/hdp/current/hive-server2/conf/hive-log4j.properties', + content=InlineTemplate('log4jproperties\nline2'), + owner='hive', + group='hadoop', +- mode=0644, ++ mode=0o644, + ) + self.assertResourceCalled('XmlConfig', 'hive-site.xml', + group='hadoop', + conf_dir='/usr/hdp/current/hive-server2/conf/conf.server', +- mode=0600, +- configuration_attributes={u'final': {u'hive.optimize.bucketmapjoin.sortedmerge': u'true', +- u'javax.jdo.option.ConnectionDriverName': u'true', +- u'javax.jdo.option.ConnectionPassword': u'true'}}, ++ mode=0o600, ++ configuration_attributes={'final': {'hive.optimize.bucketmapjoin.sortedmerge': 'true', ++ 'javax.jdo.option.ConnectionDriverName': 'true', ++ 'javax.jdo.option.ConnectionPassword': 'true'}}, + owner='hive', + configurations=self.getConfig()['configurations']['hive-site'], + ) +@@ -436,7 +436,7 @@ + content=InlineTemplate(self.getConfig()['configurations']['hive-env']['content']), + owner='hive', + group='hadoop', +- mode = 0600 ++ mode = 0o600 + ) + self.assertResourceCalled('Directory', '/etc/security/limits.d', + owner='root', +@@ -447,30 +447,30 @@ + content=Template('hive.conf.j2'), + owner='root', + group='root', +- mode=0644, ++ mode=0o644, + ) + self.assertResourceCalled('File', '/usr/lib/ambari-agent/DBConnectionVerification.jar', + content=DownloadSource('http://c6401.ambari.apache.org:8080/resources' + '/DBConnectionVerification.jar'), +- mode=0644, ++ mode=0o644, + ) + self.assertResourceCalled('Directory', '/var/run/hive', + owner='hive', +- mode=0755, ++ mode=0o755, + group='hadoop', + create_parents = True, + cd_access='a', + ) + self.assertResourceCalled('Directory', '/var/log/hive', + owner='hive', +- mode=0755, ++ mode=0o755, + group='hadoop', + create_parents = True, + cd_access='a', + ) + self.assertResourceCalled('Directory', '/var/lib/hive', + owner='hive', +- mode=0755, ++ mode=0o755, + group='hadoop', + create_parents = True, + cd_access='a', +@@ -487,22 +487,22 @@ + sudo=True, + ) + self.assertResourceCalled('File', '/usr/hdp/current/hive-server2/lib/mysql-connector-java.jar', +- mode=0644, ++ mode=0o644, + ) + self.assertResourceCalled('File', '/tmp/start_hiveserver2_script', + content=Template('startHiveserver2.sh.j2'), +- mode=0755, ++ mode=0o755, + ) + self.assertResourceCalled('File', '/usr/hdp/current/hive-server2/conf/conf.server/hadoop-metrics2-hiveserver2.properties', + owner = 'hive', + group = 'hadoop', + content = Template('hadoop-metrics2-hiveserver2.properties.j2'), +- mode = 0600, ++ mode = 0o600, + ) + self.assertResourceCalled('XmlConfig', 'hiveserver2-site.xml', + group = 'hadoop', + conf_dir = '/usr/hdp/current/hive-server2/conf/conf.server', +- mode = 0600, ++ mode = 0o600, + owner = 'hive', + configuration_attributes = self.getConfig()['configurationAttributes']['hiveserver2-site'], + configurations = self.getConfig()['configurations']['hiveserver2-site'], +@@ -520,7 +520,7 @@ + hadoop_conf_dir = '/usr/hdp/current/hadoop-client/conf', + type = 'directory', + action = ['create_on_execute'], hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', hdfs_site=self.getConfig()['configurations']['hdfs-site'], principal_name='missing_principal', default_fs=default_fs_default, +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('HdfsResource', '/user/hcat', + immutable_paths = self.DEFAULT_IMMUTABLE_PATHS, +@@ -534,7 +534,7 @@ + hadoop_conf_dir = '/usr/hdp/current/hadoop-client/conf', + type = 'directory', + action = ['create_on_execute'], hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', hdfs_site=self.getConfig()['configurations']['hdfs-site'], principal_name='missing_principal', default_fs=default_fs_default, +- mode = 0755, ++ mode = 0o755, + ) + + self.assertResourceCalled('HdfsResource', '/apps/hive/warehouse', +@@ -550,7 +550,7 @@ + type = 'directory', + action = ['create_on_execute'], hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', hdfs_site=self.getConfig()['configurations']['hdfs-site'], principal_name='missing_principal', default_fs=default_fs_default, + group = 'hadoop', +- mode = 0777, ++ mode = 0o777, + ) + self.assertResourceCalled('HdfsResource', '/user/hive', + immutable_paths = self.DEFAULT_IMMUTABLE_PATHS, +@@ -564,7 +564,7 @@ + hadoop_conf_dir = '/usr/hdp/current/hadoop-client/conf', + type = 'directory', + action = ['create_on_execute'], hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', hdfs_site=self.getConfig()['configurations']['hdfs-site'], principal_name='missing_principal', default_fs=default_fs_default, +- mode = 0755, ++ mode = 0o755, + ) + if not no_tmp: + self.assertResourceCalled('HdfsResource', '/custompath/tmp/hive', +@@ -580,7 +580,7 @@ + hadoop_bin_dir = 'mock_hadoop_dir', + type = 'directory', + action = ['create_on_execute'], hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', hdfs_site=self.getConfig()['configurations']['hdfs-site'], principal_name='missing_principal', default_fs=default_fs_default, +- mode = 0777, ++ mode = 0o777, + ) + self.assertResourceCalled('HdfsResource', None, + immutable_paths = self.DEFAULT_IMMUTABLE_PATHS, +@@ -596,52 +596,52 @@ + + def assert_configure_secured(self): + self.assertResourceCalled('Directory', '/etc/hive', +- mode=0755, ++ mode=0o755, + ) + self.assertResourceCalled('Directory', '/usr/hdp/current/hive-server2/conf', + owner='hive', + group='hadoop', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('XmlConfig', 'mapred-site.xml', + group='hadoop', + conf_dir='/usr/hdp/current/hive-server2/conf', +- mode=0644, +- configuration_attributes={u'final': {u'mapred.healthChecker.script.path': u'true', +- u'mapreduce.jobtracker.staging.root.dir': u'true'}}, ++ mode=0o644, ++ configuration_attributes={'final': {'mapred.healthChecker.script.path': 'true', ++ 'mapreduce.jobtracker.staging.root.dir': 'true'}}, + owner='hive', + configurations=self.getConfig()['configurations']['mapred-site'], + ) + self.assertResourceCalled('File', '/usr/hdp/current/hive-server2/conf/hive-default.xml.template', + owner='hive', + group='hadoop', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/usr/hdp/current/hive-server2/conf/hive-env.sh.template', + owner='hive', + group='hadoop', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/usr/hdp/current/hive-server2/conf/hive-exec-log4j.properties', + content=InlineTemplate('log4jproperties\nline2'), + owner='hive', + group='hadoop', +- mode=0644, ++ mode=0o644, + ) + self.assertResourceCalled('File', '/usr/hdp/current/hive-server2/conf/hive-log4j.properties', + content=InlineTemplate('log4jproperties\nline2'), + owner='hive', + group='hadoop', +- mode=0644, ++ mode=0o644, + ) + self.assertResourceCalled('XmlConfig', 'hive-site.xml', + group='hadoop', + conf_dir='/usr/hdp/current/hive-server2/conf/conf.server', +- mode=0600, +- configuration_attributes={u'final': {u'hive.optimize.bucketmapjoin.sortedmerge': u'true', +- u'javax.jdo.option.ConnectionDriverName': u'true', +- u'javax.jdo.option.ConnectionPassword': u'true'}}, ++ mode=0o600, ++ configuration_attributes={'final': {'hive.optimize.bucketmapjoin.sortedmerge': 'true', ++ 'javax.jdo.option.ConnectionDriverName': 'true', ++ 'javax.jdo.option.ConnectionPassword': 'true'}}, + owner='hive', + configurations=self.getConfig()['configurations']['hive-site'], + ) +@@ -649,7 +649,7 @@ + content=InlineTemplate(self.getConfig()['configurations']['hive-env']['content']), + owner='hive', + group='hadoop', +- mode = 0600, ++ mode = 0o600, + ) + self.assertResourceCalled('Directory', '/etc/security/limits.d', + owner='root', +@@ -660,7 +660,7 @@ + content=Template('hive.conf.j2'), + owner='root', + group='root', +- mode=0644, ++ mode=0o644, + ) + self.assertResourceCalled('File', '/usr/hdp/current/hive-server2/conf/conf.server/zkmigrator_jaas.conf', + content = Template('zkmigrator_jaas.conf.j2'), +@@ -670,26 +670,26 @@ + self.assertResourceCalled('File', '/usr/lib/ambari-agent/DBConnectionVerification.jar', + content=DownloadSource( + 'http://c6401.ambari.apache.org:8080/resources/DBConnectionVerification.jar'), +- mode=0644, ++ mode=0o644, + ) + self.assertResourceCalled('Directory', '/var/run/hive', + owner='hive', + group='hadoop', +- mode = 0755, ++ mode = 0o755, + create_parents = True, + cd_access='a', + ) + self.assertResourceCalled('Directory', '/var/log/hive', + owner='hive', + group='hadoop', +- mode = 0755, ++ mode = 0o755, + create_parents = True, + cd_access='a', + ) + self.assertResourceCalled('Directory', '/var/lib/hive', + owner='hive', + group='hadoop', +- mode = 0755, ++ mode = 0o755, + create_parents = True, + cd_access='a', + ) +@@ -705,22 +705,22 @@ + sudo=True, + ) + self.assertResourceCalled('File', '/usr/hdp/current/hive-server2/lib/mysql-connector-java.jar', +- mode=0644, ++ mode=0o644, + ) + self.assertResourceCalled('File', '/tmp/start_hiveserver2_script', + content=Template('startHiveserver2.sh.j2'), +- mode=0755, ++ mode=0o755, + ) + self.assertResourceCalled('File', '/usr/hdp/current/hive-server2/conf/conf.server/hadoop-metrics2-hiveserver2.properties', + owner = 'hive', + group = 'hadoop', + content = Template('hadoop-metrics2-hiveserver2.properties.j2'), +- mode = 0600, ++ mode = 0o600, + ) + self.assertResourceCalled('XmlConfig', 'hiveserver2-site.xml', + group = 'hadoop', + conf_dir = '/usr/hdp/current/hive-server2/conf/conf.server', +- mode = 0600, ++ mode = 0o600, + owner = 'hive', + configuration_attributes = self.getConfig()['configurationAttributes']['hiveserver2-site'], + configurations = self.getConfig()['configurations']['hiveserver2-site'], +@@ -737,7 +737,7 @@ + hadoop_conf_dir = '/usr/hdp/current/hadoop-client/conf', + type = 'directory', + action = ['create_on_execute'], hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', hdfs_site=self.getConfig()['configurations']['hdfs-site'], principal_name='hdfs', default_fs='hdfs://c6401.ambari.apache.org:8020', +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('HdfsResource', '/user/hcat', + immutable_paths = self.DEFAULT_IMMUTABLE_PATHS, +@@ -751,7 +751,7 @@ + hadoop_conf_dir = '/usr/hdp/current/hadoop-client/conf', + type = 'directory', + action = ['create_on_execute'], hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', hdfs_site=self.getConfig()['configurations']['hdfs-site'], principal_name='hdfs', default_fs='hdfs://c6401.ambari.apache.org:8020', +- mode = 0755, ++ mode = 0o755, + ) + + self.assertResourceCalled('HdfsResource', '/apps/hive/warehouse', +@@ -767,7 +767,7 @@ + type = 'directory', + action = ['create_on_execute'], hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', hdfs_site=self.getConfig()['configurations']['hdfs-site'], principal_name='hdfs', default_fs='hdfs://c6401.ambari.apache.org:8020', + group = 'hadoop', +- mode = 0777, ++ mode = 0o777, + ) + self.assertResourceCalled('HdfsResource', '/user/hive', + immutable_paths = self.DEFAULT_IMMUTABLE_PATHS, +@@ -781,7 +781,7 @@ + hadoop_conf_dir = '/usr/hdp/current/hadoop-client/conf', + type = 'directory', + action = ['create_on_execute'], hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', hdfs_site=self.getConfig()['configurations']['hdfs-site'], principal_name='hdfs', default_fs='hdfs://c6401.ambari.apache.org:8020', +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('HdfsResource', '/custompath/tmp/hive', + immutable_paths = self.DEFAULT_IMMUTABLE_PATHS, +@@ -796,7 +796,7 @@ + hadoop_bin_dir = 'mock_hadoop_dir', + type = 'directory', + action = ['create_on_execute'], hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', hdfs_site=self.getConfig()['configurations']['hdfs-site'], principal_name='hdfs', default_fs='hdfs://c6401.ambari.apache.org:8020', +- mode = 0777, ++ mode = 0o777, + ) + self.assertResourceCalled('HdfsResource', None, + immutable_paths = self.DEFAULT_IMMUTABLE_PATHS, +@@ -921,7 +921,7 @@ + copy_to_hdfs_mock.return_value = True + + config_file = self.get_src_folder()+"/test/python/stacks/2.0.6/configs/default.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + version = '2.2.1.0-3242' + json_content['commandParams']['version'] = version +@@ -937,7 +937,7 @@ + + copy_to_hdfs_mock.assert_any_call("mapreduce", "hadoop", "hdfs", skip=False) + copy_to_hdfs_mock.assert_any_call("tez", "hadoop", "hdfs", skip=False) +- self.assertEquals(2, copy_to_hdfs_mock.call_count) ++ self.assertEqual(2, copy_to_hdfs_mock.call_count) + self.assertResourceCalled('HdfsResource', None, + immutable_paths = self.DEFAULT_IMMUTABLE_PATHS, + security_enabled = False, +@@ -957,7 +957,7 @@ + def test_pre_upgrade_restart_23(self, copy_to_hdfs_mock, call_mock, os_path__exists_mock): + config_file = self.get_src_folder()+"/test/python/stacks/2.0.6/configs/default.json" + os_path__exists_mock.return_value = False +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + version = '2.3.0.0-1234' + json_content['commandParams']['version'] = version +@@ -978,7 +978,7 @@ + ('ambari-python-wrap', '/usr/bin/hdp-select', 'set', 'hive-server2', version), sudo=True,) + copy_to_hdfs_mock.assert_any_call("mapreduce", "hadoop", "hdfs", skip=False) + copy_to_hdfs_mock.assert_any_call("tez", "hadoop", "hdfs", skip=False) +- self.assertEquals(2, copy_to_hdfs_mock.call_count) ++ self.assertEqual(2, copy_to_hdfs_mock.call_count) + self.assertResourceCalled('HdfsResource', None, + immutable_paths = self.DEFAULT_IMMUTABLE_PATHS, + security_enabled = False, +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/HIVE/test_hive_service_check.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/HIVE/test_hive_service_check.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/HIVE/test_hive_service_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/HIVE/test_hive_service_check.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 mock.mock import MagicMock, call, patch ++from unittest.mock import MagicMock, call, patch + from stacks.utils.RMFTestCase import * + import datetime, sys, socket + import resource_management.libraries.functions +@@ -54,7 +54,7 @@ + ) + self.assertResourceCalled('File', '/tmp/hcatSmoke.sh', + content = StaticFile('hcatSmoke.sh'), +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('Execute', 'env JAVA_HOME=/usr/jdk64/jdk1.7.0_45 /tmp/hcatSmoke.sh hcatsmoke prepare false', + logoutput = True, +@@ -86,7 +86,7 @@ + ) + self.assertResourceCalled('File', '/tmp/templetonSmoke.sh', + content = StaticFile('templetonSmoke.sh'), +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('File', '/tmp/idtest.ambari-qa.1431110511.43.pig', + content = Template('templeton_smoke.pig.j2', templeton_test_input='/tmp/idtest.ambari-qa.1431110511.43.in', templeton_test_output='/tmp/idtest.ambari-qa.1431110511.43.out'), +@@ -173,7 +173,7 @@ + ) + self.assertResourceCalled('File', '/tmp/hcatSmoke.sh', + content = StaticFile('hcatSmoke.sh'), +- mode = 0755, ++ mode = 0o755, + ) + self.maxDiff = None + self.assertResourceCalled('Execute', '/usr/bin/kinit -kt /etc/security/keytabs/smokeuser.headless.keytab ambari-qa@EXAMPLE.COM; env JAVA_HOME=/usr/jdk64/jdk1.7.0_45 /tmp/hcatSmoke.sh hcatsmoke prepare false', +@@ -205,7 +205,7 @@ + ) + self.assertResourceCalled('File', '/tmp/templetonSmoke.sh', + content = StaticFile('templetonSmoke.sh'), +- mode = 0755, ++ mode = 0o755, + ) + + self.assertResourceCalled('File', '/tmp/idtest.ambari-qa.1431110511.43.pig', +@@ -271,7 +271,7 @@ + + def test_service_check_during_upgrade(self, socket_mock): + config_file = self.get_src_folder() + "/test/python/stacks/2.2/configs/hive-upgrade.json" +- with open(config_file, 'r') as f: ++ with open(config_file) as f: + json_content = json.load(f) + + json_content['commandParams']['version'] = "2.3.0.0-1234" +@@ -292,7 +292,7 @@ + + self.assertResourceCalled('File', '/tmp/hcatSmoke.sh', + content = StaticFile('hcatSmoke.sh'), +- mode = 0755) ++ mode = 0o755) + + self.assertResourceCalled('Execute', "env JAVA_HOME=/usr/jdk64/jdk1.7.0_45 /tmp/hcatSmoke.sh hcatsmoke prepare true", + logoutput = True, +@@ -304,7 +304,7 @@ + + def test_service_check_during_upgrade_for_llap(self, socket_mock): + config_file = self.get_src_folder() + "/test/python/stacks/2.2/configs/hive-upgrade.json" +- with open(config_file, 'r') as f: ++ with open(config_file) as f: + json_content = json.load(f) + + # populate version and an LLAP instance to trigger the LLAP service check +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/HIVE/test_mysql_server.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/HIVE/test_mysql_server.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/HIVE/test_mysql_server.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/HIVE/test_mysql_server.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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.os_check import OSCheck +-from mock.mock import MagicMock, call, patch ++from unittest.mock import MagicMock, call, patch + from stacks.utils.RMFTestCase import * + + from only_for_platform import not_for_platform, os_distro_value, PLATFORM_WINDOWS +@@ -147,7 +147,7 @@ + ) + self.assertResourceCalled('File', '/tmp/addMysqlUser.sh', + content = StaticFile('addMysqlUser.sh'), +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('Execute', 'bash -x /tmp/addMysqlUser.sh mysql hive \'!`"\'"\'"\' 1\' c6402.ambari.apache.org', + path = ['/usr/sbin:/sbin:/usr/local/bin:/bin:/usr/bin'], +@@ -165,7 +165,7 @@ + ) + self.assertResourceCalled('File', '/tmp/addMysqlUser.sh', + content = StaticFile('addMysqlUser.sh'), +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('Execute', 'bash -x /tmp/addMysqlUser.sh mysql hive \'!`"\'"\'"\' 1\' c6402.ambari.apache.org', + path = ['/usr/sbin:/sbin:/usr/local/bin:/bin:/usr/bin'], +@@ -177,7 +177,7 @@ + def assert_clean_default(self): + self.assertResourceCalled('File', '/tmp/removeMysqlUser.sh', + content = StaticFile('removeMysqlUser.sh'), +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('Execute', 'bash -x /tmp/removeMysqlUser.sh mysql hive c6402.ambari.apache.org', + path = ['/usr/sbin:/sbin:/usr/local/bin:/bin:/usr/bin'], +@@ -188,7 +188,7 @@ + def assert_clean_secured(self): + self.assertResourceCalled('File', '/tmp/removeMysqlUser.sh', + content = StaticFile('removeMysqlUser.sh'), +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('Execute', 'bash -x /tmp/removeMysqlUser.sh mysql hive c6402.ambari.apache.org', + path = ['/usr/sbin:/sbin:/usr/local/bin:/bin:/usr/bin'], +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/HIVE/test_webhcat_server.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/HIVE/test_webhcat_server.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/HIVE/test_webhcat_server.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/HIVE/test_webhcat_server.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 json +-from mock.mock import MagicMock, patch ++from unittest.mock import MagicMock, patch + from stacks.utils.RMFTestCase import * + from resource_management.core.exceptions import Fail + from resource_management.libraries.functions import StackFeature +@@ -207,13 +207,13 @@ + owner = 'hcat', + group = 'hadoop', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('Directory', '/var/log/webhcat', + owner = 'hcat', + group = 'hadoop', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('Directory', '/usr/hdp/current/hive-webhcat/etc/webhcat', + owner = 'hcat', +@@ -241,7 +241,7 @@ + content = InlineTemplate('log4jproperties\nline2'), + owner = 'hcat', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + ) + + def assert_configure_secured(self): +@@ -249,13 +249,13 @@ + owner = 'hcat', + group = 'hadoop', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('Directory', '/var/log/webhcat', + owner = 'hcat', + group = 'hadoop', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('Directory', '/usr/hdp/current/hive-webhcat/etc/webhcat', + owner = 'hcat', +@@ -284,13 +284,13 @@ + content = InlineTemplate('log4jproperties\nline2'), + owner = 'hcat', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + ) + + @patch("resource_management.core.sudo.path_isdir", new = MagicMock(return_value = True)) + def test_pre_upgrade_restart(self): + config_file = self.get_src_folder()+"/test/python/stacks/2.0.6/configs/default.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + version = '2.2.1.0-3242' + json_content['commandParams']['version'] = version +@@ -312,7 +312,7 @@ + import sys + + config_file = self.get_src_folder()+"/test/python/stacks/2.0.6/configs/default.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + version = '2.3.0.0-1234' + json_content['commandParams']['version'] = version +@@ -343,7 +343,7 @@ + import sys + + config_file = self.get_src_folder()+"/test/python/stacks/2.0.6/configs/default.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + version = '2.3.0.0-1234' + json_content['commandParams']['version'] = version +@@ -364,13 +364,13 @@ + owner = 'hcat', + group = 'hadoop', + create_parents = True, +- mode = 0755) ++ mode = 0o755) + + self.assertResourceCalled('Directory', '/var/log/webhcat', + owner = 'hcat', + group = 'hadoop', + create_parents = True, +- mode = 0755) ++ mode = 0o755) + + self.assertResourceCalled('Directory', '/usr/hdp/current/hive-webhcat/etc/webhcat', + owner = 'hcat', +@@ -389,18 +389,18 @@ + owner = 'hive', + group = 'hadoop', + conf_dir = '/usr/hdp/2.3.0.0-1234/hive/conf', +- configuration_attributes = {u'final': {u'hive.optimize.bucketmapjoin.sortedmerge': u'true', +- u'javax.jdo.option.ConnectionDriverName': u'true', +- u'javax.jdo.option.ConnectionPassword': u'true'}}, ++ configuration_attributes = {'final': {'hive.optimize.bucketmapjoin.sortedmerge': 'true', ++ 'javax.jdo.option.ConnectionDriverName': 'true', ++ 'javax.jdo.option.ConnectionPassword': 'true'}}, + configurations = self.getConfig()['configurations']['hive-site'], + ) + self.assertResourceCalled('XmlConfig', 'yarn-site.xml', + owner = 'yarn', + group = 'hadoop', + conf_dir = '/usr/hdp/2.3.0.0-1234/hadoop/conf', +- configuration_attributes = {u'final': {u'yarn.nodemanager.container-executor.class': u'true', +- u'yarn.nodemanager.disk-health-checker.min-healthy-disks': u'true', +- u'yarn.nodemanager.local-dirs': u'true'}}, ++ configuration_attributes = {'final': {'yarn.nodemanager.container-executor.class': 'true', ++ 'yarn.nodemanager.disk-health-checker.min-healthy-disks': 'true', ++ 'yarn.nodemanager.local-dirs': 'true'}}, + configurations = self.getConfig()['configurations']['yarn-site'], + ) + +@@ -417,7 +417,7 @@ + content = InlineTemplate('log4jproperties\nline2'), + owner = 'hcat', + group = 'hadoop', +- mode = 0644) ++ mode = 0o644) + + self.assertNoMoreResources() + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/hooks/after-INSTALL/test_after_install.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/hooks/after-INSTALL/test_after_install.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/hooks/after-INSTALL/test_after_install.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/hooks/after-INSTALL/test_after_install.py 2022-07-11 00:52:31.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + + ''' +@@ -21,7 +21,7 @@ + + import json + +-from mock.mock import MagicMock, patch ++from unittest.mock import MagicMock, patch + from stacks.utils.RMFTestCase import * + from resource_management.core.logger import Logger + from resource_management.libraries.functions import conf_select +@@ -61,7 +61,7 @@ + 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() +@@ -75,12 +75,12 @@ + def test_hook_default_conf_select(self, rmtree_mock, symlink_mock, conf_select_select_mock, conf_select_create_mock): + + def mocked_conf_select(arg1, arg2, arg3, dry_run = False): +- return "/etc/{0}/{1}/0".format(arg2, arg3) ++ return "/etc/{}/{}/0".format(arg2, arg3) + + conf_select_create_mock.side_effect = mocked_conf_select + + config_file = self.get_src_folder() + "/test/python/stacks/2.0.6/configs/default.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + + version = '2.3.0.0-1234' +@@ -110,12 +110,12 @@ + + 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" +@@ -143,13 +143,13 @@ + raise Exception("whoops") + else: + return None +- return "/etc/{0}/{1}/0".format(arg2, arg3) ++ return "/etc/{}/{}/0".format(arg2, arg3) + + conf_select_create_mock.side_effect = mocked_conf_select + conf_select_select_mock.side_effect = mocked_conf_select + + config_file = self.get_src_folder() + "/test/python/stacks/2.0.6/configs/default.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + + version = '2.3.0.0-1234' +@@ -179,12 +179,12 @@ + + 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" +@@ -217,12 +217,12 @@ + """ + + def mocked_conf_select(arg1, arg2, arg3, dry_run = False): +- return "/etc/{0}/{1}/0".format(arg2, arg3) ++ return "/etc/{}/{}/0".format(arg2, arg3) + + conf_select_create_mock.side_effect = mocked_conf_select + + config_file = self.get_src_folder() + "/test/python/stacks/2.0.6/configs/default.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + + version = '2.3.0.0-1234' +@@ -249,12 +249,12 @@ + def test_hook_default_conf_select_suspended(self, rmtree_mock, symlink_mock, conf_select_select_mock, conf_select_create_mock): + + def mocked_conf_select(arg1, arg2, arg3, dry_run = False): +- return "/etc/{0}/{1}/0".format(arg2, arg3) ++ return "/etc/{}/{}/0".format(arg2, arg3) + + conf_select_create_mock.side_effect = mocked_conf_select + + config_file = self.get_src_folder() + "/test/python/stacks/2.0.6/configs/default.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + + version = '2.3.0.0-1234' +@@ -283,12 +283,12 @@ + + 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" +@@ -316,12 +316,12 @@ + """ + + def mocked_conf_select(arg1, arg2, arg3, dry_run = False): +- return "/etc/{0}/{1}/0".format(arg2, arg3) ++ return "/etc/{}/{}/0".format(arg2, arg3) + + conf_select_create_mock.side_effect = mocked_conf_select + + config_file = self.get_src_folder() + "/test/python/stacks/2.0.6/configs/default.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + + version = '2.3.0.0-1234' +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/hooks/before-ANY/test_before_any.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/hooks/before-ANY/test_before_any.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/hooks/before-ANY/test_before_any.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/hooks/before-ANY/test_before_any.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 @@ + ''' + + from stacks.utils.RMFTestCase import * +-from mock.mock import MagicMock, call, patch ++from unittest.mock import MagicMock, call, patch + from resource_management import Hook + import itertools + import getpass +@@ -59,96 +59,96 @@ + 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)', +@@ -156,16 +156,16 @@ + 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)', +@@ -180,10 +180,10 @@ + 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']), +@@ -193,7 +193,7 @@ + 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, +@@ -203,10 +203,10 @@ + 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',) +@@ -214,10 +214,10 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/hooks/before-INSTALL/test_before_install.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/hooks/before-INSTALL/test_before_install.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/hooks/before-INSTALL/test_before_install.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/hooks/before-INSTALL/test_before_install.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 mock.mock import MagicMock, call, patch ++from unittest.mock import MagicMock, call, patch + from resource_management import * + from stacks.utils.RMFTestCase import * + import getpass +@@ -40,7 +40,7 @@ + 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, +@@ -48,7 +48,7 @@ + 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, +@@ -56,7 +56,7 @@ + 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, +@@ -72,7 +72,7 @@ + def test_hook_no_repos(self): + + config_file = self.get_src_folder() + "/test/python/stacks/2.0.6/configs/default.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + command_json = json.load(f) + + command_json['repositoryFile']['repositories'] = [] +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/hooks/before-SET_KEYTAB/test_before_set_keytab.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/hooks/before-SET_KEYTAB/test_before_set_keytab.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/hooks/before-SET_KEYTAB/test_before_set_keytab.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/hooks/before-SET_KEYTAB/test_before_set_keytab.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 @@ + ''' + + from stacks.utils.RMFTestCase import * +-from mock.mock import MagicMock, patch ++from unittest.mock import MagicMock, patch + from resource_management import Hook + import itertools + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/hooks/before-START/test_before_start.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/hooks/before-START/test_before_start.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/hooks/before-START/test_before_start.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/hooks/before-START/test_before_start.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 @@ + ''' + + from stacks.utils.RMFTestCase import * +-from mock.mock import MagicMock, call, patch ++from unittest.mock import MagicMock, call, patch + from resource_management import Hook + from resource_management.core.exceptions import Fail + import json +@@ -45,7 +45,7 @@ + self.assertResourceCalled('Directory', '/var/log/hadoop', + owner = 'root', + group = 'hadoop', +- mode = 0775, ++ mode = 0o775, + create_parents = True, + cd_access = 'a', + ) +@@ -75,14 +75,14 @@ + ) + 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']), +@@ -91,7 +91,7 @@ + ) + 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', +@@ -104,13 +104,13 @@ + 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() +@@ -131,7 +131,7 @@ + self.assertResourceCalled('Directory', '/var/log/hadoop', + owner = 'root', + group = 'hadoop', +- mode = 0775, ++ mode = 0o775, + create_parents = True, + cd_access = 'a', + ) +@@ -160,14 +160,14 @@ + ) + 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']), +@@ -176,7 +176,7 @@ + ) + 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', +@@ -190,19 +190,19 @@ + 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() + + def test_hook_default_hdfs(self): + config_file = self._getStackTestsFolder() + "/2.0.6/configs/default.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + default_json = json.load(f) + + default_json['serviceName']= 'HDFS' +@@ -221,7 +221,7 @@ + self.assertResourceCalled('Directory', '/var/log/hadoop', + owner = 'root', + group = 'hadoop', +- mode = 0775, ++ mode = 0o775, + create_parents = True, + cd_access = 'a', + ) +@@ -250,14 +250,14 @@ + ) + 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']), +@@ -266,7 +266,7 @@ + ) + 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', +@@ -280,19 +280,19 @@ + 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() + + def test_hook_refresh_topology_custom_directories(self): +- config_file = "{0}/test/python/stacks/2.0.6/configs/default.json".format(self.get_src_folder()) +- with open(config_file, "r") as f: ++ config_file = "{}/test/python/stacks/2.0.6/configs/default.json".format(self.get_src_folder()) ++ with open(config_file) as f: + default_json = json.load(f) + + default_json['serviceName'] = 'HDFS' +@@ -313,7 +313,7 @@ + self.assertResourceCalled('Directory', '/var/log/hadoop', + owner = 'root', + group = 'hadoop', +- mode = 0775, ++ mode = 0o775, + create_parents = True, + cd_access = 'a', + ) +@@ -342,14 +342,14 @@ + ) + 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']), +@@ -358,7 +358,7 @@ + ) + 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', +@@ -372,12 +372,12 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/OOZIE/test_oozie_client.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/OOZIE/test_oozie_client.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/OOZIE/test_oozie_client.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/OOZIE/test_oozie_client.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 mock.mock import MagicMock, call, patch ++from unittest.mock import MagicMock, call, patch + from stacks.utils.RMFTestCase import * + from resource_management.libraries.script.script import Script + import json +@@ -46,7 +46,7 @@ + self.assertResourceCalled('XmlConfig', 'oozie-site.xml', + owner = 'oozie', + group = 'hadoop', +- mode = 0664, ++ mode = 0o664, + conf_dir = '/etc/oozie/conf', + configurations = self.getConfig()['configurations']['oozie-site'], + configuration_attributes = self.getConfig()['configurationAttributes']['oozie-site'] +@@ -64,13 +64,13 @@ + self.assertResourceCalled('File', '/etc/security/limits.d/oozie.conf', + owner = 'root', + group = 'root', +- mode=0644, ++ mode=0o644, + content=Template("oozie.conf.j2"), + ) + self.assertResourceCalled('File', '/etc/oozie/conf/oozie-log4j.properties', + owner = 'oozie', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + content = InlineTemplate('log4jproperties\nline2') + ) + self.assertResourceCalled('File', '/etc/oozie/conf/adminusers.txt', +@@ -112,7 +112,7 @@ + self.assertResourceCalled('XmlConfig', 'oozie-site.xml', + owner = 'oozie', + group = 'hadoop', +- mode = 0664, ++ mode = 0o664, + conf_dir = '/etc/oozie/conf', + configurations = self.getConfig()['configurations']['oozie-site'], + configuration_attributes = self.getConfig()['configurationAttributes']['oozie-site'] +@@ -130,13 +130,13 @@ + self.assertResourceCalled('File', '/etc/security/limits.d/oozie.conf', + owner = 'root', + group = 'root', +- mode=0644, ++ mode=0o644, + content=Template("oozie.conf.j2"), + ) + self.assertResourceCalled('File', '/etc/oozie/conf/oozie-log4j.properties', + owner = 'oozie', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + content = InlineTemplate('log4jproperties\nline2') + ) + self.assertResourceCalled('File', '/etc/oozie/conf/adminusers.txt', +@@ -164,7 +164,7 @@ + + def test_configure_default_hdp22(self): + config_file = "stacks/2.0.6/configs/default.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + default_json = json.load(f) + + +@@ -184,7 +184,7 @@ + self.assertResourceCalled('XmlConfig', 'oozie-site.xml', + owner = 'oozie', + group = 'hadoop', +- mode = 0664, ++ mode = 0o664, + conf_dir = '/usr/hdp/current/oozie-client/conf', + configurations = self.getConfig()['configurations']['oozie-site'], + configuration_attributes = self.getConfig()['configurationAttributes']['oozie-site'] +@@ -202,20 +202,20 @@ + self.assertResourceCalled('File', '/etc/security/limits.d/oozie.conf', + owner = 'root', + group = 'root', +- mode=0644, ++ mode=0o644, + content=Template("oozie.conf.j2"), + ) + self.assertResourceCalled('File', '/usr/hdp/current/oozie-client/conf/oozie-log4j.properties', + owner = 'oozie', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + content = InlineTemplate('log4jproperties\nline2') + ) + self.assertResourceCalled('File', '/usr/hdp/current/oozie-client/conf/adminusers.txt', + content = Template('adminusers.txt.j2'), + owner = 'oozie', + group = 'hadoop', +- mode=0644, ++ mode=0o644, + ) + self.assertResourceCalled('File', '/usr/hdp/current/oozie-client/conf/hadoop-config.xml', + owner = 'oozie', +@@ -237,7 +237,7 @@ + + def test_pre_upgrade_restart(self): + config_file = self.get_src_folder()+"/test/python/stacks/2.0.6/configs/default.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + version = '2.2.1.0-3242' + json_content['commandParams']['version'] = version +@@ -257,7 +257,7 @@ + def test_pre_upgrade_restart_23(self, call_mock, os_path__exists_mock): + config_file = self.get_src_folder()+"/test/python/stacks/2.0.6/configs/default.json" + os_path__exists_mock.return_value = False +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + version = '2.3.0.0-1234' + json_content['commandParams']['version'] = version +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/OOZIE/test_oozie_server.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/OOZIE/test_oozie_server.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/OOZIE/test_oozie_server.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/OOZIE/test_oozie_server.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 +-from mock.mock import MagicMock, call, patch ++from unittest.mock import MagicMock, call, patch + from stacks.utils.RMFTestCase import * + from resource_management.libraries.script.script import Script + from resource_management.core import shell +@@ -129,7 +129,7 @@ + hadoop_conf_dir = '/etc/hadoop/conf', + type = 'directory', + action = ['create_on_execute'], hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', hdfs_site=self.getConfig()['configurations']['hdfs-site'], principal_name=UnknownConfigurationMock(), default_fs='hdfs://c6401.ambari.apache.org:8020', +- mode = 0775, ++ mode = 0o775, + ) + self.assertResourceCalled('HdfsResource', None, + immutable_paths = self.DEFAULT_IMMUTABLE_PATHS, +@@ -150,9 +150,9 @@ + self.assertResourceCalled('XmlConfig', 'oozie-site.xml', + group = 'hadoop', + conf_dir = '/etc/oozie/conf', +- mode = 0664, +- configuration_attributes = {u'final': {u'oozie.service.CallableQueueService.queue.size': u'true', +- u'oozie.service.PurgeService.purge.interval': u'true'}}, ++ mode = 0o664, ++ configuration_attributes = {'final': {'oozie.service.CallableQueueService.queue.size': 'true', ++ 'oozie.service.PurgeService.purge.interval': 'true'}}, + owner = 'oozie', + configurations = self.getConfig()['configurations']['oozie-site'], + ) +@@ -169,14 +169,14 @@ + self.assertResourceCalled('File', '/etc/security/limits.d/oozie.conf', + owner = 'root', + group = 'root', +- mode=0644, ++ mode=0o644, + content=Template("oozie.conf.j2"), + ) + self.assertResourceCalled('File', '/etc/oozie/conf/oozie-log4j.properties', + content = InlineTemplate('log4jproperties\nline2'), + owner = 'oozie', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/etc/oozie/conf/adminusers.txt', + owner = 'oozie', +@@ -210,62 +210,62 @@ + cd_access = 'a', + group = 'hadoop', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('Directory', '/var/run/oozie', + owner = 'oozie', + cd_access = 'a', + group = 'hadoop', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('Directory', '/var/log/oozie', + owner = 'oozie', + cd_access = 'a', + group = 'hadoop', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('Directory', '/var/tmp/oozie', + owner = 'oozie', + cd_access = 'a', + group = 'hadoop', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('Directory', '/hadoop/oozie/data', + owner = 'oozie', + cd_access = 'a', + group = 'hadoop', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('Directory', '/var/lib/oozie', + owner = 'oozie', + cd_access = 'a', + group = 'hadoop', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('Directory', '/var/lib/oozie/oozie-server/webapps/', + owner = 'oozie', + cd_access = 'a', + group = 'hadoop', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('Directory', '/var/lib/oozie/oozie-server/conf', + owner = 'oozie', + cd_access = 'a', + group = 'hadoop', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('Directory', '/var/lib/oozie/oozie-server', + owner = 'oozie', + create_parents = True, + group = 'hadoop', +- mode = 0755, ++ mode = 0o755, + cd_access = 'a', + ) + self.assertResourceCalled('Directory', '/usr/lib/oozie/libext', +@@ -312,14 +312,14 @@ + + self.assertResourceCalled('File', '/usr/lib/oozie/.prepare_war_cmd', + content = 'cd /var/tmp/oozie && /usr/lib/oozie/bin/oozie-setup.sh prepare-war', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/usr/lib/oozie/.war_libext_content', + content = 'ext-2.2.zip', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/usr/lib/oozie/.hashcode', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('Directory', '/var/lib/oozie/oozie-server', + owner = 'oozie', +@@ -357,7 +357,7 @@ + hadoop_conf_dir = '/etc/hadoop/conf', + type = 'directory', + action = ['create_on_execute'], hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', +- mode = 0775, ++ mode = 0o775, + ) + self.assertResourceCalled('HdfsResource', None, + immutable_paths = self.DEFAULT_IMMUTABLE_PATHS, +@@ -381,9 +381,9 @@ + self.assertResourceCalled('XmlConfig', 'oozie-site.xml', + group = 'hadoop', + conf_dir = '/etc/oozie/conf', +- mode = 0664, +- configuration_attributes = {u'final': {u'oozie.service.CallableQueueService.queue.size': u'true', +- u'oozie.service.PurgeService.purge.interval': u'true'}}, ++ mode = 0o664, ++ configuration_attributes = {'final': {'oozie.service.CallableQueueService.queue.size': 'true', ++ 'oozie.service.PurgeService.purge.interval': 'true'}}, + owner = 'oozie', + configurations = self.getConfig()['configurations']['oozie-site'], + ) +@@ -400,14 +400,14 @@ + self.assertResourceCalled('File', '/etc/security/limits.d/oozie.conf', + owner = 'root', + group = 'root', +- mode=0644, ++ mode=0o644, + content=Template("oozie.conf.j2"), + ) + self.assertResourceCalled('File', '/etc/oozie/conf/oozie-log4j.properties', + content = InlineTemplate('log4jproperties\nline2'), + owner = 'oozie', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/etc/oozie/conf/adminusers.txt', + owner = 'oozie', +@@ -438,62 +438,62 @@ + cd_access = 'a', + group = 'hadoop', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('Directory', '/var/run/oozie', + owner = 'oozie', + cd_access = 'a', + group = 'hadoop', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('Directory', '/var/log/oozie', + owner = 'oozie', + cd_access = 'a', + group = 'hadoop', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('Directory', '/var/tmp/oozie', + owner = 'oozie', + cd_access = 'a', + group = 'hadoop', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('Directory', '/hadoop/oozie/data', + owner = 'oozie', + cd_access = 'a', + group = 'hadoop', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('Directory', '/var/lib/oozie', + owner = 'oozie', + cd_access = 'a', + group = 'hadoop', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('Directory', '/var/lib/oozie/oozie-server/webapps/', + owner = 'oozie', + cd_access = 'a', + group = 'hadoop', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('Directory', '/var/lib/oozie/oozie-server/conf', + owner = 'oozie', + cd_access = 'a', + group = 'hadoop', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('Directory', '/var/lib/oozie/oozie-server', + owner = 'oozie', + create_parents = True, + group = 'hadoop', +- mode = 0755, ++ mode = 0o755, + cd_access = 'a', + ) + self.assertResourceCalled('Directory', '/usr/lib/oozie/libext', +@@ -507,7 +507,7 @@ + not_if = "ambari-sudo.sh su oozie -l -s /bin/bash -c '[RMF_EXPORT_PLACEHOLDER]ls /var/run/oozie/oozie.pid >/dev/null 2>&1 && ps -p `cat /var/run/oozie/oozie.pid` >/dev/null 2>&1'", + sudo = True, + ) +- self.assertResourceCalled('Execute', ('chown', u'oozie:hadoop', '/usr/lib/oozie/libext/ext-2.2.zip'), ++ self.assertResourceCalled('Execute', ('chown', 'oozie:hadoop', '/usr/lib/oozie/libext/ext-2.2.zip'), + not_if = "ambari-sudo.sh su oozie -l -s /bin/bash -c '[RMF_EXPORT_PLACEHOLDER]ls /var/run/oozie/oozie.pid >/dev/null 2>&1 && ps -p `cat /var/run/oozie/oozie.pid` >/dev/null 2>&1'", + sudo = True, + ) +@@ -541,14 +541,14 @@ + ) + self.assertResourceCalled('File', '/usr/lib/oozie/.prepare_war_cmd', + content = 'cd /var/tmp/oozie && /usr/lib/oozie/bin/oozie-setup.sh prepare-war', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/usr/lib/oozie/.war_libext_content', + content = 'ext-2.2.zip', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/usr/lib/oozie/.hashcode', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('Directory', '/var/lib/oozie/oozie-server', + owner = 'oozie', +@@ -599,7 +599,7 @@ + action = ['create_on_execute'], hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', + hadoop_conf_dir = '/etc/hadoop/conf', + type = 'directory', +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('HdfsResource', None, + immutable_paths = self.DEFAULT_IMMUTABLE_PATHS, +@@ -678,7 +678,7 @@ + call_mocks = MagicMock(return_value=(0, "New Oozie WAR file with added")) + + config_file = "stacks/2.0.6/configs/secured.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + secured_json = json.load(f) + + secured_json['configurations']['oozie-site']['oozie.ha.authentication.kerberos.principal'] = "*" +@@ -747,7 +747,7 @@ + action = ['create_on_execute'], hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', + hadoop_conf_dir = '/etc/hadoop/conf', + type = 'directory', +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('HdfsResource', None, + immutable_paths = self.DEFAULT_IMMUTABLE_PATHS, +@@ -805,7 +805,7 @@ + hadoop_bin_dir = '/usr/bin', + type = 'directory', + action = ['create_on_execute'], hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', hdfs_site=self.getConfig()['configurations']['hdfs-site'], principal_name=UnknownConfigurationMock(), default_fs='hdfs://c6401.ambari.apache.org:8020', +- mode = 0775, ++ mode = 0o775, + ) + self.assertResourceCalled('HdfsResource', None, + immutable_paths = self.DEFAULT_IMMUTABLE_PATHS, +@@ -826,7 +826,7 @@ + self.assertResourceCalled('XmlConfig', 'oozie-site.xml', + owner = 'oozie', + group = 'hadoop', +- mode = 0664, ++ mode = 0o664, + conf_dir = '/etc/oozie/conf', + configurations = self.getConfig()['configurations']['oozie-site'], + configuration_attributes = self.getConfig()['configurationAttributes']['oozie-site'] +@@ -844,13 +844,13 @@ + self.assertResourceCalled('File', '/etc/security/limits.d/oozie.conf', + owner = 'root', + group = 'root', +- mode=0644, ++ mode=0o644, + content=Template("oozie.conf.j2"), + ) + self.assertResourceCalled('File', '/etc/oozie/conf/oozie-log4j.properties', + owner = 'oozie', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + content = InlineTemplate('log4jproperties\nline2') + ) + self.assertResourceCalled('File', '/etc/oozie/conf/adminusers.txt', +@@ -881,63 +881,63 @@ + owner = 'oozie', + group = 'hadoop', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + cd_access='a' + ) + self.assertResourceCalled('Directory', '/var/run/oozie', + owner = 'oozie', + group = 'hadoop', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + cd_access='a' + ) + self.assertResourceCalled('Directory', '/var/log/oozie', + owner = 'oozie', + group = 'hadoop', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + cd_access='a' + ) + self.assertResourceCalled('Directory', '/var/tmp/oozie', + owner = 'oozie', + group = 'hadoop', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + cd_access='a' + ) + self.assertResourceCalled('Directory', '/hadoop/oozie/data', + owner = 'oozie', + group = 'hadoop', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + cd_access='a' + ) + self.assertResourceCalled('Directory', '/var/lib/oozie', + owner = 'oozie', + group = 'hadoop', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + cd_access='a' + ) + self.assertResourceCalled('Directory', '/var/lib/oozie/oozie-server/webapps/', + owner = 'oozie', + group = 'hadoop', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + cd_access='a' + ) + self.assertResourceCalled('Directory', '/var/lib/oozie/oozie-server/conf', + owner = 'oozie', + group = 'hadoop', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + cd_access='a' + ) + self.assertResourceCalled('Directory', '/var/lib/oozie/oozie-server', + owner = 'oozie', + group = 'hadoop', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + cd_access='a' + ) + self.assertResourceCalled('Directory', '/usr/lib/oozie/libext', +@@ -970,14 +970,14 @@ + + self.assertResourceCalled('File', '/usr/lib/oozie/.prepare_war_cmd', + content = 'cd /var/tmp/oozie && /usr/lib/oozie/bin/oozie-setup.sh prepare-war', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/usr/lib/oozie/.war_libext_content', + content = 'ext-2.2.zip', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/usr/lib/oozie/.hashcode', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('Directory', '/var/lib/oozie/oozie-server', + owner = 'oozie', +@@ -999,7 +999,7 @@ + hadoop_bin_dir = '/usr/bin', + type = 'directory', + action = ['create_on_execute'], hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', hdfs_site=self.getConfig()['configurations']['hdfs-site'], principal_name='hdfs', default_fs='hdfs://c6401.ambari.apache.org:8020', +- mode = 0775, ++ mode = 0o775, + ) + self.assertResourceCalled('HdfsResource', None, + immutable_paths = self.DEFAULT_IMMUTABLE_PATHS, +@@ -1025,7 +1025,7 @@ + self.assertResourceCalled('XmlConfig', 'oozie-site.xml', + owner = 'oozie', + group = 'hadoop', +- mode = 0664, ++ mode = 0o664, + conf_dir = '/etc/oozie/conf', + configurations = expected_oozie_site, + configuration_attributes = self.getConfig()['configurationAttributes']['oozie-site'] +@@ -1043,13 +1043,13 @@ + self.assertResourceCalled('File', '/etc/security/limits.d/oozie.conf', + owner = 'root', + group = 'root', +- mode=0644, ++ mode=0o644, + content=Template("oozie.conf.j2"), + ) + self.assertResourceCalled('File', '/etc/oozie/conf/oozie-log4j.properties', + owner = 'oozie', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + content = InlineTemplate('log4jproperties\nline2') + ) + self.assertResourceCalled('File', '/etc/oozie/conf/adminusers.txt', +@@ -1080,63 +1080,63 @@ + owner = 'oozie', + group = 'hadoop', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + cd_access='a' + ) + self.assertResourceCalled('Directory', '/var/run/oozie', + owner = 'oozie', + group = 'hadoop', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + cd_access='a' + ) + self.assertResourceCalled('Directory', '/var/log/oozie', + owner = 'oozie', + group = 'hadoop', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + cd_access='a' + ) + self.assertResourceCalled('Directory', '/var/tmp/oozie', + owner = 'oozie', + group = 'hadoop', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + cd_access='a' + ) + self.assertResourceCalled('Directory', '/hadoop/oozie/data', + owner = 'oozie', + group = 'hadoop', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + cd_access='a' + ) + self.assertResourceCalled('Directory', '/var/lib/oozie', + owner = 'oozie', + group = 'hadoop', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + cd_access='a' + ) + self.assertResourceCalled('Directory', '/var/lib/oozie/oozie-server/webapps/', + owner = 'oozie', + group = 'hadoop', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + cd_access='a' + ) + self.assertResourceCalled('Directory', '/var/lib/oozie/oozie-server/conf', + owner = 'oozie', + group = 'hadoop', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + cd_access='a' + ) + self.assertResourceCalled('Directory', '/var/lib/oozie/oozie-server', + owner = 'oozie', + group = 'hadoop', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + cd_access='a' + ) + self.assertResourceCalled('Directory', '/usr/lib/oozie/libext', +@@ -1169,14 +1169,14 @@ + + self.assertResourceCalled('File', '/usr/lib/oozie/.prepare_war_cmd', + content = 'cd /var/tmp/oozie && /usr/lib/oozie/bin/oozie-setup.sh prepare-war -secure', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/usr/lib/oozie/.war_libext_content', + content = 'ext-2.2.zip', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/usr/lib/oozie/.hashcode', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('Directory', '/var/lib/oozie/oozie-server', + owner = 'oozie', +@@ -1197,7 +1197,7 @@ + isfile_mock.side_effect = [True, False] + call_mocks = MagicMock(return_value=(0, "New Oozie WAR file with added")) + config_file = "stacks/2.0.6/configs/default.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + default_json = json.load(f) + + default_json['clusterLevelParams']['stack_version']= '2.2' +@@ -1250,18 +1250,18 @@ + self.assertEqual(glob_mock.call_count,1) + glob_mock.assert_called_with('/usr/hdp/2.2.1.0-2135/hadoop/lib/hadoop-lzo*.jar') + +- self.assertResourceCalled('Execute', ('ambari-python-wrap', '/usr/bin/hdp-select', 'set', 'oozie-client', u'2.2.1.0-2135'), ++ self.assertResourceCalled('Execute', ('ambari-python-wrap', '/usr/bin/hdp-select', 'set', 'oozie-client', '2.2.1.0-2135'), + sudo = True ) + +- self.assertResourceCalled('Execute', ('ambari-python-wrap', '/usr/bin/hdp-select', 'set', 'oozie-server', u'2.2.1.0-2135'), ++ self.assertResourceCalled('Execute', ('ambari-python-wrap', '/usr/bin/hdp-select', 'set', 'oozie-server', '2.2.1.0-2135'), + sudo = True ) + +- self.assertResourceCalled('Directory', '/usr/hdp/current/oozie-server/libext', mode = 0777) ++ self.assertResourceCalled('Directory', '/usr/hdp/current/oozie-server/libext', mode = 0o777) + + 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-52', + action = ['prepare'], +- components = [u'HDP', 'main'], ++ components = ['HDP', 'main'], + repo_template = UnknownConfigurationMock(), + repo_file_name = 'ambari-hdp-1', + mirror_list = None, +@@ -1269,7 +1269,7 @@ + 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-52', + action = ['prepare'], +- components = [u'HDP-GPL', 'main'], ++ components = ['HDP-GPL', 'main'], + repo_template = UnknownConfigurationMock(), + repo_file_name = 'ambari-hdp-1', + mirror_list = None, +@@ -1277,7 +1277,7 @@ + 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 = UnknownConfigurationMock(), + repo_file_name = 'ambari-hdp-1', + mirror_list = None, +@@ -1290,7 +1290,7 @@ + self.assertResourceCalled('Package', ('hadooplzo_1_2_3_4-native'), retry_count = 5, retry_on_repo_unavailability = False) + self.assertResourceCalled('Execute', ('cp', '/usr/share/HDP-oozie/ext-2.2.zip', '/usr/hdp/current/oozie-server/libext'), sudo=True) + self.assertResourceCalled('Execute', ('chown', 'oozie:hadoop', '/usr/hdp/current/oozie-server/libext/ext-2.2.zip'), sudo=True) +- self.assertResourceCalled('File', '/usr/hdp/current/oozie-server/libext/ext-2.2.zip', mode = 0644) ++ self.assertResourceCalled('File', '/usr/hdp/current/oozie-server/libext/ext-2.2.zip', mode = 0o644) + self.assertNoMoreResources() + + @patch("os.path.isdir") +@@ -1320,7 +1320,7 @@ + + config_file = self.get_src_folder()+"/test/python/stacks/2.2/configs/oozie-upgrade.json" + +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + + version = '2.3.0.0-1234' +@@ -1348,7 +1348,7 @@ + self.assertResourceCalled('Execute', ('ambari-python-wrap', '/usr/bin/hdp-select', 'set', 'oozie-client', '2.3.0.0-1234'), sudo = True) + self.assertResourceCalled('Execute', ('ambari-python-wrap', '/usr/bin/hdp-select', 'set', 'oozie-server', '2.3.0.0-1234'), sudo = True) + +- self.assertResourceCalled('Directory', '/usr/hdp/current/oozie-server/libext', mode = 0777) ++ self.assertResourceCalled('Directory', '/usr/hdp/current/oozie-server/libext', mode = 0o777) + + 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-52', +@@ -1383,7 +1383,7 @@ + + self.assertResourceCalled('Execute', ('cp', '/usr/share/HDP-oozie/ext-2.2.zip', '/usr/hdp/current/oozie-server/libext'), sudo=True) + self.assertResourceCalled('Execute', ('chown', 'oozie:hadoop', '/usr/hdp/current/oozie-server/libext/ext-2.2.zip'), sudo=True) +- self.assertResourceCalled('File', '/usr/hdp/current/oozie-server/libext/ext-2.2.zip', mode = 0644) ++ self.assertResourceCalled('File', '/usr/hdp/current/oozie-server/libext/ext-2.2.zip', mode = 0o644) + self.assertNoMoreResources() + + @patch("os.path.isdir") +@@ -1413,7 +1413,7 @@ + + config_file = self.get_src_folder()+"/test/python/stacks/2.2/configs/oozie-upgrade.json" + +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + + version = '2.3.0.0-1234' +@@ -1448,7 +1448,7 @@ + self.assertResourceCalled('Execute', ('ambari-python-wrap', '/usr/bin/hdp-select', 'set', 'oozie-client', '2.3.0.0-1234'), sudo = True) + self.assertResourceCalled('Execute', ('ambari-python-wrap', '/usr/bin/hdp-select', 'set', 'oozie-server', '2.3.0.0-1234'), sudo = True) + +- self.assertResourceCalled('Directory', '/usr/hdp/current/oozie-server/libext', mode = 0777) ++ self.assertResourceCalled('Directory', '/usr/hdp/current/oozie-server/libext', mode = 0o777) + + 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-52', +@@ -1483,7 +1483,7 @@ + + self.assertResourceCalled('Execute', ('cp', '/usr/share/HDP-oozie/ext-2.2.zip', '/usr/hdp/current/oozie-server/libext'), sudo=True) + self.assertResourceCalled('Execute', ('chown', 'oozie:hadoop', '/usr/hdp/current/oozie-server/libext/ext-2.2.zip'), sudo=True) +- self.assertResourceCalled('File', '/usr/hdp/current/oozie-server/libext/ext-2.2.zip', mode = 0644) ++ self.assertResourceCalled('File', '/usr/hdp/current/oozie-server/libext/ext-2.2.zip', mode = 0o644) + self.assertNoMoreResources() + + +@@ -1514,14 +1514,14 @@ + self.assertEqual(isfile_mock.call_count,1) + isfile_mock.assert_called_with('/usr/share/HDP-oozie/ext-2.2.zip') + +- self.assertResourceCalled('Execute', ('ambari-python-wrap', '/usr/bin/hdp-select', 'set', 'oozie-client', u'2.2.0.0-0000'), sudo = True) +- self.assertResourceCalled('Execute', ('ambari-python-wrap', '/usr/bin/hdp-select', 'set', 'oozie-server', u'2.2.0.0-0000'), sudo = True) ++ self.assertResourceCalled('Execute', ('ambari-python-wrap', '/usr/bin/hdp-select', 'set', 'oozie-client', '2.2.0.0-0000'), sudo = True) ++ self.assertResourceCalled('Execute', ('ambari-python-wrap', '/usr/bin/hdp-select', 'set', 'oozie-server', '2.2.0.0-0000'), sudo = True) + +- self.assertResourceCalled('Directory', '/usr/hdp/current/oozie-server/libext',mode = 0777) ++ self.assertResourceCalled('Directory', '/usr/hdp/current/oozie-server/libext',mode = 0o777) + + self.assertResourceCalled('Execute', ('cp', '/usr/share/HDP-oozie/ext-2.2.zip', '/usr/hdp/current/oozie-server/libext'), sudo=True) + self.assertResourceCalled('Execute', ('chown', 'oozie:hadoop', '/usr/hdp/current/oozie-server/libext/ext-2.2.zip'), sudo=True) +- self.assertResourceCalled('File', '/usr/hdp/current/oozie-server/libext/ext-2.2.zip',mode = 0644) ++ self.assertResourceCalled('File', '/usr/hdp/current/oozie-server/libext/ext-2.2.zip',mode = 0o644) + self.assertNoMoreResources() + + +@@ -1533,7 +1533,7 @@ + """ + config_file = self.get_src_folder()+"/test/python/stacks/2.2/configs/oozie-upgrade.json" + +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + + version = '2.3.0.0-1234' +@@ -1567,7 +1567,7 @@ + hadoop_conf_dir = '/usr/hdp/2.3.0.0-1234/hadoop/conf', + type = 'directory', + action = ['create_on_execute'], hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', +- mode = 0755 ) ++ mode = 0o755 ) + + self.assertResourceCalled('HdfsResource', None, + immutable_paths = self.DEFAULT_IMMUTABLE_PATHS, +@@ -1596,7 +1596,7 @@ + """ + config_file = self.get_src_folder()+"/test/python/stacks/2.2/configs/oozie-upgrade.json" + +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + + version = '2.3.0.0-1234' +@@ -1643,7 +1643,7 @@ + hadoop_conf_dir = '/usr/hdp/2.3.0.0-1234/hadoop/conf', + type = 'directory', + action = ['create_on_execute'], hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', +- mode = 0755 ) ++ mode = 0o755 ) + + self.assertResourceCalled('HdfsResource', None, + immutable_paths = self.DEFAULT_IMMUTABLE_PATHS, +@@ -1689,7 +1689,7 @@ + + config_file = self.get_src_folder()+"/test/python/stacks/2.2/configs/oozie-upgrade.json" + +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + + version = '2.3.0.0-1234' +@@ -1716,7 +1716,7 @@ + self.assertResourceCalled('Execute', ('ambari-python-wrap', '/usr/bin/hdp-select', 'set', 'oozie-client', '2.3.0.0-1234'), sudo = True) + self.assertResourceCalled('Execute', ('ambari-python-wrap', '/usr/bin/hdp-select', 'set', 'oozie-server', '2.3.0.0-1234'), sudo = True) + +- self.assertResourceCalled('Directory', '/usr/hdp/current/oozie-server/libext', mode = 0777) ++ self.assertResourceCalled('Directory', '/usr/hdp/current/oozie-server/libext', mode = 0o777) + + 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-52', +@@ -1753,7 +1753,7 @@ + self.assertResourceCalled('Execute', ('chown', 'oozie:hadoop', '/usr/hdp/current/oozie-server/libext/ext-2.2.zip'), sudo=True) + + self.assertResourceCalled('File', '/usr/hdp/current/oozie-server/libext/ext-2.2.zip', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('Execute', 'ambari-sudo.sh cp /usr/hdp/2.3.0.0-1234/falcon/oozie/ext/falcon-oozie-el-extension-*.jar /usr/hdp/current/oozie-server/libext') + self.assertResourceCalled('Execute', 'ambari-sudo.sh chown oozie:hadoop /usr/hdp/current/oozie-server/libext/falcon-oozie-el-extension-*.jar') +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/OOZIE/test_oozie_service_check.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/OOZIE/test_oozie_service_check.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/OOZIE/test_oozie_service_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/OOZIE/test_oozie_service_check.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 mock.mock import MagicMock, call, patch ++from unittest.mock import MagicMock, call, patch + from stacks.utils.RMFTestCase import * + from resource_management.libraries.script.script import Script + import json +@@ -35,7 +35,7 @@ + glob_mock.return_value = ["examples-dir", "b"] + + config_file = self.get_src_folder()+"/test/python/stacks/2.0.6/configs/default.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + version = '2.3.0.0-1234' + json_content['commandParams']['version'] = version +@@ -58,12 +58,12 @@ + self.assertResourceCalled('File', + "/tmp/oozieSmoke2.sh", + content = StaticFile("oozieSmoke2.sh"), +- mode = 0755) ++ mode = 0o755) + + self.assertResourceCalled('File', + "/tmp/prepareOozieHdfsDirectories.sh", + content = StaticFile("prepareOozieHdfsDirectories.sh"), +- mode = 0755) ++ mode = 0o755) + + self.assertResourceCalled('Execute', + ('/tmp/prepareOozieHdfsDirectories.sh', '/usr/hdp/current/oozie-client/conf', 'examples-dir', '/usr/hdp/2.3.0.0-1234/hadoop/conf', 'c6402.ambari.apache.org:8050', 'hdfs://c6401.ambari.apache.org:8020', 'default', 'map-reduce'), +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/OOZIE/test_service_check.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/OOZIE/test_service_check.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/OOZIE/test_service_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/OOZIE/test_service_check.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 @@ + ''' + from stacks.utils.RMFTestCase import * + import resource_management.libraries.functions +-from mock.mock import MagicMock, call, patch ++from unittest.mock import MagicMock, call, patch + + @patch("glob.glob", new = MagicMock(return_value="/usr/something/oozie-client/lib")) + @patch("platform.linux_distribution", new = MagicMock(return_value="Linux")) +@@ -56,11 +56,11 @@ + def assert_service_check(self): + self.assertResourceCalled('File', '/tmp/oozieSmoke2.sh', + content = StaticFile('oozieSmoke2.sh'), +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('File', '/tmp/prepareOozieHdfsDirectories.sh', + content = StaticFile('prepareOozieHdfsDirectories.sh'), +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('Execute', ('/tmp/prepareOozieHdfsDirectories.sh', '/etc/oozie/conf', '/', '/etc/hadoop/conf', 'c6402.ambari.apache.org:8050', 'hdfs://c6401.ambari.apache.org:8020', 'default', 'no-op'), + logoutput = True, +@@ -75,7 +75,7 @@ + kinit_path_local = '/usr/bin/kinit', + user = 'hdfs', + dfs_type = '', +- mode = 0770, ++ mode = 0o770, + owner = 'ambari-qa', + action = ['create_on_execute'], hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', hdfs_site=self.getConfig()['configurations']['hdfs-site'], principal_name=UnknownConfigurationMock(), default_fs='hdfs://c6401.ambari.apache.org:8020', + hadoop_conf_dir = '/etc/hadoop/conf', +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/PIG/test_pig_client.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/PIG/test_pig_client.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/PIG/test_pig_client.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/PIG/test_pig_client.py 2022-07-11 00:52:31.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +@@ -43,19 +43,19 @@ + ) + self.assertResourceCalled('File', '/etc/pig/conf/pig-env.sh', + owner = 'hdfs', +- mode=0755, ++ mode=0o755, + content = InlineTemplate(self.getConfig()['configurations']['pig-env']['content']) + ) + self.assertResourceCalled('File', '/etc/pig/conf/pig.properties', + owner = 'hdfs', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + content = 'pigproperties\nline2' + ) + self.assertResourceCalled('File', '/etc/pig/conf/log4j.properties', + owner = 'hdfs', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + content = 'log4jproperties\nline2' + ) + self.assertNoMoreResources() +@@ -78,19 +78,19 @@ + ) + self.assertResourceCalled('File', '/etc/pig/conf/pig-env.sh', + owner = 'hdfs', +- mode=0755, ++ mode=0o755, + content = InlineTemplate(self.getConfig()['configurations']['pig-env']['content']) + ) + self.assertResourceCalled('File', '/etc/pig/conf/pig.properties', + owner = 'hdfs', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + content = 'pigproperties\nline2' + ) + self.assertResourceCalled('File', '/etc/pig/conf/log4j.properties', + owner = 'hdfs', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + content = 'log4jproperties\nline2' + ) + self.assertNoMoreResources() +@@ -98,7 +98,7 @@ + def test_configure_default_hdp22(self): + + config_file = "stacks/2.0.6/configs/default.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + default_json = json.load(f) + + default_json['clusterLevelParams']['stack_version'] = '2.2' +@@ -118,26 +118,26 @@ + ) + self.assertResourceCalled('File', '/usr/hdp/current/pig-client/conf/pig-env.sh', + owner = 'hdfs', +- mode=0755, ++ mode=0o755, + content = InlineTemplate(self.getConfig()['configurations']['pig-env']['content']) + ) + self.assertResourceCalled('File', '/usr/hdp/current/pig-client/conf/pig.properties', + owner = 'hdfs', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + content = 'pigproperties\nline2' + ) + self.assertResourceCalled('File', '/usr/hdp/current/pig-client/conf/log4j.properties', + owner = 'hdfs', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + content = 'log4jproperties\nline2' + ) + self.assertNoMoreResources() + + def test_pre_upgrade_restart(self): + config_file = self.get_src_folder()+"/test/python/stacks/2.0.6/configs/default.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + version = '2.2.1.0-3242' + json_content['commandParams']['version'] = version +@@ -154,7 +154,7 @@ + + def test_pre_upgrade_restart_23(self): + config_file = self.get_src_folder()+"/test/python/stacks/2.0.6/configs/default.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + version = '2.3.0.0-1234' + json_content['commandParams']['version'] = version +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/PIG/test_pig_service_check.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/PIG/test_pig_service_check.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/PIG/test_pig_service_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/PIG/test_pig_service_check.py 2022-07-11 00:52:31.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +@@ -41,7 +41,7 @@ + kinit_path_local = '/usr/bin/kinit', + user = 'hdfs', + dfs_type = '', +- mode = 0770, ++ mode = 0o770, + owner = 'ambari-qa', + action = ['create_on_execute'], hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', hdfs_site=self.getConfig()['configurations']['hdfs-site'], principal_name=UnknownConfigurationMock(), default_fs='hdfs://c6401.ambari.apache.org:8020', + hadoop_conf_dir = '/etc/hadoop/conf', +@@ -97,7 +97,7 @@ + + self.assertResourceCalled('File', '/tmp/pigSmoke.sh', + content = StaticFile('pigSmoke.sh'), +- mode = 0755, ++ mode = 0o755, + ) + + self.assertResourceCalled('Execute', 'pig /tmp/pigSmoke.sh', +@@ -131,7 +131,7 @@ + kinit_path_local = '/usr/bin/kinit', + user = 'hdfs', + dfs_type = '', +- mode = 0770, ++ mode = 0o770, + owner = 'ambari-qa', + action = ['create_on_execute'], hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', hdfs_site=self.getConfig()['configurations']['hdfs-site'], principal_name='hdfs', default_fs='hdfs://c6401.ambari.apache.org:8020', + hadoop_conf_dir = '/etc/hadoop/conf', +@@ -190,7 +190,7 @@ + + self.assertResourceCalled('File', '/tmp/pigSmoke.sh', + content = StaticFile('pigSmoke.sh'), +- mode = 0755, ++ mode = 0o755, + ) + + self.assertResourceCalled('Execute', 'pig /tmp/pigSmoke.sh', +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/SQOOP/test_service_check.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/SQOOP/test_service_check.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/SQOOP/test_service_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/SQOOP/test_service_check.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 mock.mock import MagicMock, call, patch ++from unittest.mock import MagicMock, call, patch + from stacks.utils.RMFTestCase import * + from resource_management.libraries.functions import get_kinit_path + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/SQOOP/test_sqoop.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/SQOOP/test_sqoop.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/SQOOP/test_sqoop.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/SQOOP/test_sqoop.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 mock.mock import MagicMock, call, patch ++from unittest.mock import MagicMock, call, patch + from stacks.utils.RMFTestCase import * + import json + +@@ -68,7 +68,7 @@ + + def test_configure_add_jdbc(self): + config_file = self.get_src_folder()+"/test/python/stacks/2.0.6/configs/secured.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + loaded_json = json.load(f) + + loaded_json['configurations']['sqoop-env']['jdbc_drivers'] = 'org.postgresql.Driver, oracle.jdbc.driver.OracleDriver' +@@ -86,11 +86,11 @@ + ) + self.assertResourceCalled('File', '/usr/lib/sqoop/lib/test-postgres-jdbc.jar', + content = DownloadSource('http://c6401.ambari.apache.org:8080/resources/test-postgres-jdbc.jar'), +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/usr/lib/sqoop/lib/oracle-jdbc-driver.jar', + content = DownloadSource('http://c6401.ambari.apache.org:8080/resources/oracle-jdbc-driver.jar'), +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('Directory', '/usr/lib/sqoop/conf', + owner = 'sqoop', +@@ -128,7 +128,7 @@ + + def test_pre_upgrade_restart_23(self): + config_file = self.get_src_folder()+"/test/python/stacks/2.0.6/configs/default.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + version = '2.3.0.0-1234' + json_content['commandParams']['version'] = version +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/YARN/test_historyserver.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/YARN/test_historyserver.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/YARN/test_historyserver.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/YARN/test_historyserver.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 json +-from mock.mock import MagicMock, patch, call ++from unittest.mock import MagicMock, patch, call + from resource_management.libraries.script.script import Script + from resource_management.libraries.functions import version + from stacks.utils.RMFTestCase import * +@@ -65,14 +65,14 @@ + type="directory", + action=["create_on_execute"], + hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', +- user=u"hdfs", ++ user="hdfs", + dfs_type = '', +- owner=u"tez", ++ owner="tez", + mode=493, + hadoop_bin_dir="/usr/bin", + hadoop_conf_dir="/etc/hadoop/conf", + hdfs_site=self.getConfig()["configurations"]["hdfs-site"], +- default_fs=u'hdfs://c6401.ambari.apache.org:8020', ++ default_fs='hdfs://c6401.ambari.apache.org:8020', + security_enabled=False, + kinit_path_local="/usr/bin/kinit", + keytab=UnknownConfigurationMock(), +@@ -84,14 +84,14 @@ + type="directory", + action=["create_on_execute"], + hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', +- user=u'hdfs', +- owner=u"tez", ++ user='hdfs', ++ owner="tez", + dfs_type = '', + mode=493, + hadoop_bin_dir="/usr/bin", + hadoop_conf_dir="/etc/hadoop/conf", + hdfs_site=self.getConfig()["configurations"]["hdfs-site"], +- default_fs=u'hdfs://c6401.ambari.apache.org:8020', ++ default_fs='hdfs://c6401.ambari.apache.org:8020', + security_enabled=False, + kinit_path_local="/usr/bin/kinit", + keytab=UnknownConfigurationMock(), +@@ -102,12 +102,12 @@ + immutable_paths = self.DEFAULT_IMMUTABLE_PATHS, + action=['execute'], + hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', +- user=u'hdfs', ++ user='hdfs', + hadoop_bin_dir="/usr/bin", + dfs_type = '', + hadoop_conf_dir="/etc/hadoop/conf", + hdfs_site=self.getConfig()["configurations"]["hdfs-site"], +- default_fs=u'hdfs://c6401.ambari.apache.org:8020', ++ default_fs='hdfs://c6401.ambari.apache.org:8020', + security_enabled=False, + kinit_path_local="/usr/bin/kinit", + keytab=UnknownConfigurationMock(), +@@ -262,7 +262,7 @@ + hadoop_bin_dir = '/usr/bin', + type = 'directory', + action = ['create_on_execute'], hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', hdfs_site=self.getConfig()['configurations']['hdfs-site'], principal_name=UnknownConfigurationMock(), default_fs='hdfs://c6401.ambari.apache.org:8020', +- mode = 01777, ++ mode = 0o1777, + ) + self.assertResourceCalled('HdfsResource', '/tmp', + immutable_paths = self.DEFAULT_IMMUTABLE_PATHS, +@@ -279,7 +279,7 @@ + hadoop_conf_dir = '/etc/hadoop/conf', + type = 'directory', + action = ['create_on_execute'], hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', +- mode = 0777 ++ mode = 0o777 + ) + + self.assertResourceCalled('HdfsResource', '/tmp/entity-file-history/active', +@@ -339,7 +339,7 @@ + hadoop_bin_dir = '/usr/bin', + type = 'directory', + action = ['create_on_execute'], hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', hdfs_site=self.getConfig()['configurations']['hdfs-site'], principal_name=UnknownConfigurationMock(), default_fs='hdfs://c6401.ambari.apache.org:8020', +- mode = 0777, ++ mode = 0o777, + ) + self.assertResourceCalled('HdfsResource', None, + immutable_paths = self.DEFAULT_IMMUTABLE_PATHS, +@@ -362,7 +362,7 @@ + self.assertResourceCalled('XmlConfig', 'core-site.xml', + owner = 'hdfs', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + conf_dir = '/etc/hadoop/conf', + configurations = self.getConfig()['configurations']['core-site'], + configuration_attributes = self.getConfig()['configurationAttributes']['core-site'] +@@ -370,7 +370,7 @@ + self.assertResourceCalled('XmlConfig', 'hdfs-site.xml', + owner = 'hdfs', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + conf_dir = '/etc/hadoop/conf', + configurations = self.getConfig()['configurations']['hdfs-site'], + configuration_attributes = self.getConfig()['configurationAttributes']['hdfs-site'] +@@ -378,7 +378,7 @@ + self.assertResourceCalled('XmlConfig', 'mapred-site.xml', + owner = 'yarn', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + conf_dir = '/etc/hadoop/conf', + configurations = self.getConfig()['configurations']['mapred-site'], + configuration_attributes = self.getConfig()['configurationAttributes']['mapred-site'] +@@ -386,7 +386,7 @@ + self.assertResourceCalled('XmlConfig', 'yarn-site.xml', + owner = 'yarn', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + conf_dir = '/etc/hadoop/conf', + configurations = self.getConfig()['configurations']['yarn-site'], + configuration_attributes = self.getConfig()['configurationAttributes']['yarn-site'] +@@ -394,43 +394,43 @@ + self.assertResourceCalled('XmlConfig', 'capacity-scheduler.xml', + owner = 'yarn', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + conf_dir = '/etc/hadoop/conf', + configurations = self.getConfig()['configurations']['capacity-scheduler'], + configuration_attributes = self.getConfig()['configurationAttributes']['capacity-scheduler'] + ) + self.assertResourceCalled('File', '/etc/security/limits.d/yarn.conf', + content = Template('yarn.conf.j2'), +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/etc/security/limits.d/mapreduce.conf', + content = Template('mapreduce.conf.j2'), +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/etc/hadoop/conf/yarn-env.sh', + content = InlineTemplate(self.getConfig()['configurations']['yarn-env']['content']), + owner = 'yarn', + group = 'hadoop', +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('File', '/usr/lib/hadoop-yarn/bin/container-executor', + group = 'hadoop', +- mode = 02050, ++ mode = 0o2050, + ) + self.assertResourceCalled('File', '/etc/hadoop/conf/container-executor.cfg', + content = InlineTemplate(self.getConfig()['configurations']['container-executor']['content']), + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('Directory', '/cgroups_test/cpu', + group = 'hadoop', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + cd_access="a" + ) + self.assertResourceCalled('File', '/etc/hadoop/conf/mapred-env.sh', + content = InlineTemplate(self.getConfig()['configurations']['mapred-env']['content']), +- mode = 0755, ++ mode = 0o755, + owner = 'hdfs', + ) + self.assertResourceCalled('File', '/etc/hadoop/conf/taskcontroller.cfg', +@@ -529,7 +529,7 @@ + hadoop_bin_dir = '/usr/bin', + type = 'directory', + action = ['create_on_execute'], hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', hdfs_site=self.getConfig()['configurations']['hdfs-site'], principal_name='hdfs', default_fs='hdfs://c6401.ambari.apache.org:8020', +- mode = 01777, ++ mode = 0o1777, + ) + + self.assertResourceCalled('HdfsResource', '/tmp', +@@ -547,7 +547,7 @@ + hadoop_conf_dir = '/etc/hadoop/conf', + type = 'directory', + action = ['create_on_execute'], hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', +- mode = 0777 ++ mode = 0o777 + ) + self.assertResourceCalled('HdfsResource', '/tmp/entity-file-history/active', + immutable_paths = self.DEFAULT_IMMUTABLE_PATHS, +@@ -606,7 +606,7 @@ + hadoop_bin_dir = '/usr/bin', + type = 'directory', + action = ['create_on_execute'], hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', hdfs_site=self.getConfig()['configurations']['hdfs-site'], principal_name='hdfs', default_fs='hdfs://c6401.ambari.apache.org:8020', +- mode = 0777, ++ mode = 0o777, + ) + self.assertResourceCalled('HdfsResource', None, + immutable_paths = self.DEFAULT_IMMUTABLE_PATHS, +@@ -629,7 +629,7 @@ + self.assertResourceCalled('XmlConfig', 'core-site.xml', + owner = 'hdfs', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + conf_dir = '/etc/hadoop/conf', + configurations = self.getConfig()['configurations']['core-site'], + configuration_attributes = self.getConfig()['configurationAttributes']['core-site'] +@@ -637,7 +637,7 @@ + self.assertResourceCalled('XmlConfig', 'hdfs-site.xml', + owner = 'hdfs', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + conf_dir = '/etc/hadoop/conf', + configurations = self.getConfig()['configurations']['hdfs-site'], + configuration_attributes = self.getConfig()['configurationAttributes']['hdfs-site'] +@@ -645,7 +645,7 @@ + self.assertResourceCalled('XmlConfig', 'mapred-site.xml', + owner = 'yarn', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + conf_dir = '/etc/hadoop/conf', + configurations = self.getConfig()['configurations']['mapred-site'], + configuration_attributes = self.getConfig()['configurationAttributes']['mapred-site'] +@@ -653,7 +653,7 @@ + self.assertResourceCalled('XmlConfig', 'yarn-site.xml', + owner = 'yarn', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + conf_dir = '/etc/hadoop/conf', + configurations = self.getConfig()['configurations']['yarn-site'], + configuration_attributes = self.getConfig()['configurationAttributes']['yarn-site'] +@@ -661,55 +661,55 @@ + self.assertResourceCalled('XmlConfig', 'capacity-scheduler.xml', + owner = 'yarn', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + conf_dir = '/etc/hadoop/conf', + configurations = self.getConfig()['configurations']['capacity-scheduler'], + configuration_attributes = self.getConfig()['configurationAttributes']['capacity-scheduler'] + ) + self.assertResourceCalled('File', '/etc/security/limits.d/yarn.conf', + content = Template('yarn.conf.j2'), +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/etc/security/limits.d/mapreduce.conf', + content = Template('mapreduce.conf.j2'), +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/etc/hadoop/conf/yarn-env.sh', + content = InlineTemplate(self.getConfig()['configurations']['yarn-env']['content']), + owner = 'yarn', + group = 'hadoop', +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('File', '/usr/lib/hadoop-yarn/bin/container-executor', + group = 'hadoop', +- mode = 06050, ++ mode = 0o6050, + ) + self.assertResourceCalled('File', '/etc/hadoop/conf/container-executor.cfg', + content = InlineTemplate(self.getConfig()['configurations']['container-executor']['content']), + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('Directory', '/cgroups_test/cpu', + group = 'hadoop', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + cd_access="a" + ) + self.assertResourceCalled('File', '/etc/hadoop/conf/mapred-env.sh', + content = InlineTemplate(self.getConfig()['configurations']['mapred-env']['content']), +- mode = 0755, ++ mode = 0o755, + owner = 'root', + ) + self.assertResourceCalled('File', '/usr/lib/hadoop/sbin/task-controller', + owner = 'root', + group = 'hadoop', +- mode = 06050, ++ mode = 0o6050, + ) + self.assertResourceCalled('File', '/etc/hadoop/conf/taskcontroller.cfg', + content = Template('taskcontroller.cfg.j2'), + owner = 'root', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/etc/hadoop/conf/yarn_jaas.conf', + content = Template('yarn_jaas.conf.j2'), +@@ -758,7 +758,7 @@ + @patch("resource_management.core.sudo.path_isdir", new = MagicMock(return_value = True)) + def test_pre_upgrade_restart_23(self, copy_to_hdfs_mock): + config_file = self.get_src_folder()+"/test/python/stacks/2.0.6/configs/default.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + version = '2.3.0.0-1234' + json_content['commandParams']['version'] = version +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/YARN/test_mapreduce2_client.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/YARN/test_mapreduce2_client.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/YARN/test_mapreduce2_client.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/YARN/test_mapreduce2_client.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 json +-from mock.mock import MagicMock, call, patch ++from unittest.mock import MagicMock, call, patch + from resource_management.libraries.functions import version + from stacks.utils.RMFTestCase import * + import os +@@ -97,7 +97,7 @@ + self.assertResourceCalled('XmlConfig', 'core-site.xml', + owner = 'hdfs', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + conf_dir = '/etc/hadoop/conf', + configurations = self.getConfig()['configurations']['core-site'], + configuration_attributes = self.getConfig()['configurationAttributes']['core-site'] +@@ -105,7 +105,7 @@ + self.assertResourceCalled('XmlConfig', 'hdfs-site.xml', + owner = 'hdfs', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + conf_dir = '/etc/hadoop/conf', + configurations = self.getConfig()['configurations']['hdfs-site'], + configuration_attributes = self.getConfig()['configurationAttributes']['hdfs-site'] +@@ -113,7 +113,7 @@ + self.assertResourceCalled('XmlConfig', 'mapred-site.xml', + owner = 'yarn', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + conf_dir = '/etc/hadoop/conf', + configurations = self.getConfig()['configurations']['mapred-site'], + configuration_attributes = self.getConfig()['configurationAttributes']['mapred-site'] +@@ -121,7 +121,7 @@ + self.assertResourceCalled('XmlConfig', 'yarn-site.xml', + owner = 'yarn', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + conf_dir = '/etc/hadoop/conf', + configurations = self.getConfig()['configurations']['yarn-site'], + configuration_attributes = self.getConfig()['configurationAttributes']['yarn-site'] +@@ -129,43 +129,43 @@ + self.assertResourceCalled('XmlConfig', 'capacity-scheduler.xml', + owner = 'yarn', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + conf_dir = '/etc/hadoop/conf', + configurations = self.getConfig()['configurations']['capacity-scheduler'], + configuration_attributes = self.getConfig()['configurationAttributes']['capacity-scheduler'] + ) + self.assertResourceCalled('File', '/etc/security/limits.d/yarn.conf', + content = Template('yarn.conf.j2'), +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/etc/security/limits.d/mapreduce.conf', + content = Template('mapreduce.conf.j2'), +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/etc/hadoop/conf/yarn-env.sh', + content = InlineTemplate(self.getConfig()['configurations']['yarn-env']['content']), + owner = 'yarn', + group = 'hadoop', +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('File', '/usr/lib/hadoop-yarn/bin/container-executor', + group = 'hadoop', +- mode = 02050, ++ mode = 0o2050, + ) + self.assertResourceCalled('File', '/etc/hadoop/conf/container-executor.cfg', + content = InlineTemplate(self.getConfig()['configurations']['container-executor']['content']), + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('Directory', '/cgroups_test/cpu', + group = 'hadoop', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + cd_access="a" + ) + self.assertResourceCalled('File', '/etc/hadoop/conf/mapred-env.sh', + content = InlineTemplate(self.getConfig()['configurations']['mapred-env']['content']), +- mode = 0755, ++ mode = 0o755, + owner = 'hdfs', + ) + self.assertResourceCalled('File', '/etc/hadoop/conf/taskcontroller.cfg', +@@ -261,7 +261,7 @@ + self.assertResourceCalled('XmlConfig', 'core-site.xml', + owner = 'hdfs', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + conf_dir = '/etc/hadoop/conf', + configurations = self.getConfig()['configurations']['core-site'], + configuration_attributes = self.getConfig()['configurationAttributes']['core-site'] +@@ -269,7 +269,7 @@ + self.assertResourceCalled('XmlConfig', 'hdfs-site.xml', + owner = 'hdfs', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + conf_dir = '/etc/hadoop/conf', + configurations = self.getConfig()['configurations']['hdfs-site'], + configuration_attributes = self.getConfig()['configurationAttributes']['hdfs-site'] +@@ -277,7 +277,7 @@ + self.assertResourceCalled('XmlConfig', 'mapred-site.xml', + owner = 'yarn', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + conf_dir = '/etc/hadoop/conf', + configurations = self.getConfig()['configurations']['mapred-site'], + configuration_attributes = self.getConfig()['configurationAttributes']['mapred-site'] +@@ -285,7 +285,7 @@ + self.assertResourceCalled('XmlConfig', 'yarn-site.xml', + owner = 'yarn', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + conf_dir = '/etc/hadoop/conf', + configurations = self.getConfig()['configurations']['yarn-site'], + configuration_attributes = self.getConfig()['configurationAttributes']['yarn-site'] +@@ -293,55 +293,55 @@ + self.assertResourceCalled('XmlConfig', 'capacity-scheduler.xml', + owner = 'yarn', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + conf_dir = '/etc/hadoop/conf', + configurations = self.getConfig()['configurations']['capacity-scheduler'], + configuration_attributes = self.getConfig()['configurationAttributes']['capacity-scheduler'] + ) + self.assertResourceCalled('File', '/etc/security/limits.d/yarn.conf', + content = Template('yarn.conf.j2'), +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/etc/security/limits.d/mapreduce.conf', + content = Template('mapreduce.conf.j2'), +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/etc/hadoop/conf/yarn-env.sh', + content = InlineTemplate(self.getConfig()['configurations']['yarn-env']['content']), + owner = 'yarn', + group = 'hadoop', +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('File', '/usr/lib/hadoop-yarn/bin/container-executor', + group = 'hadoop', +- mode = 06050, ++ mode = 0o6050, + ) + self.assertResourceCalled('File', '/etc/hadoop/conf/container-executor.cfg', + content = InlineTemplate(self.getConfig()['configurations']['container-executor']['content']), + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('Directory', '/cgroups_test/cpu', + group = 'hadoop', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + cd_access="a" + ) + self.assertResourceCalled('File', '/etc/hadoop/conf/mapred-env.sh', + content = InlineTemplate(self.getConfig()['configurations']['mapred-env']['content']), +- mode = 0755, ++ mode = 0o755, + owner = 'root', + ) + self.assertResourceCalled('File', '/usr/lib/hadoop/sbin/task-controller', + owner = 'root', + group = 'hadoop', +- mode = 06050, ++ mode = 0o6050, + ) + self.assertResourceCalled('File', '/etc/hadoop/conf/taskcontroller.cfg', + content = Template('taskcontroller.cfg.j2'), + owner = 'root', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/etc/hadoop/conf/yarn_jaas.conf', + content = Template('yarn_jaas.conf.j2'), +@@ -403,7 +403,7 @@ + + def test_pre_upgrade_restart_23(self): + config_file = self.get_src_folder()+"/test/python/stacks/2.0.6/configs/client-upgrade.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + version = '2.3.0.0-1234' + json_content['commandParams']['version'] = version +@@ -424,7 +424,7 @@ + @patch("resource_management.core.sudo.path_isdir", new = MagicMock(return_value = True)) + def test_stack_upgrade_save_new_config(self): + config_file = self.get_src_folder()+"/test/python/stacks/2.0.6/configs/client-upgrade.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + version = '2.3.0.0-1234' + json_content['commandParams']['version'] = version +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/YARN/test_mapreduce2_service_check.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/YARN/test_mapreduce2_service_check.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/YARN/test_mapreduce2_service_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/YARN/test_mapreduce2_service_check.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 mock.mock import MagicMock, call, patch ++from unittest.mock import MagicMock, call, patch + from stacks.utils.RMFTestCase import * + import os + +@@ -48,7 +48,7 @@ + kinit_path_local = '/usr/bin/kinit', + user = 'hdfs', + dfs_type = '', +- mode = 0770, ++ mode = 0o770, + owner = 'ambari-qa', + action = ['create_on_execute'], hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', hdfs_site=self.getConfig()['configurations']['hdfs-site'], principal_name=UnknownConfigurationMock(), default_fs='hdfs://c6401.ambari.apache.org:8020', + hadoop_conf_dir = '/etc/hadoop/conf', +@@ -122,7 +122,7 @@ + kinit_path_local = '/usr/bin/kinit', + user = 'hdfs', + dfs_type = '', +- mode = 0770, ++ mode = 0o770, + owner = 'ambari-qa', + action = ['create_on_execute'], hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', hdfs_site=self.getConfig()['configurations']['hdfs-site'], principal_name='hdfs', default_fs='hdfs://c6401.ambari.apache.org:8020', + hadoop_conf_dir = '/etc/hadoop/conf', +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/YARN/test_nodemanager.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/YARN/test_nodemanager.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/YARN/test_nodemanager.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/YARN/test_nodemanager.py 2022-07-11 00:52:31.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +@@ -187,14 +187,14 @@ + + self.assertResourceCalled('Directory', '/var/lib/ambari-agent/data/yarn', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('Directory', '/hadoop/yarn/log', + group = 'hadoop', + cd_access = 'a', + create_parents = True, + ignore_failures = True, +- mode = 0775, ++ mode = 0o775, + owner = 'yarn', + ) + self.assertResourceCalled('Directory', '/hadoop/yarn/log1', +@@ -202,23 +202,23 @@ + cd_access = 'a', + create_parents = True, + ignore_failures = True, +- mode = 0775, ++ mode = 0o775, + owner = 'yarn', + ) + self.assertResourceCalled('File', '/var/lib/ambari-agent/data/yarn/yarn_log_dir_mount.hist', + content = '\n# This file keeps track of the last known mount-point for each dir.\n# It is safe to delete, since it will get regenerated the next time that the component of the service starts.\n# However, it is not advised to delete this file since Ambari may\n# re-create a dir that used to be mounted on a drive but is now mounted on the root.\n# Comments begin with a hash (#) symbol\n# dir,mount_point\n', + owner = 'hdfs', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('Directory', '/var/lib/ambari-agent/data/yarn', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('Directory', '/hadoop/yarn/local', + owner = 'yarn', + group = 'hadoop', +- mode = 0755, ++ mode = 0o755, + create_parents = True, + ignore_failures = True, + cd_access='a' +@@ -228,20 +228,20 @@ + create_parents = True, + group = 'hadoop', + ignore_failures = True, +- mode = 0755, ++ mode = 0o755, + cd_access='a' + ) + self.assertResourceCalled('File', '/var/lib/ambari-agent/data/yarn/yarn_local_dir_mount.hist', + content = '\n# This file keeps track of the last known mount-point for each dir.\n# It is safe to delete, since it will get regenerated the next time that the component of the service starts.\n# However, it is not advised to delete this file since Ambari may\n# re-create a dir that used to be mounted on a drive but is now mounted on the root.\n# Comments begin with a hash (#) symbol\n# dir,mount_point\n', + owner = 'hdfs', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + ) + + self.assertResourceCalled('XmlConfig', 'core-site.xml', + owner = 'hdfs', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + conf_dir = '/etc/hadoop/conf', + configurations = self.getConfig()['configurations']['core-site'], + configuration_attributes = self.getConfig()['configurationAttributes']['core-site'] +@@ -249,7 +249,7 @@ + self.assertResourceCalled('XmlConfig', 'hdfs-site.xml', + owner = 'hdfs', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + conf_dir = '/etc/hadoop/conf', + configurations = self.getConfig()['configurations']['hdfs-site'], + configuration_attributes = self.getConfig()['configurationAttributes']['hdfs-site'] +@@ -257,7 +257,7 @@ + self.assertResourceCalled('XmlConfig', 'mapred-site.xml', + owner = 'yarn', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + conf_dir = '/etc/hadoop/conf', + configurations = self.getConfig()['configurations']['mapred-site'], + configuration_attributes = self.getConfig()['configurationAttributes']['mapred-site'] +@@ -265,7 +265,7 @@ + self.assertResourceCalled('XmlConfig', 'yarn-site.xml', + owner = 'yarn', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + conf_dir = '/etc/hadoop/conf', + configurations = self.getConfig()['configurations']['yarn-site'], + configuration_attributes = self.getConfig()['configurationAttributes']['yarn-site'] +@@ -273,43 +273,43 @@ + self.assertResourceCalled('XmlConfig', 'capacity-scheduler.xml', + owner = 'yarn', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + conf_dir = '/etc/hadoop/conf', + configurations = self.getConfig()['configurations']['capacity-scheduler'], + configuration_attributes = self.getConfig()['configurationAttributes']['capacity-scheduler'] + ) + self.assertResourceCalled('File', '/etc/security/limits.d/yarn.conf', + content = Template('yarn.conf.j2'), +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/etc/security/limits.d/mapreduce.conf', + content = Template('mapreduce.conf.j2'), +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/etc/hadoop/conf/yarn-env.sh', + content = InlineTemplate(self.getConfig()['configurations']['yarn-env']['content']), + owner = 'yarn', + group = 'hadoop', +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('File', '/usr/lib/hadoop-yarn/bin/container-executor', + group = 'hadoop', +- mode = 02050, ++ mode = 0o2050, + ) + self.assertResourceCalled('File', '/etc/hadoop/conf/container-executor.cfg', + content = InlineTemplate(self.getConfig()['configurations']['container-executor']['content']), + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('Directory', '/cgroups_test/cpu', + group = 'hadoop', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + cd_access="a" + ) + self.assertResourceCalled('File', '/etc/hadoop/conf/mapred-env.sh', + content = InlineTemplate(self.getConfig()['configurations']['mapred-env']['content']), +- mode = 0755, ++ mode = 0o755, + owner = 'hdfs', + ) + self.assertResourceCalled('File', '/etc/hadoop/conf/taskcontroller.cfg', +@@ -406,32 +406,32 @@ + ) + self.assertResourceCalled('Directory', '/var/lib/ambari-agent/data/yarn', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('Directory', '/hadoop/yarn/log', + owner = 'yarn', + group = 'hadoop', + create_parents = True, + ignore_failures = True, +- mode = 0775, ++ mode = 0o775, + cd_access='a', + ) + self.assertResourceCalled('File', '/var/lib/ambari-agent/data/yarn/yarn_log_dir_mount.hist', + content = '\n# This file keeps track of the last known mount-point for each dir.\n# It is safe to delete, since it will get regenerated the next time that the component of the service starts.\n# However, it is not advised to delete this file since Ambari may\n# re-create a dir that used to be mounted on a drive but is now mounted on the root.\n# Comments begin with a hash (#) symbol\n# dir,mount_point\n', + owner = 'hdfs', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('Directory', '/var/lib/ambari-agent/data/yarn', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('Directory', '/hadoop/yarn/local', + owner = 'yarn', + group = 'hadoop', + create_parents = True, + ignore_failures = True, +- mode = 0755, ++ mode = 0o755, + cd_access='a', + recursive_mode_flags = {'d': 'a+rwx', 'f': 'a+rw'}, + ) +@@ -439,13 +439,13 @@ + content = '\n# This file keeps track of the last known mount-point for each dir.\n# It is safe to delete, since it will get regenerated the next time that the component of the service starts.\n# However, it is not advised to delete this file since Ambari may\n# re-create a dir that used to be mounted on a drive but is now mounted on the root.\n# Comments begin with a hash (#) symbol\n# dir,mount_point\n', + owner = 'hdfs', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + ) + + self.assertResourceCalled('XmlConfig', 'core-site.xml', + owner = 'hdfs', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + conf_dir = '/etc/hadoop/conf', + configurations = self.getConfig()['configurations']['core-site'], + configuration_attributes = self.getConfig()['configurationAttributes']['core-site'] +@@ -453,7 +453,7 @@ + self.assertResourceCalled('XmlConfig', 'hdfs-site.xml', + owner = 'hdfs', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + conf_dir = '/etc/hadoop/conf', + configurations = self.getConfig()['configurations']['hdfs-site'], + configuration_attributes = self.getConfig()['configurationAttributes']['hdfs-site'] +@@ -461,7 +461,7 @@ + self.assertResourceCalled('XmlConfig', 'mapred-site.xml', + owner = 'yarn', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + conf_dir = '/etc/hadoop/conf', + configurations = self.getConfig()['configurations']['mapred-site'], + configuration_attributes = self.getConfig()['configurationAttributes']['mapred-site'] +@@ -469,7 +469,7 @@ + self.assertResourceCalled('XmlConfig', 'yarn-site.xml', + owner = 'yarn', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + conf_dir = '/etc/hadoop/conf', + configurations = self.getConfig()['configurations']['yarn-site'], + configuration_attributes = self.getConfig()['configurationAttributes']['yarn-site'] +@@ -477,55 +477,55 @@ + self.assertResourceCalled('XmlConfig', 'capacity-scheduler.xml', + owner = 'yarn', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + conf_dir = '/etc/hadoop/conf', + configurations = self.getConfig()['configurations']['capacity-scheduler'], + configuration_attributes = self.getConfig()['configurationAttributes']['capacity-scheduler'] + ) + self.assertResourceCalled('File', '/etc/security/limits.d/yarn.conf', + content = Template('yarn.conf.j2'), +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/etc/security/limits.d/mapreduce.conf', + content = Template('mapreduce.conf.j2'), +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/etc/hadoop/conf/yarn-env.sh', + content = InlineTemplate(self.getConfig()['configurations']['yarn-env']['content']), + owner = 'yarn', + group = 'hadoop', +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('File', '/usr/lib/hadoop-yarn/bin/container-executor', + group = 'hadoop', +- mode = 06050, ++ mode = 0o6050, + ) + self.assertResourceCalled('File', '/etc/hadoop/conf/container-executor.cfg', + content = InlineTemplate(self.getConfig()['configurations']['container-executor']['content']), + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('Directory', '/cgroups_test/cpu', + group = 'hadoop', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + cd_access="a" + ) + self.assertResourceCalled('File', '/etc/hadoop/conf/mapred-env.sh', + content = InlineTemplate(self.getConfig()['configurations']['mapred-env']['content']), +- mode = 0755, ++ mode = 0o755, + owner = 'root', + ) + self.assertResourceCalled('File', '/usr/lib/hadoop/sbin/task-controller', + owner = 'root', + group = 'hadoop', +- mode = 06050, ++ mode = 0o6050, + ) + self.assertResourceCalled('File', '/etc/hadoop/conf/taskcontroller.cfg', + content = Template('taskcontroller.cfg.j2'), + owner = 'root', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/etc/hadoop/conf/yarn_jaas.conf', + content = Template('yarn_jaas.conf.j2'), +@@ -593,11 +593,11 @@ + self.assertTrue(mocks_dict['checked_call'].called) + self.assertEqual(mocks_dict['checked_call'].call_count,1) + +- self.assertEquals( ++ self.assertEqual( + "yarn node -list -states=RUNNING", + mocks_dict['checked_call'].call_args_list[0][0][0]) + +- self.assertEquals( {'user': u'yarn'}, mocks_dict['checked_call'].call_args_list[0][1]) ++ self.assertEqual( {'user': 'yarn'}, mocks_dict['checked_call'].call_args_list[0][1]) + + + @patch('time.sleep') +@@ -619,7 +619,7 @@ + mocks_dict = mocks_dict, + ) + self.fail('Missing NodeManager should have caused a failure') +- except Fail,fail: ++ except Fail as fail: + self.assertTrue(mocks_dict['call'].called) + self.assertEqual(mocks_dict['call'].call_count,12) + +@@ -643,7 +643,7 @@ + mocks_dict = mocks_dict, + ) + self.fail('Invalid return code should cause a failure') +- except Fail,fail: ++ except Fail as fail: + self.assertTrue(mocks_dict['call'].called) + self.assertEqual(mocks_dict['call'].call_count,1) + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/YARN/test_resourcemanager.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/YARN/test_resourcemanager.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/YARN/test_resourcemanager.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/YARN/test_resourcemanager.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 mock.mock import MagicMock, call, patch ++from unittest.mock import MagicMock, call, patch + from stacks.utils.RMFTestCase import * + from resource_management.libraries.functions import version + from resource_management.libraries.script.script import Script +@@ -363,7 +363,7 @@ + cd_access = 'a', + ) + self.assertResourceCalled('Directory', '/etc/hadoop/conf', +- mode = 0755, ++ mode = 0o755, + create_parents = True, + cd_access = 'a', + ) +@@ -374,7 +374,7 @@ + ) + if is_include_file_configured and manage_include_files: + self.assertResourceCalled('Directory', '/etc/hadoop/conf_for_include', +- mode = 0755, ++ mode = 0o755, + create_parents = True, + cd_access = 'a', + ) +@@ -390,7 +390,7 @@ + self.assertResourceCalled('XmlConfig', 'core-site.xml', + owner = 'hdfs', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + conf_dir = '/etc/hadoop/conf', + configurations = self.getConfig()['configurations']['core-site'], + configuration_attributes = self.getConfig()['configurationAttributes']['core-site'] +@@ -398,7 +398,7 @@ + self.assertResourceCalled('XmlConfig', 'hdfs-site.xml', + owner = 'hdfs', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + conf_dir = '/etc/hadoop/conf', + configurations = self.getConfig()['configurations']['hdfs-site'], + configuration_attributes = self.getConfig()['configurationAttributes']['hdfs-site'] +@@ -406,7 +406,7 @@ + self.assertResourceCalled('XmlConfig', 'mapred-site.xml', + owner = 'yarn', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + conf_dir = '/etc/hadoop/conf', + configurations = self.getConfig()['configurations']['mapred-site'], + configuration_attributes = self.getConfig()['configurationAttributes']['mapred-site'] +@@ -414,7 +414,7 @@ + self.assertResourceCalled('XmlConfig', 'yarn-site.xml', + owner = 'yarn', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + conf_dir = '/etc/hadoop/conf', + configurations = self.getConfig()['configurations']['yarn-site'], + configuration_attributes = self.getConfig()['configurationAttributes']['yarn-site'] +@@ -422,43 +422,43 @@ + self.assertResourceCalled('XmlConfig', 'capacity-scheduler.xml', + owner = 'yarn', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + conf_dir = '/etc/hadoop/conf', + configurations = self.getConfig()['configurations']['capacity-scheduler'], + configuration_attributes = self.getConfig()['configurationAttributes']['capacity-scheduler'] + ) + self.assertResourceCalled('File', '/etc/security/limits.d/yarn.conf', + content = Template('yarn.conf.j2'), +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/etc/security/limits.d/mapreduce.conf', + content = Template('mapreduce.conf.j2'), +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/etc/hadoop/conf/yarn-env.sh', + content = InlineTemplate(self.getConfig()['configurations']['yarn-env']['content']), + owner = 'yarn', + group = 'hadoop', +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('File', '/usr/lib/hadoop-yarn/bin/container-executor', + group = 'hadoop', +- mode = 02050, ++ mode = 0o2050, + ) + self.assertResourceCalled('File', '/etc/hadoop/conf/container-executor.cfg', + content = InlineTemplate(self.getConfig()['configurations']['container-executor']['content']), + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('Directory', '/cgroups_test/cpu', + group = 'hadoop', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + cd_access="a" + ) + self.assertResourceCalled('File', '/etc/hadoop/conf/mapred-env.sh', + content = InlineTemplate(self.getConfig()['configurations']['mapred-env']['content']), +- mode = 0755, ++ mode = 0o755, + owner = 'hdfs', + ) + self.assertResourceCalled('File', '/etc/hadoop/conf/taskcontroller.cfg', +@@ -543,7 +543,7 @@ + cd_access = 'a', + ) + self.assertResourceCalled('Directory', '/etc/hadoop/conf', +- mode = 0755, ++ mode = 0o755, + create_parents = True, + cd_access = 'a', + ) +@@ -554,7 +554,7 @@ + ) + if is_include_file_configured and manage_include_files: + self.assertResourceCalled('Directory', '/etc/hadoop/conf_for_include', +- mode = 0755, ++ mode = 0o755, + create_parents = True, + cd_access = 'a', + ) +@@ -570,7 +570,7 @@ + self.assertResourceCalled('XmlConfig', 'core-site.xml', + owner = 'hdfs', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + conf_dir = '/etc/hadoop/conf', + configurations = self.getConfig()['configurations']['core-site'], + configuration_attributes = self.getConfig()['configurationAttributes']['core-site'] +@@ -578,7 +578,7 @@ + self.assertResourceCalled('XmlConfig', 'hdfs-site.xml', + owner = 'hdfs', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + conf_dir = '/etc/hadoop/conf', + configurations = self.getConfig()['configurations']['hdfs-site'], + configuration_attributes = self.getConfig()['configurationAttributes']['hdfs-site'] +@@ -586,7 +586,7 @@ + self.assertResourceCalled('XmlConfig', 'mapred-site.xml', + owner = 'yarn', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + conf_dir = '/etc/hadoop/conf', + configurations = self.getConfig()['configurations']['mapred-site'], + configuration_attributes = self.getConfig()['configurationAttributes']['mapred-site'] +@@ -594,7 +594,7 @@ + self.assertResourceCalled('XmlConfig', 'yarn-site.xml', + owner = 'yarn', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + conf_dir = '/etc/hadoop/conf', + configurations = self.getConfig()['configurations']['yarn-site'], + configuration_attributes = self.getConfig()['configurationAttributes']['yarn-site'] +@@ -602,55 +602,55 @@ + self.assertResourceCalled('XmlConfig', 'capacity-scheduler.xml', + owner = 'yarn', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + conf_dir = '/etc/hadoop/conf', + configurations = self.getConfig()['configurations']['capacity-scheduler'], + configuration_attributes = self.getConfig()['configurationAttributes']['capacity-scheduler'] + ) + self.assertResourceCalled('File', '/etc/security/limits.d/yarn.conf', + content = Template('yarn.conf.j2'), +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/etc/security/limits.d/mapreduce.conf', + content = Template('mapreduce.conf.j2'), +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/etc/hadoop/conf/yarn-env.sh', + content = InlineTemplate(self.getConfig()['configurations']['yarn-env']['content']), + owner = 'yarn', + group = 'hadoop', +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('File', '/usr/lib/hadoop-yarn/bin/container-executor', + group = 'hadoop', +- mode = 06050, ++ mode = 0o6050, + ) + self.assertResourceCalled('File', '/etc/hadoop/conf/container-executor.cfg', + content = InlineTemplate(self.getConfig()['configurations']['container-executor']['content']), + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('Directory', '/cgroups_test/cpu', + group = 'hadoop', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + cd_access="a" + ) + self.assertResourceCalled('File', '/etc/hadoop/conf/mapred-env.sh', + content = InlineTemplate(self.getConfig()['configurations']['mapred-env']['content']), +- mode = 0755, ++ mode = 0o755, + owner = 'root', + ) + self.assertResourceCalled('File', '/usr/lib/hadoop/sbin/task-controller', + owner = 'root', + group = 'hadoop', +- mode = 06050, ++ mode = 0o6050, + ) + self.assertResourceCalled('File', '/etc/hadoop/conf/taskcontroller.cfg', + content = Template('taskcontroller.cfg.j2'), + owner = 'root', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/etc/hadoop/conf/yarn_jaas.conf', + content = Template('yarn_jaas.conf.j2'), +@@ -696,7 +696,7 @@ + + def test_pre_upgrade_restart_23(self): + config_file = self.get_src_folder()+"/test/python/stacks/2.0.6/configs/default.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + version = '2.3.0.0-1234' + json_content['commandParams']['version'] = version +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/YARN/test_yarn_client.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/YARN/test_yarn_client.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/YARN/test_yarn_client.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/YARN/test_yarn_client.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 mock.mock import MagicMock, call, patch ++from unittest.mock import MagicMock, call, patch + from stacks.utils.RMFTestCase import * + from resource_management.libraries.functions import version + from resource_management.libraries.script.script import Script +@@ -97,7 +97,7 @@ + self.assertResourceCalled('XmlConfig', 'core-site.xml', + owner = 'hdfs', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + conf_dir = '/etc/hadoop/conf', + configurations = self.getConfig()['configurations']['core-site'], + configuration_attributes = self.getConfig()['configurationAttributes']['core-site'] +@@ -105,7 +105,7 @@ + self.assertResourceCalled('XmlConfig', 'hdfs-site.xml', + owner = 'hdfs', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + conf_dir = '/etc/hadoop/conf', + configurations = self.getConfig()['configurations']['hdfs-site'], + configuration_attributes = self.getConfig()['configurationAttributes']['hdfs-site'] +@@ -113,7 +113,7 @@ + self.assertResourceCalled('XmlConfig', 'mapred-site.xml', + owner = 'yarn', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + conf_dir = '/etc/hadoop/conf', + configurations = self.getConfig()['configurations']['mapred-site'], + configuration_attributes = self.getConfig()['configurationAttributes']['mapred-site'] +@@ -121,7 +121,7 @@ + self.assertResourceCalled('XmlConfig', 'yarn-site.xml', + owner = 'yarn', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + conf_dir = '/etc/hadoop/conf', + configurations = self.getConfig()['configurations']['yarn-site'], + configuration_attributes = self.getConfig()['configurationAttributes']['yarn-site'] +@@ -129,43 +129,43 @@ + self.assertResourceCalled('XmlConfig', 'capacity-scheduler.xml', + owner = 'yarn', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + conf_dir = '/etc/hadoop/conf', + configurations = self.getConfig()['configurations']['capacity-scheduler'], + configuration_attributes = self.getConfig()['configurationAttributes']['capacity-scheduler'] + ) + self.assertResourceCalled('File', '/etc/security/limits.d/yarn.conf', + content = Template('yarn.conf.j2'), +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/etc/security/limits.d/mapreduce.conf', + content = Template('mapreduce.conf.j2'), +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/etc/hadoop/conf/yarn-env.sh', + content = InlineTemplate(self.getConfig()['configurations']['yarn-env']['content']), + owner = 'yarn', + group = 'hadoop', +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('File', '/usr/lib/hadoop-yarn/bin/container-executor', + group = 'hadoop', +- mode = 02050, ++ mode = 0o2050, + ) + self.assertResourceCalled('File', '/etc/hadoop/conf/container-executor.cfg', + content = InlineTemplate(self.getConfig()['configurations']['container-executor']['content']), + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('Directory', '/cgroups_test/cpu', + group = 'hadoop', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + cd_access="a" + ) + self.assertResourceCalled('File', '/etc/hadoop/conf/mapred-env.sh', + content = InlineTemplate(self.getConfig()['configurations']['mapred-env']['content']), +- mode = 0755, ++ mode = 0o755, + owner = 'hdfs', + ) + self.assertResourceCalled('File', '/etc/hadoop/conf/taskcontroller.cfg', +@@ -261,7 +261,7 @@ + self.assertResourceCalled('XmlConfig', 'core-site.xml', + owner = 'hdfs', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + conf_dir = '/etc/hadoop/conf', + configurations = self.getConfig()['configurations']['core-site'], + configuration_attributes = self.getConfig()['configurationAttributes']['core-site'] +@@ -269,7 +269,7 @@ + self.assertResourceCalled('XmlConfig', 'hdfs-site.xml', + owner = 'hdfs', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + conf_dir = '/etc/hadoop/conf', + configurations = self.getConfig()['configurations']['hdfs-site'], + configuration_attributes = self.getConfig()['configurationAttributes']['hdfs-site'] +@@ -277,7 +277,7 @@ + self.assertResourceCalled('XmlConfig', 'mapred-site.xml', + owner = 'yarn', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + conf_dir = '/etc/hadoop/conf', + configurations = self.getConfig()['configurations']['mapred-site'], + configuration_attributes = self.getConfig()['configurationAttributes']['mapred-site'] +@@ -285,7 +285,7 @@ + self.assertResourceCalled('XmlConfig', 'yarn-site.xml', + owner = 'yarn', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + conf_dir = '/etc/hadoop/conf', + configurations = self.getConfig()['configurations']['yarn-site'], + configuration_attributes = self.getConfig()['configurationAttributes']['yarn-site'] +@@ -293,55 +293,55 @@ + self.assertResourceCalled('XmlConfig', 'capacity-scheduler.xml', + owner = 'yarn', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + conf_dir = '/etc/hadoop/conf', + configurations = self.getConfig()['configurations']['capacity-scheduler'], + configuration_attributes = self.getConfig()['configurationAttributes']['capacity-scheduler'] + ) + self.assertResourceCalled('File', '/etc/security/limits.d/yarn.conf', + content = Template('yarn.conf.j2'), +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/etc/security/limits.d/mapreduce.conf', + content = Template('mapreduce.conf.j2'), +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/etc/hadoop/conf/yarn-env.sh', + content = InlineTemplate(self.getConfig()['configurations']['yarn-env']['content']), + owner = 'yarn', + group = 'hadoop', +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('File', '/usr/lib/hadoop-yarn/bin/container-executor', + group = 'hadoop', +- mode = 06050, ++ mode = 0o6050, + ) + self.assertResourceCalled('File', '/etc/hadoop/conf/container-executor.cfg', + content = InlineTemplate(self.getConfig()['configurations']['container-executor']['content']), + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('Directory', '/cgroups_test/cpu', + group = 'hadoop', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + cd_access="a" + ) + self.assertResourceCalled('File', '/etc/hadoop/conf/mapred-env.sh', + content = InlineTemplate(self.getConfig()['configurations']['mapred-env']['content']), +- mode = 0755, ++ mode = 0o755, + owner = 'root', + ) + self.assertResourceCalled('File', '/usr/lib/hadoop/sbin/task-controller', + owner = 'root', + group = 'hadoop', +- mode = 06050, ++ mode = 0o6050, + ) + self.assertResourceCalled('File', '/etc/hadoop/conf/taskcontroller.cfg', + content = Template('taskcontroller.cfg.j2'), + owner = 'root', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/etc/hadoop/conf/yarn_jaas.conf', + content = Template('yarn_jaas.conf.j2'), +@@ -448,7 +448,7 @@ + self.assertResourceCalled('XmlConfig', 'core-site.xml', + owner = 'hdfs', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + conf_dir = '/etc/hadoop/conf', + configurations = self.getConfig()['configurations']['core-site'], + configuration_attributes = self.getConfig()['configurationAttributes']['core-site'] +@@ -456,7 +456,7 @@ + self.assertResourceCalled('XmlConfig', 'hdfs-site.xml', + owner = 'hdfs', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + conf_dir = '/etc/hadoop/conf', + configurations = self.getConfig()['configurations']['hdfs-site'], + configuration_attributes = self.getConfig()['configurationAttributes']['hdfs-site'] +@@ -464,7 +464,7 @@ + self.assertResourceCalled('XmlConfig', 'mapred-site.xml', + owner = 'yarn', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + conf_dir = '/etc/hadoop/conf', + configurations = self.getConfig()['configurations']['mapred-site'], + configuration_attributes = self.getConfig()['configurationAttributes']['mapred-site'] +@@ -472,7 +472,7 @@ + self.assertResourceCalled('XmlConfig', 'yarn-site.xml', + owner = 'yarn', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + conf_dir = '/etc/hadoop/conf', + configurations = self.getConfig()['configurations']['yarn-site'], + configuration_attributes = self.getConfig()['configurationAttributes']['yarn-site'] +@@ -480,43 +480,43 @@ + self.assertResourceCalled('XmlConfig', 'capacity-scheduler.xml', + owner = 'yarn', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + conf_dir = '/etc/hadoop/conf', + configurations = self.getConfig()['configurations']['capacity-scheduler'], + configuration_attributes = self.getConfig()['configurationAttributes']['capacity-scheduler'] + ) + self.assertResourceCalled('File', '/etc/security/limits.d/yarn.conf', + content = Template('yarn.conf.j2'), +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/etc/security/limits.d/mapreduce.conf', + content = Template('mapreduce.conf.j2'), +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/etc/hadoop/conf/yarn-env.sh', + content = InlineTemplate(self.getConfig()['configurations']['yarn-env']['content']), + owner = 'yarn', + group = 'hadoop', +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('File', '/usr/lib/hadoop-yarn/bin/container-executor', + group = 'hadoop', +- mode = 02050, ++ mode = 0o2050, + ) + self.assertResourceCalled('File', '/etc/hadoop/conf/container-executor.cfg', + content = InlineTemplate(self.getConfig()['configurations']['container-executor']['content']), + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('Directory', '/cgroups_test/cpu', + group = 'hadoop', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + cd_access="a" + ) + self.assertResourceCalled('File', '/etc/hadoop/conf/mapred-env.sh', + content = InlineTemplate(self.getConfig()['configurations']['mapred-env']['content']), +- mode = 0755, ++ mode = 0o755, + owner = 'hdfs', + ) + self.assertResourceCalled('File', '/etc/hadoop/conf/taskcontroller.cfg', +@@ -570,7 +570,7 @@ + @patch.object(functions, "get_stack_version", new = MagicMock(return_value='2.3.0.0-1234')) + def test_pre_upgrade_restart_23(self): + config_file = self.get_src_folder()+"/test/python/stacks/2.0.6/configs/default.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + version = '2.3.0.0-1234' + json_content['commandParams']['version'] = version +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/YARN/test_yarn_service_check.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/YARN/test_yarn_service_check.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/YARN/test_yarn_service_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/YARN/test_yarn_service_check.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 os + import re +-from mock.mock import MagicMock, call, patch ++from unittest.mock import MagicMock, call, patch + from stacks.utils.RMFTestCase import * + + curl_returns = [(0, "{\"clusterInfo\":{\"id\": \"1471586271500\",\"haState\": \"ACTIVE\"}}",''), +@@ -56,7 +56,7 @@ + kinit_path_local = '/usr/bin/kinit', + user = 'hdfs', + dfs_type = '', +- mode = 0770, ++ mode = 0o770, + owner = 'ambari-qa', + action = ['create_on_execute'], hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', hdfs_site=self.getConfig()['configurations']['hdfs-site'], principal_name=UnknownConfigurationMock(), default_fs='hdfs://c6401.ambari.apache.org:8020', + hadoop_conf_dir = '/etc/hadoop/conf', +@@ -89,7 +89,7 @@ + kinit_path_local = '/usr/bin/kinit', + user = 'hdfs', + dfs_type = '', +- mode = 0770, ++ mode = 0o770, + owner = 'ambari-qa', + action = ['create_on_execute'], hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', hdfs_site=self.getConfig()['configurations']['hdfs-site'], principal_name='hdfs', default_fs='hdfs://c6401.ambari.apache.org:8020', + hadoop_conf_dir = '/etc/hadoop/conf', +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/ZOOKEEPER/test_zookeeper_client.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/ZOOKEEPER/test_zookeeper_client.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/ZOOKEEPER/test_zookeeper_client.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/ZOOKEEPER/test_zookeeper_client.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 json +-from mock.mock import MagicMock, call, patch ++from unittest.mock import MagicMock, call, patch + from stacks.utils.RMFTestCase import * + + @patch("os.path.exists", new = MagicMock(return_value=True)) +@@ -64,25 +64,25 @@ + owner = 'zookeeper', + group = 'hadoop', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('Directory', '/var/log/zookeeper', + owner = 'zookeeper', + group = 'hadoop', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('Directory', '/hadoop/zookeeper', + owner = 'zookeeper', + group = 'hadoop', + create_parents = True, + cd_access='a', +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('File', + '/etc/zookeeper/conf/log4j.properties', + content=InlineTemplate(self.getConfig()['configurations']['zookeeper-log4j']['content']), +- mode=0644, ++ mode=0o644, + group='hadoop', + owner='zookeeper' + ) +@@ -127,25 +127,25 @@ + owner = 'zookeeper', + group = 'hadoop', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('Directory', '/var/log/zookeeper', + owner = 'zookeeper', + group = 'hadoop', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('Directory', '/hadoop/zookeeper', + owner = 'zookeeper', + group = 'hadoop', + create_parents = True, + cd_access='a', +- mode = 0755 ++ mode = 0o755 + ) + self.assertResourceCalled('File', + '/etc/zookeeper/conf/log4j.properties', + content=InlineTemplate(self.getConfig()['configurations']['zookeeper-log4j']['content']), +- mode=0644, ++ mode=0o644, + group='hadoop', + owner='zookeeper' + ) +@@ -164,7 +164,7 @@ + + def test_pre_upgrade_restart(self): + config_file = self.get_src_folder()+"/test/python/stacks/2.0.6/configs/default.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + version = '2.2.1.0-3242' + json_content['commandParams']['version'] = version +@@ -184,7 +184,7 @@ + call_mock.side_effects = [(0, None), (0, None)] + + config_file = self.get_src_folder()+"/test/python/stacks/2.0.6/configs/default.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + version = '2.3.0.0-3242' + json_content['commandParams']['version'] = version +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/ZOOKEEPER/test_zookeeper_server.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/ZOOKEEPER/test_zookeeper_server.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/ZOOKEEPER/test_zookeeper_server.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/ZOOKEEPER/test_zookeeper_server.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 json +-from mock.mock import MagicMock, patch ++from unittest.mock import MagicMock, patch + from stacks.utils.RMFTestCase import * + import resource_management.libraries.functions.get_unique_id_and_date + +@@ -148,29 +148,29 @@ + owner = 'zookeeper', + group = 'hadoop', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('Directory', '/var/log/zookeeper', + owner = 'zookeeper', + group = 'hadoop', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('Directory', '/hadoop/zookeeper', + owner = 'zookeeper', + group = 'hadoop', + create_parents = True, + cd_access='a', +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('File', '/hadoop/zookeeper/myid', + content = '1', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', + '/etc/zookeeper/conf/log4j.properties', + content=InlineTemplate(self.getConfig()['configurations']['zookeeper-log4j']['content']), +- mode=0644, ++ mode=0o644, + group='hadoop', + owner='zookeeper' + ) +@@ -206,28 +206,28 @@ + owner = 'zookeeper', + group = 'hadoop', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('Directory', '/var/log/zookeeper', + owner = 'zookeeper', + group = 'hadoop', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('Directory', '/hadoop/zookeeper', + owner = 'zookeeper', + group = 'hadoop', + create_parents = True, + cd_access='a', +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('File', '/hadoop/zookeeper/myid', + content = '1', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', + '/etc/zookeeper/conf/log4j.properties', +- mode=0644, ++ mode=0o644, + owner='zookeeper', + content=InlineTemplate(self.getConfig()['configurations']['zookeeper-log4j']['content']), + group='hadoop' +@@ -251,7 +251,7 @@ + + def test_pre_upgrade_restart(self): + config_file = self.get_src_folder()+"/test/python/stacks/2.0.6/configs/default.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + version = '2.2.1.0-3242' + json_content['commandParams']['version'] = version +@@ -271,7 +271,7 @@ + call_mock.side_effects = [(0, None), (0, None)] + + config_file = self.get_src_folder()+"/test/python/stacks/2.0.6/configs/default.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + version = '2.3.0.0-3242' + json_content['commandParams']['version'] = version +@@ -295,7 +295,7 @@ + unique_value = "unique1" + get_unique_id_and_date_mock.return_value = unique_value + config_file = self.get_src_folder()+"/test/python/stacks/2.0.6/configs/default.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + version = '2.2.1.0-3242' + json_content['commandParams']['version'] = version +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/ZOOKEEPER/test_zookeeper_service_check.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/ZOOKEEPER/test_zookeeper_service_check.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.0.6/ZOOKEEPER/test_zookeeper_service_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.0.6/ZOOKEEPER/test_zookeeper_service_check.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 mock.mock import MagicMock, call, patch ++from unittest.mock import MagicMock, call, patch + from stacks.utils.RMFTestCase import * + + class TestServiceCheck(RMFTestCase): +@@ -37,7 +37,7 @@ + ) + self.assertResourceCalled('File', '/tmp/zkSmoke.sh', + content = StaticFile('zkSmoke.sh'), +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('Execute', '/tmp/zkSmoke.sh /usr/lib/zookeeper/bin/zkCli.sh ambari-qa /etc/zookeeper/conf 2181 False /usr/bin/kinit no_keytab no_principal /tmp/zkSmoke.out', + logoutput = True, +@@ -60,7 +60,7 @@ + ) + self.assertResourceCalled('File', '/tmp/zkSmoke.sh', + content = StaticFile('zkSmoke.sh'), +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('Execute', '/tmp/zkSmoke.sh /usr/lib/zookeeper/bin/zkCli.sh ambari-qa /etc/zookeeper/conf 2181 True /usr/bin/kinit /etc/security/keytabs/smokeuser.headless.keytab ambari-qa@EXAMPLE.COM /tmp/zkSmoke.out', + logoutput = True, +@@ -83,7 +83,7 @@ + ) + self.assertResourceCalled('File', '/tmp/zkSmoke.sh', + content = StaticFile('zkSmoke.sh'), +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('Execute', '/tmp/zkSmoke.sh /usr/hdp/current/zookeeper-client/bin/zkCli.sh ambari-qa /usr/hdp/current/zookeeper-client/conf 2181 False /usr/bin/kinit no_keytab no_principal /tmp/zkSmoke.out', + logoutput = True, +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.1/common/test_stack_advisor.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.1/common/test_stack_advisor.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.1/common/test_stack_advisor.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.1/common/test_stack_advisor.py 2022-07-11 00:52:31.000000000 +0800 +@@ -20,6 +20,7 @@ + import os + import socket + from unittest import TestCase ++from functools import reduce + + class TestHDP21StackAdvisor(TestCase): + +@@ -58,7 +59,7 @@ + } + + self.stackAdvisor.recommendOozieConfigurations(configurations, clusterData, {"configurations":{}}, None) +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + + def test_recommendOozieConfigurations_withFalconServer(self): + configurations = { +@@ -103,7 +104,7 @@ + } + + self.stackAdvisor.recommendOozieConfigurations(configurations, clusterData, services, None) +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + + def test_recommendHiveConfigurations_mapMemoryLessThan2048(self): + configurations = {} +@@ -128,7 +129,7 @@ + + self.stackAdvisor.recommendHiveConfigurations(configurations, clusterData, {"configurations": {}, "services": []}, None) + self.maxDiff = None +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + + def test_recommendHiveConfigurations_mapMemoryMoreThan2048(self): + configurations = {} +@@ -152,16 +153,16 @@ + } + + self.stackAdvisor.recommendHiveConfigurations(configurations, clusterData, {"configurations":{}, "services": []}, None) +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + + def test_createComponentLayoutRecommendations_mastersIn10nodes(self): + services = json.load(open(os.path.join(self.testDirectory, 'services.json'))) + hosts = json.load(open(os.path.join(self.testDirectory, 'hosts.json'))) + + expected_layout = [ +- [u'NAMENODE', u'GANGLIA_SERVER', u'ZOOKEEPER_SERVER', u'DRPC_SERVER', u'NIMBUS', u'STORM_REST_API', u'STORM_UI_SERVER', u'MYSQL_SERVER'], +- [u'SECONDARY_NAMENODE', u'HISTORYSERVER', u'APP_TIMELINE_SERVER', u'RESOURCEMANAGER', u'ZOOKEEPER_SERVER'], +- [u'HIVE_METASTORE', u'HIVE_SERVER', u'WEBHCAT_SERVER', u'HBASE_MASTER', u'OOZIE_SERVER', u'ZOOKEEPER_SERVER', u'FALCON_SERVER'] ++ ['NAMENODE', 'GANGLIA_SERVER', 'ZOOKEEPER_SERVER', 'DRPC_SERVER', 'NIMBUS', 'STORM_REST_API', 'STORM_UI_SERVER', 'MYSQL_SERVER'], ++ ['SECONDARY_NAMENODE', 'HISTORYSERVER', 'APP_TIMELINE_SERVER', 'RESOURCEMANAGER', 'ZOOKEEPER_SERVER'], ++ ['HIVE_METASTORE', 'HIVE_SERVER', 'WEBHCAT_SERVER', 'HBASE_MASTER', 'OOZIE_SERVER', 'ZOOKEEPER_SERVER', 'FALCON_SERVER'] + ] + + masterComponents = [component['StackServiceComponents']['component_name'] for service in services["services"] for component in service["components"] +@@ -178,7 +179,7 @@ + def sort_nested_lists(l): + return sorted(reduce(lambda x,y: x+y, l)) + +- self.assertEquals(sort_nested_lists(expected_layout), sort_nested_lists(groups)) ++ self.assertEqual(sort_nested_lists(expected_layout), sort_nested_lists(groups)) + + def test_recommendHiveConfigurations_jdbcUrl(self): + services = { +@@ -241,38 +242,38 @@ + + # new mysql + self.stackAdvisor.recommendHiveConfigurations(configurations, clusterData, services, hosts) +- self.assertEquals(configurations['hive-site']['properties']['javax.jdo.option.ConnectionURL'], "jdbc:mysql://example.com/hive_name?createDatabaseIfNotExist=true") +- self.assertEquals(configurations['hive-site']['properties']['javax.jdo.option.ConnectionDriverName'], "com.mysql.jdbc.Driver") ++ self.assertEqual(configurations['hive-site']['properties']['javax.jdo.option.ConnectionURL'], "jdbc:mysql://example.com/hive_name?createDatabaseIfNotExist=true") ++ self.assertEqual(configurations['hive-site']['properties']['javax.jdo.option.ConnectionDriverName'], "com.mysql.jdbc.Driver") + + # existing Mysql + services['configurations']['hive-env']['properties']['hive_database'] = 'Existing MySQL Database' + self.stackAdvisor.recommendHiveConfigurations(configurations, clusterData, services, hosts) +- self.assertEquals(configurations['hive-site']['properties']['javax.jdo.option.ConnectionURL'], "jdbc:mysql://example.com/hive_name") +- self.assertEquals(configurations['hive-site']['properties']['javax.jdo.option.ConnectionDriverName'], "com.mysql.jdbc.Driver") ++ self.assertEqual(configurations['hive-site']['properties']['javax.jdo.option.ConnectionURL'], "jdbc:mysql://example.com/hive_name") ++ self.assertEqual(configurations['hive-site']['properties']['javax.jdo.option.ConnectionDriverName'], "com.mysql.jdbc.Driver") + + # existing postgres + services['configurations']['hive-env']['properties']['hive_database'] = 'Existing PostgreSQL Database' + self.stackAdvisor.recommendHiveConfigurations(configurations, clusterData, services, hosts) +- self.assertEquals(configurations['hive-site']['properties']['javax.jdo.option.ConnectionURL'], "jdbc:postgresql://example.com:5432/hive_name") +- self.assertEquals(configurations['hive-site']['properties']['javax.jdo.option.ConnectionDriverName'], "org.postgresql.Driver") ++ self.assertEqual(configurations['hive-site']['properties']['javax.jdo.option.ConnectionURL'], "jdbc:postgresql://example.com:5432/hive_name") ++ self.assertEqual(configurations['hive-site']['properties']['javax.jdo.option.ConnectionDriverName'], "org.postgresql.Driver") + + # existing oracle + services['configurations']['hive-env']['properties']['hive_database'] = 'Existing Oracle Database' + self.stackAdvisor.recommendHiveConfigurations(configurations, clusterData, services, hosts) +- self.assertEquals(configurations['hive-site']['properties']['javax.jdo.option.ConnectionURL'], "jdbc:oracle:thin:@//example.com:1521/hive_name") +- self.assertEquals(configurations['hive-site']['properties']['javax.jdo.option.ConnectionDriverName'], "oracle.jdbc.driver.OracleDriver") ++ self.assertEqual(configurations['hive-site']['properties']['javax.jdo.option.ConnectionURL'], "jdbc:oracle:thin:@//example.com:1521/hive_name") ++ self.assertEqual(configurations['hive-site']['properties']['javax.jdo.option.ConnectionDriverName'], "oracle.jdbc.driver.OracleDriver") + + # existing sqla + services['configurations']['hive-env']['properties']['hive_database'] = 'Existing SQL Anywhere Database' + self.stackAdvisor.recommendHiveConfigurations(configurations, clusterData, services, hosts) +- self.assertEquals(configurations['hive-site']['properties']['javax.jdo.option.ConnectionURL'], "jdbc:sqlanywhere:host=example.com;database=hive_name") +- self.assertEquals(configurations['hive-site']['properties']['javax.jdo.option.ConnectionDriverName'], "sap.jdbc4.sqlanywhere.IDriver") ++ self.assertEqual(configurations['hive-site']['properties']['javax.jdo.option.ConnectionURL'], "jdbc:sqlanywhere:host=example.com;database=hive_name") ++ self.assertEqual(configurations['hive-site']['properties']['javax.jdo.option.ConnectionDriverName'], "sap.jdbc4.sqlanywhere.IDriver") + + # existing Mysql / MariaDB + services['configurations']['hive-env']['properties']['hive_database'] = 'Existing MySQL / MariaDB Database' + self.stackAdvisor.recommendHiveConfigurations(configurations, clusterData, services, hosts) +- self.assertEquals(configurations['hive-site']['properties']['javax.jdo.option.ConnectionURL'], "jdbc:mysql://example.com/hive_name") +- self.assertEquals(configurations['hive-site']['properties']['javax.jdo.option.ConnectionDriverName'], "com.mysql.jdbc.Driver") ++ self.assertEqual(configurations['hive-site']['properties']['javax.jdo.option.ConnectionURL'], "jdbc:mysql://example.com/hive_name") ++ self.assertEqual(configurations['hive-site']['properties']['javax.jdo.option.ConnectionDriverName'], "com.mysql.jdbc.Driver") + + def test_recommendHiveConfigurationsSecure(self): + services = { +@@ -345,7 +346,7 @@ + + # new mysql + self.stackAdvisor.recommendHiveConfigurations(configurations, clusterData, services, hosts) +- self.assertEquals("core-site" in configurations, True) ++ self.assertEqual("core-site" in configurations, True) + self.assertEqual("hadoop.proxyuser.HTTP.hosts" in configurations["core-site"]["properties"], True) + self.assertEqual(configurations["core-site"]["properties"]["hadoop.proxyuser.HTTP.hosts"] == "example.com", True) + +@@ -354,7 +355,7 @@ + configurations["core-site"]["properties"]["hadoop.proxyuser.HTTP.hosts"] = "" + + self.stackAdvisor.recommendHiveConfigurations(configurations, clusterData, services, hosts) +- self.assertEquals("core-site" in configurations, True) ++ self.assertEqual("core-site" in configurations, True) + self.assertEqual("hadoop.proxyuser.HTTP.hosts" in configurations["core-site"]["properties"], True) + + fetch_list = sorted(configurations["core-site"]["properties"]["hadoop.proxyuser.HTTP.hosts"].split(",")) +@@ -384,7 +385,7 @@ + } + + self.stackAdvisor.recommendHiveConfigurations(configurations, clusterData, {"configurations":{}, "services": []}, None) +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + + def test_recommendHbaseConfigurations(self): + servicesList = ["HBASE"] +@@ -438,10 +439,10 @@ + } + + clusterData = self.stackAdvisor.getConfigurationClusterSummary(servicesList, hosts, components, None) +- self.assertEquals(clusterData['hbaseRam'], 8) ++ self.assertEqual(clusterData['hbaseRam'], 8) + + self.stackAdvisor.recommendHbaseConfigurations(configurations, clusterData, services, hosts) +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + + def test_recommendHDFSConfigurations(self): + configurations = { +@@ -504,7 +505,7 @@ + } + + self.stackAdvisor.recommendHDFSConfigurations(configurations, clusterData, services, hosts) +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + + def test_validateHDFSConfigurationsEnv(self): + configurations = {} +@@ -519,7 +520,7 @@ + res_expected = [] + + res = self.stackAdvisor.validateHDFSConfigurationsEnv(properties, recommendedDefaults, configurations, '', '') +- self.assertEquals(res, res_expected) ++ self.assertEqual(res, res_expected) + + # 2) fail: namenode_heapsize, namenode_opt_maxnewsize < recommended + properties['namenode_heapsize'] = '1022' +@@ -536,7 +537,7 @@ + 'type': 'configuration'}] + + res = self.stackAdvisor.validateHDFSConfigurationsEnv(properties, recommendedDefaults, configurations, '', '') +- self.assertEquals(res, res_expected) ++ self.assertEqual(res, res_expected) + + def test_validateHiveConfigurations(self): + configurations = {'yarn-site': {'properties': {'yarn.scheduler.maximum-allocation-mb': '4096'}}} +@@ -551,7 +552,7 @@ + res_expected = [] + + res = self.stackAdvisor.validateHiveConfigurations(properties, recommendedDefaults, configurations, '', '') +- self.assertEquals(res, res_expected) ++ self.assertEqual(res, res_expected) + + # 2) fail: yarn.scheduler.maximum-allocation-mb < hive.tez.container.size + configurations = {'yarn-site': {'properties': {'yarn.scheduler.maximum-allocation-mb': '256'}}} +@@ -563,7 +564,7 @@ + ] + + res = self.stackAdvisor.validateHiveConfigurations(properties, recommendedDefaults, configurations, '', '') +- self.assertEquals(res, res_expected) ++ self.assertEqual(res, res_expected) + + def test_modifyComponentLayoutSchemes(self): + res_expected = {} +@@ -591,4 +592,4 @@ + self.stackAdvisor.modifyComponentLayoutSchemes() + res = self.stackAdvisor.getComponentLayoutSchemes() + +- self.assertEquals(res, res_expected) ++ self.assertEqual(res, res_expected) +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.1/FALCON/test_falcon_client.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.1/FALCON/test_falcon_client.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.1/FALCON/test_falcon_client.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.1/FALCON/test_falcon_client.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 + +-from mock.mock import patch ++from unittest.mock import patch + from stacks.utils.RMFTestCase import * + + +@@ -41,13 +41,13 @@ + self.assertResourceCalled('Directory', '/var/run/falcon', + owner = 'falcon', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + cd_access = "a", + ) + self.assertResourceCalled('Directory', '/var/log/falcon', + owner = 'falcon', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + cd_access = "a", + ) + self.assertResourceCalled('Directory', '/usr/hdp/current/falcon-client/webapp', +@@ -59,7 +59,7 @@ + create_parents = True + ) + self.assertResourceCalled('Directory', '/etc/falcon', +- mode = 0755, ++ mode = 0o755, + create_parents = True + ) + self.assertResourceCalled('Directory', '/etc/falcon/conf', +@@ -73,16 +73,16 @@ + ) + self.assertResourceCalled('PropertiesFile', '/etc/falcon/conf/client.properties', + owner = 'falcon', +- mode = 0644, +- properties= {u'falcon.url': u'http://{{falcon_host}}:{{falcon_port}}'} ++ mode = 0o644, ++ properties= {'falcon.url': 'http://{{falcon_host}}:{{falcon_port}}'} + ) + self.assertResourceCalled('PropertiesFile', '/etc/falcon/conf/runtime.properties', +- mode = 0644, ++ mode = 0o644, + properties = self.getConfig()['configurations']['falcon-runtime.properties'], + owner = 'falcon' + ) + self.assertResourceCalled('PropertiesFile', '/etc/falcon/conf/startup.properties', +- mode = 0644, ++ mode = 0o644, + properties = self.getConfig()['configurations']['falcon-startup.properties'], + owner = 'falcon' + ) +@@ -90,13 +90,13 @@ + content=InlineTemplate(self.getConfig()['configurations']['falcon-log4j']['content']), + owner='falcon', + group='hadoop', +- mode= 0644 ++ mode= 0o644 + ) + self.assertNoMoreResources() + + def test_pre_upgrade_restart(self): + config_file = self.get_src_folder()+"/test/python/stacks/2.0.6/configs/default.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + version = '2.2.1.0-3242' + json_content['commandParams']['version'] = version +@@ -114,7 +114,7 @@ + @patch("resource_management.core.shell.call") + def test_pre_upgrade_restart_23(self, call_mock): + config_file = self.get_src_folder()+"/test/python/stacks/2.0.6/configs/default.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + version = '2.3.0.0-1234' + json_content['commandParams']['version'] = version +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.1/FALCON/test_falcon_server.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.1/FALCON/test_falcon_server.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.1/FALCON/test_falcon_server.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.1/FALCON/test_falcon_server.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 + +-from mock.mock import MagicMock, patch ++from unittest.mock import MagicMock, patch + import shutil + from stacks.utils.RMFTestCase import * + import tarfile +@@ -54,7 +54,7 @@ + + self.assertResourceCalled('File', '/usr/hdp/current/falcon-server/server/webapp/falcon/WEB-INF/lib/je-5.0.73.jar', + content=DownloadSource('http://c6401.ambari.apache.org:8080/resources/je-5.0.73.jar'), +- mode=0755 ++ mode=0o755 + ) + + self.assertResourceCalled('Execute', '/usr/hdp/current/falcon-server/bin/falcon-start -port 15000', +@@ -100,13 +100,13 @@ + owner = 'falcon', + create_parents = True, + cd_access = "a", +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('Directory', '/var/log/falcon', + owner = 'falcon', + create_parents = True, + cd_access = "a", +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('Directory', '/usr/hdp/current/falcon-server/webapp', + owner = 'falcon', +@@ -117,7 +117,7 @@ + create_parents = True + ) + self.assertResourceCalled('Directory', '/etc/falcon', +- mode = 0755, ++ mode = 0o755, + create_parents = True + ) + +@@ -132,17 +132,17 @@ + ) + + self.assertResourceCalled('PropertiesFile', '/etc/falcon/conf/client.properties', +- mode = 0644, ++ mode = 0o644, + owner = 'falcon', +- properties = {u'falcon.url': u'http://{{falcon_host}}:{{falcon_port}}'} ++ properties = {'falcon.url': 'http://{{falcon_host}}:{{falcon_port}}'} + ) + self.assertResourceCalled('PropertiesFile', '/etc/falcon/conf/runtime.properties', +- mode = 0644, ++ mode = 0o644, + properties = self.getConfig()['configurations']['falcon-runtime.properties'], + owner = 'falcon' + ) + self.assertResourceCalled('PropertiesFile', '/etc/falcon/conf/startup.properties', +- mode = 0644, ++ mode = 0o644, + properties = self.getConfig()['configurations']['falcon-startup.properties'], + owner = 'falcon' + ) +@@ -151,7 +151,7 @@ + content=InlineTemplate(self.getConfig()['configurations']['falcon-log4j']['content']), + owner='falcon', + group='hadoop', +- mode= 0644 ++ mode= 0o644 + ) + + self.assertResourceCalled('Directory', '/hadoop/falcon/store', +@@ -170,7 +170,7 @@ + hadoop_conf_dir = '/etc/hadoop/conf', + type = 'directory', + action = ['create_on_execute'], hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', hdfs_site=self.getConfig()['configurations']['hdfs-site'], principal_name=UnknownConfigurationMock(), default_fs='hdfs://c6401.ambari.apache.org:8020', +- mode = 0777, ++ mode = 0o777, + ) + self.assertResourceCalled('HdfsResource', '/apps/data-mirroring', + immutable_paths = self.DEFAULT_IMMUTABLE_PATHS, +@@ -187,7 +187,7 @@ + recursive_chown = True, + recursive_chmod = True, + action = ['create_on_execute'], hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', hdfs_site=self.getConfig()['configurations']['hdfs-site'], principal_name=UnknownConfigurationMock(), default_fs='hdfs://c6401.ambari.apache.org:8020', +- mode = 0770, ++ mode = 0o770, + source='/usr/hdp/current/falcon-server/data-mirroring' + ) + +@@ -242,18 +242,18 @@ + '-zchf', + '/tmp/falcon-upgrade-backup/falcon-local-backup.tar', + '-C', +- u'/hadoop/falcon', ++ '/hadoop/falcon', + '.'), + sudo = True, tries = 3, try_sleep = 1, + ) +- self.assertResourceCalled('Execute', ('ambari-python-wrap', '/usr/bin/hdp-select', 'set', 'falcon-server', u'2.2.1.0-2135'), ++ self.assertResourceCalled('Execute', ('ambari-python-wrap', '/usr/bin/hdp-select', 'set', 'falcon-server', '2.2.1.0-2135'), + sudo = True, + ) + self.assertResourceCalled('Execute', ('tar', + '-xf', + '/tmp/falcon-upgrade-backup/falcon-local-backup.tar', + '-C', +- u'/hadoop/falcon/'), ++ '/hadoop/falcon/'), + sudo = True, tries = 3, try_sleep = 1, + ) + self.assertResourceCalled('Directory', '/tmp/falcon-upgrade-backup', +@@ -263,13 +263,13 @@ + owner = 'falcon', + create_parents = True, + cd_access = "a", +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('Directory', '/var/log/falcon', + owner = 'falcon', + create_parents = True, + cd_access = "a", +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('Directory', '/usr/hdp/current/falcon-server/webapp', + owner = 'falcon', +@@ -281,7 +281,7 @@ + ) + self.assertResourceCalled('Directory', '/etc/falcon', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('Directory', '/usr/hdp/current/falcon-server/conf', + owner = 'falcon', +@@ -293,22 +293,22 @@ + group = 'hadoop' + ) + self.assertResourceCalled('PropertiesFile', '/usr/hdp/current/falcon-server/conf/client.properties', +- owner = u'falcon', +- properties = {u'falcon.url': u'http://{{falcon_host}}:{{falcon_port}}'}, +- mode = 0644, ++ owner = 'falcon', ++ properties = {'falcon.url': 'http://{{falcon_host}}:{{falcon_port}}'}, ++ mode = 0o644, + ) + self.assertResourceCalled('PropertiesFile', '/usr/hdp/current/falcon-server/conf/runtime.properties', + owner = 'falcon', +- mode = 0644, +- properties = {u'*.domain': u'${falcon.app.type}', +- u'*.log.cleanup.frequency.days.retention': u'days(7)', +- u'*.log.cleanup.frequency.hours.retention': u'minutes(1)', +- u'*.log.cleanup.frequency.minutes.retention': u'hours(6)', +- u'*.log.cleanup.frequency.months.retention': u'months(3)'}, ++ mode = 0o644, ++ properties = {'*.domain': '${falcon.app.type}', ++ '*.log.cleanup.frequency.days.retention': 'days(7)', ++ '*.log.cleanup.frequency.hours.retention': 'minutes(1)', ++ '*.log.cleanup.frequency.minutes.retention': 'hours(6)', ++ '*.log.cleanup.frequency.months.retention': 'months(3)'}, + ) + self.assertResourceCalled('PropertiesFile', '/usr/hdp/current/falcon-server/conf/startup.properties', + owner = 'falcon', +- mode = 0644, ++ mode = 0o644, + properties = self.getConfig()['configurations']['falcon-startup.properties'], + ) + +@@ -316,21 +316,21 @@ + content=InlineTemplate(self.getConfig()['configurations']['falcon-log4j']['content']), + owner='falcon', + group='hadoop', +- mode= 0644 ++ mode= 0o644 + ) + + self.assertResourceCalled('Directory', '/hadoop/falcon/data/lineage/graphdb', + owner = 'falcon', + create_parents = True, + group = 'hadoop', +- mode = 0775, ++ mode = 0o775, + cd_access = 'a', + ) + self.assertResourceCalled('Directory', '/hadoop/falcon/data/lineage', + owner = 'falcon', + create_parents = True, + group = 'hadoop', +- mode = 0775, ++ mode = 0o775, + cd_access = 'a', + ) + self.assertResourceCalled('Directory', '/hadoop/falcon/store', +@@ -352,7 +352,7 @@ + hadoop_conf_dir = '/etc/hadoop/conf', + type = 'directory', + action = ['create_on_execute'], hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', +- mode = 0777, ++ mode = 0o777, + ) + self.assertResourceCalled('HdfsResource', '/apps/data-mirroring', + immutable_paths = self.DEFAULT_IMMUTABLE_PATHS, +@@ -373,7 +373,7 @@ + hadoop_conf_dir = '/etc/hadoop/conf', + type = 'directory', + action = ['create_on_execute'], hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', +- mode = 0770, ++ mode = 0o770, + ) + self.assertResourceCalled('HdfsResource', None, + immutable_paths = self.DEFAULT_IMMUTABLE_PATHS, +@@ -420,7 +420,7 @@ + def test_pre_upgrade_restart(self): + config_file = self.get_src_folder()+"/test/python/stacks/2.2/configs/falcon-upgrade.json" + +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + + version = '2.2.1.0-3242' +@@ -438,7 +438,7 @@ + '-xf', + '/tmp/falcon-upgrade-backup/falcon-local-backup.tar', + '-C', +- u'/hadoop/falcon/'), ++ '/hadoop/falcon/'), + tries = 3, + sudo = True, + try_sleep = 1, +@@ -455,7 +455,7 @@ + def test_pre_upgrade_restart_23(self, tarfile_open_mock, rmtree_mock, call_mock): + config_file = self.get_src_folder()+"/test/python/stacks/2.2/configs/falcon-upgrade.json" + +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + + version = '2.3.0.0-1234' +@@ -478,7 +478,7 @@ + '-xf', + '/tmp/falcon-upgrade-backup/falcon-local-backup.tar', + '-C', +- u'/hadoop/falcon/'), ++ '/hadoop/falcon/'), + sudo = True, tries = 3, try_sleep = 1, + ) + self.assertResourceCalled('Directory', '/tmp/falcon-upgrade-backup', +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.1/FALCON/test_service_check.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.1/FALCON/test_service_check.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.1/FALCON/test_service_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.1/FALCON/test_service_check.py 2022-07-11 00:52:31.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.1/HIVE/test_hive_metastore.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.1/HIVE/test_hive_metastore.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.1/HIVE/test_hive_metastore.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.1/HIVE/test_hive_metastore.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 json + import os + +-from mock.mock import MagicMock, call, patch ++from unittest.mock import MagicMock, call, patch + from stacks.utils.RMFTestCase import * + from resource_management.libraries.functions.constants import Direction, StackFeature + from resource_management.core.utils import PasswordString +@@ -72,20 +72,20 @@ + + self.assertResourceCalled('Execute', '/tmp/start_metastore_script /var/log/hive/hive.out /var/log/hive/hive.err /var/run/hive/hive.pid /usr/hdp/current/hive-server2/conf/conf.server /var/log/hive', + environment = {'HIVE_CMD': '/usr/hdp/current/hive-server2/bin/hive', +- 'JAVA_HOME': u'/usr/jdk64/jdk1.7.0_45'}, ++ 'JAVA_HOME': '/usr/jdk64/jdk1.7.0_45'}, + not_if = "ls /var/run/hive/hive.pid >/dev/null 2>&1 && ps -p 123 >/dev/null 2>&1", + user = 'hive', + path = ['/bin:/usr/hdp/current/hive-server2/bin:/usr/hdp/2.2.1.0-2067/hadoop/bin'], + ) + +- self.assertResourceCalled('Execute', (u'/usr/jdk64/jdk1.7.0_45/bin/java', ++ self.assertResourceCalled('Execute', ('/usr/jdk64/jdk1.7.0_45/bin/java', + '-cp', + '/usr/lib/ambari-agent/DBConnectionVerification.jar:/usr/hdp/current/hive-server2/lib/mysql-connector-java.jar', + 'org.apache.ambari.server.DBConnectionVerification', +- u'jdbc:mysql://c6402.ambari.apache.org/hive?createDatabaseIfNotExist=true', +- u'hive', ++ 'jdbc:mysql://c6402.ambari.apache.org/hive?createDatabaseIfNotExist=true', ++ 'hive', + PasswordString("aaa"), +- u'com.mysql.jdbc.Driver'), ++ 'com.mysql.jdbc.Driver'), + path = ['/usr/sbin:/sbin:/usr/local/bin:/bin:/usr/bin'], + tries = 5, + try_sleep = 10, +@@ -95,7 +95,7 @@ + + @patch("os.umask") + def test_start_default_umask_027(self, umask_mock): +- umask_mock.return_value = 027 ++ umask_mock.return_value = 0o27 + self.executeScript(self.COMMON_SERVICES_PACKAGE_DIR + "/scripts/hive_metastore.py", + classname = "HiveMetastore", + command = "start", +@@ -109,19 +109,19 @@ + + self.assertResourceCalled('Execute', '/tmp/start_metastore_script /var/log/hive/hive.out /var/log/hive/hive.err /var/run/hive/hive.pid /usr/hdp/current/hive-server2/conf/conf.server /var/log/hive', + environment = {'HIVE_CMD': '/usr/hdp/current/hive-server2/bin/hive', +- 'JAVA_HOME': u'/usr/jdk64/jdk1.7.0_45'}, ++ 'JAVA_HOME': '/usr/jdk64/jdk1.7.0_45'}, + not_if = "ls /var/run/hive/hive.pid >/dev/null 2>&1 && ps -p 123 >/dev/null 2>&1", + user = 'hive', + path = ['/bin:/usr/hdp/current/hive-server2/bin:/usr/hdp/2.2.1.0-2067/hadoop/bin'], + ) +- self.assertResourceCalled('Execute', (u'/usr/jdk64/jdk1.7.0_45/bin/java', ++ self.assertResourceCalled('Execute', ('/usr/jdk64/jdk1.7.0_45/bin/java', + '-cp', + '/usr/lib/ambari-agent/DBConnectionVerification.jar:/usr/hdp/current/hive-server2/lib/mysql-connector-java.jar', + 'org.apache.ambari.server.DBConnectionVerification', +- u'jdbc:mysql://c6402.ambari.apache.org/hive?createDatabaseIfNotExist=true', +- u'hive', ++ 'jdbc:mysql://c6402.ambari.apache.org/hive?createDatabaseIfNotExist=true', ++ 'hive', + PasswordString("aaa"), +- u'com.mysql.jdbc.Driver'), ++ 'com.mysql.jdbc.Driver'), + path = ['/usr/sbin:/sbin:/usr/local/bin:/bin:/usr/bin'], + tries = 5, + try_sleep = 10, +@@ -178,20 +178,20 @@ + self.assert_init_schema('asd') + self.assertResourceCalled('Execute', '/tmp/start_metastore_script /var/log/hive/hive.out /var/log/hive/hive.err /var/run/hive/hive.pid /usr/hdp/current/hive-server2/conf/conf.server /var/log/hive', + environment = {'HIVE_CMD': '/usr/hdp/current/hive-server2/bin/hive', +- 'JAVA_HOME': u'/usr/jdk64/jdk1.7.0_45'}, ++ 'JAVA_HOME': '/usr/jdk64/jdk1.7.0_45'}, + not_if = "ls /var/run/hive/hive.pid >/dev/null 2>&1 && ps -p 123 >/dev/null 2>&1", + user = 'hive', + path = ['/bin:/usr/hdp/current/hive-server2/bin:/usr/hdp/current/hadoop-client/bin'], + ) + +- self.assertResourceCalled('Execute', (u'/usr/jdk64/jdk1.7.0_45/bin/java', ++ self.assertResourceCalled('Execute', ('/usr/jdk64/jdk1.7.0_45/bin/java', + '-cp', + '/usr/lib/ambari-agent/DBConnectionVerification.jar:/usr/hdp/current/hive-server2/lib/mysql-connector-java.jar', + 'org.apache.ambari.server.DBConnectionVerification', +- u'jdbc:mysql://c6402.ambari.apache.org/hive?createDatabaseIfNotExist=true', +- u'hive', ++ 'jdbc:mysql://c6402.ambari.apache.org/hive?createDatabaseIfNotExist=true', ++ 'hive', + PasswordString("asd"), +- u'com.mysql.jdbc.Driver'), ++ 'com.mysql.jdbc.Driver'), + path = ['/usr/sbin:/sbin:/usr/local/bin:/bin:/usr/bin'], + tries = 5, + try_sleep = 10, +@@ -226,40 +226,40 @@ + + def assert_configure_default(self): + self.assertResourceCalled('Directory', '/etc/hive', +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('Directory', '/usr/hdp/current/hive-server2/conf', + owner = 'hive', + group = 'hadoop', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('XmlConfig', 'mapred-site.xml', + group = 'hadoop', + conf_dir = '/usr/hdp/current/hive-server2/conf', +- mode = 0644, +- configuration_attributes = {u'final': {u'mapred.healthChecker.script.path': u'true', +- u'mapreduce.jobtracker.staging.root.dir': u'true'}}, ++ mode = 0o644, ++ configuration_attributes = {'final': {'mapred.healthChecker.script.path': 'true', ++ 'mapreduce.jobtracker.staging.root.dir': 'true'}}, + owner = 'hive', + configurations = self.getConfig()['configurations']['mapred-site'], + ) + self.assertResourceCalled('File', '/usr/hdp/current/hive-server2/conf/hive-default.xml.template', + owner = 'hive', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/usr/hdp/current/hive-server2/conf/hive-env.sh.template', + owner = 'hive', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('XmlConfig', 'hive-site.xml', + group = 'hadoop', + conf_dir = '/usr/hdp/current/hive-server2/conf/conf.server', +- mode = 0600, +- configuration_attributes = {u'final': {u'hive.optimize.bucketmapjoin.sortedmerge': u'true', +- u'javax.jdo.option.ConnectionDriverName': u'true', +- u'javax.jdo.option.ConnectionPassword': u'true'}}, ++ mode = 0o600, ++ configuration_attributes = {'final': {'hive.optimize.bucketmapjoin.sortedmerge': 'true', ++ 'javax.jdo.option.ConnectionDriverName': 'true', ++ 'javax.jdo.option.ConnectionPassword': 'true'}}, + owner = 'hive', + configurations = self.getConfig()['configurations']['hive-site'], + ) +@@ -267,7 +267,7 @@ + content = InlineTemplate(self.getConfig()['configurations']['hive-env']['content']), + owner = 'hive', + group = 'hadoop', +- mode = 0600, ++ mode = 0o600, + ) + self.assertResourceCalled('Directory', '/etc/security/limits.d', + owner = 'root', +@@ -278,30 +278,30 @@ + content = Template('hive.conf.j2'), + owner = 'root', + group = 'root', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/usr/lib/ambari-agent/DBConnectionVerification.jar', + content = DownloadSource('http://c6401.ambari.apache.org:8080/resources/DBConnectionVerification.jar'), +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('Directory', '/var/run/hive', + owner = 'hive', + group = 'hadoop', +- mode = 0755, ++ mode = 0o755, + create_parents = True, + cd_access = 'a', + ) + self.assertResourceCalled('Directory', '/var/log/hive', + owner = 'hive', + group = 'hadoop', +- mode = 0755, ++ mode = 0o755, + create_parents = True, + cd_access = 'a', + ) + self.assertResourceCalled('Directory', '/var/lib/hive', + owner = 'hive', + group = 'hadoop', +- mode = 0755, ++ mode = 0o755, + create_parents = True, + cd_access = 'a', + ) +@@ -317,17 +317,17 @@ + sudo = True, + ) + self.assertResourceCalled('File', '/usr/hdp/current/hive-server2/lib/mysql-connector-java.jar', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/usr/hdp/current/hive-server2/conf/conf.server/hadoop-metrics2-hivemetastore.properties', + owner = 'hive', + group = 'hadoop', + content = Template('hadoop-metrics2-hivemetastore.properties.j2'), +- mode = 0600, ++ mode = 0o600, + ) + self.assertResourceCalled('File', '/tmp/start_metastore_script', + content = StaticFile('startMetastore.sh'), +- mode = 0755, ++ mode = 0o755, + ) + + def assert_init_schema(self, password): +@@ -338,40 +338,40 @@ + + def assert_configure_secured(self): + self.assertResourceCalled('Directory', '/etc/hive', +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('Directory', '/usr/hdp/current/hive-server2/conf', + owner = 'hive', + group = 'hadoop', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('XmlConfig', 'mapred-site.xml', + group = 'hadoop', + conf_dir = '/usr/hdp/current/hive-server2/conf', +- mode = 0644, +- configuration_attributes = {u'final': {u'mapred.healthChecker.script.path': u'true', +- u'mapreduce.jobtracker.staging.root.dir': u'true'}}, ++ mode = 0o644, ++ configuration_attributes = {'final': {'mapred.healthChecker.script.path': 'true', ++ 'mapreduce.jobtracker.staging.root.dir': 'true'}}, + owner = 'hive', + configurations = self.getConfig()['configurations']['mapred-site'], + ) + self.assertResourceCalled('File', '/usr/hdp/current/hive-server2/conf/hive-default.xml.template', + owner = 'hive', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/usr/hdp/current/hive-server2/conf/hive-env.sh.template', + owner = 'hive', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('XmlConfig', 'hive-site.xml', + group = 'hadoop', + conf_dir = '/usr/hdp/current/hive-server2/conf/conf.server', +- mode = 0600, +- configuration_attributes = {u'final': {u'hive.optimize.bucketmapjoin.sortedmerge': u'true', +- u'javax.jdo.option.ConnectionDriverName': u'true', +- u'javax.jdo.option.ConnectionPassword': u'true'}}, ++ mode = 0o600, ++ configuration_attributes = {'final': {'hive.optimize.bucketmapjoin.sortedmerge': 'true', ++ 'javax.jdo.option.ConnectionDriverName': 'true', ++ 'javax.jdo.option.ConnectionPassword': 'true'}}, + owner = 'hive', + configurations = self.getConfig()['configurations']['hive-site'], + ) +@@ -379,7 +379,7 @@ + content = InlineTemplate(self.getConfig()['configurations']['hive-env']['content']), + owner = 'hive', + group = 'hadoop', +- mode = 0600, ++ mode = 0o600, + ) + self.assertResourceCalled('Directory', '/etc/security/limits.d', + owner = 'root', +@@ -390,7 +390,7 @@ + content = Template('hive.conf.j2'), + owner = 'root', + group = 'root', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/usr/hdp/current/hive-server2/conf/conf.server/zkmigrator_jaas.conf', + content = Template('zkmigrator_jaas.conf.j2'), +@@ -399,26 +399,26 @@ + ) + self.assertResourceCalled('File', '/usr/lib/ambari-agent/DBConnectionVerification.jar', + content = DownloadSource('http://c6401.ambari.apache.org:8080/resources/DBConnectionVerification.jar'), +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('Directory', '/var/run/hive', + owner = 'hive', + group = 'hadoop', +- mode = 0755, ++ mode = 0o755, + create_parents = True, + cd_access = 'a', + ) + self.assertResourceCalled('Directory', '/var/log/hive', + owner = 'hive', + group = 'hadoop', +- mode = 0755, ++ mode = 0o755, + create_parents = True, + cd_access = 'a', + ) + self.assertResourceCalled('Directory', '/var/lib/hive', + owner = 'hive', + group = 'hadoop', +- mode = 0755, ++ mode = 0o755, + create_parents = True, + cd_access = 'a', + ) +@@ -434,23 +434,23 @@ + sudo = True, + ) + self.assertResourceCalled('File', '/usr/hdp/current/hive-server2/lib/mysql-connector-java.jar', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/usr/hdp/current/hive-server2/conf/conf.server/hadoop-metrics2-hivemetastore.properties', + owner = 'hive', + group = 'hadoop', + content = Template('hadoop-metrics2-hivemetastore.properties.j2'), +- mode = 0600, ++ mode = 0o600, + ) + + self.assertResourceCalled('File', '/tmp/start_metastore_script', + content = StaticFile('startMetastore.sh'), +- mode = 0755, ++ mode = 0o755, + ) + + def test_pre_upgrade_restart(self): + config_file = self.get_src_folder()+"/test/python/stacks/2.0.6/configs/default.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + version = '2.2.1.0-3242' + json_content['commandParams']['version'] = version +@@ -470,7 +470,7 @@ + def test_pre_upgrade_restart_23(self, call_mock, os_path__exists_mock): + config_file = self.get_src_folder()+"/test/python/stacks/2.0.6/configs/default.json" + os_path__exists_mock.return_value = False +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + version = '2.3.0.0-1234' + json_content['commandParams']['version'] = version +@@ -495,7 +495,7 @@ + Tests the state of the init_metastore_schema property on update + """ + config_file = self.get_src_folder() + "/test/python/stacks/2.0.6/configs/default.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + + # first try it with a normal, non-upgrade +@@ -507,11 +507,11 @@ + target = RMFTestCase.TARGET_COMMON_SERVICES, + call_mocks = [(0, None, ''), (0, None)]) + +- self.assertEquals(True, RMFTestCase.env.config["params"]["init_metastore_schema"]) ++ self.assertEqual(True, RMFTestCase.env.config["params"]["init_metastore_schema"]) + + self.config_dict = None + config_file = self.get_src_folder() + "/test/python/stacks/2.0.6/configs/default.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + + json_content['commandParams']['version'] = '2.3.0.0-1234' +@@ -527,11 +527,11 @@ + target = RMFTestCase.TARGET_COMMON_SERVICES, + call_mocks = [(0, None, ''), (0, None)]) + +- self.assertEquals(False, RMFTestCase.env.config["params"]["init_metastore_schema"]) ++ self.assertEqual(False, RMFTestCase.env.config["params"]["init_metastore_schema"]) + + self.config_dict = None + config_file = self.get_src_folder() + "/test/python/stacks/2.0.6/configs/default.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + + json_content['commandParams']['upgrade_direction'] = Direction.DOWNGRADE +@@ -545,7 +545,7 @@ + target = RMFTestCase.TARGET_COMMON_SERVICES, + call_mocks = [(0, None, ''), (0, None)]) + +- self.assertEquals(False, RMFTestCase.env.config["params"]["init_metastore_schema"]) ++ self.assertEqual(False, RMFTestCase.env.config["params"]["init_metastore_schema"]) + + + @patch("os.path.exists") +@@ -565,7 +565,7 @@ + + config_file = self.get_src_folder()+"/test/python/stacks/2.0.6/configs/default.json" + +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + + # must be HDP 2.4+ +@@ -615,7 +615,7 @@ + # we don't care about configure here - the strings are different anyway because this + # is an upgrade, so just pop those resources off of the call stack + self.assertResourceCalledIgnoreEarlier('Directory', '/var/lib/hive', owner = 'hive', group = 'hadoop', +- mode = 0755, create_parents = True, cd_access = 'a') ++ mode = 0o755, create_parents = True, cd_access = 'a') + + + self.assertResourceCalledIgnoreEarlier('Execute', ('rm', '-f', '/usr/hdp/current/hive-metastore/lib/ojdbc6.jar'), +@@ -633,16 +633,16 @@ + sudo = True) + + self.assertResourceCalled('File', '/usr/hdp/2.4.0.0-1234/hive/lib/mysql-connector-java.jar', +- mode = 0644) ++ mode = 0o644) + self.assertResourceCalled('File', '/usr/hdp/current/hive-metastore/conf/conf.server/hadoop-metrics2-hivemetastore.properties', + content = Template('hadoop-metrics2-hivemetastore.properties.j2'), + owner = 'hive', + group = 'hadoop', +- mode = 0600 ++ mode = 0o600 + ) + self.assertResourceCalled('File', '/tmp/start_metastore_script', + content = StaticFile('startMetastore.sh'), +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('Execute', ('rm', '-f', '/usr/hdp/current/hive-metastore/lib/ojdbc6.jar'), + path = ['/bin', '/usr/bin/'], +@@ -653,13 +653,13 @@ + ) + self.assertResourceCalled('Execute', ('cp', + '--remove-destination', +- u'/tmp/mysql-connector-java.jar', +- u'/usr/hdp/2.4.0.0-1234/hive/lib/mysql-connector-java.jar'), ++ '/tmp/mysql-connector-java.jar', ++ '/usr/hdp/2.4.0.0-1234/hive/lib/mysql-connector-java.jar'), + path = ['/bin', '/usr/bin/'], + sudo = True, + ) + self.assertResourceCalled('File', '/usr/hdp/2.4.0.0-1234/hive/lib/mysql-connector-java.jar', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('Execute', ('cp', + '/usr/hdp/2.3.7.0-1234/hive/lib/mysql-connector-java.jar', +@@ -668,7 +668,7 @@ + sudo = True) + + self.assertResourceCalled('File', '/usr/hdp/2.4.0.0-1234/hive/lib/mysql-connector-java.jar', +- mode = 0644) ++ mode = 0o644) + + self.assertResourceCalled('Execute', '/usr/hdp/2.4.0.0-1234/hive/bin/schematool -dbType mysql -upgradeSchema', + logoutput = True, +@@ -698,7 +698,7 @@ + + config_file = self.get_src_folder()+"/test/python/stacks/2.1/configs/hive-metastore-upgrade.json" + +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + + mocks_dict = {} +@@ -715,7 +715,7 @@ + # we don't care about configure here - the strings are different anyway because this + # is an upgrade, so just pop those resources off of the call stack + self.assertResourceCalledIgnoreEarlier('Directory', '/var/lib/hive', owner = 'hive', group = 'hadoop', +- mode = 0755, create_parents = True, cd_access = 'a') ++ mode = 0o755, create_parents = True, cd_access = 'a') + + self.assertResourceCalled('File', + '/tmp/mysql-connector-java.jar', +@@ -729,23 +729,23 @@ + sudo = True, + ) + self.assertResourceCalled('File', '/usr/hdp/2.3.2.0-2950/hive/lib/mysql-connector-java.jar', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/usr/hdp/current/hive-metastore/conf/conf.server/hadoop-metrics2-hivemetastore.properties', + content = Template('hadoop-metrics2-hivemetastore.properties.j2'), + owner = 'hive', + group = 'hadoop', +- mode = 0600 ++ mode = 0o600 + ) + self.assertResourceCalled('File', '/tmp/start_metastore_script', + content = StaticFile('startMetastore.sh'), +- mode = 0755, ++ mode = 0o755, + ) + + self.assertResourceCalled('Directory', '/tmp/hive', + owner = 'hive', + create_parents = True, +- mode=0777 ++ mode=0o777 + ) + + self.assertResourceCalled('File', +@@ -755,12 +755,12 @@ + self.assertResourceCalled('Execute', ('cp', + '--remove-destination', + '/tmp/mysql-connector-java.jar', +- u'/usr/hdp/2.3.2.0-2950/hive/lib/mysql-connector-java.jar'), ++ '/usr/hdp/2.3.2.0-2950/hive/lib/mysql-connector-java.jar'), + path = ['/bin', '/usr/bin/'], + sudo = True, + ) + self.assertResourceCalled('File', '/usr/hdp/2.3.2.0-2950/hive/lib/mysql-connector-java.jar', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('Execute', ('cp', + '/usr/hdp/2.3.0.0-2557/hive/lib/mysql-connector-java.jar', +@@ -769,7 +769,7 @@ + sudo = True, + ) + self.assertResourceCalled('File', '/usr/hdp/2.3.2.0-2950/hive/lib/mysql-connector-java.jar', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('Execute', '/usr/hdp/2.3.2.0-2950/hive/bin/schematool -dbType mysql -upgradeSchema', + logoutput = True, +@@ -798,7 +798,7 @@ + + config_file = self.get_src_folder()+"/test/python/stacks/2.0.6/configs/default.json" + +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + + # must be HDP 2.3+ +@@ -828,7 +828,7 @@ + # we don't care about configure here - the strings are different anyway because this + # is an upgrade, so just pop those resources off of the call stack + self.assertResourceCalledIgnoreEarlier('Directory', '/var/lib/hive', owner = 'hive', group = 'hadoop', +- mode = 0755, create_parents = True, cd_access = 'a') ++ mode = 0o755, create_parents = True, cd_access = 'a') + + self.assertResourceCalled('Execute', + ('rm', '-f', '/usr/hdp/current/hive-metastore/lib/ojdbc6.jar'), +@@ -858,17 +858,17 @@ + ('ambari-sudo.sh chown -R hive:hadoop /usr/hdp/current/hive-metastore/lib/*')) + + self.assertResourceCalled('File', '/usr/hdp/2.3.0.0-1234/hive/lib/sqla-client-jdbc.tar.gz', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/usr/hdp/current/hive-metastore/conf/conf.server/hadoop-metrics2-hivemetastore.properties', + content = Template('hadoop-metrics2-hivemetastore.properties.j2'), + owner = 'hive', + group = 'hadoop', +- mode = 0600 ++ mode = 0o600 + ) + self.assertResourceCalled('File', '/tmp/start_metastore_script', + content = StaticFile('startMetastore.sh'), +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('Execute', ('rm', '-f', '/usr/hdp/current/hive-metastore/lib/ojdbc6.jar'), + path = ['/bin', '/usr/bin/'], +@@ -877,7 +877,7 @@ + self.assertResourceCalled('File', '/tmp/sqla-client-jdbc.tar.gz', + content = DownloadSource('http://c6401.ambari.apache.org:8080/resources/sqla-client-jdbc.tar.gz'), + ) +- self.assertResourceCalled('Execute', ('tar', '-xvf', u'/tmp/sqla-client-jdbc.tar.gz', '-C', '/tmp'), ++ self.assertResourceCalled('Execute', ('tar', '-xvf', '/tmp/sqla-client-jdbc.tar.gz', '-C', '/tmp'), + sudo = True, + ) + self.assertResourceCalled('Execute', 'yes | ambari-sudo.sh cp /tmp/sqla-client-jdbc/java/* /usr/hdp/current/hive-metastore/lib',) +@@ -887,7 +887,7 @@ + self.assertResourceCalled('Execute', 'yes | ambari-sudo.sh cp /tmp/sqla-client-jdbc/native/lib64/* /usr/hdp/current/hive-metastore/lib/native/lib64',) + self.assertResourceCalled('Execute', 'ambari-sudo.sh chown -R hive:hadoop /usr/hdp/current/hive-metastore/lib/*',) + self.assertResourceCalled('File', '/usr/hdp/2.3.0.0-1234/hive/lib/sqla-client-jdbc.tar.gz', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('Execute', + ('yes | ambari-sudo.sh cp /usr/hdp/current/hive-metastore/lib/*.jar /usr/hdp/2.3.0.0-1234/hive/lib')) +@@ -903,7 +903,7 @@ + ('ambari-sudo.sh chown -R hive:hadoop /usr/hdp/current/hive-metastore/lib/*')) + + self.assertResourceCalled('File', '/usr/hdp/2.3.0.0-1234/hive/lib/sqla-client-jdbc.tar.gz', +- mode = 0644, ++ mode = 0o644, + ) + + self.assertResourceCalled('Execute', "/usr/hdp/2.3.0.0-1234/hive/bin/schematool -dbType sqlanywhere -upgradeSchema", +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.1/STORM/test_service_check.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.1/STORM/test_service_check.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.1/STORM/test_service_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.1/STORM/test_service_check.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 mock.mock import MagicMock, call, patch ++from unittest.mock import MagicMock, call, patch + from stacks.utils.RMFTestCase import * + import datetime + import resource_management.libraries.functions +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.1/STORM/test_storm_base.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.1/STORM/test_storm_base.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.1/STORM/test_storm_base.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.1/STORM/test_storm_base.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 mock.mock import MagicMock, call, patch ++from unittest.mock import MagicMock, call, patch + import resource_management.core.source + from stacks.utils.RMFTestCase import * + import re +@@ -33,7 +33,7 @@ + self.assertResourceCalled('Directory', '/var/log/storm', + owner = 'storm', + group = 'hadoop', +- mode = 0777, ++ mode = 0o777, + create_parents = True, + cd_access='a', + ) +@@ -42,14 +42,14 @@ + group = 'hadoop', + create_parents = True, + cd_access='a', +- mode=0755, ++ mode=0o755, + ) + self.assertResourceCalled('Directory', '/hadoop/storm', + owner = 'storm', + group = 'hadoop', + create_parents = True, + cd_access='a', +- mode=0755, ++ mode=0o755, + ) + self.assertResourceCalled('Directory', confDir, + group = 'hadoop', +@@ -60,7 +60,7 @@ + content = Template('storm.conf.j2'), + owner = 'root', + group = 'root', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', confDir + '/config.yaml', + owner = 'storm', +@@ -112,7 +112,7 @@ + self.assertResourceCalled('Directory', '/var/log/storm', + owner = 'storm', + group = 'hadoop', +- mode = 0777, ++ mode = 0o777, + create_parents = True, + cd_access='a', + ) +@@ -121,14 +121,14 @@ + group = 'hadoop', + create_parents = True, + cd_access='a', +- mode=0755, ++ mode=0o755, + ) + self.assertResourceCalled('Directory', '/hadoop/storm', + owner = 'storm', + group = 'hadoop', + create_parents = True, + cd_access='a', +- mode=0755, ++ mode=0o755, + ) + self.assertResourceCalled('Directory', confDir, + group = 'hadoop', +@@ -139,7 +139,7 @@ + content = Template('storm.conf.j2'), + owner = 'root', + group = 'root', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', confDir + '/config.yaml', + owner = 'storm', +@@ -156,7 +156,7 @@ + ) + self.assertResourceCalled('TemplateConfig', confDir + '/storm_jaas.conf', + owner = 'storm', +- mode = 0644 ++ mode = 0o644 + ) + return storm_yarn_content + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.1/STORM/test_storm_drpc_server.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.1/STORM/test_storm_drpc_server.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.1/STORM/test_storm_drpc_server.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.1/STORM/test_storm_drpc_server.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 +-from mock.mock import MagicMock, call, patch ++from unittest.mock import MagicMock, call, patch + from stacks.utils.RMFTestCase import * + import resource_management.core.source + from test_storm_base import TestStormBase +@@ -154,7 +154,7 @@ + + def test_pre_upgrade_restart_23(self): + config_file = self.get_src_folder()+"/test/python/stacks/2.1/configs/default.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + version = '2.3.0.0-1234' + json_content['commandParams']['version'] = version +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.1/STORM/test_storm_jaas_configuration.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.1/STORM/test_storm_jaas_configuration.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.1/STORM/test_storm_jaas_configuration.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.1/STORM/test_storm_jaas_configuration.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 mock.mock import MagicMock, call, patch ++from unittest.mock import MagicMock, call, patch + from stacks.utils.RMFTestCase import * + import resource_management.core.source + from test_storm_base import TestStormBase +@@ -70,7 +70,7 @@ + self.assert_configure_secured() + + def assert_configure_default(self): +- storm_yarn_content = super(TestStormJaasConfiguration, self).assert_configure_default(confDir="/usr/hdp/current/storm-nimbus/conf") ++ storm_yarn_content = super().assert_configure_default(confDir="/usr/hdp/current/storm-nimbus/conf") + + self.assertTrue(storm_yarn_content.find('_JAAS_PLACEHOLDER') == -1, 'Placeholder have to be substituted') + +@@ -80,10 +80,10 @@ + + def assert_configure_secured(self): + +- storm_yarn_content = super(TestStormJaasConfiguration, self).assert_configure_secured(confDir="/usr/hdp/current/storm-nimbus/conf") ++ storm_yarn_content = super().assert_configure_secured(confDir="/usr/hdp/current/storm-nimbus/conf") + self.assertResourceCalled('TemplateConfig', '/usr/hdp/current/storm-nimbus/conf/client_jaas.conf', + owner = 'storm', +- mode = 0644 ++ mode = 0o644 + ) + self.assertResourceCalled('File', '/usr/hdp/current/storm-nimbus/conf/worker-launcher.cfg', + owner = 'root', +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.1/STORM/test_storm_nimbus_prod.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.1/STORM/test_storm_nimbus_prod.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.1/STORM/test_storm_nimbus_prod.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.1/STORM/test_storm_nimbus_prod.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 +-from mock.mock import MagicMock, call, patch ++from unittest.mock import MagicMock, call, patch + from stacks.utils.RMFTestCase import * + import resource_management.core.source + from test_storm_base import TestStormBase +@@ -128,7 +128,7 @@ + + def test_pre_upgrade_restart_23(self): + config_file = self.get_src_folder()+"/test/python/stacks/2.1/configs/default.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + version = '2.3.0.0-1234' + json_content['commandParams']['version'] = version +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.1/STORM/test_storm_nimbus.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.1/STORM/test_storm_nimbus.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.1/STORM/test_storm_nimbus.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.1/STORM/test_storm_nimbus.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 +-from mock.mock import MagicMock, call, patch ++from unittest.mock import MagicMock, call, patch + from stacks.utils.RMFTestCase import * + import resource_management.core.source + from test_storm_base import TestStormBase +@@ -72,7 +72,7 @@ + + def test_start_with_metrics_collector(self): + config_file = self.get_src_folder() + "/test/python/stacks/2.1/configs/default.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + json_content["clusterHostInfo"]["metrics_collector_hosts"] = ["host1", "host2"] + +@@ -107,7 +107,7 @@ + + def test_start_with_metrics_collector_modern(self): + config_file = self.get_src_folder() + "/test/python/stacks/2.1/configs/default.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + json_content["commandParams"]["version"] = "2.5.0.0-1234" + json_content["clusterHostInfo"]["metrics_collector_hosts"] = ["host1", "host2"] +@@ -262,7 +262,7 @@ + + def test_pre_upgrade_restart_23(self): + config_file = self.get_src_folder()+"/test/python/stacks/2.1/configs/default.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + version = '2.3.0.0-1234' + json_content['commandParams']['version'] = version +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.1/STORM/test_storm_rest_api_service.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.1/STORM/test_storm_rest_api_service.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.1/STORM/test_storm_rest_api_service.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.1/STORM/test_storm_rest_api_service.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 +-from mock.mock import MagicMock, call, patch ++from unittest.mock import MagicMock, call, patch + from stacks.utils.RMFTestCase import * + import resource_management.core.source + from test_storm_base import TestStormBase +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.1/STORM/test_storm_supervisor_prod.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.1/STORM/test_storm_supervisor_prod.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.1/STORM/test_storm_supervisor_prod.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.1/STORM/test_storm_supervisor_prod.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 +-from mock.mock import MagicMock, call, patch ++from unittest.mock import MagicMock, call, patch + from stacks.utils.RMFTestCase import * + import resource_management.core.source + from test_storm_base import TestStormBase +@@ -170,7 +170,7 @@ + + def test_pre_upgrade_restart_23(self): + config_file = self.get_src_folder()+"/test/python/stacks/2.1/configs/default.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + version = '2.3.0.0-1234' + json_content['commandParams']['version'] = version +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.1/STORM/test_storm_supervisor.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.1/STORM/test_storm_supervisor.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.1/STORM/test_storm_supervisor.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.1/STORM/test_storm_supervisor.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 +-from mock.mock import MagicMock, call, patch ++from unittest.mock import MagicMock, call, patch + from stacks.utils.RMFTestCase import * + import resource_management.core.source + from test_storm_base import TestStormBase +@@ -193,7 +193,7 @@ + + def test_pre_upgrade_restart_23(self): + config_file = self.get_src_folder()+"/test/python/stacks/2.1/configs/default.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + version = '2.3.0.0-1234' + json_content['commandParams']['version'] = version +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.1/STORM/test_storm_ui_server.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.1/STORM/test_storm_ui_server.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.1/STORM/test_storm_ui_server.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.1/STORM/test_storm_ui_server.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 +-from mock.mock import MagicMock, call, patch ++from unittest.mock import MagicMock, call, patch + from stacks.utils.RMFTestCase import * + import resource_management.core.source + from test_storm_base import TestStormBase +@@ -77,7 +77,7 @@ + + def test_start_with_apache_classes(self): + config_file = self.get_src_folder()+"/test/python/stacks/2.1/configs/default.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + version = '2.5.0.0-1234' + json_content['commandParams']['version'] = version +@@ -223,7 +223,7 @@ + + def test_pre_upgrade_restart_23(self): + config_file = self.get_src_folder()+"/test/python/stacks/2.1/configs/default.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + version = '2.3.0.0-1234' + json_content['commandParams']['version'] = version +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.1/TEZ/test_service_check.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.1/TEZ/test_service_check.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.1/TEZ/test_service_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.1/TEZ/test_service_check.py 2022-07-11 00:52:31.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +@@ -36,7 +36,7 @@ + ) + self.assertResourceCalled('File', '/tmp/sample-tez-test', + content = 'foo\nbar\nfoo\nbar\nfoo', +- mode = 0755, ++ mode = 0o755, + ) + + self.assertResourceCalled('HdfsResource', '/tmp/tezsmokeoutput', +@@ -118,7 +118,7 @@ + + self.assertResourceCalled('File', '/tmp/sample-tez-test', + content = 'foo\nbar\nfoo\nbar\nfoo', +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('HdfsResource', '/tmp/tezsmokeoutput', + immutable_paths = self.DEFAULT_IMMUTABLE_PATHS, +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.1/TEZ/test_tez_client.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.1/TEZ/test_tez_client.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.1/TEZ/test_tez_client.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.1/TEZ/test_tez_client.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 +-from mock.mock import MagicMock, call, patch ++from unittest.mock import MagicMock, call, patch + from stacks.utils.RMFTestCase import * + + class TestTezClient(RMFTestCase): +@@ -40,7 +40,7 @@ + ) + + self.assertResourceCalled('Directory', '/etc/tez', +- mode = 0755 ++ mode = 0o755 + ) + + self.assertResourceCalled('Directory', '/etc/tez/conf', +@@ -55,13 +55,13 @@ + conf_dir = '/etc/tez/conf', + configurations = self.getConfig()['configurations']['tez-site'], + configuration_attributes = self.getConfig()['configurationAttributes']['tez-site'], +- mode = 0664 ++ mode = 0o664 + ) + + self.assertResourceCalled('File', '/etc/tez/conf/tez-env.sh', + owner = 'tez', + content = InlineTemplate(self.getConfig()['configurations']['tez-env']['content']), +- mode=0555 ++ mode=0o555 + ) + + self.assertNoMoreResources() +@@ -98,7 +98,7 @@ + + def test_pre_upgrade_restart_23(self): + config_file = self.get_src_folder()+"/test/python/stacks/2.1/configs/client-upgrade.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + version = '2.3.0.0-1234' + json_content['commandParams']['version'] = version +@@ -118,7 +118,7 @@ + + def test_stack_upgrade_save_new_config(self): + config_file = self.get_src_folder()+"/test/python/stacks/2.1/configs/client-upgrade.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + version = '2.3.0.0-1234' + json_content['commandParams']['version'] = version +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.1/YARN/test_apptimelineserver.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.1/YARN/test_apptimelineserver.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.1/YARN/test_apptimelineserver.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.1/YARN/test_apptimelineserver.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 mock.mock import MagicMock, call, patch ++from unittest.mock import MagicMock, call, patch + from stacks.utils.RMFTestCase import * + import resource_management.libraries.functions + +@@ -166,7 +166,7 @@ + self.assertResourceCalled('XmlConfig', 'core-site.xml', + owner = 'hdfs', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + conf_dir = '/etc/hadoop/conf', + configurations = self.getConfig()['configurations']['core-site'], + configuration_attributes = self.getConfig()['configurationAttributes']['core-site'] +@@ -174,7 +174,7 @@ + self.assertResourceCalled('XmlConfig', 'hdfs-site.xml', + owner = 'hdfs', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + conf_dir = '/etc/hadoop/conf', + configurations = self.getConfig()['configurations']['hdfs-site'], + configuration_attributes = self.getConfig()['configurationAttributes']['hdfs-site'] +@@ -182,7 +182,7 @@ + self.assertResourceCalled('XmlConfig', 'mapred-site.xml', + owner = 'yarn', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + conf_dir = '/etc/hadoop/conf', + configurations = self.getConfig()['configurations']['mapred-site'], + configuration_attributes = self.getConfig()['configurationAttributes']['mapred-site'] +@@ -190,7 +190,7 @@ + self.assertResourceCalled('XmlConfig', 'yarn-site.xml', + owner = 'yarn', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + conf_dir = '/etc/hadoop/conf', + configurations = self.getConfig()['configurations']['yarn-site'], + configuration_attributes = self.getConfig()['configurationAttributes']['yarn-site'] +@@ -198,43 +198,43 @@ + self.assertResourceCalled('XmlConfig', 'capacity-scheduler.xml', + owner = 'yarn', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + conf_dir = '/etc/hadoop/conf', + configurations = self.getConfig()['configurations']['capacity-scheduler'], + configuration_attributes = self.getConfig()['configurationAttributes']['capacity-scheduler'] + ) + self.assertResourceCalled('File', '/etc/security/limits.d/yarn.conf', + content = Template('yarn.conf.j2'), +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/etc/security/limits.d/mapreduce.conf', + content = Template('mapreduce.conf.j2'), +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/etc/hadoop/conf/yarn-env.sh', + content = InlineTemplate(self.getConfig()['configurations']['yarn-env']['content']), + owner = 'yarn', + group = 'hadoop', +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('File', '/usr/lib/hadoop-yarn/bin/container-executor', + group = 'hadoop', +- mode = 02050, ++ mode = 0o2050, + ) + self.assertResourceCalled('File', '/etc/hadoop/conf/container-executor.cfg', + content = InlineTemplate(self.getConfig()['configurations']['container-executor']['content']), + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('Directory', '/cgroups_test/cpu', + group = 'hadoop', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + cd_access="a" + ) + self.assertResourceCalled('File', '/etc/hadoop/conf/mapred-env.sh', + content = InlineTemplate(self.getConfig()['configurations']['mapred-env']['content']), +- mode = 0755, ++ mode = 0o755, + owner = 'hdfs', + ) + self.assertResourceCalled('File', '/etc/hadoop/conf/taskcontroller.cfg', +@@ -271,7 +271,7 @@ + @patch.object(resource_management.libraries.functions, "get_stack_version", new = MagicMock(return_value='2.3.0.0-1234')) + def test_pre_upgrade_restart_23(self): + config_file = self.get_src_folder()+"/test/python/stacks/2.0.6/configs/default.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + version = '2.3.0.0-1234' + json_content['commandParams']['version'] = version +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.2/ACCUMULO/test_accumulo_client.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.2/ACCUMULO/test_accumulo_client.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.2/ACCUMULO/test_accumulo_client.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.2/ACCUMULO/test_accumulo_client.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 + +-from mock.mock import patch ++from unittest.mock import patch + from stacks.utils.RMFTestCase import * + + from only_for_platform import not_for_platform, PLATFORM_WINDOWS +@@ -33,7 +33,7 @@ + + def test_pre_upgrade_restart(self): + config_file = self.get_src_folder() + "/test/python/stacks/2.2/configs/default.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + + version = '2.2.7.0-1234' +@@ -54,7 +54,7 @@ + def test_pre_upgrade_restart_23(self, call_mock): + config_file = self.get_src_folder() + "/test/python/stacks/2.2/configs/default.json" + +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + + version = '2.3.0.0-1234' +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.2/common/test_conf_select.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.2/common/test_conf_select.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.2/common/test_conf_select.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.2/common/test_conf_select.py 2022-07-11 00:52:31.000000000 +0800 +@@ -18,7 +18,7 @@ + + import pprint + import os +-from mock.mock import patch, MagicMock ++from unittest.mock import patch, MagicMock + from stacks.utils.RMFTestCase import * + from resource_management.core.logger import Logger + from resource_management.libraries.functions import conf_select +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.2/common/test_stack_advisor_perf.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.2/common/test_stack_advisor_perf.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.2/common/test_stack_advisor_perf.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.2/common/test_stack_advisor_perf.py 2022-07-11 00:52:31.000000000 +0800 +@@ -77,7 +77,7 @@ + start = time.time() + recommendation = stack_advisor.recommendComponentLayout(services, hosts) + time_taken = time.time() - start +- print "Current stack advisor elapsed {0}, allowed {1}".format(time_taken, TestStackAdvisorPerformance.TIME_ALLOWED) ++ print("Current stack advisor elapsed {}, allowed {}".format(time_taken, TestStackAdvisorPerformance.TIME_ALLOWED)) + + self.assertTrue(time_taken < TestStackAdvisorPerformance.TIME_ALLOWED) # Python 2.7: assertLess + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.2/common/test_stack_advisor.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.2/common/test_stack_advisor.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.2/common/test_stack_advisor.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.2/common/test_stack_advisor.py 2022-07-11 00:52:31.000000000 +0800 +@@ -175,7 +175,7 @@ + expected['tez-site']['properties']['tez.tez-ui.history-url.base'] = tez_ui_url + + self.stackAdvisor.recommendTezConfigurations(configurations, clusterData, services, hosts) +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + + def test_recommendTezConfigurations_amMemoryMoreThan3072(self): + configurations = { +@@ -261,7 +261,7 @@ + } + + self.stackAdvisor.recommendTezConfigurations(configurations, clusterData, services, hosts) +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + + def test_recommendTezConfigurations_mapMemoryLessThan768(self): + configurations = { +@@ -347,7 +347,7 @@ + } + + self.stackAdvisor.recommendTezConfigurations(configurations, clusterData, services, hosts) +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + + + def test_validateHDFSConfigurations(self): +@@ -393,7 +393,7 @@ + } + expected = [] # No warnings + validation_problems = self.stackAdvisor.validateHDFSConfigurations(properties, recommendedDefaults, configurations, services, None) +- self.assertEquals(validation_problems, expected) ++ self.assertEqual(validation_problems, expected) + + # TEST CASE: Unsecured cluster, unsecure ports + properties = { # hdfs-site +@@ -425,7 +425,7 @@ + "configurations": {} + } + validation_problems = self.stackAdvisor.validateHDFSConfigurations(properties, recommendedDefaults, configurations, services, None) +- self.assertEquals(validation_problems, expected) ++ self.assertEqual(validation_problems, expected) + + # TEST CASE: Secure cluster, invalid dfs.http.policy value + properties = { # hdfs-site +@@ -462,7 +462,7 @@ + "configurations": {} + } + validation_problems = self.stackAdvisor.validateHDFSConfigurations(properties, recommendedDefaults, configurations, services, None) +- self.assertEquals(validation_problems, expected) ++ self.assertEqual(validation_problems, expected) + + # TEST CASE: Secure cluster, dfs.http.policy=HTTPS_ONLY, https address not defined + properties = { # hdfs-site +@@ -494,7 +494,7 @@ + "configurations": {} + } + validation_problems = self.stackAdvisor.validateHDFSConfigurations(properties, recommendedDefaults, configurations, services, None) +- self.assertEquals(validation_problems, expected) ++ self.assertEqual(validation_problems, expected) + + # TEST CASE: Secure cluster, dfs.http.policy=HTTPS_ONLY, https address defined and secure + properties = { # hdfs-site +@@ -527,7 +527,7 @@ + "configurations": {} + } + validation_problems = self.stackAdvisor.validateHDFSConfigurations(properties, recommendedDefaults, configurations, services, None) +- self.assertEquals(validation_problems, expected) ++ self.assertEqual(validation_problems, expected) + + # TEST CASE: Secure cluster, dfs.http.policy=HTTPS_ONLY, https address defined and non secure + properties = { # hdfs-site +@@ -560,7 +560,7 @@ + "configurations": {} + } + validation_problems = self.stackAdvisor.validateHDFSConfigurations(properties, recommendedDefaults, configurations, services, None) +- self.assertEquals(validation_problems, expected) ++ self.assertEqual(validation_problems, expected) + + # TEST CASE: Secure cluster, dfs.http.policy=HTTPS_ONLY, non secure dfs port, https property not defined + properties = { # hdfs-site +@@ -612,7 +612,7 @@ + 'type': 'configuration'} + ] + validation_problems = self.stackAdvisor.validateHDFSConfigurations(properties, recommendedDefaults, configurations, services, None) +- self.assertEquals(validation_problems, expected) ++ self.assertEqual(validation_problems, expected) + + + # TEST CASE: Secure cluster, dfs.http.policy=HTTPS_ONLY, non secure dfs port, https defined and secure +@@ -664,7 +664,7 @@ + 'type': 'configuration'} + ] + validation_problems = self.stackAdvisor.validateHDFSConfigurations(properties, recommendedDefaults, configurations, services, None) +- self.assertEquals(validation_problems, expected) ++ self.assertEqual(validation_problems, expected) + + # TEST CASE: Secure cluster, dfs.http.policy=HTTPS_ONLY, valid non-root configuration + properties = { # hdfs-site +@@ -690,7 +690,7 @@ + } + expected = [] + validation_problems = self.stackAdvisor.validateHDFSConfigurations(properties, recommendedDefaults, configurations, services, None) +- self.assertEquals(validation_problems, expected) ++ self.assertEqual(validation_problems, expected) + + # TEST CASE: Secure cluster, dfs.http.policy=HTTP_ONLY, insecure port + properties = { # hdfs-site +@@ -733,7 +733,7 @@ + 'type': 'configuration'} + ] + validation_problems = self.stackAdvisor.validateHDFSConfigurations(properties, recommendedDefaults, configurations, services, None) +- self.assertEquals(validation_problems, expected) ++ self.assertEqual(validation_problems, expected) + + # TEST CASE: Secure cluster, dfs.http.policy=HTTP_ONLY, valid configuration + properties = { # hdfs-site +@@ -758,7 +758,7 @@ + } + expected = [] + validation_problems = self.stackAdvisor.validateHDFSConfigurations(properties, recommendedDefaults, configurations, services, None) +- self.assertEquals(validation_problems, expected) ++ self.assertEqual(validation_problems, expected) + + # TEST CASE: Secure cluster, absent dfs.http.policy (typical situation) + properties = { # hdfs-site +@@ -782,7 +782,7 @@ + } + expected = [] + validation_problems = self.stackAdvisor.validateHDFSConfigurations(properties, recommendedDefaults, configurations, services, None) +- self.assertEquals(validation_problems, expected) ++ self.assertEqual(validation_problems, expected) + + # TEST CASE: Secure cluster, dfs.http.policy=HTTP_ONLY, misusage of dfs.data.transfer.protection warning + properties = { # hdfs-site +@@ -813,7 +813,7 @@ + "set to any value other then HTTPS_ONLY. Tip: When dfs.http.policy property is not defined, it defaults to HTTP_ONLY", + 'type': 'configuration'}] + validation_problems = self.stackAdvisor.validateHDFSConfigurations(properties, recommendedDefaults, configurations, services, None) +- self.assertEquals(validation_problems, expected) ++ self.assertEqual(validation_problems, expected) + + # TEST CASE: Secure cluster, dfs.http.policy=HTTPS_ONLY, wrong dfs.data.transfer.protection value + properties = { # hdfs-site +@@ -843,7 +843,7 @@ + 'message': "Invalid property value: WRONG_VALUE. Valid values are ['authentication', 'integrity', 'privacy'].", + 'type': 'configuration'}] + validation_problems = self.stackAdvisor.validateHDFSConfigurations(properties, recommendedDefaults, configurations, services, None) +- self.assertEquals(validation_problems, expected) ++ self.assertEqual(validation_problems, expected) + + # TEST CASE: Hadoop wire encryption enabled + +@@ -869,7 +869,7 @@ + } + expected = [] # No warnings + validation_problems = self.stackAdvisor.validateHDFSConfigurations(properties, recommendedDefaults, configurations, services, None) +- self.assertEquals(validation_problems, expected) ++ self.assertEqual(validation_problems, expected) + + def test_recommendYARNConfigurations(self): + configurations = {} +@@ -919,7 +919,7 @@ + } + + self.stackAdvisor.recommendYARNConfigurations(configurations, clusterData, services, None) +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + + def test_recommendSPARKConfigurations(self): + configurations = {} +@@ -946,7 +946,7 @@ + } + + self.stackAdvisor.recommendSparkConfigurations(configurations, clusterData, services, None) +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + + def test_recommendYARNConfigurationAttributes(self): + configurations = { +@@ -1139,7 +1139,7 @@ + } + + self.stackAdvisor.recommendYARNConfigurations(configurations, clusterData, services, hosts) +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + + # Test host NodeManager CPU cores + hosts["items"][2]["Hosts"]["cpu_count"] = 6 +@@ -1155,7 +1155,7 @@ + expected["yarn-site"]["property_attributes"]["yarn.scheduler.minimum-allocation-vcores"]["maximum"] = '4' + expected["yarn-site"]["property_attributes"]["yarn.scheduler.maximum-allocation-vcores"]["maximum"] = '4' + self.stackAdvisor.recommendYARNConfigurations(configurations, clusterData, services, hosts) +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + + # Test host NodeManager CPU cores and 'yarn.nodemanager.resource.percentage-physical-cpu-limit' + hosts["items"][2]["Hosts"]["cpu_count"] = 10 +@@ -1173,7 +1173,7 @@ + expected["yarn-site"]["property_attributes"]["yarn.scheduler.minimum-allocation-vcores"]["maximum"] = '5' + expected["yarn-site"]["property_attributes"]["yarn.scheduler.maximum-allocation-vcores"]["maximum"] = '5' + self.stackAdvisor.recommendYARNConfigurations(configurations, clusterData, services, hosts) +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + + services.pop("changed-configurations", None) + services["changed-configurations"] = [{ +@@ -1190,7 +1190,7 @@ + expected["yarn-site"]["property_attributes"]["yarn.scheduler.maximum-allocation-mb"]["maximum"] = '4321' + expected["yarn-site"]["property_attributes"]["yarn.scheduler.minimum-allocation-mb"]["maximum"] = '4321' + self.stackAdvisor.recommendYARNConfigurations(configurations, clusterData, services, hosts) +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + + services["changed-configurations"].append({ + "type": "yarn-site", +@@ -1204,7 +1204,7 @@ + expected["yarn-site"]["property_attributes"]["yarn.scheduler.maximum-allocation-vcores"]["maximum"] = '9' + expected["yarn-site"]["property_attributes"]["yarn.scheduler.minimum-allocation-vcores"]["maximum"] = '9' + self.stackAdvisor.recommendYARNConfigurations(configurations, clusterData, services, hosts) +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + + def test_multipleDependsOn(self): + configurations = { +@@ -1256,10 +1256,10 @@ + # changed-configurations contain only "yarn.scheduler.maximum-allocation-mb". + # Ensure that user provided value (350) for "yarn.scheduler.minimum-allocation-mb" is used. + # The recommended default for "yarn.scheduler.minimum-allocation-mb" is 256. +- self.assertEquals(configurations['mapred-site']['properties']['mapreduce.map.memory.mb'], '350') # should not be 256 ++ self.assertEqual(configurations['mapred-site']['properties']['mapreduce.map.memory.mb'], '350') # should not be 256 + + # assert that not requested property was not changed +- self.assertEquals(configurations['mapred-site']['properties']['mapreduce.reduce.memory.mb'], '111') ++ self.assertEqual(configurations['mapred-site']['properties']['mapreduce.reduce.memory.mb'], '111') + + def test_recommendHiveConfigurationAttributes(self): + self.maxDiff = None +@@ -1624,7 +1624,7 @@ + } + + self.stackAdvisor.recommendHIVEConfigurations(configurations, clusterData, services, hosts) +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + + #test recommendations + services["configurations"]["hive-site"]["properties"]["hive.cbo.enable"] = "false" +@@ -1642,7 +1642,7 @@ + expected["hiveserver2-site"]["properties"]["hive.conf.restricted.list"]="hive.security.authenticator.manager,hive.security.authorization.manager,hive.security.metastore.authorization.manager,hive.security.metastore.authenticator.manager,hive.users.in.admin.role,hive.server2.xsrf.filter.enabled,hive.security.authorization.enabled" + + self.stackAdvisor.recommendHIVEConfigurations(configurations, clusterData, services, hosts) +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + + + # test 'hive_security_authorization'=='sqlstdauth' => 'hive.server2.enable.doAs'=='false' +@@ -1653,7 +1653,7 @@ + expected["hive-site"]["properties"]["hive.security.metastore.authorization.manager"]=\ + "org.apache.hadoop.hive.ql.security.authorization.StorageBasedAuthorizationProvider" + self.stackAdvisor.recommendHIVEConfigurations(configurations, clusterData, services, hosts) +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + + # test 'hive.server2.tez.default.queues' leaf queues + services["configurations"]['capacity-scheduler']['properties'] = { +@@ -1711,21 +1711,21 @@ + 'entries': [{'value': 'a1', 'label': 'a1 queue'}, {'value': 'a2', 'label': 'a2 queue'}, {'value': 'b', 'label': 'b queue'}] + } + self.stackAdvisor.recommendHIVEConfigurations(configurations, clusterData, services, hosts) +- self.assertEquals(configurations['hive-site']['property_attributes']['hive.server2.tez.default.queues'], expected['hive-site']['property_attributes']['hive.server2.tez.default.queues']) +- self.assertEquals(configurations['hive-site']['properties']['hive.server2.tez.default.queues'], expected['hive-site']['properties']['hive.server2.tez.default.queues']) ++ self.assertEqual(configurations['hive-site']['property_attributes']['hive.server2.tez.default.queues'], expected['hive-site']['property_attributes']['hive.server2.tez.default.queues']) ++ self.assertEqual(configurations['hive-site']['properties']['hive.server2.tez.default.queues'], expected['hive-site']['properties']['hive.server2.tez.default.queues']) + + # Hive heapsize properties + self.stackAdvisor.recommendHIVEConfigurations(configurations, clusterData, hiveService, hosts) + + # Recommended default values +- self.assertEquals(configurations["hive-env"]["properties"]["hive.metastore.heapsize"], "512") +- self.assertEquals(configurations["hive-env"]["properties"]["hive.heapsize"], "703") +- self.assertEquals(configurations["hive-env"]["properties"]["hive.client.heapsize"], "1024") ++ self.assertEqual(configurations["hive-env"]["properties"]["hive.metastore.heapsize"], "512") ++ self.assertEqual(configurations["hive-env"]["properties"]["hive.heapsize"], "703") ++ self.assertEqual(configurations["hive-env"]["properties"]["hive.client.heapsize"], "1024") + + # Recommended attributes for maximum values, minimum values defined in stack definition +- self.assertEquals(configurations["hive-env"]["property_attributes"]["hive.heapsize"]["maximum"], "1877") +- self.assertEquals(configurations["hive-env"]["property_attributes"]["hive.metastore.heapsize"]["maximum"], "1877") +- self.assertEquals(configurations["hive-env"]["property_attributes"]["hive.client.heapsize"]["maximum"], "1877") ++ self.assertEqual(configurations["hive-env"]["property_attributes"]["hive.heapsize"]["maximum"], "1877") ++ self.assertEqual(configurations["hive-env"]["property_attributes"]["hive.metastore.heapsize"]["maximum"], "1877") ++ self.assertEqual(configurations["hive-env"]["property_attributes"]["hive.client.heapsize"]["maximum"], "1877") + + # test 'hive_security_authorization'=='ranger' + services["configurations"]["hive-env"]["properties"]["hive_security_authorization"] = "ranger" +@@ -1734,7 +1734,7 @@ + expected["hiveserver2-site"]["properties"]["hive.security.authorization.enabled"] = "true" + expected["hiveserver2-site"]["properties"]["hive.conf.restricted.list"]="hive.security.authenticator.manager,hive.security.authorization.manager,hive.security.metastore.authorization.manager,hive.security.metastore.authenticator.manager,hive.users.in.admin.role,hive.server2.xsrf.filter.enabled,hive.security.authorization.enabled" + self.stackAdvisor.recommendHIVEConfigurations(configurations, clusterData, services, hosts) +- self.assertEquals(configurations['hiveserver2-site'], expected["hiveserver2-site"]) ++ self.assertEqual(configurations['hiveserver2-site'], expected["hiveserver2-site"]) + + + def test_recommendMapredConfigurationAttributesWithPigService(self): +@@ -2010,7 +2010,7 @@ + } + + self.stackAdvisor.recommendMapReduce2Configurations(configurations, clusterData, services, hosts) +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + + def test_recommendMapredConfigurationAttributes(self): + configurations = { +@@ -2251,7 +2251,7 @@ + } + + self.stackAdvisor.recommendMapReduce2Configurations(configurations, clusterData, services, hosts) +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + + configurations["yarn-site"]["properties"]["yarn.scheduler.minimum-allocation-mb"] = "700" + +@@ -2305,7 +2305,7 @@ + } + } + self.stackAdvisor.recommendMapReduce2Configurations(configurations, clusterData, services, hosts) +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + + + def test_recommendHbaseConfigurations(self): +@@ -2361,10 +2361,10 @@ + } + + clusterData = self.stackAdvisor.getConfigurationClusterSummary(servicesList, hosts, components, None) +- self.assertEquals(clusterData['hbaseRam'], 8) ++ self.assertEqual(clusterData['hbaseRam'], 8) + + self.stackAdvisor.recommendHbaseConfigurations(configurations, clusterData, services, None) +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + + def test_recommendKnoxConfigurations(self): + servicesList = ["KNOX"] +@@ -2485,16 +2485,16 @@ + {'content': ' authorizationXASecurePDPKnoxtrue '}}} + + self.stackAdvisor.recommendKnoxConfigurations(configurations, None, services_without_auth_provider_ranger_plugin_enabled, None) +- self.assertEquals(configurations, expected1) ++ self.assertEqual(configurations, expected1) + + self.stackAdvisor.recommendKnoxConfigurations(configurations, None, services_without_auth_provider_ranger_plugin_disabled, None) +- self.assertEquals(configurations, expected2) ++ self.assertEqual(configurations, expected2) + + self.stackAdvisor.recommendKnoxConfigurations(configurations, None, services_with_auth_provider_ranger_plugin_disabled, None) +- self.assertEquals(configurations, expected3) ++ self.assertEqual(configurations, expected3) + + self.stackAdvisor.recommendKnoxConfigurations(configurations, None, services_with_auth_provider_ranger_plugin_enabled, None) +- self.assertEquals(configurations, expected4) ++ self.assertEqual(configurations, expected4) + + + def test_recommendHbaseSiteConfigurations(self): +@@ -2603,11 +2603,11 @@ + } + + clusterData = self.stackAdvisor.getConfigurationClusterSummary(servicesList, hosts, components, None) +- self.assertEquals(clusterData['hbaseRam'], 8) ++ self.assertEqual(clusterData['hbaseRam'], 8) + + # Test when phoenix_sql_enabled = true + self.stackAdvisor.recommendHBASEConfigurations(configurations, clusterData, services, None) +- self.assertEquals(configurations, expected, "Test when Phoenix sql is enabled") ++ self.assertEqual(configurations, expected, "Test when Phoenix sql is enabled") + + # Test when phoenix_sql_enabled = false + services['configurations']['hbase-env']['properties']['phoenix_sql_enabled'] = 'false' +@@ -2616,7 +2616,7 @@ + expected['hbase-site']['property_attributes']['hbase.coprocessor.regionserver.classes'] = {'delete': 'true'} + expected['hbase-site']['property_attributes']['phoenix.functions.allowUserDefinedFunctions'] = {'delete': 'true'} + self.stackAdvisor.recommendHBASEConfigurations(configurations, clusterData, services, None) +- self.assertEquals(configurations, expected, "Test when Phoenix sql is disabled") ++ self.assertEqual(configurations, expected, "Test when Phoenix sql is disabled") + + # Test hbase_master_heapsize maximum + hosts['items'][0]['Hosts']['host_name'] = 'host1' +@@ -2651,19 +2651,19 @@ + expected['hbase-site']['property_attributes']['phoenix.functions.allowUserDefinedFunctions'] = {'delete': 'true'} + expected['hbase-env']['property_attributes']['hbase_master_heapsize'] = {'maximum': '49152'} + self.stackAdvisor.recommendHBASEConfigurations(configurations, clusterData, services, hosts) +- self.assertEquals(configurations, expected, "Test with Phoenix disabled") ++ self.assertEqual(configurations, expected, "Test with Phoenix disabled") + + # Test when hbase.security.authentication = kerberos + services['configurations']['hbase-site']['properties']['hbase.security.authentication'] = 'kerberos' + expected['hbase-site']['properties']['hbase.coprocessor.region.classes'] = 'org.apache.hadoop.hbase.security.token.TokenProvider,org.apache.hadoop.hbase.security.access.SecureBulkLoadEndpoint' + self.stackAdvisor.recommendHBASEConfigurations(configurations, clusterData, services, None) +- self.assertEquals(configurations, expected, "Test with Kerberos enabled") ++ self.assertEqual(configurations, expected, "Test with Kerberos enabled") + + # Test when hbase.security.authentication = simple + services['configurations']['hbase-site']['properties']['hbase.security.authentication'] = 'simple' + expected['hbase-site']['properties']['hbase.coprocessor.region.classes'] = 'org.apache.hadoop.hbase.security.access.SecureBulkLoadEndpoint' + self.stackAdvisor.recommendHBASEConfigurations(configurations, clusterData, services, None) +- self.assertEquals(configurations, expected, "Test with Kerberos disabled") ++ self.assertEqual(configurations, expected, "Test with Kerberos disabled") + + # Test when Ranger plugin HBase is enabled in non-kerberos environment + configurations['hbase-site']['properties'].pop('hbase.coprocessor.region.classes', None) +@@ -2680,7 +2680,7 @@ + expected['hbase-site']['properties']['hbase.coprocessor.master.classes'] = 'com.xasecure.authorization.hbase.XaSecureAuthorizationCoprocessor' + expected['hbase-site']['properties']['hbase.coprocessor.regionserver.classes'] = 'com.xasecure.authorization.hbase.XaSecureAuthorizationCoprocessor' + self.stackAdvisor.recommendHBASEConfigurations(configurations, clusterData, services, None) +- self.assertEquals(configurations, expected, "Test when Ranger plugin HBase is enabled in non-kerberos environment") ++ self.assertEqual(configurations, expected, "Test when Ranger plugin HBase is enabled in non-kerberos environment") + + # Test when hbase.security.authentication = kerberos AND class already there + configurations['hbase-site']['properties'].pop('hbase.coprocessor.region.classes', None) +@@ -2697,7 +2697,7 @@ + expected['hbase-site']['properties']['hbase.coprocessor.regionserver.classes'] = '' + del expected['hbase-site']['properties']['hbase.security.authorization'] + self.stackAdvisor.recommendHBASEConfigurations(configurations, clusterData, services, None) +- self.assertEquals(configurations, expected, "Test with Kerberos enabled and hbase.coprocessor.region.classes predefined") ++ self.assertEqual(configurations, expected, "Test with Kerberos enabled and hbase.coprocessor.region.classes predefined") + + # Test when hbase.security.authentication = kerberos AND authorization = true + configurations['hbase-site']['properties'].pop('hbase.coprocessor.region.classes', None) +@@ -2708,7 +2708,7 @@ + expected['hbase-site']['properties']['hbase.coprocessor.region.classes'] = 'org.apache.hadoop.hbase.security.access.AccessController,org.apache.hadoop.hbase.security.token.TokenProvider,org.apache.hadoop.hbase.security.access.SecureBulkLoadEndpoint' + expected['hbase-site']['properties']['hbase.coprocessor.regionserver.classes'] = "org.apache.hadoop.hbase.security.access.AccessController" + self.stackAdvisor.recommendHBASEConfigurations(configurations, clusterData, services, None) +- self.assertEquals(configurations, expected, "Test with Kerberos enabled and authorization is true") ++ self.assertEqual(configurations, expected, "Test with Kerberos enabled and authorization is true") + + # Test when Ranger plugin HBase is enabled in kerberos environment + configurations['hbase-site']['properties'].pop('hbase.coprocessor.region.classes', None) +@@ -2722,15 +2722,15 @@ + expected['hbase-site']['properties']['hbase.coprocessor.regionserver.classes'] = "com.xasecure.authorization.hbase.XaSecureAuthorizationCoprocessor" + expected['hbase-site']['properties']['hbase.coprocessor.region.classes'] = 'org.apache.hadoop.hbase.security.token.TokenProvider,org.apache.hadoop.hbase.security.access.SecureBulkLoadEndpoint,com.xasecure.authorization.hbase.XaSecureAuthorizationCoprocessor' + self.stackAdvisor.recommendHBASEConfigurations(configurations, clusterData, services, None) +- self.assertEquals(configurations, expected, "Test with Kerberos enabled and HBase ranger plugin enabled") ++ self.assertEqual(configurations, expected, "Test with Kerberos enabled and HBase ranger plugin enabled") + + # Test - default recommendations should have certain configs deleted. HAS TO BE LAST TEST. + services["configurations"] = {"hbase-site": {"properties": {"phoenix.functions.allowUserDefinedFunctions": '', "hbase.rpc.controllerfactory.class": ''}}} + configurations = {} + self.stackAdvisor.recommendHBASEConfigurations(configurations, clusterData, services, None) +- self.assertEquals(configurations['hbase-site']['property_attributes']['phoenix.functions.allowUserDefinedFunctions'], {'delete': 'true'}) +- self.assertEquals(configurations['hbase-site']['property_attributes']['hbase.rpc.controllerfactory.class'], {'delete': 'true'}) +- self.assertEquals(configurations['hbase-site']['properties']['hbase.regionserver.wal.codec'], "org.apache.hadoop.hbase.regionserver.wal.WALCellCodec") ++ self.assertEqual(configurations['hbase-site']['property_attributes']['phoenix.functions.allowUserDefinedFunctions'], {'delete': 'true'}) ++ self.assertEqual(configurations['hbase-site']['property_attributes']['hbase.rpc.controllerfactory.class'], {'delete': 'true'}) ++ self.assertEqual(configurations['hbase-site']['properties']['hbase.regionserver.wal.codec'], "org.apache.hadoop.hbase.regionserver.wal.WALCellCodec") + + + def test_recommendStormConfigurations(self): +@@ -2786,14 +2786,14 @@ + + # Test nimbus.authorizer with Ranger Storm plugin disabled in non-kerberos environment + self.stackAdvisor.recommendStormConfigurations(configurations, clusterData, services, None) +- self.assertEquals(configurations['storm-site']['property_attributes']['nimbus.authorizer'], {'delete': 'true'}, "Test nimbus.authorizer with Ranger Storm plugin disabled in non-kerberos environment") ++ self.assertEqual(configurations['storm-site']['property_attributes']['nimbus.authorizer'], {'delete': 'true'}, "Test nimbus.authorizer with Ranger Storm plugin disabled in non-kerberos environment") + + # Test nimbus.authorizer with Ranger Storm plugin enabled in non-kerberos environment + configurations['storm-site']['properties'] = {} + configurations['storm-site']['property_attributes'] = {} + services['configurations']['ranger-storm-plugin-properties']['properties']['ranger-storm-plugin-enabled'] = 'Yes' + self.stackAdvisor.recommendStormConfigurations(configurations, clusterData, services, None) +- self.assertEquals(configurations['storm-site']['property_attributes']['nimbus.authorizer'], {'delete': 'true'}, "Test nimbus.authorizer with Ranger Storm plugin enabled in non-kerberos environment") ++ self.assertEqual(configurations['storm-site']['property_attributes']['nimbus.authorizer'], {'delete': 'true'}, "Test nimbus.authorizer with Ranger Storm plugin enabled in non-kerberos environment") + + # Test nimbus.authorizer with Ranger Storm plugin being enabled in kerberos environment + configurations['storm-site']['properties'] = {} +@@ -2803,7 +2803,7 @@ + services['configurations']['storm-site']['properties']['storm.zookeeper.superACL'] = 'sasl:{{storm_bare_jaas_principal}}' + services['configurations']['cluster-env']['properties']['security_enabled'] = 'true' + self.stackAdvisor.recommendStormConfigurations(configurations, clusterData, services, None) +- self.assertEquals(configurations['storm-site']['properties']['nimbus.authorizer'], 'com.xasecure.authorization.storm.authorizer.XaSecureStormAuthorizer', "Test nimbus.authorizer with Ranger Storm plugin enabled in kerberos environment") ++ self.assertEqual(configurations['storm-site']['properties']['nimbus.authorizer'], 'com.xasecure.authorization.storm.authorizer.XaSecureStormAuthorizer', "Test nimbus.authorizer with Ranger Storm plugin enabled in kerberos environment") + + # Test nimbus.authorizer with Ranger Storm plugin being disabled in kerberos environment + configurations['storm-site']['properties'] = {} +@@ -2813,7 +2813,7 @@ + services['configurations']['storm-site']['properties']['nimbus.authorizer'] = 'com.xasecure.authorization.storm.authorizer.XaSecureStormAuthorizer' + services['configurations']['cluster-env']['properties']['security_enabled'] = 'true' + self.stackAdvisor.recommendStormConfigurations(configurations, clusterData, services, None) +- self.assertEquals(configurations['storm-site']['properties']['nimbus.authorizer'], 'backtype.storm.security.auth.authorizer.SimpleACLAuthorizer', "Test nimbus.authorizer with Ranger Storm plugin being disabled in kerberos environment") ++ self.assertEqual(configurations['storm-site']['properties']['nimbus.authorizer'], 'backtype.storm.security.auth.authorizer.SimpleACLAuthorizer', "Test nimbus.authorizer with Ranger Storm plugin being disabled in kerberos environment") + + + def test_recommendHDFSConfigurations(self): +@@ -3015,11 +3015,11 @@ + } + + self.stackAdvisor.recommendHDFSConfigurations(configurations, clusterData, services, hosts) +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + # Test 1 - namenode heapsize depends on # of datanodes + datanode_hostnames = services["services"][0]["components"][0]["StackServiceComponents"]["hostnames"] # datanode hostnames +- for i in xrange(10): +- hostname = "datanode" + `i` ++ for i in range(10): ++ hostname = "datanode" + repr(i) + datanode_hostnames.append(hostname) + hosts['items'].append( + { +@@ -3041,12 +3041,12 @@ + } + ) + self.stackAdvisor.recommendHDFSConfigurations(configurations, clusterData, services, hosts) +- self.assertEquals(configurations["hadoop-env"]["properties"]["namenode_heapsize"], "3072") +- self.assertEquals(configurations["hadoop-env"]["properties"]["namenode_opt_maxnewsize"], "384") +- self.assertEquals(configurations["hadoop-env"]["properties"]["namenode_opt_maxnewsize"], "384") ++ self.assertEqual(configurations["hadoop-env"]["properties"]["namenode_heapsize"], "3072") ++ self.assertEqual(configurations["hadoop-env"]["properties"]["namenode_opt_maxnewsize"], "384") ++ self.assertEqual(configurations["hadoop-env"]["properties"]["namenode_opt_maxnewsize"], "384") + # Test 2 - add more datanodes +- for i in xrange(11,30): +- hostname = "datanode" + `i` ++ for i in range(11,30): ++ hostname = "datanode" + repr(i) + datanode_hostnames.append(hostname) + hosts['items'].append( + { +@@ -3070,12 +3070,12 @@ + # namenode_heapsize depends on number of disks used used by datanode + configurations["hdfs-site"]["properties"]["dfs.datanode.data.dir"] = "/path1,/path2,/path3,/path4" + self.stackAdvisor.recommendHDFSConfigurations(configurations, clusterData, services, hosts) +- self.assertEquals(configurations["hadoop-env"]["properties"]["namenode_heapsize"], "9984") +- self.assertEquals(configurations["hadoop-env"]["properties"]["namenode_opt_maxnewsize"], "1248") +- self.assertEquals(configurations["hadoop-env"]["properties"]["namenode_opt_maxnewsize"], "1248") ++ self.assertEqual(configurations["hadoop-env"]["properties"]["namenode_heapsize"], "9984") ++ self.assertEqual(configurations["hadoop-env"]["properties"]["namenode_opt_maxnewsize"], "1248") ++ self.assertEqual(configurations["hadoop-env"]["properties"]["namenode_opt_maxnewsize"], "1248") + # Test 3 - more datanodes than host can handle +- for i in xrange(31, 90): +- hostname = "datanode" + `i` ++ for i in range(31, 90): ++ hostname = "datanode" + repr(i) + datanode_hostnames.append(hostname) + hosts['items'].append( + { +@@ -3097,9 +3097,9 @@ + } + ) + self.stackAdvisor.recommendHDFSConfigurations(configurations, clusterData, services, hosts) +- self.assertEquals(configurations["hadoop-env"]["properties"]["namenode_heapsize"], "10112") +- self.assertEquals(configurations["hadoop-env"]["properties"]["namenode_opt_maxnewsize"], "1264") +- self.assertEquals(configurations["hadoop-env"]["properties"]["namenode_opt_maxnewsize"], "1264") ++ self.assertEqual(configurations["hadoop-env"]["properties"]["namenode_heapsize"], "10112") ++ self.assertEqual(configurations["hadoop-env"]["properties"]["namenode_opt_maxnewsize"], "1264") ++ self.assertEqual(configurations["hadoop-env"]["properties"]["namenode_opt_maxnewsize"], "1264") + + # Test 4 - KMS empty test from previous call + self.assertTrue("dfs.encryption.key.provider.uri" not in configurations["hdfs-site"]["properties"]) +@@ -3211,7 +3211,7 @@ + 'type': 'configuration'}] + + res = self.stackAdvisor.validateTezConfigurations(properties, recommendedDefaults, configurations, '', '') +- self.assertEquals(res_expected, res) ++ self.assertEqual(res_expected, res) + + + def test_validateHDFSConfigurationsEnv(self): +@@ -3227,7 +3227,7 @@ + res_expected = [] + + res = self.stackAdvisor.validateHDFSConfigurationsEnv(properties, recommendedDefaults, configurations, '', '') +- self.assertEquals(res, res_expected) ++ self.assertEqual(res, res_expected) + + # 2) fail: namenode_heapsize, namenode_opt_maxnewsize < recommended + properties['namenode_heapsize'] = '1022' +@@ -3244,7 +3244,7 @@ + 'type': 'configuration'}] + + res = self.stackAdvisor.validateHDFSConfigurationsEnv(properties, recommendedDefaults, configurations, '', '') +- self.assertEquals(res, res_expected) ++ self.assertEqual(res, res_expected) + + def test_validateYARNConfigurationsEnv(self): + configurations = {} +@@ -3260,7 +3260,7 @@ + res_expected = [] + + res = self.stackAdvisor.validateYARNEnvConfigurations(properties, recommendedDefaults, configurations, services, '') +- self.assertEquals(res, res_expected) ++ self.assertEqual(res, res_expected) + + # 2) ok: yarn_cgroups_enabled=false, but security enabled + properties['yarn_cgroups_enabled'] = 'false' +@@ -3274,13 +3274,13 @@ + } + res_expected = [] + res = self.stackAdvisor.validateYARNEnvConfigurations(properties, recommendedDefaults, configurations, services, '') +- self.assertEquals(res, res_expected) ++ self.assertEqual(res, res_expected) + + # 3) ok: yarn_cgroups_enabled=true, but security enabled + properties['yarn_cgroups_enabled'] = 'true' + res_expected = [] + res = self.stackAdvisor.validateYARNEnvConfigurations(properties, recommendedDefaults, configurations, services, '') +- self.assertEquals(res, res_expected) ++ self.assertEqual(res, res_expected) + + # 4) fail: yarn_cgroups_enabled=true, but security disabled + configurations['core-site']['properties']['hadoop.security.authorization'] = 'false' +@@ -3290,7 +3290,7 @@ + 'config-name': 'yarn_cgroups_enabled', + 'level': 'WARN'}] + res = self.stackAdvisor.validateYARNEnvConfigurations(properties, recommendedDefaults, configurations, services, '') +- self.assertEquals(res, res_expected) ++ self.assertEqual(res, res_expected) + + def test_validateMR2XmxOptsEnv(self): + +@@ -3330,7 +3330,7 @@ + 'level': 'WARN'}] + + res = self.stackAdvisor.validateMapReduce2Configurations(properties, recommendedDefaults, {}, '', '') +- self.assertEquals(res_expected, res) ++ self.assertEqual(res_expected, res) + + def test_validateHiveConfigurationsEnv(self): + properties = {"hive_security_authorization": "None"} +@@ -3364,7 +3364,7 @@ + } + + res = self.stackAdvisor.validateHiveConfigurationsEnv(properties, {}, configurations, services, {}) +- self.assertEquals(res, res_expected) ++ self.assertEqual(res, res_expected) + + # 2) fail: hive_security_authorization=Ranger but ranger plugin is disabled in ranger-env + properties = {"hive_security_authorization": "Ranger"} +@@ -3401,7 +3401,7 @@ + 'level': 'WARN'}] + + res = self.stackAdvisor.validateHiveConfigurationsEnv(properties, {}, configurations, services, {}) +- self.assertEquals(res, res_expected) ++ self.assertEqual(res, res_expected) + + + def test_validateHiveConfigurations(self): +@@ -3432,7 +3432,7 @@ + 'then hive.server2.authentication.ldap.baseDN!', 'type': 'configuration', 'config-name': + 'hive.server2.authentication', 'level': 'WARN'}] + res = self.stackAdvisor.validateHiveConfigurations(properties, recommendedDefaults, configurations, services, {}) +- self.assertEquals(res, res_expected) ++ self.assertEqual(res, res_expected) + + pass + +@@ -3466,7 +3466,7 @@ + # Test with ranger plugin enabled, validation fails + res_expected = [{'config-type': 'hiveserver2-site', 'message': 'If Ranger Hive Plugin is enabled. hive.security.authorization.manager under hiveserver2-site needs to be set to com.xasecure.authorization.hive.authorizer.XaSecureHiveAuthorizerFactory', 'type': 'configuration', 'config-name': 'hive.security.authorization.manager', 'level': 'WARN'}, {'config-type': 'hiveserver2-site', 'message': 'If Ranger Hive Plugin is enabled. hive.security.authenticator.manager under hiveserver2-site needs to be set to org.apache.hadoop.hive.ql.security.SessionStateUserAuthenticator', 'type': 'configuration', 'config-name': 'hive.security.authenticator.manager', 'level': 'WARN'}, {'config-type': 'hiveserver2-site', 'message': 'If Ranger Hive Plugin is enabled. hive.conf.restricted.list under hiveserver2-site needs to contain missing value hive.security.authorization.enabled,hive.security.authorization.manager,hive.security.authenticator.manager', 'type': 'configuration', 'config-name': 'hive.conf.restricted.list', 'level': 'WARN'}] + res = self.stackAdvisor.validateHiveServer2Configurations(properties, recommendedDefaults, configurations, services, {}) +- self.assertEquals(res, res_expected) ++ self.assertEqual(res, res_expected) + + def test_recommendYarnCGroupConfigurations(self): + servicesList = ["YARN"] +@@ -3571,11 +3571,11 @@ + } + + clusterData = self.stackAdvisor.getConfigurationClusterSummary(servicesList, hosts, components, None) +- self.assertEquals(clusterData['hbaseRam'], 8) ++ self.assertEqual(clusterData['hbaseRam'], 8) + + # Test when yarn_cgroups_enabled = true + self.stackAdvisor.recommendYARNConfigurations(configurations, clusterData, services, hosts) +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + + # Test when yarn_cgroups_enabled = false + services['configurations']['yarn-env']['properties']['yarn_cgroups_enabled'] = 'false' +@@ -3641,7 +3641,7 @@ + } + } + self.stackAdvisor.recommendYARNConfigurations(configurations, clusterData, services, hosts) +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + + def test_validateHDFSRangerPluginConfigurations(self): + configurations = {} +@@ -3674,7 +3674,7 @@ + res_expected = [] + + res = self.stackAdvisor.validateHDFSRangerPluginConfigurations(properties, recommendedDefaults, configurations, services, {}) +- self.assertEquals(res, res_expected) ++ self.assertEqual(res, res_expected) + + # 2) fail: ranger plugin is disabled in ranger-env + services['configurations']['ranger-env']['properties']['ranger-hdfs-plugin-enabled'] = 'No' +@@ -3685,7 +3685,7 @@ + 'level': 'WARN'}] + + res = self.stackAdvisor.validateHDFSRangerPluginConfigurations(properties, recommendedDefaults, configurations, services, {}) +- self.assertEquals(res, res_expected) ++ self.assertEqual(res, res_expected) + + def test_validateYARNRangerPluginConfigurations(self): + configurations = {} +@@ -3718,7 +3718,7 @@ + res_expected = [] + + res = self.stackAdvisor.validateYARNRangerPluginConfigurations(properties, recommendedDefaults, configurations, services, {}) +- self.assertEquals(res, res_expected) ++ self.assertEqual(res, res_expected) + + # 2) fail: ranger plugin is disabled in ranger-env + services['configurations']['ranger-env']['properties']['ranger-yarn-plugin-enabled'] = 'No' +@@ -3729,7 +3729,7 @@ + 'level': 'WARN'}] + + res = self.stackAdvisor.validateYARNRangerPluginConfigurations(properties, recommendedDefaults, configurations, services, {}) +- self.assertEquals(res, res_expected) ++ self.assertEqual(res, res_expected) + + def test_validateHBASERangerPluginConfigurations(self): + configurations = {} +@@ -3762,7 +3762,7 @@ + res_expected = [] + + res = self.stackAdvisor.validateHBASERangerPluginConfigurations(properties, recommendedDefaults, configurations, services, {}) +- self.assertEquals(res, res_expected) ++ self.assertEqual(res, res_expected) + + # 2) fail: ranger plugin is disabled in ranger-env + services['configurations']['ranger-env']['properties']['ranger-hbase-plugin-enabled'] = 'No' +@@ -3773,7 +3773,7 @@ + 'level': 'WARN'}] + + res = self.stackAdvisor.validateHBASERangerPluginConfigurations(properties, recommendedDefaults, configurations, services, {}) +- self.assertEquals(res, res_expected) ++ self.assertEqual(res, res_expected) + + def test_validateKnoxRangerPluginConfigurations(self): + configurations = {} +@@ -3806,7 +3806,7 @@ + res_expected = [] + + res = self.stackAdvisor.validateKnoxRangerPluginConfigurations(properties, recommendedDefaults, configurations, services, {}) +- self.assertEquals(res, res_expected) ++ self.assertEqual(res, res_expected) + + # 2) fail: ranger plugin is disabled in ranger-env + services['configurations']['ranger-env']['properties']['ranger-knox-plugin-enabled'] = 'No' +@@ -3817,7 +3817,7 @@ + 'level': 'WARN'}] + + res = self.stackAdvisor.validateKnoxRangerPluginConfigurations(properties, recommendedDefaults, configurations, services, {}) +- self.assertEquals(res, res_expected) ++ self.assertEqual(res, res_expected) + + def test_validateKafkaRangerPluginConfigurations(self): + configurations = {} +@@ -3854,7 +3854,7 @@ + } + res_expected = [] + res = self.stackAdvisor.validateKafkaRangerPluginConfigurations(properties, recommendedDefaults, configurations, services, {}) +- self.assertEquals(res, res_expected) ++ self.assertEqual(res, res_expected) + + # 2) fail: ranger plugin is disabled in ranger-env + services['configurations']['ranger-env']['properties']['ranger-kafka-plugin-enabled'] = 'No' +@@ -3868,10 +3868,10 @@ + services['configurations']['cluster-env']['properties']['security_enabled'] = "false" + res_expected.append({'config-type': 'ranger-kafka-plugin-properties', 'message': 'Ranger Kafka plugin should not be enabled in non-kerberos environment.', 'type': 'configuration', 'config-name': 'ranger-kafka-plugin-enabled', 'level': 'WARN'}) + res = self.stackAdvisor.validateKafkaRangerPluginConfigurations(properties, recommendedDefaults, configurations, services, {}) +- self.assertEquals(res, res_expected) ++ self.assertEqual(res, res_expected) + + res = self.stackAdvisor.validateKafkaRangerPluginConfigurations(properties, recommendedDefaults, configurations, services, {}) +- self.assertEquals(res, res_expected) ++ self.assertEqual(res, res_expected) + + def test_validateStormRangerPluginConfigurations(self): + configurations = {} +@@ -3908,7 +3908,7 @@ + } + res_expected = [] + res = self.stackAdvisor.validateStormRangerPluginConfigurations(properties, recommendedDefaults, configurations, services, {}) +- self.assertEquals(res, res_expected) ++ self.assertEqual(res, res_expected) + + # 2) fail: ranger plugin is disabled in ranger-env + services['configurations']['ranger-env']['properties']['ranger-storm-plugin-enabled'] = 'No' +@@ -3919,13 +3919,13 @@ + 'level': 'WARN'}] + + res = self.stackAdvisor.validateStormRangerPluginConfigurations(properties, recommendedDefaults, configurations, services, {}) +- self.assertEquals(res, res_expected) ++ self.assertEqual(res, res_expected) + + # Test to check security_enabled is false + services['configurations']['cluster-env']['properties']['security_enabled'] = "false" + res_expected.append({'config-type': 'ranger-storm-plugin-properties', 'message': 'Ranger Storm plugin should not be enabled in non-kerberos environment.', 'type': 'configuration', 'config-name': 'ranger-storm-plugin-enabled', 'level': 'WARN'}) + res = self.stackAdvisor.validateStormRangerPluginConfigurations(properties, recommendedDefaults, configurations, services, {}) +- self.assertEquals(res, res_expected) ++ self.assertEqual(res, res_expected) + + def test_recommendRangerConfigurations(self): + clusterData = {} +@@ -3965,7 +3965,7 @@ + + recommendedConfigurations = {} + self.stackAdvisor.recommendRangerConfigurations(recommendedConfigurations, clusterData, services, None) +- self.assertEquals(recommendedConfigurations, expected) ++ self.assertEqual(recommendedConfigurations, expected) + + def test_validateRangerConfigurationsEnv(self): + properties = { +@@ -3996,7 +3996,7 @@ + res_expected = [{'config-type': 'ranger-env', 'message': 'Ranger Storm plugin should not be enabled in non-kerberos environment.', 'type': 'configuration', 'config-name': 'ranger-storm-plugin-enabled', 'level': 'WARN'}] + + res = self.stackAdvisor.validateRangerConfigurationsEnv(properties, recommendedDefaults, configurations, services, {}) +- self.assertEquals(res, res_expected) ++ self.assertEqual(res, res_expected) + + def test_validateSparkDefaults(self): + properties = {} +@@ -4019,4 +4019,4 @@ + res_expected = [] + + res = self.stackAdvisor.validateSparkDefaults(properties, recommendedDefaults, configurations, services, {}) +- self.assertEquals(res_expected, res) ++ self.assertEqual(res_expected, res) +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.2/KAFKA/test_kafka_broker.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.2/KAFKA/test_kafka_broker.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.2/KAFKA/test_kafka_broker.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.2/KAFKA/test_kafka_broker.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 + from stacks.utils.RMFTestCase import * +-from mock.mock import patch ++from unittest.mock import patch + + from only_for_platform import not_for_platform, PLATFORM_WINDOWS + +@@ -42,7 +42,7 @@ + owner = 'kafka', + group = 'hadoop', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + cd_access = 'a', + recursive_ownership = True, + ) +@@ -51,7 +51,7 @@ + owner = 'kafka', + group = 'hadoop', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + cd_access = 'a', + recursive_ownership = True, + ) +@@ -60,7 +60,7 @@ + owner = 'kafka', + group = 'hadoop', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + cd_access = 'a', + recursive_ownership = True, + ) +@@ -68,7 +68,7 @@ + owner = 'kafka', + create_parents = True, + group = 'hadoop', +- mode = 0755, ++ mode = 0o755, + cd_access = 'a', + recursive_ownership = True, + ) +@@ -90,7 +90,7 @@ + owner = 'kafka', + group = 'hadoop', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + cd_access = 'a', + recursive_ownership = True, + ) +@@ -99,7 +99,7 @@ + owner = 'kafka', + group = 'hadoop', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + cd_access = 'a', + recursive_ownership = True, + ) +@@ -108,7 +108,7 @@ + owner = 'kafka', + group = 'hadoop', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + cd_access = 'a', + recursive_ownership = True, + ) +@@ -117,7 +117,7 @@ + owner = 'kafka', + create_parents = True, + group = 'hadoop', +- mode = 0755, ++ mode = 0o755, + cd_access = 'a', + recursive_ownership = True, + ) +@@ -127,7 +127,7 @@ + + def test_pre_upgrade_restart(self): + config_file = self.get_src_folder()+"/test/python/stacks/2.2/configs/default.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + version = '2.2.1.0-3242' + json_content['commandParams']['version'] = version +@@ -145,7 +145,7 @@ + @patch("resource_management.core.shell.call") + def test_pre_upgrade_restart_23(self, call_mock): + config_file = self.get_src_folder()+"/test/python/stacks/2.2/configs/default.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + version = '2.3.0.0-1234' + json_content['commandParams']['version'] = version +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.2/KERBEROS/test_kerberos_client.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.2/KERBEROS/test_kerberos_client.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.2/KERBEROS/test_kerberos_client.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.2/KERBEROS/test_kerberos_client.py 2022-07-11 00:52:31.000000000 +0800 +@@ -18,7 +18,7 @@ + """ + + import json +-from mock.mock import patch ++from unittest.mock import patch + import os + import sys + import use_cases +@@ -47,7 +47,7 @@ + self.assertResourceCalled('Directory', use_cases.get_krb5_conf_dir(json_data), + owner='root', + group='root', +- mode=0755, ++ mode=0o755, + create_parents = True) + + file_path = (use_cases.get_krb5_conf_dir(json_data) + +@@ -57,7 +57,7 @@ + content=InlineTemplate(use_cases.get_krb5_conf_template(json_data)), + owner='root', + group='root', +- mode=0644) ++ mode=0o644) + + def test_configure_unmanaged_kdc(self): + json_data = use_cases.get_unmanged_kdc_use_case() +@@ -73,7 +73,7 @@ + self.assertResourceCalled('Directory', use_cases.get_krb5_conf_dir(json_data), + owner='root', + group='root', +- mode=0755, ++ mode=0o755, + create_parents = True) + + file_path = (use_cases.get_krb5_conf_dir(json_data) + +@@ -83,7 +83,7 @@ + content=InlineTemplate(use_cases.get_krb5_conf_template(json_data)), + owner='root', + group='root', +- mode=0644) ++ mode=0o644) + + def test_configure_unmanaged_ad(self): + json_data = use_cases.get_unmanged_ad_use_case() +@@ -99,7 +99,7 @@ + self.assertResourceCalled('Directory', use_cases.get_krb5_conf_dir(json_data), + owner='root', + group='root', +- mode=0755, ++ mode=0o755, + create_parents = True) + + file_path = (use_cases.get_krb5_conf_dir(json_data) + +@@ -109,7 +109,7 @@ + content=InlineTemplate(use_cases.get_krb5_conf_template(json_data)), + owner='root', + group='root', +- mode=0644) ++ mode=0o644) + + def test_configure_cross_realm_trust(self): + json_data = use_cases.get_cross_realm_use_case() +@@ -125,7 +125,7 @@ + self.assertResourceCalled('Directory', use_cases.get_krb5_conf_dir(json_data), + owner='root', + group='root', +- mode=0755, ++ mode=0o755, + create_parents = True) + + file_path = (use_cases.get_krb5_conf_dir(json_data) + +@@ -135,7 +135,7 @@ + content=InlineTemplate(use_cases.get_krb5_conf_template(json_data)), + owner='root', + group='root', +- mode=0644) ++ mode=0o644) + + + def test_get_property(self): +@@ -146,13 +146,13 @@ + + d = { + 'non_empty' : "Nonempty value", +- 'unicode_non_empty' : u"Nonempty value", ++ 'unicode_non_empty' : "Nonempty value", + 'number' : 33, + 'number_string' : "33", + 'empty' : "", +- 'unicode_empty' : u"", ++ 'unicode_empty' : "", + 'whitespace' : " ", +- 'unicode_whitespace' : u" ", ++ 'unicode_whitespace' : " ", + 'none' : None, + } + +@@ -194,7 +194,7 @@ + import base64 + + config_file = "stacks/2.2/configs/default.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_data = json.load(f) + + json_data['kerberosCommandParams'] = [] +@@ -259,13 +259,13 @@ + self.assertResourceCalled('Directory', "/etc/security/keytabs", + owner='root', + group='root', +- mode=0755, ++ mode=0o755, + create_parents = True) + + self.assertResourceCalled('File', "/etc/security/keytabs/spnego.service.keytab", + owner='root', + group='hadoop', +- mode=0440, ++ mode=0o440, + content=CallFunctionMock(call_result=base64.b64decode("BQIAAABbAAIAC0VYQU1QTEUuQ09NAARIVFRQABdjNjU" + "wMS5hbWJhcmkuYXBhY2hlLm9yZwAAAAFUodgKAQASAC" + "A5N4gKUJsizCzwRD11Q/6sdZhJjlJmuuMeMKw/WefIb" +@@ -284,13 +284,13 @@ + self.assertResourceCalled('Directory', "/etc/security/keytabs", + owner='root', + group='root', +- mode=0755, ++ mode=0o755, + create_parents = True) + + self.assertResourceCalled('File', "/etc/security/keytabs/smokeuser.headless.keytab", + owner='ambari-qa', + group='hadoop', +- mode=0400, ++ mode=0o400, + content=CallFunctionMock(call_result=base64.b64decode("BQIAAABHAAEAC0VYQU1QTEUuQ09NAAlhbWJhcmktcWEAAAA" + "BVKHYCgEAEgAg3OBDOecGoznTHZiPwmlmK4TI6bdRdrl/6q" + "TV8Kml2TAAAAA/AAEAC0VYQU1QTEUuQ09NAAlhbWJhcmktc" +@@ -305,7 +305,7 @@ + def test_delete_keytab(self): + config_file = "stacks/2.2/configs/default.json" + +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_data = json.load(f) + + json_data['kerberosCommandParams'] = [] +@@ -350,11 +350,11 @@ + ) + + # The kdc_hosts is expected to be taken from the JSON configuration data as-is +- self.assertEquals('c6401.ambari.apache.org, c6402.ambari.apache.org', sys.modules['params'].kdc_hosts) ++ self.assertEqual('c6401.ambari.apache.org, c6402.ambari.apache.org', sys.modules['params'].kdc_hosts) + + # The kdc_host is expected to generated using kdc_hosts, but only the first host is used since + # previous versions only knew how to handle a single KDC host +- self.assertEquals('c6401.ambari.apache.org', sys.modules['params'].kdc_host) ++ self.assertEqual('c6401.ambari.apache.org', sys.modules['params'].kdc_host) + + @patch("resource_management.core.sudo.path_exists") + def test_find_missing_keytabs(self, path_exists): +@@ -372,7 +372,7 @@ + config_dict=json_data, + stack_version=self.STACK_VERSION, + target=RMFTestCase.TARGET_COMMON_SERVICES) +- self.assertEquals(Script.structuredOut['missing_keytabs'], [OrderedDict({ ++ self.assertEqual(Script.structuredOut['missing_keytabs'], [OrderedDict({ + 'keytab_file_path' : '/deleted_keytab', + 'principal' : 'HTTP/c6401.ambari.apache.org@EXAMPLE.COM' + })]) +\ 文件尾没有换行符 +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.2/KERBEROS/use_cases.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.2/KERBEROS/use_cases.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.2/KERBEROS/use_cases.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.2/KERBEROS/use_cases.py 2022-07-11 00:52:31.000000000 +0800 +@@ -76,7 +76,7 @@ + + def get_managed_kdc_use_case(): + config_file = "stacks/2.2/configs/default.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_data = json.load(f) + + json_data['clusterHostInfo']['kdc_server_hosts'] = ['c6401.ambari.apache.org'] +@@ -97,7 +97,7 @@ + + def get_unmanged_kdc_use_case(): + config_file = "stacks/2.2/configs/default.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_data = json.load(f) + + json_data['configurations']['kerberos-env'] = { +@@ -124,7 +124,7 @@ + + def get_unmanged_krb5conf_use_case(): + config_file = "stacks/2.2/configs/default.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_data = json.load(f) + + json_data['clusterHostInfo']['kdc_server_hosts'] = ['c6401.ambari.apache.org'] +@@ -144,7 +144,7 @@ + + def get_unmanged_ad_use_case(): + config_file = "stacks/2.2/configs/default.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_data = json.load(f) + + json_data['configurations']['kerberos-env'] = { +@@ -170,7 +170,7 @@ + + def get_cross_realm_use_case(): + config_file = "stacks/2.2/configs/default.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_data = json.load(f) + + _krb5_conf_template = krb5_conf_template + \ +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.2/KNOX/test_knox_gateway.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.2/KNOX/test_knox_gateway.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.2/KNOX/test_knox_gateway.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.2/KNOX/test_knox_gateway.py 2022-07-11 00:52:31.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +@@ -21,8 +21,8 @@ + import tempfile + from resource_management import * + from stacks.utils.RMFTestCase import * +-from mock.mock import patch +-from mock.mock import MagicMock ++from unittest.mock import patch ++from unittest.mock import MagicMock + + @patch.object(tempfile, "gettempdir", new=MagicMock(return_value="/tmp")) + @patch("platform.linux_distribution", new = MagicMock(return_value="Linux")) +@@ -43,7 +43,7 @@ + owner = 'knox', + group = 'knox', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + cd_access = "a", + recursive_ownership = True, + ) +@@ -51,7 +51,7 @@ + owner = 'knox', + group = 'knox', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + cd_access = "a", + recursive_ownership = True, + ) +@@ -59,7 +59,7 @@ + owner = 'knox', + group = 'knox', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + cd_access = "a", + recursive_ownership = True, + ) +@@ -67,7 +67,7 @@ + owner = 'knox', + group = 'knox', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + cd_access = "a", + recursive_ownership = True, + ) +@@ -75,7 +75,7 @@ + owner = 'knox', + group = 'knox', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + cd_access = "a", + recursive_ownership = True, + ) +@@ -89,7 +89,7 @@ + ) + + self.assertResourceCalled('File', '/usr/hdp/current/knox-server/conf/gateway-log4j.properties', +- mode=0644, ++ mode=0o644, + group='knox', + owner = 'knox', + content = InlineTemplate(self.getConfig()['configurations']['gateway-log4j']['content']) +@@ -105,12 +105,12 @@ + content = InlineTemplate(self.getConfig()['configurations']['admin-topology']['content']) + ) + self.assertResourceCalled('Execute', '/usr/hdp/current/knox-server/bin/knoxcli.sh create-master --master sa', +- environment = {'JAVA_HOME': u'/usr/jdk64/jdk1.7.0_45'}, ++ environment = {'JAVA_HOME': '/usr/jdk64/jdk1.7.0_45'}, + not_if = "ambari-sudo.sh su knox -l -s /bin/bash -c '[RMF_EXPORT_PLACEHOLDER]test -f /usr/hdp/current/knox-server/data/security/master'", + user = 'knox', + ) + self.assertResourceCalled('Execute', '/usr/hdp/current/knox-server/bin/knoxcli.sh create-cert --hostname c6401.ambari.apache.org', +- environment = {'JAVA_HOME': u'/usr/jdk64/jdk1.7.0_45'}, ++ environment = {'JAVA_HOME': '/usr/jdk64/jdk1.7.0_45'}, + not_if = "ambari-sudo.sh su knox -l -s /bin/bash -c '[RMF_EXPORT_PLACEHOLDER]test -f /usr/hdp/current/knox-server/data/security/keystores/gateway.jks'", + user = 'knox', + ) +@@ -118,13 +118,13 @@ + content = InlineTemplate('\n # Licensed to the Apache Software Foundation (ASF) under one\n # or more contributor license agreements. See the NOTICE file\n # distributed with this work for additional information\n # regarding copyright ownership. The ASF licenses this file\n # to you under the Apache License, Version 2.0 (the\n # "License"); you may not use this file except in compliance\n # with the License. You may obtain a copy of the License at\n #\n # http://www.apache.org/licenses/LICENSE-2.0\n #\n # Unless required by applicable law or agreed to in writing, software\n # distributed under the License is distributed on an "AS IS" BASIS,\n # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n # See the License for the specific language governing permissions and\n # limitations under the License.\n #testing\n\n app.log.dir=${launcher.dir}/../logs\n app.log.file=${launcher.name}.log\n\n log4j.rootLogger=ERROR, drfa\n log4j.logger.org.apache.directory.server.ldap.LdapServer=INFO\n log4j.logger.org.apache.directory=WARN\n\n log4j.appender.stdout=org.apache.log4j.ConsoleAppender\n log4j.appender.stdout.layout=org.apache.log4j.PatternLayout\n log4j.appender.stdout.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{2}: %m%n\n\n log4j.appender.drfa=org.apache.log4j.DailyRollingFileAppender\n log4j.appender.drfa.File=${app.log.dir}/${app.log.file}\n log4j.appender.drfa.DatePattern=.yyyy-MM-dd\n log4j.appender.drfa.layout=org.apache.log4j.PatternLayout\n log4j.appender.drfa.layout.ConversionPattern=%d{ISO8601} %-5p %c{2} (%F:%M(%L)) - %m%n'), + owner = 'knox', + group = 'knox', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/usr/hdp/current/knox-server/conf/users.ldif', + content = '\n # Licensed to the Apache Software Foundation (ASF) under one\n # or more contributor license agreements. See the NOTICE file\n # distributed with this work for additional information\n # regarding copyright ownership. The ASF licenses this file\n # to you under the Apache License, Version 2.0 (the\n # "License"); you may not use this file except in compliance\n # with the License. You may obtain a copy of the License at\n #\n # http://www.apache.org/licenses/LICENSE-2.0\n #\n # Unless required by applicable law or agreed to in writing, software\n # distributed under the License is distributed on an "AS IS" BASIS,\n # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n # See the License for the specific language governing permissions and\n # limitations under the License.\n\n version: 1\n\n # Please replace with site specific values\n dn: dc=hadoop,dc=apache,dc=org\n objectclass: organization\n objectclass: dcObject\n o: Hadoop\n dc: hadoop\n\n # Entry for a sample people container\n # Please replace with site specific values\n dn: ou=people,dc=hadoop,dc=apache,dc=org\n objectclass:top\n objectclass:organizationalUnit\n ou: people\n\n # Entry for a sample end user\n # Please replace with site specific values\n dn: uid=guest,ou=people,dc=hadoop,dc=apache,dc=org\n objectclass:top\n objectclass:person\n objectclass:organizationalPerson\n objectclass:inetOrgPerson\n cn: Guest\n sn: User\n uid: guest\n userPassword:guest-password\n\n # entry for sample user admin\n dn: uid=admin,ou=people,dc=hadoop,dc=apache,dc=org\n objectclass:top\n objectclass:person\n objectclass:organizationalPerson\n objectclass:inetOrgPerson\n cn: Admin\n sn: Admin\n uid: admin\n userPassword:admin-password\n\n # entry for sample user sam\n dn: uid=sam,ou=people,dc=hadoop,dc=apache,dc=org\n objectclass:top\n objectclass:person\n objectclass:organizationalPerson\n objectclass:inetOrgPerson\n cn: sam\n sn: sam\n uid: sam\n userPassword:sam-password\n\n # entry for sample user tom\n dn: uid=tom,ou=people,dc=hadoop,dc=apache,dc=org\n objectclass:top\n objectclass:person\n objectclass:organizationalPerson\n objectclass:inetOrgPerson\n cn: tom\n sn: tom\n uid: tom\n userPassword:tom-password\n\n # create FIRST Level groups branch\n dn: ou=groups,dc=hadoop,dc=apache,dc=org\n objectclass:top\n objectclass:organizationalUnit\n ou: groups\n description: generic groups branch\n\n # create the analyst group under groups\n dn: cn=analyst,ou=groups,dc=hadoop,dc=apache,dc=org\n objectclass:top\n objectclass: groupofnames\n cn: analyst\n description:analyst group\n member: uid=sam,ou=people,dc=hadoop,dc=apache,dc=org\n member: uid=tom,ou=people,dc=hadoop,dc=apache,dc=org\n\n\n # create the scientist group under groups\n dn: cn=scientist,ou=groups,dc=hadoop,dc=apache,dc=org\n objectclass:top\n objectclass: groupofnames\n cn: scientist\n description: scientist group\n member: uid=sam,ou=people,dc=hadoop,dc=apache,dc=org', + owner = 'knox', + group = 'knox', +- mode = 0644, ++ mode = 0o644, + ) + self.assertNoMoreResources() + +@@ -132,7 +132,7 @@ + def test_pre_upgrade_restart(self, isdir_mock): + isdir_mock.return_value = True + config_file = self.get_src_folder()+"/test/python/stacks/2.2/configs/knox_upgrade.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + version = '2.2.1.0-3242' + json_content['commandParams']['version'] = version +@@ -167,7 +167,7 @@ + """ + isdir_mock.return_value = True + config_file = self.get_src_folder()+"/test/python/stacks/2.2/configs/knox_upgrade.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + version = "2.3.0.0-1234" + json_content['commandParams']['version'] = version +@@ -206,7 +206,7 @@ + """ + isdir_mock.return_value = True + config_file = self.get_src_folder()+"/test/python/stacks/2.2/configs/knox_upgrade.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + source_version = "2.3.0.0-1234" + version = "2.3.2.0-5678" +@@ -267,7 +267,7 @@ + """ + isdir_mock.return_value = True + config_file = self.get_src_folder()+"/test/python/stacks/2.2/configs/knox_upgrade.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + source_version = "2.3.2.0-1000" + version = "2.3.2.0-1001" +@@ -352,7 +352,7 @@ + owner = 'knox', + group = 'knox', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + cd_access = "a", + recursive_ownership = True, + ) +@@ -360,7 +360,7 @@ + owner = 'knox', + group = 'knox', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + cd_access = "a", + recursive_ownership = True, + ) +@@ -368,7 +368,7 @@ + owner = 'knox', + group = 'knox', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + cd_access = "a", + recursive_ownership = True, + ) +@@ -376,7 +376,7 @@ + owner = 'knox', + group = 'knox', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + cd_access = "a", + recursive_ownership = True, + ) +@@ -384,7 +384,7 @@ + owner = 'knox', + group = 'knox', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + cd_access = "a", + recursive_ownership = True, + ) +@@ -398,7 +398,7 @@ + ) + + self.assertResourceCalled('File', '/usr/hdp/current/knox-server/conf/gateway-log4j.properties', +- mode=0644, ++ mode=0o644, + group='knox', + owner = 'knox', + content = InlineTemplate(self.getConfig()['configurations']['gateway-log4j']['content']) +@@ -414,23 +414,23 @@ + content = InlineTemplate(self.getConfig()['configurations']['admin-topology']['content']) + ) + self.assertResourceCalled('Execute', '/usr/hdp/current/knox-server/bin/knoxcli.sh create-master --master sa', +- environment = {'JAVA_HOME': u'/usr/jdk64/jdk1.7.0_45'}, ++ environment = {'JAVA_HOME': '/usr/jdk64/jdk1.7.0_45'}, + not_if = "ambari-sudo.sh su knox -l -s /bin/bash -c '[RMF_EXPORT_PLACEHOLDER]test -f /usr/hdp/current/knox-server/data/security/master'", + user = 'knox', + ) + self.assertResourceCalled('Execute', '/usr/hdp/current/knox-server/bin/knoxcli.sh create-cert --hostname c6401.ambari.apache.org', +- environment = {'JAVA_HOME': u'/usr/jdk64/jdk1.7.0_45'}, ++ environment = {'JAVA_HOME': '/usr/jdk64/jdk1.7.0_45'}, + not_if = "ambari-sudo.sh su knox -l -s /bin/bash -c '[RMF_EXPORT_PLACEHOLDER]test -f /usr/hdp/current/knox-server/data/security/keystores/gateway.jks'", + user = 'knox', + ) + self.assertResourceCalled('File', '/usr/hdp/current/knox-server/conf/ldap-log4j.properties', +- mode=0644, ++ mode=0o644, + group='knox', + owner = 'knox', + content = InlineTemplate(self.getConfig()['configurations']['ldap-log4j']['content']) + ) + self.assertResourceCalled('File', '/usr/hdp/current/knox-server/conf/users.ldif', +- mode=0644, ++ mode=0o644, + group='knox', + owner = 'knox', + content = self.getConfig()['configurations']['users-ldif']['content'] +@@ -440,16 +440,16 @@ + ) + self.assertResourceCalled('Directory', '/var/log/knox', + owner = 'knox', +- mode = 0755, ++ mode = 0o755, + group = 'knox', + create_parents = True, + cd_access = 'a', + recursive_ownership = True, + ) + self.assertResourceCalled("Execute", "/usr/hdp/current/knox-server/bin/gateway.sh start", +- environment = {'JAVA_HOME': u'/usr/jdk64/jdk1.7.0_45'}, +- not_if = u'ls /var/run/knox/gateway.pid >/dev/null 2>&1 && ps -p `cat /var/run/knox/gateway.pid` >/dev/null 2>&1', +- user = u'knox',) ++ environment = {'JAVA_HOME': '/usr/jdk64/jdk1.7.0_45'}, ++ not_if = 'ls /var/run/knox/gateway.pid >/dev/null 2>&1 && ps -p `cat /var/run/knox/gateway.pid` >/dev/null 2>&1', ++ user = 'knox',) + self.assertTrue(islink_mock.called) + self.assertNoMoreResources() + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.2/PIG/test_pig_service_check.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.2/PIG/test_pig_service_check.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.2/PIG/test_pig_service_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.2/PIG/test_pig_service_check.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 mock.mock import patch, MagicMock ++from unittest.mock import patch, MagicMock + + from stacks.utils.RMFTestCase import * + from resource_management.libraries.functions.constants import StackFeature +@@ -58,7 +58,7 @@ + keytab = '/etc/security/keytabs/hdfs.headless.keytab', + kinit_path_local = '/usr/bin/kinit', + user = 'hdfs', +- mode = 0770, ++ mode = 0o770, + owner = 'ambari-qa', + action = ['create_on_execute'], + hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', +@@ -120,7 +120,7 @@ + ) + self.assertResourceCalled("File", "/tmp/pigSmoke.sh", + content=StaticFile("pigSmoke.sh"), +- mode=0755 ++ mode=0o755 + ) + self.assertResourceCalled("Execute", "pig /tmp/pigSmoke.sh", + path=["/usr/hdp/current/pig-client/bin:/usr/sbin:/sbin:/usr/local/bin:/bin:/usr/bin"], +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.2/RANGER/test_ranger_admin.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.2/RANGER/test_ranger_admin.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.2/RANGER/test_ranger_admin.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.2/RANGER/test_ranger_admin.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 json +-from mock.mock import MagicMock, patch ++from unittest.mock import MagicMock, patch + from stacks.utils.RMFTestCase import * + + from only_for_platform import not_for_platform, PLATFORM_WINDOWS +@@ -53,7 +53,7 @@ + properties = {'db_password': '_', 'db_root_password': '_', 'audit_db_password': '_'} + ) + self.assertResourceCalled('Execute', '/usr/bin/ranger-admin-start', +- environment = {'JAVA_HOME': u'/usr/jdk64/jdk1.7.0_45'}, ++ environment = {'JAVA_HOME': '/usr/jdk64/jdk1.7.0_45'}, + not_if = 'ps -ef | grep proc_rangeradmin | grep -v grep', + user = 'ranger', + ) +@@ -68,7 +68,7 @@ + target = RMFTestCase.TARGET_COMMON_SERVICES + ) + self.assertResourceCalled('Execute', '/usr/bin/ranger-admin-stop', +- environment = {'JAVA_HOME': u'/usr/jdk64/jdk1.7.0_45'}, ++ environment = {'JAVA_HOME': '/usr/jdk64/jdk1.7.0_45'}, + user = 'ranger' + ) + self.assertNoMoreResources() +@@ -98,7 +98,7 @@ + properties = {'db_password': '_', 'db_root_password': '_', 'audit_db_password': '_'} + ) + self.assertResourceCalled('Execute', '/usr/bin/ranger-admin-start', +- environment = {'JAVA_HOME': u'/usr/jdk64/jdk1.7.0_45'}, ++ environment = {'JAVA_HOME': '/usr/jdk64/jdk1.7.0_45'}, + not_if = 'ps -ef | grep proc_rangeradmin | grep -v grep', + user = 'ranger', + ) +@@ -114,7 +114,7 @@ + ) + self.assertResourceCalled('Execute', '/usr/bin/ranger-admin-stop', + user = 'ranger', +- environment = {'JAVA_HOME': u'/usr/jdk64/jdk1.7.0_45'} ++ environment = {'JAVA_HOME': '/usr/jdk64/jdk1.7.0_45'} + ) + self.assertNoMoreResources() + +@@ -123,7 +123,7 @@ + environment = {}) + self.assertResourceCalled('File', '/tmp/mysql-connector-java.jar', + content = DownloadSource('http://c6401.ambari.apache.org:8080/resources/mysql-connector-java.jar'), +- mode = 0644 ++ mode = 0o644 + ) + self.assertResourceCalled('Execute', ('cp', + '--remove-destination', +@@ -133,7 +133,7 @@ + path = ['/bin', '/usr/bin/'], + ) + self.assertResourceCalled('File', '/usr/share/java/mysql-connector-java.jar', +- mode = 0644 ++ mode = 0o644 + ) + self.assertResourceCalled('ModifyPropertiesFile', '/usr/hdp/current/ranger-admin/install.properties', + properties = self.getConfig()['configurations']['admin-properties'], +@@ -149,13 +149,13 @@ + ) + self.assertResourceCalled('Execute', 'cd /usr/hdp/current/ranger-admin && ambari-sudo.sh [RMF_ENV_PLACEHOLDER] -H -E /usr/hdp/current/ranger-admin/setup.sh', + logoutput = True, +- environment = {'JAVA_HOME': u'/usr/jdk64/jdk1.7.0_45'}, ++ environment = {'JAVA_HOME': '/usr/jdk64/jdk1.7.0_45'}, + ) + self.assertResourceCalled('ModifyPropertiesFile', '/etc/ranger/admin/conf/xa_system.properties', + properties = self.getConfig()['configurations']['ranger-site'], + ) + self.assertResourceCalled('ModifyPropertiesFile', '/etc/ranger/admin/conf/ranger_webserver.properties', +- mode = 0744, ++ mode = 0o744, + properties = self.getConfig()['configurations']['ranger-site'] + ) + self.assertResourceCalled('Directory', '/var/log/ranger/admin', +@@ -168,7 +168,7 @@ + environment = {}) + self.assertResourceCalled('File', '/tmp/mysql-connector-java.jar', + content = DownloadSource('http://c6401.ambari.apache.org:8080/resources/mysql-connector-java.jar'), +- mode = 0644 ++ mode = 0o644 + ) + self.assertResourceCalled('Execute', ('cp', + '--remove-destination', +@@ -178,7 +178,7 @@ + path = ['/bin', '/usr/bin/'], + ) + self.assertResourceCalled('File', '/usr/share/java/mysql-connector-java.jar', +- mode = 0644 ++ mode = 0o644 + ) + self.assertResourceCalled('ModifyPropertiesFile', '/usr/hdp/current/ranger-admin/install.properties', + properties = self.getConfig()['configurations']['admin-properties'], +@@ -194,13 +194,13 @@ + ) + self.assertResourceCalled('Execute', 'cd /usr/hdp/current/ranger-admin && ambari-sudo.sh [RMF_ENV_PLACEHOLDER] -H -E /usr/hdp/current/ranger-admin/setup.sh', + logoutput = True, +- environment = {'JAVA_HOME': u'/usr/jdk64/jdk1.7.0_45'}, ++ environment = {'JAVA_HOME': '/usr/jdk64/jdk1.7.0_45'}, + ) + self.assertResourceCalled('ModifyPropertiesFile', '/etc/ranger/admin/conf/xa_system.properties', + properties = self.getConfig()['configurations']['ranger-site'], + ) + self.assertResourceCalled('ModifyPropertiesFile', '/etc/ranger/admin/conf/ranger_webserver.properties', +- mode = 0744, ++ mode = 0o744, + properties = self.getConfig()['configurations']['ranger-site'] + ) + self.assertResourceCalled('Directory', '/var/log/ranger/admin', +@@ -211,7 +211,7 @@ + + def test_pre_upgrade_restart_23(self, ): + config_file = self.get_src_folder()+"/test/python/stacks/2.2/configs/ranger-admin-upgrade.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + json_content['commandParams']['version'] = '2.3.0.0-1234' + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.2/RANGER/test_ranger_usersync.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.2/RANGER/test_ranger_usersync.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.2/RANGER/test_ranger_usersync.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.2/RANGER/test_ranger_usersync.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 +-from mock.mock import MagicMock, patch ++from unittest.mock import MagicMock, patch + from stacks.utils.RMFTestCase import * + + from only_for_platform import not_for_platform, PLATFORM_WINDOWS +@@ -50,7 +50,7 @@ + ) + self.assert_configure_default() + self.assertResourceCalled('Execute', ('/usr/bin/ranger-usersync-start',), +- environment = {'JAVA_HOME': u'/usr/jdk64/jdk1.7.0_45'}, ++ environment = {'JAVA_HOME': '/usr/jdk64/jdk1.7.0_45'}, + not_if = 'ps -ef | grep proc_rangerusersync | grep -v grep', + sudo = True, + ) +@@ -65,7 +65,7 @@ + target = RMFTestCase.TARGET_COMMON_SERVICES + ) + self.assertResourceCalled('Execute', ('/usr/bin/ranger-usersync-stop',), +- environment = {'JAVA_HOME': u'/usr/jdk64/jdk1.7.0_45'}, ++ environment = {'JAVA_HOME': '/usr/jdk64/jdk1.7.0_45'}, + sudo = True + ) + self.assertNoMoreResources() +@@ -91,7 +91,7 @@ + ) + self.assert_configure_secured() + self.assertResourceCalled('Execute', ('/usr/bin/ranger-usersync-start',), +- environment= {'JAVA_HOME': u'/usr/jdk64/jdk1.7.0_45'}, ++ environment= {'JAVA_HOME': '/usr/jdk64/jdk1.7.0_45'}, + not_if = 'ps -ef | grep proc_rangerusersync | grep -v grep', + sudo = True + ) +@@ -106,7 +106,7 @@ + target = RMFTestCase.TARGET_COMMON_SERVICES + ) + self.assertResourceCalled('Execute', ('/usr/bin/ranger-usersync-stop',), +- environment = {'JAVA_HOME': u'/usr/jdk64/jdk1.7.0_45'}, ++ environment = {'JAVA_HOME': '/usr/jdk64/jdk1.7.0_45'}, + sudo = True + ) + self.assertNoMoreResources() +@@ -123,7 +123,7 @@ + ) + self.assertTrue(setup_usersync_mock.called) + self.assertResourceCalled("Execute", ("/usr/bin/ranger-usersync-stop",), +- environment = {'JAVA_HOME': u'/usr/jdk64/jdk1.7.0_67'}, ++ environment = {'JAVA_HOME': '/usr/jdk64/jdk1.7.0_67'}, + sudo = True + ) + self.assertResourceCalled("Execute", ('ambari-python-wrap', '/usr/bin/hdp-select', 'set', 'ranger-usersync', '2.2.2.0-2399'), sudo=True) +@@ -132,7 +132,7 @@ + @patch("os.path.exists") + def test_upgrade_23(self, os_path_exists_mock, setup_usersync_mock): + config_file = self.get_src_folder()+"/test/python/stacks/2.2/configs/ranger-usersync-upgrade.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + json_content['commandParams']['version'] = '2.3.0.0-1234' + +@@ -148,7 +148,7 @@ + + self.assertTrue(setup_usersync_mock.called) + self.assertResourceCalled("Execute", ("/usr/bin/ranger-usersync-stop",), +- environment = {'JAVA_HOME': u'/usr/jdk64/jdk1.7.0_67'}, ++ environment = {'JAVA_HOME': '/usr/jdk64/jdk1.7.0_67'}, + sudo = True) + self.assertResourceCalledIgnoreEarlier("Execute", ('ambari-python-wrap', '/usr/bin/hdp-select', 'set', 'ranger-usersync', '2.3.0.0-1234'), sudo=True) + +@@ -167,7 +167,7 @@ + + self.assertResourceCalled('Execute', 'cd /usr/hdp/current/ranger-usersync && ambari-sudo.sh [RMF_ENV_PLACEHOLDER] -H -E /usr/hdp/current/ranger-usersync/setup.sh', + logoutput = True, +- environment = {'JAVA_HOME': u'/usr/jdk64/jdk1.7.0_45'}, ++ environment = {'JAVA_HOME': '/usr/jdk64/jdk1.7.0_45'}, + ) + self.assertResourceCalled('File', '/usr/bin/ranger-usersync-start', + owner = 'ranger', +@@ -176,7 +176,7 @@ + owner = 'ranger', + ) + self.assertResourceCalled('File', '/usr/hdp/current/ranger-usersync/ranger-usersync-services.sh', +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('Directory', '/var/log/ranger/usersync', + owner = custom_config['unix_user'], +@@ -196,7 +196,7 @@ + ) + self.assertResourceCalled('Execute', 'cd /usr/hdp/current/ranger-usersync && ambari-sudo.sh [RMF_ENV_PLACEHOLDER] -H -E /usr/hdp/current/ranger-usersync/setup.sh', + logoutput = True, +- environment = {'JAVA_HOME': u'/usr/jdk64/jdk1.7.0_45'}, ++ environment = {'JAVA_HOME': '/usr/jdk64/jdk1.7.0_45'}, + ) + self.assertResourceCalled('File', '/usr/bin/ranger-usersync-start', + owner = 'ranger', +@@ -205,7 +205,7 @@ + owner = 'ranger', + ) + self.assertResourceCalled('File', '/usr/hdp/current/ranger-usersync/ranger-usersync-services.sh', +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('Directory', '/var/log/ranger/usersync', + owner = custom_config['unix_user'], +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.2/SLIDER/test_slider_client.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.2/SLIDER/test_slider_client.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.2/SLIDER/test_slider_client.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.2/SLIDER/test_slider_client.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 mock.mock import MagicMock, patch ++from unittest.mock import MagicMock, patch + from stacks.utils.RMFTestCase import * + + +@@ -48,12 +48,12 @@ + 'slider-client.xml', + conf_dir='/usr/hdp/current/slider-client/conf', + configurations=self.getConfig()['configurations']['slider-client'], +- mode=0644 ++ mode=0o644 + ) + + self.assertResourceCalled('File', '/usr/hdp/current/slider-client/conf/slider-env.sh', + content = InlineTemplate(self.getConfig()['configurations']['slider-env']['content']), +- mode = 0755, ++ mode = 0o755, + ) + + self.assertResourceCalled('Directory', +@@ -63,12 +63,12 @@ + + self.assertResourceCalled('File', '/usr/hdp/current/storm-slider-client/conf/storm-slider-env.sh', + content=Template('storm-slider-env.sh.j2'), +- mode = 0755, ++ mode = 0o755, + ) + + self.assertResourceCalled('File', + '/usr/hdp/current/slider-client/conf/log4j.properties', +- mode=0644, ++ mode=0o644, + content='log4jproperties\nline2' + ) + self.assertResourceCalled('File', '/usr/hdp/current/slider-client/lib/slider.tar.gz', +@@ -107,17 +107,17 @@ + 'slider-client.xml', + conf_dir='/usr/hdp/current/slider-client/conf', + configurations=self.getConfig()['configurations']['slider-client'], +- mode=0644 ++ mode=0o644 + ) + + self.assertResourceCalled('File', '/usr/hdp/current/slider-client/conf/slider-env.sh', + content = InlineTemplate(self.getConfig()['configurations']['slider-env']['content']), +- mode = 0755, ++ mode = 0o755, + ) + + self.assertResourceCalled('File', + '/usr/hdp/current/slider-client/conf/log4j.properties', +- mode=0644, ++ mode=0o644, + content='log4jproperties\nline2' + ) + self.assertResourceCalled('File', '/usr/hdp/current/slider-client/lib/slider.tar.gz', +@@ -181,7 +181,7 @@ + + def test_pre_upgrade_restart_23(self): + config_file = self.get_src_folder()+"/test/python/stacks/2.2/configs/default.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + json_content['commandParams']['version'] = '2.3.0.0-1234' + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.2/SPARK/test_job_history_server.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.2/SPARK/test_job_history_server.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.2/SPARK/test_job_history_server.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.2/SPARK/test_job_history_server.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 json +-from mock.mock import MagicMock, patch ++from unittest.mock import MagicMock, patch + from stacks.utils.RMFTestCase import * + + from only_for_platform import not_for_platform, PLATFORM_WINDOWS +@@ -62,7 +62,7 @@ + hadoop_bin_dir = '/usr/hdp/2.2.1.0-2067/hadoop/bin', + keytab = UnknownConfigurationMock(), + default_fs = 'hdfs://c6401.ambari.apache.org:8020', +- hdfs_site = {u'a': u'b'}, ++ hdfs_site = {'a': 'b'}, + kinit_path_local = '/usr/bin/kinit', + principal_name = UnknownConfigurationMock(), + user = 'hdfs', +@@ -71,7 +71,7 @@ + hadoop_conf_dir = '/etc/hadoop/conf', + ) + self.assertResourceCalled('Execute', '/usr/hdp/current/spark-client/sbin/start-history-server.sh', +- environment = {'JAVA_HOME': u'/usr/jdk64/jdk1.7.0_45'}, ++ environment = {'JAVA_HOME': '/usr/jdk64/jdk1.7.0_45'}, + not_if = 'ls /var/run/spark/spark-spark-org.apache.spark.deploy.history.HistoryServer-1.pid >/dev/null 2>&1 && ps -p `cat /var/run/spark/spark-spark-org.apache.spark.deploy.history.HistoryServer-1.pid` >/dev/null 2>&1', + user = 'spark', + ) +@@ -86,7 +86,7 @@ + target = RMFTestCase.TARGET_COMMON_SERVICES + ) + self.assertResourceCalled('Execute', '/usr/hdp/current/spark-client/sbin/stop-history-server.sh', +- environment = {'JAVA_HOME': u'/usr/jdk64/jdk1.7.0_45'}, ++ environment = {'JAVA_HOME': '/usr/jdk64/jdk1.7.0_45'}, + user = 'spark', + ) + self.assertResourceCalled('File', '/var/run/spark/spark-spark-org.apache.spark.deploy.history.HistoryServer-1.pid', +@@ -137,7 +137,7 @@ + ) + + self.assertResourceCalled('Execute', '/usr/hdp/current/spark-client/sbin/start-history-server.sh', +- environment = {'JAVA_HOME': u'/usr/jdk64/jdk1.7.0_45'}, ++ environment = {'JAVA_HOME': '/usr/jdk64/jdk1.7.0_45'}, + not_if = 'ls /var/run/spark/spark-spark-org.apache.spark.deploy.history.HistoryServer-1.pid >/dev/null 2>&1 && ps -p `cat /var/run/spark/spark-spark-org.apache.spark.deploy.history.HistoryServer-1.pid` >/dev/null 2>&1', + user = 'spark', + ) +@@ -152,7 +152,7 @@ + target = RMFTestCase.TARGET_COMMON_SERVICES + ) + self.assertResourceCalled('Execute', '/usr/hdp/current/spark-client/sbin/stop-history-server.sh', +- environment = {'JAVA_HOME': u'/usr/jdk64/jdk1.7.0_45'}, ++ environment = {'JAVA_HOME': '/usr/jdk64/jdk1.7.0_45'}, + user = 'spark', + ) + self.assertResourceCalled('File', '/var/run/spark/spark-spark-org.apache.spark.deploy.history.HistoryServer-1.pid', +@@ -165,14 +165,14 @@ + owner = 'spark', + group = 'hadoop', + create_parents = True, +- mode = 0775, ++ mode = 0o775, + cd_access = 'a', + ) + self.assertResourceCalled('Directory', '/var/log/spark', + owner = 'spark', + group = 'hadoop', + create_parents = True, +- mode = 0775, ++ mode = 0o775, + cd_access = 'a', + ) + self.assertResourceCalled('HdfsResource', '/user/spark', +@@ -181,7 +181,7 @@ + hadoop_bin_dir = '/usr/hdp/2.2.1.0-2067/hadoop/bin', + keytab = UnknownConfigurationMock(), + default_fs = 'hdfs://c6401.ambari.apache.org:8020', +- hdfs_site = {u'a': u'b'}, ++ hdfs_site = {'a': 'b'}, + kinit_path_local = '/usr/bin/kinit', + principal_name = UnknownConfigurationMock(), + user = 'hdfs', +@@ -190,7 +190,7 @@ + hadoop_conf_dir = '/etc/hadoop/conf', + type = 'directory', + action = ['create_on_execute'], hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', +- mode = 0775, ++ mode = 0o775, + ) + self.assertResourceCalled('HdfsResource', None, + immutable_paths = self.DEFAULT_IMMUTABLE_PATHS, +@@ -198,7 +198,7 @@ + hadoop_bin_dir = '/usr/hdp/2.2.1.0-2067/hadoop/bin', + keytab = UnknownConfigurationMock(), + default_fs = 'hdfs://c6401.ambari.apache.org:8020', +- hdfs_site = {u'a': u'b'}, ++ hdfs_site = {'a': 'b'}, + kinit_path_local = '/usr/bin/kinit', + principal_name = UnknownConfigurationMock(), + user = 'hdfs', +@@ -211,36 +211,36 @@ + key_value_delimiter = ' ', + group = 'spark', + properties = self.getConfig()['configurations']['spark-defaults'], +- mode = 0644 ++ mode = 0o644 + ) + self.assertResourceCalled('File', '/usr/hdp/current/spark-client/conf/spark-env.sh', + content = InlineTemplate(self.getConfig()['configurations']['spark-env']['content']), + owner = 'spark', + group = 'spark', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/usr/hdp/current/spark-client/conf/log4j.properties', + content = '\n# Set everything to be logged to the console\nlog4j.rootCategory=INFO, console\nlog4j.appender.console=org.apache.log4j.ConsoleAppender\nlog4j.appender.console.target=System.err\nlog4j.appender.console.layout=org.apache.log4j.PatternLayout\nlog4j.appender.console.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{1}: %m%n\n\n# Settings to quiet third party logs that are too verbose\nlog4j.logger.org.eclipse.jetty=WARN\nlog4j.logger.org.eclipse.jetty.util.component.AbstractLifeCycle=ERROR\nlog4j.logger.org.apache.spark.repl.SparkIMain$exprTyper=INFO\nlog4j.logger.org.apache.spark.repl.SparkILoop$SparkILoopInterpreter=INFO', + owner = 'spark', + group = 'spark', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/usr/hdp/current/spark-client/conf/metrics.properties', + content = InlineTemplate(self.getConfig()['configurations']['spark-metrics-properties']['content']), + owner = 'spark', + group = 'spark', +- mode = 0644 ++ mode = 0o644 + ) + self.assertResourceCalled('Directory', '/usr/hdp/current/spark-client/logs', + owner = 'spark', + group = 'spark', +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('File', '/usr/hdp/current/spark-client/conf/java-opts', + content = InlineTemplate(' -Dhdp.version=None'), + owner = 'spark', + group = 'spark', +- mode = 0644 ++ mode = 0o644 + ) + + def assert_configure_secured(self): +@@ -248,14 +248,14 @@ + owner = 'spark', + group = 'hadoop', + create_parents = True, +- mode = 0775, ++ mode = 0o775, + cd_access = 'a', + ) + self.assertResourceCalled('Directory', '/var/log/spark', + owner = 'spark', + group = 'hadoop', + create_parents = True, +- mode = 0775, ++ mode = 0o775, + cd_access = 'a', + ) + self.assertResourceCalled('HdfsResource', '/user/spark', +@@ -273,7 +273,7 @@ + dfs_type = '', + type = 'directory', + action = ['create_on_execute'], hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', +- mode = 0775, ++ mode = 0o775, + ) + self.assertResourceCalled('HdfsResource', None, + immutable_paths = self.DEFAULT_IMMUTABLE_PATHS, +@@ -294,42 +294,42 @@ + key_value_delimiter = ' ', + group = 'spark', + properties = self.getConfig()['configurations']['spark-defaults'], +- mode = 0644 ++ mode = 0o644 + ) + self.assertResourceCalled('File', '/usr/hdp/current/spark-client/conf/spark-env.sh', + content = InlineTemplate(self.getConfig()['configurations']['spark-env']['content']), + owner = 'spark', + group = 'spark', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/usr/hdp/current/spark-client/conf/log4j.properties', + content = '\n# Set everything to be logged to the console\nlog4j.rootCategory=INFO, console\nlog4j.appender.console=org.apache.log4j.ConsoleAppender\nlog4j.appender.console.target=System.err\nlog4j.appender.console.layout=org.apache.log4j.PatternLayout\nlog4j.appender.console.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{1}: %m%n\n\n# Settings to quiet third party logs that are too verbose\nlog4j.logger.org.eclipse.jetty=WARN\nlog4j.logger.org.eclipse.jetty.util.component.AbstractLifeCycle=ERROR\nlog4j.logger.org.apache.spark.repl.SparkIMain$exprTyper=INFO\nlog4j.logger.org.apache.spark.repl.SparkILoop$SparkILoopInterpreter=INFO', + owner = 'spark', + group = 'spark', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/usr/hdp/current/spark-client/conf/metrics.properties', + content = InlineTemplate(self.getConfig()['configurations']['spark-metrics-properties']['content']), + owner = 'spark', + group = 'spark', +- mode = 0644 ++ mode = 0o644 + ) + self.assertResourceCalled('Directory', '/usr/hdp/current/spark-client/logs', + owner = 'spark', + group = 'spark', +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('File', '/usr/hdp/current/spark-client/conf/java-opts', + content = InlineTemplate(' -Dhdp.version=None'), + owner = 'spark', + group = 'spark', +- mode = 0644 ++ mode = 0o644 + ) + + @patch("resource_management.libraries.functions.copy_tarball.copy_to_hdfs") + def test_pre_upgrade_restart_23(self, copy_to_hdfs_mock): + config_file = self.get_src_folder()+"/test/python/stacks/2.2/configs/default.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + version = '2.3.0.0-1234' + json_content['commandParams']['version'] = version +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.2/SPARK/test_spark_client.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.2/SPARK/test_spark_client.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.2/SPARK/test_spark_client.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.2/SPARK/test_spark_client.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 json +-from mock.mock import MagicMock, patch ++from unittest.mock import MagicMock, patch + from stacks.utils.RMFTestCase import * + + from only_for_platform import not_for_platform, PLATFORM_WINDOWS +@@ -58,14 +58,14 @@ + owner = 'spark', + group = 'hadoop', + create_parents = True, +- mode = 0775, ++ mode = 0o775, + cd_access = 'a', + ) + self.assertResourceCalled('Directory', '/var/log/spark', + owner = 'spark', + group = 'hadoop', + create_parents = True, +- mode = 0775, ++ mode = 0o775, + cd_access = 'a', + ) + self.assertResourceCalled('PropertiesFile', '/usr/hdp/current/spark-client/conf/spark-defaults.conf', +@@ -73,36 +73,36 @@ + key_value_delimiter = ' ', + group = 'spark', + properties = self.getConfig()['configurations']['spark-defaults'], +- mode = 0644 ++ mode = 0o644 + ) + self.assertResourceCalled('File', '/usr/hdp/current/spark-client/conf/spark-env.sh', + content = InlineTemplate(self.getConfig()['configurations']['spark-env']['content']), + owner = 'spark', + group = 'spark', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/usr/hdp/current/spark-client/conf/log4j.properties', + content = '\n# Set everything to be logged to the console\nlog4j.rootCategory=INFO, console\nlog4j.appender.console=org.apache.log4j.ConsoleAppender\nlog4j.appender.console.target=System.err\nlog4j.appender.console.layout=org.apache.log4j.PatternLayout\nlog4j.appender.console.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{1}: %m%n\n\n# Settings to quiet third party logs that are too verbose\nlog4j.logger.org.eclipse.jetty=WARN\nlog4j.logger.org.eclipse.jetty.util.component.AbstractLifeCycle=ERROR\nlog4j.logger.org.apache.spark.repl.SparkIMain$exprTyper=INFO\nlog4j.logger.org.apache.spark.repl.SparkILoop$SparkILoopInterpreter=INFO', + owner = 'spark', + group = 'spark', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/usr/hdp/current/spark-client/conf/metrics.properties', + content = InlineTemplate(self.getConfig()['configurations']['spark-metrics-properties']['content']), + owner = 'spark', + group = 'spark', +- mode = 0644 ++ mode = 0o644 + ) + self.assertResourceCalled('Directory', '/usr/hdp/current/spark-client/logs', + owner = 'spark', + group = 'spark', +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('File', '/usr/hdp/current/spark-client/conf/java-opts', + content = InlineTemplate(' -Dhdp.version=None'), + owner = 'spark', + group = 'spark', +- mode = 0644 ++ mode = 0o644 + ) + + def assert_configure_secured(self): +@@ -110,14 +110,14 @@ + owner = 'spark', + group = 'hadoop', + create_parents = True, +- mode = 0775, ++ mode = 0o775, + cd_access = 'a', + ) + self.assertResourceCalled('Directory', '/var/log/spark', + owner = 'spark', + group = 'hadoop', + create_parents = True, +- mode = 0775, ++ mode = 0o775, + cd_access = 'a', + ) + self.assertResourceCalled('PropertiesFile', '/usr/hdp/current/spark-client/conf/spark-defaults.conf', +@@ -125,41 +125,41 @@ + key_value_delimiter = ' ', + group = 'spark', + properties = self.getConfig()['configurations']['spark-defaults'], +- mode = 0644 ++ mode = 0o644 + ) + self.assertResourceCalled('File', '/usr/hdp/current/spark-client/conf/spark-env.sh', + content = InlineTemplate(self.getConfig()['configurations']['spark-env']['content']), + owner = 'spark', + group = 'spark', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/usr/hdp/current/spark-client/conf/log4j.properties', + content = '\n# Set everything to be logged to the console\nlog4j.rootCategory=INFO, console\nlog4j.appender.console=org.apache.log4j.ConsoleAppender\nlog4j.appender.console.target=System.err\nlog4j.appender.console.layout=org.apache.log4j.PatternLayout\nlog4j.appender.console.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{1}: %m%n\n\n# Settings to quiet third party logs that are too verbose\nlog4j.logger.org.eclipse.jetty=WARN\nlog4j.logger.org.eclipse.jetty.util.component.AbstractLifeCycle=ERROR\nlog4j.logger.org.apache.spark.repl.SparkIMain$exprTyper=INFO\nlog4j.logger.org.apache.spark.repl.SparkILoop$SparkILoopInterpreter=INFO', + owner = 'spark', + group = 'spark', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/usr/hdp/current/spark-client/conf/metrics.properties', + content = InlineTemplate(self.getConfig()['configurations']['spark-metrics-properties']['content']), + owner = 'spark', + group = 'spark', +- mode = 0644 ++ mode = 0o644 + ) + self.assertResourceCalled('Directory', '/usr/hdp/current/spark-client/logs', + owner = 'spark', + group = 'spark', +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('File', '/usr/hdp/current/spark-client/conf/java-opts', + content = InlineTemplate(' -Dhdp.version=None'), + owner = 'spark', + group = 'spark', +- mode = 0644 ++ mode = 0o644 + ) + + def test_pre_upgrade_restart_23(self): + config_file = self.get_src_folder()+"/test/python/stacks/2.2/configs/default.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + version = '2.3.0.0-1234' + json_content['commandParams']['version'] = version +@@ -180,7 +180,7 @@ + + def test_stack_upgrade_save_new_config(self): + config_file = self.get_src_folder()+"/test/python/stacks/2.2/configs/default.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + version = '2.3.0.0-1234' + json_content['commandParams']['version'] = version +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.2/SPARK/test_spark_service_check.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.2/SPARK/test_spark_service_check.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.2/SPARK/test_spark_service_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.2/SPARK/test_spark_service_check.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 mock.mock import MagicMock, call, patch ++from unittest.mock import MagicMock, call, patch + from stacks.utils.RMFTestCase import * + + from only_for_platform import not_for_platform, PLATFORM_WINDOWS +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.3/ATLAS/test_metadata_server.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.3/ATLAS/test_metadata_server.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.3/ATLAS/test_metadata_server.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.3/ATLAS/test_metadata_server.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 mock.mock import MagicMock, call, patch ++from unittest.mock import MagicMock, call, patch + from resource_management.libraries.script.script import Script + from resource_management.libraries.functions import get_kinit_path + from stacks.utils.RMFTestCase import * +@@ -40,7 +40,7 @@ + group='hadoop', + create_parents = True, + cd_access='a', +- mode=0755) ++ mode=0o755) + + # Pid dir + self.assertResourceCalled('Directory', '/var/run/atlas', +@@ -48,14 +48,14 @@ + group='hadoop', + create_parents = True, + cd_access='a', +- mode=0755 ++ mode=0o755 + ) + self.assertResourceCalled('Directory', self.conf_dir + "/solr", + owner='atlas', + group='hadoop', + create_parents = True, + cd_access='a', +- mode=0755, ++ mode=0o755, + recursive_ownership = True + ) + # Log dir +@@ -64,7 +64,7 @@ + group='hadoop', + create_parents = True, + cd_access='a', +- mode=0755 ++ mode=0o755 + ) + # Data dir + self.assertResourceCalled('Directory', self.stack_root+"/current/atlas-server/data", +@@ -72,7 +72,7 @@ + group='hadoop', + create_parents = True, + cd_access='a', +- mode=0644 ++ mode=0o644 + ) + # Expanded war dir + self.assertResourceCalled('Directory', self.stack_root+'/current/atlas-server/server/webapp', +@@ -80,21 +80,21 @@ + group='hadoop', + create_parents = True, + cd_access='a', +- mode=0644 ++ mode=0o644 + ) + self.assertResourceCalled('Execute', ('cp', '/usr/hdp/current/atlas-server/server/webapp/atlas.war', '/usr/hdp/current/atlas-server/server/webapp/atlas.war'), + sudo = True, + not_if = True, + ) +- host_name = u"c6401.ambari.apache.org" ++ host_name = "c6401.ambari.apache.org" + app_props = dict(self.getConfig()['configurations']['application-properties']) + app_props['atlas.server.bind.address'] = host_name + + metadata_protocol = "https" if app_props["atlas.enableTLS"] is True else "http" + metadata_port = app_props["atlas.server.https.port"] if metadata_protocol == "https" else app_props["atlas.server.http.port"] +- app_props["atlas.rest.address"] = u'%s://%s:%s' % (metadata_protocol, host_name, metadata_port) ++ app_props["atlas.rest.address"] = '{}://{}:{}'.format(metadata_protocol, host_name, metadata_port) + app_props["atlas.server.ids"] = "id1" +- app_props["atlas.server.address.id1"] = u"%s:%s" % (host_name, metadata_port) ++ app_props["atlas.server.address.id1"] = "{}:{}".format(host_name, metadata_port) + app_props["atlas.server.ha.enabled"] = "false" + + self.assertResourceCalled('File', str(self.conf_dir + "/atlas-log4j.xml"), +@@ -103,7 +103,7 @@ + 'atlas-log4j']['content']), + owner='atlas', + group='hadoop', +- mode=0644, ++ mode=0o644, + ) + self.assertResourceCalled('File', str(self.conf_dir + "/atlas-env.sh"), + content=InlineTemplate( +@@ -111,7 +111,7 @@ + 'atlas-env']['content']), + owner='atlas', + group='hadoop', +- mode=0755, ++ mode=0o755, + ) + self.assertResourceCalled('File', str(self.conf_dir + "/solr/solrconfig.xml"), + content=InlineTemplate( +@@ -119,36 +119,36 @@ + 'atlas-solrconfig']['content']), + owner='atlas', + group='hadoop', +- mode=0644, ++ mode=0o644, + ) + # application.properties file + self.assertResourceCalled('PropertiesFile',str(self.conf_dir + "/application.properties"), + properties=app_props, +- owner=u'atlas', +- group=u'hadoop', +- mode=0600, ++ owner='atlas', ++ group='hadoop', ++ mode=0o600, + ) + self.assertResourceCalled('Directory', '/var/log/ambari-infra-solr-client', + create_parents = True, + cd_access='a', +- mode=0755 ++ mode=0o755 + ) + self.assertResourceCalled('Directory', '/usr/lib/ambari-infra-solr-client', + create_parents = True, + recursive_ownership = True, + cd_access='a', +- mode=0755 ++ mode=0o755 + ) + self.assertResourceCalled('File', '/usr/lib/ambari-infra-solr-client/solrCloudCli.sh', + content=StaticFile('/usr/lib/ambari-infra-solr-client/solrCloudCli.sh'), +- mode=0755, ++ mode=0o755, + ) + self.assertResourceCalled('File', '/usr/lib/ambari-infra-solr-client/log4j.properties', + content=self.getConfig()['configurations']['infra-solr-client-log4j']['content'], +- mode=0644, ++ mode=0o644, + ) + self.assertResourceCalled('File', '/var/log/ambari-infra-solr-client/solr-client.log', +- mode=0664, ++ mode=0o664, + content='' + ) + self.assertResourceCalledRegexp('^Execute$', '^ambari-sudo.sh JAVA_HOME=/usr/jdk64/jdk1.7.0_45 /usr/lib/ambari-infra-solr-client/solrCloudCli.sh --zookeeper-connect-string c6401.ambari.apache.org:2181 --znode /infra-solr --check-znode --retry 5 --interval 10') +@@ -158,7 +158,7 @@ + only_if='test -d /tmp/solr_config_atlas_configs_0.[0-9]*') + self.assertResourceCalledRegexp('^Execute$', '^ambari-sudo.sh JAVA_HOME=/usr/jdk64/jdk1.7.0_45 /usr/lib/ambari-infra-solr-client/solrCloudCli.sh --zookeeper-connect-string c6401.ambari.apache.org:2181/infra-solr --upload-config --config-dir /tmp/solr_config_atlas_configs_0.[0-9]* --config-set atlas_configs --retry 30 --interval 5', + only_if='test -d /tmp/solr_config_atlas_configs_0.[0-9]*') +- self.assertResourceCalledRegexp('^Execute$', '^ambari-sudo.sh JAVA_HOME=/usr/jdk64/jdk1.7.0_45 /usr/lib/ambari-infra-solr-client/solrCloudCli.sh --zookeeper-connect-string c6401.ambari.apache.org:2181/infra-solr --upload-config --config-dir {0}/solr --config-set atlas_configs --retry 30 --interval 5'.format(self.conf_dir), ++ self.assertResourceCalledRegexp('^Execute$', '^ambari-sudo.sh JAVA_HOME=/usr/jdk64/jdk1.7.0_45 /usr/lib/ambari-infra-solr-client/solrCloudCli.sh --zookeeper-connect-string c6401.ambari.apache.org:2181/infra-solr --upload-config --config-dir {}/solr --config-set atlas_configs --retry 30 --interval 5'.format(self.conf_dir), + not_if='test -d /tmp/solr_config_atlas_configs_0.[0-9]*') + self.assertResourceCalledRegexp('^Directory$', '^/tmp/solr_config_atlas_configs_0.[0-9]*', + action=['delete'], +@@ -175,7 +175,7 @@ + group='hadoop', + create_parents = True, + cd_access='a', +- mode=0755 ++ mode=0o755 + ) + + # Pid dir +@@ -184,14 +184,14 @@ + group='hadoop', + create_parents = True, + cd_access='a', +- mode=0755 ++ mode=0o755 + ) + self.assertResourceCalled('Directory', self.conf_dir + "/solr", + owner='atlas', + group='hadoop', + create_parents = True, + cd_access='a', +- mode=0755, ++ mode=0o755, + recursive_ownership = True + ) + # Log dir +@@ -200,7 +200,7 @@ + group='hadoop', + create_parents = True, + cd_access='a', +- mode=0755 ++ mode=0o755 + ) + # Data dir + self.assertResourceCalled('Directory', self.stack_root+'/current/atlas-server/data', +@@ -208,7 +208,7 @@ + group='hadoop', + create_parents = True, + cd_access='a', +- mode=0644 ++ mode=0o644 + ) + # Expanded war dir + self.assertResourceCalled('Directory', self.stack_root+'/current/atlas-server/server/webapp', +@@ -216,21 +216,21 @@ + group='hadoop', + create_parents = True, + cd_access='a', +- mode=0644 ++ mode=0o644 + ) + self.assertResourceCalled('Execute', ('cp', self.stack_root+'/current/atlas-server/server/webapp/atlas.war', self.stack_root+'/current/atlas-server/server/webapp/atlas.war'), + sudo = True, + not_if = True, + ) +- host_name = u"c6401.ambari.apache.org" ++ host_name = "c6401.ambari.apache.org" + app_props = dict(self.getConfig()['configurations']['application-properties']) + app_props['atlas.server.bind.address'] = host_name + + metadata_protocol = "https" if app_props["atlas.enableTLS"] is True else "http" + metadata_port = app_props["atlas.server.https.port"] if metadata_protocol == "https" else app_props["atlas.server.http.port"] +- app_props["atlas.rest.address"] = u'%s://%s:%s' % (metadata_protocol, host_name, metadata_port) ++ app_props["atlas.rest.address"] = '{}://{}:{}'.format(metadata_protocol, host_name, metadata_port) + app_props["atlas.server.ids"] = "id1" +- app_props["atlas.server.address.id1"] = u"%s:%s" % (host_name, metadata_port) ++ app_props["atlas.server.address.id1"] = "{}:{}".format(host_name, metadata_port) + app_props["atlas.server.ha.enabled"] = "false" + + self.assertResourceCalled('File', self.conf_dir + "/atlas-log4j.xml", +@@ -239,7 +239,7 @@ + 'atlas-log4j']['content']), + owner='atlas', + group='hadoop', +- mode=0644, ++ mode=0o644, + ) + self.assertResourceCalled('File', self.conf_dir + "/atlas-env.sh", + content=InlineTemplate( +@@ -247,7 +247,7 @@ + 'atlas-env']['content']), + owner='atlas', + group='hadoop', +- mode=0755, ++ mode=0o755, + ) + self.assertResourceCalled('File', self.conf_dir+"/solr/solrconfig.xml", + content=InlineTemplate( +@@ -255,14 +255,14 @@ + 'atlas-solrconfig']['content']), + owner='atlas', + group='hadoop', +- mode=0644, ++ mode=0o644, + ) + # application.properties file + self.assertResourceCalled('PropertiesFile',self.conf_dir + "/application.properties", + properties=app_props, +- owner=u'atlas', +- group=u'hadoop', +- mode=0600, ++ owner='atlas', ++ group='hadoop', ++ mode=0o600, + ) + + self.assertResourceCalled('TemplateConfig', self.conf_dir+"/atlas_jaas.conf", +@@ -272,25 +272,25 @@ + self.assertResourceCalled('Directory', '/var/log/ambari-infra-solr-client', + create_parents = True, + cd_access='a', +- mode=0755 ++ mode=0o755 + ) + + self.assertResourceCalled('Directory', '/usr/lib/ambari-infra-solr-client', + create_parents = True, + recursive_ownership = True, + cd_access='a', +- mode=0755 ++ mode=0o755 + ) + self.assertResourceCalled('File', '/usr/lib/ambari-infra-solr-client/solrCloudCli.sh', + content=StaticFile('/usr/lib/ambari-infra-solr-client/solrCloudCli.sh'), +- mode=0755, ++ mode=0o755, + ) + self.assertResourceCalled('File', '/usr/lib/ambari-infra-solr-client/log4j.properties', + content=self.getConfig()['configurations']['infra-solr-client-log4j']['content'], +- mode=0644, ++ mode=0o644, + ) + self.assertResourceCalled('File', '/var/log/ambari-infra-solr-client/solr-client.log', +- mode=0664, ++ mode=0o664, + content='' + ) + self.assertResourceCalledRegexp('^Execute$', '^ambari-sudo.sh JAVA_HOME=/usr/jdk64/jdk1.7.0_45 /usr/lib/ambari-infra-solr-client/solrCloudCli.sh --zookeeper-connect-string c6401.ambari.apache.org:2181 --znode /infra-solr --check-znode --retry 5 --interval 10') +@@ -300,7 +300,7 @@ + only_if='test -d /tmp/solr_config_atlas_configs_0.[0-9]*') + self.assertResourceCalledRegexp('^Execute$', '^ambari-sudo.sh JAVA_HOME=/usr/jdk64/jdk1.7.0_45 /usr/lib/ambari-infra-solr-client/solrCloudCli.sh --zookeeper-connect-string c6401.ambari.apache.org:2181/infra-solr --jaas-file /usr/hdp/current/atlas-server/conf/atlas_jaas.conf --upload-config --config-dir /tmp/solr_config_atlas_configs_0.[0-9]* --config-set atlas_configs --retry 30 --interval 5', + only_if='test -d /tmp/solr_config_atlas_configs_0.[0-9]*') +- self.assertResourceCalledRegexp('^Execute$', '^ambari-sudo.sh JAVA_HOME=/usr/jdk64/jdk1.7.0_45 /usr/lib/ambari-infra-solr-client/solrCloudCli.sh --zookeeper-connect-string c6401.ambari.apache.org:2181/infra-solr --jaas-file /usr/hdp/current/atlas-server/conf/atlas_jaas.conf --upload-config --config-dir {0}/solr --config-set atlas_configs --retry 30 --interval 5'.format(self.conf_dir), ++ self.assertResourceCalledRegexp('^Execute$', '^ambari-sudo.sh JAVA_HOME=/usr/jdk64/jdk1.7.0_45 /usr/lib/ambari-infra-solr-client/solrCloudCli.sh --zookeeper-connect-string c6401.ambari.apache.org:2181/infra-solr --jaas-file /usr/hdp/current/atlas-server/conf/atlas_jaas.conf --upload-config --config-dir {}/solr --config-set atlas_configs --retry 30 --interval 5'.format(self.conf_dir), + not_if='test -d /tmp/solr_config_atlas_configs_0.[0-9]*') + self.assertResourceCalledRegexp('^Directory$', '^/tmp/solr_config_atlas_configs_0.[0-9]*', + action=['delete'], +@@ -378,7 +378,7 @@ + self.assertResourceCalled('File', str(self.conf_dir+"/hdfs-site.xml"),action = ['delete'],) + self.assertResourceCalled('Directory',self.stack_root + '/current/atlas-server/', owner = 'atlas', group = 'hadoop', recursive_ownership = True, ) + +- self.assertResourceCalled('Execute', 'source {0}/atlas-env.sh ; {1}/current/atlas-server/bin/atlas_start.py'.format(self.conf_dir,self.stack_root), ++ self.assertResourceCalled('Execute', 'source {}/atlas-env.sh ; {}/current/atlas-server/bin/atlas_start.py'.format(self.conf_dir,self.stack_root), + not_if = 'ls /var/run/atlas/atlas.pid >/dev/null 2>&1 && ps -p `cat /var/run/atlas/atlas.pid` >/dev/null 2>&1', + user = 'atlas', + ) +@@ -394,7 +394,7 @@ + stack_version = self.STACK_VERSION, + target = RMFTestCase.TARGET_COMMON_SERVICES + ) +- self.assertResourceCalled('Execute', 'source {0}/atlas-env.sh; {1}/current/atlas-server/bin/atlas_stop.py'.format(self.conf_dir,self.stack_root), ++ self.assertResourceCalled('Execute', 'source {}/atlas-env.sh; {}/current/atlas-server/bin/atlas_stop.py'.format(self.conf_dir,self.stack_root), + user = 'atlas', + ) + self.assertResourceCalled('File', '/var/run/atlas/atlas.pid', +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.3/ATLAS/test_service_check.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.3/ATLAS/test_service_check.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.3/ATLAS/test_service_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.3/ATLAS/test_service_check.py 2022-07-11 00:52:31.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.3/common/test_stack_advisor.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.3/common/test_stack_advisor.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.3/common/test_stack_advisor.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.3/common/test_stack_advisor.py 2022-07-11 00:52:31.000000000 +0800 +@@ -20,7 +20,7 @@ + import os + import socket + from unittest import TestCase +-from mock.mock import patch ++from unittest.mock import patch + import unittest + + class TestHDP23StackAdvisor(TestCase): +@@ -76,7 +76,7 @@ + @patch('__builtin__.open') + @patch('os.path.exists') + def get_system_min_uid_magic(self, exists_mock, open_mock): +- class MagicFile(object): ++ class MagicFile: + def read(self): + return """ + #test line UID_MIN 200 +@@ -109,12 +109,12 @@ + + sparkTS = [component["StackServiceComponents"]["hostnames"] for component in componentsList if component["StackServiceComponents"]["component_name"] == "SPARK_THRIFTSERVER"] + hiveMetaStore = [component["StackServiceComponents"]["hostnames"] for component in componentsList if component["StackServiceComponents"]["component_name"] == "HIVE_METASTORE"] +- self.assertEquals(len(sparkTS), 1) +- self.assertEquals(len(hiveMetaStore), 0) ++ self.assertEqual(len(sparkTS), 1) ++ self.assertEqual(len(hiveMetaStore), 0) + + validations = self.stackAdvisor.getComponentLayoutValidations(services, hosts) + expected = {'component-name': 'SPARK_THRIFTSERVER', 'message': 'Spark Thrift Server requires HIVE_METASTORE to be present in the cluster.', 'type': 'host-component', 'level': 'ERROR'} +- self.assertEquals(validations[0], expected) ++ self.assertEqual(validations[0], expected) + + + @patch('socket.getfqdn', side_effect=fqdn_mock_result) +@@ -128,11 +128,11 @@ + + sparkTS = [component["StackServiceComponents"]["hostnames"] for component in componentsList if component["StackServiceComponents"]["component_name"] == "SPARK_THRIFTSERVER"] + hiveMetaStore = [component["StackServiceComponents"]["hostnames"] for component in componentsList if component["StackServiceComponents"]["component_name"] == "HIVE_METASTORE"] +- self.assertEquals(len(sparkTS), 1) +- self.assertEquals(len(hiveMetaStore), 1) ++ self.assertEqual(len(sparkTS), 1) ++ self.assertEqual(len(hiveMetaStore), 1) + + validations = self.stackAdvisor.getComponentLayoutValidations(services, hosts) +- self.assertEquals(len(validations), 0) ++ self.assertEqual(len(validations), 0) + + + def test_recommendHDFSConfigurations(self): +@@ -185,14 +185,14 @@ + + # Test with Ranger HDFS plugin disabled + self.stackAdvisor.recommendHDFSConfigurations(configurations, clusterData, services, hosts) +- self.assertEquals(configurations['hdfs-site']['property_attributes']['dfs.namenode.inode.attributes.provider.class'], {'delete': 'true'}, "Test with Ranger HDFS plugin is disabled") ++ self.assertEqual(configurations['hdfs-site']['property_attributes']['dfs.namenode.inode.attributes.provider.class'], {'delete': 'true'}, "Test with Ranger HDFS plugin is disabled") + + # Test with Ranger HDFS plugin is enabled + configurations['hdfs-site']['properties'] = {} + configurations['hdfs-site']['property_attributes'] = {} + services['configurations']['ranger-hdfs-plugin-properties']['properties']['ranger-hdfs-plugin-enabled'] = 'Yes' + self.stackAdvisor.recommendHDFSConfigurations(configurations, clusterData, services, hosts) +- self.assertEquals(configurations['hdfs-site']['properties']['dfs.namenode.inode.attributes.provider.class'], 'org.apache.ranger.authorization.hadoop.RangerHdfsAuthorizer', "Test with Ranger HDFS plugin is enabled") ++ self.assertEqual(configurations['hdfs-site']['properties']['dfs.namenode.inode.attributes.provider.class'], 'org.apache.ranger.authorization.hadoop.RangerHdfsAuthorizer', "Test with Ranger HDFS plugin is enabled") + + def test_recommendYARNConfigurations(self): + configurations = {} +@@ -256,14 +256,14 @@ + clusterData = self.stackAdvisor.getConfigurationClusterSummary(servicesList, hosts, components, None) + # Test with Ranger YARN plugin disabled + self.stackAdvisor.recommendYARNConfigurations(configurations, clusterData, services, None) +- self.assertEquals(configurations['yarn-site']['property_attributes']['yarn.authorization-provider'], {'delete': 'true'}, "Test with Ranger HDFS plugin is disabled") ++ self.assertEqual(configurations['yarn-site']['property_attributes']['yarn.authorization-provider'], {'delete': 'true'}, "Test with Ranger HDFS plugin is disabled") + + # Test with Ranger YARN plugin is enabled + configurations['yarn-site']['properties'] = {} + configurations['yarn-site']['property_attributes'] = {} + services['configurations']['ranger-yarn-plugin-properties']['properties']['ranger-yarn-plugin-enabled'] = 'Yes' + self.stackAdvisor.recommendYARNConfigurations(configurations, clusterData, services, None) +- self.assertEquals(configurations['yarn-site']['properties']['yarn.authorization-provider'], 'org.apache.ranger.authorization.yarn.authorizer.RangerYarnAuthorizer', "Test with Ranger YARN plugin enabled") ++ self.assertEqual(configurations['yarn-site']['properties']['yarn.authorization-provider'], 'org.apache.ranger.authorization.yarn.authorizer.RangerYarnAuthorizer', "Test with Ranger YARN plugin enabled") + + + def test_recommendKAFKAConfigurations(self): +@@ -360,7 +360,7 @@ + # Test authorizer.class.name with Ranger Kafka plugin disabled in non-kerberos environment + services['configurations']['cluster-env']['properties']['security_enabled'] = "false" + self.stackAdvisor.recommendKAFKAConfigurations(configurations, clusterData, services, None) +- self.assertEquals(configurations['kafka-broker']['property_attributes']['authorizer.class.name'], {'delete': 'true'}, "Test authorizer.class.name with Ranger Kafka plugin is disabled in non-kerberos environment") ++ self.assertEqual(configurations['kafka-broker']['property_attributes']['authorizer.class.name'], {'delete': 'true'}, "Test authorizer.class.name with Ranger Kafka plugin is disabled in non-kerberos environment") + + # Test authorizer.class.name with Ranger Kafka plugin disabled in kerberos environment + services['configurations']['cluster-env']['properties']['security_enabled'] = "true" +@@ -369,7 +369,7 @@ + services['configurations']['kafka-broker']['properties']['security.inter.broker.protocol'] = 'PLAINTEXTSASL' + services['configurations']['kafka-broker']['properties']['authorizer.class.name'] = 'org.apache.ranger.authorization.kafka.authorizer.RangerKafkaAuthorizer' + self.stackAdvisor.recommendKAFKAConfigurations(configurations, clusterData, services, None) +- self.assertEquals(configurations['kafka-broker']['properties']['authorizer.class.name'], 'kafka.security.auth.SimpleAclAuthorizer' , "Test authorizer.class.name with Ranger Kafka plugin disabled in kerberos environment") ++ self.assertEqual(configurations['kafka-broker']['properties']['authorizer.class.name'], 'kafka.security.auth.SimpleAclAuthorizer' , "Test authorizer.class.name with Ranger Kafka plugin disabled in kerberos environment") + + # Advise 'PLAINTEXTSASL' for secure cluster by default + services['configurations']['cluster-env']['properties']['security_enabled'] = "true" +@@ -395,7 +395,7 @@ + services['configurations']['kafka-broker']['properties']['authorizer.class.name'] = 'kafka.security.auth.SimpleAclAuthorizer' + services['configurations']['ranger-kafka-plugin-properties']['properties']['ranger-kafka-plugin-enabled'] = 'Yes' + self.stackAdvisor.recommendKAFKAConfigurations(configurations, clusterData, services, None) +- self.assertEquals(configurations['kafka-broker']['properties']['authorizer.class.name'], 'org.apache.ranger.authorization.kafka.authorizer.RangerKafkaAuthorizer', "Test authorizer.class.name with Ranger Kafka plugin enabled in kerberos environment") ++ self.assertEqual(configurations['kafka-broker']['properties']['authorizer.class.name'], 'org.apache.ranger.authorization.kafka.authorizer.RangerKafkaAuthorizer', "Test authorizer.class.name with Ranger Kafka plugin enabled in kerberos environment") + + services['configurations']['cluster-env']['properties']['security_enabled'] = "false" + configurations['kafka-broker']['properties'] = {} +@@ -404,8 +404,8 @@ + services['configurations']['kafka-broker']['properties']['authorizer.class.name'] = 'kafka.security.auth.SimpleAclAuthorizer' + services['configurations']['ranger-kafka-plugin-properties']['properties']['ranger-kafka-plugin-enabled'] = 'Yes' + self.stackAdvisor.recommendKAFKAConfigurations(configurations, clusterData, services, None) +- self.assertEquals(configurations['kafka-broker']['properties']['authorizer.class.name'], 'org.apache.ranger.authorization.kafka.authorizer.RangerKafkaAuthorizer', "Test authorizer.class.name with Ranger Kafka plugin enabled in kerberos environment") +- self.assertEquals(configurations['ranger-kafka-plugin-properties']['properties']['zookeeper.connect'], 'host1:2181') ++ self.assertEqual(configurations['kafka-broker']['properties']['authorizer.class.name'], 'org.apache.ranger.authorization.kafka.authorizer.RangerKafkaAuthorizer', "Test authorizer.class.name with Ranger Kafka plugin enabled in kerberos environment") ++ self.assertEqual(configurations['ranger-kafka-plugin-properties']['properties']['zookeeper.connect'], 'host1:2181') + self.assertTrue('security.inter.broker.protocol' not in configurations['kafka-broker']['properties']) + + # Test kafka-log4j content when Ranger plugin for Kafka is enabled +@@ -417,7 +417,7 @@ + "=org.apache.log4j.PatternLayout\nlog4j.appender.rangerAppender.layout.ConversionPattern=%d{ISO8601} %p [%t] %C{6} (%F:%L) - %m%n\n" \ + "log4j.logger.org.apache.ranger=INFO, rangerAppender" + expectedLog4jContent = log4jContent + newRangerLog4content +- self.assertEquals(configurations['kafka-log4j']['properties']['content'], expectedLog4jContent, "Test kafka-log4j content when Ranger plugin for Kafka is enabled") ++ self.assertEqual(configurations['kafka-log4j']['properties']['content'], expectedLog4jContent, "Test kafka-log4j content when Ranger plugin for Kafka is enabled") + + # Test kafka.metrics.reporters when AMBARI_METRICS is present in services + self.stackAdvisor.recommendKAFKAConfigurations(configurations, clusterData, services, None) +@@ -580,7 +580,7 @@ + + # Test + self.stackAdvisor.recommendHBASEConfigurations(configurations, clusterData, services, None) +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + + # Test + clusterData['hbaseRam'] = '4' +@@ -591,16 +591,16 @@ + expected["hbase-env"]["properties"]["hbase_master_heapsize"] = "1024" + expected["hbase-env"]["properties"]["hbase_regionserver_heapsize"] = "4096" + self.stackAdvisor.recommendHBASEConfigurations(configurations, clusterData, services, None) +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + + # Test - default recommendations should have certain configs deleted. HAS TO BE LAST TEST. + services["configurations"] = {"hbase-site": {"properties": {"phoenix.functions.allowUserDefinedFunctions": '', "hbase.rpc.controllerfactory.class": '', "hbase.region.server.rpc.scheduler.factory.class": ''}}} + configurations = {} + self.stackAdvisor.recommendHBASEConfigurations(configurations, clusterData, services, None) +- self.assertEquals(configurations['hbase-site']['property_attributes']['phoenix.functions.allowUserDefinedFunctions'], {'delete': 'true'}) +- self.assertEquals(configurations['hbase-site']['property_attributes']['hbase.rpc.controllerfactory.class'], {'delete': 'true'}) +- self.assertEquals(configurations['hbase-site']['property_attributes']['hbase.region.server.rpc.scheduler.factory.class'], {'delete': 'true'}) +- self.assertEquals(configurations['hbase-site']['properties']['hbase.regionserver.wal.codec'], "org.apache.hadoop.hbase.regionserver.wal.WALCellCodec") ++ self.assertEqual(configurations['hbase-site']['property_attributes']['phoenix.functions.allowUserDefinedFunctions'], {'delete': 'true'}) ++ self.assertEqual(configurations['hbase-site']['property_attributes']['hbase.rpc.controllerfactory.class'], {'delete': 'true'}) ++ self.assertEqual(configurations['hbase-site']['property_attributes']['hbase.region.server.rpc.scheduler.factory.class'], {'delete': 'true'}) ++ self.assertEqual(configurations['hbase-site']['properties']['hbase.regionserver.wal.codec'], "org.apache.hadoop.hbase.regionserver.wal.WALCellCodec") + + + def test_recommendHiveConfigurations(self): +@@ -861,24 +861,24 @@ + } + + self.stackAdvisor.recommendHIVEConfigurations(configurations, clusterData, services, hosts) +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + + # Test JDK1.7 + services['ambari-server-properties'] = {'java.home': '/usr/jdk64/jdk1.7.3_23'} + self.stackAdvisor.recommendHIVEConfigurations(configurations, clusterData, services, hosts) +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + + # Test JDK1.8 + services['ambari-server-properties'] = {'java.home': '/usr/jdk64/jdk1.8_44'} + expected['hive-site']['properties']['hive.tez.java.opts'] = "-server -Djava.net.preferIPv4Stack=true -XX:NewRatio=8 -XX:+UseNUMA -XX:+UseG1GC -XX:+ResizeTLAB -XX:+PrintGCDetails -verbose:gc -XX:+PrintGCTimeStamps" + self.stackAdvisor.recommendHIVEConfigurations(configurations, clusterData, services, hosts) +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + + # Test JDK1.9 + services['ambari-server-properties'] = {'java.home': '/usr/jdk64/jdk1.9.2_44'} + expected['hive-site']['properties']['hive.tez.java.opts'] = "-server -Djava.net.preferIPv4Stack=true -XX:NewRatio=8 -XX:+UseNUMA -XX:+UseG1GC -XX:+ResizeTLAB -XX:+PrintGCDetails -verbose:gc -XX:+PrintGCTimeStamps" + self.stackAdvisor.recommendHIVEConfigurations(configurations, clusterData, services, hosts) +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + + def test_recommendHiveConfigurations_with_atlas(self): + self.maxDiff = None +@@ -1162,7 +1162,7 @@ + } + + self.stackAdvisor.recommendHIVEConfigurations(configurations, clusterData, services, hosts) +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + + @patch('os.path.exists') + @patch('os.path.isdir') +@@ -1346,7 +1346,7 @@ + } + + self.stackAdvisor.recommendTezConfigurations(configurations, clusterData, services, hosts) +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + + server_host = socket.getfqdn() + for host in hosts["items"]: +@@ -1358,7 +1358,7 @@ + services['ambari-server-properties'] = {'java.home': '/usr/jdk64/jdk1.7.3_23'} + expected['tez-site']['properties']['tez.tez-ui.history-url.base'] = tez_ui_url + self.stackAdvisor.recommendTezConfigurations(configurations, clusterData, services, hosts) +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + + # Test JDK1.8 + services['ambari-server-properties'] = {'java.home': '/usr/jdk64/jdk1.8_44'} +@@ -1366,7 +1366,7 @@ + expected['tez-site']['properties']['tez.task.launch.cmd-opts'] = "-XX:+PrintGCDetails -verbose:gc -XX:+PrintGCTimeStamps -XX:+UseNUMA -XX:+UseG1GC -XX:+ResizeTLAB" + expected['tez-site']['properties']['tez.tez-ui.history-url.base'] = tez_ui_url + self.stackAdvisor.recommendTezConfigurations(configurations, clusterData, services, hosts) +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + + # Test JDK1.9 + services['ambari-server-properties'] = {'java.home': '/usr/jdk64/jdk1.9.2_44'} +@@ -1374,7 +1374,7 @@ + expected['tez-site']['properties']['tez.task.launch.cmd-opts'] = "-XX:+PrintGCDetails -verbose:gc -XX:+PrintGCTimeStamps -XX:+UseNUMA -XX:+UseG1GC -XX:+ResizeTLAB" + expected['tez-site']['properties']['tez.tez-ui.history-url.base'] = tez_ui_url + self.stackAdvisor.recommendTezConfigurations(configurations, clusterData, services, hosts) +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + + def test_validateHiveConfigurations(self): + properties = {"hive_security_authorization": "None", +@@ -1400,7 +1400,7 @@ + # Test for 'ranger-hive-plugin-properties' not being in configs + res_expected = [] + res = self.stackAdvisor.validateHiveConfigurations(properties, recommendedDefaults, configurations, services, {}) +- self.assertEquals(res, res_expected) ++ self.assertEqual(res, res_expected) + + # This test intentionally calls all validate methods with + # incorrect parameters (empty configs) +@@ -1460,10 +1460,10 @@ + validators = self.stackAdvisor.getServiceConfigurationValidators() + + # Setting up empty configs and services info +- for serviceName, validator in validators.items(): ++ for serviceName, validator in list(validators.items()): + services["services"].extend([{"StackServices": {"service_name": serviceName}, + "components": []}]) +- for siteName in validator.keys(): ++ for siteName in list(validator.keys()): + configurations[siteName] = {"properties": {}} + + # Emulate enabled RANGER +@@ -1603,7 +1603,7 @@ + + recommendedConfigurations = {} + self.stackAdvisor.recommendRangerConfigurations(recommendedConfigurations, clusterData, services, None) +- self.assertEquals(recommendedConfigurations, expected) ++ self.assertEqual(recommendedConfigurations, expected) + + # Recommend ranger.audit.solr.zookeepers when solrCloud is disabled + services['configurations']['ranger-env'] = { +@@ -1614,7 +1614,7 @@ + + recommendedConfigurations = {} + self.stackAdvisor.recommendRangerConfigurations(recommendedConfigurations, clusterData, services, None) +- self.assertEquals(recommendedConfigurations['ranger-admin-site']['properties']['ranger.audit.solr.zookeepers'], 'NONE') ++ self.assertEqual(recommendedConfigurations['ranger-admin-site']['properties']['ranger.audit.solr.zookeepers'], 'NONE') + + def test_recommendRangerKMSConfigurations(self): + clusterData = {} +@@ -1709,7 +1709,7 @@ + # non kerberized cluster. There should be no proxyuser configs + recommendedConfigurations = {} + self.stackAdvisor.recommendRangerKMSConfigurations(recommendedConfigurations, clusterData, services, None) +- self.assertEquals(recommendedConfigurations, expected) ++ self.assertEqual(recommendedConfigurations, expected) + + # kerberized cluster + services['services'].append({ +@@ -1757,7 +1757,7 @@ + # on kerberized cluster property should be recommended + recommendedConfigurations = {} + self.stackAdvisor.recommendRangerKMSConfigurations(recommendedConfigurations, clusterData, services, None) +- self.assertEquals(recommendedConfigurations, expected) ++ self.assertEqual(recommendedConfigurations, expected) + + recommendedConfigurations = {} + services['changed-configurations'] = [ +@@ -1782,7 +1782,7 @@ + + # kms_user was changed, old property should be removed + self.stackAdvisor.recommendRangerKMSConfigurations(recommendedConfigurations, clusterData, services, None) +- self.assertEquals(recommendedConfigurations, expected) ++ self.assertEqual(recommendedConfigurations, expected) + + def test_recommendStormConfigurations(self): + self.maxDiff = None +@@ -1893,16 +1893,16 @@ + } + + self.stackAdvisor.recommendStormConfigurations(configurations, clusterData, services, hosts) +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + + services['ambari-server-properties'] = {'java.home': '/usr/jdk64/jdk1.7.3_23'} + self.stackAdvisor.recommendStormConfigurations(configurations, clusterData, services, hosts) +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + + services["services"] = [] + services["configurations"]["storm-site"]["properties"]["storm.topology.submission.notifier.plugin.class"] = "org.apache.atlas.storm.hook.StormAtlasHook" + self.stackAdvisor.recommendStormConfigurations(configurations, clusterData, services, hosts) +- self.assertEquals(True, "storm.topology.submission.notifier.plugin.class" in configurations["storm-site"]["property_attributes"]) ++ self.assertEqual(True, "storm.topology.submission.notifier.plugin.class" in configurations["storm-site"]["property_attributes"]) + + def test_recommendSqoopConfigurations(self): + self.maxDiff = None +@@ -1994,11 +1994,11 @@ + } + + self.stackAdvisor.recommendSqoopConfigurations(configurations, clusterData, services, hosts) +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + + services['ambari-server-properties'] = {'java.home': '/usr/jdk64/jdk1.7.3_23'} + self.stackAdvisor.recommendSqoopConfigurations(configurations, clusterData, services, hosts) +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + + def test_validateRangerConfigurationsEnv(self): + properties = { +@@ -2037,11 +2037,11 @@ + # Test with ranger plugin enabled, validation fails + res_expected = [{'config-type': 'ranger-env', 'message': 'Ranger Kafka plugin should not be enabled in non-kerberos environment.', 'type': 'configuration', 'config-name': 'ranger-kafka-plugin-enabled', 'level': 'WARN'}] + res = self.stackAdvisor.validateRangerConfigurationsEnv(properties, recommendedDefaults, configurations, services, {}) +- self.assertEquals(res, res_expected) ++ self.assertEqual(res, res_expected) + + # Test for security_enabled is true + services['configurations']['cluster-env']['properties']['security_enabled'] = "true" + configurations['cluster-env']['properties']['security_enabled'] = "true" + res_expected = [] + res = self.stackAdvisor.validateRangerConfigurationsEnv(properties, recommendedDefaults, configurations, services, {}) +- self.assertEquals(res, res_expected) ++ self.assertEqual(res, res_expected) +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.3/MAHOUT/test_mahout_client.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.3/MAHOUT/test_mahout_client.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.3/MAHOUT/test_mahout_client.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.3/MAHOUT/test_mahout_client.py 2022-07-11 00:52:31.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +@@ -49,7 +49,7 @@ + self.assertResourceCalled('XmlConfig', 'yarn-site.xml', + owner = "yarn", + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + conf_dir = '/usr/hdp/2.2.1.0-2067/hadoop/conf', + configurations = self.getConfig()['configurations']['yarn-site'], + configuration_attributes = self.getConfig()['configurationAttributes']['yarn-site'] +@@ -60,13 +60,13 @@ + content = self.getConfig()['configurations']['mahout-log4j']['content'], + owner = 'mahout', + group = 'hadoop', +- mode = 0644 ) ++ mode = 0o644 ) + + self.assertNoMoreResources() + + def test_pre_upgrade_restart(self): + config_file = self.get_src_folder() + "/test/python/stacks/2.2/configs/default.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + version = '2.2.1.0-3242' + json_content['commandParams']['version'] = version +@@ -84,7 +84,7 @@ + + def test_pre_upgrade_restart_23(self): + config_file = self.get_src_folder() + "/test/python/stacks/2.2/configs/default.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + + version = '2.3.0.0-1234' +@@ -111,5 +111,5 @@ + + import sys + +- self.assertEquals("/usr/hdp/2.3.0.0-1234/hadoop/conf", ++ self.assertEqual("/usr/hdp/2.3.0.0-1234/hadoop/conf", + sys.modules["params"].hadoop_conf_dir) +\ 文件尾没有换行符 +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.3/MAHOUT/test_mahout_service_check.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.3/MAHOUT/test_mahout_service_check.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.3/MAHOUT/test_mahout_service_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.3/MAHOUT/test_mahout_service_check.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 @@ + + self.assertResourceCalled('File', '/tmp/sample-mahout-test.txt', + content = 'Test text which will be converted to sequence file.', +- mode = 0755, ++ mode = 0o755, + ) + self.maxDiff=None + self.assertResourceCalled('HdfsResource', '/user/ambari-qa', +@@ -50,7 +50,7 @@ + kinit_path_local = '/usr/bin/kinit', + user = 'hdfs', + dfs_type = '', +- mode = 0770, ++ mode = 0o770, + owner = 'ambari-qa', + action = ['create_on_execute'], hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', hdfs_site=self.getConfig()['configurations']['hdfs-site'], principal_name=UnknownConfigurationMock(), default_fs='hdfs://c6401.ambari.apache.org:8020', + hadoop_conf_dir = '/usr/hdp/2.2.1.0-2067/hadoop/conf', +@@ -109,7 +109,7 @@ + self.assertResourceCalled('Execute', 'mahout seqdirectory --input /user/ambari-qa/mahoutsmokeinput/' + 'sample-mahout-test.txt --output /user/ambari-qa/mahoutsmokeoutput/ ' + '--charset utf-8', +- environment = {'JAVA_HOME': u'/usr/jdk64/jdk1.7.0_45', ++ environment = {'JAVA_HOME': '/usr/jdk64/jdk1.7.0_45', + 'MAHOUT_HOME': '/usr/hdp/current/mahout-client'}, + path = ['/usr/sbin:/sbin:/usr/local/bin:/bin:/usr/bin'], + tries = 3, +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.3/SPARK/test_spark_thrift_server.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.3/SPARK/test_spark_thrift_server.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.3/SPARK/test_spark_thrift_server.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.3/SPARK/test_spark_thrift_server.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 json +-from mock.mock import MagicMock, patch ++from unittest.mock import MagicMock, patch + from stacks.utils.RMFTestCase import * + + from only_for_platform import not_for_platform, PLATFORM_WINDOWS +@@ -57,7 +57,7 @@ + ) + self.assert_configure_default() + self.assertResourceCalled('Execute', '/usr/hdp/current/spark-client/sbin/start-thriftserver.sh --properties-file /usr/hdp/current/spark-client/conf/spark-thrift-sparkconf.conf --driver-memory 1g', +- environment = {'JAVA_HOME': u'/usr/jdk64/jdk1.7.0_45'}, ++ environment = {'JAVA_HOME': '/usr/jdk64/jdk1.7.0_45'}, + not_if = 'ls /var/run/spark/spark-hive-org.apache.spark.sql.hive.thriftserver.HiveThriftServer2-1.pid >/dev/null 2>&1 && ps -p `cat /var/run/spark/spark-hive-org.apache.spark.sql.hive.thriftserver.HiveThriftServer2-1.pid` >/dev/null 2>&1', + user = 'hive', + ) +@@ -72,7 +72,7 @@ + target = RMFTestCase.TARGET_COMMON_SERVICES + ) + self.assertResourceCalled('Execute', '/usr/hdp/current/spark-client/sbin/stop-thriftserver.sh', +- environment = {'JAVA_HOME': u'/usr/jdk64/jdk1.7.0_45'}, ++ environment = {'JAVA_HOME': '/usr/jdk64/jdk1.7.0_45'}, + user = 'hive', + ) + self.assertResourceCalled('File', '/var/run/spark/spark-hive-org.apache.spark.sql.hive.thriftserver.HiveThriftServer2-1.pid', +@@ -85,14 +85,14 @@ + owner = 'spark', + group = 'hadoop', + create_parents = True, +- mode = 0775, ++ mode = 0o775, + cd_access = 'a', + ) + self.assertResourceCalled('Directory', '/var/log/spark', + owner = 'spark', + group = 'hadoop', + create_parents = True, +- mode = 0775, ++ mode = 0o775, + cd_access = 'a', + ) + self.assertResourceCalled('HdfsResource', '/user/spark', +@@ -101,7 +101,7 @@ + hadoop_bin_dir = '/usr/hdp/2.3.2.0-2067/hadoop/bin', + keytab = UnknownConfigurationMock(), + default_fs = 'hdfs://c6401.ambari.apache.org:8020', +- hdfs_site = {u'a': u'b'}, ++ hdfs_site = {'a': 'b'}, + kinit_path_local = '/usr/bin/kinit', + principal_name = UnknownConfigurationMock(), + user = 'hdfs', +@@ -110,7 +110,7 @@ + type = 'directory', + action = ['create_on_execute'], hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', + dfs_type = '', +- mode = 0775, ++ mode = 0o775, + ) + self.assertResourceCalled('HdfsResource', None, + immutable_paths = self.DEFAULT_IMMUTABLE_PATHS, +@@ -118,7 +118,7 @@ + hadoop_bin_dir = '/usr/hdp/2.3.2.0-2067/hadoop/bin', + keytab = UnknownConfigurationMock(), + default_fs = 'hdfs://c6401.ambari.apache.org:8020', +- hdfs_site = {u'a': u'b'}, ++ hdfs_site = {'a': 'b'}, + kinit_path_local = '/usr/bin/kinit', + principal_name = UnknownConfigurationMock(), + user = 'hdfs', +@@ -131,49 +131,49 @@ + key_value_delimiter = ' ', + group = 'spark', + properties = self.getConfig()['configurations']['spark-defaults'], +- mode = 0644 ++ mode = 0o644 + ) + self.assertResourceCalled('File', '/usr/hdp/current/spark-client/conf/spark-env.sh', + content = InlineTemplate(self.getConfig()['configurations']['spark-env']['content']), + owner = 'spark', + group = 'spark', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/usr/hdp/current/spark-client/conf/log4j.properties', + content = '\n# Set everything to be logged to the console\nlog4j.rootCategory=INFO, console\nlog4j.appender.console=org.apache.log4j.ConsoleAppender\nlog4j.appender.console.target=System.err\nlog4j.appender.console.layout=org.apache.log4j.PatternLayout\nlog4j.appender.console.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{1}: %m%n\n\n# Settings to quiet third party logs that are too verbose\nlog4j.logger.org.eclipse.jetty=WARN\nlog4j.logger.org.eclipse.jetty.util.component.AbstractLifeCycle=ERROR\nlog4j.logger.org.apache.spark.repl.SparkIMain$exprTyper=INFO\nlog4j.logger.org.apache.spark.repl.SparkILoop$SparkILoopInterpreter=INFO', + owner = 'spark', + group = 'spark', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/usr/hdp/current/spark-client/conf/metrics.properties', + content = InlineTemplate(self.getConfig()['configurations']['spark-metrics-properties']['content']), + owner = 'spark', + group = 'spark', +- mode = 0644 ++ mode = 0o644 + ) + self.assertResourceCalled('Directory', '/usr/hdp/current/spark-client/logs', + owner = 'spark', + group = 'spark', +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('PropertiesFile', '/usr/hdp/current/spark-client/conf/spark-thrift-sparkconf.conf', + key_value_delimiter = ' ', + owner = 'hive', + group = 'hadoop', + properties = self.getConfig()['configurations']['spark-thrift-sparkconf'], +- mode = 0644 ++ mode = 0o644 + ) + self.assertResourceCalled('File', '/usr/hdp/current/spark-client/conf/java-opts', + content = InlineTemplate(' -Dhdp.version=None'), + owner = 'spark', + group = 'spark', +- mode = 0644 ++ mode = 0o644 + ) + + @patch("resource_management.libraries.functions.copy_tarball.copy_to_hdfs") + def test_pre_upgrade_restart_23(self, copy_to_hdfs_mock): + config_file = self.get_src_folder()+"/test/python/stacks/2.2/configs/default.json" +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + version = '2.3.2.0-1234' + json_content['commandParams']['version'] = version +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.3/STORM/test_service_check.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.3/STORM/test_service_check.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.3/STORM/test_service_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.3/STORM/test_service_check.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 mock.mock import MagicMock, patch ++from unittest.mock import MagicMock, patch + from stacks.utils.RMFTestCase import * + import resource_management.libraries.functions + from test_storm_base import TestStormBase +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.3/STORM/test_storm_base.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.3/STORM/test_storm_base.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.3/STORM/test_storm_base.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.3/STORM/test_storm_base.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 @@ + self.assertResourceCalled('Directory', '/var/log/storm', + owner = 'storm', + group = 'hadoop', +- mode = 0777, ++ mode = 0o777, + create_parents = True, + cd_access='a', + ) +@@ -72,7 +72,7 @@ + self.assertResourceCalled('Directory', '/var/log/storm', + owner = 'storm', + group = 'hadoop', +- mode = 0777, ++ mode = 0o777, + create_parents = True, + cd_access='a', + ) +@@ -108,7 +108,7 @@ + ) + self.assertResourceCalled('TemplateConfig', confDir + '/storm_jaas.conf', + owner = 'storm', +- mode = 0644, ++ mode = 0o644, + ) + return storm_yarn_content + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.3/STORM/test_storm_upgrade.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.3/STORM/test_storm_upgrade.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.3/STORM/test_storm_upgrade.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.3/STORM/test_storm_upgrade.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 +-from mock.mock import MagicMock, call, patch ++from unittest.mock import MagicMock, call, patch + from stacks.utils.RMFTestCase import * + + +@@ -30,7 +30,7 @@ + def test_delete_zookeeper_data(self): + config_file = self.get_src_folder()+"/test/python/stacks/2.3/configs/storm_default.json" + +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + + version = '2.3.0.0-1234' +@@ -61,7 +61,7 @@ + """ + config_file = self.get_src_folder()+"/test/python/stacks/2.3/configs/storm_default_secure.json" + +- with open(config_file, "r") as f: ++ with open(config_file) as f: + json_content = json.load(f) + + version = '2.3.0.0-1234' +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.3/YARN/test_ats_1_5.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.3/YARN/test_ats_1_5.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.3/YARN/test_ats_1_5.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.3/YARN/test_ats_1_5.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 mock.mock import MagicMock, call, patch ++from unittest.mock import MagicMock, call, patch + from stacks.utils.RMFTestCase import * + from resource_management.libraries.functions import version + from resource_management.libraries.script.script import Script +@@ -122,7 +122,7 @@ + hadoop_conf_dir = '/etc/hadoop/conf', + type = 'directory', + action = ['create_on_execute'], hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('HdfsResource', '/ats/done', + immutable_paths = self.DEFAULT_IMMUTABLE_PATHS, +@@ -140,7 +140,7 @@ + hadoop_conf_dir = '/etc/hadoop/conf', + type = 'directory', + action = ['create_on_execute'], hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', +- mode = 0700, ++ mode = 0o700, + ) + self.assertResourceCalled('HdfsResource', '/ats', + immutable_paths = self.DEFAULT_IMMUTABLE_PATHS, +@@ -159,7 +159,7 @@ + hadoop_conf_dir = '/etc/hadoop/conf', + type = 'directory', + action = ['create_on_execute'], hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('HdfsResource', '/ats/active', + immutable_paths = self.DEFAULT_IMMUTABLE_PATHS, +@@ -177,7 +177,7 @@ + hadoop_conf_dir = '/etc/hadoop/conf', + type = 'directory', + action = ['create_on_execute'], hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', +- mode = 01777, ++ mode = 0o1777, + ) + self.assertResourceCalled('HdfsResource', None, + immutable_paths = self.DEFAULT_IMMUTABLE_PATHS, +@@ -196,82 +196,82 @@ + self.assertResourceCalled('XmlConfig', 'core-site.xml', + group = 'hadoop', + conf_dir = '/etc/hadoop/conf', +- mode = 0644, +- configuration_attributes = {u'final': {u'hadoop.proxyuser.hive.groups': u'true', +- u'hadoop.proxyuser.oozie.hosts': u'true', +- u'webinterface.private.actions': u'true'}}, ++ mode = 0o644, ++ configuration_attributes = {'final': {'hadoop.proxyuser.hive.groups': 'true', ++ 'hadoop.proxyuser.oozie.hosts': 'true', ++ 'webinterface.private.actions': 'true'}}, + owner = 'hdfs', + configurations = self.getConfig()['configurations']['core-site'], + ) + self.assertResourceCalled('XmlConfig', 'hdfs-site.xml', + group = 'hadoop', + conf_dir = '/etc/hadoop/conf', +- mode = 0644, +- configuration_attributes = {u'final': {u'dfs.cluster.administrators': u'true', +- u'dfs.support.append': u'true', +- u'dfs.web.ugi': u'true'}}, ++ mode = 0o644, ++ configuration_attributes = {'final': {'dfs.cluster.administrators': 'true', ++ 'dfs.support.append': 'true', ++ 'dfs.web.ugi': 'true'}}, + owner = 'hdfs', + configurations = self.getConfig()['configurations']['hdfs-site'], + ) + self.assertResourceCalled('XmlConfig', 'mapred-site.xml', + group = 'hadoop', + conf_dir = '/etc/hadoop/conf', +- mode = 0644, +- configuration_attributes = {u'final': {u'mapred.healthChecker.script.path': u'true', +- u'mapreduce.jobtracker.staging.root.dir': u'true'}}, ++ mode = 0o644, ++ configuration_attributes = {'final': {'mapred.healthChecker.script.path': 'true', ++ 'mapreduce.jobtracker.staging.root.dir': 'true'}}, + owner = 'yarn', + configurations = self.getConfig()['configurations']['mapred-site'], + ) + self.assertResourceCalled('XmlConfig', 'yarn-site.xml', + group = 'hadoop', + conf_dir = '/etc/hadoop/conf', +- mode = 0644, +- configuration_attributes = {u'final': {u'yarn.nodemanager.container-executor.class': u'true', +- u'yarn.nodemanager.disk-health-checker.min-healthy-disks': u'true', +- u'yarn.nodemanager.local-dirs': u'true'}}, ++ mode = 0o644, ++ configuration_attributes = {'final': {'yarn.nodemanager.container-executor.class': 'true', ++ 'yarn.nodemanager.disk-health-checker.min-healthy-disks': 'true', ++ 'yarn.nodemanager.local-dirs': 'true'}}, + owner = 'yarn', + configurations = self.getConfig()['configurations']['yarn-site'], + ) + self.assertResourceCalled('XmlConfig', 'capacity-scheduler.xml', + group = 'hadoop', + conf_dir = '/etc/hadoop/conf', +- mode = 0644, +- configuration_attributes = {u'final': {u'yarn.scheduler.capacity.node-locality-delay': u'true'}}, ++ mode = 0o644, ++ configuration_attributes = {'final': {'yarn.scheduler.capacity.node-locality-delay': 'true'}}, + owner = 'yarn', + configurations = self.getConfig()['configurations']['capacity-scheduler'], + ) + self.assertResourceCalled('File', '/etc/security/limits.d/yarn.conf', + content = Template('yarn.conf.j2'), +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/etc/security/limits.d/mapreduce.conf', + content = Template('mapreduce.conf.j2'), +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/etc/hadoop/conf/yarn-env.sh', + content = InlineTemplate(self.getConfig()['configurations']['yarn-env']['content']), + owner = 'yarn', + group = 'hadoop', +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('File', '/usr/lib/hadoop-yarn/bin/container-executor', + group = 'hadoop', +- mode = 02050, ++ mode = 0o2050, + ) + self.assertResourceCalled('File', '/etc/hadoop/conf/container-executor.cfg', + content = InlineTemplate(self.getConfig()['configurations']['container-executor']['content']), + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('Directory', '/cgroups_test/cpu', +- mode = 0755, ++ mode = 0o755, + group = 'hadoop', + create_parents = True, + cd_access = 'a', + ) + self.assertResourceCalled('File', '/etc/hadoop/conf/mapred-env.sh', + content = InlineTemplate(self.getConfig()['configurations']['mapred-env']['content']), +- mode = 0755, ++ mode = 0o755, + owner = 'hdfs', + ) + self.assertResourceCalled('File', '/etc/hadoop/conf/taskcontroller.cfg', +@@ -282,15 +282,15 @@ + owner = 'mapred', + group = 'hadoop', + conf_dir = '/etc/hadoop/conf', +- configuration_attributes = {u'final': {u'mapred.healthChecker.script.path': u'true', +- u'mapreduce.jobtracker.staging.root.dir': u'true'}}, ++ configuration_attributes = {'final': {'mapred.healthChecker.script.path': 'true', ++ 'mapreduce.jobtracker.staging.root.dir': 'true'}}, + configurations = self.getConfig()['configurations']['mapred-site'], + ) + self.assertResourceCalled('XmlConfig', 'capacity-scheduler.xml', + owner = 'hdfs', + group = 'hadoop', + conf_dir = '/etc/hadoop/conf', +- configuration_attributes = {u'final': {u'yarn.scheduler.capacity.node-locality-delay': u'true'}}, ++ configuration_attributes = {'final': {'yarn.scheduler.capacity.node-locality-delay': 'true'}}, + configurations = self.getConfig()['configurations']['capacity-scheduler'], + ) + self.assertResourceCalled('File', '/etc/hadoop/conf/fair-scheduler.xml', +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.4/AMBARI_INFRA/test_infra_solr.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.4/AMBARI_INFRA/test_infra_solr.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.4/AMBARI_INFRA/test_infra_solr.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.4/AMBARI_INFRA/test_infra_solr.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 resource_management.core.exceptions import ComponentIsNotRunning + from resource_management.libraries.functions.default import default + from resource_management.libraries.script.config_dictionary import UnknownConfiguration +-from mock.mock import MagicMock, call, patch ++from unittest.mock import MagicMock, call, patch + + @patch("os.listdir", new = MagicMock(return_value=['solr-8886.pid'])) + @patch("os.path.isdir", new = MagicMock(return_value=True)) +@@ -36,28 +36,28 @@ + group = 'hadoop', + create_parents = True, + cd_access = 'a', +- mode = 0755 ++ mode = 0o755 + ) + self.assertResourceCalled('Directory', '/var/run/ambari-infra-solr', + owner = 'solr', + group = 'hadoop', + create_parents = True, + cd_access = 'a', +- mode = 0755 ++ mode = 0o755 + ) + self.assertResourceCalled('Directory', '/var/lib/ambari-infra-solr/data', + owner = 'solr', + group = 'hadoop', + create_parents = True, + cd_access = 'a', +- mode = 0755 ++ mode = 0o755 + ) + self.assertResourceCalled('Directory', '/var/lib/ambari-infra-solr/data/resources', + owner = 'solr', + group = 'hadoop', + create_parents = True, + cd_access = 'a', +- mode = 0755 ++ mode = 0o755 + ) + self.assertResourceCalled('Directory', '/usr/lib/ambari-infra-solr', + owner = 'solr', +@@ -65,7 +65,7 @@ + create_parents = True, + recursive_ownership = True, + cd_access = 'a', +- mode = 0755 ++ mode = 0o755 + ) + self.assertResourceCalled('Directory', '/etc/ambari-infra-solr/conf', + owner = 'solr', +@@ -73,19 +73,19 @@ + create_parents = True, + recursive_ownership = True, + cd_access = 'a', +- mode = 0755 ++ mode = 0o755 + ) + + self.assertResourceCalled('File', '/var/log/ambari-infra-solr/solr-install.log', + owner = 'solr', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + content = '' + ) + self.assertResourceCalled('File', '/etc/ambari-infra-solr/conf/infra-solr-env.sh', + owner = 'solr', + group='hadoop', +- mode = 0755, ++ mode = 0o755, + content = InlineTemplate(self.getConfig()['configurations']['infra-solr-env']['content']) + ) + self.assertResourceCalled('File', '/var/lib/ambari-infra-solr/data/solr.xml', +@@ -103,7 +103,7 @@ + owner = 'solr', + group='hadoop', + content = InlineTemplate(self.getConfig()['configurations']['infra-solr-security-json']['content']), +- mode = 0640 ++ mode = 0o640 + ) + self.assertResourceCalled('File', '/etc/security/limits.d/infra-solr.conf', + owner = 'root', +@@ -113,11 +113,11 @@ + self.assertResourceCalled('Directory', '/usr/lib/ambari-logsearch-logfeeder/conf', + create_parents = True, + cd_access = 'a', +- mode = 0755 ++ mode = 0o755 + ) + + self.assertResourceCalled('File', '/usr/lib/ambari-logsearch-logfeeder/conf/input.config-logsearch.json', +- mode=0644, ++ mode=0o644, + content = Template('input.config-logsearch.json.j2', extra_imports=[default]) + ) + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.4/LOGSEARCH/test_logfeeder.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.4/LOGSEARCH/test_logfeeder.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.4/LOGSEARCH/test_logfeeder.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.4/LOGSEARCH/test_logfeeder.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 grp +-from mock.mock import MagicMock, patch ++from unittest.mock import MagicMock, patch + from stacks.utils.RMFTestCase import RMFTestCase, Template, InlineTemplate + from resource_management.libraries.functions.default import default + +@@ -31,34 +31,34 @@ + self.assertResourceCalled('Directory', '/var/log/ambari-logsearch-logfeeder', + create_parents=True, + cd_access='a', +- mode=0755 ++ mode=0o755 + ) + self.assertResourceCalled('Directory', '/var/run/ambari-logsearch-logfeeder', + create_parents=True, + cd_access='a', +- mode=0755 ++ mode=0o755 + ) + self.assertResourceCalled('Directory', '/usr/lib/ambari-logsearch-logfeeder/conf/checkpoints', + create_parents=True, + cd_access='a', +- mode=0755 ++ mode=0o755 + ) + + self.assertResourceCalled('Directory', '/usr/lib/ambari-logsearch-logfeeder', + create_parents=True, + recursive_ownership=True, + cd_access='a', +- mode=0755 ++ mode=0o755 + ) + self.assertResourceCalled('Directory', '/usr/lib/ambari-logsearch-logfeeder/conf', + create_parents=True, + recursive_ownership=True, + cd_access='a', +- mode=0755 ++ mode=0o755 + ) + + self.assertResourceCalled('File', '/var/log/ambari-logsearch-logfeeder/logfeeder.out', +- mode=0644, ++ mode=0o644, + content='' + ) + self.assertResourceCalled('File', '/usr/lib/ambari-logsearch-logfeeder/conf/keys/ks_pass.txt', +@@ -84,7 +84,7 @@ + } + ) + self.assertResourceCalled('File', '/usr/lib/ambari-logsearch-logfeeder/conf/logfeeder-env.sh', +- mode=0755, ++ mode=0o755, + content=InlineTemplate(self.getConfig()['configurations']['logfeeder-env']['content']) + ) + self.assertResourceCalled('File', '/usr/lib/ambari-logsearch-logfeeder/conf/log4j.xml', +@@ -108,10 +108,10 @@ + self.assertResourceCalled('Directory', '/usr/lib/ambari-logsearch-logfeeder/conf', + create_parents = True, + cd_access = 'a', +- mode = 0755 ++ mode = 0o755 + ) + self.assertResourceCalled('File', '/usr/lib/ambari-logsearch-logfeeder/conf/input.config-logsearch.json', +- mode=0644, ++ mode=0o644, + content = Template('input.config-logsearch.json.j2', extra_imports=[default]) + ) + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.4/LOGSEARCH/test_logsearch.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.4/LOGSEARCH/test_logsearch.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.4/LOGSEARCH/test_logsearch.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.4/LOGSEARCH/test_logsearch.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 @@ + group = 'hadoop', + create_parents = True, + cd_access = 'a', +- mode = 0755 ++ mode = 0o755 + ) + self.assertResourceCalled('Directory', '/var/run/ambari-logsearch-portal', + owner = 'logsearch', + group = 'hadoop', + create_parents = True, + cd_access = 'a', +- mode = 0755 ++ mode = 0o755 + ) + self.assertResourceCalled('Directory', '/usr/lib/ambari-logsearch-portal', + owner = 'logsearch', +@@ -46,7 +46,7 @@ + create_parents = True, + recursive_ownership = True, + cd_access = 'a', +- mode = 0755 ++ mode = 0o755 + ) + self.assertResourceCalled('Directory', '/usr/lib/ambari-logsearch-portal/conf', + owner = 'logsearch', +@@ -54,7 +54,7 @@ + create_parents = True, + recursive_ownership = True, + cd_access = 'a', +- mode = 0755 ++ mode = 0o755 + ) + self.assertResourceCalled('Directory', '/usr/lib/ambari-logsearch-portal/conf/solr_configsets', + owner = 'logsearch', +@@ -62,19 +62,19 @@ + create_parents = True, + recursive_ownership = True, + cd_access = 'a', +- mode = 0755 ++ mode = 0o755 + ) + self.assertResourceCalled('Directory', '/usr/lib/ambari-logsearch-portal/conf/keys', + owner = 'logsearch', + group = 'hadoop', + cd_access = 'a', +- mode = 0755 ++ mode = 0o755 + ) + + self.assertResourceCalled('File', '/var/log/ambari-logsearch-portal/logsearch.out', + owner = 'logsearch', + group = 'hadoop', +- mode = 0644, ++ mode = 0o644, + content = '' + ) + self.assertResourceCalled('File', '/usr/lib/ambari-logsearch-portal/conf/keys/ks_pass.txt', +@@ -128,7 +128,7 @@ + ) + self.assertResourceCalled('File', '/usr/lib/ambari-logsearch-portal/conf/logsearch-env.sh', + content = InlineTemplate(self.getConfig()['configurations']['logsearch-env']['content']), +- mode = 0755, ++ mode = 0o755, + owner = "logsearch", + group='hadoop' + ) +@@ -154,11 +154,11 @@ + self.assertResourceCalled('Directory', '/usr/lib/ambari-logsearch-logfeeder/conf', + create_parents = True, + cd_access = 'a', +- mode = 0755 ++ mode = 0o755 + ) + + self.assertResourceCalled('File', '/usr/lib/ambari-logsearch-logfeeder/conf/input.config-logsearch.json', +- mode=0644, ++ mode=0o644, + content = Template('input.config-logsearch.json.j2', extra_imports=[default]) + ) + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.5/ATLAS/test_atlas_server.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.5/ATLAS/test_atlas_server.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.5/ATLAS/test_atlas_server.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.5/ATLAS/test_atlas_server.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 @@ + ''' + + from stacks.utils.RMFTestCase import * +-from mock.mock import MagicMock, call, patch ++from unittest.mock import MagicMock, call, patch + + from only_for_platform import not_for_platform, PLATFORM_WINDOWS + +@@ -35,7 +35,7 @@ + group='hadoop', + create_parents = True, + cd_access='a', +- mode=0755 ++ mode=0o755 + ) + # Pid dir + self.assertResourceCalled('Directory', '/var/run/atlas', +@@ -43,14 +43,14 @@ + group='hadoop', + create_parents = True, + cd_access='a', +- mode=0755 ++ mode=0o755 + ) + self.assertResourceCalled('Directory', '/usr/hdp/current/atlas-server/conf/solr', + owner='atlas', + group='hadoop', + create_parents = True, + cd_access='a', +- mode=0755, ++ mode=0o755, + recursive_ownership = True + ) + # Log dir +@@ -59,7 +59,7 @@ + group='hadoop', + create_parents = True, + cd_access='a', +- mode=0755 ++ mode=0o755 + ) + # Data dir + self.assertResourceCalled('Directory', '/usr/hdp/current/atlas-server/data', +@@ -67,7 +67,7 @@ + group='hadoop', + create_parents = True, + cd_access='a', +- mode=0644 ++ mode=0o644 + ) + # Expanded war dir + self.assertResourceCalled('Directory', '/usr/hdp/current/atlas-server/server/webapp', +@@ -75,22 +75,22 @@ + group='hadoop', + create_parents = True, + cd_access='a', +- mode=0644 ++ mode=0o644 + ) + self.assertResourceCalled('Execute', ('cp', '/usr/hdp/current/atlas-server/server/webapp/atlas.war', '/usr/hdp/current/atlas-server/server/webapp/atlas.war'), + sudo = True, + not_if = True, + ) +- host_name = u"c6401.ambari.apache.org" ++ host_name = "c6401.ambari.apache.org" + app_props = dict(self.getConfig()['configurations'][ + 'application-properties']) + app_props['atlas.http.authentication.kerberos.name.rules'] = ' \\ \n'.join(app_props['atlas.http.authentication.kerberos.name.rules'].splitlines()) + app_props['atlas.server.bind.address'] = host_name + metadata_protocol = "https" if app_props["atlas.enableTLS"] is True else "http" + metadata_port = app_props["atlas.server.https.port"] if metadata_protocol == "https" else app_props["atlas.server.http.port"] +- app_props["atlas.rest.address"] = u'%s://%s:%s' % (metadata_protocol, host_name, metadata_port) ++ app_props["atlas.rest.address"] = '{}://{}:{}'.format(metadata_protocol, host_name, metadata_port) + app_props["atlas.server.ids"] = "id1" +- app_props["atlas.server.address.id1"] = u"%s:%s" % (host_name, metadata_port) ++ app_props["atlas.server.address.id1"] = "{}:{}".format(host_name, metadata_port) + app_props["atlas.server.ha.enabled"] = "false" + + self.assertResourceCalled('File', '/usr/hdp/current/atlas-server/conf/atlas-log4j.xml', +@@ -99,7 +99,7 @@ + 'atlas-log4j']['content']), + owner='atlas', + group='hadoop', +- mode=0644, ++ mode=0o644, + ) + self.assertResourceCalled('File', '/usr/hdp/current/atlas-server/conf/atlas-env.sh', + content=InlineTemplate( +@@ -107,7 +107,7 @@ + 'atlas-env']['content']), + owner='atlas', + group='hadoop', +- mode=0755, ++ mode=0o755, + ) + self.assertResourceCalled('File', '/usr/hdp/current/atlas-server/conf/solr/solrconfig.xml', + content=InlineTemplate( +@@ -115,37 +115,37 @@ + 'atlas-solrconfig']['content']), + owner='atlas', + group='hadoop', +- mode=0644, ++ mode=0o644, + ) + # application.properties file + self.assertResourceCalled('PropertiesFile', + '/usr/hdp/current/atlas-server/conf/atlas-application.properties', + properties=app_props, +- owner=u'atlas', +- group=u'hadoop', +- mode=0600, ++ owner='atlas', ++ group='hadoop', ++ mode=0o600, + ) + self.assertResourceCalled('Directory', '/var/log/ambari-infra-solr-client', + create_parents=True, + cd_access='a', +- mode=0755 ++ mode=0o755 + ) + self.assertResourceCalled('Directory', '/usr/lib/ambari-infra-solr-client', + create_parents = True, + recursive_ownership = True, + cd_access='a', +- mode=0755 ++ mode=0o755 + ) + self.assertResourceCalled('File', '/usr/lib/ambari-infra-solr-client/solrCloudCli.sh', + content=StaticFile('/usr/lib/ambari-infra-solr-client/solrCloudCli.sh'), +- mode=0755 ++ mode=0o755 + ) + self.assertResourceCalled('File', '/usr/lib/ambari-infra-solr-client/log4j.properties', + content=self.getConfig()['configurations']['infra-solr-client-log4j']['content'], +- mode=0644, ++ mode=0o644, + ) + self.assertResourceCalled('File', '/var/log/ambari-infra-solr-client/solr-client.log', +- mode=0664, ++ mode=0o664, + content = '' + ) + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.5/common/test_stack_advisor.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.5/common/test_stack_advisor.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.5/common/test_stack_advisor.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.5/common/test_stack_advisor.py 2022-07-11 00:52:31.000000000 +0800 +@@ -567,7 +567,7 @@ + } + + self.stackAdvisor.recommendSparkConfigurations(configurations, clusterData, services, None) +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + + def test_recommendSPARKConfigurations_SecurityNotEnabledZeppelinInstalled(self): + configurations = { +@@ -616,7 +616,7 @@ + } + + self.stackAdvisor.recommendSparkConfigurations(configurations, clusterData, services, None) +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + + def test_recommendSPARKConfigurations_SecurityEnabledZeppelinInstalledExistingValue(self): + configurations = { +@@ -669,7 +669,7 @@ + } + + self.stackAdvisor.recommendSparkConfigurations(configurations, clusterData, services, None) +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + + def test_recommendSPARKConfigurations_SecurityEnabledZeppelinNotInstalled(self): + configurations = { +@@ -710,7 +710,7 @@ + } + + self.stackAdvisor.recommendSparkConfigurations(configurations, clusterData, services, None) +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + + def test_recommendSPARK2Configurations(self): + configurations = {} +@@ -742,7 +742,7 @@ + } + + self.stackAdvisor.recommendSpark2Configurations(configurations, clusterData, services, None) +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + + def load_json(self, filename): + file = os.path.join(self.testDirectory, filename) +@@ -791,12 +791,12 @@ + hosts = self.prepareNHosts(5) + actual = self.stackAdvisor.getCardinalitiesDict(hosts) + expected = {'METRICS_COLLECTOR': {'min': 1}} +- self.assertEquals(actual, expected) ++ self.assertEqual(actual, expected) + + hosts = self.prepareNHosts(1001) + actual = self.stackAdvisor.getCardinalitiesDict(hosts) + expected = {'METRICS_COLLECTOR': {'min': 2}} +- self.assertEquals(actual, expected) ++ self.assertEqual(actual, expected) + + def test_getComponentLayoutValidations_one_hsi_host(self): + +@@ -808,7 +808,7 @@ + 'message': 'You have selected 2 HiveServer2 Interactive components. Please consider that between 0 and 1 HiveServer2 Interactive components should be installed in cluster.', + 'type': 'host-component', + 'level': 'ERROR'} +- self.assertEquals(validations[0], expected) ++ self.assertEqual(validations[0], expected) + + + def test_validateYARNConfigurations(self): +@@ -841,7 +841,7 @@ + {'config-type': 'yarn-site', 'message': 'While enabling HIVE_SERVER_INTERACTIVE it is recommended that you enable work preserving restart in YARN.', 'type': 'configuration', 'config-name': 'yarn.resourcemanager.work-preserving-recovery.enabled', 'level': 'WARN'} + ] + res = self.stackAdvisor.validateYARNConfigurations(properties, recommendedDefaults, configurations, services, {}) +- self.assertEquals(res, res_expected) ++ self.assertEqual(res, res_expected) + pass + + def test_validateHiveInteractiveEnvConfigurations(self): +@@ -886,7 +886,7 @@ + ] + # the above error is not what we are checking for - just to keep test happy without having to test + res = self.stackAdvisor.validateHiveInteractiveEnvConfigurations(properties, recommendedDefaults, configurations, services, {}) +- self.assertEquals(res, res_expected) ++ self.assertEqual(res, res_expected) + + # (1). Checks for ERROR message for 'enable_hive_interactive' to be true. + # (2). Further, no message regarding 'yarn.resourcemanager.scheduler.monitor.enable' as it is true already. +@@ -894,7 +894,7 @@ + {'config-type': 'hive-interactive-env', 'message': 'HIVE_SERVER_INTERACTIVE requires enable_hive_interactive in hive-interactive-env set to true.', 'type': 'configuration', 'config-name': 'enable_hive_interactive', 'level': 'ERROR'} + ] + res = self.stackAdvisor.validateHiveInteractiveEnvConfigurations(properties, recommendedDefaults, configurations2, services, {}) +- self.assertEquals(res, res_expected) ++ self.assertEqual(res, res_expected) + pass + + +@@ -934,7 +934,7 @@ + "capacity (50%) for LLAP app to run", 'type': 'configuration', 'config-name': 'hive.llap.daemon.queue.name', 'level': 'ERROR'}, + ] + res1 = self.stackAdvisor.validateHiveInteractiveSiteConfigurations({}, {}, {}, services1, hosts) +- self.assertEquals(res1, res_expected1) ++ self.assertEqual(res1, res_expected1) + + + +@@ -956,7 +956,7 @@ + "LLAP.", 'type': 'configuration', 'config-name': 'hive.server2.tez.sessions.per.default.queue', 'level': 'WARN'} + ] + res2 = self.stackAdvisor.validateHiveInteractiveSiteConfigurations({}, {}, {}, services2, hosts) +- self.assertEquals(res2, res_expected2) ++ self.assertEqual(res2, res_expected2) + + + # Test C : When selected queue capacity is >= the minimum required for LLAP app to run, using the passed in configurations. +@@ -982,7 +982,7 @@ + } + res_expected3 = [] + res3 = self.stackAdvisor.validateHiveInteractiveSiteConfigurations({}, {}, configurations, services1, hosts) +- self.assertEquals(res3, res_expected3) ++ self.assertEqual(res3, res_expected3) + + + # Test D : When remaining available capacity is less than 512M (designated for running service checks), using the passed in configurations. +@@ -1014,7 +1014,7 @@ + "(261.12) in cluster is less than 512 MB.", 'type': 'configuration', 'config-name': 'hive.llap.daemon.queue.name', 'level': 'WARN'}] + res4 = self.stackAdvisor.validateHiveInteractiveSiteConfigurations({}, {}, configurations, services1, hosts) + +- self.assertEquals(res4, res_expected4) ++ self.assertEqual(res4, res_expected4) + pass + + +@@ -1105,9 +1105,9 @@ + ], + "changed-configurations": [ + { +- u'old_value': u'true', +- u'type': u'hive-interactive-env', +- u'name': u'enable_hive_interactive' ++ 'old_value': 'true', ++ 'type': 'hive-interactive-env', ++ 'name': 'enable_hive_interactive' + } + ], + "configurations": { +@@ -1208,11 +1208,11 @@ + cap_sched_expected_dict = convertToDict(self.expected_capacity_scheduler_llap_Stopped_size_0['properties']['capacity-scheduler']) + self.assertEqual(cap_sched_output_dict, cap_sched_expected_dict) + +- self.assertEquals(configurations['hive-interactive-site']['properties']['hive.server2.tez.default.queues'], 'default') +- self.assertEquals(configurations['hive-interactive-site']['properties']['hive.llap.daemon.queue.name'], 'default') +- self.assertEquals(configurations['yarn-site']['properties']['yarn.timeline-service.entity-group-fs-store.group-id-plugin-classes'], ++ self.assertEqual(configurations['hive-interactive-site']['properties']['hive.server2.tez.default.queues'], 'default') ++ self.assertEqual(configurations['hive-interactive-site']['properties']['hive.llap.daemon.queue.name'], 'default') ++ self.assertEqual(configurations['yarn-site']['properties']['yarn.timeline-service.entity-group-fs-store.group-id-plugin-classes'], + 'org.apache.tez.dag.history.logging.ats.TimelineCachePluginImpl,org.apache.spark.deploy.history.yarn.plugin.SparkATSPlugin') +- self.assertEquals(configurations['yarn-site']['properties']['yarn.timeline-service.entity-group-fs-store.group-id-plugin-classpath'], '/usr/hdp/{{spark_version}}/spark/hdpLib/*') ++ self.assertEqual(configurations['yarn-site']['properties']['yarn.timeline-service.entity-group-fs-store.group-id-plugin-classpath'], '/usr/hdp/{{spark_version}}/spark/hdpLib/*') + self.assertTrue('hive-interactive-env' not in configurations) + self.assertTrue('property_attributes' not in configurations) + +@@ -1375,9 +1375,9 @@ + } + self.stackAdvisor.recommendYARNConfigurations(configurations, clusterData, services_18, self.hosts) + +- self.assertEquals(configurations['capacity-scheduler']['properties'], ++ self.assertEqual(configurations['capacity-scheduler']['properties'], + self.expected_capacity_scheduler_empty['properties']) +- self.assertEquals(configurations['hive-interactive-site']['properties'], ++ self.assertEqual(configurations['hive-interactive-site']['properties'], + self.expected_hive_interactive_site_empty['hive-interactive-site']['properties']) + self.assertTrue('hive-interactive-env' not in configurations) + +@@ -1463,9 +1463,9 @@ + ], + "changed-configurations": [ + { +- u'old_value': u'0', +- u'type': u'hive-interactive-env', +- u'name': u'num_llap_nodes' ++ 'old_value': '0', ++ 'type': 'hive-interactive-env', ++ 'name': 'num_llap_nodes' + } + ], + "configurations": { +@@ -1562,7 +1562,7 @@ + self.stackAdvisor.recommendYARNConfigurations(configurations, clusterData, services, self.hosts) + + self.assertEqual(configurations['hive-interactive-site']['properties']['hive.server2.tez.sessions.per.default.queue'], '1') +- self.assertEquals(configurations['hive-interactive-site']['property_attributes']['hive.server2.tez.sessions.per.default.queue'], {'minimum': '1', 'maximum': '4'}) ++ self.assertEqual(configurations['hive-interactive-site']['property_attributes']['hive.server2.tez.sessions.per.default.queue'], {'minimum': '1', 'maximum': '4'}) + + self.assertTrue(configurations['hive-interactive-env']['properties']['num_llap_nodes_for_llap_daemons'], 3) + self.assertTrue('num_llap_nodes' not in configurations['hive-interactive-env']['properties']) +@@ -1584,7 +1584,7 @@ + self.assertEqual(configurations['hive-interactive-site']['properties']['hive.auto.convert.join.noconditionaltask.size'], '286261248') + + self.assertTrue('tez.am.resource.memory.mb' not in configurations['tez-interactive-site']['properties']) +- self.assertEquals(configurations['hive-interactive-site']['property_attributes']['hive.llap.daemon.queue.name'], {'entries': [{'value': 'default', 'label': 'default'}, {'value': 'llap', 'label': 'llap'}]}) ++ self.assertEqual(configurations['hive-interactive-site']['property_attributes']['hive.llap.daemon.queue.name'], {'entries': [{'value': 'default', 'label': 'default'}, {'value': 'llap', 'label': 'llap'}]}) + + + +@@ -1666,9 +1666,9 @@ + ], + "changed-configurations": [ + { +- u'old_value': u'2', +- u'type': u'hive-interactive-site', +- u'name': u'hive.server2.tez.sessions.per.default.queue' ++ 'old_value': '2', ++ 'type': 'hive-interactive-site', ++ 'name': 'hive.server2.tez.sessions.per.default.queue' + } + ], + "configurations": { +@@ -1764,7 +1764,7 @@ + + self.stackAdvisor.recommendYARNConfigurations(configurations, clusterData, services, self.hosts) + +- self.assertEquals(configurations['hive-interactive-site']['property_attributes']['hive.server2.tez.sessions.per.default.queue'], {'maximum': '3'}) ++ self.assertEqual(configurations['hive-interactive-site']['property_attributes']['hive.server2.tez.sessions.per.default.queue'], {'maximum': '3'}) + + self.assertTrue(configurations['hive-interactive-env']['properties']['num_llap_nodes'], 3) + self.assertTrue(configurations['hive-interactive-env']['properties']['num_llap_nodes_for_llap_daemons'], 3) +@@ -1785,7 +1785,7 @@ + self.assertEqual(configurations['hive-interactive-site']['properties']['hive.auto.convert.join.noconditionaltask.size'], '286261248') + + self.assertTrue('tez.am.resource.memory.mb' not in configurations['tez-interactive-site']['properties']) +- self.assertEquals(configurations['hive-interactive-site']['property_attributes']['hive.llap.daemon.queue.name'], {'entries': [{'value': 'default', 'label': 'default'}, {'value': 'llap', 'label': 'llap'}]}) ++ self.assertEqual(configurations['hive-interactive-site']['property_attributes']['hive.llap.daemon.queue.name'], {'entries': [{'value': 'default', 'label': 'default'}, {'value': 'llap', 'label': 'llap'}]}) + + + +@@ -1863,9 +1863,9 @@ + ], + "changed-configurations": [ + { +- u'old_value': u'1', +- u'type': u'hive-interactive-site', +- u'name': u'hive.server2.tez.sessions.per.default.queue' ++ 'old_value': '1', ++ 'type': 'hive-interactive-site', ++ 'name': 'hive.server2.tez.sessions.per.default.queue' + } + ], + "configurations": { +@@ -1962,7 +1962,7 @@ + + self.stackAdvisor.recommendYARNConfigurations(configurations, clusterData, services, self.hosts) + +- self.assertEquals(configurations['hive-interactive-site']['property_attributes']['hive.server2.tez.sessions.per.default.queue'], {'maximum': '4'}) ++ self.assertEqual(configurations['hive-interactive-site']['property_attributes']['hive.server2.tez.sessions.per.default.queue'], {'maximum': '4'}) + + self.assertTrue(configurations['hive-interactive-env']['properties']['num_llap_nodes_for_llap_daemons'], 3) + self.assertTrue('num_llap_nodes' not in configurations['hive-interactive-env']['properties']) +@@ -1984,7 +1984,7 @@ + self.assertEqual(configurations['hive-interactive-site']['properties']['hive.auto.convert.join.noconditionaltask.size'], '572522496') + + self.assertTrue('tez.am.resource.memory.mb' not in configurations['tez-interactive-site']['properties']) +- self.assertEquals(configurations['hive-interactive-site']['property_attributes']['hive.llap.daemon.queue.name'], {'entries': [{'value': 'default', 'label': 'default'}, {'value': 'llap', 'label': 'llap'}]}) ++ self.assertEqual(configurations['hive-interactive-site']['property_attributes']['hive.llap.daemon.queue.name'], {'entries': [{'value': 'default', 'label': 'default'}, {'value': 'llap', 'label': 'llap'}]}) + + + +@@ -2069,9 +2069,9 @@ + ], + "changed-configurations": [ + { +- u'old_value': u'1', +- u'type': u'hive-interactive-env', +- u'name': u'num_llap_nodes' ++ 'old_value': '1', ++ 'type': 'hive-interactive-env', ++ 'name': 'num_llap_nodes' + } + ], + "configurations": { +@@ -2168,7 +2168,7 @@ + + + self.assertEqual(configurations['hive-interactive-site']['properties']['hive.server2.tez.sessions.per.default.queue'], '1') +- self.assertEquals(configurations['hive-interactive-site']['property_attributes']['hive.server2.tez.sessions.per.default.queue'], {'maximum': '4', 'minimum': '1'}) ++ self.assertEqual(configurations['hive-interactive-site']['property_attributes']['hive.server2.tez.sessions.per.default.queue'], {'maximum': '4', 'minimum': '1'}) + + self.assertTrue(configurations['hive-interactive-env']['properties']['num_llap_nodes_for_llap_daemons'], 3) + self.assertTrue('num_llap_nodes' not in configurations['hive-interactive-env']['properties']) +@@ -2190,7 +2190,7 @@ + self.assertEqual(configurations['hive-interactive-site']['properties']['hive.auto.convert.join.noconditionaltask.size'], '572522496') + + self.assertTrue('tez.am.resource.memory.mb' not in configurations['tez-interactive-site']['properties']) +- self.assertEquals(configurations['hive-interactive-site']['property_attributes']['hive.llap.daemon.queue.name'], {'entries': [{'value': 'default', 'label': 'default'}, {'value': 'llap', 'label': 'llap'}]}) ++ self.assertEqual(configurations['hive-interactive-site']['property_attributes']['hive.llap.daemon.queue.name'], {'entries': [{'value': 'default', 'label': 'default'}, {'value': 'llap', 'label': 'llap'}]}) + + + +@@ -2270,9 +2270,9 @@ + ], + "changed-configurations": [ + { +- u'old_value': u'false', +- u'type': u'hive-interactive-env', +- u'name': u'enable_hive_interactive' ++ 'old_value': 'false', ++ 'type': 'hive-interactive-env', ++ 'name': 'enable_hive_interactive' + } + ], + "configurations": { +@@ -2368,7 +2368,7 @@ + + self.stackAdvisor.recommendYARNConfigurations(configurations, clusterData, services, self.hosts) + self.assertEqual(configurations['hive-interactive-site']['properties']['hive.server2.tez.sessions.per.default.queue'], '1') +- self.assertEquals(configurations['hive-interactive-site']['property_attributes']['hive.server2.tez.sessions.per.default.queue'], {'minimum': '1', 'maximum': '4'}) ++ self.assertEqual(configurations['hive-interactive-site']['property_attributes']['hive.server2.tez.sessions.per.default.queue'], {'minimum': '1', 'maximum': '4'}) + self.assertEqual(configurations['capacity-scheduler']['properties'], {'capacity-scheduler': 'yarn.scheduler.capacity.root.accessible-node-labels=*\nyarn.scheduler.capacity.maximum-am-resource-percent=1\nyarn.scheduler.capacity.node-locality-delay=40\nyarn.scheduler.capacity.root.capacity=100\nyarn.scheduler.capacity.root.default.state=RUNNING\nyarn.scheduler.capacity.root.default.maximum-capacity=66.0\nyarn.scheduler.capacity.root.queues=default,llap\nyarn.scheduler.capacity.maximum-applications=10000\nyarn.scheduler.capacity.root.default.user-limit-factor=1\nyarn.scheduler.capacity.root.acl_administer_queue=*\nyarn.scheduler.capacity.root.default.acl_submit_applications=*\nyarn.scheduler.capacity.root.default.capacity=66.0\nyarn.scheduler.capacity.queue-mappings-override.enable=false\nyarn.scheduler.capacity.root.ordering-policy=priority-utilization\nyarn.scheduler.capacity.root.llap.user-limit-factor=1\nyarn.scheduler.capacity.root.llap.state=RUNNING\nyarn.scheduler.capacity.root.llap.ordering-policy=fifo\nyarn.scheduler.capacity.root.llap.priority=10\nyarn.scheduler.capacity.root.llap.minimum-user-limit-percent=100\nyarn.scheduler.capacity.root.llap.maximum-capacity=34.0\nyarn.scheduler.capacity.root.llap.capacity=34.0\nyarn.scheduler.capacity.root.llap.acl_submit_applications=hive\nyarn.scheduler.capacity.root.llap.acl_administer_queue=hive\nyarn.scheduler.capacity.root.llap.maximum-am-resource-percent=1'}) + + self.assertTrue(configurations['hive-interactive-env']['properties']['num_llap_nodes_for_llap_daemons'], 3) +@@ -2392,7 +2392,7 @@ + self.assertEqual(configurations['hive-interactive-site']['properties']['hive.auto.convert.join.noconditionaltask.size'], '858783744') + + self.assertEqual(configurations['tez-interactive-site']['properties']['tez.am.resource.memory.mb'], '1364') +- self.assertEquals(configurations['hive-interactive-site']['property_attributes']['hive.llap.daemon.queue.name'], {'entries': [{'value': 'default', 'label': 'default'}, {'value': 'llap', 'label': 'llap'}]}) ++ self.assertEqual(configurations['hive-interactive-site']['property_attributes']['hive.llap.daemon.queue.name'], {'entries': [{'value': 'default', 'label': 'default'}, {'value': 'llap', 'label': 'llap'}]}) + + + # Test 8: (1). 'default' and 'llap' (State : RUNNING) queue exists at root level in capacity-scheduler, and +@@ -2473,9 +2473,9 @@ + ], + "changed-configurations": [ + { +- u'old_value': u'false', +- u'type': u'hive-interactive-env', +- u'name': u'enable_hive_interactive' ++ 'old_value': 'false', ++ 'type': 'hive-interactive-env', ++ 'name': 'enable_hive_interactive' + } + ], + "configurations": { +@@ -2571,7 +2571,7 @@ + self.stackAdvisor.recommendYARNConfigurations(configurations, clusterData, services, self.hosts) + + self.assertEqual(configurations['hive-interactive-site']['properties']['hive.server2.tez.sessions.per.default.queue'], '1') +- self.assertEquals(configurations['hive-interactive-site']['property_attributes']['hive.server2.tez.sessions.per.default.queue'], {'minimum': '1', 'maximum': '3.0'}) ++ self.assertEqual(configurations['hive-interactive-site']['property_attributes']['hive.server2.tez.sessions.per.default.queue'], {'minimum': '1', 'maximum': '3.0'}) + self.assertEqual(configurations['capacity-scheduler']['properties'], {'capacity-scheduler': 'yarn.scheduler.capacity.root.accessible-node-labels=*\nyarn.scheduler.capacity.maximum-am-resource-percent=1\nyarn.scheduler.capacity.node-locality-delay=40\nyarn.scheduler.capacity.root.capacity=100\nyarn.scheduler.capacity.root.default.state=RUNNING\nyarn.scheduler.capacity.root.default.maximum-capacity=66.0\nyarn.scheduler.capacity.root.queues=default,llap\nyarn.scheduler.capacity.maximum-applications=10000\nyarn.scheduler.capacity.root.default.user-limit-factor=1\nyarn.scheduler.capacity.root.acl_administer_queue=*\nyarn.scheduler.capacity.root.default.acl_submit_applications=*\nyarn.scheduler.capacity.root.default.capacity=66.0\nyarn.scheduler.capacity.queue-mappings-override.enable=false\nyarn.scheduler.capacity.root.llap.user-limit-factor=1\nyarn.scheduler.capacity.root.llap.state=RUNNING\nyarn.scheduler.capacity.root.llap.ordering-policy=fifo\nyarn.scheduler.capacity.root.llap.minimum-user-limit-percent=100\nyarn.scheduler.capacity.root.llap.maximum-capacity=34.0\nyarn.scheduler.capacity.root.llap.capacity=34.0\nyarn.scheduler.capacity.root.llap.acl_submit_applications=hive\nyarn.scheduler.capacity.root.llap.acl_administer_queue=hive\nyarn.scheduler.capacity.root.llap.maximum-am-resource-percent=1'}) + + self.assertTrue(configurations['hive-interactive-env']['properties']['num_llap_nodes_for_llap_daemons'], 3) +@@ -2594,7 +2594,7 @@ + self.assertEqual(configurations['hive-interactive-site']['properties']['hive.auto.convert.join.noconditionaltask.size'], '189792256') + + self.assertEqual(configurations['tez-interactive-site']['properties']['tez.am.resource.memory.mb'], '682') +- self.assertEquals(configurations['hive-interactive-site']['property_attributes']['hive.llap.daemon.queue.name'], {'entries': [{'value': 'default', 'label': 'default'}, {'value': 'llap', 'label': 'llap'}]}) ++ self.assertEqual(configurations['hive-interactive-site']['property_attributes']['hive.llap.daemon.queue.name'], {'entries': [{'value': 'default', 'label': 'default'}, {'value': 'llap', 'label': 'llap'}]}) + + + +@@ -2673,9 +2673,9 @@ + ], + "changed-configurations": [ + { +- u'old_value': u'2', +- u'type': u'hive-interactive-site', +- u'name': u'hive.server2.tez.sessions.per.default.queue' ++ 'old_value': '2', ++ 'type': 'hive-interactive-site', ++ 'name': 'hive.server2.tez.sessions.per.default.queue' + } + ], + "configurations": { +@@ -2771,7 +2771,7 @@ + self.stackAdvisor.recommendYARNConfigurations(configurations, clusterData, services, self.hosts) + + self.assertEqual(configurations['capacity-scheduler']['properties'], {'capacity-scheduler': 'yarn.scheduler.capacity.root.accessible-node-labels=*\nyarn.scheduler.capacity.maximum-am-resource-percent=1\nyarn.scheduler.capacity.node-locality-delay=40\nyarn.scheduler.capacity.root.capacity=100\nyarn.scheduler.capacity.root.default.state=RUNNING\nyarn.scheduler.capacity.root.default.maximum-capacity=0.0\nyarn.scheduler.capacity.root.queues=default,llap\nyarn.scheduler.capacity.maximum-applications=10000\nyarn.scheduler.capacity.root.default.user-limit-factor=1\nyarn.scheduler.capacity.root.acl_administer_queue=*\nyarn.scheduler.capacity.root.default.acl_submit_applications=*\nyarn.scheduler.capacity.root.default.capacity=0.0\nyarn.scheduler.capacity.queue-mappings-override.enable=false\nyarn.scheduler.capacity.root.ordering-policy=priority-utilization\nyarn.scheduler.capacity.root.llap.user-limit-factor=1\nyarn.scheduler.capacity.root.llap.state=RUNNING\nyarn.scheduler.capacity.root.llap.ordering-policy=fifo\nyarn.scheduler.capacity.root.llap.priority=10\nyarn.scheduler.capacity.root.llap.minimum-user-limit-percent=100\nyarn.scheduler.capacity.root.llap.maximum-capacity=100.0\nyarn.scheduler.capacity.root.llap.capacity=100.0\nyarn.scheduler.capacity.root.llap.acl_submit_applications=hive\nyarn.scheduler.capacity.root.llap.acl_administer_queue=hive\nyarn.scheduler.capacity.root.llap.maximum-am-resource-percent=1'}) +- self.assertEquals(configurations['hive-interactive-site']['property_attributes']['hive.server2.tez.sessions.per.default.queue'], {'maximum': '4'}) ++ self.assertEqual(configurations['hive-interactive-site']['property_attributes']['hive.server2.tez.sessions.per.default.queue'], {'maximum': '4'}) + + self.assertTrue(configurations['hive-interactive-env']['properties']['num_llap_nodes_for_llap_daemons'], 3) + self.assertTrue('num_llap_nodes' not in configurations['hive-interactive-env']['properties']) +@@ -2792,7 +2792,7 @@ + self.assertEqual(configurations['hive-interactive-site']['properties']['hive.auto.convert.join.noconditionaltask.size'], '572522496') + + self.assertTrue('tez.am.resource.memory.mb' not in configurations['tez-interactive-site']['properties']) +- self.assertEquals(configurations['hive-interactive-site']['property_attributes']['hive.llap.daemon.queue.name'], {'entries': [{'value': 'default', 'label': 'default'}, {'value': 'llap', 'label': 'llap'}]}) ++ self.assertEqual(configurations['hive-interactive-site']['property_attributes']['hive.llap.daemon.queue.name'], {'entries': [{'value': 'default', 'label': 'default'}, {'value': 'llap', 'label': 'llap'}]}) + + + +@@ -2877,9 +2877,9 @@ + ], + "changed-configurations": [ + { +- u'old_value': u'2', +- u'type': u'hive-interactive-env', +- u'name': u'num_llap_nodes' ++ 'old_value': '2', ++ 'type': 'hive-interactive-env', ++ 'name': 'num_llap_nodes' + } + ], + "configurations": { +@@ -2977,7 +2977,7 @@ + + self.assertEqual(configurations['capacity-scheduler']['properties'], {'capacity-scheduler': 'yarn.scheduler.capacity.root.accessible-node-labels=*\nyarn.scheduler.capacity.maximum-am-resource-percent=1\nyarn.scheduler.capacity.node-locality-delay=40\nyarn.scheduler.capacity.root.capacity=100\nyarn.scheduler.capacity.root.default.state=RUNNING\nyarn.scheduler.capacity.root.default.maximum-capacity=2.0\nyarn.scheduler.capacity.root.queues=default,llap\nyarn.scheduler.capacity.maximum-applications=10000\nyarn.scheduler.capacity.root.default.user-limit-factor=1\nyarn.scheduler.capacity.root.acl_administer_queue=*\nyarn.scheduler.capacity.root.default.acl_submit_applications=*\nyarn.scheduler.capacity.root.default.capacity=2.0\nyarn.scheduler.capacity.queue-mappings-override.enable=false\nyarn.scheduler.capacity.root.ordering-policy=priority-utilization\nyarn.scheduler.capacity.root.llap.user-limit-factor=1\nyarn.scheduler.capacity.root.llap.state=RUNNING\nyarn.scheduler.capacity.root.llap.ordering-policy=fifo\nyarn.scheduler.capacity.root.llap.priority=10\nyarn.scheduler.capacity.root.llap.minimum-user-limit-percent=100\nyarn.scheduler.capacity.root.llap.maximum-capacity=98.0\nyarn.scheduler.capacity.root.llap.capacity=98.0\nyarn.scheduler.capacity.root.llap.acl_submit_applications=hive\nyarn.scheduler.capacity.root.llap.acl_administer_queue=hive\nyarn.scheduler.capacity.root.llap.maximum-am-resource-percent=1'}) + self.assertEqual(configurations['hive-interactive-site']['properties']['hive.server2.tez.sessions.per.default.queue'], '1') +- self.assertEquals(configurations['hive-interactive-site']['property_attributes']['hive.server2.tez.sessions.per.default.queue'], {'maximum': '4', 'minimum': '1'}) ++ self.assertEqual(configurations['hive-interactive-site']['property_attributes']['hive.server2.tez.sessions.per.default.queue'], {'maximum': '4', 'minimum': '1'}) + + self.assertTrue('num_llap_nodes_for_llap_daemons' not in configurations['hive-interactive-env']['properties']) + self.assertTrue('num_llap_nodes' not in configurations['hive-interactive-env']['properties']) +@@ -2999,7 +2999,7 @@ + self.assertEqual(configurations['hive-interactive-site']['properties']['hive.auto.convert.join.noconditionaltask.size'], '572522496') + + self.assertTrue('tez.am.resource.memory.mb' not in configurations['tez-interactive-site']['properties']) +- self.assertEquals(configurations['hive-interactive-site']['property_attributes']['hive.llap.daemon.queue.name'], {'entries': [{'value': 'default', 'label': 'default'}, {'value': 'llap', 'label': 'llap'}]}) ++ self.assertEqual(configurations['hive-interactive-site']['property_attributes']['hive.llap.daemon.queue.name'], {'entries': [{'value': 'default', 'label': 'default'}, {'value': 'llap', 'label': 'llap'}]}) + + + +@@ -3079,9 +3079,9 @@ + ], + "changed-configurations": [ + { +- u'old_value': u'false', +- u'type': u'hive-interactive-env', +- u'name': u'enable_hive_interactive' ++ 'old_value': 'false', ++ 'type': 'hive-interactive-env', ++ 'name': 'enable_hive_interactive' + } + ], + "configurations": { +@@ -3178,7 +3178,7 @@ + + self.assertEqual(configurations['capacity-scheduler']['properties'], {'capacity-scheduler': 'yarn.scheduler.capacity.root.accessible-node-labels=*\nyarn.scheduler.capacity.maximum-am-resource-percent=1\nyarn.scheduler.capacity.node-locality-delay=40\nyarn.scheduler.capacity.root.capacity=100\nyarn.scheduler.capacity.root.default.state=RUNNING\nyarn.scheduler.capacity.root.default.maximum-capacity=80.0\nyarn.scheduler.capacity.root.queues=default,llap\nyarn.scheduler.capacity.maximum-applications=10000\nyarn.scheduler.capacity.root.default.user-limit-factor=1\nyarn.scheduler.capacity.root.acl_administer_queue=*\nyarn.scheduler.capacity.root.default.acl_submit_applications=*\nyarn.scheduler.capacity.root.default.capacity=80.0\nyarn.scheduler.capacity.queue-mappings-override.enable=false\nyarn.scheduler.capacity.root.ordering-policy=priority-utilization\nyarn.scheduler.capacity.root.llap.user-limit-factor=1\nyarn.scheduler.capacity.root.llap.state=RUNNING\nyarn.scheduler.capacity.root.llap.ordering-policy=fifo\nyarn.scheduler.capacity.root.llap.priority=10\nyarn.scheduler.capacity.root.llap.minimum-user-limit-percent=100\nyarn.scheduler.capacity.root.llap.maximum-capacity=20.0\nyarn.scheduler.capacity.root.llap.capacity=20.0\nyarn.scheduler.capacity.root.llap.acl_submit_applications=hive\nyarn.scheduler.capacity.root.llap.acl_administer_queue=hive\nyarn.scheduler.capacity.root.llap.maximum-am-resource-percent=1'}) + self.assertEqual(configurations['hive-interactive-site']['properties']['hive.server2.tez.sessions.per.default.queue'], '1') +- self.assertEquals(configurations['hive-interactive-site']['property_attributes']['hive.server2.tez.sessions.per.default.queue'], {'maximum': '4', 'minimum': '1'}) ++ self.assertEqual(configurations['hive-interactive-site']['property_attributes']['hive.server2.tez.sessions.per.default.queue'], {'maximum': '4', 'minimum': '1'}) + + self.assertTrue('num_llap_nodes_for_llap_daemons' not in configurations['hive-interactive-env']['properties']) + self.assertTrue('num_llap_nodes' not in configurations['hive-interactive-env']['properties']) +@@ -3200,7 +3200,7 @@ + self.assertEqual(configurations['hive-interactive-site']['properties']['hive.auto.convert.join.noconditionaltask.size'], '1145044992') + + self.assertEqual(configurations['tez-interactive-site']['properties']['tez.am.resource.memory.mb'], '4433') +- self.assertEquals(configurations['hive-interactive-site']['property_attributes']['hive.llap.daemon.queue.name'], {'entries': [{'value': 'default', 'label': 'default'}, {'value': 'llap', 'label': 'llap'}]}) ++ self.assertEqual(configurations['hive-interactive-site']['property_attributes']['hive.llap.daemon.queue.name'], {'entries': [{'value': 'default', 'label': 'default'}, {'value': 'llap', 'label': 'llap'}]}) + + + +@@ -3279,9 +3279,9 @@ + ], + "changed-configurations": [ + { +- u'old_value': u'3', +- u'type': u'hive-interactive-site', +- u'name': u'hive.server2.tez.sessions.per.default.queue' ++ 'old_value': '3', ++ 'type': 'hive-interactive-site', ++ 'name': 'hive.server2.tez.sessions.per.default.queue' + } + ], + "configurations": { +@@ -3375,7 +3375,7 @@ + self.stackAdvisor.recommendYARNConfigurations(configurations, clusterData, services, self.hosts) + + self.assertEqual(configurations['capacity-scheduler']['properties'], {'capacity-scheduler': 'yarn.scheduler.capacity.root.accessible-node-labels=*\nyarn.scheduler.capacity.maximum-am-resource-percent=1\nyarn.scheduler.capacity.node-locality-delay=40\nyarn.scheduler.capacity.root.capacity=100\nyarn.scheduler.capacity.root.default.state=RUNNING\nyarn.scheduler.capacity.root.default.maximum-capacity=0.0\nyarn.scheduler.capacity.root.queues=default,llap\nyarn.scheduler.capacity.maximum-applications=10000\nyarn.scheduler.capacity.root.default.user-limit-factor=1\nyarn.scheduler.capacity.root.acl_administer_queue=*\nyarn.scheduler.capacity.root.default.acl_submit_applications=*\nyarn.scheduler.capacity.root.default.capacity=0.0\nyarn.scheduler.capacity.queue-mappings-override.enable=false\nyarn.scheduler.capacity.root.ordering-policy=priority-utilization\nyarn.scheduler.capacity.root.llap.user-limit-factor=1\nyarn.scheduler.capacity.root.llap.state=RUNNING\nyarn.scheduler.capacity.root.llap.ordering-policy=fifo\nyarn.scheduler.capacity.root.llap.priority=10\nyarn.scheduler.capacity.root.llap.minimum-user-limit-percent=100\nyarn.scheduler.capacity.root.llap.maximum-capacity=100.0\nyarn.scheduler.capacity.root.llap.capacity=100.0\nyarn.scheduler.capacity.root.llap.acl_submit_applications=hive\nyarn.scheduler.capacity.root.llap.acl_administer_queue=hive\nyarn.scheduler.capacity.root.llap.maximum-am-resource-percent=1'}) +- self.assertEquals(configurations['hive-interactive-site']['property_attributes']['hive.server2.tez.sessions.per.default.queue'], {'maximum': '4'}) ++ self.assertEqual(configurations['hive-interactive-site']['property_attributes']['hive.server2.tez.sessions.per.default.queue'], {'maximum': '4'}) + + self.assertTrue('num_llap_nodes_for_llap_daemons' not in configurations['hive-interactive-env']['properties']) + self.assertTrue('num_llap_nodes' not in configurations['hive-interactive-env']['properties']) +@@ -3397,7 +3397,7 @@ + self.assertEqual(configurations['hive-interactive-site']['properties']['hive.auto.convert.join.noconditionaltask.size'], '572522496') + + self.assertTrue('tez.am.resource.memory.mb' not in configurations['tez-interactive-site']['properties']) +- self.assertEquals(configurations['hive-interactive-site']['property_attributes']['hive.llap.daemon.queue.name'], {'entries': [{'value': 'default', 'label': 'default'}, {'value': 'llap', 'label': 'llap'}]}) ++ self.assertEqual(configurations['hive-interactive-site']['property_attributes']['hive.llap.daemon.queue.name'], {'entries': [{'value': 'default', 'label': 'default'}, {'value': 'llap', 'label': 'llap'}]}) + + + +@@ -3483,9 +3483,9 @@ + ], + "changed-configurations": [ + { +- u'old_value': u'3', +- u'type': u'hive-interactive-site', +- u'name': u'hive.server2.tez.sessions.per.default.queue' ++ 'old_value': '3', ++ 'type': 'hive-interactive-site', ++ 'name': 'hive.server2.tez.sessions.per.default.queue' + } + ], + "configurations": { +@@ -3568,7 +3568,7 @@ + self.stackAdvisor.recommendYARNConfigurations(configurations, clusterData, services, self.hosts) + + self.assertTrue('capacity-scheduler' not in configurations) +- self.assertEquals(configurations['hive-interactive-site']['property_attributes']['hive.server2.tez.sessions.per.default.queue'], {'maximum': '4'}) ++ self.assertEqual(configurations['hive-interactive-site']['property_attributes']['hive.server2.tez.sessions.per.default.queue'], {'maximum': '4'}) + + self.assertTrue(configurations['hive-interactive-env']['properties']['num_llap_nodes'], 3) + self.assertTrue('num_llap_nodes_for_llap_daemons' not in configurations['hive-interactive-env']['properties']) +@@ -3589,7 +3589,7 @@ + self.assertEqual(configurations['hive-interactive-site']['properties']['hive.auto.convert.join.noconditionaltask.size'], '572522496') + + self.assertTrue('tez.am.resource.memory.mb' not in configurations['tez-interactive-site']['properties']) +- self.assertEquals(configurations['hive-interactive-site']['property_attributes']['hive.llap.daemon.queue.name'], {'entries': [{'value': 'default', 'label': 'default'}]}) ++ self.assertEqual(configurations['hive-interactive-site']['property_attributes']['hive.llap.daemon.queue.name'], {'entries': [{'value': 'default', 'label': 'default'}]}) + + + +@@ -3792,7 +3792,7 @@ + self.assertTrue('capacity-scheduler' not in configurations) + + self.assertEqual(configurations['hive-interactive-site']['properties']['hive.server2.tez.sessions.per.default.queue'], '1') +- self.assertEquals(configurations['hive-interactive-site']['property_attributes']['hive.server2.tez.sessions.per.default.queue'], {'maximum': '4', 'minimum': '1'}) ++ self.assertEqual(configurations['hive-interactive-site']['property_attributes']['hive.server2.tez.sessions.per.default.queue'], {'maximum': '4', 'minimum': '1'}) + + self.assertTrue(configurations['hive-interactive-env']['properties']['num_llap_nodes'], 3) + self.assertTrue('num_llap_nodes_for_llap_daemons' not in configurations['hive-interactive-env']['properties']) +@@ -3813,7 +3813,7 @@ + self.assertEqual(configurations['hive-interactive-site']['properties']['hive.auto.convert.join.noconditionaltask.size'], '572522496') + + self.assertTrue('tez.am.resource.memory.mb' not in configurations['tez-interactive-site']['properties']) +- self.assertEquals(configurations['hive-interactive-site']['property_attributes']['hive.llap.daemon.queue.name'], {'entries': [{'value': 'a1', 'label': 'a1'}, {'value': 'b', 'label': 'b'}, {'value': 'llap', 'label': 'llap'}]}) ++ self.assertEqual(configurations['hive-interactive-site']['property_attributes']['hive.llap.daemon.queue.name'], {'entries': [{'value': 'a1', 'label': 'a1'}, {'value': 'b', 'label': 'b'}, {'value': 'llap', 'label': 'llap'}]}) + + + +@@ -3900,9 +3900,9 @@ + ], + "changed-configurations": [ + { +- u'old_value': u'3', +- u'type': u'hive-interactive-site', +- u'name': u'hive.server2.tez.sessions.per.default.queue' ++ 'old_value': '3', ++ 'type': 'hive-interactive-site', ++ 'name': 'hive.server2.tez.sessions.per.default.queue' + } + ], + "configurations": { +@@ -4031,7 +4031,7 @@ + self.assertEqual(configurations['hive-interactive-env']['properties']['llap_heap_size'], '0') + + self.assertEqual(configurations['hive-interactive-env']['properties']['slider_am_container_mb'], '1024') +- self.assertEquals(configurations['hive-interactive-env']['property_attributes']['num_llap_nodes'], ++ self.assertEqual(configurations['hive-interactive-env']['property_attributes']['num_llap_nodes'], + {'maximum': '5', 'minimum': '1', 'read_only': 'true'}) + + self.assertTrue('tez.am.resource.memory.mb' not in configurations['tez-interactive-site']['properties']) +@@ -4121,9 +4121,9 @@ + ], + "changed-configurations": [ + { +- u'old_value': u'3', +- u'type': u'hive-interactive-site', +- u'name': u'hive.server2.tez.sessions.per.default.queue' ++ 'old_value': '3', ++ 'type': 'hive-interactive-site', ++ 'name': 'hive.server2.tez.sessions.per.default.queue' + } + ], + "configurations": { +@@ -4212,7 +4212,7 @@ + # Test + self.stackAdvisor.recommendYARNConfigurations(configurations, clusterData, services, self.hosts_9_total) + self.assertTrue('capacity-scheduler' not in configurations) +- self.assertEquals(configurations['hive-interactive-site']['property_attributes']['hive.server2.tez.sessions.per.default.queue'], {'maximum': '22'}) ++ self.assertEqual(configurations['hive-interactive-site']['property_attributes']['hive.server2.tez.sessions.per.default.queue'], {'maximum': '22'}) + + self.assertTrue(configurations['hive-interactive-env']['properties']['num_llap_nodes'], 3) + self.assertTrue('num_llap_nodes_for_llap_daemons' not in configurations['hive-interactive-env']['properties']) +@@ -4233,7 +4233,7 @@ + self.assertEqual(configurations['hive-interactive-site']['properties']['hive.auto.convert.join.noconditionaltask.size'], '1145044992') + + self.assertTrue('tez.am.resource.memory.mb' not in configurations['tez-interactive-site']['properties']) +- self.assertEquals(configurations['hive-interactive-site']['property_attributes']['hive.llap.daemon.queue.name'], {'entries': [{'value': 'default', 'label': 'default'}]}) ++ self.assertEqual(configurations['hive-interactive-site']['property_attributes']['hive.llap.daemon.queue.name'], {'entries': [{'value': 'default', 'label': 'default'}]}) + + + ################################################################## +@@ -4245,7 +4245,7 @@ + # Test + self.stackAdvisor.recommendYARNConfigurations(configurations, clusterData, services, self.hosts_9_total) + self.assertTrue('capacity-scheduler' not in configurations) +- self.assertEquals(configurations['hive-interactive-site']['property_attributes']['hive.server2.tez.sessions.per.default.queue'], {'maximum': '22'}) ++ self.assertEqual(configurations['hive-interactive-site']['property_attributes']['hive.server2.tez.sessions.per.default.queue'], {'maximum': '22'}) + + self.assertTrue(configurations['hive-interactive-env']['properties']['num_llap_nodes'], 3) + self.assertTrue('num_llap_nodes_for_llap_daemons' not in configurations['hive-interactive-env']['properties']) +@@ -4266,7 +4266,7 @@ + self.assertEqual(configurations['hive-interactive-site']['properties']['hive.auto.convert.join.noconditionaltask.size'], '1145044992') + + self.assertTrue('tez.am.resource.memory.mb' not in configurations['tez-interactive-site']['properties']) +- self.assertEquals(configurations['hive-interactive-site']['property_attributes']['hive.llap.daemon.queue.name'], {'entries': [{'value': 'default', 'label': 'default'}]}) ++ self.assertEqual(configurations['hive-interactive-site']['property_attributes']['hive.llap.daemon.queue.name'], {'entries': [{'value': 'default', 'label': 'default'}]}) + + + ################################################################### +@@ -4278,7 +4278,7 @@ + # Test + self.stackAdvisor.recommendYARNConfigurations(configurations, clusterData, services, self.hosts_9_total) + self.assertTrue('capacity-scheduler' not in configurations) +- self.assertEquals(configurations['hive-interactive-site']['property_attributes']['hive.server2.tez.sessions.per.default.queue'], {'maximum': '22'}) ++ self.assertEqual(configurations['hive-interactive-site']['property_attributes']['hive.server2.tez.sessions.per.default.queue'], {'maximum': '22'}) + + self.assertTrue(configurations['hive-interactive-env']['properties']['num_llap_nodes'], 3) + self.assertTrue('num_llap_nodes_for_llap_daemons' not in configurations['hive-interactive-env']['properties']) +@@ -4299,7 +4299,7 @@ + self.assertEqual(configurations['hive-interactive-site']['properties']['hive.auto.convert.join.noconditionaltask.size'], '1145044992') + + self.assertTrue('tez.am.resource.memory.mb' not in configurations['tez-interactive-site']['properties']) +- self.assertEquals(configurations['hive-interactive-site']['property_attributes']['hive.llap.daemon.queue.name'], {'entries': [{'value': 'default', 'label': 'default'}]}) ++ self.assertEqual(configurations['hive-interactive-site']['property_attributes']['hive.llap.daemon.queue.name'], {'entries': [{'value': 'default', 'label': 'default'}]}) + + + +@@ -4385,9 +4385,9 @@ + ], + "changed-configurations": [ + { +- u'old_value': u'false', +- u'type': u'hive-interactive-env', +- u'name': u'enable_hive_interactive' ++ 'old_value': 'false', ++ 'type': 'hive-interactive-env', ++ 'name': 'enable_hive_interactive' + } + ], + "configurations": { +@@ -4479,17 +4479,17 @@ + self.stackAdvisor.recommendHIVEConfigurations(configurations, clusterData, services, self.hosts) + + +- self.assertEquals(configurations['hive-interactive-site']['properties']['hive.llap.daemon.queue.name'], ++ self.assertEqual(configurations['hive-interactive-site']['properties']['hive.llap.daemon.queue.name'], + self.expected_hive_interactive_site_llap['hive-interactive-site']['properties']['hive.llap.daemon.queue.name']) +- self.assertEquals(configurations['hive-interactive-site']['properties']['hive.server2.tez.default.queues'], 'llap') +- self.assertEquals(configurations['hive-interactive-env']['property_attributes']['num_llap_nodes'], ++ self.assertEqual(configurations['hive-interactive-site']['properties']['hive.server2.tez.default.queues'], 'llap') ++ self.assertEqual(configurations['hive-interactive-env']['property_attributes']['num_llap_nodes'], + {'maximum': '1', 'minimum': '1', 'read_only': 'false'}) + self.assertEqual(configurations['hive-interactive-site']['properties']['hive.llap.io.threadpool.size'], '3') + + self.assertEqual(configurations['hive-interactive-site']['properties']['hive.llap.io.memory.size'], '186368') + self.assertEqual(configurations['hive-interactive-env']['properties']['llap_heap_size'], '9830') + self.assertEqual(configurations['tez-interactive-site']['properties']['tez.runtime.io.sort.mb'], '1092') +- self.assertEquals(configurations['tez-interactive-site']['property_attributes']['tez.runtime.io.sort.mb'], {'maximum': '1800'}) ++ self.assertEqual(configurations['tez-interactive-site']['property_attributes']['tez.runtime.io.sort.mb'], {'maximum': '1800'}) + + + +@@ -4576,9 +4576,9 @@ + ], + "changed-configurations": [ + { +- u'old_value': u'llap', +- u'type': u'hive-interactive-site', +- u'name': u'hive.llap.daemon.queue.name' ++ 'old_value': 'llap', ++ 'type': 'hive-interactive-site', ++ 'name': 'hive.llap.daemon.queue.name' + } + ], + "configurations": { +@@ -4666,7 +4666,7 @@ + + self.assertTrue('hive.llap.daemon.queue.name' not in configurations['hive-interactive-site']['properties']) + self.assertEqual(configurations['hive-interactive-site']['properties']['hive.server2.tez.sessions.per.default.queue'], '1') +- self.assertEquals(configurations['hive-interactive-site']['property_attributes']['hive.server2.tez.sessions.per.default.queue'], {'maximum': '4', 'minimum': '1'}) ++ self.assertEqual(configurations['hive-interactive-site']['property_attributes']['hive.server2.tez.sessions.per.default.queue'], {'maximum': '4', 'minimum': '1'}) + + self.assertTrue(configurations['hive-interactive-env']['properties']['num_llap_nodes'], 1) + self.assertTrue(configurations['hive-interactive-env']['properties']['num_llap_nodes_for_llap_daemons'], 1) +@@ -4688,7 +4688,7 @@ + self.assertEqual(configurations['hive-interactive-site']['properties']['hive.auto.convert.join.noconditionaltask.size'], '572522496') + + self.assertTrue('tez.am.resource.memory.mb' not in configurations['tez-interactive-site']['properties']) +- self.assertEquals(configurations['hive-interactive-site']['property_attributes']['hive.llap.daemon.queue.name'], {'entries': [{'value': 'default', 'label': 'default'}]}) ++ self.assertEqual(configurations['hive-interactive-site']['property_attributes']['hive.llap.daemon.queue.name'], {'entries': [{'value': 'default', 'label': 'default'}]}) + + + +@@ -4749,9 +4749,9 @@ + ], + "changed-configurations": [ + { +- u'old_value': u'', +- u'type': u'', +- u'name': u'' ++ 'old_value': '', ++ 'type': '', ++ 'name': '' + } + ], + "configurations": { +@@ -4797,10 +4797,10 @@ + self.stackAdvisor.recommendYARNConfigurations(configurations, clusterData, services, self.hosts) + + # Check output +- self.assertEquals(configurations['capacity-scheduler']['properties'], ++ self.assertEqual(configurations['capacity-scheduler']['properties'], + self.expected_capacity_scheduler_empty['properties']) + self.assertFalse('hive-interactive-env' in configurations) +- self.assertEquals(configurations['hive-interactive-site']['properties'], ++ self.assertEqual(configurations['hive-interactive-site']['properties'], + self.expected_hive_interactive_site_empty['hive-interactive-site']['properties']) + + +@@ -5054,35 +5054,35 @@ + + self.stackAdvisor.recommendAtlasConfigurations(configurations, clusterData, services, hosts) + # test for Ranger Atlas plugin disabled +- self.assertEquals(configurations['application-properties']['properties']['atlas.authorizer.impl'], 'simple', 'Test atlas.authorizer.impl with Ranger Atlas plugin is disabled ') ++ self.assertEqual(configurations['application-properties']['properties']['atlas.authorizer.impl'], 'simple', 'Test atlas.authorizer.impl with Ranger Atlas plugin is disabled ') + + configurations['ranger-atlas-plugin-properties']['properties']['ranger-atlas-plugin-enabled'] = 'Yes' + # configurations['application-properties']['properties']['atlas.authorizer.impl'] = 'ranger' + self.stackAdvisor.recommendAtlasConfigurations(configurations,clusterData,services,hosts) +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + + services['ambari-server-properties'] = {'java.home': '/usr/jdk64/jdk1.7.3_23'} + self.stackAdvisor.recommendAtlasConfigurations(configurations, clusterData, services, hosts) +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + + services['configurations']['kafka-broker']['properties']['listeners'] = ' PLAINTEXT://localhost:5522 , PLAINTEXTSASL://localhost:2255 ' + expected['application-properties']['properties']['atlas.kafka.bootstrap.servers'] = 'c6401.ambari.apache.org:5522' + self.stackAdvisor.recommendAtlasConfigurations(configurations, clusterData, services, hosts) +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + services['configurations']['cluster-env']['properties']['security_enabled']='true' + services['configurations']['kafka-broker']['properties']['listeners'] = ' PLAINTEXT://localhost:5522 , PLAINTEXTSASL://localhost:2266 ' + expected['application-properties']['properties']['atlas.kafka.bootstrap.servers'] = 'c6401.ambari.apache.org:2266' + self.stackAdvisor.recommendAtlasConfigurations(configurations, clusterData, services, hosts) +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + services['configurations']['kafka-broker']['properties']['listeners'] = ' SASL_PLAINTEXT://localhost:2233 , PLAINTEXT://localhost:5577 ' + expected['application-properties']['properties']['atlas.kafka.bootstrap.servers'] = 'c6401.ambari.apache.org:2233' + self.stackAdvisor.recommendAtlasConfigurations(configurations, clusterData, services, hosts) +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + + services['configurations']['cluster-env']['properties']['security_enabled']='false' + expected['application-properties']['properties']['atlas.kafka.bootstrap.servers'] = 'c6401.ambari.apache.org:5577' + self.stackAdvisor.recommendAtlasConfigurations(configurations, clusterData, services, hosts) +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + + + def test_validationAtlasConfigs(self): +@@ -5266,11 +5266,11 @@ + # Avoid an unnecessary sort in the stack advisor, sort here for easy comparison + actualHosts = configurations['core-site']['properties']['hadoop.proxyuser.HTTP.hosts'] + expectedHosts = expected_configuration['core-site']['properties']['hadoop.proxyuser.HTTP.hosts'] +- self.assertEquals(splitAndSort(actualHosts), splitAndSort(expectedHosts)) ++ self.assertEqual(splitAndSort(actualHosts), splitAndSort(expectedHosts)) + # Do a simple check for hbase-site + self.assertTrue('hbase-site' in configurations) + self.assertTrue('properties' in configurations['hbase-site']) +- self.assertEquals(configurations['hbase-site']['properties']['hbase.master.ui.readonly'], ++ self.assertEqual(configurations['hbase-site']['properties']['hbase.master.ui.readonly'], + expected_configuration['hbase-site']['properties']['hbase.master.ui.readonly']) + + def test_phoenixQueryServerSecureConfigsNoProxyuser(self): +@@ -5400,11 +5400,11 @@ + # Avoid an unnecessary sort in the stack advisor, sort here for easy comparison + actualHosts = configurations['core-site']['properties']['hadoop.proxyuser.HTTP.hosts'] + expectedHosts = expected_configuration['core-site']['properties']['hadoop.proxyuser.HTTP.hosts'] +- self.assertEquals(splitAndSort(actualHosts), splitAndSort(expectedHosts)) ++ self.assertEqual(splitAndSort(actualHosts), splitAndSort(expectedHosts)) + # Do a simple check for hbase-site + self.assertTrue('hbase-site' in configurations) + self.assertTrue('properties' in configurations['hbase-site']) +- self.assertEquals(configurations['hbase-site']['properties']['hbase.master.ui.readonly'], ++ self.assertEqual(configurations['hbase-site']['properties']['hbase.master.ui.readonly'], + expected_configuration['hbase-site']['properties']['hbase.master.ui.readonly']) + + def test_phoenixQueryServerSecureConfigsAppendProxyuser(self): +@@ -5535,11 +5535,11 @@ + # Avoid an unnecessary sort in the stack advisor, sort here for easy comparison + actualHosts = configurations['core-site']['properties']['hadoop.proxyuser.HTTP.hosts'] + expectedHosts = expected_configuration['core-site']['properties']['hadoop.proxyuser.HTTP.hosts'] +- self.assertEquals(splitAndSort(actualHosts), splitAndSort(expectedHosts)) ++ self.assertEqual(splitAndSort(actualHosts), splitAndSort(expectedHosts)) + # Do a simple check for hbase-site + self.assertTrue('hbase-site' in configurations) + self.assertTrue('properties' in configurations['hbase-site']) +- self.assertEquals(configurations['hbase-site']['properties']['hbase.master.ui.readonly'], ++ self.assertEqual(configurations['hbase-site']['properties']['hbase.master.ui.readonly'], + expected_configuration['hbase-site']['properties']['hbase.master.ui.readonly']) + + def test_validationYARNServicecheckQueueName(self): +@@ -5626,10 +5626,10 @@ + self.stackAdvisor.recommendMapReduce2Configurations(configurations, clusterData, services, hosts) + self.stackAdvisor.recommendHIVEConfigurations(configurations, clusterData, services, hosts) + self.stackAdvisor.recommendTezConfigurations(configurations, clusterData, services, hosts) +- self.assertEquals(configurations["yarn-env"]["properties"]["service_check.queue.name"], "ndfqueue2") +- self.assertEquals(configurations["mapred-site"]["properties"]["mapreduce.job.queuename"], "ndfqueue2") +- self.assertEquals(configurations["webhcat-site"]["properties"]["templeton.hadoop.queue.name"], "ndfqueue2") +- self.assertEquals(configurations["tez-site"]["properties"]["tez.queue.name"], "ndfqueue2") ++ self.assertEqual(configurations["yarn-env"]["properties"]["service_check.queue.name"], "ndfqueue2") ++ self.assertEqual(configurations["mapred-site"]["properties"]["mapreduce.job.queuename"], "ndfqueue2") ++ self.assertEqual(configurations["webhcat-site"]["properties"]["templeton.hadoop.queue.name"], "ndfqueue2") ++ self.assertEqual(configurations["tez-site"]["properties"]["tez.queue.name"], "ndfqueue2") + + def assertValidationResult(self, expectedItems, result): + actualItems = [] +@@ -5637,14 +5637,14 @@ + next = {"message": item["message"], "level": item["level"]} + try: + next["host"] = item["host"] +- except KeyError, err: ++ except KeyError as err: + pass + actualItems.append(next) + self.checkEqual(expectedItems, actualItems) + + def checkEqual(self, l1, l2): + if not len(l1) == len(l2) or not sorted(l1) == sorted(l2): +- raise AssertionError("list1={0}, list2={1}".format(l1, l2)) ++ raise AssertionError("list1={}, list2={}".format(l1, l2)) + + def prepareServices(self, servicesInfo): + services = { "Versions" : { "stack_name" : "HDP", "stack_version" : "2.5" } } +@@ -5896,13 +5896,13 @@ + ] + } + +- self.assertEquals(self.stackAdvisor.get_phoenix_query_server_hosts(services, hosts), ++ self.assertEqual(self.stackAdvisor.get_phoenix_query_server_hosts(services, hosts), + phoenix_query_server_hosts) + + phoenix_query_server_hosts = [] + services['services'][0]['components'][0]['StackServiceComponents']['hostnames'] = phoenix_query_server_hosts + +- self.assertEquals(self.stackAdvisor.get_phoenix_query_server_hosts(services, hosts), ++ self.assertEqual(self.stackAdvisor.get_phoenix_query_server_hosts(services, hosts), + phoenix_query_server_hosts) + + def test_recommendStormConfigurations(self): +@@ -5959,9 +5959,9 @@ + + # Test nimbus.authorizer with Ranger Storm plugin disabled in non-kerberos environment + self.stackAdvisor.recommendStormConfigurations(configurations, clusterData, services, None) +- self.assertEquals(configurations['storm-site']['property_attributes']['nimbus.authorizer'], {'delete': 'true'}, "Test nimbus.authorizer with Ranger Storm plugin disabled in non-kerberos environment") +- self.assertEquals(configurations['storm-site']['properties']['storm.cluster.metrics.consumer.register'], 'null') +- self.assertEquals(configurations['storm-site']['properties']['topology.metrics.consumer.register'], 'null') ++ self.assertEqual(configurations['storm-site']['property_attributes']['nimbus.authorizer'], {'delete': 'true'}, "Test nimbus.authorizer with Ranger Storm plugin disabled in non-kerberos environment") ++ self.assertEqual(configurations['storm-site']['properties']['storm.cluster.metrics.consumer.register'], 'null') ++ self.assertEqual(configurations['storm-site']['properties']['topology.metrics.consumer.register'], 'null') + + services = { + "services": +@@ -6041,15 +6041,15 @@ + services['configurations']['ranger-storm-plugin-properties']['properties']['ranger-storm-plugin-enabled'] = 'Yes' + services['configurations']['cluster-env']['properties']['security_enabled'] = 'false' + self.stackAdvisor.recommendStormConfigurations(configurations, clusterData, services, None) +- self.assertEquals(configurations['storm-site']['property_attributes']['nimbus.authorizer'], {'delete': 'true'}, "Test nimbus.authorizer with Ranger Storm plugin enabled in non-kerberos environment") +- self.assertEquals(configurations['storm-site']['properties']['storm.cluster.metrics.consumer.register'], '[{"class": "org.apache.hadoop.metrics2.sink.storm.StormTimelineMetricsReporter"}]') +- self.assertEquals(configurations['storm-site']['properties']['topology.metrics.consumer.register'], '[{"class": "org.apache.hadoop.metrics2.sink.storm.StormTimelineMetricsSink", ' ++ self.assertEqual(configurations['storm-site']['property_attributes']['nimbus.authorizer'], {'delete': 'true'}, "Test nimbus.authorizer with Ranger Storm plugin enabled in non-kerberos environment") ++ self.assertEqual(configurations['storm-site']['properties']['storm.cluster.metrics.consumer.register'], '[{"class": "org.apache.hadoop.metrics2.sink.storm.StormTimelineMetricsReporter"}]') ++ self.assertEqual(configurations['storm-site']['properties']['topology.metrics.consumer.register'], '[{"class": "org.apache.hadoop.metrics2.sink.storm.StormTimelineMetricsSink", ' + '"parallelism.hint": 1, ' +- '"whitelist": ["kafkaOffset\\\..+/", "__complete-latency", "__process-latency", ' ++ '"whitelist": ["kafkaOffset\\\\..+/", "__complete-latency", "__process-latency", ' + '"__execute-latency", ' +- '"__receive\\\.population$", "__sendqueue\\\.population$", "__execute-count", "__emit-count", ' +- '"__ack-count", "__fail-count", "memory/heap\\\.usedBytes$", "memory/nonHeap\\\.usedBytes$", ' +- '"GC/.+\\\.count$", "GC/.+\\\.timeMs$"]}]') ++ '"__receive\\\\.population$", "__sendqueue\\\\.population$", "__execute-count", "__emit-count", ' ++ '"__ack-count", "__fail-count", "memory/heap\\\\.usedBytes$", "memory/nonHeap\\\\.usedBytes$", ' ++ '"GC/.+\\\\.count$", "GC/.+\\\\.timeMs$"]}]') + + # Test nimbus.authorizer with Ranger Storm plugin being enabled in kerberos environment + configurations['storm-site']['properties'] = {} +@@ -6059,7 +6059,7 @@ + services['configurations']['storm-site']['properties']['storm.zookeeper.superACL'] = 'sasl:{{storm_bare_jaas_principal}}' + services['configurations']['cluster-env']['properties']['security_enabled'] = 'true' + self.stackAdvisor.recommendStormConfigurations(configurations, clusterData, services, None) +- self.assertEquals(configurations['storm-site']['properties']['nimbus.authorizer'], 'org.apache.ranger.authorization.storm.authorizer.RangerStormAuthorizer', "Test nimbus.authorizer with Ranger Storm plugin enabled in kerberos environment") ++ self.assertEqual(configurations['storm-site']['properties']['nimbus.authorizer'], 'org.apache.ranger.authorization.storm.authorizer.RangerStormAuthorizer', "Test nimbus.authorizer with Ranger Storm plugin enabled in kerberos environment") + + # Test nimbus.authorizer with Ranger Storm plugin being disabled in kerberos environment + configurations['storm-site']['properties'] = {} +@@ -6069,7 +6069,7 @@ + services['configurations']['storm-site']['properties']['nimbus.authorizer'] = 'org.apache.ranger.authorization.storm.authorizer.RangerStormAuthorizer' + services['configurations']['cluster-env']['properties']['security_enabled'] = 'true' + self.stackAdvisor.recommendStormConfigurations(configurations, clusterData, services, None) +- self.assertEquals(configurations['storm-site']['properties']['nimbus.authorizer'], 'org.apache.storm.security.auth.authorizer.SimpleACLAuthorizer', "Test nimbus.authorizer with Ranger Storm plugin being disabled in kerberos environment") ++ self.assertEqual(configurations['storm-site']['properties']['nimbus.authorizer'], 'org.apache.storm.security.auth.authorizer.SimpleACLAuthorizer', "Test nimbus.authorizer with Ranger Storm plugin being disabled in kerberos environment") + + def test_validateSpark2Defaults(self): + properties = {} +@@ -6091,7 +6091,7 @@ + res_expected = [] + + res = self.stackAdvisor.validateSpark2Defaults(properties, recommendedDefaults, configurations, services, {}) +- self.assertEquals(res_expected, res) ++ self.assertEqual(res_expected, res) + + + def test_recommendOozieConfigurations_noFalconServer(self): +@@ -6125,7 +6125,7 @@ + } + + self.stackAdvisor.recommendOozieConfigurations(configurations, clusterData, services, None) +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + + + def test_recommendOozieConfigurations_withFalconServer(self): +@@ -6256,7 +6256,7 @@ + } + + self.stackAdvisor.recommendOozieConfigurations(configurations, clusterData, services, None) +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + + + """ +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.5/HIVE/test_hive_server_int.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.5/HIVE/test_hive_server_int.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.5/HIVE/test_hive_server_int.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.5/HIVE/test_hive_server_int.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 stacks.utils.RMFTestCase import * + +-from mock.mock import MagicMock, patch ++from unittest.mock import MagicMock, patch + from resource_management.libraries import functions + from resource_management.core.logger import Logger + from resource_management.libraries.script.config_dictionary import UnknownConfiguration +@@ -107,7 +107,7 @@ + + self.assertResourceCalled('Execute', + '/home/hive/llap-slider-05Apr2016/run.sh', +- logoutput= True, user=u'hive' ++ logoutput= True, user='hive' + ) + self.assertResourceCalled('Execute', + 'hive --config /usr/hdp/current/hive-server2-hive2/conf/conf.server --service metatool -updateLocation hdfs://c6401.ambari.apache.org:8020 OK.', +@@ -117,7 +117,7 @@ + self.assertResourceCalled('Execute', + '/tmp/start_hiveserver2_interactive_script /var/run/hive/hive-server2-interactive.out /var/log/hive/hive-server2-interactive.err /var/run/hive/hive-interactive.pid /usr/hdp/current/hive-server2-hive2/conf/conf.server /var/log/hive', + environment={'HIVE_BIN': '/usr/hdp/current/hive-server2-hive2/bin/hive2', +- 'JAVA_HOME': u'/usr/jdk64/jdk1.7.0_45'}, ++ 'JAVA_HOME': '/usr/jdk64/jdk1.7.0_45'}, + not_if="ls /var/run/hive/hive-interactive.pid >/dev/null 2>&1 && ps -p 123 >/dev/null 2>&1", + user='hive', + path=['/bin:/usr/hdp/current/hive-server2-hive2/bin:/usr/hdp/current/hadoop-client/bin'], +@@ -179,7 +179,7 @@ + self.assertResourceCalled('Execute', + '/tmp/start_hiveserver2_interactive_script /var/run/hive/hive-server2-interactive.out /var/log/hive/hive-server2-interactive.err /var/run/hive/hive-interactive.pid /usr/hdp/current/hive-server2-hive2/conf/conf.server /var/log/hive', + environment={'HIVE_BIN': '/usr/hdp/current/hive-server2-hive2/bin/hive2', +- 'JAVA_HOME': u'/usr/jdk64/jdk1.7.0_45'}, ++ 'JAVA_HOME': '/usr/jdk64/jdk1.7.0_45'}, + not_if="ls /var/run/hive/hive-interactive.pid >/dev/null 2>&1 && ps -p 123 >/dev/null 2>&1", + user='hive', + path=['/bin:/usr/hdp/current/hive-server2-hive2/bin:/usr/hdp/current/hadoop-client/bin'], +@@ -227,7 +227,7 @@ + self.assertResourceCalled('Execute', + '/tmp/start_hiveserver2_interactive_script /var/run/hive/hive-server2-interactive.out /var/log/hive/hive-server2-interactive.err /var/run/hive/hive-interactive.pid /usr/hdp/current/hive-server2-hive2/conf/conf.server /var/log/hive', + environment={'HIVE_BIN': '/usr/hdp/current/hive-server2-hive2/bin/hive2', +- 'JAVA_HOME': u'/usr/jdk64/jdk1.7.0_45'}, ++ 'JAVA_HOME': '/usr/jdk64/jdk1.7.0_45'}, + not_if="ls /var/run/hive/hive-interactive.pid >/dev/null 2>&1 && ps -p 123 >/dev/null 2>&1", + user='hive', + path=['/bin:/usr/hdp/current/hive-server2-hive2/bin:/usr/hdp/current/hadoop-client/bin'], +@@ -290,7 +290,7 @@ + self.assertResourceCalled('File', '/var/run/hive/hive-interactive.pid', + action=['delete'], + ) +- self.assertResourceCalled('Execute', ('slider', 'destroy', u'llap0', '--force'), ++ self.assertResourceCalled('Execute', ('slider', 'destroy', 'llap0', '--force'), + ignore_failures = True, + user = 'hive', + timeout = 30, +@@ -300,7 +300,7 @@ + + self.assertResourceCalled('Execute', + '/home/hive/llap-slider-05Apr2016/run.sh', +- logoutput= True, user=u'hive' ++ logoutput= True, user='hive' + ) + self.assertResourceCalled('Execute', + 'hive --config /usr/hdp/current/hive-server2-hive2/conf/conf.server --service metatool -updateLocation hdfs://c6401.ambari.apache.org:8020 OK.', +@@ -310,7 +310,7 @@ + self.assertResourceCalled('Execute', + '/tmp/start_hiveserver2_interactive_script /var/run/hive/hive-server2-interactive.out /var/log/hive/hive-server2-interactive.err /var/run/hive/hive-interactive.pid /usr/hdp/current/hive-server2-hive2/conf/conf.server /var/log/hive', + environment={'HIVE_BIN': '/usr/hdp/current/hive-server2-hive2/bin/hive2', +- 'JAVA_HOME': u'/usr/jdk64/jdk1.7.0_45'}, ++ 'JAVA_HOME': '/usr/jdk64/jdk1.7.0_45'}, + not_if="ls /var/run/hive/hive-interactive.pid >/dev/null 2>&1 && ps -p 123 >/dev/null 2>&1", + user='hive', + path=['/bin:/usr/hdp/current/hive-server2-hive2/bin:/usr/hdp/current/hadoop-client/bin'], +@@ -358,7 +358,7 @@ + + self.assertResourceCalled('Execute', + '/home/hive/llap-slider-05Apr2016/run.sh', +- logoutput= True, user=u'hive' ++ logoutput= True, user='hive' + ) + self.assertResourceCalled('Execute', + 'hive --config /usr/hdp/current/hive-server2-hive2/conf/conf.server --service metatool -updateLocation hdfs://c6401.ambari.apache.org:8020 OK.', +@@ -368,7 +368,7 @@ + self.assertResourceCalled('Execute', + '/tmp/start_hiveserver2_interactive_script /var/run/hive/hive-server2-interactive.out /var/log/hive/hive-server2-interactive.err /var/run/hive/hive-interactive.pid /usr/hdp/current/hive-server2-hive2/conf/conf.server /var/log/hive', + environment={'HIVE_BIN': '/usr/hdp/current/hive-server2-hive2/bin/hive2', +- 'JAVA_HOME': u'/usr/jdk64/jdk1.7.0_45'}, ++ 'JAVA_HOME': '/usr/jdk64/jdk1.7.0_45'}, + not_if="ls /var/run/hive/hive-interactive.pid >/dev/null 2>&1 && ps -p 123 >/dev/null 2>&1", + user='hive', + path=['/bin:/usr/hdp/current/hive-server2-hive2/bin:/usr/hdp/current/hadoop-client/bin'], +@@ -418,7 +418,7 @@ + self.assertNoMoreResources() + + +- def assert_configure_default(self, no_tmp=False, default_fs_default=u'hdfs://c6401.ambari.apache.org:8020', with_cs_enabled=False): ++ def assert_configure_default(self, no_tmp=False, default_fs_default='hdfs://c6401.ambari.apache.org:8020', with_cs_enabled=False): + self.assertResourceCalled('HdfsResource', '/apps/hive/warehouse', + immutable_paths = self.DEFAULT_IMMUTABLE_PATHS, + security_enabled = False, +@@ -432,7 +432,7 @@ + hadoop_conf_dir = '/usr/hdp/current/hadoop-client/conf', + type = 'directory', + action = ['create_on_execute'], hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', hdfs_site=self.getConfig()['configurations']['hdfs-site'], principal_name='missing_principal', default_fs=default_fs_default, +- mode = 0777, ++ mode = 0o777, + ) + + self.assertResourceCalled('HdfsResource', '/user/hive', +@@ -447,36 +447,36 @@ + hadoop_conf_dir = '/usr/hdp/current/hadoop-client/conf', + type = 'directory', + action = ['create_on_execute'], hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', hdfs_site=self.getConfig()['configurations']['hdfs-site'], principal_name='missing_principal', default_fs=default_fs_default, +- mode = 0755, ++ mode = 0o755, + ) + + self.assertResourceCalled('Directory', '/etc/hive2', +- mode=0755, ++ mode=0o755, + ) + self.assertResourceCalled('Directory', '/usr/hdp/current/hive-server2-hive2/conf', + owner='hive', + group='hadoop', + create_parents=True, +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('XmlConfig', 'mapred-site.xml', + group='hadoop', + conf_dir='/usr/hdp/current/hive-server2-hive2/conf', +- mode=0644, +- configuration_attributes={u'final': {u'mapred.healthChecker.script.path': u'true', +- u'mapreduce.jobtracker.staging.root.dir': u'true'}}, ++ mode=0o644, ++ configuration_attributes={'final': {'mapred.healthChecker.script.path': 'true', ++ 'mapreduce.jobtracker.staging.root.dir': 'true'}}, + owner='hive', + configurations=self.getConfig()['configurations']['mapred-site'], + ) + self.assertResourceCalled('File', '/usr/hdp/current/hive-server2-hive2/conf/hive-default.xml.template', + owner='hive', + group='hadoop', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/usr/hdp/current/hive-server2-hive2/conf/hive-env.sh.template', + owner='hive', + group='hadoop', +- mode = 0644, ++ mode = 0o644, + ) + hive_site_conf = {} + hive_site_conf.update(self.getConfig()['configurations']['hive-site']) +@@ -485,7 +485,7 @@ + del hive_site_conf['hive.enforce.bucketing'] + del hive_site_conf['hive.enforce.sorting'] + del hive_site_conf['hive.llap.io.memory.size'] +- hive_site_conf['hive.llap.io.memory.size'] = 357564416L ++ hive_site_conf['hive.llap.io.memory.size'] = 357564416 + + hiveserver2_site_conf = {} + hiveserver2_site_conf.update(self.getConfig()['configurations']['hiveserver2-site']) +@@ -495,34 +495,34 @@ + mapred_site_conf.update(self.getConfig()['configurations']['mapred-site']) + + self.assertResourceCalled("Directory", "/usr/hdp/current/hive-server2-hive2/conf/conf.server", +- owner=u"hive", +- group=u"hadoop", ++ owner="hive", ++ group="hadoop", + create_parents=True, +- mode = 0700) ++ mode = 0o700) + + self.assertResourceCalled('XmlConfig', 'mapred-site.xml', + group='hadoop', + conf_dir='/usr/hdp/current/hive-server2-hive2/conf/conf.server', +- mode=0600, +- configuration_attributes={u'final': {u'mapred.healthChecker.script.path': u'true', +- u'mapreduce.jobtracker.staging.root.dir': u'true'}}, ++ mode=0o600, ++ configuration_attributes={'final': {'mapred.healthChecker.script.path': 'true', ++ 'mapreduce.jobtracker.staging.root.dir': 'true'}}, + owner='hive', + configurations=mapred_site_conf, + ) + + self.assertResourceCalled("File", "/usr/hdp/current/hive-server2-hive2/conf/conf.server/hive-default.xml.template", +- owner=u"hive", +- group=u"hadoop", +- mode = 0600) ++ owner="hive", ++ group="hadoop", ++ mode = 0o600) + + self.assertResourceCalled("File", "/usr/hdp/current/hive-server2-hive2/conf/conf.server/hive-env.sh.template", +- owner=u"hive", +- group=u"hadoop", +- mode = 0600) ++ owner="hive", ++ group="hadoop", ++ mode = 0o600) + self.assertResourceCalled('XmlConfig', 'tez-site.xml', + group='hadoop', + conf_dir='/etc/tez_hive2/conf', +- mode=0664, ++ mode=0o664, + configuration_attributes=UnknownConfigurationMock(), + owner='tez', + configurations=self.getConfig()['configurations']['tez-interactive-site'], +@@ -544,10 +544,10 @@ + self.assertResourceCalled('XmlConfig', 'hive-site.xml', + group='hadoop', + conf_dir=conf_dir, +- mode=0644, +- configuration_attributes={u'final': {u'hive.optimize.bucketmapjoin.sortedmerge': u'true', +- u'javax.jdo.option.ConnectionDriverName': u'true', +- u'javax.jdo.option.ConnectionPassword': u'true'}}, ++ mode=0o644, ++ configuration_attributes={'final': {'hive.optimize.bucketmapjoin.sortedmerge': 'true', ++ 'javax.jdo.option.ConnectionDriverName': 'true', ++ 'javax.jdo.option.ConnectionPassword': 'true'}}, + owner='hive', + configurations=hive_site_conf_for_client, + ) +@@ -557,17 +557,17 @@ + content=StaticFile('/var/lib/ambari-agent/data/abc.jceks'), + owner='hive', + group='hadoop', +- mode = 0640, ++ mode = 0o640, + ) + self.assertTrue('hadoop.security.credential.provider.path' in hive_site_conf) + hive_site_conf['hadoop.security.credential.provider.path'] = 'jceks://file/usr/hdp/current/hive-server2-hive2/conf/conf.server/hive-site.jceks' + self.assertResourceCalled('XmlConfig', 'hive-site.xml', + group='hadoop', + conf_dir=conf_dir, +- mode=0600, +- configuration_attributes={u'final': {u'hive.optimize.bucketmapjoin.sortedmerge': u'true', +- u'javax.jdo.option.ConnectionDriverName': u'true', +- u'javax.jdo.option.ConnectionPassword': u'true'}}, ++ mode=0o600, ++ configuration_attributes={'final': {'hive.optimize.bucketmapjoin.sortedmerge': 'true', ++ 'javax.jdo.option.ConnectionDriverName': 'true', ++ 'javax.jdo.option.ConnectionPassword': 'true'}}, + owner='hive', + configurations=hive_site_conf, + ) +@@ -576,7 +576,7 @@ + self.assertResourceCalled('XmlConfig', 'hiveserver2-site.xml', + group='hadoop', + conf_dir=conf_dir, +- mode=0600, ++ mode=0o600, + configuration_attributes={}, + owner='hive', + configurations=hiveserver2_site_conf, +@@ -585,63 +585,63 @@ + content=InlineTemplate(self.getConfig()['configurations']['hive-interactive-env']['content']), + owner='hive', + group='hadoop', +- mode = 0600, ++ mode = 0o600, + ) + self.assertResourceCalled('File', os.path.join(conf_dir, 'llap-daemon-log4j2.properties'), + content=InlineTemplate('con\ntent'), + owner='hive', + group='hadoop', +- mode=0600, ++ mode=0o600, + ) + self.assertResourceCalled('File', os.path.join(conf_dir, 'llap-cli-log4j2.properties'), + content=InlineTemplate('con\ntent'), + owner='hive', + group='hadoop', +- mode=0600, ++ mode=0o600, + ) + self.assertResourceCalled('File', os.path.join(conf_dir, 'hive-log4j2.properties'), + content=InlineTemplate('con\ntent'), # Test new line + owner='hive', + group='hadoop', +- mode=0600, ++ mode=0o600, + ) + self.assertResourceCalled('File', os.path.join(conf_dir, 'hive-exec-log4j2.properties'), + content=InlineTemplate('con\ntent'), # Test new line + owner='hive', + group='hadoop', +- mode=0600, ++ mode=0o600, + ) + self.assertResourceCalled('File', os.path.join(conf_dir, 'beeline-log4j2.properties'), + content=InlineTemplate('con\ntent'), # Test new line + owner='hive', + group='hadoop', +- mode=0600, ++ mode=0o600, + ) + self.assertResourceCalled('File', os.path.join(conf_dir, 'hadoop-metrics2-hiveserver2.properties'), + content=Template("hadoop-metrics2-hiveserver2.properties.j2"), + owner='hive', + group='hadoop', +- mode = 0600, ++ mode = 0o600, + ) + + self.assertResourceCalled('File', os.path.join(conf_dir, 'hadoop-metrics2-llapdaemon.properties'), + content=Template("hadoop-metrics2-llapdaemon.j2"), + owner='hive', + group='hadoop', +- mode = 0600 ++ mode = 0o600 + ) + + self.assertResourceCalled('File', os.path.join(conf_dir, 'hadoop-metrics2-llaptaskscheduler.properties'), + content=Template("hadoop-metrics2-llaptaskscheduler.j2"), + owner='hive', + group='hadoop', +- mode = 0600 ++ mode = 0o600 + ) + else: + self.assertResourceCalled('XmlConfig', 'hiveserver2-site.xml', + group='hadoop', + conf_dir=conf_dir, +- mode=0644, ++ mode=0o644, + configuration_attributes={}, + owner='hive', + configurations=hiveserver2_site_conf, +@@ -650,57 +650,57 @@ + content=InlineTemplate(self.getConfig()['configurations']['hive-interactive-env']['content']), + owner='hive', + group='hadoop', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', os.path.join(conf_dir, 'llap-daemon-log4j2.properties'), + content=InlineTemplate('con\ntent'), + owner='hive', + group='hadoop', +- mode=0644, ++ mode=0o644, + ) + self.assertResourceCalled('File', os.path.join(conf_dir, 'llap-cli-log4j2.properties'), + content=InlineTemplate('con\ntent'), + owner='hive', + group='hadoop', +- mode=0644, ++ mode=0o644, + ) + self.assertResourceCalled('File', os.path.join(conf_dir, 'hive-log4j2.properties'), + content=InlineTemplate('con\ntent'), # Test new line + owner='hive', + group='hadoop', +- mode=0644, ++ mode=0o644, + ) + self.assertResourceCalled('File', os.path.join(conf_dir, 'hive-exec-log4j2.properties'), + content=InlineTemplate('con\ntent'), # Test new line + owner='hive', + group='hadoop', +- mode=0644, ++ mode=0o644, + ) + self.assertResourceCalled('File', os.path.join(conf_dir, 'beeline-log4j2.properties'), + content=InlineTemplate('con\ntent'), # Test new line + owner='hive', + group='hadoop', +- mode=0644, ++ mode=0o644, + ) + self.assertResourceCalled('File', os.path.join(conf_dir, 'hadoop-metrics2-hiveserver2.properties'), + content=Template("hadoop-metrics2-hiveserver2.properties.j2"), + owner='hive', + group='hadoop', +- mode = 0644, ++ mode = 0o644, + ) + + self.assertResourceCalled('File', os.path.join(conf_dir, 'hadoop-metrics2-llapdaemon.properties'), + content=Template("hadoop-metrics2-llapdaemon.j2"), + owner='hive', + group='hadoop', +- mode = 0644 ++ mode = 0o644 + ) + + self.assertResourceCalled('File', os.path.join(conf_dir, 'hadoop-metrics2-llaptaskscheduler.properties'), + content=Template("hadoop-metrics2-llaptaskscheduler.j2"), + owner='hive', + group='hadoop', +- mode = 0644 ++ mode = 0o644 + ) + pass + +@@ -713,7 +713,7 @@ + content=Template('hive.conf.j2'), + owner='root', + group='root', +- mode=0644, ++ mode=0o644, + ) + self.assertResourceCalled('File', + '/tmp/mysql-connector-java.jar', +@@ -727,34 +727,34 @@ + sudo=True, + ) + self.assertResourceCalled('File', '/usr/hdp/current/hive-server2-hive2/lib/mysql-connector-java.jar', +- mode=0644, ++ mode=0o644, + ) + self.assertResourceCalled('File', '/usr/lib/ambari-agent/DBConnectionVerification.jar', + content=DownloadSource('http://c6401.ambari.apache.org:8080/resources' + '/DBConnectionVerification.jar'), +- mode=0644, ++ mode=0o644, + ) + self.assertResourceCalled('File', '/tmp/start_hiveserver2_interactive_script', + content=Template('startHiveserver2Interactive.sh.j2'), +- mode=0755, ++ mode=0o755, + ) + self.assertResourceCalled('Directory', '/var/run/hive', + owner='hive', +- mode=0755, ++ mode=0o755, + group='hadoop', + create_parents=True, + cd_access='a', + ) + self.assertResourceCalled('Directory', '/var/log/hive', + owner='hive', +- mode=0755, ++ mode=0o755, + group='hadoop', + create_parents=True, + cd_access='a', + ) + self.assertResourceCalled('Directory', '/var/lib/hive2', + owner='hive', +- mode=0755, ++ mode=0o755, + group='hadoop', + create_parents=True, + cd_access='a', +@@ -773,13 +773,13 @@ + # Status : RUNNING having MOTD lines in beginning + def test_make_valid_json_1(self): + # Setting up input for fn. '_make_valid_json()' +- input_file_handle = open(self.get_src_folder() + "/test/python/stacks/2.5/HIVE/running_withMOTDmsg.txt","r") ++ input_file_handle = open(self.get_src_folder() + "/test/python/stacks/2.5/HIVE/running_withMOTDmsg.txt") + llap_app_info = input_file_handle.read() + + llap_app_info_as_json = self.hsi._make_valid_json(llap_app_info) + + # Set up expected output +- expected_ouput_file_handle = open(self.get_src_folder() + "/test/python/stacks/2.5/HIVE/running.json","r") ++ expected_ouput_file_handle = open(self.get_src_folder() + "/test/python/stacks/2.5/HIVE/running.json") + expected_ouput_data = expected_ouput_file_handle.read() + expected_ouput_data_as_json = json.loads(expected_ouput_data) + +@@ -790,7 +790,7 @@ + # Expected : No change + def test_make_valid_json_2(self): + # Setting up input for fn. '_make_valid_json()' +- input_file_handle = open(self.get_src_folder() + "/test/python/stacks/2.5/HIVE/running.json","r") ++ input_file_handle = open(self.get_src_folder() + "/test/python/stacks/2.5/HIVE/running.json") + llap_app_info = input_file_handle.read() + expected_llap_app_info_as_json = json.loads(llap_app_info) + +@@ -804,13 +804,13 @@ + # Status : RUNNING_PARTIAL (2 out of 3 running -> < 80% instances ON) having MOTD lines in beginning + def test_make_valid_json_3(self): + # Setting up input for fn. '_make_valid_json()' +- input_file_handle = open(self.get_src_folder() + "/test/python/stacks/2.5/HIVE/oneContainerDown_withMOTDmsg.txt","r") ++ input_file_handle = open(self.get_src_folder() + "/test/python/stacks/2.5/HIVE/oneContainerDown_withMOTDmsg.txt") + llap_app_info = input_file_handle.read() + + llap_app_info_as_json = self.hsi._make_valid_json(llap_app_info) + + # Set up expected output +- expected_ouput_file_handle = open(self.get_src_folder() + "/test/python/stacks/2.5/HIVE/oneContainerDown.json","r") ++ expected_ouput_file_handle = open(self.get_src_folder() + "/test/python/stacks/2.5/HIVE/oneContainerDown.json") + expected_ouput_data = expected_ouput_file_handle.read() + expected_ouput_data_as_json = json.loads(expected_ouput_data) + +@@ -821,7 +821,7 @@ + # Expected : No change + def test_make_valid_json_4(self): + # Setting up input for fn. '_make_valid_json()' +- input_file_handle = open(self.get_src_folder() + "/test/python/stacks/2.5/HIVE/oneContainerDown.json","r") ++ input_file_handle = open(self.get_src_folder() + "/test/python/stacks/2.5/HIVE/oneContainerDown.json") + llap_app_info = input_file_handle.read() + expected_llap_app_info_as_json = json.loads(llap_app_info) + +@@ -835,13 +835,13 @@ + # Status : LAUNCHING having MOTD lines in beginning + def test_make_valid_json_5(self): + # Setting up input for fn. '_make_valid_json()' +- input_file_handle = open(self.get_src_folder() + "/test/python/stacks/2.5/HIVE/starting_withMOTDmsg.txt","r") ++ input_file_handle = open(self.get_src_folder() + "/test/python/stacks/2.5/HIVE/starting_withMOTDmsg.txt") + llap_app_info = input_file_handle.read() + + llap_app_info_as_json = self.hsi._make_valid_json(llap_app_info) + + # Set up expected output +- expected_ouput_file_handle = open(self.get_src_folder() + "/test/python/stacks/2.5/HIVE/starting.json","r") ++ expected_ouput_file_handle = open(self.get_src_folder() + "/test/python/stacks/2.5/HIVE/starting.json") + expected_ouput_data = expected_ouput_file_handle.read() + expected_ouput_data_as_json = json.loads(expected_ouput_data) + +@@ -852,7 +852,7 @@ + # Expected : No change + def test_make_valid_json_6(self): + # Setting up input for fn. '_make_valid_json()' +- input_file_handle = open(self.get_src_folder() + "/test/python/stacks/2.5/HIVE/starting.json","r") ++ input_file_handle = open(self.get_src_folder() + "/test/python/stacks/2.5/HIVE/starting.json") + llap_app_info = input_file_handle.read() + expected_llap_app_info_as_json = json.loads(llap_app_info) + +@@ -866,13 +866,13 @@ + # Status : COMPLETE having MOTD lines in beginning + def test_make_valid_json_7(self): + # Setting up input for fn. '_make_valid_json()' +- input_file_handle = open(self.get_src_folder() + "/test/python/stacks/2.5/HIVE/appComplete_withMOTDmsg.txt","r") ++ input_file_handle = open(self.get_src_folder() + "/test/python/stacks/2.5/HIVE/appComplete_withMOTDmsg.txt") + llap_app_info = input_file_handle.read() + + llap_app_info_as_json = self.hsi._make_valid_json(llap_app_info) + + # Set up expected output +- expected_ouput_file_handle = open(self.get_src_folder() + "/test/python/stacks/2.5/HIVE/appComplete.json","r") ++ expected_ouput_file_handle = open(self.get_src_folder() + "/test/python/stacks/2.5/HIVE/appComplete.json") + expected_ouput_data = expected_ouput_file_handle.read() + expected_ouput_data_as_json = json.loads(expected_ouput_data) + +@@ -883,7 +883,7 @@ + # Expected : No change + def test_make_valid_json_8(self): + # Setting up input for fn. '_make_valid_json()' +- input_file_handle = open(self.get_src_folder() + "/test/python/stacks/2.5/HIVE/appComplete.json","r") ++ input_file_handle = open(self.get_src_folder() + "/test/python/stacks/2.5/HIVE/appComplete.json") + llap_app_info = input_file_handle.read() + expected_llap_app_info_as_json = json.loads(llap_app_info) + +@@ -897,13 +897,13 @@ + # Status : INVALID APP having MOTD lines in beginning + def test_make_valid_json_9(self): + # Setting up input for fn. '_make_valid_json()' +- input_file_handle = open(self.get_src_folder() + "/test/python/stacks/2.5/HIVE/invalidApp_withMOTDmsg.txt","r") ++ input_file_handle = open(self.get_src_folder() + "/test/python/stacks/2.5/HIVE/invalidApp_withMOTDmsg.txt") + llap_app_info = input_file_handle.read() + + llap_app_info_as_json = self.hsi._make_valid_json(llap_app_info) + + # Set up expected output +- expected_ouput_file_handle = open(self.get_src_folder() + "/test/python/stacks/2.5/HIVE/invalidApp.json","r") ++ expected_ouput_file_handle = open(self.get_src_folder() + "/test/python/stacks/2.5/HIVE/invalidApp.json") + expected_ouput_data = expected_ouput_file_handle.read() + expected_ouput_data_as_json = json.loads(expected_ouput_data) + +@@ -914,7 +914,7 @@ + # Expected : No change + def test_make_valid_json_10(self): + # Setting up input for fn. '_make_valid_json()' +- input_file_handle = open(self.get_src_folder() + "/test/python/stacks/2.5/HIVE/invalidApp.json","r") ++ input_file_handle = open(self.get_src_folder() + "/test/python/stacks/2.5/HIVE/invalidApp.json") + llap_app_info = input_file_handle.read() + expected_llap_app_info_as_json = json.loads(llap_app_info) + +@@ -934,12 +934,12 @@ + # Begginning and end lines need to be removed before parsed as JSON + def test_make_valid_json_11(self): + # Setting up input for fn. '_make_valid_json()' +- input_file_handle = open(self.get_src_folder() + "/test/python/stacks/2.5/HIVE/running_withMOTDmsg_andTrailingMsg.txt","r") ++ input_file_handle = open(self.get_src_folder() + "/test/python/stacks/2.5/HIVE/running_withMOTDmsg_andTrailingMsg.txt") + llap_app_info = input_file_handle.read() + llap_app_info_as_json = self.hsi._make_valid_json(llap_app_info) + + # Set up expected output +- expected_ouput_file_handle = open(self.get_src_folder() + "/test/python/stacks/2.5/HIVE/running.json","r") ++ expected_ouput_file_handle = open(self.get_src_folder() + "/test/python/stacks/2.5/HIVE/running.json") + expected_ouput_data = expected_ouput_file_handle.read() + expected_ouput_data_as_json = json.loads(expected_ouput_data) + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.5/RANGER/test_ranger_admin.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.5/RANGER/test_ranger_admin.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.5/RANGER/test_ranger_admin.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.5/RANGER/test_ranger_admin.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 json +-from mock.mock import MagicMock, patch ++from unittest.mock import MagicMock, patch + from stacks.utils.RMFTestCase import * + from only_for_platform import not_for_platform, PLATFORM_WINDOWS + +@@ -53,26 +53,26 @@ + + self.assertResourceCalled('Directory', '/var/log/ambari-infra-solr-client', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + cd_access = 'a', + ) + self.assertResourceCalled('Directory', '/usr/lib/ambari-infra-solr-client', + cd_access = 'a', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + recursive_ownership = True, + ) + self.assertResourceCalled('File', '/usr/lib/ambari-infra-solr-client/solrCloudCli.sh', + content = StaticFile('/usr/lib/ambari-infra-solr-client/solrCloudCli.sh'), +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('File', '/usr/lib/ambari-infra-solr-client/log4j.properties', + content = self.getConfig()['configurations']['infra-solr-client-log4j']['content'], +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/var/log/ambari-infra-solr-client/solr-client.log', + content = '', +- mode = 0664, ++ mode = 0o664, + ) + self.assertResourceCalledRegexp('^Execute$', '^ambari-sudo.sh JAVA_HOME=/usr/jdk64/jdk1.7.0_45 /usr/lib/ambari-infra-solr-client/solrCloudCli.sh --zookeeper-connect-string c6401.ambari.apache.org:2181 --znode /infra-solr --check-znode --retry 5 --interval 10') + self.assertResourceCalledRegexp('^Execute$', '^ambari-sudo.sh JAVA_HOME=/usr/jdk64/jdk1.7.0_45 /usr/lib/ambari-infra-solr-client/solrCloudCli.sh --zookeeper-connect-string c6401.ambari.apache.org:2181/infra-solr --download-config --config-dir /tmp/solr_config_ranger_audits_0.[0-9]* --config-set ranger_audits --retry 30 --interval 5') +@@ -89,7 +89,7 @@ + ) + + self.assertResourceCalled('Execute', '/usr/bin/ranger-admin-start', +- environment = {'JAVA_HOME': u'/usr/jdk64/jdk1.7.0_45'}, ++ environment = {'JAVA_HOME': '/usr/jdk64/jdk1.7.0_45'}, + not_if = 'ps -ef | grep proc_rangeradmin | grep -v grep', + user = 'ranger', + ) +@@ -106,7 +106,7 @@ + target = RMFTestCase.TARGET_COMMON_SERVICES + ) + self.assertResourceCalled('Execute', '/usr/bin/ranger-admin-stop', +- environment = {'JAVA_HOME': u'/usr/jdk64/jdk1.7.0_45'}, ++ environment = {'JAVA_HOME': '/usr/jdk64/jdk1.7.0_45'}, + user = 'ranger' + ) + self.assertResourceCalled('File', '/var/run/ranger/rangeradmin.pid', +@@ -140,26 +140,26 @@ + + self.assertResourceCalled('Directory', '/var/log/ambari-infra-solr-client', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + cd_access = 'a', + ) + self.assertResourceCalled('Directory', '/usr/lib/ambari-infra-solr-client', + cd_access = 'a', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + recursive_ownership = True, + ) + self.assertResourceCalled('File', '/usr/lib/ambari-infra-solr-client/solrCloudCli.sh', + content = StaticFile('/usr/lib/ambari-infra-solr-client/solrCloudCli.sh'), +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('File', '/usr/lib/ambari-infra-solr-client/log4j.properties', + content = self.getConfig()['configurations']['infra-solr-client-log4j']['content'], +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/var/log/ambari-infra-solr-client/solr-client.log', + content = '', +- mode = 0664, ++ mode = 0o664, + ) + self.assertResourceCalled('File', '/usr/hdp/current/ranger-admin/conf/ranger_solr_jaas.conf', + content = Template('ranger_solr_jaas_conf.j2'), +@@ -189,7 +189,7 @@ + ) + + self.assertResourceCalled('Execute', '/usr/bin/ranger-admin-start', +- environment = {'JAVA_HOME': u'/usr/jdk64/jdk1.7.0_45'}, ++ environment = {'JAVA_HOME': '/usr/jdk64/jdk1.7.0_45'}, + not_if = 'ps -ef | grep proc_rangeradmin | grep -v grep', + user = 'ranger', + ) +@@ -210,7 +210,7 @@ + + self.assertResourceCalled('File', '/tmp/mysql-connector-java.jar', + content = DownloadSource('http://c6401.ambari.apache.org:8080/resources/mysql-connector-java.jar'), +- mode = 0644 ++ mode = 0o644 + ) + + self.assertResourceCalled('Execute', ('cp', '--remove-destination', '/tmp/mysql-connector-java.jar', '/usr/hdp/current/ranger-admin/ews/lib'), +@@ -219,7 +219,7 @@ + ) + + self.assertResourceCalled('File', '/usr/hdp/current/ranger-admin/ews/lib/mysql-connector-java.jar', +- mode = 0644 ++ mode = 0o644 + ) + + self.assertResourceCalled('ModifyPropertiesFile', '/usr/hdp/current/ranger-admin/install.properties', +@@ -234,7 +234,7 @@ + + self.assertResourceCalled('File', '/usr/lib/ambari-agent/DBConnectionVerification.jar', + content = DownloadSource('http://c6401.ambari.apache.org:8080/resources/DBConnectionVerification.jar'), +- mode = 0644 ++ mode = 0o644 + ) + + self.assertResourceCalled('Execute', +@@ -258,7 +258,7 @@ + ) + + self.assertResourceCalled('Directory', '/var/run/ranger', +- mode=0755, ++ mode=0o755, + owner = 'ranger', + group = 'hadoop', + cd_access = "a", +@@ -269,14 +269,14 @@ + content = 'export JAVA_HOME=/usr/jdk64/jdk1.7.0_45', + owner = 'ranger', + group = 'ranger', +- mode = 0755 ++ mode = 0o755 + ) + + self.assertResourceCalled('File', '/usr/hdp/current/ranger-admin/conf/ranger-admin-env-piddir.sh', + content = 'export RANGER_PID_DIR_PATH=/var/run/ranger\nexport RANGER_USER=ranger', + owner = 'ranger', + group = 'ranger', +- mode = 0755 ++ mode = 0o755 + ) + + self.assertResourceCalled('Directory', '/var/log/ranger/admin', +@@ -284,14 +284,14 @@ + group='ranger', + create_parents = True, + cd_access = 'a', +- mode = 0755 ++ mode = 0o755 + ) + + self.assertResourceCalled('File', '/usr/hdp/current/ranger-admin/conf/ranger-admin-env-logdir.sh', + content = 'export RANGER_ADMIN_LOG_DIR=/var/log/ranger/admin', + owner = 'ranger', + group = 'ranger', +- mode = 0755 ++ mode = 0o755 + ) + + self.assertResourceCalled('File', '/usr/hdp/current/ranger-admin/conf/ranger-admin-default-site.xml', +@@ -322,24 +322,24 @@ + conf_dir = '/usr/hdp/current/ranger-admin/conf', + configurations = ranger_admin_site_copy, + configuration_attributes = self.getConfig()['configurationAttributes']['ranger-admin-site'], +- mode = 0644 ++ mode = 0o644 + ) + + self.assertResourceCalled('Directory', '/usr/hdp/current/ranger-admin/conf/ranger_jaas', + owner ='ranger', + group ='ranger', +- mode = 0700 ++ mode = 0o700 + ) + + self.assertResourceCalled('File', '/usr/hdp/current/ranger-admin/ews/webapp/WEB-INF/log4j.properties', + owner = 'ranger', + group = 'ranger', + content = InlineTemplate(self.getConfig()['configurations']['admin-log4j']['content']), +- mode = 0644 ++ mode = 0o644 + ) + + self.assertResourceCalled('Execute', ('/usr/jdk64/jdk1.7.0_45/bin/java', '-cp', '/usr/hdp/current/ranger-admin/cred/lib/*', 'org.apache.ranger.credentialapi.buildks', 'create', 'rangeradmin', '-value', 'rangeradmin01', '-provider', 'jceks://file/etc/ranger/admin/rangeradmin.jceks'), +- environment = {'JAVA_HOME': u'/usr/jdk64/jdk1.7.0_45'}, ++ environment = {'JAVA_HOME': '/usr/jdk64/jdk1.7.0_45'}, + logoutput=True, + sudo = True + ) +@@ -348,14 +348,14 @@ + owner = 'ranger', + group = 'ranger', + only_if = 'test -e /etc/ranger/admin/rangeradmin.jceks', +- mode = 0640 ++ mode = 0o640 + ) + + self.assertResourceCalled('File', '/etc/ranger/admin/.rangeradmin.jceks.crc', + owner = 'ranger', + group = 'ranger', + only_if = 'test -e /etc/ranger/admin/.rangeradmin.jceks.crc', +- mode = 0640 ++ mode = 0o640 + ) + + self.assertResourceCalled('XmlConfig', 'core-site.xml', +@@ -364,7 +364,7 @@ + conf_dir = '/usr/hdp/current/ranger-admin/conf', + configurations = self.getConfig()['configurations']['core-site'], + configuration_attributes = self.getConfig()['configurationAttributes']['core-site'], +- mode = 0644 ++ mode = 0o644 + ) + + def assert_configure_secured(self): +@@ -381,7 +381,7 @@ + + self.assertResourceCalled('File', '/tmp/mysql-connector-java.jar', + content = DownloadSource('http://c6401.ambari.apache.org:8080/resources/mysql-connector-java.jar'), +- mode = 0644 ++ mode = 0o644 + ) + + self.assertResourceCalled('Execute', ('cp', '--remove-destination', '/tmp/mysql-connector-java.jar', '/usr/hdp/current/ranger-admin/ews/lib'), +@@ -390,7 +390,7 @@ + ) + + self.assertResourceCalled('File', '/usr/hdp/current/ranger-admin/ews/lib/mysql-connector-java.jar', +- mode = 0644 ++ mode = 0o644 + ) + + self.assertResourceCalled('ModifyPropertiesFile', '/usr/hdp/current/ranger-admin/install.properties', +@@ -405,7 +405,7 @@ + + self.assertResourceCalled('File', '/usr/lib/ambari-agent/DBConnectionVerification.jar', + content = DownloadSource('http://c6401.ambari.apache.org:8080/resources/DBConnectionVerification.jar'), +- mode = 0644 ++ mode = 0o644 + ) + + self.assertResourceCalled('Execute', +@@ -429,7 +429,7 @@ + ) + + self.assertResourceCalled('Directory', '/var/run/ranger', +- mode=0755, ++ mode=0o755, + owner = 'ranger', + group = 'hadoop', + cd_access = "a", +@@ -440,14 +440,14 @@ + content = 'export JAVA_HOME=/usr/jdk64/jdk1.7.0_45', + owner = 'ranger', + group = 'ranger', +- mode = 0755 ++ mode = 0o755 + ) + + self.assertResourceCalled('File', '/usr/hdp/current/ranger-admin/conf/ranger-admin-env-piddir.sh', + content = 'export RANGER_PID_DIR_PATH=/var/run/ranger\nexport RANGER_USER=ranger', + owner = 'ranger', + group = 'ranger', +- mode = 0755 ++ mode = 0o755 + ) + + self.assertResourceCalled('Directory', '/var/log/ranger/admin', +@@ -455,14 +455,14 @@ + group='ranger', + create_parents = True, + cd_access = 'a', +- mode = 0755 ++ mode = 0o755 + ) + + self.assertResourceCalled('File', '/usr/hdp/current/ranger-admin/conf/ranger-admin-env-logdir.sh', + content = 'export RANGER_ADMIN_LOG_DIR=/var/log/ranger/admin', + owner = 'ranger', + group = 'ranger', +- mode = 0755 ++ mode = 0o755 + ) + + self.assertResourceCalled('File', '/usr/hdp/current/ranger-admin/conf/ranger-admin-default-site.xml', +@@ -493,24 +493,24 @@ + conf_dir = '/usr/hdp/current/ranger-admin/conf', + configurations = ranger_admin_site_copy, + configuration_attributes = self.getConfig()['configurationAttributes']['ranger-admin-site'], +- mode = 0644 ++ mode = 0o644 + ) + + self.assertResourceCalled('Directory', '/usr/hdp/current/ranger-admin/conf/ranger_jaas', + owner ='ranger', + group ='ranger', +- mode = 0700 ++ mode = 0o700 + ) + + self.assertResourceCalled('File', '/usr/hdp/current/ranger-admin/ews/webapp/WEB-INF/log4j.properties', + owner = 'ranger', + group = 'ranger', + content = InlineTemplate(self.getConfig()['configurations']['admin-log4j']['content']), +- mode = 0644 ++ mode = 0o644 + ) + + self.assertResourceCalled('Execute', ('/usr/jdk64/jdk1.7.0_45/bin/java', '-cp', '/usr/hdp/current/ranger-admin/cred/lib/*', 'org.apache.ranger.credentialapi.buildks', 'create', 'rangeradmin', '-value', 'rangeradmin01', '-provider', 'jceks://file/etc/ranger/admin/rangeradmin.jceks'), +- environment = {'JAVA_HOME': u'/usr/jdk64/jdk1.7.0_45'}, ++ environment = {'JAVA_HOME': '/usr/jdk64/jdk1.7.0_45'}, + logoutput=True, + sudo = True + ) +@@ -519,14 +519,14 @@ + owner = 'ranger', + group = 'ranger', + only_if = 'test -e /etc/ranger/admin/rangeradmin.jceks', +- mode = 0640 ++ mode = 0o640 + ) + + self.assertResourceCalled('File', '/etc/ranger/admin/.rangeradmin.jceks.crc', + owner = 'ranger', + group = 'ranger', + only_if = 'test -e /etc/ranger/admin/.rangeradmin.jceks.crc', +- mode = 0640 ++ mode = 0o640 + ) + + self.assertResourceCalled('XmlConfig', 'core-site.xml', +@@ -535,5 +535,5 @@ + conf_dir = '/usr/hdp/current/ranger-admin/conf', + configurations = self.getConfig()['configurations']['core-site'], + configuration_attributes = self.getConfig()['configurationAttributes']['core-site'], +- mode = 0644 ++ mode = 0o644 + ) +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.5/RANGER/test_ranger_tagsync.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.5/RANGER/test_ranger_tagsync.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.5/RANGER/test_ranger_tagsync.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.5/RANGER/test_ranger_tagsync.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 json +-from mock.mock import MagicMock, patch ++from unittest.mock import MagicMock, patch + from stacks.utils.RMFTestCase import * + from only_for_platform import not_for_platform, PLATFORM_WINDOWS + +@@ -48,7 +48,7 @@ + ) + self.assert_configure_default() + self.assertResourceCalled('Execute', '/usr/hdp/current/ranger-tagsync/ranger-tagsync-services.sh start', +- environment = {'JAVA_HOME': u'/usr/jdk64/jdk1.7.0_45'}, ++ environment = {'JAVA_HOME': '/usr/jdk64/jdk1.7.0_45'}, + not_if = 'ps -ef | grep proc_rangertagsync | grep -v grep', + user = 'ranger', + ) +@@ -63,7 +63,7 @@ + target = RMFTestCase.TARGET_COMMON_SERVICES + ) + self.assertResourceCalled('Execute', '/usr/hdp/current/ranger-tagsync/ranger-tagsync-services.sh stop', +- environment = {'JAVA_HOME': u'/usr/jdk64/jdk1.7.0_45'}, ++ environment = {'JAVA_HOME': '/usr/jdk64/jdk1.7.0_45'}, + user = 'ranger' + ) + +@@ -91,7 +91,7 @@ + ) + + self.assertResourceCalled('Directory', '/var/run/ranger', +- mode=0755, ++ mode=0o755, + owner = 'ranger', + group = 'hadoop', + cd_access = "a", +@@ -102,14 +102,14 @@ + content = 'export TAGSYNC_PID_DIR_PATH=/var/run/ranger\nexport UNIX_TAGSYNC_USER=ranger', + owner = 'ranger', + group = 'ranger', +- mode = 0755 ++ mode = 0o755 + ) + + self.assertResourceCalled('Directory', '/var/log/ranger/tagsync', + owner = 'ranger', + group = 'ranger', + cd_access = "a", +- mode=0755, ++ mode=0o755, + create_parents = True + ) + +@@ -118,7 +118,7 @@ + owner = 'ranger', + content = 'export RANGER_TAGSYNC_LOG_DIR=/var/log/ranger/tagsync', + group = 'ranger', +- mode=0755 ++ mode=0o755 + ) + + self.assertResourceCalled('XmlConfig', 'ranger-tagsync-site.xml', +@@ -127,12 +127,12 @@ + conf_dir = '/usr/hdp/current/ranger-tagsync/conf', + configurations = self.getConfig()['configurations']['ranger-tagsync-site'], + configuration_attributes = self.getConfig()['configurationAttributes']['ranger-tagsync-site'], +- mode=0644 ++ mode=0o644 + ) + + self.assertResourceCalled('PropertiesFile', '/usr/hdp/current/ranger-tagsync/conf/atlas-application.properties', + properties = self.getConfig()['configurations']['tagsync-application-properties'], +- mode=0755, ++ mode=0o755, + owner='ranger', + group='ranger' + ) +@@ -141,11 +141,11 @@ + owner = 'ranger', + group = 'ranger', + content = InlineTemplate(self.getConfig()['configurations']['tagsync-log4j']['content']), +- mode = 0644 ++ mode = 0o644 + ) + + self.assertResourceCalled('File', '/usr/hdp/current/ranger-tagsync/ranger-tagsync-services.sh', +- mode = 0755, ++ mode = 0o755, + ) + + self.assertResourceCalled('Execute', ('ln', '-sf', '/usr/hdp/current/ranger-tagsync/ranger-tagsync-services.sh', '/usr/bin/ranger-tagsync'), +@@ -160,5 +160,5 @@ + conf_dir = '/usr/hdp/current/ranger-tagsync/conf', + configurations = self.getConfig()['configurations']['core-site'], + configuration_attributes = self.getConfig()['configurationAttributes']['core-site'], +- mode = 0644 ++ mode = 0o644 + ) +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.5/RANGER/test_ranger_usersync.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.5/RANGER/test_ranger_usersync.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.5/RANGER/test_ranger_usersync.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.5/RANGER/test_ranger_usersync.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 +-from mock.mock import MagicMock, patch ++from unittest.mock import MagicMock, patch + from stacks.utils.RMFTestCase import * + from only_for_platform import not_for_platform, PLATFORM_WINDOWS + +@@ -52,7 +52,7 @@ + ) + self.assert_configure_default() + self.assertResourceCalled('Execute', '/usr/bin/ranger-usersync-start', +- environment = {'JAVA_HOME': u'/usr/jdk64/jdk1.7.0_45'}, ++ environment = {'JAVA_HOME': '/usr/jdk64/jdk1.7.0_45'}, + not_if = 'ps -ef | grep proc_rangerusersync | grep -v grep', + user = 'ranger', + ) +@@ -68,7 +68,7 @@ + target = RMFTestCase.TARGET_COMMON_SERVICES + ) + self.assertResourceCalled('Execute', ('/usr/bin/ranger-usersync-stop',), +- environment = {'JAVA_HOME': u'/usr/jdk64/jdk1.7.0_45'}, ++ environment = {'JAVA_HOME': '/usr/jdk64/jdk1.7.0_45'}, + sudo = True + ) + self.assertResourceCalled('File', '/var/run/ranger/usersync.pid', +@@ -91,7 +91,7 @@ + + def assert_configure_default(self): + self.assertResourceCalled('Directory', '/var/run/ranger', +- mode=0755, ++ mode=0o755, + owner = 'ranger', + group = 'hadoop', + cd_access = "a", +@@ -102,7 +102,7 @@ + content = 'export USERSYNC_PID_DIR_PATH=/var/run/ranger\nexport UNIX_USERSYNC_USER=ranger', + owner = 'ranger', + group = 'ranger', +- mode = 0755 ++ mode = 0o755 + ) + + self.assertResourceCalled('Directory', '/var/log/ranger/usersync', +@@ -110,7 +110,7 @@ + group='ranger', + create_parents = True, + cd_access = 'a', +- mode = 0755, ++ mode = 0o755, + recursive_ownership = True + ) + +@@ -118,7 +118,7 @@ + content = 'export logdir=/var/log/ranger/usersync', + owner = 'ranger', + group = 'ranger', +- mode = 0755 ++ mode = 0o755 + ) + + self.assertResourceCalled('Directory', '/usr/hdp/current/ranger-usersync/conf/', +@@ -129,7 +129,7 @@ + owner = 'ranger', + group = 'ranger', + content = InlineTemplate(self.getConfig()['configurations']['usersync-log4j']['content']), +- mode = 0644 ++ mode = 0o644 + ) + + ranger_ugsync_site_copy = {} +@@ -144,7 +144,7 @@ + conf_dir = '/usr/hdp/current/ranger-usersync/conf', + configurations = ranger_ugsync_site_copy, + configuration_attributes = self.getConfig()['configurationAttributes']['ranger-ugsync-site'], +- mode = 0644 ++ mode = 0o644 + ) + + self.assertResourceCalled('File', '/usr/hdp/current/ranger-usersync/conf/ranger-ugsync-default.xml', +@@ -159,17 +159,17 @@ + + self.assertResourceCalled('File', '/usr/hdp/current/ranger-usersync/native/credValidator.uexe', + group = 'ranger', +- mode = 04555 ++ mode = 0o4555 + ) + + self.assertResourceCalled('Execute', ('/usr/jdk64/jdk1.7.0_45/bin/java', '-cp', '/usr/hdp/current/ranger-usersync/lib/*', 'org.apache.ranger.credentialapi.buildks', 'create', 'usersync.ssl.key.password', '-value', 'UnIx529p', '-provider', 'jceks://file/usr/hdp/current/ranger-usersync/conf/ugsync.jceks'), +- environment = {'JAVA_HOME': u'/usr/jdk64/jdk1.7.0_45'}, ++ environment = {'JAVA_HOME': '/usr/jdk64/jdk1.7.0_45'}, + logoutput=True, + sudo = True + ) + + self.assertResourceCalled('Execute', ('/usr/jdk64/jdk1.7.0_45/bin/java', '-cp', '/usr/hdp/current/ranger-usersync/lib/*', 'org.apache.ranger.credentialapi.buildks', 'create', 'usersync.ssl.truststore.password', '-value', 'changeit', '-provider', 'jceks://file/usr/hdp/current/ranger-usersync/conf/ugsync.jceks'), +- environment = {'JAVA_HOME': u'/usr/jdk64/jdk1.7.0_45'}, ++ environment = {'JAVA_HOME': '/usr/jdk64/jdk1.7.0_45'}, + logoutput=True, + sudo = True + ) +@@ -178,14 +178,14 @@ + owner = 'ranger', + group = 'ranger', + only_if = 'test -e /usr/hdp/current/ranger-usersync/conf/ugsync.jceks', +- mode = 0640 ++ mode = 0o640 + ) + + self.assertResourceCalled('File', '/usr/hdp/current/ranger-usersync/conf/.ugsync.jceks.crc', + owner = 'ranger', + group = 'ranger', + only_if = 'test -e /usr/hdp/current/ranger-usersync/conf/.ugsync.jceks.crc', +- mode = 0640 ++ mode = 0o640 + ) + + self.assertResourceCalled('File', '/usr/bin/ranger-usersync-start', +@@ -199,7 +199,7 @@ + ) + + self.assertResourceCalled('File', '/usr/hdp/current/ranger-usersync/ranger-usersync-services.sh', +- mode = 0755 ++ mode = 0o755 + ) + + self.assertResourceCalled('Execute', ('ln', '-sf', '/usr/hdp/current/ranger-usersync/ranger-usersync-services.sh', '/usr/bin/ranger-usersync'), +@@ -214,5 +214,5 @@ + conf_dir = '/usr/hdp/current/ranger-usersync/conf', + configurations = self.getConfig()['configurations']['core-site'], + configuration_attributes = self.getConfig()['configurationAttributes']['core-site'], +- mode = 0644 ++ mode = 0o644 + ) +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.5/RANGER_KMS/test_kms_server.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.5/RANGER_KMS/test_kms_server.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.5/RANGER_KMS/test_kms_server.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.5/RANGER_KMS/test_kms_server.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 + from datetime import datetime +-from mock.mock import MagicMock, patch ++from unittest.mock import MagicMock, patch + from stacks.utils.RMFTestCase import * + from only_for_platform import not_for_platform, PLATFORM_WINDOWS + from resource_management.libraries.functions.ranger_functions import Rangeradmin +@@ -45,7 +45,7 @@ + + current_date = datetime.now() + +- class DTMOCK(object): ++ class DTMOCK: + """ + Mock datetime to avoid test failures when test run a little bit slower than usuall. + """ +@@ -78,28 +78,28 @@ + self.assertResourceCalled('File', '/usr/hdp/current/ranger-kms/conf/ranger-security.xml', + owner = 'kms', + group = 'kms', +- content = '\n{0}\n'.format(current_datetime), +- mode = 0644 ++ content = '\n{}\n'.format(current_datetime), ++ mode = 0o644 + ) + + self.assertResourceCalled('Directory', '/etc/ranger/c1_kms', + owner = 'kms', + group = 'kms', +- mode = 0775, ++ mode = 0o775, + create_parents = True + ) + + self.assertResourceCalled('Directory', '/etc/ranger/c1_kms/policycache', + owner = 'kms', + group = 'kms', +- mode = 0775, ++ mode = 0o775, + create_parents = True + ) + + self.assertResourceCalled('File', '/etc/ranger/c1_kms/policycache/kms_c1_kms.json', + owner = 'kms', + group = 'kms', +- mode = 0644 ++ mode = 0o644 + ) + + plugin_audit_properties_copy = {} +@@ -109,7 +109,7 @@ + plugin_audit_properties_copy['xasecure.audit.destination.db.password'] = "crypted" + + self.assertResourceCalled('XmlConfig', 'ranger-kms-audit.xml', +- mode = 0744, ++ mode = 0o744, + owner = 'kms', + group = 'kms', + conf_dir = '/usr/hdp/current/ranger-kms/conf', +@@ -118,7 +118,7 @@ + ) + + self.assertResourceCalled('XmlConfig', 'ranger-kms-security.xml', +- mode = 0744, ++ mode = 0o744, + owner = 'kms', + group = 'kms', + conf_dir = '/usr/hdp/current/ranger-kms/conf', +@@ -134,7 +134,7 @@ + ranger_kms_policymgr_ssl_copy[prop] = "crypted" + + self.assertResourceCalled('XmlConfig', 'ranger-policymgr-ssl.xml', +- mode = 0744, ++ mode = 0o744, + owner = 'kms', + group = 'kms', + conf_dir = '/usr/hdp/current/ranger-kms/conf', +@@ -143,13 +143,13 @@ + ) + + self.assertResourceCalled('Execute', ('/usr/hdp/current/ranger-kms/ranger_credential_helper.py', '-l', '/usr/hdp/current/ranger-kms/cred/lib/*', '-f', '/etc/ranger/c1_kms/cred.jceks', '-k', 'sslKeyStore', '-v', 'myKeyFilePassword', '-c', '1'), +- environment = {'JAVA_HOME': u'/usr/jdk64/jdk1.7.0_45'}, ++ environment = {'JAVA_HOME': '/usr/jdk64/jdk1.7.0_45'}, + logoutput=True, + sudo=True + ) + + self.assertResourceCalled('Execute', ('/usr/hdp/current/ranger-kms/ranger_credential_helper.py', '-l', '/usr/hdp/current/ranger-kms/cred/lib/*', '-f', '/etc/ranger/c1_kms/cred.jceks', '-k', 'sslTrustStore', '-v', 'changeit', '-c', '1'), +- environment = {'JAVA_HOME': u'/usr/jdk64/jdk1.7.0_45'}, ++ environment = {'JAVA_HOME': '/usr/jdk64/jdk1.7.0_45'}, + logoutput=True, + sudo=True + ) +@@ -158,14 +158,14 @@ + owner = 'kms', + group = 'kms', + only_if = "test -e /etc/ranger/c1_kms/cred.jceks", +- mode = 0640 ++ mode = 0o640 + ) + + self.assertResourceCalled('File', '/etc/ranger/c1_kms/.cred.jceks.crc', + owner = 'kms', + group = 'kms', + only_if = "test -e /etc/ranger/c1_kms/.cred.jceks.crc", +- mode = 0640 ++ mode = 0o640 + ) + + self.assertResourceCalled('HdfsResource', '/ranger/audit', +@@ -173,7 +173,7 @@ + action = ['create_on_execute'], + owner = 'hdfs', + group = 'hdfs', +- mode = 0755, ++ mode = 0o755, + recursive_chmod = True, + user = 'hdfs', + security_enabled = False, +@@ -192,7 +192,7 @@ + action = ['create_on_execute'], + owner = 'kms', + group = 'kms', +- mode = 0750, ++ mode = 0o750, + recursive_chmod = True, + user = 'hdfs', + security_enabled = False, +@@ -230,7 +230,7 @@ + + self.assertResourceCalled('File', '/tmp/jce_dir/UnlimitedJCEPolicyJDK7.zip', + content = DownloadSource('http://c6401.ambari.apache.org:8080/resources/UnlimitedJCEPolicyJDK7.zip'), +- mode = 0644, ++ mode = 0o644, + ) + + self.assertResourceCalled('File', '/usr/jdk64/jdk1.7.0_45/jre/lib/security/local_policy.jar', +@@ -253,7 +253,7 @@ + ) + + self.assertResourceCalled('Execute', '/usr/hdp/current/ranger-kms/ranger-kms start', +- environment = {'JAVA_HOME': u'/usr/jdk64/jdk1.7.0_45'}, ++ environment = {'JAVA_HOME': '/usr/jdk64/jdk1.7.0_45'}, + not_if = 'ps -ef | grep proc_rangerkms | grep -v grep', + user = 'kms' + ) +@@ -270,7 +270,7 @@ + target = RMFTestCase.TARGET_COMMON_SERVICES + ) + self.assertResourceCalled('Execute', '/usr/hdp/current/ranger-kms/ranger-kms stop', +- environment = {'JAVA_HOME': u'/usr/jdk64/jdk1.7.0_45'}, ++ environment = {'JAVA_HOME': '/usr/jdk64/jdk1.7.0_45'}, + user = 'kms' + ) + self.assertResourceCalled('File', '/var/run/ranger_kms/rangerkms.pid', +@@ -302,11 +302,11 @@ + + self.assertResourceCalled('File', '/tmp/mysql-connector-java.jar', + content = DownloadSource('http://c6401.ambari.apache.org:8080/resources/mysql-connector-java.jar'), +- mode = 0644 ++ mode = 0o644 + ) + + self.assertResourceCalled('Directory', '/usr/hdp/current/ranger-kms/ews/lib', +- mode = 0755 ++ mode = 0o755 + ) + + self.assertResourceCalled('Execute', ('cp', '--remove-destination', '/tmp/mysql-connector-java.jar', +@@ -316,7 +316,7 @@ + ) + + self.assertResourceCalled('File', '/usr/hdp/current/ranger-kms/ews/webapp/lib/mysql-connector-java.jar', +- mode = 0644 ++ mode = 0o644 + ) + + self.assertResourceCalled('ModifyPropertiesFile', '/usr/hdp/current/ranger-kms/install.properties', +@@ -331,7 +331,7 @@ + + self.assertResourceCalled('File', '/usr/lib/ambari-agent/DBConnectionVerification.jar', + content=DownloadSource('http://c6401.ambari.apache.org:8080/resources/DBConnectionVerification.jar'), +- mode=0644, ++ mode=0o644, + ) + + self.assertResourceCalled('Execute', '/usr/jdk64/jdk1.7.0_45/bin/java -cp /usr/lib/ambari-agent/DBConnectionVerification.jar:/usr/hdp/current/ranger-kms/ews/webapp/lib/mysql-connector-java.jar org.apache.ambari.server.DBConnectionVerification \'jdbc:mysql://c6401.ambari.apache.org:3306/rangerkms01\' rangerkms01 rangerkms01 com.mysql.jdbc.Driver', +@@ -339,7 +339,7 @@ + ) + + self.assertResourceCalled('Directory', '/usr/hdp/current/ranger-kms/ews/webapp/WEB-INF/classes/lib', +- mode = 0755, ++ mode = 0o755, + owner = 'kms', + group = 'kms' + ) +@@ -351,7 +351,7 @@ + ) + + self.assertResourceCalled('File', '/etc/init.d/ranger-kms', +- mode=0755, ++ mode=0o755, + ) + + self.assertResourceCalled('Directory', '/usr/hdp/current/ranger-kms/', +@@ -361,7 +361,7 @@ + ) + + self.assertResourceCalled('Directory', '/var/run/ranger_kms', +- mode=0755, ++ mode=0o755, + owner = 'kms', + group = 'hadoop', + cd_access = "a", +@@ -372,14 +372,14 @@ + content = 'export JAVA_HOME=/usr/jdk64/jdk1.7.0_45', + owner = 'kms', + group = 'kms', +- mode = 0755 ++ mode = 0o755 + ) + + self.assertResourceCalled('File', '/usr/hdp/current/ranger-kms/conf/ranger-kms-env-piddir.sh', + content = 'export RANGER_KMS_PID_DIR_PATH=/var/run/ranger_kms\nexport KMS_USER=kms', + owner = 'kms', + group = 'kms', +- mode = 0755 ++ mode = 0o755 + ) + + self.assertResourceCalled('Directory', '/var/log/ranger/kms', +@@ -387,14 +387,14 @@ + group = 'kms', + cd_access = 'a', + create_parents = True, +- mode = 0755 ++ mode = 0o755 + ) + + self.assertResourceCalled('File', '/usr/hdp/current/ranger-kms/conf/ranger-kms-env-logdir.sh', + content = format("export RANGER_KMS_LOG_DIR=/var/log/ranger/kms"), + owner = 'kms', + group = 'kms', +- mode=0755 ++ mode=0o755 + ) + + self.assertResourceCalled('Execute', ('ln', '-sf', '/usr/hdp/current/ranger-kms/ranger-kms', '/usr/bin/ranger-kms'), +@@ -404,7 +404,7 @@ + ) + + self.assertResourceCalled('File', '/usr/bin/ranger-kms', +- mode=0755 ++ mode=0o755 + ) + + self.assertResourceCalled('Execute', ('ln', '-sf', '/usr/hdp/current/ranger-kms/ranger-kms', '/usr/bin/ranger-kms-services.sh'), +@@ -414,7 +414,7 @@ + ) + + self.assertResourceCalled('File', '/usr/bin/ranger-kms-services.sh', +- mode=0755 ++ mode=0o755 + ) + + self.assertResourceCalled('Execute', ('ln', '-sf', '/usr/hdp/current/ranger-kms/ranger-kms-initd', '/usr/hdp/current/ranger-kms/ranger-kms-services.sh'), +@@ -424,17 +424,17 @@ + ) + + self.assertResourceCalled('File', '/usr/hdp/current/ranger-kms/ranger-kms-services.sh', +- mode=0755 ++ mode=0o755 + ) + + self.assertResourceCalled('Directory', '/var/log/ranger/kms', + owner = 'kms', + group = 'kms', +- mode = 0775 ++ mode = 0o775 + ) + + self.assertResourceCalled('Execute', ('/usr/jdk64/jdk1.7.0_45/bin/java', '-cp', '/usr/hdp/current/ranger-kms/cred/lib/*', 'org.apache.ranger.credentialapi.buildks', 'create', 'ranger.ks.jdbc.password', '-value', 'rangerkms01', '-provider', 'jceks://file/etc/ranger/kms/rangerkms.jceks'), +- environment = {'JAVA_HOME': u'/usr/jdk64/jdk1.7.0_45'}, ++ environment = {'JAVA_HOME': '/usr/jdk64/jdk1.7.0_45'}, + logoutput=True, + sudo=True + ) +@@ -443,18 +443,18 @@ + owner = 'kms', + group = 'kms', + only_if = 'test -e /etc/ranger/kms/rangerkms.jceks', +- mode = 0640 ++ mode = 0o640 + ) + + self.assertResourceCalled('File', '/etc/ranger/kms/.rangerkms.jceks.crc', + owner = 'kms', + group = 'kms', + only_if = 'test -e /etc/ranger/kms/.rangerkms.jceks.crc', +- mode = 0640 ++ mode = 0o640 + ) + + self.assertResourceCalled('Execute', ('/usr/jdk64/jdk1.7.0_45/bin/java', '-cp', '/usr/hdp/current/ranger-kms/cred/lib/*', 'org.apache.ranger.credentialapi.buildks', 'create', 'ranger.ks.masterkey.password', '-value', 'StrongPassword01', '-provider', 'jceks://file/etc/ranger/kms/rangerkms.jceks'), +- environment = {'JAVA_HOME': u'/usr/jdk64/jdk1.7.0_45'}, ++ environment = {'JAVA_HOME': '/usr/jdk64/jdk1.7.0_45'}, + logoutput=True, + sudo=True + ) +@@ -463,14 +463,14 @@ + owner = 'kms', + group = 'kms', + only_if = 'test -e /etc/ranger/kms/rangerkms.jceks', +- mode = 0640 ++ mode = 0o640 + ) + + self.assertResourceCalled('File', '/etc/ranger/kms/.rangerkms.jceks.crc', + owner = 'kms', + group = 'kms', + only_if = 'test -e /etc/ranger/kms/.rangerkms.jceks.crc', +- mode = 0640 ++ mode = 0o640 + ) + + dbks_site_copy = {} +@@ -480,7 +480,7 @@ + dbks_site_copy[prop] = "_" + + self.assertResourceCalled('XmlConfig', 'dbks-site.xml', +- mode=0644, ++ mode=0o644, + owner = 'kms', + group = 'kms', + conf_dir = '/usr/hdp/current/ranger-kms/conf', +@@ -489,7 +489,7 @@ + ) + + self.assertResourceCalled('XmlConfig', 'ranger-kms-site.xml', +- mode = 0644, ++ mode = 0o644, + owner = 'kms', + group = 'kms', + conf_dir = '/usr/hdp/current/ranger-kms/conf', +@@ -498,7 +498,7 @@ + ) + + self.assertResourceCalled('XmlConfig', 'kms-site.xml', +- mode = 0644, ++ mode = 0o644, + owner = 'kms', + group = 'kms', + conf_dir = '/usr/hdp/current/ranger-kms/conf', +@@ -507,7 +507,7 @@ + ) + + self.assertResourceCalled('File', '/usr/hdp/current/ranger-kms/conf/kms-log4j.properties', +- mode = 0644, ++ mode = 0o644, + owner = 'kms', + group = 'kms', + content = InlineTemplate(self.getConfig()['configurations']['kms-log4j']['content']) +@@ -553,28 +553,28 @@ + self.assertResourceCalled('File', '/usr/hdp/current/ranger-kms/conf/ranger-security.xml', + owner = 'kms', + group = 'kms', +- content = '\n{0}\n'.format(current_datetime), +- mode = 0644 ++ content = '\n{}\n'.format(current_datetime), ++ mode = 0o644 + ) + + self.assertResourceCalled('Directory', '/etc/ranger/c1_kms', + owner = 'kms', + group = 'kms', +- mode = 0775, ++ mode = 0o775, + create_parents = True + ) + + self.assertResourceCalled('Directory', '/etc/ranger/c1_kms/policycache', + owner = 'kms', + group = 'kms', +- mode = 0775, ++ mode = 0o775, + create_parents = True + ) + + self.assertResourceCalled('File', '/etc/ranger/c1_kms/policycache/kms_c1_kms.json', + owner = 'kms', + group = 'kms', +- mode = 0644 ++ mode = 0o644 + ) + + plugin_audit_properties_copy = {} +@@ -584,7 +584,7 @@ + plugin_audit_properties_copy['xasecure.audit.destination.db.password'] = "crypted" + + self.assertResourceCalled('XmlConfig', 'ranger-kms-audit.xml', +- mode = 0744, ++ mode = 0o744, + owner = 'kms', + group = 'kms', + conf_dir = '/usr/hdp/current/ranger-kms/conf', +@@ -593,7 +593,7 @@ + ) + + self.assertResourceCalled('XmlConfig', 'ranger-kms-security.xml', +- mode = 0744, ++ mode = 0o744, + owner = 'kms', + group = 'kms', + conf_dir = '/usr/hdp/current/ranger-kms/conf', +@@ -609,7 +609,7 @@ + ranger_kms_policymgr_ssl_copy[prop] = "crypted" + + self.assertResourceCalled('XmlConfig', 'ranger-policymgr-ssl.xml', +- mode = 0744, ++ mode = 0o744, + owner = 'kms', + group = 'kms', + conf_dir = '/usr/hdp/current/ranger-kms/conf', +@@ -618,13 +618,13 @@ + ) + + self.assertResourceCalled('Execute', ('/usr/hdp/current/ranger-kms/ranger_credential_helper.py', '-l', '/usr/hdp/current/ranger-kms/cred/lib/*', '-f', '/etc/ranger/c1_kms/cred.jceks', '-k', 'sslKeyStore', '-v', 'myKeyFilePassword', '-c', '1'), +- environment = {'JAVA_HOME': u'/usr/jdk64/jdk1.7.0_45'}, ++ environment = {'JAVA_HOME': '/usr/jdk64/jdk1.7.0_45'}, + logoutput=True, + sudo=True + ) + + self.assertResourceCalled('Execute', ('/usr/hdp/current/ranger-kms/ranger_credential_helper.py', '-l', '/usr/hdp/current/ranger-kms/cred/lib/*', '-f', '/etc/ranger/c1_kms/cred.jceks', '-k', 'sslTrustStore', '-v', 'changeit', '-c', '1'), +- environment = {'JAVA_HOME': u'/usr/jdk64/jdk1.7.0_45'}, ++ environment = {'JAVA_HOME': '/usr/jdk64/jdk1.7.0_45'}, + logoutput=True, + sudo=True + ) +@@ -633,14 +633,14 @@ + owner = 'kms', + group = 'kms', + only_if = 'test -e /etc/ranger/c1_kms/cred.jceks', +- mode = 0640 ++ mode = 0o640 + ) + + self.assertResourceCalled('File', '/etc/ranger/c1_kms/.cred.jceks.crc', + owner = 'kms', + group = 'kms', + only_if = 'test -e /etc/ranger/c1_kms/.cred.jceks.crc', +- mode = 0640 ++ mode = 0o640 + ) + + self.assertResourceCalled('HdfsResource', '/ranger/audit', +@@ -648,7 +648,7 @@ + action = ['create_on_execute'], + owner = 'hdfs', + group = 'hdfs', +- mode = 0755, ++ mode = 0o755, + recursive_chmod = True, + user = 'hdfs', + security_enabled = True, +@@ -667,7 +667,7 @@ + action = ['create_on_execute'], + owner = 'kms', + group = 'kms', +- mode = 0750, ++ mode = 0o750, + recursive_chmod = True, + user = 'hdfs', + security_enabled = True, +@@ -705,7 +705,7 @@ + + self.assertResourceCalled('File', '/tmp/jce_dir/UnlimitedJCEPolicyJDK7.zip', + content = DownloadSource('http://c6401.ambari.apache.org:8080/resources/UnlimitedJCEPolicyJDK7.zip'), +- mode = 0644, ++ mode = 0o644, + ) + + self.assertResourceCalled('File', '/usr/jdk64/jdk1.7.0_45/jre/lib/security/local_policy.jar', +@@ -728,7 +728,7 @@ + ) + + self.assertResourceCalled('Execute', '/usr/hdp/current/ranger-kms/ranger-kms start', +- environment = {'JAVA_HOME': u'/usr/jdk64/jdk1.7.0_45'}, ++ environment = {'JAVA_HOME': '/usr/jdk64/jdk1.7.0_45'}, + not_if = 'ps -ef | grep proc_rangerkms | grep -v grep', + user = 'kms' + ) +@@ -760,11 +760,11 @@ + + self.assertResourceCalled('File', '/tmp/mysql-connector-java.jar', + content = DownloadSource('http://c6401.ambari.apache.org:8080/resources/mysql-connector-java.jar'), +- mode = 0644 ++ mode = 0o644 + ) + + self.assertResourceCalled('Directory', '/usr/hdp/current/ranger-kms/ews/lib', +- mode = 0755 ++ mode = 0o755 + ) + + self.assertResourceCalled('Execute', ('cp', '--remove-destination', '/tmp/mysql-connector-java.jar', +@@ -774,7 +774,7 @@ + ) + + self.assertResourceCalled('File', '/usr/hdp/current/ranger-kms/ews/webapp/lib/mysql-connector-java.jar', +- mode = 0644 ++ mode = 0o644 + ) + + self.assertResourceCalled('ModifyPropertiesFile', '/usr/hdp/current/ranger-kms/install.properties', +@@ -789,7 +789,7 @@ + + self.assertResourceCalled('File', '/usr/lib/ambari-agent/DBConnectionVerification.jar', + content=DownloadSource('http://c6401.ambari.apache.org:8080/resources/DBConnectionVerification.jar'), +- mode=0644, ++ mode=0o644, + ) + + self.assertResourceCalled('Execute', '/usr/jdk64/jdk1.7.0_45/bin/java -cp /usr/lib/ambari-agent/DBConnectionVerification.jar:/usr/hdp/current/ranger-kms/ews/webapp/lib/mysql-connector-java.jar org.apache.ambari.server.DBConnectionVerification \'jdbc:mysql://c6401.ambari.apache.org:3306/rangerkms01\' rangerkms01 rangerkms01 com.mysql.jdbc.Driver', +@@ -797,7 +797,7 @@ + ) + + self.assertResourceCalled('Directory', '/usr/hdp/current/ranger-kms/ews/webapp/WEB-INF/classes/lib', +- mode = 0755, ++ mode = 0o755, + owner = 'kms', + group = 'kms' + ) +@@ -809,7 +809,7 @@ + ) + + self.assertResourceCalled('File', '/etc/init.d/ranger-kms', +- mode=0755, ++ mode=0o755, + ) + + self.assertResourceCalled('Directory', '/usr/hdp/current/ranger-kms/', +@@ -819,7 +819,7 @@ + ) + + self.assertResourceCalled('Directory', '/var/run/ranger_kms', +- mode=0755, ++ mode=0o755, + owner = 'kms', + group = 'hadoop', + cd_access = "a", +@@ -830,14 +830,14 @@ + content = 'export JAVA_HOME=/usr/jdk64/jdk1.7.0_45', + owner = 'kms', + group = 'kms', +- mode = 0755 ++ mode = 0o755 + ) + + self.assertResourceCalled('File', '/usr/hdp/current/ranger-kms/conf/ranger-kms-env-piddir.sh', + content = 'export RANGER_KMS_PID_DIR_PATH=/var/run/ranger_kms\nexport KMS_USER=kms', + owner = 'kms', + group = 'kms', +- mode = 0755 ++ mode = 0o755 + ) + + self.assertResourceCalled('Directory', '/var/log/ranger/kms', +@@ -845,14 +845,14 @@ + group = 'kms', + cd_access = 'a', + create_parents = True, +- mode = 0755 ++ mode = 0o755 + ) + + self.assertResourceCalled('File', '/usr/hdp/current/ranger-kms/conf/ranger-kms-env-logdir.sh', + content = format("export RANGER_KMS_LOG_DIR=/var/log/ranger/kms"), + owner = 'kms', + group = 'kms', +- mode=0755 ++ mode=0o755 + ) + + self.assertResourceCalled('Execute', ('ln', '-sf', '/usr/hdp/current/ranger-kms/ranger-kms', '/usr/bin/ranger-kms'), +@@ -862,7 +862,7 @@ + ) + + self.assertResourceCalled('File', '/usr/bin/ranger-kms', +- mode=0755 ++ mode=0o755 + ) + + self.assertResourceCalled('Execute', ('ln', '-sf', '/usr/hdp/current/ranger-kms/ranger-kms', '/usr/bin/ranger-kms-services.sh'), +@@ -872,7 +872,7 @@ + ) + + self.assertResourceCalled('File', '/usr/bin/ranger-kms-services.sh', +- mode=0755 ++ mode=0o755 + ) + + self.assertResourceCalled('Execute', ('ln', '-sf', '/usr/hdp/current/ranger-kms/ranger-kms-initd', '/usr/hdp/current/ranger-kms/ranger-kms-services.sh'), +@@ -882,17 +882,17 @@ + ) + + self.assertResourceCalled('File', '/usr/hdp/current/ranger-kms/ranger-kms-services.sh', +- mode=0755 ++ mode=0o755 + ) + + self.assertResourceCalled('Directory', '/var/log/ranger/kms', + owner = 'kms', + group = 'kms', +- mode = 0775 ++ mode = 0o775 + ) + + self.assertResourceCalled('Execute', ('/usr/jdk64/jdk1.7.0_45/bin/java', '-cp', '/usr/hdp/current/ranger-kms/cred/lib/*', 'org.apache.ranger.credentialapi.buildks', 'create', 'ranger.ks.jdbc.password', '-value', 'rangerkms01', '-provider', 'jceks://file/etc/ranger/kms/rangerkms.jceks'), +- environment = {'JAVA_HOME': u'/usr/jdk64/jdk1.7.0_45'}, ++ environment = {'JAVA_HOME': '/usr/jdk64/jdk1.7.0_45'}, + logoutput=True, + sudo=True + ) +@@ -901,18 +901,18 @@ + owner = 'kms', + group = 'kms', + only_if = 'test -e /etc/ranger/kms/rangerkms.jceks', +- mode = 0640 ++ mode = 0o640 + ) + + self.assertResourceCalled('File', '/etc/ranger/kms/.rangerkms.jceks.crc', + owner = 'kms', + group = 'kms', + only_if = 'test -e /etc/ranger/kms/.rangerkms.jceks.crc', +- mode = 0640 ++ mode = 0o640 + ) + + self.assertResourceCalled('Execute', ('/usr/jdk64/jdk1.7.0_45/bin/java', '-cp', '/usr/hdp/current/ranger-kms/cred/lib/*', 'org.apache.ranger.credentialapi.buildks', 'create', 'ranger.ks.masterkey.password', '-value', 'StrongPassword01', '-provider', 'jceks://file/etc/ranger/kms/rangerkms.jceks'), +- environment = {'JAVA_HOME': u'/usr/jdk64/jdk1.7.0_45'}, ++ environment = {'JAVA_HOME': '/usr/jdk64/jdk1.7.0_45'}, + logoutput=True, + sudo=True + ) +@@ -921,14 +921,14 @@ + owner = 'kms', + group = 'kms', + only_if = 'test -e /etc/ranger/kms/rangerkms.jceks', +- mode = 0640 ++ mode = 0o640 + ) + + self.assertResourceCalled('File', '/etc/ranger/kms/.rangerkms.jceks.crc', + owner = 'kms', + group = 'kms', + only_if = 'test -e /etc/ranger/kms/.rangerkms.jceks.crc', +- mode = 0640 ++ mode = 0o640 + ) + + dbks_site_copy = {} +@@ -938,7 +938,7 @@ + dbks_site_copy[prop] = "_" + + self.assertResourceCalled('XmlConfig', 'dbks-site.xml', +- mode=0644, ++ mode=0o644, + owner = 'kms', + group = 'kms', + conf_dir = '/usr/hdp/current/ranger-kms/conf', +@@ -947,7 +947,7 @@ + ) + + self.assertResourceCalled('XmlConfig', 'ranger-kms-site.xml', +- mode = 0644, ++ mode = 0o644, + owner = 'kms', + group = 'kms', + conf_dir = '/usr/hdp/current/ranger-kms/conf', +@@ -956,7 +956,7 @@ + ) + + self.assertResourceCalled('XmlConfig', 'kms-site.xml', +- mode = 0644, ++ mode = 0o644, + owner = 'kms', + group = 'kms', + conf_dir = '/usr/hdp/current/ranger-kms/conf', +@@ -965,7 +965,7 @@ + ) + + self.assertResourceCalled('File', '/usr/hdp/current/ranger-kms/conf/kms-log4j.properties', +- mode = 0644, ++ mode = 0o644, + owner = 'kms', + group = 'kms', + content = InlineTemplate(self.getConfig()['configurations']['kms-log4j']['content']) +@@ -977,6 +977,6 @@ + conf_dir = '/usr/hdp/current/ranger-kms/conf', + configurations = self.getConfig()['configurations']['core-site'], + configuration_attributes = self.getConfig()['configurationAttributes']['core-site'], +- mode = 0644 ++ mode = 0o644 + ) + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.5/SPARK/test_spark_livy.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.5/SPARK/test_spark_livy.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.5/SPARK/test_spark_livy.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.5/SPARK/test_spark_livy.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 json +-from mock.mock import MagicMock, patch ++from unittest.mock import MagicMock, patch + from stacks.utils.RMFTestCase import * + + from only_for_platform import not_for_platform, PLATFORM_WINDOWS +@@ -46,13 +46,13 @@ + owner = 'livy', + group = 'hadoop', + create_parents = True, +- mode = 0775 ++ mode = 0o775 + ) + self.assertResourceCalled('Directory', '/var/log/livy', + owner = 'livy', + group = 'hadoop', + create_parents = True, +- mode = 0775 ++ mode = 0o775 + ) + self.assertResourceCalled('HdfsResource', '/user/livy', + immutable_paths = self.DEFAULT_IMMUTABLE_PATHS, +@@ -60,7 +60,7 @@ + hadoop_bin_dir = '/usr/hdp/2.5.0.0-1235/hadoop/bin', + keytab = UnknownConfigurationMock(), + default_fs = 'hdfs://c6401.ambari.apache.org:8020', +- hdfs_site = {u'a': u'b'}, ++ hdfs_site = {'a': 'b'}, + kinit_path_local = '/usr/bin/kinit', + principal_name = UnknownConfigurationMock(), + user = 'hdfs', +@@ -69,7 +69,7 @@ + type = 'directory', + action = ['create_on_execute'], hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', + dfs_type = '', +- mode = 0775, ++ mode = 0o775, + ) + self.assertResourceCalled('HdfsResource', None, + immutable_paths = self.DEFAULT_IMMUTABLE_PATHS, +@@ -77,7 +77,7 @@ + hadoop_bin_dir = '/usr/hdp/2.5.0.0-1235/hadoop/bin', + keytab = UnknownConfigurationMock(), + default_fs = 'hdfs://c6401.ambari.apache.org:8020', +- hdfs_site = {u'a': u'b'}, ++ hdfs_site = {'a': 'b'}, + kinit_path_local = '/usr/bin/kinit', + principal_name = UnknownConfigurationMock(), + user = 'hdfs', +@@ -91,7 +91,7 @@ + hadoop_bin_dir = '/usr/hdp/2.5.0.0-1235/hadoop/bin', + keytab = UnknownConfigurationMock(), + default_fs = 'hdfs://c6401.ambari.apache.org:8020', +- hdfs_site = {u'a': u'b'}, ++ hdfs_site = {'a': 'b'}, + kinit_path_local = '/usr/bin/kinit', + principal_name = UnknownConfigurationMock(), + user = 'hdfs', +@@ -100,7 +100,7 @@ + type = 'directory', + action = ['create_on_execute'], hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', + dfs_type = '', +- mode = 0700, ++ mode = 0o700, + ) + self.assertResourceCalled('HdfsResource', None, + immutable_paths = self.DEFAULT_IMMUTABLE_PATHS, +@@ -108,7 +108,7 @@ + hadoop_bin_dir = '/usr/hdp/2.5.0.0-1235/hadoop/bin', + keytab = UnknownConfigurationMock(), + default_fs = 'hdfs://c6401.ambari.apache.org:8020', +- hdfs_site = {u'a': u'b'}, ++ hdfs_site = {'a': 'b'}, + kinit_path_local = '/usr/bin/kinit', + principal_name = UnknownConfigurationMock(), + user = 'hdfs', +@@ -120,7 +120,7 @@ + content = InlineTemplate(self.getConfig()['configurations']['livy-env']['content']), + owner = 'livy', + group = 'livy', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('PropertiesFile', '/usr/hdp/current/livy-server/conf/livy.conf', + owner = 'livy', +@@ -132,18 +132,18 @@ + content = '\n # Set everything to be logged to the console\n log4j.rootCategory=INFO, console\n log4j.appender.console=org.apache.log4j.ConsoleAppender\n log4j.appender.console.target=System.err\n log4j.appender.console.layout=org.apache.log4j.PatternLayout\n log4j.appender.console.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{1}: %m%n\n\n log4j.logger.org.eclipse.jetty=WARN', + owner = 'livy', + group = 'livy', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/usr/hdp/current/livy-server/conf/spark-blacklist.conf', + content = self.getConfig()['configurations']['livy-spark-blacklist']['content'], + owner = 'livy', + group = 'livy', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('Directory', '/usr/hdp/current/livy-server/logs', + owner = 'livy', + group = 'livy', +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('Execute', '/usr/hdp/current/livy-server/bin/livy-server start', + environment = {'JAVA_HOME': '/usr/jdk64/jdk1.7.0_45'}, +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.5/ZEPPELIN/interpreter_json_generated.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.5/ZEPPELIN/interpreter_json_generated.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.5/ZEPPELIN/interpreter_json_generated.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.5/ZEPPELIN/interpreter_json_generated.py 2022-07-11 00:52:31.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.5/ZEPPELIN/test_zeppelin_060.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.5/ZEPPELIN/test_zeppelin_060.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.5/ZEPPELIN/test_zeppelin_060.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.5/ZEPPELIN/test_zeppelin_060.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 stacks.utils.RMFTestCase import * +-from mock.mock import MagicMock, patch, call ++from unittest.mock import MagicMock, patch, call + import time + from resource_management.core import sudo + import glob +@@ -37,24 +37,24 @@ + owner = 'zeppelin', + group = 'zeppelin', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + cd_access = 'a', + ) + self.assertResourceCalled('Directory', '/var/run/zeppelin', + owner = 'zeppelin', + create_parents = True, + group = 'zeppelin', +- mode = 0755, ++ mode = 0o755, + cd_access = 'a', + ) + self.assertResourceCalled('Directory', '/usr/hdp/current/zeppelin-server', + owner = 'zeppelin', + group = 'zeppelin', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + cd_access = 'a', + ) +- self.assertResourceCalled('Execute', ('chown', '-R', u'zeppelin:zeppelin', '/var/run/zeppelin'), sudo = True) ++ self.assertResourceCalled('Execute', ('chown', '-R', 'zeppelin:zeppelin', '/var/run/zeppelin'), sudo = True) + self.assertResourceCalled('XmlConfig', 'zeppelin-site.xml', + owner = 'zeppelin', + group = 'zeppelin', +@@ -72,15 +72,15 @@ + group = 'zeppelin', + ) + self.assertResourceCalled('File', '/etc/zeppelin/conf/log4j.properties', +- owner = u'zeppelin', +- content = u'log4j.rootLogger = INFO, dailyfile', +- group = u'zeppelin', ++ owner = 'zeppelin', ++ content = 'log4j.rootLogger = INFO, dailyfile', ++ group = 'zeppelin', + ) + self.assertResourceCalled('Directory', '/etc/zeppelin/conf/external-dependency-conf', + owner = 'zeppelin', + group = 'zeppelin', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + cd_access = 'a', + ) + +@@ -89,24 +89,24 @@ + owner = 'zeppelin', + group = 'zeppelin', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + cd_access = 'a', + ) + self.assertResourceCalled('Directory', '/var/run/zeppelin', + owner = 'zeppelin', + create_parents = True, + group = 'zeppelin', +- mode = 0755, ++ mode = 0o755, + cd_access = 'a', + ) + self.assertResourceCalled('Directory', '/usr/hdp/current/zeppelin-server', + owner = 'zeppelin', + group = 'zeppelin', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + cd_access = 'a', + ) +- self.assertResourceCalled('Execute', ('chown', '-R', u'zeppelin:zeppelin', '/var/run/zeppelin'), sudo = True) ++ self.assertResourceCalled('Execute', ('chown', '-R', 'zeppelin:zeppelin', '/var/run/zeppelin'), sudo = True) + self.assertResourceCalled('XmlConfig', 'zeppelin-site.xml', + owner = 'zeppelin', + group = 'zeppelin', +@@ -124,15 +124,15 @@ + group = 'zeppelin', + ) + self.assertResourceCalled('File', '/etc/zeppelin/conf/log4j.properties', +- owner = u'zeppelin', +- content = u'log4j.rootLogger = INFO, dailyfile', +- group = u'zeppelin', ++ owner = 'zeppelin', ++ content = 'log4j.rootLogger = INFO, dailyfile', ++ group = 'zeppelin', + ) + self.assertResourceCalled('Directory', '/etc/zeppelin/conf/external-dependency-conf', + owner = 'zeppelin', + group = 'zeppelin', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + cd_access = 'a', + ) + +@@ -170,10 +170,10 @@ + owner = 'zeppelin', + group = 'zeppelin', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + cd_access = 'a', + ) +- self.assertResourceCalled('Execute', ('chown', '-R', u'zeppelin:zeppelin', '/var/run/zeppelin'), ++ self.assertResourceCalled('Execute', ('chown', '-R', 'zeppelin:zeppelin', '/var/run/zeppelin'), + sudo = True, + ) + self.assertResourceCalled('Execute', '/usr/hdp/current/zeppelin-server/bin/zeppelin-daemon.sh stop >> /var/log/zeppelin/zeppelin-setup.log', +@@ -193,10 +193,10 @@ + owner = 'zeppelin', + group = 'zeppelin', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + cd_access = 'a', + ) +- self.assertResourceCalled('Execute', ('chown', '-R', u'zeppelin:zeppelin', '/var/run/zeppelin'), ++ self.assertResourceCalled('Execute', ('chown', '-R', 'zeppelin:zeppelin', '/var/run/zeppelin'), + sudo = True, + ) + self.assertResourceCalled('Execute', '/usr/hdp/current/zeppelin-server/bin/zeppelin-daemon.sh stop >> /var/log/zeppelin/zeppelin-setup.log', +@@ -213,7 +213,7 @@ + target = RMFTestCase.TARGET_COMMON_SERVICES + ) + self.assert_configure_default() +- self.assertResourceCalled('Execute', ('chown', '-R', u'zeppelin:zeppelin', '/etc/zeppelin'), ++ self.assertResourceCalled('Execute', ('chown', '-R', 'zeppelin:zeppelin', '/etc/zeppelin'), + sudo = True, + ) + +@@ -227,7 +227,7 @@ + target = RMFTestCase.TARGET_COMMON_SERVICES + ) + self.assert_configure_secured() +- self.assertResourceCalled('Execute', ('chown', '-R', u'zeppelin:zeppelin', '/etc/zeppelin'), ++ self.assertResourceCalled('Execute', ('chown', '-R', 'zeppelin:zeppelin', '/etc/zeppelin'), + sudo = True, + ) + self.assertResourceCalled('Execute', ('chown', '-R', 'zeppelin:zeppelin', '/usr/hdp/current/zeppelin-server/notebook'), +@@ -242,7 +242,7 @@ + keytab = UnknownConfigurationMock(), + default_fs = 'hdfs://c6401.ambari.apache.org:8020', + hdfs_resource_ignore_file = '/var/lib/ambari-agent/data/.hdfs_resource_ignore', +- hdfs_site = {u'a': u'b'}, ++ hdfs_site = {'a': 'b'}, + kinit_path_local = '/usr/bin/kinit', + principal_name = UnknownConfigurationMock(), + user = 'hdfs', +@@ -260,7 +260,7 @@ + keytab = UnknownConfigurationMock(), + default_fs = 'hdfs://c6401.ambari.apache.org:8020', + hdfs_resource_ignore_file = '/var/lib/ambari-agent/data/.hdfs_resource_ignore', +- hdfs_site = {u'a': u'b'}, ++ hdfs_site = {'a': 'b'}, + kinit_path_local = '/usr/bin/kinit', + principal_name = UnknownConfigurationMock(), + user = 'hdfs', +@@ -278,7 +278,7 @@ + keytab = UnknownConfigurationMock(), + default_fs = 'hdfs://c6401.ambari.apache.org:8020', + hdfs_resource_ignore_file = '/var/lib/ambari-agent/data/.hdfs_resource_ignore', +- hdfs_site = {u'a': u'b'}, ++ hdfs_site = {'a': 'b'}, + kinit_path_local = '/usr/bin/kinit', + principal_name = UnknownConfigurationMock(), + user = 'hdfs', +@@ -298,7 +298,7 @@ + default_fs = 'hdfs://c6401.ambari.apache.org:8020', + replace_existing_files = True, + hdfs_resource_ignore_file = '/var/lib/ambari-agent/data/.hdfs_resource_ignore', +- hdfs_site = {u'a': u'b'}, ++ hdfs_site = {'a': 'b'}, + kinit_path_local = '/usr/bin/kinit', + principal_name = UnknownConfigurationMock(), + user = 'hdfs', +@@ -307,7 +307,7 @@ + hadoop_conf_dir = '/usr/hdp/2.2.1.0-2067/hadoop/conf', + type = 'file', + action = ['create_on_execute'], +- mode = 0444, ++ mode = 0o444, + dfs_type='', + ) + self.assertResourceCalled('HdfsResource', None, +@@ -316,7 +316,7 @@ + keytab = UnknownConfigurationMock(), + default_fs = 'hdfs://c6401.ambari.apache.org:8020', + hdfs_resource_ignore_file = '/var/lib/ambari-agent/data/.hdfs_resource_ignore', +- hdfs_site = {u'a': u'b'}, ++ hdfs_site = {'a': 'b'}, + kinit_path_local = '/usr/bin/kinit', + principal_name = UnknownConfigurationMock(), + user = 'hdfs', +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.6/common/test_stack_advisor.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.6/common/test_stack_advisor.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.6/common/test_stack_advisor.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.6/common/test_stack_advisor.py 2022-07-11 00:52:31.000000000 +0800 +@@ -19,7 +19,7 @@ + import json + import os + from unittest import TestCase +-from mock.mock import patch ++from unittest.mock import patch + import socket + + class TestHDP26StackAdvisor(TestCase): +@@ -70,7 +70,7 @@ + @patch('__builtin__.open') + @patch('os.path.exists') + def get_system_min_uid_magic(self, exists_mock, open_mock): +- class MagicFile(object): ++ class MagicFile: + def read(self): + return """ + #test line UID_MIN 200 +@@ -185,7 +185,7 @@ + } + + self.stackAdvisor.recommendDruidConfigurations(configurations, clusterData, services, hosts) +- self.assertEquals(configurations, ++ self.assertEqual(configurations, + {'druid-historical': { + 'properties': {'druid.processing.numThreads': '3', + 'druid.server.http.numThreads': '40', +@@ -271,7 +271,7 @@ + } + + self.stackAdvisor.recommendSPARK2Configurations(configurations, clusterData, services, None) +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + + def test_recommendSPARK2Configurations_SecurityNotEnabledZeppelinInstalled(self): + configurations = { +@@ -332,7 +332,7 @@ + } + + self.stackAdvisor.recommendSPARK2Configurations(configurations, clusterData, services, None) +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + + def test_recommendSPARK2Configurations_SecurityEnabledZeppelinInstalledExistingValue(self): + configurations = { +@@ -397,7 +397,7 @@ + } + + self.stackAdvisor.recommendSPARK2Configurations(configurations, clusterData, services, None) +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + + def test_recommendSPARK2Configurations_SecurityEnabledZeppelinNotInstalled(self): + configurations = { +@@ -450,7 +450,7 @@ + } + + self.stackAdvisor.recommendSPARK2Configurations(configurations, clusterData, services, None) +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + + def test_recommendZEPPELINConfigurations_SecurityEnabledSPARKInstalled(self): + configurations = { +@@ -515,7 +515,7 @@ + } + + self.stackAdvisor.recommendZEPPELINConfigurations(configurations, clusterData, services, None) +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + + def test_recommendZEPPELINConfigurations_SecurityNotEnabledSparkInstalled(self): + configurations = { +@@ -572,7 +572,7 @@ + } + + self.stackAdvisor.recommendZEPPELINConfigurations(configurations, clusterData, services, None) +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + + def test_recommendZEPPELINConfigurations_SecurityEnabledZeppelinInstalledExistingValue(self): + configurations = { +@@ -635,7 +635,7 @@ + } + + self.stackAdvisor.recommendZEPPELINConfigurations(configurations, clusterData, services, None) +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + + def test_recommendZEPPELINConfigurations_SecurityEnabledSparkNotInstalled(self): + configurations = { +@@ -678,7 +678,7 @@ + } + + self.stackAdvisor.recommendZEPPELINConfigurations(configurations, clusterData, services, None) +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + + def test_recommendDruidConfigurations_WithPostgresql(self): + hosts = { +@@ -770,7 +770,7 @@ + } + + self.stackAdvisor.recommendDruidConfigurations(configurations, clusterData, services, hosts) +- self.assertEquals(configurations, ++ self.assertEqual(configurations, + {'druid-historical': { + 'properties': {'druid.processing.numThreads': '3', + 'druid.server.http.numThreads': '40', +@@ -884,7 +884,7 @@ + } + + self.stackAdvisor.recommendDruidConfigurations(configurations, clusterData, services, hosts) +- self.assertEquals(configurations, ++ self.assertEqual(configurations, + {'druid-historical': { + 'properties': {'druid.processing.numThreads': '3', + 'druid.server.http.numThreads': '40', +@@ -957,7 +957,7 @@ + } + + self.stackAdvisor.recommendDruidConfigurations(configurations, clusterData, services, hosts) +- self.assertEquals(configurations, ++ self.assertEqual(configurations, + {} + ) + +@@ -1085,7 +1085,7 @@ + } + + self.stackAdvisor.recommendDruidConfigurations(configurations, clusterData, services, hosts) +- self.assertEquals(configurations, ++ self.assertEqual(configurations, + {'druid-historical': { + 'properties': {'druid.processing.numThreads': '2', + 'druid.server.http.numThreads': '40', +@@ -1234,7 +1234,7 @@ + } + + self.stackAdvisor.recommendDruidConfigurations(configurations, clusterData, services, hosts) +- self.assertEquals(configurations, ++ self.assertEqual(configurations, + {'druid-historical': { + 'properties': {'druid.processing.numThreads': '5', + 'druid.server.http.numThreads': '40', +@@ -1356,7 +1356,7 @@ + } + + self.stackAdvisor.recommendAtlasConfigurations(configurations, clusterData, services, None) +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + + def test_recommendRangerConfigurations(self): + clusterData = {} +@@ -1423,7 +1423,7 @@ + recommendedConfigurations = {} + + self.stackAdvisor.recommendRangerConfigurations(recommendedConfigurations, clusterData, services, None) +- self.assertEquals(recommendedConfigurations, expected) ++ self.assertEqual(recommendedConfigurations, expected) + + def test_recommendRangerKMSConfigurations(self): + clusterData = {} +@@ -1492,7 +1492,7 @@ + recommendedConfigurations = {} + + self.stackAdvisor.recommendRangerKMSConfigurations(recommendedConfigurations, clusterData, services, None) +- self.assertEquals(recommendedConfigurations, expected) ++ self.assertEqual(recommendedConfigurations, expected) + + def test_recommendHDFSConfigurations(self): + ambariHostName = socket.getfqdn() +@@ -1599,14 +1599,14 @@ + } + + self.stackAdvisor.recommendHDFSConfigurations(configurations, clusterData, services, hosts) +- self.assertEquals(configurations,expected) ++ self.assertEqual(configurations,expected) + configurations['hadoop-env']['properties']['hdfs_user'] = 'hadoop' + expected['hadoop-env']['properties']['hdfs_user'] = 'hadoop' + expected['ranger-hdfs-plugin-properties']['properties']['REPOSITORY_CONFIG_USERNAME'] = 'hadoop' + expected['core-site']['properties']['hadoop.proxyuser.hadoop.hosts'] = '*' + expected['core-site']['properties']['hadoop.proxyuser.hadoop.groups'] = '*' + self.stackAdvisor.recommendHDFSConfigurations(configurations, clusterData, services, hosts) +- self.assertEquals(configurations,expected) ++ self.assertEqual(configurations,expected) + + + def test_recommendHiveConfigurations(self): +@@ -1925,7 +1925,7 @@ + + recommendedConfigurations = {} + self.stackAdvisor.recommendHIVEConfigurations(recommendedConfigurations, clusterData, services, hosts) +- self.assertEquals(recommendedConfigurations, expected) ++ self.assertEqual(recommendedConfigurations, expected) + + services['configurations']['hive-env']['properties']['hive_user'] = 'hive' + expected['ranger-hive-plugin-properties']['properties']['REPOSITORY_CONFIG_USERNAME'] = 'hive' +@@ -1946,7 +1946,7 @@ + + recommendedConfigurations = {} + self.stackAdvisor.recommendHIVEConfigurations(recommendedConfigurations, clusterData, services, hosts) +- self.assertEquals(recommendedConfigurations, expected) ++ self.assertEqual(recommendedConfigurations, expected) + + # case there are not druid-common configs present + del services['configurations']['druid-common'] +@@ -1957,7 +1957,7 @@ + + recommendedConfigurations = {} + self.stackAdvisor.recommendHIVEConfigurations(recommendedConfigurations, clusterData, services, hosts) +- self.assertEquals(recommendedConfigurations, expected) ++ self.assertEqual(recommendedConfigurations, expected) + + + def test_recommendHBASEConfigurations(self): +@@ -2043,12 +2043,12 @@ + } + } + self.stackAdvisor.recommendHBASEConfigurations(configurations, clusterData, services, None) +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + configurations['hbase-env']['properties']['hbase_user'] = 'hbase' + expected['hbase-env']['properties']['hbase_user'] = 'hbase' + expected['ranger-hbase-plugin-properties']['properties']['REPOSITORY_CONFIG_USERNAME'] = 'hbase' + self.stackAdvisor.recommendHBASEConfigurations(configurations, clusterData, services, None) +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + + def test_recommendYARNConfigurations(self): + configurations = { +@@ -2147,13 +2147,13 @@ + } + + self.stackAdvisor.recommendYARNConfigurations(configurations, clusterData, services, hosts) +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + + configurations['yarn-env']['properties']['yarn_user'] = 'yarn' + expected['yarn-env']['properties']['yarn_user'] = 'yarn' + expected['ranger-yarn-plugin-properties']['properties']['REPOSITORY_CONFIG_USERNAME'] = 'yarn' + self.stackAdvisor.recommendYARNConfigurations(configurations, clusterData, services, hosts) +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + + + +@@ -2268,7 +2268,7 @@ + ''' + + self.stackAdvisor.recommendYARNConfigurations(configurations, clusterData, services, hosts) +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + + + +@@ -2306,7 +2306,7 @@ + expected['yarn-env']['properties']['apptimelineserver_heapsize'] = '2048' + expected['yarn-site']['properties']['yarn.timeline-service.entity-group-fs-store.app-cache-size'] = '7' + self.stackAdvisor.recommendYARNConfigurations(configurations, clusterData, services, hosts) +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + + + +@@ -2344,7 +2344,7 @@ + expected['yarn-env']['properties']['apptimelineserver_heapsize'] = '4096' + expected['yarn-site']['properties']['yarn.timeline-service.entity-group-fs-store.app-cache-size'] = '10' + self.stackAdvisor.recommendYARNConfigurations(configurations, clusterData, services, hosts) +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + + + +@@ -2360,9 +2360,9 @@ + + services["changed-configurations"] = [ + { +- u'old_value': u'10', +- u'type': u'yarn-site', +- u'name': u'yarn.timeline-service.entity-group-fs-store.app-cache-size' ++ 'old_value': '10', ++ 'type': 'yarn-site', ++ 'name': 'yarn.timeline-service.entity-group-fs-store.app-cache-size' + } + ] + +@@ -2420,9 +2420,9 @@ + + services["changed-configurations"] = [ + { +- u'old_value': u'10', +- u'type': u'yarn-site', +- u'name': u'yarn.timeline-service.entity-group-fs-store.app-cache-size' ++ 'old_value': '10', ++ 'type': 'yarn-site', ++ 'name': 'yarn.timeline-service.entity-group-fs-store.app-cache-size' + } + ] + +@@ -2469,7 +2469,7 @@ + + expected['yarn-env']['properties']['apptimelineserver_heapsize'] = '2048' + self.stackAdvisor.recommendYARNConfigurations(configurations, clusterData, services, hosts) +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + + + +@@ -2486,9 +2486,9 @@ + + services["changed-configurations"] = [ + { +- u'old_value': u'10', +- u'type': u'yarn-site', +- u'name': u'yarn.timeline-service.entity-group-fs-store.app-cache-size' ++ 'old_value': '10', ++ 'type': 'yarn-site', ++ 'name': 'yarn.timeline-service.entity-group-fs-store.app-cache-size' + } + ] + +@@ -2535,7 +2535,7 @@ + + expected['yarn-env']['properties']['apptimelineserver_heapsize'] = '4572' + self.stackAdvisor.recommendYARNConfigurations(configurations, clusterData, services, hosts) +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + + + def test_recommendKAFKAConfigurations(self): +@@ -2600,12 +2600,12 @@ + } + + self.stackAdvisor.recommendKAFKAConfigurations(configurations, clusterData, services, None) +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + configurations['kafka-env']['properties']['kafka_user'] = 'kafka' + expected['kafka-env']['properties']['kafka_user'] = 'kafka' + expected['ranger-kafka-plugin-properties']['properties']['REPOSITORY_CONFIG_USERNAME'] = 'kafka' + self.stackAdvisor.recommendKAFKAConfigurations(configurations, clusterData, services, None) +- self.assertEquals(configurations, expected) ++ self.assertEqual(configurations, expected) + + def load_json(self, filename): + file = os.path.join(self.testDirectory, filename) +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.6/DRUID/test_druid.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.6/DRUID/test_druid.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.6/DRUID/test_druid.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.6/DRUID/test_druid.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 stacks.utils.RMFTestCase import * + +-from mock.mock import MagicMock, patch ++from unittest.mock import MagicMock, patch + from resource_management.libraries import functions + from resource_management.libraries.functions import format + from resource_management.core.logger import Logger +@@ -328,7 +328,7 @@ + def assert_configure_default(self, role): + + self.assertResourceCalled('Directory', '/var/log/druid', +- mode=0755, ++ mode=0o755, + owner='druid', + group='hadoop', + create_parents=True, +@@ -336,7 +336,7 @@ + ) + + self.assertResourceCalled('Directory', '/var/run/druid', +- mode=0755, ++ mode=0o755, + owner='druid', + group='hadoop', + create_parents=True, +@@ -344,7 +344,7 @@ + ) + + self.assertResourceCalled('Directory', format('/usr/hdp/current/{role}/conf'), +- mode=0700, ++ mode=0o700, + owner='druid', + group='hadoop', + create_parents=True, +@@ -353,7 +353,7 @@ + ) + + self.assertResourceCalled('Directory', format('/usr/hdp/current/{role}/conf/_common'), +- mode=0700, ++ mode=0o700, + owner='druid', + group='hadoop', + create_parents=True, +@@ -362,7 +362,7 @@ + ) + + self.assertResourceCalled('Directory', format('/usr/hdp/current/{role}/conf/coordinator'), +- mode=0700, ++ mode=0o700, + owner='druid', + group='hadoop', + create_parents=True, +@@ -371,7 +371,7 @@ + ) + + self.assertResourceCalled('Directory', format('/usr/hdp/current/{role}/conf/broker'), +- mode=0700, ++ mode=0o700, + owner='druid', + group='hadoop', + create_parents=True, +@@ -380,7 +380,7 @@ + ) + + self.assertResourceCalled('Directory', format('/usr/hdp/current/{role}/conf/middleManager'), +- mode=0700, ++ mode=0o700, + owner='druid', + group='hadoop', + create_parents=True, +@@ -389,7 +389,7 @@ + ) + + self.assertResourceCalled('Directory', format('/usr/hdp/current/{role}/conf/historical'), +- mode=0700, ++ mode=0o700, + owner='druid', + group='hadoop', + create_parents=True, +@@ -398,7 +398,7 @@ + ) + + self.assertResourceCalled('Directory', format('/usr/hdp/current/{role}/conf/overlord'), +- mode=0700, ++ mode=0o700, + owner='druid', + group='hadoop', + create_parents=True, +@@ -407,7 +407,7 @@ + ) + + self.assertResourceCalled('Directory', format('/usr/hdp/current/{role}/conf/router'), +- mode=0700, ++ mode=0o700, + owner='druid', + group='hadoop', + create_parents=True, +@@ -416,7 +416,7 @@ + ) + + self.assertResourceCalled('Directory', '/apps/druid/segmentCache/info_dir', +- mode=0700, ++ mode=0o700, + owner='druid', + group='hadoop', + create_parents=True, +@@ -425,7 +425,7 @@ + ) + + self.assertResourceCalled('Directory', '/apps/druid/tasks', +- mode=0700, ++ mode=0o700, + owner='druid', + group='hadoop', + create_parents=True, +@@ -434,7 +434,7 @@ + ) + + self.assertResourceCalled('Directory', '/apps/druid/segmentCache', +- mode=0700, ++ mode=0o700, + owner='druid', + group='hadoop', + create_parents=True, +@@ -445,7 +445,7 @@ + self.assertResourceCalled('File', format('/usr/hdp/current/{role}/conf/druid-env.sh'), + owner = 'druid', + content = InlineTemplate(self.getConfig()['configurations']['druid-env']['content']), +- mode = 0700 ++ mode = 0o700 + ) + druid_common_config = mutable_config_dict(self.getConfig()['configurations']['druid-common']) + druid_common_config['druid.host'] = 'c6401.ambari.apache.org' +@@ -461,18 +461,18 @@ + properties=druid_common_config, + owner='druid', + group='hadoop', +- mode = 0600 ++ mode = 0o600 + ) + + self.assertResourceCalled('File', format('/usr/hdp/current/{role}/conf/_common/druid-log4j.xml'), +- mode=0644, ++ mode=0o644, + owner = 'druid', + group = 'hadoop', + content = InlineTemplate(self.getConfig()['configurations']['druid-log4j']['content']) + ) + + self.assertResourceCalled('File', '/etc/logrotate.d/druid', +- mode=0644, ++ mode=0o644, + owner = 'root', + group = 'root', + content = InlineTemplate(self.getConfig()['configurations']['druid-logrotate']['content']) +@@ -483,7 +483,7 @@ + properties=self.getConfig()['configurations']['druid-coordinator'], + owner='druid', + group='hadoop', +- mode = 0600 ++ mode = 0o600 + ) + + self.assertResourceCalled('File', format("/usr/hdp/current/{role}/conf/coordinator/jvm.config"), +@@ -502,7 +502,7 @@ + properties=self.getConfig()['configurations']['druid-overlord'], + owner='druid', + group='hadoop', +- mode = 0600 ++ mode = 0o600 + ) + + self.assertResourceCalled('File', format("/usr/hdp/current/{role}/conf/overlord/jvm.config"), +@@ -521,7 +521,7 @@ + properties=self.getConfig()['configurations']['druid-historical'], + owner='druid', + group='hadoop', +- mode = 0600 ++ mode = 0o600 + ) + + self.assertResourceCalled('File', format("/usr/hdp/current/{role}/conf/historical/jvm.config"), +@@ -541,7 +541,7 @@ + properties=self.getConfig()['configurations']['druid-broker'], + owner='druid', + group='hadoop', +- mode = 0600 ++ mode = 0o600 + ) + + self.assertResourceCalled('File', format("/usr/hdp/current/{role}/conf/broker/jvm.config"), +@@ -561,7 +561,7 @@ + properties=self.getConfig()['configurations']['druid-middlemanager'], + owner='druid', + group='hadoop', +- mode = 0600 ++ mode = 0o600 + ) + + self.assertResourceCalled('File', format("/usr/hdp/current/{role}/conf/middleManager/jvm.config"), +@@ -580,7 +580,7 @@ + properties=self.getConfig()['configurations']['druid-router'], + owner='druid', + group='hadoop', +- mode = 0600 ++ mode = 0o600 + ) + + self.assertResourceCalled('File', format("/usr/hdp/current/{role}/conf/router/jvm.config"), +@@ -600,7 +600,7 @@ + hadoop_bin_dir = '/usr/hdp/2.5.0.0-1235/hadoop/bin', + keytab = UnknownConfigurationMock(), + default_fs = 'hdfs://c6401.ambari.apache.org:8020', +- hdfs_site = {u'a': u'b'}, ++ hdfs_site = {'a': 'b'}, + kinit_path_local = '/usr/bin/kinit', + principal_name = 'missing_principal', + user = 'hdfs', +@@ -620,7 +620,7 @@ + hadoop_bin_dir = '/usr/hdp/2.5.0.0-1235/hadoop/bin', + keytab = UnknownConfigurationMock(), + default_fs = 'hdfs://c6401.ambari.apache.org:8020', +- hdfs_site = {u'a': u'b'}, ++ hdfs_site = {'a': 'b'}, + kinit_path_local = '/usr/bin/kinit', + principal_name = 'missing_principal', + user = 'hdfs', +@@ -630,7 +630,7 @@ + action = ['create_on_execute'], hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', + dfs_type = '', + group='hadoop', +- mode=0775 ++ mode=0o775 + ) + self.assertResourceCalled('HdfsResource', '/tmp', + security_enabled = False, +@@ -639,7 +639,7 @@ + dfs_type = '', + default_fs = 'hdfs://c6401.ambari.apache.org:8020', + hdfs_resource_ignore_file = '/var/lib/ambari-agent/data/.hdfs_resource_ignore', +- hdfs_site = {u'a': u'b'}, ++ hdfs_site = {'a': 'b'}, + kinit_path_local = '/usr/bin/kinit', + principal_name = 'missing_principal', + user = 'hdfs', +@@ -647,12 +647,12 @@ + hadoop_conf_dir = '/usr/hdp/2.5.0.0-1235/hadoop/conf', + type = 'directory', + action = ['create_on_execute'], +- immutable_paths = [u'/apps/hive/warehouse', +- u'/apps/falcon', +- u'/mr-history/done', +- u'/app-logs', +- u'/tmp'], +- mode = 0777, ++ immutable_paths = ['/apps/hive/warehouse', ++ '/apps/falcon', ++ '/mr-history/done', ++ '/app-logs', ++ '/tmp'], ++ mode = 0o777, + ) + self.assertResourceCalled('HdfsResource', '/tmp/druid-indexing', + immutable_paths = self.DEFAULT_IMMUTABLE_PATHS, +@@ -660,7 +660,7 @@ + hadoop_bin_dir = '/usr/hdp/2.5.0.0-1235/hadoop/bin', + keytab = UnknownConfigurationMock(), + default_fs = 'hdfs://c6401.ambari.apache.org:8020', +- hdfs_site = {u'a': u'b'}, ++ hdfs_site = {'a': 'b'}, + kinit_path_local = '/usr/bin/kinit', + principal_name = 'missing_principal', + user = 'hdfs', +@@ -670,7 +670,7 @@ + type = 'directory', + action = ['create_on_execute'], hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', + dfs_type = '', +- mode=0775 ++ mode=0o775 + ) + + self.assertResourceCalled('HdfsResource', '/user/druid/logs', +@@ -679,7 +679,7 @@ + hadoop_bin_dir = '/usr/hdp/2.5.0.0-1235/hadoop/bin', + keytab = UnknownConfigurationMock(), + default_fs = 'hdfs://c6401.ambari.apache.org:8020', +- hdfs_site = {u'a': u'b'}, ++ hdfs_site = {'a': 'b'}, + kinit_path_local = '/usr/bin/kinit', + principal_name = 'missing_principal', + user = 'hdfs', +@@ -689,7 +689,7 @@ + type = 'directory', + action = ['create_on_execute'], hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', + dfs_type = '', +- mode=0755 ++ mode=0o755 + ) + + self.assertResourceCalled('File', format("/usr/lib/ambari-agent/DBConnectionVerification.jar"), +@@ -711,7 +711,7 @@ + ) + + self.assertResourceCalled('Directory', format('/usr/hdp/current/{role}/extensions'), +- mode=0755, ++ mode=0o755, + cd_access='a', + owner='druid', + group='hadoop', +@@ -720,7 +720,7 @@ + ) + + self.assertResourceCalled('Directory', format('/usr/hdp/current/{role}/hadoop-dependencies'), +- mode=0755, ++ mode=0o755, + cd_access='a', + owner='druid', + group='hadoop', +@@ -735,6 +735,6 @@ + + def mutable_config_dict(config): + rv = {} +- for key, value in config.iteritems(): ++ for key, value in config.items(): + rv[key] = value + return rv +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.6/KAFKA/test_kafka_broker_other_sasl.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.6/KAFKA/test_kafka_broker_other_sasl.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.6/KAFKA/test_kafka_broker_other_sasl.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.6/KAFKA/test_kafka_broker_other_sasl.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 + from stacks.utils.RMFTestCase import * +-from mock.mock import patch ++from unittest.mock import patch + + from only_for_platform import not_for_platform, PLATFORM_WINDOWS + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.6/RANGER/test_ranger_admin.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.6/RANGER/test_ranger_admin.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.6/RANGER/test_ranger_admin.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.6/RANGER/test_ranger_admin.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 json +-from mock.mock import MagicMock, patch ++from unittest.mock import MagicMock, patch + from stacks.utils.RMFTestCase import * + from only_for_platform import not_for_platform, PLATFORM_WINDOWS + +@@ -41,35 +41,35 @@ + + self.assertResourceCalled('Directory', '/var/log/ambari-infra-solr-client', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + cd_access = 'a', + ) + self.assertResourceCalled('Directory', '/usr/lib/ambari-infra-solr-client', + cd_access = 'a', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + recursive_ownership = True, + ) + self.assertResourceCalled('File', '/usr/lib/ambari-infra-solr-client/solrCloudCli.sh', + content = StaticFile('/usr/lib/ambari-infra-solr-client/solrCloudCli.sh'), +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('File', '/usr/lib/ambari-infra-solr-client/log4j.properties', + content = self.getConfig()['configurations']['infra-solr-client-log4j']['content'], +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/var/log/ambari-infra-solr-client/solr-client.log', + content = '', +- mode = 0664, ++ mode = 0o664, + ) + + self.assertResourceCalled('Execute', 'ambari-sudo.sh JAVA_HOME=/usr/jdk64/jdk1.7.0_45 /usr/lib/ambari-infra-solr-client/solrCloudCli.sh --zookeeper-connect-string c6401.ambari.apache.org:2181 --znode /infra-solr --check-znode --retry 5 --interval 10',) + + self.assertResourceCalled('File', '/usr/hdp/current/ranger-admin/contrib/solr_for_audit_setup/conf/solrconfig.xml', +- owner = u'ranger', ++ owner = 'ranger', + content = InlineTemplate(self.getConfig()['configurations']['ranger-solr-configuration']['content']), +- group = u'ranger', +- mode = 0644, ++ group = 'ranger', ++ mode = 0o644, + ) + + self.assertResourceCalledRegexp('^Execute$', '^ambari-sudo.sh JAVA_HOME=/usr/jdk64/jdk1.7.0_45 /usr/lib/ambari-infra-solr-client/solrCloudCli.sh --zookeeper-connect-string c6401.ambari.apache.org:2181/infra-solr --download-config --config-dir /tmp/solr_config_ranger_audits_0.[0-9]* --config-set ranger_audits --retry 30 --interval 5',only_if = 'ambari-sudo.sh JAVA_HOME=/usr/jdk64/jdk1.7.0_45 /usr/lib/ambari-infra-solr-client/solrCloudCli.sh --zookeeper-connect-string c6401.ambari.apache.org:2181/infra-solr --check-config --config-set ranger_audits --retry 30 --interval 5',) +@@ -92,7 +92,7 @@ + ) + + self.assertResourceCalled('Execute', '/usr/bin/ranger-admin-start', +- environment = {'JAVA_HOME': u'/usr/jdk64/jdk1.7.0_45'}, ++ environment = {'JAVA_HOME': '/usr/jdk64/jdk1.7.0_45'}, + not_if = 'ps -ef | grep proc_rangeradmin | grep -v grep', + user = 'ranger', + ) +@@ -113,26 +113,26 @@ + + self.assertResourceCalled('Directory', '/var/log/ambari-infra-solr-client', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + cd_access = 'a', + ) + self.assertResourceCalled('Directory', '/usr/lib/ambari-infra-solr-client', + cd_access = 'a', + create_parents = True, +- mode = 0755, ++ mode = 0o755, + recursive_ownership = True, + ) + self.assertResourceCalled('File', '/usr/lib/ambari-infra-solr-client/solrCloudCli.sh', + content = StaticFile('/usr/lib/ambari-infra-solr-client/solrCloudCli.sh'), +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('File', '/usr/lib/ambari-infra-solr-client/log4j.properties', + content = self.getConfig()['configurations']['infra-solr-client-log4j']['content'], +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/var/log/ambari-infra-solr-client/solr-client.log', + content = '', +- mode = 0664, ++ mode = 0o664, + ) + self.assertResourceCalled('File', '/usr/hdp/current/ranger-admin/conf/ranger_solr_jaas.conf', + content = Template('ranger_solr_jaas_conf.j2'), +@@ -142,10 +142,10 @@ + self.assertResourceCalled('Execute', 'ambari-sudo.sh JAVA_HOME=/usr/jdk64/jdk1.7.0_45 /usr/lib/ambari-infra-solr-client/solrCloudCli.sh --zookeeper-connect-string c6401.ambari.apache.org:2181 --znode /infra-solr --check-znode --retry 5 --interval 10',) + + self.assertResourceCalled('File', '/usr/hdp/current/ranger-admin/contrib/solr_for_audit_setup/conf/solrconfig.xml', +- owner = u'ranger', ++ owner = 'ranger', + content = InlineTemplate(self.getConfig()['configurations']['ranger-solr-configuration']['content']), +- group = u'ranger', +- mode = 0644, ++ group = 'ranger', ++ mode = 0o644, + ) + + self.assertResourceCalledRegexp('^Execute$', '^ambari-sudo.sh JAVA_HOME=/usr/jdk64/jdk1.7.0_45 /usr/lib/ambari-infra-solr-client/solrCloudCli.sh --zookeeper-connect-string c6401.ambari.apache.org:2181/infra-solr --jaas-file /usr/hdp/current/ranger-admin/conf/ranger_solr_jaas.conf --download-config --config-dir /tmp/solr_config_ranger_audits_0.[0-9]* --config-set ranger_audits --retry 30 --interval 5',only_if = 'ambari-sudo.sh JAVA_HOME=/usr/jdk64/jdk1.7.0_45 /usr/lib/ambari-infra-solr-client/solrCloudCli.sh --zookeeper-connect-string c6401.ambari.apache.org:2181/infra-solr --jaas-file /usr/hdp/current/ranger-admin/conf/ranger_solr_jaas.conf --check-config --config-set ranger_audits --retry 30 --interval 5',) +@@ -178,7 +178,7 @@ + ) + + self.assertResourceCalled('Execute', '/usr/bin/ranger-admin-start', +- environment = {'JAVA_HOME': u'/usr/jdk64/jdk1.7.0_45'}, ++ environment = {'JAVA_HOME': '/usr/jdk64/jdk1.7.0_45'}, + not_if = 'ps -ef | grep proc_rangeradmin | grep -v grep', + user = 'ranger', + ) +@@ -194,7 +194,7 @@ + + self.assertResourceCalled('File', '/tmp/mysql-connector-java.jar', + content = DownloadSource('http://c6401.ambari.apache.org:8080/resources/mysql-connector-java.jar'), +- mode = 0644 ++ mode = 0o644 + ) + + self.assertResourceCalled('Execute', ('cp', '--remove-destination', '/tmp/mysql-connector-java.jar', +@@ -204,7 +204,7 @@ + ) + + self.assertResourceCalled('File', '/usr/hdp/current/ranger-admin/ews/lib/mysql-connector-java.jar', +- mode = 0644 ++ mode = 0o644 + ) + + self.assertResourceCalled('ModifyPropertiesFile', '/usr/hdp/current/ranger-admin/install.properties', +@@ -224,15 +224,15 @@ + + self.assertResourceCalled('Execute', ('ambari-python-wrap /usr/hdp/current/ranger-admin/dba_script.py -q'), + user = 'ranger', +- environment = {'JAVA_HOME': u'/usr/jdk64/jdk1.7.0_45', +- 'RANGER_ADMIN_HOME': u'/usr/hdp/current/ranger-admin'}, ++ environment = {'JAVA_HOME': '/usr/jdk64/jdk1.7.0_45', ++ 'RANGER_ADMIN_HOME': '/usr/hdp/current/ranger-admin'}, + logoutput = True + ) + + self.assertResourceCalled('Execute', ('ambari-python-wrap /usr/hdp/current/ranger-admin/db_setup.py'), + user = 'ranger', +- environment = {'JAVA_HOME': u'/usr/jdk64/jdk1.7.0_45', +- 'RANGER_ADMIN_HOME': u'/usr/hdp/current/ranger-admin'}, ++ environment = {'JAVA_HOME': '/usr/jdk64/jdk1.7.0_45', ++ 'RANGER_ADMIN_HOME': '/usr/hdp/current/ranger-admin'}, + logoutput = True + ) + +@@ -253,7 +253,7 @@ + + self.assertResourceCalled('File', '/tmp/mysql-connector-java.jar', + content = DownloadSource('http://c6401.ambari.apache.org:8080/resources/mysql-connector-java.jar'), +- mode = 0644 ++ mode = 0o644 + ) + + self.assertResourceCalled('Execute', ('cp', '--remove-destination', '/tmp/mysql-connector-java.jar', '/usr/hdp/current/ranger-admin/ews/lib'), +@@ -262,7 +262,7 @@ + ) + + self.assertResourceCalled('File', '/usr/hdp/current/ranger-admin/ews/lib/mysql-connector-java.jar', +- mode = 0644 ++ mode = 0o644 + ) + + self.assertResourceCalled('ModifyPropertiesFile', '/usr/hdp/current/ranger-admin/install.properties', +@@ -277,7 +277,7 @@ + + self.assertResourceCalled('File', '/usr/lib/ambari-agent/DBConnectionVerification.jar', + content = DownloadSource('http://c6401.ambari.apache.org:8080/resources/DBConnectionVerification.jar'), +- mode = 0644 ++ mode = 0o644 + ) + + self.assertResourceCalled('Execute', +@@ -301,7 +301,7 @@ + ) + + self.assertResourceCalled('Directory', '/var/run/ranger', +- mode=0755, ++ mode=0o755, + owner = 'ranger', + group = 'hadoop', + cd_access = "a", +@@ -312,14 +312,14 @@ + content = 'export JAVA_HOME=/usr/jdk64/jdk1.7.0_45', + owner = 'ranger', + group = 'ranger', +- mode = 0755 ++ mode = 0o755 + ) + + self.assertResourceCalled('File', '/usr/hdp/current/ranger-admin/conf/ranger-admin-env-piddir.sh', + content = 'export RANGER_PID_DIR_PATH=/var/run/ranger\nexport RANGER_USER=ranger', + owner = 'ranger', + group = 'ranger', +- mode = 0755 ++ mode = 0o755 + ) + + self.assertResourceCalled('Directory', '/var/log/ranger/admin', +@@ -327,14 +327,14 @@ + group='ranger', + create_parents = True, + cd_access = 'a', +- mode = 0755 ++ mode = 0o755 + ) + + self.assertResourceCalled('File', '/usr/hdp/current/ranger-admin/conf/ranger-admin-env-logdir.sh', + content = 'export RANGER_ADMIN_LOG_DIR=/var/log/ranger/admin', + owner = 'ranger', + group = 'ranger', +- mode = 0755 ++ mode = 0o755 + ) + + self.assertResourceCalled('File', '/usr/hdp/current/ranger-admin/conf/ranger-admin-default-site.xml', +@@ -365,30 +365,30 @@ + conf_dir = '/usr/hdp/current/ranger-admin/conf', + configurations = ranger_admin_site_copy, + configuration_attributes = self.getConfig()['configurationAttributes']['ranger-admin-site'], +- mode = 0644 ++ mode = 0o644 + ) + + self.assertResourceCalled('Directory', '/usr/hdp/current/ranger-admin/conf/ranger_jaas', + owner ='ranger', + group ='ranger', +- mode = 0700 ++ mode = 0o700 + ) + + self.assertResourceCalled('File', '/usr/hdp/current/ranger-admin/ews/webapp/WEB-INF/log4j.properties', + owner = 'ranger', + group = 'ranger', + content = InlineTemplate(self.getConfig()['configurations']['admin-log4j']['content']), +- mode = 0644 ++ mode = 0o644 + ) + + self.assertResourceCalled('Execute', ('/usr/jdk64/jdk1.7.0_45/bin/java', '-cp', '/usr/hdp/current/ranger-admin/cred/lib/*', 'org.apache.ranger.credentialapi.buildks', 'create', 'rangeradmin', '-value', 'rangeradmin01', '-provider', 'jceks://file/etc/ranger/admin/rangeradmin.jceks'), +- environment = {'JAVA_HOME': u'/usr/jdk64/jdk1.7.0_45'}, ++ environment = {'JAVA_HOME': '/usr/jdk64/jdk1.7.0_45'}, + logoutput=True, + sudo = True + ) + + self.assertResourceCalled('Execute', ('/usr/jdk64/jdk1.7.0_45/bin/java', '-cp', '/usr/hdp/current/ranger-admin/cred/lib/*', 'org.apache.ranger.credentialapi.buildks', 'create', 'trustStoreAlias', '-value', 'changeit', '-provider', 'jceks://file/etc/ranger/admin/rangeradmin.jceks'), +- environment = {'JAVA_HOME': u'/usr/jdk64/jdk1.7.0_45'}, ++ environment = {'JAVA_HOME': '/usr/jdk64/jdk1.7.0_45'}, + logoutput=True, + sudo = True + ) +@@ -397,14 +397,14 @@ + owner = 'ranger', + group = 'ranger', + only_if = 'test -e /etc/ranger/admin/rangeradmin.jceks', +- mode = 0640 ++ mode = 0o640 + ) + + self.assertResourceCalled('File', '/etc/ranger/admin/.rangeradmin.jceks.crc', + owner = 'ranger', + group = 'ranger', + only_if = 'test -e /etc/ranger/admin/.rangeradmin.jceks.crc', +- mode = 0640 ++ mode = 0o640 + ) + + self.assertResourceCalled('XmlConfig', 'core-site.xml', +@@ -413,13 +413,13 @@ + conf_dir = '/usr/hdp/current/ranger-admin/conf', + configurations = self.getConfig()['configurations']['core-site'], + configuration_attributes = self.getConfig()['configurationAttributes']['core-site'], +- mode = 0644 ++ mode = 0o644 + ) + + self.assertResourceCalled('Execute', ('ambari-python-wrap /usr/hdp/current/ranger-admin/db_setup.py -javapatch'), + user = 'ranger', +- environment = {'JAVA_HOME': u'/usr/jdk64/jdk1.7.0_45', +- 'RANGER_ADMIN_HOME': u'/usr/hdp/current/ranger-admin'}, ++ environment = {'JAVA_HOME': '/usr/jdk64/jdk1.7.0_45', ++ 'RANGER_ADMIN_HOME': '/usr/hdp/current/ranger-admin'}, + logoutput = True + ) + +@@ -440,7 +440,7 @@ + + self.assertResourceCalled('File', '/tmp/mysql-connector-java.jar', + content = DownloadSource('http://c6401.ambari.apache.org:8080/resources/mysql-connector-java.jar'), +- mode = 0644 ++ mode = 0o644 + ) + + self.assertResourceCalled('Execute', ('cp', '--remove-destination', '/tmp/mysql-connector-java.jar', '/usr/hdp/current/ranger-admin/ews/lib'), +@@ -449,7 +449,7 @@ + ) + + self.assertResourceCalled('File', '/usr/hdp/current/ranger-admin/ews/lib/mysql-connector-java.jar', +- mode = 0644 ++ mode = 0o644 + ) + + self.assertResourceCalled('ModifyPropertiesFile', '/usr/hdp/current/ranger-admin/install.properties', +@@ -464,7 +464,7 @@ + + self.assertResourceCalled('File', '/usr/lib/ambari-agent/DBConnectionVerification.jar', + content = DownloadSource('http://c6401.ambari.apache.org:8080/resources/DBConnectionVerification.jar'), +- mode = 0644 ++ mode = 0o644 + ) + + self.assertResourceCalled('Execute', +@@ -488,7 +488,7 @@ + ) + + self.assertResourceCalled('Directory', '/var/run/ranger', +- mode=0755, ++ mode=0o755, + owner = 'ranger', + group = 'hadoop', + cd_access = "a", +@@ -499,14 +499,14 @@ + content = 'export JAVA_HOME=/usr/jdk64/jdk1.7.0_45', + owner = 'ranger', + group = 'ranger', +- mode = 0755 ++ mode = 0o755 + ) + + self.assertResourceCalled('File', '/usr/hdp/current/ranger-admin/conf/ranger-admin-env-piddir.sh', + content = 'export RANGER_PID_DIR_PATH=/var/run/ranger\nexport RANGER_USER=ranger', + owner = 'ranger', + group = 'ranger', +- mode = 0755 ++ mode = 0o755 + ) + + self.assertResourceCalled('Directory', '/var/log/ranger/admin', +@@ -514,14 +514,14 @@ + group='ranger', + create_parents = True, + cd_access = 'a', +- mode = 0755 ++ mode = 0o755 + ) + + self.assertResourceCalled('File', '/usr/hdp/current/ranger-admin/conf/ranger-admin-env-logdir.sh', + content = 'export RANGER_ADMIN_LOG_DIR=/var/log/ranger/admin', + owner = 'ranger', + group = 'ranger', +- mode = 0755 ++ mode = 0o755 + ) + + self.assertResourceCalled('File', '/usr/hdp/current/ranger-admin/conf/ranger-admin-default-site.xml', +@@ -552,30 +552,30 @@ + conf_dir = '/usr/hdp/current/ranger-admin/conf', + configurations = ranger_admin_site_copy, + configuration_attributes = self.getConfig()['configurationAttributes']['ranger-admin-site'], +- mode = 0644 ++ mode = 0o644 + ) + + self.assertResourceCalled('Directory', '/usr/hdp/current/ranger-admin/conf/ranger_jaas', + owner ='ranger', + group ='ranger', +- mode = 0700 ++ mode = 0o700 + ) + + self.assertResourceCalled('File', '/usr/hdp/current/ranger-admin/ews/webapp/WEB-INF/log4j.properties', + owner = 'ranger', + group = 'ranger', + content = InlineTemplate(self.getConfig()['configurations']['admin-log4j']['content']), +- mode = 0644 ++ mode = 0o644 + ) + + self.assertResourceCalled('Execute', ('/usr/jdk64/jdk1.7.0_45/bin/java', '-cp', '/usr/hdp/current/ranger-admin/cred/lib/*', 'org.apache.ranger.credentialapi.buildks', 'create', 'rangeradmin', '-value', 'rangeradmin01', '-provider', 'jceks://file/etc/ranger/admin/rangeradmin.jceks'), +- environment = {'JAVA_HOME': u'/usr/jdk64/jdk1.7.0_45'}, ++ environment = {'JAVA_HOME': '/usr/jdk64/jdk1.7.0_45'}, + logoutput=True, + sudo = True + ) + + self.assertResourceCalled('Execute', ('/usr/jdk64/jdk1.7.0_45/bin/java', '-cp', '/usr/hdp/current/ranger-admin/cred/lib/*', 'org.apache.ranger.credentialapi.buildks', 'create', 'trustStoreAlias', '-value', 'changeit', '-provider', 'jceks://file/etc/ranger/admin/rangeradmin.jceks'), +- environment = {'JAVA_HOME': u'/usr/jdk64/jdk1.7.0_45'}, ++ environment = {'JAVA_HOME': '/usr/jdk64/jdk1.7.0_45'}, + logoutput=True, + sudo = True + ) +@@ -584,14 +584,14 @@ + owner = 'ranger', + group = 'ranger', + only_if = 'test -e /etc/ranger/admin/rangeradmin.jceks', +- mode = 0640 ++ mode = 0o640 + ) + + self.assertResourceCalled('File', '/etc/ranger/admin/.rangeradmin.jceks.crc', + owner = 'ranger', + group = 'ranger', + only_if = 'test -e /etc/ranger/admin/.rangeradmin.jceks.crc', +- mode = 0640 ++ mode = 0o640 + ) + + self.assertResourceCalled('XmlConfig', 'core-site.xml', +@@ -600,12 +600,12 @@ + conf_dir = '/usr/hdp/current/ranger-admin/conf', + configurations = self.getConfig()['configurations']['core-site'], + configuration_attributes = self.getConfig()['configurationAttributes']['core-site'], +- mode = 0644 ++ mode = 0o644 + ) + + self.assertResourceCalled('Execute', ('ambari-python-wrap /usr/hdp/current/ranger-admin/db_setup.py -javapatch'), + user = 'ranger', +- environment = {'JAVA_HOME': u'/usr/jdk64/jdk1.7.0_45', +- 'RANGER_ADMIN_HOME': u'/usr/hdp/current/ranger-admin'}, ++ environment = {'JAVA_HOME': '/usr/jdk64/jdk1.7.0_45', ++ 'RANGER_ADMIN_HOME': '/usr/hdp/current/ranger-admin'}, + logoutput = True + ) +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.6/RANGER/test_ranger_tagsync.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.6/RANGER/test_ranger_tagsync.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.6/RANGER/test_ranger_tagsync.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.6/RANGER/test_ranger_tagsync.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 json +-from mock.mock import MagicMock, patch ++from unittest.mock import MagicMock, patch + from stacks.utils.RMFTestCase import * + from only_for_platform import not_for_platform, PLATFORM_WINDOWS + +@@ -48,7 +48,7 @@ + ) + self.assert_configure_default() + self.assertResourceCalled('Execute', '/usr/hdp/current/ranger-tagsync/ranger-tagsync-services.sh start', +- environment = {'JAVA_HOME': u'/usr/jdk64/jdk1.7.0_45'}, ++ environment = {'JAVA_HOME': '/usr/jdk64/jdk1.7.0_45'}, + not_if = 'ps -ef | grep proc_rangertagsync | grep -v grep', + user = 'ranger', + ) +@@ -63,7 +63,7 @@ + target = RMFTestCase.TARGET_COMMON_SERVICES + ) + self.assertResourceCalled('Execute', '/usr/hdp/current/ranger-tagsync/ranger-tagsync-services.sh stop', +- environment = {'JAVA_HOME': u'/usr/jdk64/jdk1.7.0_45'}, ++ environment = {'JAVA_HOME': '/usr/jdk64/jdk1.7.0_45'}, + user = 'ranger' + ) + +@@ -91,7 +91,7 @@ + ) + + self.assertResourceCalled('Directory', '/var/run/ranger', +- mode=0755, ++ mode=0o755, + owner = 'ranger', + group = 'hadoop', + cd_access = "a", +@@ -102,14 +102,14 @@ + content = 'export TAGSYNC_PID_DIR_PATH=/var/run/ranger\nexport UNIX_TAGSYNC_USER=ranger', + owner = 'ranger', + group = 'ranger', +- mode = 0755 ++ mode = 0o755 + ) + + self.assertResourceCalled('Directory', '/var/log/ranger/tagsync', + owner = 'ranger', + group = 'ranger', + cd_access = "a", +- mode=0755, ++ mode=0o755, + create_parents = True + ) + +@@ -118,7 +118,7 @@ + owner = 'ranger', + content = 'export RANGER_TAGSYNC_LOG_DIR=/var/log/ranger/tagsync', + group = 'ranger', +- mode=0755 ++ mode=0o755 + ) + + self.assertResourceCalled('XmlConfig', 'ranger-tagsync-site.xml', +@@ -127,7 +127,7 @@ + conf_dir = '/usr/hdp/current/ranger-tagsync/conf', + configurations = self.getConfig()['configurations']['ranger-tagsync-site'], + configuration_attributes = self.getConfig()['configurationAttributes']['ranger-tagsync-site'], +- mode=0644 ++ mode=0o644 + ) + + self.assertResourceCalled('Directory', '/etc/security/serverKeys', +@@ -139,7 +139,7 @@ + owner = 'ranger', + group = 'ranger', + create_parents = True, +- mode = 0775, ++ mode = 0o775, + cd_access = 'a', + ) + +@@ -156,12 +156,12 @@ + conf_dir = '/usr/hdp/current/ranger-tagsync/conf', + configurations = ranger_tagsync_policymgr_ssl_copy, + configuration_attributes = self.getConfig()['configurationAttributes']['ranger-tagsync-policymgr-ssl'], +- mode = 0644, ++ mode = 0o644, + ) + +- self.assertResourceCalled('Execute', (u'/usr/jdk64/jdk1.7.0_45/bin/java', ++ self.assertResourceCalled('Execute', ('/usr/jdk64/jdk1.7.0_45/bin/java', + '-cp', +- u'/usr/hdp/current/ranger-tagsync/lib/*', ++ '/usr/hdp/current/ranger-tagsync/lib/*', + 'org.apache.ranger.credentialapi.buildks', + 'create', + 'sslKeyStore', +@@ -170,13 +170,13 @@ + '-provider', + 'jceks://file/etc/ranger/tagsync/rangercred.jceks'), + logoutput = True, +- environment = {'JAVA_HOME': u'/usr/jdk64/jdk1.7.0_45'}, ++ environment = {'JAVA_HOME': '/usr/jdk64/jdk1.7.0_45'}, + sudo = True, + ) + +- self.assertResourceCalled('Execute', (u'/usr/jdk64/jdk1.7.0_45/bin/java', ++ self.assertResourceCalled('Execute', ('/usr/jdk64/jdk1.7.0_45/bin/java', + '-cp', +- u'/usr/hdp/current/ranger-tagsync/lib/*', ++ '/usr/hdp/current/ranger-tagsync/lib/*', + 'org.apache.ranger.credentialapi.buildks', + 'create', + 'sslTrustStore', +@@ -185,7 +185,7 @@ + '-provider', + 'jceks://file/etc/ranger/tagsync/rangercred.jceks'), + logoutput = True, +- environment = {'JAVA_HOME': u'/usr/jdk64/jdk1.7.0_45'}, ++ environment = {'JAVA_HOME': '/usr/jdk64/jdk1.7.0_45'}, + sudo = True, + ) + +@@ -193,14 +193,14 @@ + owner = 'ranger', + group = 'ranger', + only_if = 'test -e /etc/ranger/tagsync/rangercred.jceks', +- mode = 0640, ++ mode = 0o640, + ) + + self.assertResourceCalled('File', '/etc/ranger/tagsync/.rangercred.jceks.crc', + owner = 'ranger', + group = 'ranger', + only_if = 'test -e /etc/ranger/tagsync/.rangercred.jceks.crc', +- mode = 0640, ++ mode = 0o640, + ) + + atlas_tagsync_ssl_copy = {} +@@ -212,15 +212,15 @@ + self.assertResourceCalled('XmlConfig', 'atlas-tagsync-ssl.xml', + group = 'ranger', + conf_dir = '/usr/hdp/current/ranger-tagsync/conf', +- mode = 0644, ++ mode = 0o644, + configuration_attributes = UnknownConfigurationMock(), + owner = 'ranger', + configurations = atlas_tagsync_ssl_copy + ) + +- self.assertResourceCalled('Execute', (u'/usr/jdk64/jdk1.7.0_45/bin/java', ++ self.assertResourceCalled('Execute', ('/usr/jdk64/jdk1.7.0_45/bin/java', + '-cp', +- u'/usr/hdp/current/ranger-tagsync/lib/*', ++ '/usr/hdp/current/ranger-tagsync/lib/*', + 'org.apache.ranger.credentialapi.buildks', + 'create', + 'sslKeyStore', +@@ -229,13 +229,13 @@ + '-provider', + 'jceks://file/etc/ranger/tagsync/atlascred.jceks'), + logoutput = True, +- environment = {'JAVA_HOME': u'/usr/jdk64/jdk1.7.0_45'}, ++ environment = {'JAVA_HOME': '/usr/jdk64/jdk1.7.0_45'}, + sudo = True, + ) + +- self.assertResourceCalled('Execute', (u'/usr/jdk64/jdk1.7.0_45/bin/java', ++ self.assertResourceCalled('Execute', ('/usr/jdk64/jdk1.7.0_45/bin/java', + '-cp', +- u'/usr/hdp/current/ranger-tagsync/lib/*', ++ '/usr/hdp/current/ranger-tagsync/lib/*', + 'org.apache.ranger.credentialapi.buildks', + 'create', + 'sslTrustStore', +@@ -244,7 +244,7 @@ + '-provider', + 'jceks://file/etc/ranger/tagsync/atlascred.jceks'), + logoutput = True, +- environment = {'JAVA_HOME': u'/usr/jdk64/jdk1.7.0_45'}, ++ environment = {'JAVA_HOME': '/usr/jdk64/jdk1.7.0_45'}, + sudo = True, + ) + +@@ -252,19 +252,19 @@ + owner = 'ranger', + group = 'ranger', + only_if = 'test -e /etc/ranger/tagsync/atlascred.jceks', +- mode = 0640, ++ mode = 0o640, + ) + + self.assertResourceCalled('File', '/etc/ranger/tagsync/.atlascred.jceks.crc', + owner = 'ranger', + group = 'ranger', + only_if = 'test -e /etc/ranger/tagsync/.atlascred.jceks.crc', +- mode = 0640, ++ mode = 0o640, + ) + + self.assertResourceCalled('PropertiesFile', '/usr/hdp/current/ranger-tagsync/conf/atlas-application.properties', + properties = self.getConfig()['configurations']['tagsync-application-properties'], +- mode=0755, ++ mode=0o755, + owner='ranger', + group='ranger' + ) +@@ -273,11 +273,11 @@ + owner = 'ranger', + group = 'ranger', + content = InlineTemplate(self.getConfig()['configurations']['tagsync-log4j']['content']), +- mode = 0644 ++ mode = 0o644 + ) + + self.assertResourceCalled('File', '/usr/hdp/current/ranger-tagsync/ranger-tagsync-services.sh', +- mode = 0755, ++ mode = 0o755, + ) + + self.assertResourceCalled('Execute', ('ln', '-sf', '/usr/hdp/current/ranger-tagsync/ranger-tagsync-services.sh', '/usr/bin/ranger-tagsync'), +@@ -292,5 +292,5 @@ + conf_dir = '/usr/hdp/current/ranger-tagsync/conf', + configurations = self.getConfig()['configurations']['core-site'], + configuration_attributes = self.getConfig()['configurationAttributes']['core-site'], +- mode = 0644 ++ mode = 0o644 + ) +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.6/SPARK2/test_spark_livy2.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.6/SPARK2/test_spark_livy2.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.6/SPARK2/test_spark_livy2.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.6/SPARK2/test_spark_livy2.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 json +-from mock.mock import MagicMock, patch ++from unittest.mock import MagicMock, patch + from stacks.utils.RMFTestCase import * + + from only_for_platform import not_for_platform, PLATFORM_WINDOWS +@@ -47,14 +47,14 @@ + group = 'hadoop', + create_parents = True, + cd_access = 'a', +- mode = 0775 ++ mode = 0o775 + ) + self.assertResourceCalled('Directory', '/var/log/livy2', + owner = 'livy', + group = 'hadoop', + create_parents = True, + cd_access = 'a', +- mode = 0775 ++ mode = 0o775 + ) + self.assertResourceCalled('HdfsResource', '/user/livy', + immutable_paths = self.DEFAULT_IMMUTABLE_PATHS, +@@ -62,7 +62,7 @@ + hadoop_bin_dir = '/usr/hdp/2.5.0.0-1235/hadoop/bin', + keytab = UnknownConfigurationMock(), + default_fs = 'hdfs://c6401.ambari.apache.org:8020', +- hdfs_site = {u'a': u'b'}, ++ hdfs_site = {'a': 'b'}, + kinit_path_local = '/usr/bin/kinit', + principal_name = UnknownConfigurationMock(), + user = 'hdfs', +@@ -71,7 +71,7 @@ + type = 'directory', + action = ['create_on_execute'], hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', + dfs_type = '', +- mode = 0775, ++ mode = 0o775, + ) + self.assertResourceCalled('HdfsResource', None, + immutable_paths = self.DEFAULT_IMMUTABLE_PATHS, +@@ -79,7 +79,7 @@ + hadoop_bin_dir = '/usr/hdp/2.5.0.0-1235/hadoop/bin', + keytab = UnknownConfigurationMock(), + default_fs = 'hdfs://c6401.ambari.apache.org:8020', +- hdfs_site = {u'a': u'b'}, ++ hdfs_site = {'a': 'b'}, + kinit_path_local = '/usr/bin/kinit', + principal_name = UnknownConfigurationMock(), + user = 'hdfs', +@@ -93,7 +93,7 @@ + hadoop_bin_dir = '/usr/hdp/2.5.0.0-1235/hadoop/bin', + keytab = UnknownConfigurationMock(), + default_fs = 'hdfs://c6401.ambari.apache.org:8020', +- hdfs_site = {u'a': u'b'}, ++ hdfs_site = {'a': 'b'}, + kinit_path_local = '/usr/bin/kinit', + principal_name = UnknownConfigurationMock(), + user = 'hdfs', +@@ -102,7 +102,7 @@ + type = 'directory', + action = ['create_on_execute'], hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', + dfs_type = '', +- mode = 0700, ++ mode = 0o700, + ) + self.assertResourceCalled('HdfsResource', None, + immutable_paths = self.DEFAULT_IMMUTABLE_PATHS, +@@ -110,7 +110,7 @@ + hadoop_bin_dir = '/usr/hdp/2.5.0.0-1235/hadoop/bin', + keytab = UnknownConfigurationMock(), + default_fs = 'hdfs://c6401.ambari.apache.org:8020', +- hdfs_site = {u'a': u'b'}, ++ hdfs_site = {'a': 'b'}, + kinit_path_local = '/usr/bin/kinit', + principal_name = UnknownConfigurationMock(), + user = 'hdfs', +@@ -122,7 +122,7 @@ + content = InlineTemplate(self.getConfig()['configurations']['livy2-env']['content']), + owner = 'livy', + group = 'livy', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('PropertiesFile', '/usr/hdp/current/livy2-server/conf/livy.conf', + owner = 'livy', +@@ -134,18 +134,18 @@ + content = '\n # Set everything to be logged to the console\n log4j.rootCategory=INFO, console\n log4j.appender.console=org.apache.log4j.ConsoleAppender\n log4j.appender.console.target=System.err\n log4j.appender.console.layout=org.apache.log4j.PatternLayout\n log4j.appender.console.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{1}: %m%n\n\n log4j.logger.org.eclipse.jetty=WARN', + owner = 'livy', + group = 'livy', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('File', '/usr/hdp/current/livy2-server/conf/spark-blacklist.conf', + content = self.getConfig()['configurations']['livy2-spark-blacklist']['content'], + owner = 'livy', + group = 'livy', +- mode = 0644, ++ mode = 0o644, + ) + self.assertResourceCalled('Directory', '/usr/hdp/current/livy2-server/logs', + owner = 'livy', + group = 'livy', +- mode = 0755, ++ mode = 0o755, + ) + self.assertResourceCalled('Execute', '/usr/hdp/current/livy2-server/bin/livy-server start', + environment = {'JAVA_HOME': '/usr/jdk64/jdk1.7.0_45'}, +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.6/ZEPPELIN/interpreter_json_generated.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.6/ZEPPELIN/interpreter_json_generated.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.6/ZEPPELIN/interpreter_json_generated.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.6/ZEPPELIN/interpreter_json_generated.py 2022-07-11 00:52:31.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.6/ZEPPELIN/test_zeppelin_070.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.6/ZEPPELIN/test_zeppelin_070.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/2.6/ZEPPELIN/test_zeppelin_070.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/2.6/ZEPPELIN/test_zeppelin_070.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 glob + import unittest + +-from mock.mock import MagicMock, patch ++from unittest.mock import MagicMock, patch + from resource_management.core import sudo + from stacks.utils.RMFTestCase import * + +@@ -41,25 +41,25 @@ + owner='zeppelin', + group='zeppelin', + create_parents=True, +- mode=0755, ++ mode=0o755, + cd_access='a', + ) + self.assertResourceCalled('Directory', '/var/run/zeppelin', + owner='zeppelin', + create_parents=True, + group='zeppelin', +- mode=0755, ++ mode=0o755, + cd_access='a', + ) + self.assertResourceCalled('Directory', '/usr/hdp/current/zeppelin-server', + owner='zeppelin', + group='zeppelin', + create_parents=True, +- mode=0755, ++ mode=0o755, + cd_access='a', + ) + self.assertResourceCalled('Execute', ( +- 'chown', '-R', u'zeppelin:zeppelin', '/var/run/zeppelin'), sudo=True) ++ 'chown', '-R', 'zeppelin:zeppelin', '/var/run/zeppelin'), sudo=True) + self.assertResourceCalled('XmlConfig', 'zeppelin-site.xml', + owner='zeppelin', + group='zeppelin', +@@ -82,16 +82,16 @@ + group='zeppelin', + ) + self.assertResourceCalled('File', '/etc/zeppelin/conf/log4j.properties', +- owner=u'zeppelin', +- content=u'log4j.rootLogger = INFO, dailyfile', +- group=u'zeppelin', ++ owner='zeppelin', ++ content='log4j.rootLogger = INFO, dailyfile', ++ group='zeppelin', + ) + self.assertResourceCalled('Directory', + '/etc/zeppelin/conf/external-dependency-conf', + owner='zeppelin', + group='zeppelin', + create_parents=True, +- mode=0755, ++ mode=0o755, + cd_access='a', + ) + +@@ -100,25 +100,25 @@ + owner='zeppelin', + group='zeppelin', + create_parents=True, +- mode=0755, ++ mode=0o755, + cd_access='a', + ) + self.assertResourceCalled('Directory', '/var/run/zeppelin', + owner='zeppelin', + create_parents=True, + group='zeppelin', +- mode=0755, ++ mode=0o755, + cd_access='a', + ) + self.assertResourceCalled('Directory', '/usr/hdp/current/zeppelin-server', + owner='zeppelin', + group='zeppelin', + create_parents=True, +- mode=0755, ++ mode=0o755, + cd_access='a', + ) + self.assertResourceCalled('Execute', ( +- 'chown', '-R', u'zeppelin:zeppelin', '/var/run/zeppelin'), sudo=True) ++ 'chown', '-R', 'zeppelin:zeppelin', '/var/run/zeppelin'), sudo=True) + self.assertResourceCalled('XmlConfig', 'zeppelin-site.xml', + owner='zeppelin', + group='zeppelin', +@@ -141,16 +141,16 @@ + group='zeppelin', + ) + self.assertResourceCalled('File', '/etc/zeppelin/conf/log4j.properties', +- owner=u'zeppelin', +- content=u'log4j.rootLogger = INFO, dailyfile', +- group=u'zeppelin', ++ owner='zeppelin', ++ content='log4j.rootLogger = INFO, dailyfile', ++ group='zeppelin', + ) + self.assertResourceCalled('Directory', + '/etc/zeppelin/conf/external-dependency-conf', + owner='zeppelin', + group='zeppelin', + create_parents=True, +- mode=0755, ++ mode=0o755, + cd_access='a', + ) + +@@ -177,11 +177,11 @@ + owner='zeppelin', + group='zeppelin', + create_parents=True, +- mode=0755, ++ mode=0o755, + cd_access='a', + ) + self.assertResourceCalled('Execute', ( +- 'chown', '-R', u'zeppelin:zeppelin', '/var/run/zeppelin'), ++ 'chown', '-R', 'zeppelin:zeppelin', '/var/run/zeppelin'), + sudo=True, + ) + self.assertResourceCalled('Execute', +@@ -200,7 +200,7 @@ + ) + self.assert_configure_default() + self.assertResourceCalled('Execute', ( +- 'chown', '-R', u'zeppelin:zeppelin', '/etc/zeppelin'), ++ 'chown', '-R', 'zeppelin:zeppelin', '/etc/zeppelin'), + sudo=True, + ) + +@@ -215,7 +215,7 @@ + ) + self.assert_configure_secured() + self.assertResourceCalled('Execute', ( +- 'chown', '-R', u'zeppelin:zeppelin', '/etc/zeppelin'), ++ 'chown', '-R', 'zeppelin:zeppelin', '/etc/zeppelin'), + sudo=True, + ) + self.assertResourceCalled('Execute', ('chown', '-R', 'zeppelin:zeppelin', +@@ -224,9 +224,9 @@ + ) + self.assertResourceCalled('HdfsResource', '/user/zeppelin/notebook', + hadoop_bin_dir='/usr/hdp/2.5.0.0-1235/hadoop/bin', +- default_fs=u'hdfs://c6401.ambari.apache.org:8020', ++ default_fs='hdfs://c6401.ambari.apache.org:8020', + hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', +- hdfs_site={u'a': u'b'}, ++ hdfs_site={'a': 'b'}, + keytab=UnknownConfigurationMock(), + kinit_path_local='/usr/bin/kinit', + user='hdfs', +@@ -242,9 +242,9 @@ + ) + self.assertResourceCalled('HdfsResource', '/user/zeppelin/notebook', + hadoop_bin_dir='/usr/hdp/2.5.0.0-1235/hadoop/bin', +- default_fs=u'hdfs://c6401.ambari.apache.org:8020', ++ default_fs='hdfs://c6401.ambari.apache.org:8020', + hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', +- hdfs_site={u'a': u'b'}, ++ hdfs_site={'a': 'b'}, + keytab=UnknownConfigurationMock(), + kinit_path_local='/usr/bin/kinit', + user='hdfs', +@@ -262,9 +262,9 @@ + + self.assertResourceCalled('HdfsResource', '/user/zeppelin', + hadoop_bin_dir='/usr/hdp/2.5.0.0-1235/hadoop/bin', +- default_fs=u'hdfs://c6401.ambari.apache.org:8020', ++ default_fs='hdfs://c6401.ambari.apache.org:8020', + hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', +- hdfs_site={u'a': u'b'}, ++ hdfs_site={'a': 'b'}, + keytab=UnknownConfigurationMock(), + kinit_path_local='/usr/bin/kinit', + user='hdfs', +@@ -280,9 +280,9 @@ + ) + self.assertResourceCalled('HdfsResource', '/user/zeppelin/test', + hadoop_bin_dir='/usr/hdp/2.5.0.0-1235/hadoop/bin', +- default_fs=u'hdfs://c6401.ambari.apache.org:8020', ++ default_fs='hdfs://c6401.ambari.apache.org:8020', + hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', +- hdfs_site={u'a': u'b'}, ++ hdfs_site={'a': 'b'}, + kinit_path_local='/usr/bin/kinit', + user='hdfs', + owner='zeppelin', +@@ -298,9 +298,9 @@ + ) + self.assertResourceCalled('HdfsResource', '/apps/zeppelin', + hadoop_bin_dir='/usr/hdp/2.5.0.0-1235/hadoop/bin', +- default_fs=u'hdfs://c6401.ambari.apache.org:8020', ++ default_fs='hdfs://c6401.ambari.apache.org:8020', + hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', +- hdfs_site={u'a': u'b'}, ++ hdfs_site={'a': 'b'}, + kinit_path_local='/usr/bin/kinit', + user='hdfs', + owner='zeppelin', +@@ -317,10 +317,10 @@ + self.assertResourceCalled('HdfsResource', '/apps/zeppelin/tmp', + hadoop_bin_dir='/usr/hdp/2.5.0.0-1235/hadoop/bin', + source='/tmp', +- default_fs=u'hdfs://c6401.ambari.apache.org:8020', ++ default_fs='hdfs://c6401.ambari.apache.org:8020', + replace_existing_files=True, + hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', +- hdfs_site={u'a': u'b'}, ++ hdfs_site={'a': 'b'}, + kinit_path_local='/usr/bin/kinit', + user='hdfs', + owner='zeppelin', +@@ -328,7 +328,7 @@ + hadoop_conf_dir='/usr/hdp/2.5.0.0-1235/hadoop/conf', + type='file', + action=['create_on_execute'], +- mode=0444, ++ mode=0o444, + keytab=UnknownConfigurationMock(), + principal_name=UnknownConfigurationMock(), + security_enabled=False, +@@ -336,9 +336,9 @@ + ) + self.assertResourceCalled('HdfsResource', None, + hadoop_bin_dir='/usr/hdp/2.5.0.0-1235/hadoop/bin', +- default_fs=u'hdfs://c6401.ambari.apache.org:8020', ++ default_fs='hdfs://c6401.ambari.apache.org:8020', + hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', +- hdfs_site={u'a': u'b'}, ++ hdfs_site={'a': 'b'}, + kinit_path_local='/usr/bin/kinit', + user='hdfs', + action=['execute'], +@@ -356,7 +356,7 @@ + keytab=UnknownConfigurationMock(), + default_fs='hdfs://c6401.ambari.apache.org:8020', + hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', +- hdfs_site={u'a': u'b'}, ++ hdfs_site={'a': 'b'}, + kinit_path_local='/usr/bin/kinit', + principal_name=UnknownConfigurationMock(), + recursive_chown=True, +@@ -373,7 +373,7 @@ + content=interpreter_json_generated.template_after_base, + owner='zeppelin', + group='zeppelin', +- mode=0644 ++ mode=0o644 + ) + + self.assertResourceCalled('HdfsResource', +@@ -383,7 +383,7 @@ + keytab=UnknownConfigurationMock(), + default_fs='hdfs://c6401.ambari.apache.org:8020', + hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', +- hdfs_site={u'a': u'b'}, ++ hdfs_site={'a': 'b'}, + kinit_path_local='/usr/bin/kinit', + principal_name=UnknownConfigurationMock(), + user='hdfs', +@@ -401,7 +401,7 @@ + source='/etc/zeppelin/conf/interpreter.json', + default_fs='hdfs://c6401.ambari.apache.org:8020', + hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', +- hdfs_site={u'a': u'b'}, ++ hdfs_site={'a': 'b'}, + kinit_path_local='/usr/bin/kinit', + principal_name=UnknownConfigurationMock(), + recursive_chown=True, +@@ -419,7 +419,7 @@ + content=interpreter_json_generated.template_after_without_spark_and_livy, + owner='zeppelin', + group='zeppelin', +- mode=0644 ++ mode=0o644 + ) + + self.assertResourceCalled('HdfsResource', +@@ -429,7 +429,7 @@ + keytab=UnknownConfigurationMock(), + default_fs='hdfs://c6401.ambari.apache.org:8020', + hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', +- hdfs_site={u'a': u'b'}, ++ hdfs_site={'a': 'b'}, + kinit_path_local='/usr/bin/kinit', + principal_name=UnknownConfigurationMock(), + user='hdfs', +@@ -448,7 +448,7 @@ + default_fs='hdfs://c6401.ambari.apache.org:8020', + replace_existing_files=True, + hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', +- hdfs_site={u'a': u'b'}, ++ hdfs_site={'a': 'b'}, + kinit_path_local='/usr/bin/kinit', + principal_name=UnknownConfigurationMock(), + recursive_chmod=True, +@@ -465,7 +465,7 @@ + content=interpreter_json_generated.template_after_kerberos, + owner='zeppelin', + group='zeppelin', +- mode=0644 ++ mode=0o644 + ) + + self.assertResourceCalled('HdfsResource', +@@ -475,7 +475,7 @@ + keytab=UnknownConfigurationMock(), + default_fs='hdfs://c6401.ambari.apache.org:8020', + hdfs_resource_ignore_file='/var/lib/ambari-agent/data/.hdfs_resource_ignore', +- hdfs_site={u'a': u'b'}, ++ hdfs_site={'a': 'b'}, + kinit_path_local='/usr/bin/kinit', + principal_name=UnknownConfigurationMock(), + user='hdfs', +@@ -492,7 +492,7 @@ + source = '/etc/zeppelin/conf/interpreter.json', + default_fs = 'hdfs://c6401.ambari.apache.org:8020', + hdfs_resource_ignore_file = '/var/lib/ambari-agent/data/.hdfs_resource_ignore', +- hdfs_site = {u'a': u'b'}, ++ hdfs_site = {'a': 'b'}, + kinit_path_local = '/usr/bin/kinit', + principal_name = UnknownConfigurationMock(), + replace_existing_files = True, +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/__init__.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/__init__.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/__init__.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/__init__.py 2022-07-11 00:52:31.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/test_ambari_configuration.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/test_ambari_configuration.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/test_ambari_configuration.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/test_ambari_configuration.py 2022-07-11 00:52:31.000000000 +0800 +@@ -197,10 +197,10 @@ + + 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): +@@ -219,26 +219,26 @@ + 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)) +@@ -257,26 +257,26 @@ + 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)) +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/test_stack_adviser.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/test_stack_adviser.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/test_stack_adviser.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/test_stack_adviser.py 2022-07-11 00:52:31.000000000 +0800 +@@ -104,7 +104,7 @@ + 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 @@ + 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 @@ + + 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 -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/utils/__init__.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/utils/__init__.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/utils/__init__.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/utils/__init__.py 2022-07-11 00:52:31.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/utils/RMFTestCase.py apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/utils/RMFTestCase.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/stacks/utils/RMFTestCase.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/stacks/utils/RMFTestCase.py 2022-07-11 00:52:31.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +@@ -110,7 +110,7 @@ + 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) +@@ -130,7 +130,7 @@ + script_class_inst.available_packages_in_repos = available_packages_in_repos + Script.repository_util = RepositoryUtil(self.config_dict, set()) + 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 +@@ -258,7 +258,7 @@ + def _get_attr(module, attr): + module_methods = dir(module) + if not attr in module_methods: +- raise RuntimeError("'{0}' has no attribute '{1}'".format(module, attr)) ++ raise RuntimeError("'{}' has no attribute '{}'".format(module, attr)) + method = getattr(module, attr) + return method + +@@ -277,12 +277,12 @@ + return "\n".join((numSpaces * " ") + i for i in s.splitlines()) + + def printResources(self, intendation=4): +- print ++ print() + for resource in RMFTestCase.env.resource_list: +- s = "'{0}', {1},".format( ++ s = "'{}', {},".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 ): +@@ -290,7 +290,7 @@ + elif isinstance( v, UnknownConfiguration): + val = "UnknownConfigurationMock()" + elif hasattr(v, '__call__') and hasattr(v, '__name__'): +- val = "FunctionMock('{0}')".format(v.__name__) ++ val = "FunctionMock('{}')".format(v.__name__) + else: + val = self._ppformat(v) + # If value is multiline, format it +@@ -300,7 +300,7 @@ + nextlines = "\n".join(lines [1:]) + nextlines = self.reindent(nextlines, 2) + val = "\n".join([firstLine, nextlines]) +- param_str="{0} = {1},".format(k, val) ++ param_str="{} = {},".format(k, val) + s+="\n" + self.reindent(param_str, intendation) + # Decide whether we want bracket to be at next line + if has_arguments: +@@ -308,11 +308,11 @@ + else: + before_bracket = "" + # Add assertion +- s = "self.assertResourceCalled({0}{1})".format(s, before_bracket) ++ s = "self.assertResourceCalled({}{})".format(s, before_bracket) + # Intendation + s = self.reindent(s, intendation) +- print s +- print(self.reindent("self.assertNoMoreResources()", intendation)) ++ print(s) ++ print((self.reindent("self.assertNoMoreResources()", intendation))) + + def assertResourceCalledIgnoreEarlier(self, resource_type, name, **kwargs): + """ +@@ -328,9 +328,9 @@ + # 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 +@@ -340,43 +340,43 @@ + 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) ++ raise AssertionError(msg or '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 -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/TestAmbariServer.py apache-ambari-2.7.6-change/ambari-server/src/test/python/TestAmbariServer.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/TestAmbariServer.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/TestAmbariServer.py 2022-07-11 00:52:32.000000000 +0800 +@@ -74,7 +74,7 @@ + from ambari_commons.firewall import Firewall + from ambari_commons.os_check import OSCheck, OSConst + from ambari_commons.os_family_impl import OsFamilyImpl, OsFamilyFuncImpl +- from ambari_commons.exceptions import FatalException, NonFatalException ++ from ambari_commons.exceptions import FatalException as NonFatalException + from ambari_commons.logging_utils import get_verbose, set_verbose, get_silent, set_silent, get_debug_mode, \ + print_info_msg, print_warning_msg, print_error_msg + from ambari_commons.os_utils import run_os_command, search_file, set_file_permissions, remove_file, copy_file, \ +@@ -2723,10 +2723,10 @@ + f = open_mock.return_value + f.readline.return_value = "" # empty file content + run_os_command_mock.return_value = 0, "", "" +- self.assertRaises(NonFatalException, is_server_runing) ++ self.assertRaises(NonFatalException as is_server_runing) + + open_mock.side_effect = IOError('[Errno 13] Permission denied: /var/run/ambari-server/ambari-server.pid') +- self.assertRaises(FatalException, is_server_runing) ++ self.assertRaises(FatalException as is_server_runing) + pass + + +@@ -2923,7 +2923,7 @@ + statMock.return_value = statResult + try: + rcode = download_and_install_jdk(args) +- except Exception, e: ++ except Exception as e: + raise + self.assertEqual(0, rcode) + +@@ -3856,7 +3856,7 @@ + self.assertFalse(remove_file_mock.called) + + self.assertTrue("Ambari-DDL-Postgres-CREATE.sql" in run_os_command_1_mock.call_args[0][0][3]) +- self.assertTrue("-U {0}".format(db_username) in run_os_command_1_mock.call_args[0][0][3]) ++ self.assertTrue("-U {}".format(db_username) in run_os_command_1_mock.call_args[0][0][3]) + + #if DB user name was changed + args = reset_mocks() +@@ -7749,7 +7749,7 @@ + + sync_ldap(options) + +- url = '{0}://{1}:{2!s}{3}'.format('http', '127.0.0.1', '8080', '/api/v1/ldap_sync_events') ++ url = '{}://{}:{!s}{}'.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())) +@@ -7887,7 +7887,7 @@ + + sync_ldap(options) + +- url = '{0}://{1}:{2!s}{3}'.format('https', socket.getfqdn(), '8443', '/api/v1/ldap_sync_events') ++ url = '{}://{}:{!s}{}'.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())) +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/TestBackupRestore.py apache-ambari-2.7.6-change/ambari-server/src/test/python/TestBackupRestore.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/TestBackupRestore.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/TestBackupRestore.py 2022-07-11 00:52:31.000000000 +0800 +@@ -22,8 +22,8 @@ + import os + os.environ["ROOT"] = "" + +-import mock +-from mock.mock import MagicMock, patch ++from unittest import mock ++from unittest.mock import MagicMock, patch + from ambari_server import BackupRestore + + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/TestBootstrap.py apache-ambari-2.7.6-change/ambari-server/src/test/python/TestBootstrap.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/TestBootstrap.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/TestBootstrap.py 2022-07-11 00:52:32.000000000 +0800 +@@ -30,9 +30,9 @@ + 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 +-from mock.mock import create_autospec ++from unittest.mock import MagicMock, call ++from unittest.mock import patch ++from unittest.mock import create_autospec + from only_for_platform import not_for_platform, os_distro_value, PLATFORM_WINDOWS + + @not_for_platform(PLATFORM_WINDOWS) +@@ -50,14 +50,14 @@ + 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{}.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{}.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{}".format(utime2)) + + + # TODO: Test bootstrap timeout +@@ -69,10 +69,10 @@ + "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") +@@ -114,7 +114,7 @@ + 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 +137,19 @@ + 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,21 +186,21 @@ + 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) + +@@ -232,7 +232,7 @@ + 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) +@@ -275,7 +275,7 @@ + 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 +311,7 @@ + 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 +323,7 @@ + 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 +334,7 @@ + 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 +350,7 @@ + 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 +376,7 @@ + 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 +400,12 @@ + 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 +458,7 @@ + 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 +473,7 @@ + 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 +482,7 @@ + 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 +499,7 @@ + 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 +516,7 @@ + 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 +538,7 @@ + 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,9 +598,9 @@ + 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\-'") ++ self.assertEqual(command, "[ \"$EUID\" -eq 0 ] || rpm -qa | grep -e '^sudo\\-'") + + @patch.object(OSCheck, "is_suse_family") + @patch.object(OSCheck, "is_ubuntu_family") +@@ -621,9 +621,9 @@ + 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'") ++ self.assertEqual(command, "[ \"$EUID\" -eq 0 ] || dpkg --get-selections|grep -e '^sudo\\s*install'") + + + @patch.object(SSH, "__init__") +@@ -641,7 +641,7 @@ + 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 +668,7 @@ + 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 +697,7 @@ + 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") + +@@ -724,7 +724,7 @@ + write_mock.reset_mock() + # Exception scenario + def act(): +- raise IOError() ++ raise OSError() + ret = bootstrap_obj.try_to_execute(act) + self.assertEqual(ret["exitstatus"], 177) + self.assertTrue(write_mock.called) +@@ -865,9 +865,9 @@ + + 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 -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/TestClusterBlueprint.py apache-ambari-2.7.6-change/ambari-server/src/test/python/TestClusterBlueprint.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/TestClusterBlueprint.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/TestClusterBlueprint.py 2022-07-11 00:52:31.000000000 +0800 +@@ -16,7 +16,7 @@ + limitations under the License. + ''' + from unittest import TestCase +-from mock.mock import patch, call ++from unittest.mock import patch, call + import json + cluster_blueprint = __import__('cluster_blueprint') + from cluster_blueprint import AmbariBlueprint +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/TestConfigs.py apache-ambari-2.7.6-change/ambari-server/src/test/python/TestConfigs.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/TestConfigs.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/TestConfigs.py 2022-07-11 00:52:31.000000000 +0800 +@@ -16,12 +16,12 @@ + limitations under the License. + ''' + +-import StringIO ++import io + import imp + import os + import sys + import json +-from mock.mock import patch, MagicMock ++from unittest.mock import patch, MagicMock + from unittest import TestCase + + def get_configs(): +@@ -34,7 +34,7 @@ + + class TestConfigs(TestCase): + def setUp(self): +- out = StringIO.StringIO() ++ out = io.StringIO() + sys.stdout = out + + def tearDown(self): +@@ -70,7 +70,7 @@ + } + } + 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'] +@@ -89,7 +89,7 @@ + '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"}) + } + } + } +@@ -110,7 +110,7 @@ + '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"}) + } + } + } +@@ -122,8 +122,8 @@ + @patch('urllib2.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': { +@@ -154,7 +154,7 @@ + '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"}) + } + } + } +@@ -167,8 +167,8 @@ + @patch('urllib2.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': { +@@ -199,7 +199,7 @@ + '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 -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/TestMpacks.py apache-ambari-2.7.6-change/ambari-server/src/test/python/TestMpacks.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/TestMpacks.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/TestMpacks.py 2022-07-11 00:52:32.000000000 +0800 +@@ -20,6 +20,7 @@ + from mock.mock import patch, MagicMock, call + from unittest import TestCase + from ambari_commons.exceptions import FatalException ++import importlib + + os.environ["ROOT"] = "" + +@@ -44,7 +45,7 @@ + _ambari_server_ = __import__('ambari-server') + os_utils.search_file = _search_file + with patch("__builtin__.open"): +- from ambari_commons.exceptions import FatalException, NonFatalException ++ from ambari_commons.exceptions import FatalException as NonFatalException + from ambari_server import serverConfiguration + serverConfiguration.search_file = _search_file + +@@ -56,7 +57,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 +84,7 @@ + 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 +98,7 @@ + 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 +233,7 @@ + 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 +244,7 @@ + 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 +255,7 @@ + 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 {}. Metadata file missing!".format(options.mpack_path), e.reason) + fail = True + self.assertTrue(fail) + +@@ -326,7 +327,7 @@ + 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] +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/TestOSCheck.py apache-ambari-2.7.6-change/ambari-server/src/test/python/TestOSCheck.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/TestOSCheck.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/TestOSCheck.py 2022-07-11 00:52:32.000000000 +0800 +@@ -25,8 +25,8 @@ + import tempfile + import sys + from unittest import TestCase +-from mock.mock import patch +-from mock.mock import MagicMock ++from unittest.mock import patch ++from unittest.mock import MagicMock + + from only_for_platform import os_distro_value, os_distro_value_linux + +@@ -65,7 +65,7 @@ + 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 +74,37 @@ + 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 +114,31 @@ + 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 +147,7 @@ + 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 +156,7 @@ + # 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 +165,7 @@ + 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 +174,12 @@ + # 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 +191,10 @@ + + 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 +202,7 @@ + # 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 +211,7 @@ + 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") +@@ -247,7 +247,7 @@ + #Call tested method + update_ambari_properties() + +- f = open(serverConfiguration.AMBARI_PROPERTIES_FILE, 'r') ++ f = open(serverConfiguration.AMBARI_PROPERTIES_FILE) + try: + ambari_properties_content = f.readlines() + finally: +@@ -262,10 +262,10 @@ + 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 +280,7 @@ + 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 +291,7 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/TestResourceFilesKeeper.py apache-ambari-2.7.6-change/ambari-server/src/test/python/TestResourceFilesKeeper.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/TestResourceFilesKeeper.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/TestResourceFilesKeeper.py 2022-07-11 00:52:32.000000000 +0800 +@@ -29,9 +29,9 @@ + + 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 ++from unittest.mock import MagicMock, call ++from unittest.mock import patch ++from unittest.mock import create_autospec + from only_for_platform import get_platform, not_for_platform, only_for_platform, os_distro_value, PLATFORM_WINDOWS + + from ambari_server.resourceFilesKeeper import ResourceFilesKeeper, KeeperException +@@ -133,7 +133,7 @@ + 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 +147,7 @@ + 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 +156,7 @@ + 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 +168,7 @@ + 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 +177,7 @@ + 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 +268,7 @@ + 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,7 +336,7 @@ + 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: +@@ -346,14 +346,14 @@ + 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 +@@ -366,7 +366,7 @@ + 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 +@@ -386,13 +386,13 @@ + 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: +@@ -402,7 +402,7 @@ + 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 +419,7 @@ + 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 +431,7 @@ + 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 +441,7 @@ + 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 +453,7 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/TestServerClassPath.py apache-ambari-2.7.6-change/ambari-server/src/test/python/TestServerClassPath.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/TestServerClassPath.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/TestServerClassPath.py 2022-07-11 00:52:32.000000000 +0800 +@@ -23,7 +23,7 @@ + import shutil + import tempfile + from ambari_commons.exceptions import FatalException +-from mock.mock import patch, MagicMock ++from unittest.mock import patch, MagicMock + from unittest import TestCase + from ambari_server.properties import Properties + import platform +@@ -55,7 +55,7 @@ + + 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 +73,7 @@ + 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 +90,7 @@ + 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 +106,7 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/TestServerUpgrade.py apache-ambari-2.7.6-change/ambari-server/src/test/python/TestServerUpgrade.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/TestServerUpgrade.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/TestServerUpgrade.py 2022-07-11 00:52:31.000000000 +0800 +@@ -18,11 +18,11 @@ + + 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 unittest.mock import patch, MagicMock + from ambari_commons import os_utils + import platform + +@@ -95,10 +95,10 @@ + + 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._Request__original, 'http://127.0.0.1:8080/api/v1/clusters/cc/stack_versions') ++ self.assertEqual(request.data, '{"ClusterStackVersions": {"state": "CURRENT", "repository_version": "HDP-2.2.2.0-2561", "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') +@@ -149,10 +149,10 @@ + + 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._Request__original, 'http://127.0.0.1:8080/api/v1/clusters/cc/stack_versions') ++ self.assertEqual(request.data, '{"ClusterStackVersions": {"state": "CURRENT", "repository_version": "HDP-2.2.2.0-2561", "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 -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/TestServerUtils.py apache-ambari-2.7.6-change/ambari-server/src/test/python/TestServerUtils.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/TestServerUtils.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/TestServerUtils.py 2022-07-11 00:52:32.000000000 +0800 +@@ -19,7 +19,7 @@ + import os + os.environ["ROOT"] = "" + +-from mock.mock import patch, MagicMock ++from unittest.mock import patch, MagicMock + from unittest import TestCase + import platform + import socket +@@ -50,7 +50,7 @@ + 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 +58,7 @@ + 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 +70,7 @@ + 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://{}:8443/api/v1/'.format(fqdn)) + + + def test_get_ambari_admin_credentials_from_cli_options(self): +@@ -80,8 +80,8 @@ + 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 +97,8 @@ + 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({ +@@ -143,7 +143,7 @@ + self.assertIsNone(context) + + +-class FakeProperties(object): ++class FakeProperties: + def __init__(self, prop_map): + self.prop_map = prop_map + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/TestServiceAdvisor.py apache-ambari-2.7.6-change/ambari-server/src/test/python/TestServiceAdvisor.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/TestServiceAdvisor.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/TestServiceAdvisor.py 2022-07-11 00:52:31.000000000 +0800 +@@ -54,19 +54,19 @@ + 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 -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/TestSetupAgent.py apache-ambari-2.7.6-change/ambari-server/src/test/python/TestSetupAgent.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/TestSetupAgent.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/TestSetupAgent.py 2022-07-11 00:52:31.000000000 +0800 +@@ -16,14 +16,14 @@ + limitations under the License. + ''' + from ambari_commons import subprocess32 +-from mock.mock import MagicMock ++from unittest.mock import MagicMock + from unittest import TestCase +-from mock.mock import patch ++from unittest.mock import patch + import sys + + from ambari_commons import OSCheck + from only_for_platform import get_platform, not_for_platform, only_for_platform, os_distro_value, PLATFORM_WINDOWS +-from mock.mock import MagicMock, patch, ANY, Mock ++from unittest.mock import MagicMock, patch, ANY, Mock + + with patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)): + setup_agent = __import__('setupAgent') +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/TestSetupSso.py apache-ambari-2.7.6-change/ambari-server/src/test/python/TestSetupSso.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/TestSetupSso.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/TestSetupSso.py 2022-07-11 00:52:31.000000000 +0800 +@@ -19,18 +19,18 @@ + import platform + import sys + import unittest +-import StringIO ++import io + +-from mock.mock import patch, MagicMock ++from unittest.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 + + # Mock classes for reading from a file +-class MagicFile(object): ++class MagicFile: + def __init__(self, data): + self.data = data + +@@ -68,7 +68,7 @@ + with patch("glob.glob", return_value = ['/etc/init.d/postgresql-9.3']): + _ambari_server_ = __import__('ambari-server') + with patch("__builtin__.open"): +- from ambari_commons.exceptions import FatalException, NonFatalException ++ from ambari_commons.exceptions import FatalException as NonFatalException + from ambari_server.properties import Properties + from ambari_server.setupSso import setup_sso, AMBARI_SSO_AUTH_ENABLED, \ + SSO_PROVIDER_URL, SSO_CERTIFICATE, JWT_COOKIE_NAME, JWT_AUDIENCES, \ +@@ -77,7 +77,7 @@ + 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 +96,7 @@ + @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 +117,7 @@ + @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 +139,7 @@ + @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 +162,7 @@ + @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 +185,7 @@ + @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) +@@ -233,7 +233,7 @@ + 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' \ +@@ -296,7 +296,7 @@ + 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' \ +@@ -353,7 +353,7 @@ + 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' \ +@@ -432,7 +432,7 @@ + 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' \ +@@ -499,7 +499,7 @@ + get_YN_input_mock, + get_cluster_name_mock, + perform_changes_via_rest_api_mock): +- out = StringIO.StringIO() ++ out = io.StringIO() + sys.stdout = out + + certificate_data = '-----BEGIN CERTIFICATE-----\n' \ +@@ -618,4 +618,3 @@ + options.sso_jwt_cookie_name = None + options.sso_jwt_audience_list = None + return options +- +\ 文件尾没有换行符 +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/TestSetupTrustedProxy.py apache-ambari-2.7.6-change/ambari-server/src/test/python/TestSetupTrustedProxy.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/TestSetupTrustedProxy.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/TestSetupTrustedProxy.py 2022-07-11 00:52:31.000000000 +0800 +@@ -20,18 +20,18 @@ + import platform + import sys + import unittest +-import StringIO ++import io + +-from mock.mock import patch, MagicMock ++from unittest.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 + + # Mock classes for reading from a file +-class MagicFile(object): ++class MagicFile: + def __init__(self, data): + self.data = data + +@@ -69,7 +69,7 @@ + with patch("glob.glob", return_value = ['/etc/init.d/postgresql-9.3']): + _ambari_server_ = __import__('ambari-server') + with patch("__builtin__.open"): +- from ambari_commons.exceptions import FatalException, NonFatalException ++ from ambari_commons.exceptions import FatalException as 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 +77,7 @@ + + @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 +97,7 @@ + @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 +118,7 @@ + @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 +146,7 @@ + @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 +199,7 @@ + @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 +229,7 @@ + @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) +@@ -259,7 +259,7 @@ + @patch("os.path.isfile") + @patch('__builtin__.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 -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/TestStackAdvisor.py apache-ambari-2.7.6-change/ambari-server/src/test/python/TestStackAdvisor.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/TestStackAdvisor.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/TestStackAdvisor.py 2022-07-11 00:52:31.000000000 +0800 +@@ -39,11 +39,11 @@ + 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 @@ + 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 @@ + "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 @@ + } + } + } +- 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"}, +@@ -360,7 +360,7 @@ + } + } + } +- self.assertEquals(actualRecommendLayoutResponse, expectedRecommendLayoutResponse) ++ self.assertEqual(actualRecommendLayoutResponse, expectedRecommendLayoutResponse) + + # Test with maintenance_state. One host is in maintenance mode. + hosts= { +@@ -420,7 +420,7 @@ + "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 @@ + } + } + +- self.assertEquals(actualRecommendLayoutResponse, expectedRecommendLayoutResponse) ++ self.assertEqual(actualRecommendLayoutResponse, expectedRecommendLayoutResponse) + + # Config groups support by default + services["config-groups"] = [{ +@@ -500,7 +500,7 @@ + } + } + } +- self.assertEquals(actualConfigGroupRecommendConfigResponse, expectedConfigGroupRecommendConfigResponse) ++ self.assertEqual(actualConfigGroupRecommendConfigResponse, expectedConfigGroupRecommendConfigResponse) + + services = { + "services": [ +@@ -636,4 +636,4 @@ + {'name': 'mapreduce.map.memory.mb', 'type': 'mapred-site'}, + {'name': 'mapreduce.reduce.memory.mb', 'type': 'mapred-site'}] + +- self.assertEquals(properties_dict, expected_properties_dict) +\ 文件尾没有换行符 ++ self.assertEqual(properties_dict, expected_properties_dict) +\ 文件尾没有换行符 +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/TestStackSelect.py apache-ambari-2.7.6-change/ambari-server/src/test/python/TestStackSelect.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/TestStackSelect.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/TestStackSelect.py 2022-07-11 00:52:31.000000000 +0800 +@@ -18,8 +18,8 @@ + limitations under the License. + ''' + +-from mock.mock import patch +-from mock.mock import MagicMock ++from unittest.mock import patch ++from unittest.mock import MagicMock + + from resource_management.core.logger import Logger + from resource_management.core.exceptions import Fail +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/TestUtils.py apache-ambari-2.7.6-change/ambari-server/src/test/python/TestUtils.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/TestUtils.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/TestUtils.py 2022-07-11 00:52:31.000000000 +0800 +@@ -16,10 +16,10 @@ + limitations under the License. + ''' + +-import StringIO ++import io + import sys + from unittest import TestCase +-from mock.mock import patch, MagicMock ++from unittest.mock import patch, MagicMock + from only_for_platform import not_for_platform, PLATFORM_WINDOWS + + from ambari_commons.os_check import OSCheck, OSConst +@@ -62,13 +62,13 @@ + 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') +@@ -98,14 +98,14 @@ + 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_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('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,9 +147,9 @@ + "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') +@@ -169,7 +169,7 @@ + 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,34 +192,34 @@ + # 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): ++class FakeProperties: + def __init__(self, prop_map): + self.prop_map = prop_map + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/TestValidateConfigs.py apache-ambari-2.7.6-change/ambari-server/src/test/python/TestValidateConfigs.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/TestValidateConfigs.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/TestValidateConfigs.py 2022-07-11 00:52:32.000000000 +0800 +@@ -18,7 +18,7 @@ + import tempfile + + from unittest import TestCase +-from mock.mock import patch ++from unittest.mock import patch + + from only_for_platform import get_platform, not_for_platform, PLATFORM_WINDOWS + +@@ -39,22 +39,22 @@ + "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 @@ + + vc = ValidateConfigs() + +- self.assertEquals(vc.flatten_dict(init_dict, prefix="prefix"), result_list) ++ self.assertEqual(vc.flatten_dict(init_dict, prefix="prefix"), result_list) + + def test_get_value(self): + +@@ -114,7 +114,7 @@ + + 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 -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/TestVersion.py apache-ambari-2.7.6-change/ambari-server/src/test/python/TestVersion.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/TestVersion.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/TestVersion.py 2022-07-11 00:52:32.000000000 +0800 +@@ -59,7 +59,7 @@ + + def test_comparison(self): + # All versions to compare, from 1.0.0.0 to 3.0.0.0, and only include elements that are a multiple of 7. +- versions = range(1000, 3000, 7) ++ versions = list(range(1000, 3000, 7)) + versions = [".".join(list(str(elem))) for elem in versions] + + for idx, x in enumerate(versions): +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/TestVersionSelectUtil.py apache-ambari-2.7.6-change/ambari-server/src/test/python/TestVersionSelectUtil.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/TestVersionSelectUtil.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/TestVersionSelectUtil.py 2022-07-11 00:52:31.000000000 +0800 +@@ -18,7 +18,7 @@ + + from unittest import TestCase + import os +-from mock.mock import patch, MagicMock ++from unittest.mock import patch, MagicMock + + from resource_management.core.logger import Logger + +@@ -44,12 +44,12 @@ + stack_expected_version = "2.2.1.0-2175" + + # Mock classes for reading from a file +- class MagicFile(object): +- allowed_names = set(["hadoop-hdfs-namenode", ++ class MagicFile: ++ allowed_names = {"hadoop-hdfs-namenode", + "hadoop-hdfs-datanode", + "zookeeper-server", + "zookeeper-client" +- ]) ++ } + def read(self, value): + return (value + " - " + stack_expected_version) if value in self.allowed_names else ("ERROR: Invalid package - " + value) + +@@ -62,13 +62,13 @@ + + class MagicFile1(MagicFile): + def read(self): +- return super(MagicFile1, self).read("hadoop-nonexistent-component-name") ++ return super().read("hadoop-nonexistent-component-name") + class MagicFile2(MagicFile): + def read(self): +- return super(MagicFile2, self).read("hadoop-hdfs-namenode") ++ return super().read("hadoop-hdfs-namenode") + class MagicFile3(MagicFile): + def read(self): +- return super(MagicFile3, self).read("hadoop-hdfs-datanode") ++ return super().read("hadoop-hdfs-datanode") + + get_stack_tool_mock.side_effect = [("hdp-select", "/usr/bin/hdp-select", "hdp-select"), + ("hdp-select", "/usr/bin/hdp-select", "hdp-select"), +@@ -80,23 +80,23 @@ + + # 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("resource_management.core.shell.call") +@@ -106,9 +106,9 @@ + stack_expected_version = "2.2.1.0" + + # Mock classes for reading from a file +- class MagicFile(object): +- allowed_names = set(["hive-server2", +- "zookeeper-server"]) ++ class MagicFile: ++ allowed_names = {"hive-server2", ++ "zookeeper-server"} + def read(self, value): + return (value + " - " + stack_expected_version) if value in self.allowed_names else ("ERROR: Invalid package - " + value) + +@@ -121,10 +121,10 @@ + + class MagicFile1(MagicFile): + def read(self): +- return super(MagicFile1, self).read("hive-server2") ++ return super().read("hive-server2") + class MagicFile2(MagicFile): + def read(self): +- return super(MagicFile2, self).read("zookeeper-server") ++ return super().read("zookeeper-server") + + get_stack_tool_mock.side_effect = [("hdp-select", "/usr/bin/hdp-select", "hdp-select"), + ("hdp-select", "/usr/bin/hdp-select", "hdp-select")] +@@ -134,6 +134,6 @@ + + # 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 -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/TestYAMLUtils.py apache-ambari-2.7.6-change/ambari-server/src/test/python/TestYAMLUtils.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/TestYAMLUtils.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/TestYAMLUtils.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 @@ + + 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 -Naur ambari-release-2.7.6-origin/ambari-server/src/test/python/unitTests.py apache-ambari-2.7.6-change/ambari-server/src/test/python/unitTests.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/python/unitTests.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/python/unitTests.py 2022-07-11 00:52:31.000000000 +0800 +@@ -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 @@ + 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 + +@@ -211,7 +211,7 @@ + except: + executor_result.put({'exit_code': 1, + 'tests_run': 0, +- 'errors': [("Failed to load test files {0}".format(str(modules)), traceback.format_exc(), "ERROR")], ++ 'errors': [("Failed to load test files {}".format(str(modules)), traceback.format_exc(), "ERROR")], + 'failures': []}) + executor_result.put(1) + return +@@ -291,7 +291,7 @@ + test_errors = [] + for variant in test_variants: + executor_result = multiprocessing.Queue() +- sys.stderr.write( "Running tests for stack:{0} service:{1}\n" ++ sys.stderr.write( "Running tests for stack:{} service:{}\n" + .format(variant['stack'], variant['service'])) + process = multiprocessing.Process(target=stack_test_executor, + args=(variant['directory'], +@@ -358,14 +358,14 @@ + + for failed_tests in [test_errors,test_failures]: + for err in failed_tests: +- sys.stderr.write("{0}: {1}\n".format(err[2],err[0])) ++ sys.stderr.write("{}: {}\n".format(err[2],err[0])) + sys.stderr.write("----------------------------------------------------------------------\n") +- sys.stderr.write("{0}\n".format(err[1])) ++ sys.stderr.write("{}\n".format(err[1])) + + sys.stderr.write("----------------------------------------------------------------------\n") +- sys.stderr.write("Total run:{0}\n".format(test_runs)) +- sys.stderr.write("Total errors:{0}\n".format(len(test_errors))) +- sys.stderr.write("Total failures:{0}\n".format(len(test_failures))) ++ sys.stderr.write("Total run:{}\n".format(test_runs)) ++ sys.stderr.write("Total errors:{}\n".format(len(test_errors))) ++ sys.stderr.write("Total failures:{}\n".format(len(test_failures))) + + try: + shutil.rmtree(newtmpdirpath) +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hcat_client.py apache-ambari-2.7.6-change/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hcat_client.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hcat_client.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hcat_client.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 .hcat import hcat + + class HCatClient(Script): + def install(self, env): +@@ -28,7 +28,7 @@ + self.configure(env) + + def configure(self, env): +- import params ++ from . import params + + env.set_params(params) + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hcat.py apache-ambari-2.7.6-change/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hcat.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hcat.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hcat.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 . import params + + Directory(params.hcat_conf_dir, + owner=params.hcat_user, +@@ -39,7 +39,7 @@ + + + def hcat_TemplateConfig(name): +- import params ++ from . import params + + TemplateConfig(format("{hcat_conf_dir}/{name}"), + owner=params.hcat_user, +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hcat_service_check.py apache-ambari-2.7.6-change/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hcat_service_check.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hcat_service_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hcat_service_check.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 . import params + + unique = get_unique_id_and_date() + output_file = format("/apps/hive/warehouse/hcatsmoke{unique}") +@@ -35,7 +35,7 @@ + + 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 -Naur ambari-release-2.7.6-origin/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive_client.py apache-ambari-2.7.6-change/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive_client.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive_client.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive_client.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 .hive import hive + + class HiveClient(Script): + def install(self, env): +@@ -28,7 +28,7 @@ + self.configure(env) + + def configure(self, env): +- import params ++ from . import params + env.set_params(params) + + hive(name='client') +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive_metastore.py apache-ambari-2.7.6-change/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive_metastore.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive_metastore.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive_metastore.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 .hive import hive ++from .hive_service import hive_service + + class HiveMetastore(Script): + +@@ -31,13 +31,13 @@ + self.configure(env) + + def configure(self, env): +- import params ++ from . import params + env.set_params(params) + + hive(name='metastore') + + def start(self, env): +- import params ++ from . import params + env.set_params(params) + self.configure(env) # FOR SECURITY + hive_service( 'metastore', +@@ -45,7 +45,7 @@ + ) + + def stop(self, env): +- import params ++ from . import params + env.set_params(params) + + hive_service( 'metastore', +@@ -53,7 +53,7 @@ + ) + + def status(self, env): +- import status_params ++ from . 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 -Naur ambari-release-2.7.6-origin/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive.py apache-ambari-2.7.6-change/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 . 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 @@ + + 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 crt_directory(name): +- import params ++ from . 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 . import params + + File(name, + owner=params.hive_user, +@@ -103,7 +103,7 @@ + + + def jdbc_connector(): +- import params ++ from . 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 -Naur ambari-release-2.7.6-origin/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive_server.py apache-ambari-2.7.6-change/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive_server.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive_server.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive_server.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 .hive import hive ++from .hive_service import hive_service + + class HiveServer(Script): + +@@ -30,13 +30,13 @@ + self.install_packages(env) + self.configure(env) + def configure(self, env): +- import params ++ from . import params + env.set_params(params) + + hive(name='hiveserver2') + + def start(self, env): +- import params ++ from . import params + env.set_params(params) + self.configure(env) # FOR SECURITY + hive_service( 'hiveserver2', +@@ -44,7 +44,7 @@ + ) + + def stop(self, env): +- import params ++ from . import params + env.set_params(params) + + hive_service( 'hiveserver2', +@@ -53,7 +53,7 @@ + + + def status(self, env): +- import status_params ++ from . import status_params + env.set_params(status_params) + pid_file = format("{hive_pid_dir}/{hive_pid}") + # Recursively check all existing gmetad pid files +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive_service.py apache-ambari-2.7.6-change/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive_service.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive_service.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive_service.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + name, + action='start'): + +- import params ++ from . import params + + if name == 'metastore': + pid_file = format("{hive_pid_dir}/{hive_metastore_pid}") +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/__init__.py apache-ambari-2.7.6-change/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/__init__.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/__init__.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/__init__.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/mysql_server.py apache-ambari-2.7.6-change/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/mysql_server.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/mysql_server.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/mysql_server.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 .mysql_service import mysql_service + + class MysqlServer(Script): + +@@ -35,13 +35,13 @@ + self.configure(env) + + def configure(self, env): +- import params ++ from . 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 @@ + mysql_service(daemon_name=self.daemon_name, action='stop') + + def start(self, env): +- import params ++ from . import params + env.set_params(params) + + mysql_service(daemon_name=self.daemon_name, action = 'start') + + def stop(self, env): +- import params ++ from . import params + env.set_params(params) + + mysql_service(daemon_name=self.daemon_name, action = 'stop') +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/mysql_service.py apache-ambari-2.7.6-change/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/mysql_service.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/mysql_service.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/mysql_service.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/params.py apache-ambari-2.7.6-change/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/params.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/params.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 . import status_params + + # server configurations + config = Script.get_config() +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/service_check.py apache-ambari-2.7.6-change/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/service_check.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/service_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/service_check.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 .hcat_service_check import hcat_service_check + + class HiveServiceCheck(Script): + def service_check(self, env): +- import params ++ from . 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 @@ + + File(params.smoke_test_path, + content=StaticFile('hiveserver2Smoke.sh'), +- mode=0755 ++ mode=0o755 + ) + + File(params.smoke_test_sql, +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/status_params.py apache-ambari-2.7.6-change/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/status_params.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/status_params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/status_params.py 2022-07-11 00:52:30.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/test/resources/stacks/old_stack_advisor.py apache-ambari-2.7.6-change/ambari-server/src/test/resources/stacks/old_stack_advisor.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/resources/stacks/old_stack_advisor.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/resources/stacks/old_stack_advisor.py 2022-07-11 00:52:30.000000000 +0800 +@@ -19,7 +19,7 @@ + + import socket + +-class StackAdvisor(object): ++class StackAdvisor: + """ + Abstract class implemented by all stack advisors. Stack advisors advise on stack specific questions. + +@@ -408,9 +408,9 @@ + host_groups = recommendations["blueprint"]["host_groups"] + bindings = recommendations["blueprint_cluster_binding"]["host_groups"] + index = 0 +- for key in hostsComponentsMap.keys(): ++ for key in list(hostsComponentsMap.keys()): + index += 1 +- host_group_name = "host-group-{0}".format(index) ++ host_group_name = "host-group-{}".format(index) + host_groups.append( { "name": host_group_name, "components": hostsComponentsMap[key] } ) + bindings.append( { "name": host_group_name, "hosts": [{ "fqdn": socket.getfqdn(key) }] } ) + +@@ -538,8 +538,8 @@ + if len(hostsList) != 1: + scheme = self.getComponentLayoutScheme(componentName) + if scheme is not None: +- for key in scheme.keys(): +- if isinstance(key, ( int, long )): ++ for key in list(scheme.keys()): ++ if isinstance(key, int): + if len(hostsList) < key: + return hostsList[scheme[key]] + return hostsList[scheme['else']] +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/hcat_client.py apache-ambari-2.7.6-change/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/hcat_client.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/hcat_client.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/hcat_client.py 2022-07-11 00:52:31.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 .hcat import hcat + + class HCatClient(Script): + def install(self, env): +@@ -28,7 +28,7 @@ + self.configure(env) + + def configure(self, env): +- import params ++ from . import params + + env.set_params(params) + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/hcat.py apache-ambari-2.7.6-change/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/hcat.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/hcat.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/hcat.py 2022-07-11 00:52:31.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 . import params + + Directory(params.hcat_conf_dir, + owner=params.hcat_user, +@@ -39,7 +39,7 @@ + + + def hcat_TemplateConfig(name): +- import params ++ from . import params + + TemplateConfig(format("{hcat_conf_dir}/{name}"), + owner=params.hcat_user, +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/hcat_service_check.py apache-ambari-2.7.6-change/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/hcat_service_check.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/hcat_service_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/hcat_service_check.py 2022-07-11 00:52:31.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 . import params + + unique = get_unique_id_and_date() + output_file = format("/apps/hive/warehouse/hcatsmoke{unique}") +@@ -35,7 +35,7 @@ + + 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 -Naur ambari-release-2.7.6-origin/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/hive_client.py apache-ambari-2.7.6-change/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/hive_client.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/hive_client.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/hive_client.py 2022-07-11 00:52:31.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 .hive import hive + + class HiveClient(Script): + def install(self, env): +@@ -28,7 +28,7 @@ + self.configure(env) + + def configure(self, env): +- import params ++ from . import params + env.set_params(params) + + hive(name='client') +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/hive_metastore.py apache-ambari-2.7.6-change/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/hive_metastore.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/hive_metastore.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/hive_metastore.py 2022-07-11 00:52:31.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 .hive import hive ++from .hive_service import hive_service + + class HiveMetastore(Script): + +@@ -31,13 +31,13 @@ + self.configure(env) + + def configure(self, env): +- import params ++ from . import params + env.set_params(params) + + hive(name='metastore') + + def start(self, env): +- import params ++ from . import params + env.set_params(params) + self.configure(env) # FOR SECURITY + hive_service( 'metastore', +@@ -45,7 +45,7 @@ + ) + + def stop(self, env): +- import params ++ from . import params + env.set_params(params) + + hive_service( 'metastore', +@@ -53,7 +53,7 @@ + ) + + def status(self, env): +- import status_params ++ from . 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 -Naur ambari-release-2.7.6-origin/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/hive.py apache-ambari-2.7.6-change/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/hive.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/hive.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/hive.py 2022-07-11 00:52:31.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 . 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 @@ + + 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 crt_directory(name): +- import params ++ from . 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 . import params + + File(name, + owner=params.hive_user, +@@ -103,7 +103,7 @@ + + + def jdbc_connector(): +- import params ++ from . 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 -Naur ambari-release-2.7.6-origin/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/hive_server.py apache-ambari-2.7.6-change/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/hive_server.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/hive_server.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/hive_server.py 2022-07-11 00:52:31.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 .hive import hive ++from .hive_service import hive_service + + class HiveServer(Script): + +@@ -30,13 +30,13 @@ + self.install_packages(env) + self.configure(env) + def configure(self, env): +- import params ++ from . import params + env.set_params(params) + + hive(name='hiveserver2') + + def start(self, env): +- import params ++ from . import params + env.set_params(params) + self.configure(env) # FOR SECURITY + hive_service( 'hiveserver2', +@@ -44,7 +44,7 @@ + ) + + def stop(self, env): +- import params ++ from . import params + env.set_params(params) + + hive_service( 'hiveserver2', +@@ -53,7 +53,7 @@ + + + def status(self, env): +- import status_params ++ from . import status_params + env.set_params(status_params) + pid_file = format("{hive_pid_dir}/{hive_pid}") + # Recursively check all existing gmetad pid files +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/hive_service.py apache-ambari-2.7.6-change/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/hive_service.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/hive_service.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/hive_service.py 2022-07-11 00:52:31.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + name, + action='start'): + +- import params ++ from . import params + + if name == 'metastore': + pid_file = format("{hive_pid_dir}/{hive_metastore_pid}") +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/__init__.py apache-ambari-2.7.6-change/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/__init__.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/__init__.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/__init__.py 2022-07-11 00:52:31.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/mysql_server.py apache-ambari-2.7.6-change/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/mysql_server.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/mysql_server.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/mysql_server.py 2022-07-11 00:52:31.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 .mysql_service import mysql_service + + class MysqlServer(Script): + +@@ -35,13 +35,13 @@ + self.configure(env) + + def configure(self, env): +- import params ++ from . 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 @@ + mysql_service(daemon_name=self.daemon_name, action='stop') + + def start(self, env): +- import params ++ from . import params + env.set_params(params) + + mysql_service(daemon_name=self.daemon_name, action = 'start') + + def stop(self, env): +- import params ++ from . import params + env.set_params(params) + + mysql_service(daemon_name=self.daemon_name, action = 'stop') +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/mysql_service.py apache-ambari-2.7.6-change/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/mysql_service.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/mysql_service.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/mysql_service.py 2022-07-11 00:52:31.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/params.py apache-ambari-2.7.6-change/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/params.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/params.py 2022-07-11 00:52:31.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 . import status_params + + # server configurations + config = Script.get_config() +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/service_check.py apache-ambari-2.7.6-change/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/service_check.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/service_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/service_check.py 2022-07-11 00:52:31.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 .hcat_service_check import hcat_service_check + + class HiveServiceCheck(Script): + def service_check(self, env): +- import params ++ from . 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 @@ + + File(params.smoke_test_path, + content=StaticFile('hiveserver2Smoke.sh'), +- mode=0755 ++ mode=0o755 + ) + + File(params.smoke_test_sql, +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/status_params.py apache-ambari-2.7.6-change/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/status_params.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/status_params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_common_services/HIVE/0.11.0.2.0.5.0/package/scripts/status_params.py 2022-07-11 00:52:31.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_extension/HIVE/package/scripts/status_params.py apache-ambari-2.7.6-change/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_extension/HIVE/package/scripts/status_params.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_extension/HIVE/package/scripts/status_params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_extension/HIVE/package/scripts/status_params.py 2022-07-11 00:52:31.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/hcat_client.py apache-ambari-2.7.6-change/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/hcat_client.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/hcat_client.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/hcat_client.py 2022-07-11 00:52:31.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 .hcat import hcat + + class HCatClient(Script): + def install(self, env): +@@ -28,7 +28,7 @@ + self.configure(env) + + def configure(self, env): +- import params ++ from . import params + + env.set_params(params) + +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/hcat.py apache-ambari-2.7.6-change/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/hcat.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/hcat.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/hcat.py 2022-07-11 00:52:31.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 . import params + + Directory(params.hcat_conf_dir, + owner=params.hcat_user, +@@ -39,7 +39,7 @@ + + + def hcat_TemplateConfig(name): +- import params ++ from . import params + + TemplateConfig(format("{hcat_conf_dir}/{name}"), + owner=params.hcat_user, +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/hcat_service_check.py apache-ambari-2.7.6-change/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/hcat_service_check.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/hcat_service_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/hcat_service_check.py 2022-07-11 00:52:31.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 . import params + + unique = get_unique_id_and_date() + output_file = format("/apps/hive/warehouse/hcatsmoke{unique}") +@@ -35,7 +35,7 @@ + + 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 -Naur ambari-release-2.7.6-origin/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/hive_client.py apache-ambari-2.7.6-change/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/hive_client.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/hive_client.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/hive_client.py 2022-07-11 00:52:31.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 .hive import hive + + class HiveClient(Script): + def install(self, env): +@@ -28,7 +28,7 @@ + self.configure(env) + + def configure(self, env): +- import params ++ from . import params + env.set_params(params) + + hive(name='client') +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/hive_metastore.py apache-ambari-2.7.6-change/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/hive_metastore.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/hive_metastore.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/hive_metastore.py 2022-07-11 00:52:31.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 .hive import hive ++from .hive_service import hive_service + + class HiveMetastore(Script): + +@@ -31,13 +31,13 @@ + self.configure(env) + + def configure(self, env): +- import params ++ from . import params + env.set_params(params) + + hive(name='metastore') + + def start(self, env): +- import params ++ from . import params + env.set_params(params) + self.configure(env) # FOR SECURITY + hive_service( 'metastore', +@@ -45,7 +45,7 @@ + ) + + def stop(self, env): +- import params ++ from . import params + env.set_params(params) + + hive_service( 'metastore', +@@ -53,7 +53,7 @@ + ) + + def status(self, env): +- import status_params ++ from . 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 -Naur ambari-release-2.7.6-origin/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/hive.py apache-ambari-2.7.6-change/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/hive.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/hive.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/hive.py 2022-07-11 00:52:31.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 . 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 @@ + + 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 crt_directory(name): +- import params ++ from . 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 . import params + + File(name, + owner=params.hive_user, +@@ -103,7 +103,7 @@ + + + def jdbc_connector(): +- import params ++ from . 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 -Naur ambari-release-2.7.6-origin/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/hive_server.py apache-ambari-2.7.6-change/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/hive_server.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/hive_server.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/hive_server.py 2022-07-11 00:52:31.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 .hive import hive ++from .hive_service import hive_service + + class HiveServer(Script): + +@@ -30,13 +30,13 @@ + self.install_packages(env) + self.configure(env) + def configure(self, env): +- import params ++ from . import params + env.set_params(params) + + hive(name='hiveserver2') + + def start(self, env): +- import params ++ from . import params + env.set_params(params) + self.configure(env) # FOR SECURITY + hive_service( 'hiveserver2', +@@ -44,7 +44,7 @@ + ) + + def stop(self, env): +- import params ++ from . import params + env.set_params(params) + + hive_service( 'hiveserver2', +@@ -53,7 +53,7 @@ + + + def status(self, env): +- import status_params ++ from . import status_params + env.set_params(status_params) + pid_file = format("{hive_pid_dir}/{hive_pid}") + # Recursively check all existing gmetad pid files +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/hive_service.py apache-ambari-2.7.6-change/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/hive_service.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/hive_service.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/hive_service.py 2022-07-11 00:52:31.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + name, + action='start'): + +- import params ++ from . import params + + if name == 'metastore': + pid_file = format("{hive_pid_dir}/{hive_metastore_pid}") +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/__init__.py apache-ambari-2.7.6-change/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/__init__.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/__init__.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/__init__.py 2022-07-11 00:52:31.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/mysql_server.py apache-ambari-2.7.6-change/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/mysql_server.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/mysql_server.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/mysql_server.py 2022-07-11 00:52:31.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 .mysql_service import mysql_service + + class MysqlServer(Script): + +@@ -35,13 +35,13 @@ + self.configure(env) + + def configure(self, env): +- import params ++ from . 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 @@ + mysql_service(daemon_name=self.daemon_name, action='stop') + + def start(self, env): +- import params ++ from . import params + env.set_params(params) + + mysql_service(daemon_name=self.daemon_name, action = 'start') + + def stop(self, env): +- import params ++ from . import params + env.set_params(params) + + mysql_service(daemon_name=self.daemon_name, action = 'stop') +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/mysql_service.py apache-ambari-2.7.6-change/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/mysql_service.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/mysql_service.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/mysql_service.py 2022-07-11 00:52:31.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/params.py apache-ambari-2.7.6-change/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/params.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/params.py 2022-07-11 00:52:31.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 . import status_params + + # server configurations + config = Script.get_config() +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/service_check.py apache-ambari-2.7.6-change/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/service_check.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/service_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/service_check.py 2022-07-11 00:52:31.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 .hcat_service_check import hcat_service_check + + class HiveServiceCheck(Script): + def service_check(self, env): +- import params ++ from . 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 @@ + + File(params.smoke_test_path, + content=StaticFile('hiveserver2Smoke.sh'), +- mode=0755 ++ mode=0o755 + ) + + File(params.smoke_test_sql, +diff -Naur ambari-release-2.7.6-origin/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/status_params.py apache-ambari-2.7.6-change/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/status_params.py +--- ambari-release-2.7.6-origin/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/status_params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-server/src/test/resources/TestAmbaryServer.samples/dummy_stack/HIVE/package/scripts/status_params.py 2022-07-11 00:52:31.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/ambari-web/package.json apache-ambari-2.7.6-change/ambari-web/package.json +--- ambari-release-2.7.6-origin/ambari-web/package.json 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-web/package.json 2022-07-14 16:10:01.000000000 +0800 +@@ -27,7 +27,6 @@ + "chai": "~3.5.0", + "express": "2.5.8", + "karma": ">=0.11.14", +- "karma-phantomjs-launcher": "1.0.2", + "karma-babel-preprocessor": "^6.0.1", + "karma-chai": "~0.1.0", + "karma-commonjs-require": "~0.0.3", +diff -Naur ambari-release-2.7.6-origin/ambari-web/pom.xml apache-ambari-2.7.6-change/ambari-web/pom.xml +--- ambari-release-2.7.6-origin/ambari-web/pom.xml 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-web/pom.xml 2022-07-13 21:18:03.000000000 +0800 +@@ -111,13 +111,43 @@ + + + ++ yarn config ++ generate-sources ++ ++ yarn ++ ++ ++ config set registry https://repo.huaweicloud.com/repository/npm/ ++ ++ ++ ++ yarn config url ++ generate-sources ++ ++ yarn ++ ++ ++ config set disturl https://repo.huaweicloud.com/nodejs/ ++ ++ ++ ++ yarn config mirror ++ generate-sources ++ ++ yarn ++ ++ ++ config set electron_mirror https://repo.huaweicloud.com/electron/ ++ ++ ++ + yarn install + generate-sources + + yarn + + +- install --ignore-engines --pure-lockfile ++ install --ignore-engines --unsafe-perm --pure-lockfile --registry=https://repo.huaweicloud.com/repository/npm/ + + + +diff -Naur ambari-release-2.7.6-origin/ambari-web/yarn.lock apache-ambari-2.7.6-change/ambari-web/yarn.lock +--- ambari-release-2.7.6-origin/ambari-web/yarn.lock 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/ambari-web/yarn.lock 2022-07-09 21:42:57.000000000 +0800 +@@ -4,43 +4,43 @@ + + abab@^1.0.3: + version "1.0.3" +- resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.3.tgz#b81de5f7274ec4e756d797cd834f303642724e5d" ++ resolved "https://repo.huaweicloud.com/repository/npm//abab/-/abab-1.0.3.tgz#b81de5f7274ec4e756d797cd834f303642724e5d" + + abbrev@1, abbrev@1.0.x: + version "1.0.9" +- resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" ++ resolved "https://repo.huaweicloud.com/repository/npm//abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" + + accepts@1.3.3: + version "1.3.3" +- resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.3.tgz#c3ca7434938648c3e0d9c1e328dd68b622c284ca" ++ resolved "https://repo.huaweicloud.com/repository/npm//accepts/-/accepts-1.3.3.tgz#c3ca7434938648c3e0d9c1e328dd68b622c284ca" + dependencies: + mime-types "~2.1.11" + negotiator "0.6.1" + + acorn-globals@^3.1.0: + version "3.1.0" +- resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-3.1.0.tgz#fd8270f71fbb4996b004fa880ee5d46573a731bf" ++ resolved "https://repo.huaweicloud.com/repository/npm//acorn-globals/-/acorn-globals-3.1.0.tgz#fd8270f71fbb4996b004fa880ee5d46573a731bf" + dependencies: + acorn "^4.0.4" + + acorn@^4.0.4: + version "4.0.11" +- resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.11.tgz#edcda3bd937e7556410d42ed5860f67399c794c0" ++ resolved "https://repo.huaweicloud.com/repository/npm//acorn/-/acorn-4.0.11.tgz#edcda3bd937e7556410d42ed5860f67399c794c0" + + after@0.8.2: + version "0.8.2" +- resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f" ++ resolved "https://repo.huaweicloud.com/repository/npm//after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f" + + ajv@^4.9.1: + version "4.11.7" +- resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.7.tgz#8655a5d86d0824985cc471a1d913fb6729a0ec48" ++ resolved "https://repo.huaweicloud.com/repository/npm//ajv/-/ajv-4.11.7.tgz#8655a5d86d0824985cc471a1d913fb6729a0ec48" + dependencies: + co "^4.6.0" + json-stable-stringify "^1.0.1" + + align-text@^0.1.1, align-text@^0.1.3: + version "0.1.4" +- resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" ++ resolved "https://repo.huaweicloud.com/repository/npm//align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" + dependencies: + kind-of "^3.0.2" + longest "^1.0.1" +@@ -48,144 +48,144 @@ + + amdefine@>=0.0.4: + version "1.0.1" +- resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" ++ resolved "https://repo.huaweicloud.com/repository/npm//amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + + ansi-color@~0.2.1: + version "0.2.1" +- resolved "https://registry.yarnpkg.com/ansi-color/-/ansi-color-0.2.1.tgz#3e75c037475217544ed763a8db5709fa9ae5bf9a" ++ resolved "https://repo.huaweicloud.com/repository/npm//ansi-color/-/ansi-color-0.2.1.tgz#3e75c037475217544ed763a8db5709fa9ae5bf9a" + + ansi-regex@^2.0.0: + version "2.1.1" +- resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" ++ resolved "https://repo.huaweicloud.com/repository/npm//ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + + ansi-styles@^2.2.1: + version "2.2.1" +- resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" ++ resolved "https://repo.huaweicloud.com/repository/npm//ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + + anymatch@^1.0.0, anymatch@~1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.0.0.tgz#0aed64d30bc25973afdb3155eb87ae6881e21b1c" ++ resolved "https://repo.huaweicloud.com/repository/npm//anymatch/-/anymatch-1.0.0.tgz#0aed64d30bc25973afdb3155eb87ae6881e21b1c" + dependencies: + minimatch "~1.0.0" + + anymatch@^1.3.0, anymatch@~1.3.0: + version "1.3.0" +- resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.0.tgz#a3e52fa39168c825ff57b0248126ce5a8ff95507" ++ resolved "https://repo.huaweicloud.com/repository/npm//anymatch/-/anymatch-1.3.0.tgz#a3e52fa39168c825ff57b0248126ce5a8ff95507" + dependencies: + arrify "^1.0.0" + micromatch "^2.1.5" + + anysort@~1.0.0: + version "1.0.1" +- resolved "https://registry.yarnpkg.com/anysort/-/anysort-1.0.1.tgz#341bd5d5ba1485f64e55ae865f1d45994b507fc4" ++ resolved "https://repo.huaweicloud.com/repository/npm//anysort/-/anysort-1.0.1.tgz#341bd5d5ba1485f64e55ae865f1d45994b507fc4" + dependencies: + anymatch "~1.3.0" + + aproba@^1.0.3: + version "1.1.1" +- resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.1.1.tgz#95d3600f07710aa0e9298c726ad5ecf2eacbabab" ++ resolved "https://repo.huaweicloud.com/repository/npm//aproba/-/aproba-1.1.1.tgz#95d3600f07710aa0e9298c726ad5ecf2eacbabab" + + are-we-there-yet@~1.1.2: + version "1.1.2" +- resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.2.tgz#80e470e95a084794fe1899262c5667c6e88de1b3" ++ resolved "https://repo.huaweicloud.com/repository/npm//are-we-there-yet/-/are-we-there-yet-1.1.2.tgz#80e470e95a084794fe1899262c5667c6e88de1b3" + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.0 || ^1.1.13" + + argparse@^1.0.7: + version "1.0.9" +- resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" ++ resolved "https://repo.huaweicloud.com/repository/npm//argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" + dependencies: + sprintf-js "~1.0.2" + + arr-diff@^2.0.0: + version "2.0.0" +- resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" ++ resolved "https://repo.huaweicloud.com/repository/npm//arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" + dependencies: + arr-flatten "^1.0.1" + + arr-flatten@^1.0.1: + version "1.0.3" +- resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.0.3.tgz#a274ed85ac08849b6bd7847c4580745dc51adfb1" ++ resolved "https://repo.huaweicloud.com/repository/npm//arr-flatten/-/arr-flatten-1.0.3.tgz#a274ed85ac08849b6bd7847c4580745dc51adfb1" + + array-equal@^1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" ++ resolved "https://repo.huaweicloud.com/repository/npm//array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" + + array-find-index@^1.0.1: + version "1.0.2" +- resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" ++ resolved "https://repo.huaweicloud.com/repository/npm//array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" + + array-slice@^0.2.3: + version "0.2.3" +- resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-0.2.3.tgz#dd3cfb80ed7973a75117cdac69b0b99ec86186f5" ++ resolved "https://repo.huaweicloud.com/repository/npm//array-slice/-/array-slice-0.2.3.tgz#dd3cfb80ed7973a75117cdac69b0b99ec86186f5" + + array-unique@^0.2.1: + version "0.2.1" +- resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" ++ resolved "https://repo.huaweicloud.com/repository/npm//array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" + + arraybuffer.slice@0.0.6: + version "0.0.6" +- resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz#f33b2159f0532a3f3107a272c0ccfbd1ad2979ca" ++ resolved "https://repo.huaweicloud.com/repository/npm//arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz#f33b2159f0532a3f3107a272c0ccfbd1ad2979ca" + + arrify@^1.0.0: + version "1.0.1" +- resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" ++ resolved "https://repo.huaweicloud.com/repository/npm//arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + + asn1@~0.2.3: + version "0.2.3" +- resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" ++ resolved "https://repo.huaweicloud.com/repository/npm//asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" + + assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" ++ resolved "https://repo.huaweicloud.com/repository/npm//assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + + assert-plus@^0.2.0: + version "0.2.0" +- resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" ++ resolved "https://repo.huaweicloud.com/repository/npm//assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" + + assertion-error@^1.0.1: + version "1.0.2" +- resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.0.2.tgz#13ca515d86206da0bac66e834dd397d87581094c" ++ resolved "https://repo.huaweicloud.com/repository/npm//assertion-error/-/assertion-error-1.0.2.tgz#13ca515d86206da0bac66e834dd397d87581094c" + + assetsmanager-brunch@~1.8.1: + version "1.8.1" +- resolved "https://registry.yarnpkg.com/assetsmanager-brunch/-/assetsmanager-brunch-1.8.1.tgz#e2fcff9c1b5fb5f5feb3fcbd0d762a08ad91072d" ++ resolved "https://repo.huaweicloud.com/repository/npm//assetsmanager-brunch/-/assetsmanager-brunch-1.8.1.tgz#e2fcff9c1b5fb5f5feb3fcbd0d762a08ad91072d" + dependencies: + fs-extra "~0.6.3" + glob "~3.2.3" + + async-each@^1.0.0: + version "1.0.1" +- resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" ++ resolved "https://repo.huaweicloud.com/repository/npm//async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" + + async-each@~0.1.2, async-each@~0.1.3, async-each@~0.1.5: + version "0.1.6" +- resolved "https://registry.yarnpkg.com/async-each/-/async-each-0.1.6.tgz#b67e99edcddf96541e44af56290cd7d5c6e70439" ++ resolved "https://repo.huaweicloud.com/repository/npm//async-each/-/async-each-0.1.6.tgz#b67e99edcddf96541e44af56290cd7d5c6e70439" + + async-waterfall@~0.1.2: + version "0.1.5" +- resolved "https://registry.yarnpkg.com/async-waterfall/-/async-waterfall-0.1.5.tgz#398bd48b0eac5d40ffbe400fe9e37a53ba966dae" ++ resolved "https://repo.huaweicloud.com/repository/npm//async-waterfall/-/async-waterfall-0.1.5.tgz#398bd48b0eac5d40ffbe400fe9e37a53ba966dae" + + async@1.x, async@^1.4.0: + version "1.5.2" +- resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" ++ resolved "https://repo.huaweicloud.com/repository/npm//async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" + + asynckit@^0.4.0: + version "0.4.0" +- resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" ++ resolved "https://repo.huaweicloud.com/repository/npm//asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + + aws-sign2@~0.6.0: + version "0.6.0" +- resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" ++ resolved "https://repo.huaweicloud.com/repository/npm//aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" + + aws4@^1.2.1: + version "1.6.0" +- resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" ++ resolved "https://repo.huaweicloud.com/repository/npm//aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" + + babel-brunch@6.0.0: + version "6.0.0" +- resolved "https://registry.yarnpkg.com/babel-brunch/-/babel-brunch-6.0.0.tgz#5f4f4a577c6a4ac46733b9daf3a71f872a6c493b" ++ resolved "https://repo.huaweicloud.com/repository/npm//babel-brunch/-/babel-brunch-6.0.0.tgz#5f4f4a577c6a4ac46733b9daf3a71f872a6c493b" + dependencies: + anymatch "^1.0.0" + babel-core "^6.0.0" +@@ -193,7 +193,7 @@ + + babel-code-frame@^6.22.0: + version "6.22.0" +- resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.22.0.tgz#027620bee567a88c32561574e7fd0801d33118e4" ++ resolved "https://repo.huaweicloud.com/repository/npm//babel-code-frame/-/babel-code-frame-6.22.0.tgz#027620bee567a88c32561574e7fd0801d33118e4" + dependencies: + chalk "^1.1.0" + esutils "^2.0.2" +@@ -201,7 +201,7 @@ + + babel-core@^6.0.0, babel-core@^6.24.1: + version "6.24.1" +- resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.24.1.tgz#8c428564dce1e1f41fb337ec34f4c3b022b5ad83" ++ resolved "https://repo.huaweicloud.com/repository/npm//babel-core/-/babel-core-6.24.1.tgz#8c428564dce1e1f41fb337ec34f4c3b022b5ad83" + dependencies: + babel-code-frame "^6.22.0" + babel-generator "^6.24.1" +@@ -225,7 +225,7 @@ + + babel-generator@^6.24.1: + version "6.24.1" +- resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.24.1.tgz#e715f486c58ded25649d888944d52aa07c5d9497" ++ resolved "https://repo.huaweicloud.com/repository/npm//babel-generator/-/babel-generator-6.24.1.tgz#e715f486c58ded25649d888944d52aa07c5d9497" + dependencies: + babel-messages "^6.23.0" + babel-runtime "^6.22.0" +@@ -238,7 +238,7 @@ + + babel-helper-call-delegate@^6.24.1: + version "6.24.1" +- resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" ++ resolved "https://repo.huaweicloud.com/repository/npm//babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" + dependencies: + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" +@@ -247,7 +247,7 @@ + + babel-helper-define-map@^6.24.1: + version "6.24.1" +- resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.24.1.tgz#7a9747f258d8947d32d515f6aa1c7bd02204a080" ++ resolved "https://repo.huaweicloud.com/repository/npm//babel-helper-define-map/-/babel-helper-define-map-6.24.1.tgz#7a9747f258d8947d32d515f6aa1c7bd02204a080" + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" +@@ -256,7 +256,7 @@ + + babel-helper-function-name@^6.24.1: + version "6.24.1" +- resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" ++ resolved "https://repo.huaweicloud.com/repository/npm//babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" + dependencies: + babel-helper-get-function-arity "^6.24.1" + babel-runtime "^6.22.0" +@@ -266,28 +266,28 @@ + + babel-helper-get-function-arity@^6.24.1: + version "6.24.1" +- resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" ++ resolved "https://repo.huaweicloud.com/repository/npm//babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + + babel-helper-hoist-variables@^6.24.1: + version "6.24.1" +- resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" ++ resolved "https://repo.huaweicloud.com/repository/npm//babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + + babel-helper-optimise-call-expression@^6.24.1: + version "6.24.1" +- resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" ++ resolved "https://repo.huaweicloud.com/repository/npm//babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + + babel-helper-regex@^6.24.1: + version "6.24.1" +- resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.24.1.tgz#d36e22fab1008d79d88648e32116868128456ce8" ++ resolved "https://repo.huaweicloud.com/repository/npm//babel-helper-regex/-/babel-helper-regex-6.24.1.tgz#d36e22fab1008d79d88648e32116868128456ce8" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" +@@ -295,7 +295,7 @@ + + babel-helper-replace-supers@^6.24.1: + version "6.24.1" +- resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" ++ resolved "https://repo.huaweicloud.com/repository/npm//babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" + dependencies: + babel-helper-optimise-call-expression "^6.24.1" + babel-messages "^6.23.0" +@@ -306,38 +306,38 @@ + + babel-helpers@^6.24.1: + version "6.24.1" +- resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" ++ resolved "https://repo.huaweicloud.com/repository/npm//babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + + babel-messages@^6.23.0: + version "6.23.0" +- resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" ++ resolved "https://repo.huaweicloud.com/repository/npm//babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" + dependencies: + babel-runtime "^6.22.0" + + babel-plugin-check-es2015-constants@^6.22.0: + version "6.22.0" +- resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" ++ resolved "https://repo.huaweicloud.com/repository/npm//babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" + dependencies: + babel-runtime "^6.22.0" + + babel-plugin-transform-es2015-arrow-functions@^6.22.0: + version "6.22.0" +- resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" ++ resolved "https://repo.huaweicloud.com/repository/npm//babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" + dependencies: + babel-runtime "^6.22.0" + + babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: + version "6.22.0" +- resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" ++ resolved "https://repo.huaweicloud.com/repository/npm//babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" + dependencies: + babel-runtime "^6.22.0" + + babel-plugin-transform-es2015-block-scoping@^6.24.1: + version "6.24.1" +- resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.24.1.tgz#76c295dc3a4741b1665adfd3167215dcff32a576" ++ resolved "https://repo.huaweicloud.com/repository/npm//babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.24.1.tgz#76c295dc3a4741b1665adfd3167215dcff32a576" + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" +@@ -347,7 +347,7 @@ + + babel-plugin-transform-es2015-classes@^6.24.1: + version "6.24.1" +- resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" ++ resolved "https://repo.huaweicloud.com/repository/npm//babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" + dependencies: + babel-helper-define-map "^6.24.1" + babel-helper-function-name "^6.24.1" +@@ -361,33 +361,33 @@ + + babel-plugin-transform-es2015-computed-properties@^6.24.1: + version "6.24.1" +- resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" ++ resolved "https://repo.huaweicloud.com/repository/npm//babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + + babel-plugin-transform-es2015-destructuring@^6.22.0: + version "6.23.0" +- resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" ++ resolved "https://repo.huaweicloud.com/repository/npm//babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" + dependencies: + babel-runtime "^6.22.0" + + babel-plugin-transform-es2015-duplicate-keys@^6.24.1: + version "6.24.1" +- resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" ++ resolved "https://repo.huaweicloud.com/repository/npm//babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + + babel-plugin-transform-es2015-for-of@^6.22.0: + version "6.23.0" +- resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" ++ resolved "https://repo.huaweicloud.com/repository/npm//babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" + dependencies: + babel-runtime "^6.22.0" + + babel-plugin-transform-es2015-function-name@^6.24.1: + version "6.24.1" +- resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" ++ resolved "https://repo.huaweicloud.com/repository/npm//babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" +@@ -395,13 +395,13 @@ + + babel-plugin-transform-es2015-literals@^6.22.0: + version "6.22.0" +- resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" ++ resolved "https://repo.huaweicloud.com/repository/npm//babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" + dependencies: + babel-runtime "^6.22.0" + + babel-plugin-transform-es2015-modules-amd@^6.24.1: + version "6.24.1" +- resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" ++ resolved "https://repo.huaweicloud.com/repository/npm//babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" + dependencies: + babel-plugin-transform-es2015-modules-commonjs "^6.24.1" + babel-runtime "^6.22.0" +@@ -409,7 +409,7 @@ + + babel-plugin-transform-es2015-modules-commonjs@^6.24.1: + version "6.24.1" +- resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.24.1.tgz#d3e310b40ef664a36622200097c6d440298f2bfe" ++ resolved "https://repo.huaweicloud.com/repository/npm//babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.24.1.tgz#d3e310b40ef664a36622200097c6d440298f2bfe" + dependencies: + babel-plugin-transform-strict-mode "^6.24.1" + babel-runtime "^6.22.0" +@@ -418,7 +418,7 @@ + + babel-plugin-transform-es2015-modules-systemjs@^6.24.1: + version "6.24.1" +- resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" ++ resolved "https://repo.huaweicloud.com/repository/npm//babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" + dependencies: + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" +@@ -426,7 +426,7 @@ + + babel-plugin-transform-es2015-modules-umd@^6.24.1: + version "6.24.1" +- resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" ++ resolved "https://repo.huaweicloud.com/repository/npm//babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" + dependencies: + babel-plugin-transform-es2015-modules-amd "^6.24.1" + babel-runtime "^6.22.0" +@@ -434,14 +434,14 @@ + + babel-plugin-transform-es2015-object-super@^6.24.1: + version "6.24.1" +- resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" ++ resolved "https://repo.huaweicloud.com/repository/npm//babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" + dependencies: + babel-helper-replace-supers "^6.24.1" + babel-runtime "^6.22.0" + + babel-plugin-transform-es2015-parameters@^6.24.1: + version "6.24.1" +- resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" ++ resolved "https://repo.huaweicloud.com/repository/npm//babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" + dependencies: + babel-helper-call-delegate "^6.24.1" + babel-helper-get-function-arity "^6.24.1" +@@ -452,20 +452,20 @@ + + babel-plugin-transform-es2015-shorthand-properties@^6.24.1: + version "6.24.1" +- resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" ++ resolved "https://repo.huaweicloud.com/repository/npm//babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + + babel-plugin-transform-es2015-spread@^6.22.0: + version "6.22.0" +- resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" ++ resolved "https://repo.huaweicloud.com/repository/npm//babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" + dependencies: + babel-runtime "^6.22.0" + + babel-plugin-transform-es2015-sticky-regex@^6.24.1: + version "6.24.1" +- resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" ++ resolved "https://repo.huaweicloud.com/repository/npm//babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" + dependencies: + babel-helper-regex "^6.24.1" + babel-runtime "^6.22.0" +@@ -473,19 +473,19 @@ + + babel-plugin-transform-es2015-template-literals@^6.22.0: + version "6.22.0" +- resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" ++ resolved "https://repo.huaweicloud.com/repository/npm//babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" + dependencies: + babel-runtime "^6.22.0" + + babel-plugin-transform-es2015-typeof-symbol@^6.22.0: + version "6.23.0" +- resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" ++ resolved "https://repo.huaweicloud.com/repository/npm//babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" + dependencies: + babel-runtime "^6.22.0" + + babel-plugin-transform-es2015-unicode-regex@^6.24.1: + version "6.24.1" +- resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" ++ resolved "https://repo.huaweicloud.com/repository/npm//babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" + dependencies: + babel-helper-regex "^6.24.1" + babel-runtime "^6.22.0" +@@ -493,26 +493,26 @@ + + babel-plugin-transform-object-assign@6.22.0: + version "6.22.0" +- resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-assign/-/babel-plugin-transform-object-assign-6.22.0.tgz#f99d2f66f1a0b0d498e346c5359684740caa20ba" ++ resolved "https://repo.huaweicloud.com/repository/npm//babel-plugin-transform-object-assign/-/babel-plugin-transform-object-assign-6.22.0.tgz#f99d2f66f1a0b0d498e346c5359684740caa20ba" + dependencies: + babel-runtime "^6.22.0" + + babel-plugin-transform-regenerator@^6.24.1: + version "6.24.1" +- resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.24.1.tgz#b8da305ad43c3c99b4848e4fe4037b770d23c418" ++ resolved "https://repo.huaweicloud.com/repository/npm//babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.24.1.tgz#b8da305ad43c3c99b4848e4fe4037b770d23c418" + dependencies: + regenerator-transform "0.9.11" + + babel-plugin-transform-strict-mode@^6.24.1: + version "6.24.1" +- resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" ++ resolved "https://repo.huaweicloud.com/repository/npm//babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + + babel-preset-es2015@^6.0.0, babel-preset-es2015@^6.18.0: + version "6.24.1" +- resolved "https://registry.yarnpkg.com/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz#d44050d6bc2c9feea702aaf38d727a0210538939" ++ resolved "https://repo.huaweicloud.com/repository/npm//babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz#d44050d6bc2c9feea702aaf38d727a0210538939" + dependencies: + babel-plugin-check-es2015-constants "^6.22.0" + babel-plugin-transform-es2015-arrow-functions "^6.22.0" +@@ -541,7 +541,7 @@ + + babel-register@^6.24.1: + version "6.24.1" +- resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.24.1.tgz#7e10e13a2f71065bdfad5a1787ba45bca6ded75f" ++ resolved "https://repo.huaweicloud.com/repository/npm//babel-register/-/babel-register-6.24.1.tgz#7e10e13a2f71065bdfad5a1787ba45bca6ded75f" + dependencies: + babel-core "^6.24.1" + babel-runtime "^6.22.0" +@@ -553,14 +553,14 @@ + + babel-runtime@^6.18.0, babel-runtime@^6.22.0: + version "6.23.0" +- resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.23.0.tgz#0a9489f144de70efb3ce4300accdb329e2fc543b" ++ resolved "https://repo.huaweicloud.com/repository/npm//babel-runtime/-/babel-runtime-6.23.0.tgz#0a9489f144de70efb3ce4300accdb329e2fc543b" + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.10.0" + + babel-template@^6.24.1: + version "6.24.1" +- resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.24.1.tgz#04ae514f1f93b3a2537f2a0f60a5a45fb8308333" ++ resolved "https://repo.huaweicloud.com/repository/npm//babel-template/-/babel-template-6.24.1.tgz#04ae514f1f93b3a2537f2a0f60a5a45fb8308333" + dependencies: + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" +@@ -570,7 +570,7 @@ + + babel-traverse@^6.24.1: + version "6.24.1" +- resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.24.1.tgz#ab36673fd356f9a0948659e7b338d5feadb31695" ++ resolved "https://repo.huaweicloud.com/repository/npm//babel-traverse/-/babel-traverse-6.24.1.tgz#ab36673fd356f9a0948659e7b338d5feadb31695" + dependencies: + babel-code-frame "^6.22.0" + babel-messages "^6.23.0" +@@ -584,7 +584,7 @@ + + babel-types@^6.19.0, babel-types@^6.24.1: + version "6.24.1" +- resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.24.1.tgz#a136879dc15b3606bda0d90c1fc74304c2ff0975" ++ resolved "https://repo.huaweicloud.com/repository/npm//babel-types/-/babel-types-6.24.1.tgz#a136879dc15b3606bda0d90c1fc74304c2ff0975" + dependencies: + babel-runtime "^6.22.0" + esutils "^2.0.2" +@@ -593,65 +593,65 @@ + + babel@^6.5.2: + version "6.23.0" +- resolved "https://registry.yarnpkg.com/babel/-/babel-6.23.0.tgz#d0d1e7d803e974765beea3232d4e153c0efb90f4" ++ resolved "https://repo.huaweicloud.com/repository/npm//babel/-/babel-6.23.0.tgz#d0d1e7d803e974765beea3232d4e153c0efb90f4" + + babylon@^6.11.0, babylon@^6.15.0: + version "6.17.0" +- resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.17.0.tgz#37da948878488b9c4e3c4038893fa3314b3fc932" ++ resolved "https://repo.huaweicloud.com/repository/npm//babylon/-/babylon-6.17.0.tgz#37da948878488b9c4e3c4038893fa3314b3fc932" + + backo2@1.0.2: + version "1.0.2" +- resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" ++ resolved "https://repo.huaweicloud.com/repository/npm//backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" + + balanced-match@^0.4.1: + version "0.4.2" +- resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" ++ resolved "https://repo.huaweicloud.com/repository/npm//balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" + + base64-arraybuffer@0.1.5: + version "0.1.5" +- resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8" ++ resolved "https://repo.huaweicloud.com/repository/npm//base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8" + + base64id@1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/base64id/-/base64id-1.0.0.tgz#47688cb99bb6804f0e06d3e763b1c32e57d8e6b6" ++ resolved "https://repo.huaweicloud.com/repository/npm//base64id/-/base64id-1.0.0.tgz#47688cb99bb6804f0e06d3e763b1c32e57d8e6b6" + + batch@0.2.1: + version "0.2.1" +- resolved "https://registry.yarnpkg.com/batch/-/batch-0.2.1.tgz#4463997bb4d5fd1c7a011548813e52aa189c2c79" ++ resolved "https://repo.huaweicloud.com/repository/npm//batch/-/batch-0.2.1.tgz#4463997bb4d5fd1c7a011548813e52aa189c2c79" + + bcrypt-pbkdf@^1.0.0: + version "1.0.1" +- resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" ++ resolved "https://repo.huaweicloud.com/repository/npm//bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" + dependencies: + tweetnacl "^0.14.3" + + better-assert@~1.0.0: + version "1.0.2" +- resolved "https://registry.yarnpkg.com/better-assert/-/better-assert-1.0.2.tgz#40866b9e1b9e0b55b481894311e68faffaebc522" ++ resolved "https://repo.huaweicloud.com/repository/npm//better-assert/-/better-assert-1.0.2.tgz#40866b9e1b9e0b55b481894311e68faffaebc522" + dependencies: + callsite "1.0.0" + + binary-extensions@^1.0.0: + version "1.8.0" +- resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.8.0.tgz#48ec8d16df4377eae5fa5884682480af4d95c774" ++ resolved "https://repo.huaweicloud.com/repository/npm//binary-extensions/-/binary-extensions-1.8.0.tgz#48ec8d16df4377eae5fa5884682480af4d95c774" + + blob@0.0.4: + version "0.0.4" +- resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.4.tgz#bcf13052ca54463f30f9fc7e95b9a47630a94921" ++ resolved "https://repo.huaweicloud.com/repository/npm//blob/-/blob-0.0.4.tgz#bcf13052ca54463f30f9fc7e95b9a47630a94921" + + block-stream@*: + version "0.0.9" +- resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" ++ resolved "https://repo.huaweicloud.com/repository/npm//block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" + dependencies: + inherits "~2.0.0" + + bluebird@^3.3.0: + version "3.5.0" +- resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.0.tgz#791420d7f551eea2897453a8a77653f96606d67c" ++ resolved "https://repo.huaweicloud.com/repository/npm//bluebird/-/bluebird-3.5.0.tgz#791420d7f551eea2897453a8a77653f96606d67c" + + body-parser@^1.16.1: + version "1.17.1" +- resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.17.1.tgz#75b3bc98ddd6e7e0d8ffe750dfaca5c66993fa47" ++ resolved "https://repo.huaweicloud.com/repository/npm//body-parser/-/body-parser-1.17.1.tgz#75b3bc98ddd6e7e0d8ffe750dfaca5c66993fa47" + dependencies: + bytes "2.4.0" + content-type "~1.0.2" +@@ -666,26 +666,26 @@ + + boom@2.x.x: + version "2.10.1" +- resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" ++ resolved "https://repo.huaweicloud.com/repository/npm//boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" + dependencies: + hoek "2.x.x" + + brace-expansion@^1.0.0: + version "1.1.7" +- resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.7.tgz#3effc3c50e000531fb720eaff80f0ae8ef23cf59" ++ resolved "https://repo.huaweicloud.com/repository/npm//brace-expansion/-/brace-expansion-1.1.7.tgz#3effc3c50e000531fb720eaff80f0ae8ef23cf59" + dependencies: + balanced-match "^0.4.1" + concat-map "0.0.1" + + braces@^0.1.2: + version "0.1.5" +- resolved "https://registry.yarnpkg.com/braces/-/braces-0.1.5.tgz#c085711085291d8b75fdd74eab0f8597280711e6" ++ resolved "https://repo.huaweicloud.com/repository/npm//braces/-/braces-0.1.5.tgz#c085711085291d8b75fdd74eab0f8597280711e6" + dependencies: + expand-range "^0.1.0" + + braces@^1.8.2: + version "1.8.5" +- resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" ++ resolved "https://repo.huaweicloud.com/repository/npm//braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" + dependencies: + expand-range "^1.8.1" + preserve "^0.2.0" +@@ -693,7 +693,7 @@ + + brunch@1.7.20: + version "1.7.20" +- resolved "https://registry.yarnpkg.com/brunch/-/brunch-1.7.20.tgz#0d755255b2bc695b14d45742a176c2b1fc9d88c6" ++ resolved "https://repo.huaweicloud.com/repository/npm//brunch/-/brunch-1.7.20.tgz#0d755255b2bc695b14d45742a176c2b1fc9d88c6" + dependencies: + anymatch "~1.0.0" + anysort "~1.0.0" +@@ -714,72 +714,72 @@ + + buffer-crc32@0.2.1: + version "0.2.1" +- resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.1.tgz#be3e5382fc02b6d6324956ac1af98aa98b08534c" ++ resolved "https://repo.huaweicloud.com/repository/npm//buffer-crc32/-/buffer-crc32-0.2.1.tgz#be3e5382fc02b6d6324956ac1af98aa98b08534c" + + buffer-from@^1.0.0: + version "1.1.1" +- resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" ++ resolved "https://repo.huaweicloud.com/repository/npm//buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + + buffer-shims@~1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" ++ resolved "https://repo.huaweicloud.com/repository/npm//buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" + + builtin-modules@^1.0.0: + version "1.1.1" +- resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" ++ resolved "https://repo.huaweicloud.com/repository/npm//builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" + + buster-core@=0.6.4: + version "0.6.4" +- resolved "https://registry.yarnpkg.com/buster-core/-/buster-core-0.6.4.tgz#27bf6bad674244ea720f311d900a0ca1cb786050" ++ resolved "https://repo.huaweicloud.com/repository/npm//buster-core/-/buster-core-0.6.4.tgz#27bf6bad674244ea720f311d900a0ca1cb786050" + + buster-format@~0.5: + version "0.5.6" +- resolved "https://registry.yarnpkg.com/buster-format/-/buster-format-0.5.6.tgz#2b86c322ecf5e1b0ae6e6e7905ebfcf387d2ab95" ++ resolved "https://repo.huaweicloud.com/repository/npm//buster-format/-/buster-format-0.5.6.tgz#2b86c322ecf5e1b0ae6e6e7905ebfcf387d2ab95" + dependencies: + buster-core "=0.6.4" + + bytes@0.2.0: + version "0.2.0" +- resolved "https://registry.yarnpkg.com/bytes/-/bytes-0.2.0.tgz#aad33ec14e3dc2ca74e8e7d451f9ba053ad4f7a0" ++ resolved "https://repo.huaweicloud.com/repository/npm//bytes/-/bytes-0.2.0.tgz#aad33ec14e3dc2ca74e8e7d451f9ba053ad4f7a0" + + bytes@2.4.0: + version "2.4.0" +- resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.4.0.tgz#7d97196f9d5baf7f6935e25985549edd2a6c2339" ++ resolved "https://repo.huaweicloud.com/repository/npm//bytes/-/bytes-2.4.0.tgz#7d97196f9d5baf7f6935e25985549edd2a6c2339" + + callsite@1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20" ++ resolved "https://repo.huaweicloud.com/repository/npm//callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20" + + camelcase-keys@^2.0.0: + version "2.1.0" +- resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" ++ resolved "https://repo.huaweicloud.com/repository/npm//camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" + dependencies: + camelcase "^2.0.0" + map-obj "^1.0.0" + + camelcase@^1.0.2: + version "1.2.1" +- resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" ++ resolved "https://repo.huaweicloud.com/repository/npm//camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" + + camelcase@^2.0.0: + version "2.1.1" +- resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" ++ resolved "https://repo.huaweicloud.com/repository/npm//camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" + + caseless@~0.12.0: + version "0.12.0" +- resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" ++ resolved "https://repo.huaweicloud.com/repository/npm//caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + + center-align@^0.1.1: + version "0.1.3" +- resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" ++ resolved "https://repo.huaweicloud.com/repository/npm//center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" + dependencies: + align-text "^0.1.3" + lazy-cache "^1.0.3" + + chai@~3.5.0: + version "3.5.0" +- resolved "https://registry.yarnpkg.com/chai/-/chai-3.5.0.tgz#4d02637b067fe958bdbfdd3a40ec56fef7373247" ++ resolved "https://repo.huaweicloud.com/repository/npm//chai/-/chai-3.5.0.tgz#4d02637b067fe958bdbfdd3a40ec56fef7373247" + dependencies: + assertion-error "^1.0.1" + deep-eql "^0.1.3" +@@ -787,7 +787,7 @@ + + chalk@^1.1.0: + version "1.1.3" +- resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" ++ resolved "https://repo.huaweicloud.com/repository/npm//chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" +@@ -797,7 +797,7 @@ + + chokidar@^1.4.1: + version "1.6.1" +- resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.6.1.tgz#2f4447ab5e96e50fb3d789fd90d4c72e0e4c70c2" ++ resolved "https://repo.huaweicloud.com/repository/npm//chokidar/-/chokidar-1.6.1.tgz#2f4447ab5e96e50fb3d789fd90d4c72e0e4c70c2" + dependencies: + anymatch "^1.3.0" + async-each "^1.0.0" +@@ -812,7 +812,7 @@ + + chokidar@~0.12.0: + version "0.12.6" +- resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-0.12.6.tgz#be204f5b9634e009311256e5d6e8e0e508284d2f" ++ resolved "https://repo.huaweicloud.com/repository/npm//chokidar/-/chokidar-0.12.6.tgz#be204f5b9634e009311256e5d6e8e0e508284d2f" + dependencies: + async-each "~0.1.5" + readdirp "~1.3.0" +@@ -821,7 +821,7 @@ + + chromium@1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/chromium/-/chromium-1.0.0.tgz#e48222cd73d9972f7039bcf1fe46aae997c19e2d" ++ resolved "https://repo.huaweicloud.com/repository/npm//chromium/-/chromium-1.0.0.tgz#e48222cd73d9972f7039bcf1fe46aae997c19e2d" + integrity sha512-LeW7vkfH5Rp+tivMMIIZAOkuQglKDtnpfcnsWnwAYiKPF9vnFGk2EZ/zWwcCSjctnqxyPXwq++5A+gX4+C46JQ== + dependencies: + extract-zip "^1.6.5" +@@ -830,20 +830,20 @@ + + "clean-css-brunch@>= 1.0 < 1.5": + version "1.4.0" +- resolved "https://registry.yarnpkg.com/clean-css-brunch/-/clean-css-brunch-1.4.0.tgz#7df42f1c2bc7de4eb9db1931c96061ced54e0bd9" ++ resolved "https://repo.huaweicloud.com/repository/npm//clean-css-brunch/-/clean-css-brunch-1.4.0.tgz#7df42f1c2bc7de4eb9db1931c96061ced54e0bd9" + dependencies: + clean-css "0.8.x" + coffee-script "1.3.3" + + clean-css@0.8.x: + version "0.8.3" +- resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-0.8.3.tgz#13bca09d4aaa8b0e73e4805530e8ba3dc76c22d0" ++ resolved "https://repo.huaweicloud.com/repository/npm//clean-css/-/clean-css-0.8.3.tgz#13bca09d4aaa8b0e73e4805530e8ba3dc76c22d0" + dependencies: + optimist "0.3.x" + + cliui@^2.1.0: + version "2.1.0" +- resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" ++ resolved "https://repo.huaweicloud.com/repository/npm//cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" + dependencies: + center-align "^0.1.1" + right-align "^0.1.1" +@@ -851,71 +851,71 @@ + + co@^4.6.0: + version "4.6.0" +- resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" ++ resolved "https://repo.huaweicloud.com/repository/npm//co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + + code-point-at@^1.0.0: + version "1.1.0" +- resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" ++ resolved "https://repo.huaweicloud.com/repository/npm//code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + + coffee-script@1.3.3: + version "1.3.3" +- resolved "https://registry.yarnpkg.com/coffee-script/-/coffee-script-1.3.3.tgz#150d6b4cb522894369efed6a2101c20bc7f4a4f4" ++ resolved "https://repo.huaweicloud.com/repository/npm//coffee-script/-/coffee-script-1.3.3.tgz#150d6b4cb522894369efed6a2101c20bc7f4a4f4" + + coffee-script@1.4.0: + version "1.4.0" +- resolved "https://registry.yarnpkg.com/coffee-script/-/coffee-script-1.4.0.tgz#5e3bc8aac26c01a8e27bf107722c5655f5ad7d36" ++ resolved "https://repo.huaweicloud.com/repository/npm//coffee-script/-/coffee-script-1.4.0.tgz#5e3bc8aac26c01a8e27bf107722c5655f5ad7d36" + + coffee-script@~1.8.0: + version "1.8.0" +- resolved "https://registry.yarnpkg.com/coffee-script/-/coffee-script-1.8.0.tgz#9c9f1d2b4a52a000ded15b659791703648263c1d" ++ resolved "https://repo.huaweicloud.com/repository/npm//coffee-script/-/coffee-script-1.8.0.tgz#9c9f1d2b4a52a000ded15b659791703648263c1d" + dependencies: + mkdirp "~0.3.5" + + colors@^1.1.0: + version "1.1.2" +- resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" ++ resolved "https://repo.huaweicloud.com/repository/npm//colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" + + combine-lists@^1.0.0: + version "1.0.1" +- resolved "https://registry.yarnpkg.com/combine-lists/-/combine-lists-1.0.1.tgz#458c07e09e0d900fc28b70a3fec2dacd1d2cb7f6" ++ resolved "https://repo.huaweicloud.com/repository/npm//combine-lists/-/combine-lists-1.0.1.tgz#458c07e09e0d900fc28b70a3fec2dacd1d2cb7f6" + dependencies: + lodash "^4.5.0" + + combined-stream@^1.0.5, combined-stream@~1.0.5: + version "1.0.5" +- resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" ++ resolved "https://repo.huaweicloud.com/repository/npm//combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" + dependencies: + delayed-stream "~1.0.0" + + commander@0.6.1: + version "0.6.1" +- resolved "https://registry.yarnpkg.com/commander/-/commander-0.6.1.tgz#fa68a14f6a945d54dbbe50d8cdb3320e9e3b1a06" ++ resolved "https://repo.huaweicloud.com/repository/npm//commander/-/commander-0.6.1.tgz#fa68a14f6a945d54dbbe50d8cdb3320e9e3b1a06" + + commander@1.2.0: + version "1.2.0" +- resolved "https://registry.yarnpkg.com/commander/-/commander-1.2.0.tgz#fd5713bfa153c7d6cc599378a5ab4c45c535029e" ++ resolved "https://repo.huaweicloud.com/repository/npm//commander/-/commander-1.2.0.tgz#fd5713bfa153c7d6cc599378a5ab4c45c535029e" + dependencies: + keypress "0.1.x" + + commander@2.3.0: + version "2.3.0" +- resolved "https://registry.yarnpkg.com/commander/-/commander-2.3.0.tgz#fd430e889832ec353b9acd1de217c11cb3eef873" ++ resolved "https://repo.huaweicloud.com/repository/npm//commander/-/commander-2.3.0.tgz#fd430e889832ec353b9acd1de217c11cb3eef873" + + commander@~2.0.0: + version "2.0.0" +- resolved "https://registry.yarnpkg.com/commander/-/commander-2.0.0.tgz#d1b86f901f8b64bd941bdeadaf924530393be928" ++ resolved "https://repo.huaweicloud.com/repository/npm//commander/-/commander-2.0.0.tgz#d1b86f901f8b64bd941bdeadaf924530393be928" + + commonjs-require-definition@~0.1.0: + version "0.1.2" +- resolved "https://registry.yarnpkg.com/commonjs-require-definition/-/commonjs-require-definition-0.1.2.tgz#93720e42b3383a00e4097f6a4a979f10f376dc2d" ++ resolved "https://repo.huaweicloud.com/repository/npm//commonjs-require-definition/-/commonjs-require-definition-0.1.2.tgz#93720e42b3383a00e4097f6a4a979f10f376dc2d" + + component-bind@1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1" ++ resolved "https://repo.huaweicloud.com/repository/npm//component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1" + + component-builder@~0.10.0: + version "0.10.1" +- resolved "https://registry.yarnpkg.com/component-builder/-/component-builder-0.10.1.tgz#d29c7ab70241a678e3f8dbea4d1759c68b6f8f9b" ++ resolved "https://repo.huaweicloud.com/repository/npm//component-builder/-/component-builder-0.10.1.tgz#d29c7ab70241a678e3f8dbea4d1759c68b6f8f9b" + dependencies: + batch "0.2.1" + component-require "0.3.1" +@@ -926,27 +926,27 @@ + + component-emitter@1.1.2: + version "1.1.2" +- resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.1.2.tgz#296594f2753daa63996d2af08d15a95116c9aec3" ++ resolved "https://repo.huaweicloud.com/repository/npm//component-emitter/-/component-emitter-1.1.2.tgz#296594f2753daa63996d2af08d15a95116c9aec3" + + component-emitter@1.2.1: + version "1.2.1" +- resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" ++ resolved "https://repo.huaweicloud.com/repository/npm//component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" + + component-inherit@0.0.3: + version "0.0.3" +- resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143" ++ resolved "https://repo.huaweicloud.com/repository/npm//component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143" + + component-require@0.3.1: + version "0.3.1" +- resolved "https://registry.yarnpkg.com/component-require/-/component-require-0.3.1.tgz#50a00e2e2cb0fe273ab4268fe20ae4804f35fe6d" ++ resolved "https://repo.huaweicloud.com/repository/npm//component-require/-/component-require-0.3.1.tgz#50a00e2e2cb0fe273ab4268fe20ae4804f35fe6d" + + concat-map@0.0.1: + version "0.0.1" +- resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" ++ resolved "https://repo.huaweicloud.com/repository/npm//concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + + concat-stream@1.6.2: + version "1.6.2" +- resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" ++ resolved "https://repo.huaweicloud.com/repository/npm//concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== + dependencies: + buffer-from "^1.0.0" +@@ -956,11 +956,11 @@ + + connect-slashes@~0.0.9: + version "0.0.11" +- resolved "https://registry.yarnpkg.com/connect-slashes/-/connect-slashes-0.0.11.tgz#4b44efae7599cc03ee20b24e9287272f41d62258" ++ resolved "https://repo.huaweicloud.com/repository/npm//connect-slashes/-/connect-slashes-0.0.11.tgz#4b44efae7599cc03ee20b24e9287272f41d62258" + + connect@1.x: + version "1.9.2" +- resolved "https://registry.yarnpkg.com/connect/-/connect-1.9.2.tgz#42880a22e9438ae59a8add74e437f58ae8e52807" ++ resolved "https://repo.huaweicloud.com/repository/npm//connect/-/connect-1.9.2.tgz#42880a22e9438ae59a8add74e437f58ae8e52807" + dependencies: + formidable "1.0.x" + mime ">= 0.0.1" +@@ -968,7 +968,7 @@ + + connect@2.8.8: + version "2.8.8" +- resolved "https://registry.yarnpkg.com/connect/-/connect-2.8.8.tgz#b9abf8caf0bd9773cb3dea29344119872582446d" ++ resolved "https://repo.huaweicloud.com/repository/npm//connect/-/connect-2.8.8.tgz#b9abf8caf0bd9773cb3dea29344119872582446d" + dependencies: + buffer-crc32 "0.2.1" + bytes "0.2.0" +@@ -985,7 +985,7 @@ + + connect@^3.6.0: + version "3.6.1" +- resolved "https://registry.yarnpkg.com/connect/-/connect-3.6.1.tgz#b7760693a74f0454face1d9378edb3f885b43227" ++ resolved "https://repo.huaweicloud.com/repository/npm//connect/-/connect-3.6.1.tgz#b7760693a74f0454face1d9378edb3f885b43227" + dependencies: + debug "2.6.3" + finalhandler "1.0.1" +@@ -994,192 +994,192 @@ + + console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" +- resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" ++ resolved "https://repo.huaweicloud.com/repository/npm//console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + + content-type-parser@^1.0.1: + version "1.0.1" +- resolved "https://registry.yarnpkg.com/content-type-parser/-/content-type-parser-1.0.1.tgz#c3e56988c53c65127fb46d4032a3a900246fdc94" ++ resolved "https://repo.huaweicloud.com/repository/npm//content-type-parser/-/content-type-parser-1.0.1.tgz#c3e56988c53c65127fb46d4032a3a900246fdc94" + + content-type@~1.0.2: + version "1.0.2" +- resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.2.tgz#b7d113aee7a8dd27bd21133c4dc2529df1721eed" ++ resolved "https://repo.huaweicloud.com/repository/npm//content-type/-/content-type-1.0.2.tgz#b7d113aee7a8dd27bd21133c4dc2529df1721eed" + + convert-source-map@^1.1.0: + version "1.5.0" +- resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5" ++ resolved "https://repo.huaweicloud.com/repository/npm//convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5" + + cookie-signature@1.0.1: + version "1.0.1" +- resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.1.tgz#44e072148af01e6e8e24afbf12690d68ae698ecb" ++ resolved "https://repo.huaweicloud.com/repository/npm//cookie-signature/-/cookie-signature-1.0.1.tgz#44e072148af01e6e8e24afbf12690d68ae698ecb" + + cookie@0.1.0: + version "0.1.0" +- resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.1.0.tgz#90eb469ddce905c866de687efc43131d8801f9d0" ++ resolved "https://repo.huaweicloud.com/repository/npm//cookie/-/cookie-0.1.0.tgz#90eb469ddce905c866de687efc43131d8801f9d0" + + cookie@0.3.1: + version "0.3.1" +- resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" ++ resolved "https://repo.huaweicloud.com/repository/npm//cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" + + core-js@^2.2.0, core-js@^2.4.0: + version "2.4.1" +- resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e" ++ resolved "https://repo.huaweicloud.com/repository/npm//core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e" + + core-util-is@~1.0.0: + version "1.0.2" +- resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" ++ resolved "https://repo.huaweicloud.com/repository/npm//core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + + cp@~0.1.0: + version "0.1.1" +- resolved "https://registry.yarnpkg.com/cp/-/cp-0.1.1.tgz#3946a76c1a53ffe0e68593f341c124b336c1f06d" ++ resolved "https://repo.huaweicloud.com/repository/npm//cp/-/cp-0.1.1.tgz#3946a76c1a53ffe0e68593f341c124b336c1f06d" + + cryptiles@2.x.x: + version "2.0.5" +- resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" ++ resolved "https://repo.huaweicloud.com/repository/npm//cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" + dependencies: + boom "2.x.x" + + "css-brunch@>= 1.0 < 1.5": + version "1.3.0" +- resolved "https://registry.yarnpkg.com/css-brunch/-/css-brunch-1.3.0.tgz#82b07ee0ea8887e5f97d8ee6b9eda8abb939644b" ++ resolved "https://repo.huaweicloud.com/repository/npm//css-brunch/-/css-brunch-1.3.0.tgz#82b07ee0ea8887e5f97d8ee6b9eda8abb939644b" + dependencies: + coffee-script "1.3.3" + + cssom@0.2.x: + version "0.2.5" +- resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.2.5.tgz#2682709b5902e7212df529116ff788cd5b254894" ++ resolved "https://repo.huaweicloud.com/repository/npm//cssom/-/cssom-0.2.5.tgz#2682709b5902e7212df529116ff788cd5b254894" + + cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": + version "0.3.2" +- resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.2.tgz#b8036170c79f07a90ff2f16e22284027a243848b" ++ resolved "https://repo.huaweicloud.com/repository/npm//cssom/-/cssom-0.3.2.tgz#b8036170c79f07a90ff2f16e22284027a243848b" + + cssstyle@0.2.3: + version "0.2.3" +- resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-0.2.3.tgz#fc6a0cb8c72b99f10b17d2028adcdb9bcc73cb49" ++ resolved "https://repo.huaweicloud.com/repository/npm//cssstyle/-/cssstyle-0.2.3.tgz#fc6a0cb8c72b99f10b17d2028adcdb9bcc73cb49" + dependencies: + cssom "0.2.x" + + "cssstyle@>= 0.2.37 < 0.3.0": + version "0.2.37" +- resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-0.2.37.tgz#541097234cb2513c83ceed3acddc27ff27987d54" ++ resolved "https://repo.huaweicloud.com/repository/npm//cssstyle/-/cssstyle-0.2.37.tgz#541097234cb2513c83ceed3acddc27ff27987d54" + dependencies: + cssom "0.3.x" + + currently-unhandled@^0.4.1: + version "0.4.1" +- resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" ++ resolved "https://repo.huaweicloud.com/repository/npm//currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" + dependencies: + array-find-index "^1.0.1" + + custom-event@~1.0.0: + version "1.0.1" +- resolved "https://registry.yarnpkg.com/custom-event/-/custom-event-1.0.1.tgz#5d02a46850adf1b4a317946a3928fccb5bfd0425" ++ resolved "https://repo.huaweicloud.com/repository/npm//custom-event/-/custom-event-1.0.1.tgz#5d02a46850adf1b4a317946a3928fccb5bfd0425" + + dashdash@^1.12.0: + version "1.14.1" +- resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" ++ resolved "https://repo.huaweicloud.com/repository/npm//dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + dependencies: + assert-plus "^1.0.0" + + date-utils@~1.2.17: + version "1.2.21" +- resolved "https://registry.yarnpkg.com/date-utils/-/date-utils-1.2.21.tgz#61fb16cdc1274b3c9acaaffe9fc69df8720a2b64" ++ resolved "https://repo.huaweicloud.com/repository/npm//date-utils/-/date-utils-1.2.21.tgz#61fb16cdc1274b3c9acaaffe9fc69df8720a2b64" + + dateformat@~1.0.6: + version "1.0.12" +- resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-1.0.12.tgz#9f124b67594c937ff706932e4a642cca8dbbfee9" ++ resolved "https://repo.huaweicloud.com/repository/npm//dateformat/-/dateformat-1.0.12.tgz#9f124b67594c937ff706932e4a642cca8dbbfee9" + dependencies: + get-stdin "^4.0.1" + meow "^3.3.0" + + debug@*, debug@2.6.3, debug@^2.2.0: + version "2.6.3" +- resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.3.tgz#0f7eb8c30965ec08c72accfa0130c8b79984141d" ++ resolved "https://repo.huaweicloud.com/repository/npm//debug/-/debug-2.6.3.tgz#0f7eb8c30965ec08c72accfa0130c8b79984141d" + dependencies: + ms "0.7.2" + + debug@2.2.0, debug@^2.1.1: + version "2.2.0" +- resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" ++ resolved "https://repo.huaweicloud.com/repository/npm//debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" + dependencies: + ms "0.7.1" + + debug@2.3.3: + version "2.3.3" +- resolved "https://registry.yarnpkg.com/debug/-/debug-2.3.3.tgz#40c453e67e6e13c901ddec317af8986cda9eff8c" ++ resolved "https://repo.huaweicloud.com/repository/npm//debug/-/debug-2.3.3.tgz#40c453e67e6e13c901ddec317af8986cda9eff8c" + dependencies: + ms "0.7.2" + + debug@2.6.1: + version "2.6.1" +- resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.1.tgz#79855090ba2c4e3115cc7d8769491d58f0491351" ++ resolved "https://repo.huaweicloud.com/repository/npm//debug/-/debug-2.6.1.tgz#79855090ba2c4e3115cc7d8769491d58f0491351" + dependencies: + ms "0.7.2" + + debug@2.6.9: + version "2.6.9" +- resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" ++ resolved "https://repo.huaweicloud.com/repository/npm//debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + + debug@~0.7.2: + version "0.7.4" +- resolved "https://registry.yarnpkg.com/debug/-/debug-0.7.4.tgz#06e1ea8082c2cb14e39806e22e2f6f757f92af39" ++ resolved "https://repo.huaweicloud.com/repository/npm//debug/-/debug-0.7.4.tgz#06e1ea8082c2cb14e39806e22e2f6f757f92af39" + + decamelize@^1.0.0, decamelize@^1.1.2: + version "1.2.0" +- resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" ++ resolved "https://repo.huaweicloud.com/repository/npm//decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + + decompress-response@^3.2.0: + version "3.3.0" +- resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" ++ resolved "https://repo.huaweicloud.com/repository/npm//decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" + integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= + dependencies: + mimic-response "^1.0.0" + + deep-eql@^0.1.3: + version "0.1.3" +- resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-0.1.3.tgz#ef558acab8de25206cd713906d74e56930eb69f2" ++ resolved "https://repo.huaweicloud.com/repository/npm//deep-eql/-/deep-eql-0.1.3.tgz#ef558acab8de25206cd713906d74e56930eb69f2" + dependencies: + type-detect "0.1.1" + + deep-extend@~0.4.0: + version "0.4.1" +- resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.1.tgz#efe4113d08085f4e6f9687759810f807469e2253" ++ resolved "https://repo.huaweicloud.com/repository/npm//deep-extend/-/deep-extend-0.4.1.tgz#efe4113d08085f4e6f9687759810f807469e2253" + + deep-is@~0.1.2, deep-is@~0.1.3: + version "0.1.3" +- resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" ++ resolved "https://repo.huaweicloud.com/repository/npm//deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + + delayed-stream@~1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" ++ resolved "https://repo.huaweicloud.com/repository/npm//delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + + delegates@^1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" ++ resolved "https://repo.huaweicloud.com/repository/npm//delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + + depd@1.1.0, depd@~1.1.0: + version "1.1.0" +- resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.0.tgz#e1bd82c6aab6ced965b97b88b17ed3e528ca18c3" ++ resolved "https://repo.huaweicloud.com/repository/npm//depd/-/depd-1.1.0.tgz#e1bd82c6aab6ced965b97b88b17ed3e528ca18c3" + + detect-indent@^4.0.0: + version "4.0.0" +- resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" ++ resolved "https://repo.huaweicloud.com/repository/npm//detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" + dependencies: + repeating "^2.0.0" + + di@^0.0.1: + version "0.0.1" +- resolved "https://registry.yarnpkg.com/di/-/di-0.0.1.tgz#806649326ceaa7caa3306d75d985ea2748ba913c" ++ resolved "https://repo.huaweicloud.com/repository/npm//di/-/di-0.0.1.tgz#806649326ceaa7caa3306d75d985ea2748ba913c" + + diff@1.4.0: + version "1.4.0" +- resolved "https://registry.yarnpkg.com/diff/-/diff-1.4.0.tgz#7f28d2eb9ee7b15a97efd89ce63dcfdaa3ccbabf" ++ resolved "https://repo.huaweicloud.com/repository/npm//diff/-/diff-1.4.0.tgz#7f28d2eb9ee7b15a97efd89ce63dcfdaa3ccbabf" + + dom-serialize@^2.2.0: + version "2.2.1" +- resolved "https://registry.yarnpkg.com/dom-serialize/-/dom-serialize-2.2.1.tgz#562ae8999f44be5ea3076f5419dcd59eb43ac95b" ++ resolved "https://repo.huaweicloud.com/repository/npm//dom-serialize/-/dom-serialize-2.2.1.tgz#562ae8999f44be5ea3076f5419dcd59eb43ac95b" + dependencies: + custom-event "~1.0.0" + ent "~2.2.0" +@@ -1188,37 +1188,37 @@ + + duplexer3@^0.1.4: + version "0.1.4" +- resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" ++ resolved "https://repo.huaweicloud.com/repository/npm//duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" + integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= + + ecc-jsbn@~0.1.1: + version "0.1.1" +- resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" ++ resolved "https://repo.huaweicloud.com/repository/npm//ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" + dependencies: + jsbn "~0.1.0" + + ee-first@1.1.1: + version "1.1.1" +- resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" ++ resolved "https://repo.huaweicloud.com/repository/npm//ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + + ember-precompile-brunch@^0.1.1: + version "0.1.2" +- resolved "https://registry.yarnpkg.com/ember-precompile-brunch/-/ember-precompile-brunch-0.1.2.tgz#54e73d5054a35afde79aa1c1b454f6ed0e37611c" ++ resolved "https://repo.huaweicloud.com/repository/npm//ember-precompile-brunch/-/ember-precompile-brunch-0.1.2.tgz#54e73d5054a35afde79aa1c1b454f6ed0e37611c" + dependencies: + coffee-script "1.4.0" + jsdom "^9.0.0" + + ember-radio-button@0.1.2: + version "0.1.2" +- resolved "https://registry.yarnpkg.com/ember-radio-button/-/ember-radio-button-0.1.2.tgz#6cbf20977ec2ea741ba361e5f4295b1d804b7c19" ++ resolved "https://repo.huaweicloud.com/repository/npm//ember-radio-button/-/ember-radio-button-0.1.2.tgz#6cbf20977ec2ea741ba361e5f4295b1d804b7c19" + + encodeurl@~1.0.1: + version "1.0.1" +- resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.1.tgz#79e3d58655346909fe6f0f45a5de68103b294d20" ++ resolved "https://repo.huaweicloud.com/repository/npm//encodeurl/-/encodeurl-1.0.1.tgz#79e3d58655346909fe6f0f45a5de68103b294d20" + + engine.io-client@1.8.3: + version "1.8.3" +- resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-1.8.3.tgz#1798ed93451246453d4c6f635d7a201fe940d5ab" ++ resolved "https://repo.huaweicloud.com/repository/npm//engine.io-client/-/engine.io-client-1.8.3.tgz#1798ed93451246453d4c6f635d7a201fe940d5ab" + dependencies: + component-emitter "1.2.1" + component-inherit "0.0.3" +@@ -1235,7 +1235,7 @@ + + engine.io-parser@1.3.2: + version "1.3.2" +- resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-1.3.2.tgz#937b079f0007d0893ec56d46cb220b8cb435220a" ++ resolved "https://repo.huaweicloud.com/repository/npm//engine.io-parser/-/engine.io-parser-1.3.2.tgz#937b079f0007d0893ec56d46cb220b8cb435220a" + dependencies: + after "0.8.2" + arraybuffer.slice "0.0.6" +@@ -1246,7 +1246,7 @@ + + engine.io@1.8.3: + version "1.8.3" +- resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-1.8.3.tgz#8de7f97895d20d39b85f88eeee777b2bd42b13d4" ++ resolved "https://repo.huaweicloud.com/repository/npm//engine.io/-/engine.io-1.8.3.tgz#8de7f97895d20d39b85f88eeee777b2bd42b13d4" + dependencies: + accepts "1.3.3" + base64id "1.0.0" +@@ -1257,30 +1257,30 @@ + + ent@~2.2.0: + version "2.2.0" +- resolved "https://registry.yarnpkg.com/ent/-/ent-2.2.0.tgz#e964219325a21d05f44466a2f686ed6ce5f5dd1d" ++ resolved "https://repo.huaweicloud.com/repository/npm//ent/-/ent-2.2.0.tgz#e964219325a21d05f44466a2f686ed6ce5f5dd1d" + + error-ex@^1.2.0: + version "1.3.1" +- resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" ++ resolved "https://repo.huaweicloud.com/repository/npm//error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" + dependencies: + is-arrayish "^0.2.1" + + es6-promise@^4.0.3: + version "4.2.8" +- resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" ++ resolved "https://repo.huaweicloud.com/repository/npm//es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" + integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== + + escape-html@~1.0.3: + version "1.0.3" +- resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" ++ resolved "https://repo.huaweicloud.com/repository/npm//escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + + escape-string-regexp@1.0.2, escape-string-regexp@^1.0.2: + version "1.0.2" +- resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.2.tgz#4dbc2fe674e71949caf3fb2695ce7f2dc1d9a8d1" ++ resolved "https://repo.huaweicloud.com/repository/npm//escape-string-regexp/-/escape-string-regexp-1.0.2.tgz#4dbc2fe674e71949caf3fb2695ce7f2dc1d9a8d1" + + escodegen@1.7.x: + version "1.7.1" +- resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.7.1.tgz#30ecfcf66ca98dc67cd2fd162abeb6eafa8ce6fc" ++ resolved "https://repo.huaweicloud.com/repository/npm//escodegen/-/escodegen-1.7.1.tgz#30ecfcf66ca98dc67cd2fd162abeb6eafa8ce6fc" + dependencies: + esprima "^1.2.2" + estraverse "^1.9.1" +@@ -1291,7 +1291,7 @@ + + escodegen@^1.6.1: + version "1.8.1" +- resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018" ++ resolved "https://repo.huaweicloud.com/repository/npm//escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018" + dependencies: + esprima "^2.7.1" + estraverse "^1.9.1" +@@ -1302,39 +1302,39 @@ + + esprima@1.2.x, esprima@^1.2.2: + version "1.2.5" +- resolved "https://registry.yarnpkg.com/esprima/-/esprima-1.2.5.tgz#0993502feaf668138325756f30f9a51feeec11e9" ++ resolved "https://repo.huaweicloud.com/repository/npm//esprima/-/esprima-1.2.5.tgz#0993502feaf668138325756f30f9a51feeec11e9" + + esprima@2.5.x: + version "2.5.0" +- resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.5.0.tgz#f387a46fd344c1b1a39baf8c20bfb43b6d0058cc" ++ resolved "https://repo.huaweicloud.com/repository/npm//esprima/-/esprima-2.5.0.tgz#f387a46fd344c1b1a39baf8c20bfb43b6d0058cc" + + esprima@^2.7.1: + version "2.7.3" +- resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" ++ resolved "https://repo.huaweicloud.com/repository/npm//esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" + + esprima@^3.1.1: + version "3.1.3" +- resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" ++ resolved "https://repo.huaweicloud.com/repository/npm//esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" + + estraverse@^1.9.1: + version "1.9.3" +- resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" ++ resolved "https://repo.huaweicloud.com/repository/npm//estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" + + estraverse@~1.8.0: + version "1.8.0" +- resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.8.0.tgz#3f1264fb62c8500dbae5e4f73705cd576d6af428" ++ resolved "https://repo.huaweicloud.com/repository/npm//estraverse/-/estraverse-1.8.0.tgz#3f1264fb62c8500dbae5e4f73705cd576d6af428" + + esutils@^2.0.2: + version "2.0.2" +- resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" ++ resolved "https://repo.huaweicloud.com/repository/npm//esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" + + eventemitter3@1.x.x: + version "1.2.0" +- resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-1.2.0.tgz#1c86991d816ad1e504750e73874224ecf3bec508" ++ resolved "https://repo.huaweicloud.com/repository/npm//eventemitter3/-/eventemitter3-1.2.0.tgz#1c86991d816ad1e504750e73874224ecf3bec508" + + expand-braces@^0.1.1: + version "0.1.2" +- resolved "https://registry.yarnpkg.com/expand-braces/-/expand-braces-0.1.2.tgz#488b1d1d2451cb3d3a6b192cfc030f44c5855fea" ++ resolved "https://repo.huaweicloud.com/repository/npm//expand-braces/-/expand-braces-0.1.2.tgz#488b1d1d2451cb3d3a6b192cfc030f44c5855fea" + dependencies: + array-slice "^0.2.3" + array-unique "^0.2.1" +@@ -1342,26 +1342,26 @@ + + expand-brackets@^0.1.4: + version "0.1.5" +- resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" ++ resolved "https://repo.huaweicloud.com/repository/npm//expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" + dependencies: + is-posix-bracket "^0.1.0" + + expand-range@^0.1.0: + version "0.1.1" +- resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-0.1.1.tgz#4cb8eda0993ca56fa4f41fc42f3cbb4ccadff044" ++ resolved "https://repo.huaweicloud.com/repository/npm//expand-range/-/expand-range-0.1.1.tgz#4cb8eda0993ca56fa4f41fc42f3cbb4ccadff044" + dependencies: + is-number "^0.1.1" + repeat-string "^0.2.2" + + expand-range@^1.8.1: + version "1.8.2" +- resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" ++ resolved "https://repo.huaweicloud.com/repository/npm//expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" + dependencies: + fill-range "^2.1.0" + + express@2.5.8: + version "2.5.8" +- resolved "https://registry.yarnpkg.com/express/-/express-2.5.8.tgz#f166b55d4e8c6d2307ef88ad1768209613f7452a" ++ resolved "https://repo.huaweicloud.com/repository/npm//express/-/express-2.5.8.tgz#f166b55d4e8c6d2307ef88ad1768209613f7452a" + dependencies: + connect "1.x" + mime "1.2.4" +@@ -1370,7 +1370,7 @@ + + express@~3.3.0: + version "3.3.8" +- resolved "https://registry.yarnpkg.com/express/-/express-3.3.8.tgz#8e98ac30d81f4c95b85d71d2af6cf84f62ef19bd" ++ resolved "https://repo.huaweicloud.com/repository/npm//express/-/express-3.3.8.tgz#8e98ac30d81f4c95b85d71d2af6cf84f62ef19bd" + dependencies: + buffer-crc32 "0.2.1" + commander "1.2.0" +@@ -1386,17 +1386,17 @@ + + extend@^3.0.0, extend@~3.0.0: + version "3.0.0" +- resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.0.tgz#5a474353b9f3353ddd8176dfd37b91c83a46f1d4" ++ resolved "https://repo.huaweicloud.com/repository/npm//extend/-/extend-3.0.0.tgz#5a474353b9f3353ddd8176dfd37b91c83a46f1d4" + + extglob@^0.3.1: + version "0.3.2" +- resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" ++ resolved "https://repo.huaweicloud.com/repository/npm//extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" + dependencies: + is-extglob "^1.0.0" + + extract-zip@^1.6.5: + version "1.6.7" +- resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.6.7.tgz#a840b4b8af6403264c8db57f4f1a74333ef81fe9" ++ resolved "https://repo.huaweicloud.com/repository/npm//extract-zip/-/extract-zip-1.6.7.tgz#a840b4b8af6403264c8db57f4f1a74333ef81fe9" + integrity sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k= + dependencies: + concat-stream "1.6.2" +@@ -1406,44 +1406,44 @@ + + extsprintf@1.0.2: + version "1.0.2" +- resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550" ++ resolved "https://repo.huaweicloud.com/repository/npm//extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550" + + fast-levenshtein@~1.0.0: + version "1.0.7" +- resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-1.0.7.tgz#0178dcdee023b92905193af0959e8a7639cfdcb9" ++ resolved "https://repo.huaweicloud.com/repository/npm//fast-levenshtein/-/fast-levenshtein-1.0.7.tgz#0178dcdee023b92905193af0959e8a7639cfdcb9" + + fast-levenshtein@~2.0.4: + version "2.0.6" +- resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" ++ resolved "https://repo.huaweicloud.com/repository/npm//fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + + fd-slicer@~1.0.1: + version "1.0.1" +- resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.0.1.tgz#8b5bcbd9ec327c5041bf9ab023fd6750f1177e65" ++ resolved "https://repo.huaweicloud.com/repository/npm//fd-slicer/-/fd-slicer-1.0.1.tgz#8b5bcbd9ec327c5041bf9ab023fd6750f1177e65" + integrity sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU= + dependencies: + pend "~1.2.0" + + filename-regex@^2.0.0: + version "2.0.0" +- resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.0.tgz#996e3e80479b98b9897f15a8a58b3d084e926775" ++ resolved "https://repo.huaweicloud.com/repository/npm//filename-regex/-/filename-regex-2.0.0.tgz#996e3e80479b98b9897f15a8a58b3d084e926775" + + fileset@0.1.x: + version "0.1.8" +- resolved "https://registry.yarnpkg.com/fileset/-/fileset-0.1.8.tgz#506b91a9396eaa7e32fb42a84077c7a0c736b741" ++ resolved "https://repo.huaweicloud.com/repository/npm//fileset/-/fileset-0.1.8.tgz#506b91a9396eaa7e32fb42a84077c7a0c736b741" + dependencies: + glob "3.x" + minimatch "0.x" + + fileset@0.2.x: + version "0.2.1" +- resolved "https://registry.yarnpkg.com/fileset/-/fileset-0.2.1.tgz#588ef8973c6623b2a76df465105696b96aac8067" ++ resolved "https://repo.huaweicloud.com/repository/npm//fileset/-/fileset-0.2.1.tgz#588ef8973c6623b2a76df465105696b96aac8067" + dependencies: + glob "5.x" + minimatch "2.x" + + fill-range@^2.1.0: + version "2.2.3" +- resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" ++ resolved "https://repo.huaweicloud.com/repository/npm//fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" + dependencies: + is-number "^2.1.0" + isobject "^2.0.0" +@@ -1453,7 +1453,7 @@ + + finalhandler@1.0.1: + version "1.0.1" +- resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.0.1.tgz#bcd15d1689c0e5ed729b6f7f541a6df984117db8" ++ resolved "https://repo.huaweicloud.com/repository/npm//finalhandler/-/finalhandler-1.0.1.tgz#bcd15d1689c0e5ed729b6f7f541a6df984117db8" + dependencies: + debug "2.6.3" + encodeurl "~1.0.1" +@@ -1465,28 +1465,28 @@ + + find-up@^1.0.0: + version "1.1.2" +- resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" ++ resolved "https://repo.huaweicloud.com/repository/npm//find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + dependencies: + path-exists "^2.0.0" + pinkie-promise "^2.0.0" + + for-in@^1.0.1: + version "1.0.2" +- resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" ++ resolved "https://repo.huaweicloud.com/repository/npm//for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + + for-own@^0.1.4: + version "0.1.5" +- resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" ++ resolved "https://repo.huaweicloud.com/repository/npm//for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" + dependencies: + for-in "^1.0.1" + + forever-agent@~0.6.1: + version "0.6.1" +- resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" ++ resolved "https://repo.huaweicloud.com/repository/npm//forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + + form-data@~2.1.1: + version "2.1.4" +- resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" ++ resolved "https://repo.huaweicloud.com/repository/npm//form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.5" +@@ -1494,19 +1494,19 @@ + + formidable@1.0.14: + version "1.0.14" +- resolved "https://registry.yarnpkg.com/formidable/-/formidable-1.0.14.tgz#2b3f4c411cbb5fdd695c44843e2a23514a43231a" ++ resolved "https://repo.huaweicloud.com/repository/npm//formidable/-/formidable-1.0.14.tgz#2b3f4c411cbb5fdd695c44843e2a23514a43231a" + + formidable@1.0.x: + version "1.0.17" +- resolved "https://registry.yarnpkg.com/formidable/-/formidable-1.0.17.tgz#ef5491490f9433b705faa77249c99029ae348559" ++ resolved "https://repo.huaweicloud.com/repository/npm//formidable/-/formidable-1.0.17.tgz#ef5491490f9433b705faa77249c99029ae348559" + + fresh@0.2.0: + version "0.2.0" +- resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.2.0.tgz#bfd9402cf3df12c4a4c310c79f99a3dde13d34a7" ++ resolved "https://repo.huaweicloud.com/repository/npm//fresh/-/fresh-0.2.0.tgz#bfd9402cf3df12c4a4c310c79f99a3dde13d34a7" + + fs-extra@^1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-1.0.0.tgz#cd3ce5f7e7cb6145883fcae3191e9877f8587950" ++ resolved "https://repo.huaweicloud.com/repository/npm//fs-extra/-/fs-extra-1.0.0.tgz#cd3ce5f7e7cb6145883fcae3191e9877f8587950" + integrity sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA= + dependencies: + graceful-fs "^4.1.2" +@@ -1515,7 +1515,7 @@ + + fs-extra@~0.6.3: + version "0.6.4" +- resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.6.4.tgz#f46f0c75b7841f8d200b3348cd4d691d5a099d15" ++ resolved "https://repo.huaweicloud.com/repository/npm//fs-extra/-/fs-extra-0.6.4.tgz#f46f0c75b7841f8d200b3348cd4d691d5a099d15" + dependencies: + jsonfile "~1.0.1" + mkdirp "0.3.x" +@@ -1524,24 +1524,24 @@ + + fs.realpath@^1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" ++ resolved "https://repo.huaweicloud.com/repository/npm//fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + + fsevents@^1.0.0: + version "1.1.1" +- resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.1.tgz#f19fd28f43eeaf761680e519a203c4d0b3d31aff" ++ resolved "https://repo.huaweicloud.com/repository/npm//fsevents/-/fsevents-1.1.1.tgz#f19fd28f43eeaf761680e519a203c4d0b3d31aff" + dependencies: + nan "^2.3.0" + node-pre-gyp "^0.6.29" + + fsevents@~0.3.1: + version "0.3.8" +- resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-0.3.8.tgz#9992f1032c925c829554d0d59801dca0313a5356" ++ resolved "https://repo.huaweicloud.com/repository/npm//fsevents/-/fsevents-0.3.8.tgz#9992f1032c925c829554d0d59801dca0313a5356" + dependencies: + nan "^2.0.2" + + fstream-ignore@^1.0.5: + version "1.0.5" +- resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" ++ resolved "https://repo.huaweicloud.com/repository/npm//fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" + dependencies: + fstream "^1.0.0" + inherits "2" +@@ -1549,7 +1549,7 @@ + + fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2: + version "1.0.11" +- resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" ++ resolved "https://repo.huaweicloud.com/repository/npm//fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" + dependencies: + graceful-fs "^4.1.2" + inherits "~2.0.0" +@@ -1558,7 +1558,7 @@ + + gauge@~2.7.1: + version "2.7.3" +- resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.3.tgz#1c23855f962f17b3ad3d0dc7443f304542edfe09" ++ resolved "https://repo.huaweicloud.com/repository/npm//gauge/-/gauge-2.7.3.tgz#1c23855f962f17b3ad3d0dc7443f304542edfe09" + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" +@@ -1571,42 +1571,42 @@ + + get-stdin@^4.0.1: + version "4.0.1" +- resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" ++ resolved "https://repo.huaweicloud.com/repository/npm//get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" + + get-stream@^3.0.0: + version "3.0.0" +- resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" ++ resolved "https://repo.huaweicloud.com/repository/npm//get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= + + getpass@^0.1.1: + version "0.1.6" +- resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.6.tgz#283ffd9fc1256840875311c1b60e8c40187110e6" ++ resolved "https://repo.huaweicloud.com/repository/npm//getpass/-/getpass-0.1.6.tgz#283ffd9fc1256840875311c1b60e8c40187110e6" + dependencies: + assert-plus "^1.0.0" + + glob-base@^0.3.0: + version "0.3.0" +- resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" ++ resolved "https://repo.huaweicloud.com/repository/npm//glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" + dependencies: + glob-parent "^2.0.0" + is-glob "^2.0.0" + + glob-parent@^2.0.0: + version "2.0.0" +- resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" ++ resolved "https://repo.huaweicloud.com/repository/npm//glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" + dependencies: + is-glob "^2.0.0" + + glob@3.2.11, glob@3.x, glob@~3.2.3: + version "3.2.11" +- resolved "https://registry.yarnpkg.com/glob/-/glob-3.2.11.tgz#4a973f635b9190f715d10987d5c00fd2815ebe3d" ++ resolved "https://repo.huaweicloud.com/repository/npm//glob/-/glob-3.2.11.tgz#4a973f635b9190f715d10987d5c00fd2815ebe3d" + dependencies: + inherits "2" + minimatch "0.3" + + glob@5.x: + version "5.0.15" +- resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" ++ resolved "https://repo.huaweicloud.com/repository/npm//glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" + dependencies: + inflight "^1.0.4" + inherits "2" +@@ -1616,7 +1616,7 @@ + + glob@^7.0.5, glob@^7.1.1: + version "7.1.1" +- resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" ++ resolved "https://repo.huaweicloud.com/repository/npm//glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" +@@ -1627,11 +1627,11 @@ + + globals@^9.0.0: + version "9.17.0" +- resolved "https://registry.yarnpkg.com/globals/-/globals-9.17.0.tgz#0c0ca696d9b9bb694d2e5470bd37777caad50286" ++ resolved "https://repo.huaweicloud.com/repository/npm//globals/-/globals-9.17.0.tgz#0c0ca696d9b9bb694d2e5470bd37777caad50286" + + got@^7.1.0: + version "7.1.0" +- resolved "https://registry.yarnpkg.com/got/-/got-7.1.0.tgz#05450fd84094e6bbea56f451a43a9c289166385a" ++ resolved "https://repo.huaweicloud.com/repository/npm//got/-/got-7.1.0.tgz#05450fd84094e6bbea56f451a43a9c289166385a" + integrity sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw== + dependencies: + decompress-response "^3.2.0" +@@ -1651,28 +1651,28 @@ + + graceful-fs@^4.1.2: + version "4.1.11" +- resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" ++ resolved "https://repo.huaweicloud.com/repository/npm//graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" + + graceful-fs@^4.1.6, graceful-fs@^4.1.9: + version "4.2.3" +- resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" ++ resolved "https://repo.huaweicloud.com/repository/npm//graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" + integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== + + graceful-fs@~2.0.0: + version "2.0.3" +- resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-2.0.3.tgz#7cd2cdb228a4a3f36e95efa6cc142de7d1a136d0" ++ resolved "https://repo.huaweicloud.com/repository/npm//graceful-fs/-/graceful-fs-2.0.3.tgz#7cd2cdb228a4a3f36e95efa6cc142de7d1a136d0" + + growl@1.9.2: + version "1.9.2" +- resolved "https://registry.yarnpkg.com/growl/-/growl-1.9.2.tgz#0ea7743715db8d8de2c5ede1775e1b45ac85c02f" ++ resolved "https://repo.huaweicloud.com/repository/npm//growl/-/growl-1.9.2.tgz#0ea7743715db8d8de2c5ede1775e1b45ac85c02f" + + growl@~1.8.1: + version "1.8.1" +- resolved "https://registry.yarnpkg.com/growl/-/growl-1.8.1.tgz#4b2dec8d907e93db336624dcec0183502f8c9428" ++ resolved "https://repo.huaweicloud.com/repository/npm//growl/-/growl-1.8.1.tgz#4b2dec8d907e93db336624dcec0183502f8c9428" + + handlebars@^4.0.1: + version "4.0.6" +- resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.6.tgz#2ce4484850537f9c97a8026d5399b935c4ed4ed7" ++ resolved "https://repo.huaweicloud.com/repository/npm//handlebars/-/handlebars-4.0.6.tgz#2ce4484850537f9c97a8026d5399b935c4ed4ed7" + dependencies: + async "^1.4.0" + optimist "^0.6.1" +@@ -1682,54 +1682,54 @@ + + har-schema@^1.0.5: + version "1.0.5" +- resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" ++ resolved "https://repo.huaweicloud.com/repository/npm//har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" + + har-validator@~4.2.1: + version "4.2.1" +- resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a" ++ resolved "https://repo.huaweicloud.com/repository/npm//har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a" + dependencies: + ajv "^4.9.1" + har-schema "^1.0.5" + + has-ansi@^2.0.0: + version "2.0.0" +- resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" ++ resolved "https://repo.huaweicloud.com/repository/npm//has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + dependencies: + ansi-regex "^2.0.0" + + has-binary@0.1.7: + version "0.1.7" +- resolved "https://registry.yarnpkg.com/has-binary/-/has-binary-0.1.7.tgz#68e61eb16210c9545a0a5cce06a873912fe1e68c" ++ resolved "https://repo.huaweicloud.com/repository/npm//has-binary/-/has-binary-0.1.7.tgz#68e61eb16210c9545a0a5cce06a873912fe1e68c" + dependencies: + isarray "0.0.1" + + has-cors@1.1.0: + version "1.1.0" +- resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39" ++ resolved "https://repo.huaweicloud.com/repository/npm//has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39" + + has-flag@^1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" ++ resolved "https://repo.huaweicloud.com/repository/npm//has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" + + has-symbol-support-x@^1.4.1: + version "1.4.2" +- resolved "https://registry.yarnpkg.com/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz#1409f98bc00247da45da67cee0a36f282ff26455" ++ resolved "https://repo.huaweicloud.com/repository/npm//has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz#1409f98bc00247da45da67cee0a36f282ff26455" + integrity sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw== + + has-to-string-tag-x@^1.2.0: + version "1.4.1" +- resolved "https://registry.yarnpkg.com/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz#a045ab383d7b4b2012a00148ab0aa5f290044d4d" ++ resolved "https://repo.huaweicloud.com/repository/npm//has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz#a045ab383d7b4b2012a00148ab0aa5f290044d4d" + integrity sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw== + dependencies: + has-symbol-support-x "^1.4.1" + + has-unicode@^2.0.0: + version "2.0.1" +- resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" ++ resolved "https://repo.huaweicloud.com/repository/npm//has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + + hasha@^2.2.0: + version "2.2.0" +- resolved "https://registry.yarnpkg.com/hasha/-/hasha-2.2.0.tgz#78d7cbfc1e6d66303fe79837365984517b2f6ee1" ++ resolved "https://repo.huaweicloud.com/repository/npm//hasha/-/hasha-2.2.0.tgz#78d7cbfc1e6d66303fe79837365984517b2f6ee1" + integrity sha1-eNfL/B5tZjA/55g3NlmEUXsvbuE= + dependencies: + is-stream "^1.0.1" +@@ -1737,7 +1737,7 @@ + + hawk@~3.1.3: + version "3.1.3" +- resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" ++ resolved "https://repo.huaweicloud.com/repository/npm//hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" + dependencies: + boom "2.x.x" + cryptiles "2.x.x" +@@ -1746,28 +1746,28 @@ + + hoek@2.x.x: + version "2.16.3" +- resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" ++ resolved "https://repo.huaweicloud.com/repository/npm//hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" + + home-or-tmp@^2.0.0: + version "2.0.0" +- resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" ++ resolved "https://repo.huaweicloud.com/repository/npm//home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.1" + + hosted-git-info@^2.1.4: + version "2.4.2" +- resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.4.2.tgz#0076b9f46a270506ddbaaea56496897460612a67" ++ resolved "https://repo.huaweicloud.com/repository/npm//hosted-git-info/-/hosted-git-info-2.4.2.tgz#0076b9f46a270506ddbaaea56496897460612a67" + + html-encoding-sniffer@^1.0.1: + version "1.0.1" +- resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.1.tgz#79bf7a785ea495fe66165e734153f363ff5437da" ++ resolved "https://repo.huaweicloud.com/repository/npm//html-encoding-sniffer/-/html-encoding-sniffer-1.0.1.tgz#79bf7a785ea495fe66165e734153f363ff5437da" + dependencies: + whatwg-encoding "^1.0.1" + + http-errors@~1.6.1: + version "1.6.1" +- resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.1.tgz#5f8b8ed98aca545656bf572997387f904a722257" ++ resolved "https://repo.huaweicloud.com/repository/npm//http-errors/-/http-errors-1.6.1.tgz#5f8b8ed98aca545656bf572997387f904a722257" + dependencies: + depd "1.1.0" + inherits "2.0.3" +@@ -1776,14 +1776,14 @@ + + http-proxy@^1.13.0: + version "1.16.2" +- resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.16.2.tgz#06dff292952bf64dbe8471fa9df73066d4f37742" ++ resolved "https://repo.huaweicloud.com/repository/npm//http-proxy/-/http-proxy-1.16.2.tgz#06dff292952bf64dbe8471fa9df73066d4f37742" + dependencies: + eventemitter3 "1.x.x" + requires-port "1.x.x" + + http-signature@~1.1.0: + version "1.1.1" +- resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" ++ resolved "https://repo.huaweicloud.com/repository/npm//http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" + dependencies: + assert-plus "^0.2.0" + jsprim "^1.2.2" +@@ -1791,7 +1791,7 @@ + + ibrik@~2.0.0: + version "2.0.0" +- resolved "https://registry.yarnpkg.com/ibrik/-/ibrik-2.0.0.tgz#89a2434f2a5c82b92166c3d97de3b5636eea2e9c" ++ resolved "https://repo.huaweicloud.com/repository/npm//ibrik/-/ibrik-2.0.0.tgz#89a2434f2a5c82b92166c3d97de3b5636eea2e9c" + dependencies: + coffee-script "~1.8.0" + esprima "1.2.x" +@@ -1805,45 +1805,45 @@ + + iconv-lite@0.4.13: + version "0.4.13" +- resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.13.tgz#1f88aba4ab0b1508e8312acc39345f36e992e2f2" ++ resolved "https://repo.huaweicloud.com/repository/npm//iconv-lite/-/iconv-lite-0.4.13.tgz#1f88aba4ab0b1508e8312acc39345f36e992e2f2" + + iconv-lite@0.4.15: + version "0.4.15" +- resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.15.tgz#fe265a218ac6a57cfe854927e9d04c19825eddeb" ++ resolved "https://repo.huaweicloud.com/repository/npm//iconv-lite/-/iconv-lite-0.4.15.tgz#fe265a218ac6a57cfe854927e9d04c19825eddeb" + + indent-string@^2.1.0: + version "2.1.0" +- resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" ++ resolved "https://repo.huaweicloud.com/repository/npm//indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" + dependencies: + repeating "^2.0.0" + + indexof@0.0.1: + version "0.0.1" +- resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" ++ resolved "https://repo.huaweicloud.com/repository/npm//indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" + + inflight@^1.0.4: + version "1.0.6" +- resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" ++ resolved "https://repo.huaweicloud.com/repository/npm//inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + dependencies: + once "^1.3.0" + wrappy "1" + + inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@~2.0.0, inherits@~2.0.1: + version "2.0.3" +- resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" ++ resolved "https://repo.huaweicloud.com/repository/npm//inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + + inherits@^2.0.3, inherits@~2.0.3: + version "2.0.4" +- resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" ++ resolved "https://repo.huaweicloud.com/repository/npm//inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + + ini@~1.3.0: + version "1.3.4" +- resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" ++ resolved "https://repo.huaweicloud.com/repository/npm//ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" + + init-skeleton@~0.2.0: + version "0.2.4" +- resolved "https://registry.yarnpkg.com/init-skeleton/-/init-skeleton-0.2.4.tgz#82655737a62d3b3b0153371c5847209132171863" ++ resolved "https://repo.huaweicloud.com/repository/npm//init-skeleton/-/init-skeleton-0.2.4.tgz#82655737a62d3b3b0153371c5847209132171863" + dependencies: + commander "~2.0.0" + loggy "~0.2.0" +@@ -1853,141 +1853,141 @@ + + invariant@^2.2.0: + version "2.2.2" +- resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" ++ resolved "https://repo.huaweicloud.com/repository/npm//invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" + dependencies: + loose-envify "^1.0.0" + + is-arrayish@^0.2.1: + version "0.2.1" +- resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" ++ resolved "https://repo.huaweicloud.com/repository/npm//is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + + is-binary-path@^1.0.0: + version "1.0.1" +- resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" ++ resolved "https://repo.huaweicloud.com/repository/npm//is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + dependencies: + binary-extensions "^1.0.0" + + is-buffer@^1.0.2: + version "1.1.5" +- resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.5.tgz#1f3b26ef613b214b88cbca23cc6c01d87961eecc" ++ resolved "https://repo.huaweicloud.com/repository/npm//is-buffer/-/is-buffer-1.1.5.tgz#1f3b26ef613b214b88cbca23cc6c01d87961eecc" + + is-builtin-module@^1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" ++ resolved "https://repo.huaweicloud.com/repository/npm//is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" + dependencies: + builtin-modules "^1.0.0" + + is-dotfile@^1.0.0: + version "1.0.2" +- resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.2.tgz#2c132383f39199f8edc268ca01b9b007d205cc4d" ++ resolved "https://repo.huaweicloud.com/repository/npm//is-dotfile/-/is-dotfile-1.0.2.tgz#2c132383f39199f8edc268ca01b9b007d205cc4d" + + is-equal-shallow@^0.1.3: + version "0.1.3" +- resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" ++ resolved "https://repo.huaweicloud.com/repository/npm//is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" + dependencies: + is-primitive "^2.0.0" + + is-extendable@^0.1.1: + version "0.1.1" +- resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" ++ resolved "https://repo.huaweicloud.com/repository/npm//is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + + is-extglob@^1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" ++ resolved "https://repo.huaweicloud.com/repository/npm//is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" + + is-finite@^1.0.0: + version "1.0.2" +- resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" ++ resolved "https://repo.huaweicloud.com/repository/npm//is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" + dependencies: + number-is-nan "^1.0.0" + + is-fullwidth-code-point@^1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" ++ resolved "https://repo.huaweicloud.com/repository/npm//is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + dependencies: + number-is-nan "^1.0.0" + + is-glob@^2.0.0, is-glob@^2.0.1: + version "2.0.1" +- resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" ++ resolved "https://repo.huaweicloud.com/repository/npm//is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" + dependencies: + is-extglob "^1.0.0" + + is-number@^0.1.1: + version "0.1.1" +- resolved "https://registry.yarnpkg.com/is-number/-/is-number-0.1.1.tgz#69a7af116963d47206ec9bd9b48a14216f1e3806" ++ resolved "https://repo.huaweicloud.com/repository/npm//is-number/-/is-number-0.1.1.tgz#69a7af116963d47206ec9bd9b48a14216f1e3806" + + is-number@^2.0.2, is-number@^2.1.0: + version "2.1.0" +- resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" ++ resolved "https://repo.huaweicloud.com/repository/npm//is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" + dependencies: + kind-of "^3.0.2" + + is-object@^1.0.1: + version "1.0.1" +- resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.1.tgz#8952688c5ec2ffd6b03ecc85e769e02903083470" ++ resolved "https://repo.huaweicloud.com/repository/npm//is-object/-/is-object-1.0.1.tgz#8952688c5ec2ffd6b03ecc85e769e02903083470" + integrity sha1-iVJojF7C/9awPsyF52ngKQMINHA= + + is-plain-obj@^1.1.0: + version "1.1.0" +- resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" ++ resolved "https://repo.huaweicloud.com/repository/npm//is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= + + is-posix-bracket@^0.1.0: + version "0.1.1" +- resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" ++ resolved "https://repo.huaweicloud.com/repository/npm//is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" + + is-primitive@^2.0.0: + version "2.0.0" +- resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" ++ resolved "https://repo.huaweicloud.com/repository/npm//is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" + + is-retry-allowed@^1.0.0: + version "1.2.0" +- resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4" ++ resolved "https://repo.huaweicloud.com/repository/npm//is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4" + integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg== + + is-stream@^1.0.0, is-stream@^1.0.1: + version "1.1.0" +- resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" ++ resolved "https://repo.huaweicloud.com/repository/npm//is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + + is-typedarray@~1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" ++ resolved "https://repo.huaweicloud.com/repository/npm//is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + + is-utf8@^0.2.0: + version "0.2.1" +- resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" ++ resolved "https://repo.huaweicloud.com/repository/npm//is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + + isarray@0.0.1: + version "0.0.1" +- resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" ++ resolved "https://repo.huaweicloud.com/repository/npm//isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + + isarray@1.0.0, isarray@~1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" ++ resolved "https://repo.huaweicloud.com/repository/npm//isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + + isbinaryfile@^3.0.0: + version "3.0.2" +- resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.2.tgz#4a3e974ec0cba9004d3fc6cde7209ea69368a621" ++ resolved "https://repo.huaweicloud.com/repository/npm//isbinaryfile/-/isbinaryfile-3.0.2.tgz#4a3e974ec0cba9004d3fc6cde7209ea69368a621" + + isexe@^2.0.0: + version "2.0.0" +- resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" ++ resolved "https://repo.huaweicloud.com/repository/npm//isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + + isobject@^2.0.0: + version "2.1.0" +- resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" ++ resolved "https://repo.huaweicloud.com/repository/npm//isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + dependencies: + isarray "1.0.0" + + isstream@~0.1.2: + version "0.1.2" +- resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" ++ resolved "https://repo.huaweicloud.com/repository/npm//isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + + istanbul@~0.3.0, istanbul@~0.3.2: + version "0.3.22" +- resolved "https://registry.yarnpkg.com/istanbul/-/istanbul-0.3.22.tgz#3e164d85021fe19c985d1f0e7ef0c3e22d012eb6" ++ resolved "https://repo.huaweicloud.com/repository/npm//istanbul/-/istanbul-0.3.22.tgz#3e164d85021fe19c985d1f0e7ef0c3e22d012eb6" + dependencies: + abbrev "1.0.x" + async "1.x" +@@ -2006,7 +2006,7 @@ + + isurl@^1.0.0-alpha5: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/isurl/-/isurl-1.0.0.tgz#b27f4f49f3cdaa3ea44a0a5b7f3462e6edc39d67" ++ resolved "https://repo.huaweicloud.com/repository/npm//isurl/-/isurl-1.0.0.tgz#b27f4f49f3cdaa3ea44a0a5b7f3462e6edc39d67" + integrity sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w== + dependencies: + has-to-string-tag-x "^1.2.0" +@@ -2014,41 +2014,41 @@ + + jade@0.26.3: + version "0.26.3" +- resolved "https://registry.yarnpkg.com/jade/-/jade-0.26.3.tgz#8f10d7977d8d79f2f6ff862a81b0513ccb25686c" ++ resolved "https://repo.huaweicloud.com/repository/npm//jade/-/jade-0.26.3.tgz#8f10d7977d8d79f2f6ff862a81b0513ccb25686c" + dependencies: + commander "0.6.1" + mkdirp "0.3.0" + + "javascript-brunch@>= 1.0 < 1.5": + version "1.3.0" +- resolved "https://registry.yarnpkg.com/javascript-brunch/-/javascript-brunch-1.3.0.tgz#c72067f5f6971c6e7e636a139e5fab8f88339b83" ++ resolved "https://repo.huaweicloud.com/repository/npm//javascript-brunch/-/javascript-brunch-1.3.0.tgz#c72067f5f6971c6e7e636a139e5fab8f88339b83" + dependencies: + coffee-script "1.3.3" + + jodid25519@^1.0.0: + version "1.0.2" +- resolved "https://registry.yarnpkg.com/jodid25519/-/jodid25519-1.0.2.tgz#06d4912255093419477d425633606e0e90782967" ++ resolved "https://repo.huaweicloud.com/repository/npm//jodid25519/-/jodid25519-1.0.2.tgz#06d4912255093419477d425633606e0e90782967" + dependencies: + jsbn "~0.1.0" + + js-tokens@^3.0.0: + version "3.0.1" +- resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.1.tgz#08e9f132484a2c45a30907e9dc4d5567b7f114d7" ++ resolved "https://repo.huaweicloud.com/repository/npm//js-tokens/-/js-tokens-3.0.1.tgz#08e9f132484a2c45a30907e9dc4d5567b7f114d7" + + js-yaml@3.x: + version "3.8.3" +- resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.8.3.tgz#33a05ec481c850c8875929166fe1beb61c728766" ++ resolved "https://repo.huaweicloud.com/repository/npm//js-yaml/-/js-yaml-3.8.3.tgz#33a05ec481c850c8875929166fe1beb61c728766" + dependencies: + argparse "^1.0.7" + esprima "^3.1.1" + + jsbn@~0.1.0: + version "0.1.1" +- resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" ++ resolved "https://repo.huaweicloud.com/repository/npm//jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + + jsdom@^9.0.0: + version "9.12.0" +- resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-9.12.0.tgz#e8c546fffcb06c00d4833ca84410fed7f8a097d4" ++ resolved "https://repo.huaweicloud.com/repository/npm//jsdom/-/jsdom-9.12.0.tgz#e8c546fffcb06c00d4833ca84410fed7f8a097d4" + dependencies: + abab "^1.0.3" + acorn "^4.0.4" +@@ -2072,52 +2072,52 @@ + + jsesc@^1.3.0: + version "1.3.0" +- resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" ++ resolved "https://repo.huaweicloud.com/repository/npm//jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" + + jsesc@~0.5.0: + version "0.5.0" +- resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" ++ resolved "https://repo.huaweicloud.com/repository/npm//jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + + json-schema@0.2.3: + version "0.2.3" +- resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" ++ resolved "https://repo.huaweicloud.com/repository/npm//json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + + json-stable-stringify@^1.0.1: + version "1.0.1" +- resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" ++ resolved "https://repo.huaweicloud.com/repository/npm//json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" + dependencies: + jsonify "~0.0.0" + + json-stringify-safe@~5.0.1: + version "5.0.1" +- resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" ++ resolved "https://repo.huaweicloud.com/repository/npm//json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + + json3@3.3.2: + version "3.3.2" +- resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" ++ resolved "https://repo.huaweicloud.com/repository/npm//json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" + + json5@^0.5.0: + version "0.5.1" +- resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" ++ resolved "https://repo.huaweicloud.com/repository/npm//json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + + jsonfile@^2.1.0: + version "2.4.0" +- resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" ++ resolved "https://repo.huaweicloud.com/repository/npm//jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" + integrity sha1-NzaitCi4e72gzIO1P6PWM6NcKug= + optionalDependencies: + graceful-fs "^4.1.6" + + jsonfile@~1.0.1: + version "1.0.1" +- resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-1.0.1.tgz#ea5efe40b83690b98667614a7392fc60e842c0dd" ++ resolved "https://repo.huaweicloud.com/repository/npm//jsonfile/-/jsonfile-1.0.1.tgz#ea5efe40b83690b98667614a7392fc60e842c0dd" + + jsonify@~0.0.0: + version "0.0.0" +- resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" ++ resolved "https://repo.huaweicloud.com/repository/npm//jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + + jsprim@^1.2.2: + version "1.4.0" +- resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.0.tgz#a3b87e40298d8c380552d8cc7628a0bb95a22918" ++ resolved "https://repo.huaweicloud.com/repository/npm//jsprim/-/jsprim-1.4.0.tgz#a3b87e40298d8c380552d8cc7628a0bb95a22918" + dependencies: + assert-plus "1.0.0" + extsprintf "1.0.2" +@@ -2126,31 +2126,31 @@ + + karma-babel-preprocessor@^6.0.1: + version "6.0.1" +- resolved "https://registry.yarnpkg.com/karma-babel-preprocessor/-/karma-babel-preprocessor-6.0.1.tgz#7ae1d3e64950dbe11f421b74040ab08fb5a66c21" ++ resolved "https://repo.huaweicloud.com/repository/npm//karma-babel-preprocessor/-/karma-babel-preprocessor-6.0.1.tgz#7ae1d3e64950dbe11f421b74040ab08fb5a66c21" + dependencies: + babel-core "^6.0.0" + + karma-chai@~0.1.0: + version "0.1.0" +- resolved "https://registry.yarnpkg.com/karma-chai/-/karma-chai-0.1.0.tgz#bee5ad40400517811ae34bb945f762909108b79a" ++ resolved "https://repo.huaweicloud.com/repository/npm//karma-chai/-/karma-chai-0.1.0.tgz#bee5ad40400517811ae34bb945f762909108b79a" + + karma-chrome-launcher@^3.1.0: + version "3.1.0" +- resolved "https://registry.yarnpkg.com/karma-chrome-launcher/-/karma-chrome-launcher-3.1.0.tgz#805a586799a4d05f4e54f72a204979f3f3066738" ++ resolved "https://repo.huaweicloud.com/repository/npm//karma-chrome-launcher/-/karma-chrome-launcher-3.1.0.tgz#805a586799a4d05f4e54f72a204979f3f3066738" + integrity sha512-3dPs/n7vgz1rxxtynpzZTvb9y/GIaW8xjAwcIGttLbycqoFtI7yo1NGnQi6oFTherRE+GIhCAHZC4vEqWGhNvg== + dependencies: + which "^1.2.1" + + karma-commonjs-require@~0.0.3: + version "0.0.3" +- resolved "https://registry.yarnpkg.com/karma-commonjs-require/-/karma-commonjs-require-0.0.3.tgz#3b8426535b84b4635ec11fc238f5fe4b24ec0241" ++ resolved "https://repo.huaweicloud.com/repository/npm//karma-commonjs-require/-/karma-commonjs-require-0.0.3.tgz#3b8426535b84b4635ec11fc238f5fe4b24ec0241" + integrity sha1-O4QmU1uEtGNewR/COPX+SyTsAkE= + dependencies: + commonjs-require-definition "~0.1.0" + + karma-coverage@~0.2.0: + version "0.2.7" +- resolved "https://registry.yarnpkg.com/karma-coverage/-/karma-coverage-0.2.7.tgz#f76740b275bbf30a0ab9f41d8cf56843a0994576" ++ resolved "https://repo.huaweicloud.com/repository/npm//karma-coverage/-/karma-coverage-0.2.7.tgz#f76740b275bbf30a0ab9f41d8cf56843a0994576" + dependencies: + dateformat "~1.0.6" + ibrik "~2.0.0" +@@ -2159,17 +2159,17 @@ + + karma-ember-precompiler-brunch@^1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/karma-ember-precompiler-brunch/-/karma-ember-precompiler-brunch-1.0.0.tgz#d7753a71c47d2de5f930f10da1262b602303b770" ++ resolved "https://repo.huaweicloud.com/repository/npm//karma-ember-precompiler-brunch/-/karma-ember-precompiler-brunch-1.0.0.tgz#d7753a71c47d2de5f930f10da1262b602303b770" + dependencies: + jsdom "^9.0.0" + + karma-mocha@0.1.1: + version "0.1.1" +- resolved "https://registry.yarnpkg.com/karma-mocha/-/karma-mocha-0.1.1.tgz#5edddb3e2d2c6fd47e9ad26f0af1595fe852c756" ++ resolved "https://repo.huaweicloud.com/repository/npm//karma-mocha/-/karma-mocha-0.1.1.tgz#5edddb3e2d2c6fd47e9ad26f0af1595fe852c756" + + karma-phantomjs-launcher@1.0.2: + version "1.0.2" +- resolved "https://registry.yarnpkg.com/karma-phantomjs-launcher/-/karma-phantomjs-launcher-1.0.2.tgz#19e1041498fd75563ed86730a22c1fe579fa8fb1" ++ resolved "https://repo.huaweicloud.com/repository/npm//karma-phantomjs-launcher/-/karma-phantomjs-launcher-1.0.2.tgz#19e1041498fd75563ed86730a22c1fe579fa8fb1" + integrity sha1-GeEEFJj9dVY+2Gcwoiwf5Xn6j7E= + dependencies: + lodash "^4.0.1" +@@ -2177,11 +2177,11 @@ + + karma-sinon@~1.0.2: + version "1.0.5" +- resolved "https://registry.yarnpkg.com/karma-sinon/-/karma-sinon-1.0.5.tgz#4e3443f2830fdecff624d3747163f1217daa2a9a" ++ resolved "https://repo.huaweicloud.com/repository/npm//karma-sinon/-/karma-sinon-1.0.5.tgz#4e3443f2830fdecff624d3747163f1217daa2a9a" + + karma@>=0.11.14: + version "1.6.0" +- resolved "https://registry.yarnpkg.com/karma/-/karma-1.6.0.tgz#0e871d4527d5eac56c41d181f03c5c0a7e6dbf3e" ++ resolved "https://repo.huaweicloud.com/repository/npm//karma/-/karma-1.6.0.tgz#0e871d4527d5eac56c41d181f03c5c0a7e6dbf3e" + dependencies: + bluebird "^3.3.0" + body-parser "^1.16.1" +@@ -2213,60 +2213,60 @@ + + kew@^0.7.0: + version "0.7.0" +- resolved "https://registry.yarnpkg.com/kew/-/kew-0.7.0.tgz#79d93d2d33363d6fdd2970b335d9141ad591d79b" ++ resolved "https://repo.huaweicloud.com/repository/npm//kew/-/kew-0.7.0.tgz#79d93d2d33363d6fdd2970b335d9141ad591d79b" + integrity sha1-edk9LTM2PW/dKXCzNdkUGtWR15s= + + keypress@0.1.x: + version "0.1.0" +- resolved "https://registry.yarnpkg.com/keypress/-/keypress-0.1.0.tgz#4a3188d4291b66b4f65edb99f806aa9ae293592a" ++ resolved "https://repo.huaweicloud.com/repository/npm//keypress/-/keypress-0.1.0.tgz#4a3188d4291b66b4f65edb99f806aa9ae293592a" + + kind-of@^3.0.2: + version "3.1.0" +- resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.1.0.tgz#475d698a5e49ff5e53d14e3e732429dc8bf4cf47" ++ resolved "https://repo.huaweicloud.com/repository/npm//kind-of/-/kind-of-3.1.0.tgz#475d698a5e49ff5e53d14e3e732429dc8bf4cf47" + dependencies: + is-buffer "^1.0.2" + + klaw@^1.0.0: + version "1.3.1" +- resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" ++ resolved "https://repo.huaweicloud.com/repository/npm//klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" + integrity sha1-QIhDO0azsbolnXh4XY6W9zugJDk= + optionalDependencies: + graceful-fs "^4.1.9" + + lazy-cache@^1.0.3: + version "1.0.4" +- resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" ++ resolved "https://repo.huaweicloud.com/repository/npm//lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" + + "less-brunch@>= 1.0 < 1.5": + version "1.4.1" +- resolved "https://registry.yarnpkg.com/less-brunch/-/less-brunch-1.4.1.tgz#f6cc957280187b4008ccb829089d0f0fcdb08a6d" ++ resolved "https://repo.huaweicloud.com/repository/npm//less-brunch/-/less-brunch-1.4.1.tgz#f6cc957280187b4008ccb829089d0f0fcdb08a6d" + dependencies: + coffee-script "1.3.3" + less "1.3.x" + + less@1.3.x: + version "1.3.3" +- resolved "https://registry.yarnpkg.com/less/-/less-1.3.3.tgz#7ee8f300a41080f3544c80c7a70cdf6a61280cf9" ++ resolved "https://repo.huaweicloud.com/repository/npm//less/-/less-1.3.3.tgz#7ee8f300a41080f3544c80c7a70cdf6a61280cf9" + optionalDependencies: + ycssmin ">=1.0.1" + + levn@~0.2.5: + version "0.2.5" +- resolved "https://registry.yarnpkg.com/levn/-/levn-0.2.5.tgz#ba8d339d0ca4a610e3a3f145b9caf48807155054" ++ resolved "https://repo.huaweicloud.com/repository/npm//levn/-/levn-0.2.5.tgz#ba8d339d0ca4a610e3a3f145b9caf48807155054" + dependencies: + prelude-ls "~1.1.0" + type-check "~0.3.1" + + levn@~0.3.0: + version "0.3.0" +- resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" ++ resolved "https://repo.huaweicloud.com/repository/npm//levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + + load-json-file@^1.0.0: + version "1.1.0" +- resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" ++ resolved "https://repo.huaweicloud.com/repository/npm//load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" +@@ -2276,31 +2276,31 @@ + + lodash@^3.8.0: + version "3.10.1" +- resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" ++ resolved "https://repo.huaweicloud.com/repository/npm//lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" + + lodash@^4.0.1: + version "4.17.15" +- resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" ++ resolved "https://repo.huaweicloud.com/repository/npm//lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" + integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== + + lodash@^4.2.0, lodash@^4.5.0: + version "4.17.4" +- resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" ++ resolved "https://repo.huaweicloud.com/repository/npm//lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" + + lodash@~2.4.1: + version "2.4.2" +- resolved "https://registry.yarnpkg.com/lodash/-/lodash-2.4.2.tgz#fadd834b9683073da179b3eae6d9c0d15053f73e" ++ resolved "https://repo.huaweicloud.com/repository/npm//lodash/-/lodash-2.4.2.tgz#fadd834b9683073da179b3eae6d9c0d15053f73e" + + log4js@^0.6.31: + version "0.6.38" +- resolved "https://registry.yarnpkg.com/log4js/-/log4js-0.6.38.tgz#2c494116695d6fb25480943d3fc872e662a522fd" ++ resolved "https://repo.huaweicloud.com/repository/npm//log4js/-/log4js-0.6.38.tgz#2c494116695d6fb25480943d3fc872e662a522fd" + dependencies: + readable-stream "~1.0.2" + semver "~4.3.3" + + loggy@~0.2.0: + version "0.2.2" +- resolved "https://registry.yarnpkg.com/loggy/-/loggy-0.2.2.tgz#7edc85706a82d761ce9cef868f1afbad84165427" ++ resolved "https://repo.huaweicloud.com/repository/npm//loggy/-/loggy-0.2.2.tgz#7edc85706a82d761ce9cef868f1afbad84165427" + dependencies: + ansi-color "~0.2.1" + date-utils "~1.2.17" +@@ -2308,41 +2308,41 @@ + + longest@^1.0.1: + version "1.0.1" +- resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" ++ resolved "https://repo.huaweicloud.com/repository/npm//longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" + + loose-envify@^1.0.0: + version "1.3.1" +- resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" ++ resolved "https://repo.huaweicloud.com/repository/npm//loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" + dependencies: + js-tokens "^3.0.0" + + loud-rejection@^1.0.0: + version "1.6.0" +- resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" ++ resolved "https://repo.huaweicloud.com/repository/npm//loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" + dependencies: + currently-unhandled "^0.4.1" + signal-exit "^3.0.0" + + lowercase-keys@^1.0.0: + version "1.0.1" +- resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" ++ resolved "https://repo.huaweicloud.com/repository/npm//lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" + integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== + + lru-cache@2, lru-cache@2.2.x: + version "2.2.4" +- resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.2.4.tgz#6c658619becf14031d0d0b594b16042ce4dc063d" ++ resolved "https://repo.huaweicloud.com/repository/npm//lru-cache/-/lru-cache-2.2.4.tgz#6c658619becf14031d0d0b594b16042ce4dc063d" + + map-obj@^1.0.0, map-obj@^1.0.1: + version "1.0.1" +- resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" ++ resolved "https://repo.huaweicloud.com/repository/npm//map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" + + media-typer@0.3.0: + version "0.3.0" +- resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" ++ resolved "https://repo.huaweicloud.com/repository/npm//media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + + meow@^3.3.0: + version "3.7.0" +- resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" ++ resolved "https://repo.huaweicloud.com/repository/npm//meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" + dependencies: + camelcase-keys "^2.0.0" + decamelize "^1.1.2" +@@ -2357,11 +2357,11 @@ + + methods@0.0.1: + version "0.0.1" +- resolved "https://registry.yarnpkg.com/methods/-/methods-0.0.1.tgz#277c90f8bef39709645a8371c51c3b6c648e068c" ++ resolved "https://repo.huaweicloud.com/repository/npm//methods/-/methods-0.0.1.tgz#277c90f8bef39709645a8371c51c3b6c648e068c" + + micromatch@^2.1.5: + version "2.3.11" +- resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" ++ resolved "https://repo.huaweicloud.com/repository/npm//micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" + dependencies: + arr-diff "^2.0.0" + array-unique "^0.2.1" +@@ -2379,93 +2379,93 @@ + + mime-db@~1.27.0: + version "1.27.0" +- resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.27.0.tgz#820f572296bbd20ec25ed55e5b5de869e5436eb1" ++ resolved "https://repo.huaweicloud.com/repository/npm//mime-db/-/mime-db-1.27.0.tgz#820f572296bbd20ec25ed55e5b5de869e5436eb1" + + mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.15, mime-types@~2.1.7: + version "2.1.15" +- resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.15.tgz#a4ebf5064094569237b8cf70046776d09fc92aed" ++ resolved "https://repo.huaweicloud.com/repository/npm//mime-types/-/mime-types-2.1.15.tgz#a4ebf5064094569237b8cf70046776d09fc92aed" + dependencies: + mime-db "~1.27.0" + + mime@1.2.4: + version "1.2.4" +- resolved "https://registry.yarnpkg.com/mime/-/mime-1.2.4.tgz#11b5fdaf29c2509255176b80ad520294f5de92b7" ++ resolved "https://repo.huaweicloud.com/repository/npm//mime/-/mime-1.2.4.tgz#11b5fdaf29c2509255176b80ad520294f5de92b7" + + "mime@>= 0.0.1", mime@^1.3.4: + version "1.3.4" +- resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53" ++ resolved "https://repo.huaweicloud.com/repository/npm//mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53" + + mime@~1.2.9: + version "1.2.11" +- resolved "https://registry.yarnpkg.com/mime/-/mime-1.2.11.tgz#58203eed86e3a5ef17aed2b7d9ebd47f0a60dd10" ++ resolved "https://repo.huaweicloud.com/repository/npm//mime/-/mime-1.2.11.tgz#58203eed86e3a5ef17aed2b7d9ebd47f0a60dd10" + + mimic-response@^1.0.0: + version "1.0.1" +- resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" ++ resolved "https://repo.huaweicloud.com/repository/npm//mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" + integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== + + minimatch@0.3, minimatch@0.x, minimatch@~0.3.0: + version "0.3.0" +- resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.3.0.tgz#275d8edaac4f1bb3326472089e7949c8394699dd" ++ resolved "https://repo.huaweicloud.com/repository/npm//minimatch/-/minimatch-0.3.0.tgz#275d8edaac4f1bb3326472089e7949c8394699dd" + dependencies: + lru-cache "2" + sigmund "~1.0.0" + + "minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2: + version "3.0.3" +- resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774" ++ resolved "https://repo.huaweicloud.com/repository/npm//minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774" + dependencies: + brace-expansion "^1.0.0" + + minimatch@2.x: + version "2.0.10" +- resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-2.0.10.tgz#8d087c39c6b38c001b97fca7ce6d0e1e80afbac7" ++ resolved "https://repo.huaweicloud.com/repository/npm//minimatch/-/minimatch-2.0.10.tgz#8d087c39c6b38c001b97fca7ce6d0e1e80afbac7" + dependencies: + brace-expansion "^1.0.0" + + minimatch@~0.2.12: + version "0.2.14" +- resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.2.14.tgz#c74e780574f63c6f9a090e90efbe6ef53a6a756a" ++ resolved "https://repo.huaweicloud.com/repository/npm//minimatch/-/minimatch-0.2.14.tgz#c74e780574f63c6f9a090e90efbe6ef53a6a756a" + dependencies: + lru-cache "2" + sigmund "~1.0.0" + + minimatch@~1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-1.0.0.tgz#e0dd2120b49e1b724ce8d714c520822a9438576d" ++ resolved "https://repo.huaweicloud.com/repository/npm//minimatch/-/minimatch-1.0.0.tgz#e0dd2120b49e1b724ce8d714c520822a9438576d" + dependencies: + lru-cache "2" + sigmund "~1.0.0" + + minimist@0.0.8, minimist@~0.0.1: + version "0.0.8" +- resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" ++ resolved "https://repo.huaweicloud.com/repository/npm//minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + + minimist@^1.1.3, minimist@^1.2.0: + version "1.2.0" +- resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" ++ resolved "https://repo.huaweicloud.com/repository/npm//minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + + mkdirp@0.3.0: + version "0.3.0" +- resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.0.tgz#1bbf5ab1ba827af23575143490426455f481fe1e" ++ resolved "https://repo.huaweicloud.com/repository/npm//mkdirp/-/mkdirp-0.3.0.tgz#1bbf5ab1ba827af23575143490426455f481fe1e" + + mkdirp@0.3.4: + version "0.3.4" +- resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.4.tgz#f8c81d213b7299a031f193a57d752a17d2f6c7d8" ++ resolved "https://repo.huaweicloud.com/repository/npm//mkdirp/-/mkdirp-0.3.4.tgz#f8c81d213b7299a031f193a57d752a17d2f6c7d8" + + mkdirp@0.3.5, mkdirp@0.3.x, mkdirp@~0.3.5: + version "0.3.5" +- resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.5.tgz#de3e5f8961c88c787ee1368df849ac4413eca8d7" ++ resolved "https://repo.huaweicloud.com/repository/npm//mkdirp/-/mkdirp-0.3.5.tgz#de3e5f8961c88c787ee1368df849ac4413eca8d7" + + mkdirp@0.5.1, mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.1, mkdirp@~0.5.0: + version "0.5.1" +- resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" ++ resolved "https://repo.huaweicloud.com/repository/npm//mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + dependencies: + minimist "0.0.8" + + mocha@2.5.3: + version "2.5.3" +- resolved "https://registry.yarnpkg.com/mocha/-/mocha-2.5.3.tgz#161be5bdeb496771eb9b35745050b622b5aefc58" ++ resolved "https://repo.huaweicloud.com/repository/npm//mocha/-/mocha-2.5.3.tgz#161be5bdeb496771eb9b35745050b622b5aefc58" + dependencies: + commander "2.3.0" + debug "2.2.0" +@@ -2480,32 +2480,32 @@ + + ms@0.7.1: + version "0.7.1" +- resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" ++ resolved "https://repo.huaweicloud.com/repository/npm//ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" + + ms@0.7.2: + version "0.7.2" +- resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765" ++ resolved "https://repo.huaweicloud.com/repository/npm//ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765" + + ms@2.0.0: + version "2.0.0" +- resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" ++ resolved "https://repo.huaweicloud.com/repository/npm//ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + + nan@^2.0.2, nan@^2.3.0: + version "2.6.2" +- resolved "https://registry.yarnpkg.com/nan/-/nan-2.6.2.tgz#e4ff34e6c95fdfb5aecc08de6596f43605a7db45" ++ resolved "https://repo.huaweicloud.com/repository/npm//nan/-/nan-2.6.2.tgz#e4ff34e6c95fdfb5aecc08de6596f43605a7db45" + + ncp@~0.4.2: + version "0.4.2" +- resolved "https://registry.yarnpkg.com/ncp/-/ncp-0.4.2.tgz#abcc6cbd3ec2ed2a729ff6e7c1fa8f01784a8574" ++ resolved "https://repo.huaweicloud.com/repository/npm//ncp/-/ncp-0.4.2.tgz#abcc6cbd3ec2ed2a729ff6e7c1fa8f01784a8574" + + negotiator@0.6.1: + version "0.6.1" +- resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" ++ resolved "https://repo.huaweicloud.com/repository/npm//negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" + + node-pre-gyp@^0.6.29: + version "0.6.34" +- resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.34.tgz#94ad1c798a11d7fc67381b50d47f8cc18d9799f7" ++ resolved "https://repo.huaweicloud.com/repository/npm//node-pre-gyp/-/node-pre-gyp-0.6.34.tgz#94ad1c798a11d7fc67381b50d47f8cc18d9799f7" + dependencies: + mkdirp "^0.5.1" + nopt "^4.0.1" +@@ -2519,20 +2519,20 @@ + + nopt@3.x: + version "3.0.6" +- resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" ++ resolved "https://repo.huaweicloud.com/repository/npm//nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" + dependencies: + abbrev "1" + + nopt@^4.0.1: + version "4.0.1" +- resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" ++ resolved "https://repo.huaweicloud.com/repository/npm//nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" + dependencies: + abbrev "1" + osenv "^0.1.4" + + normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: + version "2.3.8" +- resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.3.8.tgz#d819eda2a9dedbd1ffa563ea4071d936782295bb" ++ resolved "https://repo.huaweicloud.com/repository/npm//normalize-package-data/-/normalize-package-data-2.3.8.tgz#d819eda2a9dedbd1ffa563ea4071d936782295bb" + dependencies: + hosted-git-info "^2.1.4" + is-builtin-module "^1.0.0" +@@ -2541,13 +2541,13 @@ + + normalize-path@^2.0.1: + version "2.1.1" +- resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" ++ resolved "https://repo.huaweicloud.com/repository/npm//normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + dependencies: + remove-trailing-separator "^1.0.1" + + npmlog@^4.0.2: + version "4.0.2" +- resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.0.2.tgz#d03950e0e78ce1527ba26d2a7592e9348ac3e75f" ++ resolved "https://repo.huaweicloud.com/repository/npm//npmlog/-/npmlog-4.0.2.tgz#d03950e0e78ce1527ba26d2a7592e9348ac3e75f" + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" +@@ -2556,59 +2556,59 @@ + + number-is-nan@^1.0.0: + version "1.0.1" +- resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" ++ resolved "https://repo.huaweicloud.com/repository/npm//number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + + "nwmatcher@>= 1.3.9 < 2.0.0": + version "1.3.9" +- resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.3.9.tgz#8bab486ff7fa3dfd086656bbe8b17116d3692d2a" ++ resolved "https://repo.huaweicloud.com/repository/npm//nwmatcher/-/nwmatcher-1.3.9.tgz#8bab486ff7fa3dfd086656bbe8b17116d3692d2a" + + oauth-sign@~0.8.1: + version "0.8.2" +- resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" ++ resolved "https://repo.huaweicloud.com/repository/npm//oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" + + object-assign@4.1.0, object-assign@^4.0.1, object-assign@^4.1.0: + version "4.1.0" +- resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0" ++ resolved "https://repo.huaweicloud.com/repository/npm//object-assign/-/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0" + + object-component@0.0.3: + version "0.0.3" +- resolved "https://registry.yarnpkg.com/object-component/-/object-component-0.0.3.tgz#f0c69aa50efc95b866c186f400a33769cb2f1291" ++ resolved "https://repo.huaweicloud.com/repository/npm//object-component/-/object-component-0.0.3.tgz#f0c69aa50efc95b866c186f400a33769cb2f1291" + + object.omit@^2.0.0: + version "2.0.1" +- resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" ++ resolved "https://repo.huaweicloud.com/repository/npm//object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" + dependencies: + for-own "^0.1.4" + is-extendable "^0.1.1" + + on-finished@~2.3.0: + version "2.3.0" +- resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" ++ resolved "https://repo.huaweicloud.com/repository/npm//on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + dependencies: + ee-first "1.1.1" + + once@1.x, once@^1.3.0, once@^1.3.3: + version "1.4.0" +- resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" ++ resolved "https://repo.huaweicloud.com/repository/npm//once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + dependencies: + wrappy "1" + + optimist@0.3.x: + version "0.3.7" +- resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.3.7.tgz#c90941ad59e4273328923074d2cf2e7cbc6ec0d9" ++ resolved "https://repo.huaweicloud.com/repository/npm//optimist/-/optimist-0.3.7.tgz#c90941ad59e4273328923074d2cf2e7cbc6ec0d9" + dependencies: + wordwrap "~0.0.2" + + optimist@^0.6.1, optimist@~0.6.1: + version "0.6.1" +- resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" ++ resolved "https://repo.huaweicloud.com/repository/npm//optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" + dependencies: + minimist "~0.0.1" + wordwrap "~0.0.2" + + optionator@^0.5.0: + version "0.5.0" +- resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.5.0.tgz#b75a8995a2d417df25b6e4e3862f50aa88651368" ++ resolved "https://repo.huaweicloud.com/repository/npm//optionator/-/optionator-0.5.0.tgz#b75a8995a2d417df25b6e4e3862f50aa88651368" + dependencies: + deep-is "~0.1.2" + fast-levenshtein "~1.0.0" +@@ -2619,7 +2619,7 @@ + + optionator@^0.8.1: + version "0.8.2" +- resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" ++ resolved "https://repo.huaweicloud.com/repository/npm//optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.4" +@@ -2630,43 +2630,43 @@ + + options@>=0.0.5: + version "0.0.6" +- resolved "https://registry.yarnpkg.com/options/-/options-0.0.6.tgz#ec22d312806bb53e731773e7cdaefcf1c643128f" ++ resolved "https://repo.huaweicloud.com/repository/npm//options/-/options-0.0.6.tgz#ec22d312806bb53e731773e7cdaefcf1c643128f" + + os-homedir@^1.0.0: + version "1.0.2" +- resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" ++ resolved "https://repo.huaweicloud.com/repository/npm//os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + + os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.1, os-tmpdir@~1.0.2: + version "1.0.2" +- resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" ++ resolved "https://repo.huaweicloud.com/repository/npm//os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + + osenv@^0.1.4: + version "0.1.4" +- resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644" ++ resolved "https://repo.huaweicloud.com/repository/npm//osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + + p-cancelable@^0.3.0: + version "0.3.0" +- resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.3.0.tgz#b9e123800bcebb7ac13a479be195b507b98d30fa" ++ resolved "https://repo.huaweicloud.com/repository/npm//p-cancelable/-/p-cancelable-0.3.0.tgz#b9e123800bcebb7ac13a479be195b507b98d30fa" + integrity sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw== + + p-finally@^1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" ++ resolved "https://repo.huaweicloud.com/repository/npm//p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= + + p-timeout@^1.1.1: + version "1.2.1" +- resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-1.2.1.tgz#5eb3b353b7fce99f101a1038880bb054ebbea386" ++ resolved "https://repo.huaweicloud.com/repository/npm//p-timeout/-/p-timeout-1.2.1.tgz#5eb3b353b7fce99f101a1038880bb054ebbea386" + integrity sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y= + dependencies: + p-finally "^1.0.0" + + parse-glob@^3.0.4: + version "3.0.4" +- resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" ++ resolved "https://repo.huaweicloud.com/repository/npm//parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" + dependencies: + glob-base "^0.3.0" + is-dotfile "^1.0.0" +@@ -2675,49 +2675,49 @@ + + parse-json@^2.2.0: + version "2.2.0" +- resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" ++ resolved "https://repo.huaweicloud.com/repository/npm//parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + dependencies: + error-ex "^1.2.0" + + parse5@^1.5.1: + version "1.5.1" +- resolved "https://registry.yarnpkg.com/parse5/-/parse5-1.5.1.tgz#9b7f3b0de32be78dc2401b17573ccaf0f6f59d94" ++ resolved "https://repo.huaweicloud.com/repository/npm//parse5/-/parse5-1.5.1.tgz#9b7f3b0de32be78dc2401b17573ccaf0f6f59d94" + + parsejson@0.0.3: + version "0.0.3" +- resolved "https://registry.yarnpkg.com/parsejson/-/parsejson-0.0.3.tgz#ab7e3759f209ece99437973f7d0f1f64ae0e64ab" ++ resolved "https://repo.huaweicloud.com/repository/npm//parsejson/-/parsejson-0.0.3.tgz#ab7e3759f209ece99437973f7d0f1f64ae0e64ab" + dependencies: + better-assert "~1.0.0" + + parseqs@0.0.5: + version "0.0.5" +- resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.5.tgz#d5208a3738e46766e291ba2ea173684921a8b89d" ++ resolved "https://repo.huaweicloud.com/repository/npm//parseqs/-/parseqs-0.0.5.tgz#d5208a3738e46766e291ba2ea173684921a8b89d" + dependencies: + better-assert "~1.0.0" + + parseuri@0.0.5: + version "0.0.5" +- resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.5.tgz#80204a50d4dbb779bfdc6ebe2778d90e4bce320a" ++ resolved "https://repo.huaweicloud.com/repository/npm//parseuri/-/parseuri-0.0.5.tgz#80204a50d4dbb779bfdc6ebe2778d90e4bce320a" + dependencies: + better-assert "~1.0.0" + + parseurl@~1.3.1: + version "1.3.1" +- resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.1.tgz#c8ab8c9223ba34888aa64a297b28853bec18da56" ++ resolved "https://repo.huaweicloud.com/repository/npm//parseurl/-/parseurl-1.3.1.tgz#c8ab8c9223ba34888aa64a297b28853bec18da56" + + path-exists@^2.0.0: + version "2.1.0" +- resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" ++ resolved "https://repo.huaweicloud.com/repository/npm//path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + dependencies: + pinkie-promise "^2.0.0" + + path-is-absolute@^1.0.0: + version "1.0.1" +- resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" ++ resolved "https://repo.huaweicloud.com/repository/npm//path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + + path-type@^1.0.0: + version "1.1.0" +- resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" ++ resolved "https://repo.huaweicloud.com/repository/npm//path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" + dependencies: + graceful-fs "^4.1.2" + pify "^2.0.0" +@@ -2725,20 +2725,20 @@ + + pause@0.0.1: + version "0.0.1" +- resolved "https://registry.yarnpkg.com/pause/-/pause-0.0.1.tgz#1d408b3fdb76923b9543d96fb4c9dfd535d9cb5d" ++ resolved "https://repo.huaweicloud.com/repository/npm//pause/-/pause-0.0.1.tgz#1d408b3fdb76923b9543d96fb4c9dfd535d9cb5d" + + pend@~1.2.0: + version "1.2.0" +- resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" ++ resolved "https://repo.huaweicloud.com/repository/npm//pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" + integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA= + + performance-now@^0.2.0: + version "0.2.0" +- resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" ++ resolved "https://repo.huaweicloud.com/repository/npm//performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" + + phantomjs-prebuilt@^2.1.7: + version "2.1.16" +- resolved "https://registry.yarnpkg.com/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.16.tgz#efd212a4a3966d3647684ea8ba788549be2aefef" ++ resolved "https://repo.huaweicloud.com/repository/npm//phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.16.tgz#efd212a4a3966d3647684ea8ba788549be2aefef" + integrity sha1-79ISpKOWbTZHaE6ouniFSb4q7+8= + dependencies: + es6-promise "^4.0.3" +@@ -2753,56 +2753,56 @@ + + pify@^2.0.0: + version "2.3.0" +- resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" ++ resolved "https://repo.huaweicloud.com/repository/npm//pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + + pinkie-promise@^2.0.0: + version "2.0.1" +- resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" ++ resolved "https://repo.huaweicloud.com/repository/npm//pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + dependencies: + pinkie "^2.0.0" + + pinkie@^2.0.0: + version "2.0.4" +- resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" ++ resolved "https://repo.huaweicloud.com/repository/npm//pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + + prelude-ls@~1.1.0, prelude-ls@~1.1.1, prelude-ls@~1.1.2: + version "1.1.2" +- resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" ++ resolved "https://repo.huaweicloud.com/repository/npm//prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + + prepend-http@^1.0.1: + version "1.0.4" +- resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" ++ resolved "https://repo.huaweicloud.com/repository/npm//prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" + integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= + + preserve@^0.2.0: + version "0.2.0" +- resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" ++ resolved "https://repo.huaweicloud.com/repository/npm//preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" + + private@^0.1.6: + version "0.1.7" +- resolved "https://registry.yarnpkg.com/private/-/private-0.1.7.tgz#68ce5e8a1ef0a23bb570cc28537b5332aba63ef1" ++ resolved "https://repo.huaweicloud.com/repository/npm//private/-/private-0.1.7.tgz#68ce5e8a1ef0a23bb570cc28537b5332aba63ef1" + + process-nextick-args@~1.0.6: + version "1.0.7" +- resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" ++ resolved "https://repo.huaweicloud.com/repository/npm//process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" + + process-nextick-args@~2.0.0: + version "2.0.1" +- resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" ++ resolved "https://repo.huaweicloud.com/repository/npm//process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + + progress@^1.1.8: + version "1.1.8" +- resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be" ++ resolved "https://repo.huaweicloud.com/repository/npm//progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be" + integrity sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74= + + punycode@^1.4.1: + version "1.4.1" +- resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" ++ resolved "https://repo.huaweicloud.com/repository/npm//punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + + pushserve@~0.1.6: + version "0.1.6" +- resolved "https://registry.yarnpkg.com/pushserve/-/pushserve-0.1.6.tgz#a07b173fc2488b71d9af4a5b37411bb3d91d6e27" ++ resolved "https://repo.huaweicloud.com/repository/npm//pushserve/-/pushserve-0.1.6.tgz#a07b173fc2488b71d9af4a5b37411bb3d91d6e27" + dependencies: + commander "~2.0.0" + connect-slashes "~0.0.9" +@@ -2810,38 +2810,38 @@ + + qjobs@^1.1.4: + version "1.1.5" +- resolved "https://registry.yarnpkg.com/qjobs/-/qjobs-1.1.5.tgz#659de9f2cf8dcc27a1481276f205377272382e73" ++ resolved "https://repo.huaweicloud.com/repository/npm//qjobs/-/qjobs-1.1.5.tgz#659de9f2cf8dcc27a1481276f205377272382e73" + + qs@0.4.x, "qs@>= 0.4.0": + version "0.4.2" +- resolved "https://registry.yarnpkg.com/qs/-/qs-0.4.2.tgz#3cac4c861e371a8c9c4770ac23cda8de639b8e5f" ++ resolved "https://repo.huaweicloud.com/repository/npm//qs/-/qs-0.4.2.tgz#3cac4c861e371a8c9c4770ac23cda8de639b8e5f" + + qs@0.6.5: + version "0.6.5" +- resolved "https://registry.yarnpkg.com/qs/-/qs-0.6.5.tgz#294b268e4b0d4250f6dde19b3b8b34935dff14ef" ++ resolved "https://repo.huaweicloud.com/repository/npm//qs/-/qs-0.6.5.tgz#294b268e4b0d4250f6dde19b3b8b34935dff14ef" + + qs@6.4.0, qs@~6.4.0: + version "6.4.0" +- resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" ++ resolved "https://repo.huaweicloud.com/repository/npm//qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" + + randomatic@^1.1.3: + version "1.1.6" +- resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.6.tgz#110dcabff397e9dcff7c0789ccc0a49adf1ec5bb" ++ resolved "https://repo.huaweicloud.com/repository/npm//randomatic/-/randomatic-1.1.6.tgz#110dcabff397e9dcff7c0789ccc0a49adf1ec5bb" + dependencies: + is-number "^2.0.2" + kind-of "^3.0.2" + + range-parser@0.0.4: + version "0.0.4" +- resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-0.0.4.tgz#c0427ffef51c10acba0782a46c9602e744ff620b" ++ resolved "https://repo.huaweicloud.com/repository/npm//range-parser/-/range-parser-0.0.4.tgz#c0427ffef51c10acba0782a46c9602e744ff620b" + + range-parser@^1.2.0: + version "1.2.0" +- resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" ++ resolved "https://repo.huaweicloud.com/repository/npm//range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" + + raw-body@~2.2.0: + version "2.2.0" +- resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.2.0.tgz#994976cf6a5096a41162840492f0bdc5d6e7fb96" ++ resolved "https://repo.huaweicloud.com/repository/npm//raw-body/-/raw-body-2.2.0.tgz#994976cf6a5096a41162840492f0bdc5d6e7fb96" + dependencies: + bytes "2.4.0" + iconv-lite "0.4.15" +@@ -2849,7 +2849,7 @@ + + rc@^1.1.7: + version "1.2.1" +- resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.1.tgz#2e03e8e42ee450b8cb3dce65be1bf8974e1dfd95" ++ resolved "https://repo.huaweicloud.com/repository/npm//rc/-/rc-1.2.1.tgz#2e03e8e42ee450b8cb3dce65be1bf8974e1dfd95" + dependencies: + deep-extend "~0.4.0" + ini "~1.3.0" +@@ -2858,21 +2858,21 @@ + + read-components@~0.6.0: + version "0.6.1" +- resolved "https://registry.yarnpkg.com/read-components/-/read-components-0.6.1.tgz#45752f1c7c7e450742f4085fe6e24fccc5c75720" ++ resolved "https://repo.huaweicloud.com/repository/npm//read-components/-/read-components-0.6.1.tgz#45752f1c7c7e450742f4085fe6e24fccc5c75720" + dependencies: + async-each "~0.1.3" + component-builder "~0.10.0" + + read-pkg-up@^1.0.1: + version "1.0.1" +- resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" ++ resolved "https://repo.huaweicloud.com/repository/npm//read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" + dependencies: + find-up "^1.0.0" + read-pkg "^1.0.0" + + read-pkg@^1.0.0: + version "1.1.0" +- resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" ++ resolved "https://repo.huaweicloud.com/repository/npm//read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" + dependencies: + load-json-file "^1.0.0" + normalize-package-data "^2.3.2" +@@ -2880,7 +2880,7 @@ + + "readable-stream@^2.0.0 || ^1.1.13", readable-stream@^2.1.4: + version "2.2.9" +- resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.9.tgz#cf78ec6f4a6d1eb43d26488cac97f042e74b7fc8" ++ resolved "https://repo.huaweicloud.com/repository/npm//readable-stream/-/readable-stream-2.2.9.tgz#cf78ec6f4a6d1eb43d26488cac97f042e74b7fc8" + dependencies: + buffer-shims "~1.0.0" + core-util-is "~1.0.0" +@@ -2892,7 +2892,7 @@ + + readable-stream@^2.0.2: + version "2.0.6" +- resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e" ++ resolved "https://repo.huaweicloud.com/repository/npm//readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" +@@ -2903,7 +2903,7 @@ + + readable-stream@^2.2.2: + version "2.3.7" +- resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" ++ resolved "https://repo.huaweicloud.com/repository/npm//readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + dependencies: + core-util-is "~1.0.0" +@@ -2916,7 +2916,7 @@ + + readable-stream@~1.0.2, readable-stream@~1.0.26-2: + version "1.0.34" +- resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" ++ resolved "https://repo.huaweicloud.com/repository/npm//readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" +@@ -2925,7 +2925,7 @@ + + readdirp@^2.0.0: + version "2.1.0" +- resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" ++ resolved "https://repo.huaweicloud.com/repository/npm//readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" + dependencies: + graceful-fs "^4.1.2" + minimatch "^3.0.2" +@@ -2934,7 +2934,7 @@ + + readdirp@~1.3.0: + version "1.3.0" +- resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-1.3.0.tgz#eaf1a9b463be9a8190fc9ae163aa1ac934aa340b" ++ resolved "https://repo.huaweicloud.com/repository/npm//readdirp/-/readdirp-1.3.0.tgz#eaf1a9b463be9a8190fc9ae163aa1ac934aa340b" + dependencies: + graceful-fs "~2.0.0" + minimatch "~0.2.12" +@@ -2942,22 +2942,22 @@ + + redent@^1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" ++ resolved "https://repo.huaweicloud.com/repository/npm//redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" + dependencies: + indent-string "^2.1.0" + strip-indent "^1.0.1" + + regenerate@^1.2.1: + version "1.3.2" +- resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.2.tgz#d1941c67bad437e1be76433add5b385f95b19260" ++ resolved "https://repo.huaweicloud.com/repository/npm//regenerate/-/regenerate-1.3.2.tgz#d1941c67bad437e1be76433add5b385f95b19260" + + regenerator-runtime@^0.10.0: + version "0.10.3" +- resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.3.tgz#8c4367a904b51ea62a908ac310bf99ff90a82a3e" ++ resolved "https://repo.huaweicloud.com/repository/npm//regenerator-runtime/-/regenerator-runtime-0.10.3.tgz#8c4367a904b51ea62a908ac310bf99ff90a82a3e" + + regenerator-transform@0.9.11: + version "0.9.11" +- resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.9.11.tgz#3a7d067520cb7b7176769eb5ff868691befe1283" ++ resolved "https://repo.huaweicloud.com/repository/npm//regenerator-transform/-/regenerator-transform-0.9.11.tgz#3a7d067520cb7b7176769eb5ff868691befe1283" + dependencies: + babel-runtime "^6.18.0" + babel-types "^6.19.0" +@@ -2965,14 +2965,14 @@ + + regex-cache@^0.4.2: + version "0.4.3" +- resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d7114145" ++ resolved "https://repo.huaweicloud.com/repository/npm//regex-cache/-/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d7114145" + dependencies: + is-equal-shallow "^0.1.3" + is-primitive "^2.0.0" + + regexpu-core@^2.0.0: + version "2.0.0" +- resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" ++ resolved "https://repo.huaweicloud.com/repository/npm//regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" + dependencies: + regenerate "^1.2.1" + regjsgen "^0.2.0" +@@ -2980,46 +2980,46 @@ + + regjsgen@^0.2.0: + version "0.2.0" +- resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" ++ resolved "https://repo.huaweicloud.com/repository/npm//regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" + + regjsparser@^0.1.4: + version "0.1.5" +- resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" ++ resolved "https://repo.huaweicloud.com/repository/npm//regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" + dependencies: + jsesc "~0.5.0" + + remove-trailing-separator@^1.0.1: + version "1.0.1" +- resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.0.1.tgz#615ebb96af559552d4bf4057c8436d486ab63cc4" ++ resolved "https://repo.huaweicloud.com/repository/npm//remove-trailing-separator/-/remove-trailing-separator-1.0.1.tgz#615ebb96af559552d4bf4057c8436d486ab63cc4" + + repeat-element@^1.1.2: + version "1.1.2" +- resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" ++ resolved "https://repo.huaweicloud.com/repository/npm//repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" + + repeat-string@^0.2.2: + version "0.2.2" +- resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-0.2.2.tgz#c7a8d3236068362059a7e4651fc6884e8b1fb4ae" ++ resolved "https://repo.huaweicloud.com/repository/npm//repeat-string/-/repeat-string-0.2.2.tgz#c7a8d3236068362059a7e4651fc6884e8b1fb4ae" + + repeat-string@^1.5.2: + version "1.6.1" +- resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" ++ resolved "https://repo.huaweicloud.com/repository/npm//repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + + repeating@^2.0.0: + version "2.0.1" +- resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" ++ resolved "https://repo.huaweicloud.com/repository/npm//repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + dependencies: + is-finite "^1.0.0" + + request-progress@^2.0.1: + version "2.0.1" +- resolved "https://registry.yarnpkg.com/request-progress/-/request-progress-2.0.1.tgz#5d36bb57961c673aa5b788dbc8141fdf23b44e08" ++ resolved "https://repo.huaweicloud.com/repository/npm//request-progress/-/request-progress-2.0.1.tgz#5d36bb57961c673aa5b788dbc8141fdf23b44e08" + integrity sha1-XTa7V5YcZzqlt4jbyBQf3yO0Tgg= + dependencies: + throttleit "^1.0.0" + + request@^2.79.0, request@^2.81.0: + version "2.81.0" +- resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" ++ resolved "https://repo.huaweicloud.com/repository/npm//request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" + dependencies: + aws-sign2 "~0.6.0" + aws4 "^1.2.1" +@@ -3046,52 +3046,52 @@ + + requires-port@1.x.x: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" ++ resolved "https://repo.huaweicloud.com/repository/npm//requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + + resolve@1.1.x: + version "1.1.7" +- resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" ++ resolved "https://repo.huaweicloud.com/repository/npm//resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + + right-align@^0.1.1: + version "0.1.3" +- resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" ++ resolved "https://repo.huaweicloud.com/repository/npm//right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" + dependencies: + align-text "^0.1.1" + + rimraf@2, rimraf@^2.5.1, rimraf@^2.6.0, rimraf@^2.6.1: + version "2.6.1" +- resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d" ++ resolved "https://repo.huaweicloud.com/repository/npm//rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d" + dependencies: + glob "^7.0.5" + + rimraf@~2.2.0, rimraf@~2.2.1: + version "2.2.8" +- resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582" ++ resolved "https://repo.huaweicloud.com/repository/npm//rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582" + + safe-buffer@^5.0.1: + version "5.0.1" +- resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.0.1.tgz#d263ca54696cd8a306b5ca6551e92de57918fbe7" ++ resolved "https://repo.huaweicloud.com/repository/npm//safe-buffer/-/safe-buffer-5.0.1.tgz#d263ca54696cd8a306b5ca6551e92de57918fbe7" + + safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" +- resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" ++ resolved "https://repo.huaweicloud.com/repository/npm//safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + + sax@^1.2.1: + version "1.2.2" +- resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.2.tgz#fd8631a23bc7826bef5d871bdb87378c95647828" ++ resolved "https://repo.huaweicloud.com/repository/npm//sax/-/sax-1.2.2.tgz#fd8631a23bc7826bef5d871bdb87378c95647828" + + "semver@2 || 3 || 4 || 5", semver@^5.3.0: + version "5.3.0" +- resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" ++ resolved "https://repo.huaweicloud.com/repository/npm//semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" + + semver@~4.3.3: + version "4.3.6" +- resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" ++ resolved "https://repo.huaweicloud.com/repository/npm//semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" + + send@0.1.4: + version "0.1.4" +- resolved "https://registry.yarnpkg.com/send/-/send-0.1.4.tgz#be70d8d1be01de61821af13780b50345a4f71abd" ++ resolved "https://repo.huaweicloud.com/repository/npm//send/-/send-0.1.4.tgz#be70d8d1be01de61821af13780b50345a4f71abd" + dependencies: + debug "*" + fresh "0.2.0" +@@ -3100,54 +3100,54 @@ + + set-blocking@~2.0.0: + version "2.0.0" +- resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" ++ resolved "https://repo.huaweicloud.com/repository/npm//set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + + set-immediate-shim@^1.0.1: + version "1.0.1" +- resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" ++ resolved "https://repo.huaweicloud.com/repository/npm//set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" + + setprototypeof@1.0.3: + version "1.0.3" +- resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04" ++ resolved "https://repo.huaweicloud.com/repository/npm//setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04" + + sigmund@~1.0.0: + version "1.0.1" +- resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" ++ resolved "https://repo.huaweicloud.com/repository/npm//sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" + + signal-exit@^3.0.0: + version "3.0.2" +- resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" ++ resolved "https://repo.huaweicloud.com/repository/npm//signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + + sinon-chai@~2.8.0: + version "2.8.0" +- resolved "https://registry.yarnpkg.com/sinon-chai/-/sinon-chai-2.8.0.tgz#432a9bbfd51a6fc00798f4d2526a829c060687ac" ++ resolved "https://repo.huaweicloud.com/repository/npm//sinon-chai/-/sinon-chai-2.8.0.tgz#432a9bbfd51a6fc00798f4d2526a829c060687ac" + + sinon@=1.7.3: + version "1.7.3" +- resolved "https://registry.yarnpkg.com/sinon/-/sinon-1.7.3.tgz#7a69d69cd0294586c743254eeff1b583a50997f2" ++ resolved "https://repo.huaweicloud.com/repository/npm//sinon/-/sinon-1.7.3.tgz#7a69d69cd0294586c743254eeff1b583a50997f2" + dependencies: + buster-format "~0.5" + + slash@^1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" ++ resolved "https://repo.huaweicloud.com/repository/npm//slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + + sntp@1.x.x: + version "1.0.9" +- resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" ++ resolved "https://repo.huaweicloud.com/repository/npm//sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" + dependencies: + hoek "2.x.x" + + socket.io-adapter@0.5.0: + version "0.5.0" +- resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-0.5.0.tgz#cb6d4bb8bec81e1078b99677f9ced0046066bb8b" ++ resolved "https://repo.huaweicloud.com/repository/npm//socket.io-adapter/-/socket.io-adapter-0.5.0.tgz#cb6d4bb8bec81e1078b99677f9ced0046066bb8b" + dependencies: + debug "2.3.3" + socket.io-parser "2.3.1" + + socket.io-client@1.7.3: + version "1.7.3" +- resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-1.7.3.tgz#b30e86aa10d5ef3546601c09cde4765e381da377" ++ resolved "https://repo.huaweicloud.com/repository/npm//socket.io-client/-/socket.io-client-1.7.3.tgz#b30e86aa10d5ef3546601c09cde4765e381da377" + dependencies: + backo2 "1.0.2" + component-bind "1.0.0" +@@ -3163,7 +3163,7 @@ + + socket.io-parser@2.3.1: + version "2.3.1" +- resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-2.3.1.tgz#dd532025103ce429697326befd64005fcfe5b4a0" ++ resolved "https://repo.huaweicloud.com/repository/npm//socket.io-parser/-/socket.io-parser-2.3.1.tgz#dd532025103ce429697326befd64005fcfe5b4a0" + dependencies: + component-emitter "1.1.2" + debug "2.2.0" +@@ -3172,7 +3172,7 @@ + + socket.io@1.7.3: + version "1.7.3" +- resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-1.7.3.tgz#b8af9caba00949e568e369f1327ea9be9ea2461b" ++ resolved "https://repo.huaweicloud.com/repository/npm//socket.io/-/socket.io-1.7.3.tgz#b8af9caba00949e568e369f1327ea9be9ea2461b" + dependencies: + debug "2.3.3" + engine.io "1.8.3" +@@ -3184,53 +3184,53 @@ + + source-map-support@^0.4.2: + version "0.4.14" +- resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.14.tgz#9d4463772598b86271b4f523f6c1f4e02a7d6aef" ++ resolved "https://repo.huaweicloud.com/repository/npm//source-map-support/-/source-map-support-0.4.14.tgz#9d4463772598b86271b4f523f6c1f4e02a7d6aef" + dependencies: + source-map "^0.5.6" + + source-map@^0.4.4: + version "0.4.4" +- resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" ++ resolved "https://repo.huaweicloud.com/repository/npm//source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" + dependencies: + amdefine ">=0.0.4" + + source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.1: + version "0.5.6" +- resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" ++ resolved "https://repo.huaweicloud.com/repository/npm//source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" + + source-map@~0.1.35: + version "0.1.43" +- resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346" ++ resolved "https://repo.huaweicloud.com/repository/npm//source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346" + dependencies: + amdefine ">=0.0.4" + + source-map@~0.2.0: + version "0.2.0" +- resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d" ++ resolved "https://repo.huaweicloud.com/repository/npm//source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d" + dependencies: + amdefine ">=0.0.4" + + spdx-correct@~1.0.0: + version "1.0.2" +- resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" ++ resolved "https://repo.huaweicloud.com/repository/npm//spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" + dependencies: + spdx-license-ids "^1.0.2" + + spdx-expression-parse@~1.0.0: + version "1.0.4" +- resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c" ++ resolved "https://repo.huaweicloud.com/repository/npm//spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c" + + spdx-license-ids@^1.0.2: + version "1.2.2" +- resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" ++ resolved "https://repo.huaweicloud.com/repository/npm//spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" + + sprintf-js@~1.0.2: + version "1.0.3" +- resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" ++ resolved "https://repo.huaweicloud.com/repository/npm//sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + + sshpk@^1.7.0: + version "1.13.0" +- resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.0.tgz#ff2a3e4fd04497555fed97b39a0fd82fafb3a33c" ++ resolved "https://repo.huaweicloud.com/repository/npm//sshpk/-/sshpk-1.13.0.tgz#ff2a3e4fd04497555fed97b39a0fd82fafb3a33c" + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" +@@ -3245,15 +3245,15 @@ + + "statuses@>= 1.3.1 < 2", statuses@~1.3.1: + version "1.3.1" +- resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" ++ resolved "https://repo.huaweicloud.com/repository/npm//statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" + + string-to-js@0.0.1: + version "0.0.1" +- resolved "https://registry.yarnpkg.com/string-to-js/-/string-to-js-0.0.1.tgz#bf153c760636faa30769b804a0195552ba7ad80f" ++ resolved "https://repo.huaweicloud.com/repository/npm//string-to-js/-/string-to-js-0.0.1.tgz#bf153c760636faa30769b804a0195552ba7ad80f" + + string-width@^1.0.1: + version "1.0.2" +- resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" ++ resolved "https://repo.huaweicloud.com/repository/npm//string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" +@@ -3261,68 +3261,68 @@ + + string_decoder@~0.10.x: + version "0.10.31" +- resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" ++ resolved "https://repo.huaweicloud.com/repository/npm//string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + + string_decoder@~1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.0.tgz#f06f41157b664d86069f84bdbdc9b0d8ab281667" ++ resolved "https://repo.huaweicloud.com/repository/npm//string_decoder/-/string_decoder-1.0.0.tgz#f06f41157b664d86069f84bdbdc9b0d8ab281667" + dependencies: + buffer-shims "~1.0.0" + + string_decoder@~1.1.1: + version "1.1.1" +- resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" ++ resolved "https://repo.huaweicloud.com/repository/npm//string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + + stringstream@~0.0.4: + version "0.0.5" +- resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" ++ resolved "https://repo.huaweicloud.com/repository/npm//stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" + + strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" +- resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" ++ resolved "https://repo.huaweicloud.com/repository/npm//strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + dependencies: + ansi-regex "^2.0.0" + + strip-bom@^2.0.0: + version "2.0.0" +- resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" ++ resolved "https://repo.huaweicloud.com/repository/npm//strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" + dependencies: + is-utf8 "^0.2.0" + + strip-indent@^1.0.1: + version "1.0.1" +- resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" ++ resolved "https://repo.huaweicloud.com/repository/npm//strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" + dependencies: + get-stdin "^4.0.1" + + strip-json-comments@~2.0.1: + version "2.0.1" +- resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" ++ resolved "https://repo.huaweicloud.com/repository/npm//strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + + supports-color@1.2.0: + version "1.2.0" +- resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-1.2.0.tgz#ff1ed1e61169d06b3cf2d588e188b18d8847e17e" ++ resolved "https://repo.huaweicloud.com/repository/npm//supports-color/-/supports-color-1.2.0.tgz#ff1ed1e61169d06b3cf2d588e188b18d8847e17e" + + supports-color@^2.0.0: + version "2.0.0" +- resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" ++ resolved "https://repo.huaweicloud.com/repository/npm//supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + + supports-color@^3.1.0: + version "3.2.3" +- resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" ++ resolved "https://repo.huaweicloud.com/repository/npm//supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" + dependencies: + has-flag "^1.0.0" + + symbol-tree@^3.2.1: + version "3.2.2" +- resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" ++ resolved "https://repo.huaweicloud.com/repository/npm//symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" + + tar-pack@^3.4.0: + version "3.4.0" +- resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.0.tgz#23be2d7f671a8339376cbdb0b8fe3fdebf317984" ++ resolved "https://repo.huaweicloud.com/repository/npm//tar-pack/-/tar-pack-3.4.0.tgz#23be2d7f671a8339376cbdb0b8fe3fdebf317984" + dependencies: + debug "^2.2.0" + fstream "^1.0.10" +@@ -3335,7 +3335,7 @@ + + tar@^2.2.1: + version "2.2.1" +- resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" ++ resolved "https://repo.huaweicloud.com/repository/npm//tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" + dependencies: + block-stream "*" + fstream "^1.0.2" +@@ -3343,107 +3343,107 @@ + + throttleit@^1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.0.tgz#9e785836daf46743145a5984b6268d828528ac6c" ++ resolved "https://repo.huaweicloud.com/repository/npm//throttleit/-/throttleit-1.0.0.tgz#9e785836daf46743145a5984b6268d828528ac6c" + integrity sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw= + + timed-out@^4.0.0: + version "4.0.1" +- resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" ++ resolved "https://repo.huaweicloud.com/repository/npm//timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" + integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= + + tmp@0.0.31, tmp@0.0.x: + version "0.0.31" +- resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.31.tgz#8f38ab9438e17315e5dbd8b3657e8bfb277ae4a7" ++ resolved "https://repo.huaweicloud.com/repository/npm//tmp/-/tmp-0.0.31.tgz#8f38ab9438e17315e5dbd8b3657e8bfb277ae4a7" + dependencies: + os-tmpdir "~1.0.1" + + tmp@0.0.33: + version "0.0.33" +- resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" ++ resolved "https://repo.huaweicloud.com/repository/npm//tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + + to-array@0.1.4: + version "0.1.4" +- resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890" ++ resolved "https://repo.huaweicloud.com/repository/npm//to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890" + + to-fast-properties@^1.0.1: + version "1.0.2" +- resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.2.tgz#f3f5c0c3ba7299a7ef99427e44633257ade43320" ++ resolved "https://repo.huaweicloud.com/repository/npm//to-fast-properties/-/to-fast-properties-1.0.2.tgz#f3f5c0c3ba7299a7ef99427e44633257ade43320" + + to-iso-string@0.0.2: + version "0.0.2" +- resolved "https://registry.yarnpkg.com/to-iso-string/-/to-iso-string-0.0.2.tgz#4dc19e664dfccbe25bd8db508b00c6da158255d1" ++ resolved "https://repo.huaweicloud.com/repository/npm//to-iso-string/-/to-iso-string-0.0.2.tgz#4dc19e664dfccbe25bd8db508b00c6da158255d1" + + tough-cookie@^2.3.2, tough-cookie@~2.3.0: + version "2.3.2" +- resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a" ++ resolved "https://repo.huaweicloud.com/repository/npm//tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a" + dependencies: + punycode "^1.4.1" + + tr46@~0.0.3: + version "0.0.3" +- resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" ++ resolved "https://repo.huaweicloud.com/repository/npm//tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + + trim-newlines@^1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" ++ resolved "https://repo.huaweicloud.com/repository/npm//trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" + + trim-right@^1.0.1: + version "1.0.1" +- resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" ++ resolved "https://repo.huaweicloud.com/repository/npm//trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + + tunnel-agent@^0.6.0: + version "0.6.0" +- resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" ++ resolved "https://repo.huaweicloud.com/repository/npm//tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + dependencies: + safe-buffer "^5.0.1" + + tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" +- resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" ++ resolved "https://repo.huaweicloud.com/repository/npm//tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + + type-check@~0.3.1, type-check@~0.3.2: + version "0.3.2" +- resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" ++ resolved "https://repo.huaweicloud.com/repository/npm//type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + dependencies: + prelude-ls "~1.1.2" + + type-detect@0.1.1: + version "0.1.1" +- resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-0.1.1.tgz#0ba5ec2a885640e470ea4e8505971900dac58822" ++ resolved "https://repo.huaweicloud.com/repository/npm//type-detect/-/type-detect-0.1.1.tgz#0ba5ec2a885640e470ea4e8505971900dac58822" + + type-detect@^1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-1.0.0.tgz#762217cc06db258ec48908a1298e8b95121e8ea2" ++ resolved "https://repo.huaweicloud.com/repository/npm//type-detect/-/type-detect-1.0.0.tgz#762217cc06db258ec48908a1298e8b95121e8ea2" + + type-is@~1.6.14: + version "1.6.15" +- resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.15.tgz#cab10fb4909e441c82842eafe1ad646c81804410" ++ resolved "https://repo.huaweicloud.com/repository/npm//type-is/-/type-is-1.6.15.tgz#cab10fb4909e441c82842eafe1ad646c81804410" + dependencies: + media-typer "0.3.0" + mime-types "~2.1.15" + + typedarray@^0.0.6: + version "0.0.6" +- resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" ++ resolved "https://repo.huaweicloud.com/repository/npm//typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= + + "uglify-js-brunch@>= 1.0 < 1.5": + version "1.3.1" +- resolved "https://registry.yarnpkg.com/uglify-js-brunch/-/uglify-js-brunch-1.3.1.tgz#2d9faf463846cf499d3918147b3e328210d98fbf" ++ resolved "https://repo.huaweicloud.com/repository/npm//uglify-js-brunch/-/uglify-js-brunch-1.3.1.tgz#2d9faf463846cf499d3918147b3e328210d98fbf" + dependencies: + coffee-script "1.3.3" + uglify-js "1.3.2" + + uglify-js@1.3.2: + version "1.3.2" +- resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-1.3.2.tgz#7ed11c9dedf77f29632286ea4dc96a2229aef98e" ++ resolved "https://repo.huaweicloud.com/repository/npm//uglify-js/-/uglify-js-1.3.2.tgz#7ed11c9dedf77f29632286ea4dc96a2229aef98e" + + uglify-js@^2.6: + version "2.8.22" +- resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.22.tgz#d54934778a8da14903fa29a326fb24c0ab51a1a0" ++ resolved "https://repo.huaweicloud.com/repository/npm//uglify-js/-/uglify-js-2.8.22.tgz#d54934778a8da14903fa29a326fb24c0ab51a1a0" + dependencies: + source-map "~0.5.1" + yargs "~3.10.0" +@@ -3452,158 +3452,158 @@ + + uglify-to-browserify@~1.0.0: + version "1.0.2" +- resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" ++ resolved "https://repo.huaweicloud.com/repository/npm//uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" + + uid-number@^0.0.6: + version "0.0.6" +- resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" ++ resolved "https://repo.huaweicloud.com/repository/npm//uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" + + uid2@0.0.2: + version "0.0.2" +- resolved "https://registry.yarnpkg.com/uid2/-/uid2-0.0.2.tgz#107fb155c82c1136620797ed4c88cf2b08f6aab8" ++ resolved "https://repo.huaweicloud.com/repository/npm//uid2/-/uid2-0.0.2.tgz#107fb155c82c1136620797ed4c88cf2b08f6aab8" + + ultron@1.0.x: + version "1.0.2" +- resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.0.2.tgz#ace116ab557cd197386a4e88f4685378c8b2e4fa" ++ resolved "https://repo.huaweicloud.com/repository/npm//ultron/-/ultron-1.0.2.tgz#ace116ab557cd197386a4e88f4685378c8b2e4fa" + + unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" ++ resolved "https://repo.huaweicloud.com/repository/npm//unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + + url-parse-lax@^1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" ++ resolved "https://repo.huaweicloud.com/repository/npm//url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" + integrity sha1-evjzA2Rem9eaJy56FKxovAYJ2nM= + dependencies: + prepend-http "^1.0.1" + + url-to-options@^1.0.1: + version "1.0.1" +- resolved "https://registry.yarnpkg.com/url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9" ++ resolved "https://repo.huaweicloud.com/repository/npm//url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9" + integrity sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k= + + useragent@^2.1.12: + version "2.1.13" +- resolved "https://registry.yarnpkg.com/useragent/-/useragent-2.1.13.tgz#bba43e8aa24d5ceb83c2937473e102e21df74c10" ++ resolved "https://repo.huaweicloud.com/repository/npm//useragent/-/useragent-2.1.13.tgz#bba43e8aa24d5ceb83c2937473e102e21df74c10" + dependencies: + lru-cache "2.2.x" + tmp "0.0.x" + + util-deprecate@~1.0.1: + version "1.0.2" +- resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" ++ resolved "https://repo.huaweicloud.com/repository/npm//util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + + utils-merge@1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.0.tgz#0294fb922bb9375153541c4f7096231f287c8af8" ++ resolved "https://repo.huaweicloud.com/repository/npm//utils-merge/-/utils-merge-1.0.0.tgz#0294fb922bb9375153541c4f7096231f287c8af8" + + uuid@^3.0.0: + version "3.0.1" +- resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.1.tgz#6544bba2dfda8c1cf17e629a3a305e2bb1fee6c1" ++ resolved "https://repo.huaweicloud.com/repository/npm//uuid/-/uuid-3.0.1.tgz#6544bba2dfda8c1cf17e629a3a305e2bb1fee6c1" + + validate-npm-package-license@^3.0.1: + version "3.0.1" +- resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" ++ resolved "https://repo.huaweicloud.com/repository/npm//validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" + dependencies: + spdx-correct "~1.0.0" + spdx-expression-parse "~1.0.0" + + verror@1.3.6: + version "1.3.6" +- resolved "https://registry.yarnpkg.com/verror/-/verror-1.3.6.tgz#cff5df12946d297d2baaefaa2689e25be01c005c" ++ resolved "https://repo.huaweicloud.com/repository/npm//verror/-/verror-1.3.6.tgz#cff5df12946d297d2baaefaa2689e25be01c005c" + dependencies: + extsprintf "1.0.2" + + void-elements@^2.0.0: + version "2.0.1" +- resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec" ++ resolved "https://repo.huaweicloud.com/repository/npm//void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec" + + webidl-conversions@^3.0.0: + version "3.0.1" +- resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" ++ resolved "https://repo.huaweicloud.com/repository/npm//webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + + webidl-conversions@^4.0.0: + version "4.0.1" +- resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.1.tgz#8015a17ab83e7e1b311638486ace81da6ce206a0" ++ resolved "https://repo.huaweicloud.com/repository/npm//webidl-conversions/-/webidl-conversions-4.0.1.tgz#8015a17ab83e7e1b311638486ace81da6ce206a0" + + whatwg-encoding@^1.0.1: + version "1.0.1" +- resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.1.tgz#3c6c451a198ee7aec55b1ec61d0920c67801a5f4" ++ resolved "https://repo.huaweicloud.com/repository/npm//whatwg-encoding/-/whatwg-encoding-1.0.1.tgz#3c6c451a198ee7aec55b1ec61d0920c67801a5f4" + dependencies: + iconv-lite "0.4.13" + + whatwg-url@^4.3.0: + version "4.7.0" +- resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-4.7.0.tgz#202035ac1955b087cdd20fa8b58ded3ab1cd2af5" ++ resolved "https://repo.huaweicloud.com/repository/npm//whatwg-url/-/whatwg-url-4.7.0.tgz#202035ac1955b087cdd20fa8b58ded3ab1cd2af5" + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + + which@^1.1.1: + version "1.2.14" +- resolved "https://registry.yarnpkg.com/which/-/which-1.2.14.tgz#9a87c4378f03e827cecaf1acdf56c736c01c14e5" ++ resolved "https://repo.huaweicloud.com/repository/npm//which/-/which-1.2.14.tgz#9a87c4378f03e827cecaf1acdf56c736c01c14e5" + dependencies: + isexe "^2.0.0" + + which@^1.2.1, which@^1.2.10: + version "1.3.1" +- resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" ++ resolved "https://repo.huaweicloud.com/repository/npm//which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + + which@~1.0.5: + version "1.0.9" +- resolved "https://registry.yarnpkg.com/which/-/which-1.0.9.tgz#460c1da0f810103d0321a9b633af9e575e64486f" ++ resolved "https://repo.huaweicloud.com/repository/npm//which/-/which-1.0.9.tgz#460c1da0f810103d0321a9b633af9e575e64486f" + + wide-align@^1.1.0: + version "1.1.0" +- resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.0.tgz#40edde802a71fea1f070da3e62dcda2e7add96ad" ++ resolved "https://repo.huaweicloud.com/repository/npm//wide-align/-/wide-align-1.1.0.tgz#40edde802a71fea1f070da3e62dcda2e7add96ad" + dependencies: + string-width "^1.0.1" + + window-size@0.1.0: + version "0.1.0" +- resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" ++ resolved "https://repo.huaweicloud.com/repository/npm//window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" + + wordwrap@0.0.2: + version "0.0.2" +- resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" ++ resolved "https://repo.huaweicloud.com/repository/npm//wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" + + wordwrap@^1.0.0, wordwrap@~1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" ++ resolved "https://repo.huaweicloud.com/repository/npm//wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + + wordwrap@~0.0.2: + version "0.0.3" +- resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" ++ resolved "https://repo.huaweicloud.com/repository/npm//wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" + + wrappy@1: + version "1.0.2" +- resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" ++ resolved "https://repo.huaweicloud.com/repository/npm//wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + + ws@1.1.2: + version "1.1.2" +- resolved "https://registry.yarnpkg.com/ws/-/ws-1.1.2.tgz#8a244fa052401e08c9886cf44a85189e1fd4067f" ++ resolved "https://repo.huaweicloud.com/repository/npm//ws/-/ws-1.1.2.tgz#8a244fa052401e08c9886cf44a85189e1fd4067f" + dependencies: + options ">=0.0.5" + ultron "1.0.x" + + wtf-8@1.0.0: + version "1.0.0" +- resolved "https://registry.yarnpkg.com/wtf-8/-/wtf-8-1.0.0.tgz#392d8ba2d0f1c34d1ee2d630f15d0efb68e1048a" ++ resolved "https://repo.huaweicloud.com/repository/npm//wtf-8/-/wtf-8-1.0.0.tgz#392d8ba2d0f1c34d1ee2d630f15d0efb68e1048a" + + xml-name-validator@^2.0.1: + version "2.0.1" +- resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-2.0.1.tgz#4d8b8f1eccd3419aa362061becef515e1e559635" ++ resolved "https://repo.huaweicloud.com/repository/npm//xml-name-validator/-/xml-name-validator-2.0.1.tgz#4d8b8f1eccd3419aa362061becef515e1e559635" + + xmlhttprequest-ssl@1.5.3: + version "1.5.3" +- resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz#185a888c04eca46c3e4070d99f7b49de3528992d" ++ resolved "https://repo.huaweicloud.com/repository/npm//xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz#185a888c04eca46c3e4070d99f7b49de3528992d" + + yargs@~3.10.0: + version "3.10.0" +- resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" ++ resolved "https://repo.huaweicloud.com/repository/npm//yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" + dependencies: + camelcase "^1.0.2" + cliui "^2.1.0" +@@ -3612,15 +3612,15 @@ + + yauzl@2.4.1: + version "2.4.1" +- resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.4.1.tgz#9528f442dab1b2284e58b4379bb194e22e0c4005" ++ resolved "https://repo.huaweicloud.com/repository/npm//yauzl/-/yauzl-2.4.1.tgz#9528f442dab1b2284e58b4379bb194e22e0c4005" + integrity sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU= + dependencies: + fd-slicer "~1.0.1" + + ycssmin@>=1.0.1: + version "1.0.1" +- resolved "https://registry.yarnpkg.com/ycssmin/-/ycssmin-1.0.1.tgz#7cdde8db78cfab00d2901c3b2301e304faf4df16" ++ resolved "https://repo.huaweicloud.com/repository/npm//ycssmin/-/ycssmin-1.0.1.tgz#7cdde8db78cfab00d2901c3b2301e304faf4df16" + + yeast@0.1.2: + version "0.1.2" +- resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419" ++ resolved "https://repo.huaweicloud.com/repository/npm//yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419" +diff -Naur ambari-release-2.7.6-origin/contrib/addons/package/rpm/.gitignore apache-ambari-2.7.6-change/contrib/addons/package/rpm/.gitignore +--- ambari-release-2.7.6-origin/contrib/addons/package/rpm/.gitignore 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/addons/package/rpm/.gitignore 1970-01-01 08:00:00.000000000 +0800 +@@ -1 +0,0 @@ +-build +diff -Naur ambari-release-2.7.6-origin/contrib/addons/test/nagios/plugins/test_sys_logger.py apache-ambari-2.7.6-change/contrib/addons/test/nagios/plugins/test_sys_logger.py +--- ambari-release-2.7.6-origin/contrib/addons/test/nagios/plugins/test_sys_logger.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/addons/test/nagios/plugins/test_sys_logger.py 2022-07-11 00:52:29.000000000 +0800 +@@ -24,12 +24,12 @@ + def test_log_tvi_msg(msg): + global tests_passed, tests_failed + if msg == expected_log_msg: +- print 'Test Passed' ++ print('Test Passed') + tests_passed += 1 + else: +- print '*** TEST FAILED ***' +- print 'Expected MSG: {0}'.format(expected_log_msg) +- print 'Actual MSG : {0}'.format(msg) ++ print('*** TEST FAILED ***') ++ print('Expected MSG: {}'.format(expected_log_msg)) ++ print('Actual MSG : {}'.format(msg)) + tests_failed += 1 + + sys_logger.log_tvi_msg = test_log_tvi_msg +@@ -42,10 +42,10 @@ + + def summary(): + total_tests = tests_passed + tests_failed +- print '\nTests Run: {0}'.format(total_tests) +- print 'Passed: {0}, Failed: {1}'.format(tests_passed, tests_failed) ++ print('\nTests Run: {}'.format(total_tests)) ++ print('Passed: {}, Failed: {}'.format(tests_passed, tests_failed)) + if not tests_failed: +- print 'SUCCESS! All tests pass.' ++ print('SUCCESS! All tests pass.') + + + # Hadoop_Host_Down +diff -Naur ambari-release-2.7.6-origin/contrib/agent-simulator/cluster.py apache-ambari-2.7.6-change/contrib/agent-simulator/cluster.py +--- ambari-release-2.7.6-origin/contrib/agent-simulator/cluster.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/agent-simulator/cluster.py 2022-07-11 00:52:29.000000000 +0800 +@@ -84,28 +84,28 @@ + return interval_list + + def print_description(self): +- print "cluster name: ", self.cluster_name +- print "create time: ", self.create_time +- print "state: ", self.state +- print ++ print("cluster name: ", self.cluster_name) ++ print("create time: ", self.create_time) ++ print("state: ", self.state) ++ print() + +- print "Ambari Server: " ++ print("Ambari Server: ") + ambari_server_vm = self.get_ambari_server_vm() + if ambari_server_vm is None: +- print "None" ++ print("None") + else: +- print ambari_server_vm.domain_name, " ", ambari_server_vm.external_ip, " ",\ +- ambari_server_vm.weave_internal_ip +- print ++ print(ambari_server_vm.domain_name, " ", ambari_server_vm.external_ip, " ",\ ++ ambari_server_vm.weave_internal_ip) ++ print() + +- print "Service Server with Ambari Agent directly installed: " ++ print("Service Server with Ambari Agent directly installed: ") + if len(self.service_server_vm_list) == 0: +- print "None" ++ print("None") + for vm in self.service_server_vm_list: +- print vm.weave_domain_name, " ", vm.external_ip, " ", vm.weave_internal_ip +- print ++ print(vm.weave_domain_name, " ", vm.external_ip, " ", vm.weave_internal_ip) ++ print() + +- print "Ambari Agent in Docker Container: " ++ print("Ambari Agent in Docker Container: ") + int_list = [] + for vm in self.ambari_agent_vm_list: + for docker in vm.docker_list: +@@ -116,9 +116,9 @@ + if interval[0] == interval[1]: + interval_str = str(interval(0)) + else: +- interval_str = "[{0}-{1}]".format(interval[0], interval[1]) +- print Docker.get_pattern_presentation(self.cluster_name, interval_str) +- print ++ interval_str = "[{}-{}]".format(interval[0], interval[1]) ++ print(Docker.get_pattern_presentation(self.cluster_name, interval_str)) ++ print() + + def get_agent_vm(self, vm_ip): + """ +@@ -236,8 +236,8 @@ + :return: A list of tuple, each tuple has domain name and IP of a VM + """ + gce_key = Config.ATTRIBUTES["gce_controller_key_file"] +- gce_login = "{0}@{1}".format(Config.ATTRIBUTES["gce_controller_user"], Config.ATTRIBUTES["gce_controller_ip"]) +- gce_up_cmd = "gce up {0} {1} {2} {3} {4}".format(name, vm_num, gce_vm_type, gce_vm_os, gce_extra_cmd) ++ gce_login = "{}@{}".format(Config.ATTRIBUTES["gce_controller_user"], Config.ATTRIBUTES["gce_controller_ip"]) ++ gce_up_cmd = "gce up {} {} {} {} {}".format(name, vm_num, gce_vm_type, gce_vm_os, gce_extra_cmd) + subprocess.call(["ssh", "-o", "StrictHostKeyChecking=no", "-i", gce_key, gce_login, gce_up_cmd]) + + Log.write("cluster launched, wait for cluster info ... ...") +@@ -249,7 +249,7 @@ + + # request cluster info + with open(Config.ATTRIBUTES["gce_info_output"], "w") as gce_info_output_file: +- gce_info_cmd = "gce info {0}".format(name) ++ gce_info_cmd = "gce info {}".format(name) + subprocess.call(["ssh", "-o", "StrictHostKeyChecking=no", "-i", gce_key, gce_login, gce_info_cmd], + stdout=gce_info_output_file) + +@@ -406,11 +406,11 @@ + base_ip = base_ip_str.split(".") + new_ip = [int(base_ip[0]), int(base_ip[1]), int(base_ip[2]), int(base_ip[3])] + new_ip[3] = new_ip[3] + increase +- for index in reversed(range(0, 4)): ++ for index in reversed(list(range(0, 4))): + if new_ip[index] > 255: + new_ip[index - 1] += (new_ip[index] / 256) + new_ip[index] %= 256 +- return "{0}.{1}.{2}.{3}".format(new_ip[0], new_ip[1], new_ip[2], new_ip[3]) ++ return "{}.{}.{}.{}".format(new_ip[0], new_ip[1], new_ip[2], new_ip[3]) + + def _scp_upload(self, vm_external_ip): + """ +@@ -419,7 +419,7 @@ + :return: None + """ + # upload necessary file to VM +- vm_directory = "{0}@{1}:{2}".format(Config.ATTRIBUTES["vm_user"], vm_external_ip, ++ vm_directory = "{}@{}:{}".format(Config.ATTRIBUTES["vm_user"], vm_external_ip, + Config.ATTRIBUTES["vm_code_directory"]) + vm_key = Config.ATTRIBUTES["vm_key_file"] + +@@ -439,10 +439,10 @@ + :param vm_external_ip: the external IP of the VM + :return: None + """ +- vm_ssh_login = "{0}@{1}".format(Config.ATTRIBUTES["vm_user"], vm_external_ip) +- vm_ssh_cd_cmd = "cd {0}".format(Config.ATTRIBUTES["vm_code_directory"]) ++ vm_ssh_login = "{}@{}".format(Config.ATTRIBUTES["vm_user"], vm_external_ip) ++ vm_ssh_cd_cmd = "cd {}".format(Config.ATTRIBUTES["vm_code_directory"]) + vm_ssh_chmod_cmd = "chmod a+x **/*.sh" +- vm_ssh_cmd = "{0};{1}".format(vm_ssh_cd_cmd, vm_ssh_chmod_cmd) ++ vm_ssh_cmd = "{};{}".format(vm_ssh_cd_cmd, vm_ssh_chmod_cmd) + vm_key = Config.ATTRIBUTES["vm_key_file"] + + with open(os.devnull, 'w') as shutup: +@@ -513,10 +513,10 @@ + vm_output_file = open(vm_output_file_path, "w") + + # ssh install server +- vm_ssh_login = "{0}@{1}".format(Config.ATTRIBUTES["vm_user"], vm_external_ip) +- vm_ssh_cd_cmd = "cd {0}".format(Config.ATTRIBUTES["vm_code_directory"]) +- vm_ssh_python_cmd = "python launcher_ambari_server.py {0}".format(self.cluster_name) +- vm_ssh_cmd = "{0};{1}".format(vm_ssh_cd_cmd, vm_ssh_python_cmd) ++ vm_ssh_login = "{}@{}".format(Config.ATTRIBUTES["vm_user"], vm_external_ip) ++ vm_ssh_cd_cmd = "cd {}".format(Config.ATTRIBUTES["vm_code_directory"]) ++ vm_ssh_python_cmd = "python launcher_ambari_server.py {}".format(self.cluster_name) ++ vm_ssh_cmd = "{};{}".format(vm_ssh_cd_cmd, vm_ssh_python_cmd) + vm_key = Config.ATTRIBUTES["vm_key_file"] + Log.write(vm_ssh_python_cmd) + +@@ -549,11 +549,11 @@ + vm_output_file = open(vm_output_file_path, "w") + + # ssh install server +- vm_ssh_login = "{0}@{1}".format(Config.ATTRIBUTES["vm_user"], vm_external_ip) +- vm_ssh_cd_cmd = "cd {0}".format(Config.ATTRIBUTES["vm_code_directory"]) +- vm_ssh_python_cmd = "python launcher_service_server.py {0} {1} {2} {3}".format( ++ vm_ssh_login = "{}@{}".format(Config.ATTRIBUTES["vm_user"], vm_external_ip) ++ vm_ssh_cd_cmd = "cd {}".format(Config.ATTRIBUTES["vm_code_directory"]) ++ vm_ssh_python_cmd = "python launcher_service_server.py {} {} {} {}".format( + vm_external_ip, server_weave_ip, server_external_ip, self.cluster_name) +- vm_ssh_cmd = "{0};{1}".format(vm_ssh_cd_cmd, vm_ssh_python_cmd) ++ vm_ssh_cmd = "{};{}".format(vm_ssh_cd_cmd, vm_ssh_python_cmd) + vm_key = Config.ATTRIBUTES["vm_key_file"] + Log.write(vm_ssh_python_cmd) + +@@ -587,11 +587,11 @@ + vm_output_file_path = vm.get_ssh_output_file_path() + vm_output_file = open(vm_output_file_path, "w") + +- vm_ssh_login = "{0}@{1}".format(Config.ATTRIBUTES["vm_user"], vm_external_ip) +- vm_ssh_cd_cmd = "cd {0}".format(Config.ATTRIBUTES["vm_code_directory"]) +- vm_ssh_python_cmd = "python launcher_docker.py {0} {1} {2} {3}".format( ++ vm_ssh_login = "{}@{}".format(Config.ATTRIBUTES["vm_user"], vm_external_ip) ++ vm_ssh_cd_cmd = "cd {}".format(Config.ATTRIBUTES["vm_code_directory"]) ++ vm_ssh_python_cmd = "python launcher_docker.py {} {} {} {}".format( + vm_external_ip, server_weave_ip, server_external_ip, self.cluster_name) +- vm_ssh_cmd = "{0};{1}".format(vm_ssh_cd_cmd, vm_ssh_python_cmd) ++ vm_ssh_cmd = "{};{}".format(vm_ssh_cd_cmd, vm_ssh_python_cmd) + vm_key = Config.ATTRIBUTES["vm_key_file"] + Log.write(vm_ssh_python_cmd) + +diff -Naur ambari-release-2.7.6-origin/contrib/agent-simulator/config.py apache-ambari-2.7.6-change/contrib/agent-simulator/config.py +--- ambari-release-2.7.6-origin/contrib/agent-simulator/config.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/agent-simulator/config.py 2022-07-11 00:52:29.000000000 +0800 +@@ -16,7 +16,7 @@ + limitations under the License. + """ + +-import ConfigParser ++import configparser + import os + + +@@ -38,7 +38,7 @@ + load configuration from file, add all configuration to the map ATTRIBUTES + :return: None + """ +- config = ConfigParser.RawConfigParser() ++ config = configparser.RawConfigParser() + # keep file case sensitive + config.optionxform = str + config.read(Config.RELATIVE_CONFIG_FILE_PATH) +@@ -64,7 +64,7 @@ + :param value: the value + :return: None + """ +- config = ConfigParser.RawConfigParser() ++ config = configparser.RawConfigParser() + config.read(Config.RELATIVE_CONFIG_FILE_PATH) + config.set(section, key, value) + with open(Config.RELATIVE_CONFIG_FILE_PATH, 'wb') as configfile: +diff -Naur ambari-release-2.7.6-origin/contrib/agent-simulator/data.py apache-ambari-2.7.6-change/contrib/agent-simulator/data.py +--- ambari-release-2.7.6-origin/contrib/agent-simulator/data.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/agent-simulator/data.py 2022-07-11 00:52:29.000000000 +0800 +@@ -89,7 +89,7 @@ + cluster_name, state, agent_number, + service_server_num, ambari_server_num, create_time + """ +- print "(cluster_name, state, agent_number, service_server_num, ambari_server_num, create_time)" ++ print("(cluster_name, state, agent_number, service_server_num, ambari_server_num, create_time)") + + json_data = self._load_data() + for cluster in json_data["clusters"]: +@@ -101,4 +101,4 @@ + agent_number += len(agent_vm["docker_list"]) + service_server_num = len(cluster["service_server_vm_list"]) + ambari_server_num = len(cluster["ambari_server_vm"]) +- print cluster_name, state, agent_number, service_server_num, ambari_server_num, create_time ++ print(cluster_name, state, agent_number, service_server_num, ambari_server_num, create_time) +diff -Naur ambari-release-2.7.6-origin/contrib/agent-simulator/docker_image/launcher_agent.py apache-ambari-2.7.6-change/contrib/agent-simulator/docker_image/launcher_agent.py +--- ambari-release-2.7.6-origin/contrib/agent-simulator/docker_image/launcher_agent.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/agent-simulator/docker_image/launcher_agent.py 2022-07-11 00:52:29.000000000 +0800 +@@ -68,7 +68,7 @@ + for index in range(len(all_resolution)): + if index == 0: + token = all_resolution[index].split() +- etc_hosts.write("{0} {1} {2}\n".format(weave_ip, token[1], token[2])) ++ etc_hosts.write("{} {} {}\n".format(weave_ip, token[1], token[2])) + else: + etc_hosts.write(all_resolution[index]) + +diff -Naur ambari-release-2.7.6-origin/contrib/agent-simulator/docker.py apache-ambari-2.7.6-change/contrib/agent-simulator/docker.py +--- ambari-release-2.7.6-origin/contrib/agent-simulator/docker.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/agent-simulator/docker.py 2022-07-11 00:52:29.000000000 +0800 +@@ -34,7 +34,7 @@ + :return: A map, which is JSON format object. + """ + docker_json = {} +- docker_json["weave_ip"] = "{0}/{1}".format(self.ip, self.mask) ++ docker_json["weave_ip"] = "{}/{}".format(self.ip, self.mask) + docker_json["weave_domain_name"] = self.weave_domain_name + return docker_json + +@@ -61,7 +61,7 @@ + :param index: a number + :return: Weave domain name of the docker container + """ +- return "{0}-{1}-{2}.{3}".format(Config.ATTRIBUTES["container_hostname_fix"], ++ return "{}-{}-{}.{}".format(Config.ATTRIBUTES["container_hostname_fix"], + index, cluster_name, "weave.local") + + @staticmethod +diff -Naur ambari-release-2.7.6-origin/contrib/agent-simulator/launcher_ambari_server.py apache-ambari-2.7.6-change/contrib/agent-simulator/launcher_ambari_server.py +--- ambari-release-2.7.6-origin/contrib/agent-simulator/launcher_ambari_server.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/agent-simulator/launcher_ambari_server.py 2022-07-11 00:52:29.000000000 +0800 +@@ -26,8 +26,8 @@ + + if __name__ == "__main__": + if len(sys.argv) < 2: +- print "configure the VM to run Ambari-server and set Weave network" +- print "Arg: " ++ print("configure the VM to run Ambari-server and set Weave network") ++ print("Arg: ") + exit(1) + + Config.load() +diff -Naur ambari-release-2.7.6-origin/contrib/agent-simulator/launcher_cluster.py apache-ambari-2.7.6-change/contrib/agent-simulator/launcher_cluster.py +--- ambari-release-2.7.6-origin/contrib/agent-simulator/launcher_cluster.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/agent-simulator/launcher_cluster.py 2022-07-11 00:52:29.000000000 +0800 +@@ -48,13 +48,13 @@ + with_ambari_server, cluster_name) + + time_to_wait = Config.ATTRIBUTES["gce_boot_time"] +- print "wait ", str(time_to_wait), " seconds for the cluster to boot ... ..." ++ print("wait ", str(time_to_wait), " seconds for the cluster to boot ... ...") + time.sleep(int(time_to_wait)) + + data = Data() + data.add_new_cluster(cluster) + +- print "complete" ++ print("complete") + + + def up_cluster(argv): +@@ -72,21 +72,21 @@ + cluster = Cluster.load_from_json(cluster_name) + + if cluster is None: +- print cluster_name, " cluster not found" ++ print(cluster_name, " cluster not found") + exit(1) + + if cluster.state != Cluster.STATE_FREE: +- print cluster_name, " cluster is already running" ++ print(cluster_name, " cluster is already running") + exit(1) + + ambari_server = cluster.get_ambari_server_vm() + if ambari_server is None: +- print "Unable to run cluster", cluster_name,\ +- " no Ambari-server in this cluster, you can only merge this cluster into another one" ++ print("Unable to run cluster", cluster_name,\ ++ " no Ambari-server in this cluster, you can only merge this cluster into another one") + exit(1) + +- print "Configuring cluster" +- print "Check output folder: ", Config.ATTRIBUTES["output_folder"] ++ print("Configuring cluster") ++ print("Check output folder: ", Config.ATTRIBUTES["output_folder"]) + + cluster.run_cluster(ambari_server.weave_internal_ip, ambari_server.external_ip) + data = Data() +@@ -96,7 +96,7 @@ + # This is an unsolved minor issue. + subprocess.call(["reset"]) + +- print "Complete" ++ print("Complete") + + + def merge_cluster(argv): +@@ -112,11 +112,11 @@ + merged_cluster_name = argv[2] + merged_cluster = Cluster.load_from_json(merged_cluster_name) + if merged_cluster is None: +- print merged_cluster_name, " cluster not found" ++ print(merged_cluster_name, " cluster not found") + exit(1) + + if merged_cluster.state != Cluster.STATE_FREE: +- print merged_cluster_name, " cluster is already running" ++ print(merged_cluster_name, " cluster is already running") + exit(1) + + weave_ip = "" +@@ -126,14 +126,14 @@ + extended_cluster_name = argv[3] + extended_cluster = Cluster.load_from_json(extended_cluster_name) + if extended_cluster is None: +- print extended_cluster_name, " cluster not found" ++ print(extended_cluster_name, " cluster not found") + exit(1) + + if extended_cluster.state != Cluster.STATE_RUNNING: + if extended_cluster.state == Cluster.STATE_FREE: +- print extended_cluster_name, " cluster is not running, can't be extended" ++ print(extended_cluster_name, " cluster is not running, can't be extended") + elif extended_cluster.state.startswith(Cluster.STATE_MERGE): +- print extended_cluster_name, " cluster is merged to another cluster, can't be extended" ++ print(extended_cluster_name, " cluster is merged to another cluster, can't be extended") + exit(1) + + ambari_server = extended_cluster.get_ambari_server_vm() +@@ -149,19 +149,19 @@ + exit(1) + + if merged_cluster.get_ambari_server_vm() is not None: +- print merged_cluster, " cluster has one VM to install Ambari-server, which will NOT be merged" ++ print(merged_cluster, " cluster has one VM to install Ambari-server, which will NOT be merged") + +- print "Configuring cluster" +- print "Check output folder: ", Config.ATTRIBUTES["output_folder"] ++ print("Configuring cluster") ++ print("Check output folder: ", Config.ATTRIBUTES["output_folder"]) + merged_cluster.run_cluster(weave_ip, external_ip) + + data = Data() +- data.set_cluster_state(merged_cluster_name, "{0} to {1}".format(Cluster.STATE_MERGE, extended_cluster_name)) ++ data.set_cluster_state(merged_cluster_name, "{} to {}".format(Cluster.STATE_MERGE, extended_cluster_name)) + + # reset terminal. The SSH subprocess call of the program cause the terminal display to be abnormal. + # This is an unsolved minor issue. + subprocess.call(["reset"]) +- print "Complete" ++ print("Complete") + + + def list_cluster(): +@@ -186,7 +186,7 @@ + cluster = Cluster.load_from_json(cluster_name) + + if cluster is None: +- print cluster_name, " cluster not found" ++ print(cluster_name, " cluster not found") + exit(1) + + cluster.print_description() +@@ -197,41 +197,41 @@ + print help information + :return: None + """ +- print "usage:" +- print ++ print("usage:") ++ print() + +- print "request", " ", "--request a cluster from GCE, generate the configuration for the cluster" +- print "\t\t", "" +- print "\t\t", "" +- print "\t\t", "" +- print "\t\t", ", directly install Ambari-Agent, not inside Dockers" +- print "\t\t", ", either 0 or 1" +- print +- +- print "up", " ", "--run all Ambari-agents and Ambari-server of the cluster" +- print "\t\t", "" +- print +- +- print "merge", " ", "--run one cluster, and add to another cluster" +- print "\t\t", "" +- print "\t\t", "" +- print +- +- print "merge", " ", "--run one cluster, and add to another cluster" +- print "\t\t", "" +- print "\t\t", "" +- print "\t\t", "" +- print +- +- print "list", " ", "--list all the cluster" +- print +- +- print "show", " ", "--show cluster information" +- print "\t\t", "" +- print ++ print("request", " ", "--request a cluster from GCE, generate the configuration for the cluster") ++ print("\t\t", "") ++ print("\t\t", "") ++ print("\t\t", "") ++ print("\t\t", ", directly install Ambari-Agent, not inside Dockers") ++ print("\t\t", ", either 0 or 1") ++ print() ++ ++ print("up", " ", "--run all Ambari-agents and Ambari-server of the cluster") ++ print("\t\t", "") ++ print() ++ ++ print("merge", " ", "--run one cluster, and add to another cluster") ++ print("\t\t", "") ++ print("\t\t", "") ++ print() ++ ++ print("merge", " ", "--run one cluster, and add to another cluster") ++ print("\t\t", "") ++ print("\t\t", "") ++ print("\t\t", "") ++ print() ++ ++ print("list", " ", "--list all the cluster") ++ print() ++ ++ print("show", " ", "--show cluster information") ++ print("\t\t", "") ++ print() + +- print "help", " ", "help info" +- print ++ print("help", " ", "help info") ++ print() + + + def main(argv): +diff -Naur ambari-release-2.7.6-origin/contrib/agent-simulator/launcher_docker.py apache-ambari-2.7.6-change/contrib/agent-simulator/launcher_docker.py +--- ambari-release-2.7.6-origin/contrib/agent-simulator/launcher_docker.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/agent-simulator/launcher_docker.py 2022-07-11 00:52:29.000000000 +0800 +@@ -29,11 +29,11 @@ + + if __name__ == "__main__": + if len(sys.argv) < 5: +- print "configure the VM to set Docker, Weave network, run Ambari-agent inside the Docker" +- print "Args: " +- print " " +- print " " +- print " " ++ print("configure the VM to set Docker, Weave network, run Ambari-agent inside the Docker") ++ print("Args: ") ++ print(" ") ++ print(" ") ++ print(" ") + exit(1) + + Config.load() +diff -Naur ambari-release-2.7.6-origin/contrib/agent-simulator/launcher_service_server.py apache-ambari-2.7.6-change/contrib/agent-simulator/launcher_service_server.py +--- ambari-release-2.7.6-origin/contrib/agent-simulator/launcher_service_server.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/agent-simulator/launcher_service_server.py 2022-07-11 00:52:29.000000000 +0800 +@@ -29,11 +29,11 @@ + + if __name__ == "__main__": + if len(sys.argv) < 5: +- print "configure the VM to set Docker, Weave network, run Ambari-agent inside the Docker" +- print "Args: " +- print " " +- print " " +- print " " ++ print("configure the VM to set Docker, Weave network, run Ambari-agent inside the Docker") ++ print("Args: ") ++ print(" ") ++ print(" ") ++ print(" ") + exit(1) + + Config.load() +diff -Naur ambari-release-2.7.6-origin/contrib/agent-simulator/vm.py apache-ambari-2.7.6-change/contrib/agent-simulator/vm.py +--- ambari-release-2.7.6-origin/contrib/agent-simulator/vm.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/agent-simulator/vm.py 2022-07-11 00:52:29.000000000 +0800 +@@ -85,7 +85,7 @@ + :param hostname: the hostname of the VM + :return:the Weave domain name + """ +- return "{0}.weave.local".format(hostname) ++ return "{}.weave.local".format(hostname) + + def _gce_get_hostname(self, domain_name): + """ +@@ -100,7 +100,7 @@ + get the file name to hold the SSH output of the VM + :return: a file name + """ +- vm_output_file_path = "{0}/vm-{1}-{2}".format(Config.ATTRIBUTES["output_folder"], ++ vm_output_file_path = "{}/vm-{}-{}".format(Config.ATTRIBUTES["output_folder"], + self.hostname, self.external_ip) + return vm_output_file_path + +@@ -130,13 +130,13 @@ + weave_launch_command = ["sudo", "weave", "launch"] + weave_launch_command.extend(vm_external_ip_list) + +- print weave_launch_command ++ print(weave_launch_command) + + with open(os.devnull, 'w') as shutup: + subprocess.call(weave_launch_command, stdout=shutup) + + # establish DNS server +- weave_dns_ip_with_mask = "{0}/{1}".format(weave_dns_ip, Config.ATTRIBUTES["weave_ip_mask"]) ++ weave_dns_ip_with_mask = "{}/{}".format(weave_dns_ip, Config.ATTRIBUTES["weave_ip_mask"]) + weave_launch_dns_command = ["sudo", "weave", "launch-dns", weave_dns_ip_with_mask] + subprocess.call(weave_launch_dns_command) + +@@ -154,7 +154,7 @@ + :return: None + """ + # choose the right Dockerfile +- target_dockerfile_name = "docker_image/{0}".format(Config.ATTRIBUTES["dockerfile_name"]) ++ target_dockerfile_name = "docker_image/{}".format(Config.ATTRIBUTES["dockerfile_name"]) + standard_dockerfile_name = "docker_image/Dockerfile" + shutil.copyfile(target_dockerfile_name, standard_dockerfile_name) + with open(os.devnull, 'w') as shutup: +@@ -175,14 +175,14 @@ + :return: None + """ + for docker in self.docker_list: +- docker_ip_with_mask = "{0}/{1}".format(docker.ip, docker.mask) +- cmd = "python /launcher_agent.py {0} {1}; /bin/bash".format(server_weave_ip, docker.ip) ++ docker_ip_with_mask = "{}/{}".format(docker.ip, docker.mask) ++ cmd = "python /launcher_agent.py {} {}; /bin/bash".format(server_weave_ip, docker.ip) + + command = ["sudo", "weave", "run", docker_ip_with_mask, "-d", "-it", + "-h", docker.weave_domain_name, + "--name", docker.get_container_name(), + docker_image, "bash", "-c", cmd] +- print command ++ print(command) + subprocess.call(command) + + def _set_docker_partition(self, mount_point): +@@ -263,12 +263,12 @@ + + @staticmethod + def get_ambari_agent_vm_name(cluster_name): +- return "{0}-agent-vm".format(cluster_name) ++ return "{}-agent-vm".format(cluster_name) + + @staticmethod + def get_ambari_server_vm_name(cluster_name): +- return "{0}-ambari-server".format(cluster_name) ++ return "{}-ambari-server".format(cluster_name) + + @staticmethod + def get_service_server_vm_name(cluster_name): +- return "{0}-service-server".format(cluster_name) ++ return "{}-service-server".format(cluster_name) +diff -Naur ambari-release-2.7.6-origin/contrib/ambari-scom/.gitignore apache-ambari-2.7.6-change/contrib/ambari-scom/.gitignore +--- ambari-release-2.7.6-origin/contrib/ambari-scom/.gitignore 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/ambari-scom/.gitignore 1970-01-01 08:00:00.000000000 +0800 +@@ -1,11 +0,0 @@ +-.classpath +-.project +-.settings +-.idea/ +-.iml/ +-target +-*.iml +-pass.txt +-.DS_Store +- +- +diff -Naur ambari-release-2.7.6-origin/contrib/management-packs/hdf-ambari-mpack/.gitignore apache-ambari-2.7.6-change/contrib/management-packs/hdf-ambari-mpack/.gitignore +--- ambari-release-2.7.6-origin/contrib/management-packs/hdf-ambari-mpack/.gitignore 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/hdf-ambari-mpack/.gitignore 1970-01-01 08:00:00.000000000 +0800 +@@ -1 +0,0 @@ +-*.swp +diff -Naur ambari-release-2.7.6-origin/contrib/management-packs/hdf-ambari-mpack/src/main/resources/common-services/NIFI/1.0.0/package/scripts/alert_check_nifi.py apache-ambari-2.7.6-change/contrib/management-packs/hdf-ambari-mpack/src/main/resources/common-services/NIFI/1.0.0/package/scripts/alert_check_nifi.py +--- ambari-release-2.7.6-origin/contrib/management-packs/hdf-ambari-mpack/src/main/resources/common-services/NIFI/1.0.0/package/scripts/alert_check_nifi.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/hdf-ambari-mpack/src/main/resources/common-services/NIFI/1.0.0/package/scripts/alert_check_nifi.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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,8 +24,9 @@ + from resource_management.core.exceptions import ComponentIsNotRunning + from resource_management.libraries.functions.check_process_status import check_process_status + from resource_management.libraries.script import Script ++import importlib + +-reload(sys) ++importlib.reload(sys) + sys.setdefaultencoding('utf8') + config = Script.get_config() + +diff -Naur ambari-release-2.7.6-origin/contrib/management-packs/hdf-ambari-mpack/src/main/resources/common-services/NIFI/1.0.0/package/scripts/nifi_ca.py apache-ambari-2.7.6-change/contrib/management-packs/hdf-ambari-mpack/src/main/resources/common-services/NIFI/1.0.0/package/scripts/nifi_ca.py +--- ambari-release-2.7.6-origin/contrib/management-packs/hdf-ambari-mpack/src/main/resources/common-services/NIFI/1.0.0/package/scripts/nifi_ca.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/hdf-ambari-mpack/src/main/resources/common-services/NIFI/1.0.0/package/scripts/nifi_ca.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + """ + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file +@@ -87,8 +87,8 @@ + recursive_ownership=True + ) + +- File(ca_server_script, mode=0755) +- File(run_ca_script, mode=0755) ++ File(ca_server_script, mode=0o755) ++ File(run_ca_script, mode=0o755) + Execute((run_ca_script, params.jdk64_home, ca_server_script, params.nifi_config_dir + '/nifi-certificate-authority.json', params.nifi_ca_log_file_stdout, params.nifi_ca_log_file_stderr, status_params.nifi_ca_pid_file), user=params.nifi_user) + if not os.path.isfile(status_params.nifi_ca_pid_file): + raise Exception('Expected pid file to exist') +diff -Naur ambari-release-2.7.6-origin/contrib/management-packs/hdf-ambari-mpack/src/main/resources/common-services/NIFI/1.0.0/package/scripts/nifi_ca_util.py apache-ambari-2.7.6-change/contrib/management-packs/hdf-ambari-mpack/src/main/resources/common-services/NIFI/1.0.0/package/scripts/nifi_ca_util.py +--- ambari-release-2.7.6-origin/contrib/management-packs/hdf-ambari-mpack/src/main/resources/common-services/NIFI/1.0.0/package/scripts/nifi_ca_util.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/hdf-ambari-mpack/src/main/resources/common-services/NIFI/1.0.0/package/scripts/nifi_ca_util.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + """ + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file +@@ -38,12 +38,12 @@ + File(config_json, + owner=params.nifi_user, + group=params.nifi_group, +- mode=0600, ++ mode=0o600, + content=PasswordString(json.dumps(config_dict, sort_keys=True, indent=4)) + ) + + def overlay(config_dict, overlay_dict): +- for k, v in overlay_dict.iteritems(): ++ for k, v in overlay_dict.items(): + if v or k not in config_dict: + config_dict[k] = v + +diff -Naur ambari-release-2.7.6-origin/contrib/management-packs/hdf-ambari-mpack/src/main/resources/common-services/NIFI/1.0.0/package/scripts/nifi_constants.py apache-ambari-2.7.6-change/contrib/management-packs/hdf-ambari-mpack/src/main/resources/common-services/NIFI/1.0.0/package/scripts/nifi_constants.py +--- ambari-release-2.7.6-origin/contrib/management-packs/hdf-ambari-mpack/src/main/resources/common-services/NIFI/1.0.0/package/scripts/nifi_constants.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/hdf-ambari-mpack/src/main/resources/common-services/NIFI/1.0.0/package/scripts/nifi_constants.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/contrib/management-packs/hdf-ambari-mpack/src/main/resources/common-services/NIFI/1.0.0/package/scripts/nifi.py apache-ambari-2.7.6-change/contrib/management-packs/hdf-ambari-mpack/src/main/resources/common-services/NIFI/1.0.0/package/scripts/nifi.py +--- ambari-release-2.7.6-origin/contrib/management-packs/hdf-ambari-mpack/src/main/resources/common-services/NIFI/1.0.0/package/scripts/nifi.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/hdf-ambari-mpack/src/main/resources/common-services/NIFI/1.0.0/package/scripts/nifi.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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,8 +23,9 @@ + from resource_management import * + from subprocess import call + from setup_ranger_nifi import setup_ranger_nifi ++import importlib + +-reload(sys) ++importlib.reload(sys) + sys.setdefaultencoding('utf8') + + class Master(Script): +@@ -71,13 +72,13 @@ + File(os.path.join(params.limits_conf_dir, 'nifi.conf'), + owner='root', + group='root', +- mode=0644, ++ mode=0o644, + content=Template("nifi.conf.j2") + ) + + + ca_client_script = nifi_ca_util.get_toolkit_script('tls-toolkit.sh') +- File(ca_client_script, mode=0755) ++ File(ca_client_script, mode=0o755) + + + if params.nifi_ca_host and params.nifi_ssl_enabled: +@@ -98,37 +99,37 @@ + #write out nifi.properties + PropertiesFile(params.nifi_config_dir + '/nifi.properties', + properties = params.nifi_properties, +- mode = 0400, ++ mode = 0o400, + owner = params.nifi_user, + group = params.nifi_group) + + #write out boostrap.conf + bootstrap_content=InlineTemplate(params.nifi_boostrap_content) +- File(format("{params.nifi_config_dir}/bootstrap.conf"), content=bootstrap_content, owner=params.nifi_user, group=params.nifi_group, mode=0400) ++ File(format("{params.nifi_config_dir}/bootstrap.conf"), content=bootstrap_content, owner=params.nifi_user, group=params.nifi_group, mode=0o400) + + #write out logback.xml + logback_content=InlineTemplate(params.nifi_node_logback_content) +- File(format("{params.nifi_config_dir}/logback.xml"), content=logback_content, owner=params.nifi_user, group=params.nifi_group, mode=0400) ++ File(format("{params.nifi_config_dir}/logback.xml"), content=logback_content, owner=params.nifi_user, group=params.nifi_group, mode=0o400) + + #write out state-management.xml + statemgmt_content=InlineTemplate(params.nifi_state_management_content) +- File(format("{params.nifi_config_dir}/state-management.xml"), content=statemgmt_content, owner=params.nifi_user, group=params.nifi_group, mode=0400) ++ File(format("{params.nifi_config_dir}/state-management.xml"), content=statemgmt_content, owner=params.nifi_user, group=params.nifi_group, mode=0o400) + + #write out authorizers file + authorizers_content=InlineTemplate(params.nifi_authorizers_content) +- File(format("{params.nifi_config_dir}/authorizers.xml"), content=authorizers_content, owner=params.nifi_user, group=params.nifi_group, mode=0400) ++ File(format("{params.nifi_config_dir}/authorizers.xml"), content=authorizers_content, owner=params.nifi_user, group=params.nifi_group, mode=0o400) + + #write out login-identity-providers.xml + login_identity_providers_content=InlineTemplate(params.nifi_login_identity_providers_content) +- File(format("{params.nifi_config_dir}/login-identity-providers.xml"), content=login_identity_providers_content, owner=params.nifi_user, group=params.nifi_group, mode=0400) ++ File(format("{params.nifi_config_dir}/login-identity-providers.xml"), content=login_identity_providers_content, owner=params.nifi_user, group=params.nifi_group, mode=0o400) + + #write out nifi-env in bin as 0755 (see BUG-61769) + env_content=InlineTemplate(params.nifi_env_content) +- File(format("{params.bin_dir}/nifi-env.sh"), content=env_content, owner=params.nifi_user, group=params.nifi_group, mode=0755) ++ File(format("{params.bin_dir}/nifi-env.sh"), content=env_content, owner=params.nifi_user, group=params.nifi_group, mode=0o755) + + #write out bootstrap-notification-services.xml + boostrap_notification_content=InlineTemplate(params.nifi_boostrap_notification_content) +- File(format("{params.nifi_config_dir}/bootstrap-notification-services.xml"), content=boostrap_notification_content, owner=params.nifi_user, group=params.nifi_group, mode=0400) ++ File(format("{params.nifi_config_dir}/bootstrap-notification-services.xml"), content=boostrap_notification_content, owner=params.nifi_user, group=params.nifi_group, mode=0o400) + + def stop(self, env): + import params +@@ -149,7 +150,7 @@ + if params.metrics_collector_host and params.nifi_ambari_reporting_enabled and self.check_is_fresh_install(self): + Execute('echo "First time setup so generating flow.xml.gz" >> ' + params.nifi_node_log_file, user=params.nifi_user) + flow_content=InlineTemplate(params.nifi_flow_content) +- File(format("{params.nifi_flow_config_dir}/flow.xml"), content=flow_content, owner=params.nifi_user, group=params.nifi_group, mode=0600) ++ File(format("{params.nifi_flow_config_dir}/flow.xml"), content=flow_content, owner=params.nifi_user, group=params.nifi_group, mode=0o600) + Execute(format("cd {params.nifi_flow_config_dir}; mv flow.xml.gz flow_$(date +%d-%m-%Y).xml.gz ;"),user=params.nifi_user,ignore_failures=True) + Execute(format("cd {params.nifi_flow_config_dir}; gzip flow.xml;"), user=params.nifi_user) + +@@ -191,7 +192,7 @@ + + # create the ZooKeeper query command e.g. + # /usr/hdf/current/zookeeper-client/bin/zkCli.sh -server node:2181 ls /nifi +- command = "{0} -server {1}:{2} ls {3}".format( ++ command = "{} -server {}:{} ls {}".format( + zk_command_location, zookeeper_server, params.zookeeper_port, params.nifi_znode) + + # echo 'ls /nifi' | /usr/hdf/current/zookeeper-client/bin/zkCli.sh -server node:2181 +@@ -217,7 +218,7 @@ + + # fail if the ZK data could not be queried + if not zookeeper_queried: +- raise Fail("Unable to query for znode on on any of the following ZooKeeper hosts: {0}. Please ensure Zookeepers are started and retry".format( ++ raise Fail("Unable to query for znode on on any of the following ZooKeeper hosts: {}. Please ensure Zookeepers are started and retry".format( + zookeeper_server_list)) + else: + return is_fresh_nifi_install +diff -Naur ambari-release-2.7.6-origin/contrib/management-packs/hdf-ambari-mpack/src/main/resources/common-services/NIFI/1.0.0/package/scripts/params.py apache-ambari-2.7.6-change/contrib/management-packs/hdf-ambari-mpack/src/main/resources/common-services/NIFI/1.0.0/package/scripts/params.py +--- ambari-release-2.7.6-origin/contrib/management-packs/hdf-ambari-mpack/src/main/resources/common-services/NIFI/1.0.0/package/scripts/params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/hdf-ambari-mpack/src/main/resources/common-services/NIFI/1.0.0/package/scripts/params.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + """ + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file +@@ -296,8 +296,8 @@ + + if has_ranger_admin: + enable_ranger_nifi = (config['configurations']['ranger-nifi-plugin-properties']['ranger-nifi-plugin-enabled'].lower() == 'yes') +- xa_audit_db_password = unicode(config['configurations']['admin-properties']['audit_db_password']) if stack_supports_ranger_audit_db else None +- repo_config_password = unicode(config['configurations']['ranger-nifi-plugin-properties']['REPOSITORY_CONFIG_PASSWORD']) ++ xa_audit_db_password = str(config['configurations']['admin-properties']['audit_db_password']) if stack_supports_ranger_audit_db else None ++ repo_config_password = str(config['configurations']['ranger-nifi-plugin-properties']['REPOSITORY_CONFIG_PASSWORD']) + xa_audit_db_flavor = (config['configurations']['admin-properties']['DB_FLAVOR']).lower() + previous_jdbc_jar_name= None + +@@ -339,8 +339,8 @@ + previous_jdbc_jar = format("{stack_root}/current/nifi/ext/{previous_jdbc_jar_name}") if stack_supports_ranger_audit_db else None + sql_connector_jar = '' + +- ssl_keystore_password = unicode(config['configurations']['ranger-nifi-policymgr-ssl']['xasecure.policymgr.clientssl.keystore.password']) if xml_configurations_supported else None +- ssl_truststore_password = unicode(config['configurations']['ranger-nifi-policymgr-ssl']['xasecure.policymgr.clientssl.truststore.password']) if xml_configurations_supported else None ++ ssl_keystore_password = str(config['configurations']['ranger-nifi-policymgr-ssl']['xasecure.policymgr.clientssl.keystore.password']) if xml_configurations_supported else None ++ ssl_truststore_password = str(config['configurations']['ranger-nifi-policymgr-ssl']['xasecure.policymgr.clientssl.truststore.password']) if xml_configurations_supported else None + credential_file = format('/etc/ranger/{repo_name}/cred.jceks') if xml_configurations_supported else None + credential_file_type = 'jceks' + ranger_admin_username = config['configurations']['ranger-env']['ranger_admin_username'] +diff -Naur ambari-release-2.7.6-origin/contrib/management-packs/hdf-ambari-mpack/src/main/resources/common-services/NIFI/1.0.0/package/scripts/service_check.py apache-ambari-2.7.6-change/contrib/management-packs/hdf-ambari-mpack/src/main/resources/common-services/NIFI/1.0.0/package/scripts/service_check.py +--- ambari-release-2.7.6-origin/contrib/management-packs/hdf-ambari-mpack/src/main/resources/common-services/NIFI/1.0.0/package/scripts/service_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/hdf-ambari-mpack/src/main/resources/common-services/NIFI/1.0.0/package/scripts/service_check.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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,8 +19,8 @@ + """ + + import os +-import urllib2 +-import httplib ++import urllib.request, urllib.error, urllib.parse ++import http.client + + from resource_management.core.logger import Logger + from resource_management.libraries.functions.format import format +@@ -38,38 +38,38 @@ + for nifi_master_host in params.nifi_master_hosts: + url = "" + if params.nifi_ssl_enabled: +- url = "https://{0}:{1}/nifi".format(nifi_master_host, params.nifi_node_ssl_port) ++ url = "https://{}:{}/nifi".format(nifi_master_host, params.nifi_node_ssl_port) + else: +- url = "http://{0}:{1}/nifi".format(nifi_master_host, params.nifi_node_port) +- Logger.info("Checking Nifi portal {0} status".format(url)) ++ url = "http://{}:{}/nifi".format(nifi_master_host, params.nifi_node_port) ++ Logger.info("Checking Nifi portal {} status".format(url)) + NifiServiceCheck.check_nifi_portal(url) + + @staticmethod + @retry(times=15, sleep_time=5, max_sleep_time=20, backoff_factor=2, err_class=Fail) + def check_nifi_portal(url): + try: +- request = urllib2.Request(url) ++ request = urllib.request.Request(url) + result = openurl(request, timeout=20) + response_code = result.getcode() + if response_code == 200 or response_code == 401: +- Logger.info("Nifi portal {0} is up. Response code {1}".format(url, response_code)) ++ Logger.info("Nifi portal {} is up. Response code {}".format(url, response_code)) + else: +- raise Fail("Error connecting to {0}. Response code {1}".format(url, response_code)) +- except urllib2.URLError, e: +- if isinstance(e, urllib2.HTTPError): ++ raise Fail("Error connecting to {}. Response code {}".format(url, response_code)) ++ except urllib.error.URLError as e: ++ if isinstance(e, urllib.error.HTTPError): + if e.code == 401: +- Logger.info("Nifi portal {0} is up. Response code {1}".format(url, e.code)) ++ Logger.info("Nifi portal {} is up. Response code {}".format(url, e.code)) + else: +- raise Fail("Error connecting to {0}. Http status code - {1}. \n {2}".format(url, e.code, e.read())) ++ raise Fail("Error connecting to {}. Http status code - {}. \n {}".format(url, e.code, e.read())) + elif e.reason and "violation of protocol" in str(e.reason): +- Logger.info("Ignore certificate validation error - {0}".format(e.reason)) ++ Logger.info("Ignore certificate validation error - {}".format(e.reason)) + pass + else: +- raise Fail("Error connecting to {0}. Reason - {1}.".format(url, e.reason)) +- except httplib.BadStatusLine: +- raise Fail("Error connecting to {0}. Reason - Not Reachable".format(url)) ++ raise Fail("Error connecting to {}. Reason - {}.".format(url, e.reason)) ++ except http.client.BadStatusLine: ++ raise Fail("Error connecting to {}. Reason - Not Reachable".format(url)) + except TimeoutError: +- raise Fail("Error connecting to {0}. Reason - Timeout".format(url)) ++ raise Fail("Error connecting to {}. Reason - Timeout".format(url)) + + if __name__ == "__main__": + NifiServiceCheck().execute() +\ 文件尾没有换行符 +diff -Naur ambari-release-2.7.6-origin/contrib/management-packs/hdf-ambari-mpack/src/main/resources/common-services/NIFI/1.0.0/package/scripts/setup_ranger_nifi.py apache-ambari-2.7.6-change/contrib/management-packs/hdf-ambari-mpack/src/main/resources/common-services/NIFI/1.0.0/package/scripts/setup_ranger_nifi.py +--- ambari-release-2.7.6-origin/contrib/management-packs/hdf-ambari-mpack/src/main/resources/common-services/NIFI/1.0.0/package/scripts/setup_ranger_nifi.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/hdf-ambari-mpack/src/main/resources/common-services/NIFI/1.0.0/package/scripts/setup_ranger_nifi.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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,9 +60,9 @@ + component_user_keytab=params.ranger_nifi_keytab if params.security_enabled else None) + + #change permissions of ranger xml that were written to 0400 +- File(os.path.join(params.nifi_config_dir, 'ranger-nifi-audit.xml'), owner=params.nifi_user, group=params.nifi_group, mode=0400) +- File(os.path.join(params.nifi_config_dir, 'ranger-nifi-security.xml'), owner=params.nifi_user, group=params.nifi_group, mode=0400) +- File(os.path.join(params.nifi_config_dir, 'ranger-policymgr-ssl.xml'), owner=params.nifi_user, group=params.nifi_group, mode=0400) ++ File(os.path.join(params.nifi_config_dir, 'ranger-nifi-audit.xml'), owner=params.nifi_user, group=params.nifi_group, mode=0o400) ++ File(os.path.join(params.nifi_config_dir, 'ranger-nifi-security.xml'), owner=params.nifi_user, group=params.nifi_group, mode=0o400) ++ File(os.path.join(params.nifi_config_dir, 'ranger-policymgr-ssl.xml'), owner=params.nifi_user, group=params.nifi_group, mode=0o400) + + else: + Logger.info('Ranger admin not installed') +\ 文件尾没有换行符 +diff -Naur ambari-release-2.7.6-origin/contrib/management-packs/hdf-ambari-mpack/src/main/resources/common-services/NIFI/1.0.0/package/scripts/status_params.py apache-ambari-2.7.6-change/contrib/management-packs/hdf-ambari-mpack/src/main/resources/common-services/NIFI/1.0.0/package/scripts/status_params.py +--- ambari-release-2.7.6-origin/contrib/management-packs/hdf-ambari-mpack/src/main/resources/common-services/NIFI/1.0.0/package/scripts/status_params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/hdf-ambari-mpack/src/main/resources/common-services/NIFI/1.0.0/package/scripts/status_params.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/contrib/management-packs/hdf-ambari-mpack/src/main/resources/hooks/after_install.py apache-ambari-2.7.6-change/contrib/management-packs/hdf-ambari-mpack/src/main/resources/hooks/after_install.py +--- ambari-release-2.7.6-origin/contrib/management-packs/hdf-ambari-mpack/src/main/resources/hooks/after_install.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/hdf-ambari-mpack/src/main/resources/hooks/after_install.py 2022-07-11 00:52:29.000000000 +0800 +@@ -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 @@ + def main(): + properties = get_ambari_properties() + if properties == -1: +- print >> sys.stderr, "Error getting ambari properties" ++ print("Error getting ambari properties", file=sys.stderr) + return -1 + + resources_location = get_resources_location(properties) +@@ -36,12 +36,12 @@ + path = os.path.join(views_dir, file) + if os.path.isfile(path): + if "ambari-admin" in path or "storm-view" in path: +- print "Keeping views jar : " + path ++ print("Keeping views jar : " + path) + else: +- print "Deleting views jar : " + path ++ print("Deleting views jar : " + path) + sudo.unlink(path) + else: +- print "Deleting views directory : " + path ++ print("Deleting views directory : " + path) + sudo.rmtree(path) + return 0 + +diff -Naur ambari-release-2.7.6-origin/contrib/management-packs/hdf-ambari-mpack/src/main/resources/stacks/HDF/2.0/hooks/after-INSTALL/scripts/shared_initialization.py apache-ambari-2.7.6-change/contrib/management-packs/hdf-ambari-mpack/src/main/resources/stacks/HDF/2.0/hooks/after-INSTALL/scripts/shared_initialization.py +--- ambari-release-2.7.6-origin/contrib/management-packs/hdf-ambari-mpack/src/main/resources/stacks/HDF/2.0/hooks/after-INSTALL/scripts/shared_initialization.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/hdf-ambari-mpack/src/main/resources/stacks/HDF/2.0/hooks/after-INSTALL/scripts/shared_initialization.py 2022-07-11 00:52:29.000000000 +0800 +@@ -50,7 +50,7 @@ + json_version = load_version(struct_out_file) + + if not json_version: +- Logger.info("There is no advertised version for this component stored in {0}".format(struct_out_file)) ++ Logger.info("There is no advertised version for this component stored in {}".format(struct_out_file)) + return + + # On parallel command execution this should be executed by a single process at a time. +@@ -62,7 +62,7 @@ + def setup_config(): + import params + stackversion = params.stack_version_unformatted +- Logger.info("FS Type: {0}".format(params.dfs_type)) ++ Logger.info("FS Type: {}".format(params.dfs_type)) + + is_hadoop_conf_dir_present = False + if hasattr(params, "hadoop_conf_dir") and params.hadoop_conf_dir is not None and os.path.exists(params.hadoop_conf_dir): +@@ -88,7 +88,7 @@ + json_version = None + try: + if os.path.exists(struct_out_file): +- with open(struct_out_file, 'r') as fp: ++ with open(struct_out_file) as fp: + json_info = json.load(fp) + json_version = json_info['version'] + except: +@@ -110,10 +110,10 @@ + json_version = load_version(struct_out_file) + + if not json_version: +- Logger.info("Could not load 'version' from {0}".format(struct_out_file)) ++ Logger.info("Could not load 'version' from {}".format(struct_out_file)) + return + + # 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 k, v in conf_select.get_package_dirs().iteritems(): ++ for k, v in conf_select.get_package_dirs().items(): + conf_select.convert_conf_directories_to_symlinks(k, json_version, v) +\ 文件尾没有换行符 +diff -Naur ambari-release-2.7.6-origin/contrib/management-packs/hdf-ambari-mpack/src/main/resources/stacks/HDF/2.0/hooks/before-ANY/scripts/shared_initialization.py apache-ambari-2.7.6-change/contrib/management-packs/hdf-ambari-mpack/src/main/resources/stacks/HDF/2.0/hooks/before-ANY/scripts/shared_initialization.py +--- ambari-release-2.7.6-origin/contrib/management-packs/hdf-ambari-mpack/src/main/resources/stacks/HDF/2.0/hooks/before-ANY/scripts/shared_initialization.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/hdf-ambari-mpack/src/main/resources/stacks/HDF/2.0/hooks/before-ANY/scripts/shared_initialization.py 2022-07-11 00:52:29.000000000 +0800 +@@ -56,7 +56,7 @@ + if params.has_hbase_masters: + Directory (params.hbase_tmp_dir, + owner = params.hbase_user, +- mode=0775, ++ mode=0o775, + create_parents = True, + cd_access="a", + ) +@@ -103,7 +103,7 @@ + + import params + +- parts = re.split('\s', user_and_groups) ++ parts = re.split(r'\s', user_and_groups) + if len(parts) == 1: + parts.append("") + +@@ -128,7 +128,7 @@ + + File(format("{tmp_dir}/changeUid.sh"), + content=StaticFile("changeToSecureUid.sh"), +- mode=0555) ++ mode=0o555) + ignore_groupsusers_create_str = str(params.ignore_groupsusers_create).lower() + Execute(format("{tmp_dir}/changeUid.sh {user} {user_dirs}"), + not_if = format("(test $(id -u {user}) -gt 1000) || ({ignore_groupsusers_create_str})")) +@@ -136,7 +136,7 @@ + def setup_hadoop_env(): + import params + stackversion = params.stack_version_unformatted +- Logger.info("FS Type: {0}".format(params.dfs_type)) ++ Logger.info("FS Type: {}".format(params.dfs_type)) + if params.has_namenode or stackversion.find('Gluster') >= 0 or params.dfs_type == 'HCFS': + if params.security_enabled: + tc_owner = "root" +@@ -144,7 +144,7 @@ + tc_owner = params.hdfs_user + + # create /etc/hadoop +- Directory(params.hadoop_dir, mode=0755) ++ Directory(params.hadoop_dir, mode=0o755) + + # HDF < 0.2 used a conf -> conf.empty symlink for /etc/hadoop/ + if Script.is_stack_less_than("0.2"): +@@ -165,7 +165,7 @@ + Directory(params.hadoop_java_io_tmpdir, + owner=params.hdfs_user, + group=params.user_group, +- mode=0777 ++ mode=0o777 + ) + + def setup_java(): +@@ -216,7 +216,7 @@ + Directory(tmp_java_dir, action="delete") + + File(format("{java_home}/bin/java"), +- mode=0755, ++ mode=0o755, + cd_access="a", + ) + Execute(('chmod', '-R', '755', params.java_home), +diff -Naur ambari-release-2.7.6-origin/contrib/management-packs/hdf-ambari-mpack/src/main/resources/stacks/HDF/2.0/hooks/before-INSTALL/scripts/repo_initialization.py apache-ambari-2.7.6-change/contrib/management-packs/hdf-ambari-mpack/src/main/resources/stacks/HDF/2.0/hooks/before-INSTALL/scripts/repo_initialization.py +--- ambari-release-2.7.6-origin/contrib/management-packs/hdf-ambari-mpack/src/main/resources/stacks/HDF/2.0/hooks/before-INSTALL/scripts/repo_initialization.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/hdf-ambari-mpack/src/main/resources/stacks/HDF/2.0/hooks/before-INSTALL/scripts/repo_initialization.py 2022-07-11 00:52:29.000000000 +0800 +@@ -38,7 +38,7 @@ + if 0 == len(repo_dicts): + Logger.info("Repository list is empty. Ambari may not be managing the repositories.") + else: +- Logger.info("Initializing {0} repositories".format(str(len(repo_dicts)))) ++ Logger.info("Initializing {} repositories".format(str(len(repo_dicts)))) + + for repo in repo_dicts: + if not 'baseUrl' in repo: +diff -Naur ambari-release-2.7.6-origin/contrib/management-packs/hdf-ambari-mpack/src/main/resources/stacks/HDF/2.0/hooks/before-START/files/topology_script.py apache-ambari-2.7.6-change/contrib/management-packs/hdf-ambari-mpack/src/main/resources/stacks/HDF/2.0/hooks/before-START/files/topology_script.py +--- ambari-release-2.7.6-origin/contrib/management-packs/hdf-ambari-mpack/src/main/resources/stacks/HDF/2.0/hooks/before-START/files/topology_script.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/hdf-ambari-mpack/src/main/resources/stacks/HDF/2.0/hooks/before-START/files/topology_script.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 sys, os + from string import join +-import ConfigParser ++import configparser + + + DEFAULT_RACK = "/default-rack" +@@ -31,10 +31,10 @@ + 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): +@@ -60,7 +60,7 @@ + def execute(self, args): + rack_map = self.load_rack_map() + rack = self.get_racks(rack_map, args) +- print rack ++ print(rack) + + if __name__ == "__main__": + TopologyScript().execute(sys.argv) +diff -Naur ambari-release-2.7.6-origin/contrib/management-packs/hdf-ambari-mpack/src/main/resources/stacks/HDF/2.0/hooks/before-START/scripts/params.py apache-ambari-2.7.6-change/contrib/management-packs/hdf-ambari-mpack/src/main/resources/stacks/HDF/2.0/hooks/before-START/scripts/params.py +--- ambari-release-2.7.6-origin/contrib/management-packs/hdf-ambari-mpack/src/main/resources/stacks/HDF/2.0/hooks/before-START/scripts/params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/hdf-ambari-mpack/src/main/resources/stacks/HDF/2.0/hooks/before-START/scripts/params.py 2022-07-11 00:52:29.000000000 +0800 +@@ -248,7 +248,7 @@ + default_fs = config['configurations']['core-site']['fs.defaultFS'] + 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 -Naur ambari-release-2.7.6-origin/contrib/management-packs/hdf-ambari-mpack/src/main/resources/stacks/HDF/2.0/hooks/before-START/scripts/rack_awareness.py apache-ambari-2.7.6-change/contrib/management-packs/hdf-ambari-mpack/src/main/resources/stacks/HDF/2.0/hooks/before-START/scripts/rack_awareness.py +--- ambari-release-2.7.6-origin/contrib/management-packs/hdf-ambari-mpack/src/main/resources/stacks/HDF/2.0/hooks/before-START/scripts/rack_awareness.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/hdf-ambari-mpack/src/main/resources/stacks/HDF/2.0/hooks/before-START/scripts/rack_awareness.py 2022-07-11 00:52:29.000000000 +0800 +@@ -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 @@ + + 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 -Naur ambari-release-2.7.6-origin/contrib/management-packs/hdf-ambari-mpack/src/main/resources/stacks/HDF/2.0/hooks/before-START/scripts/shared_initialization.py apache-ambari-2.7.6-change/contrib/management-packs/hdf-ambari-mpack/src/main/resources/stacks/HDF/2.0/hooks/before-START/scripts/shared_initialization.py +--- ambari-release-2.7.6-origin/contrib/management-packs/hdf-ambari-mpack/src/main/resources/stacks/HDF/2.0/hooks/before-START/scripts/shared_initialization.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/hdf-ambari-mpack/src/main/resources/stacks/HDF/2.0/hooks/before-START/scripts/shared_initialization.py 2022-07-11 00:52:29.000000000 +0800 +@@ -40,7 +40,7 @@ + create_parents = True, + owner='root', + group=params.user_group, +- mode=0775, ++ mode=0o775, + cd_access='a', + ) + if params.has_namenode: +@@ -63,11 +63,11 @@ + + # if WebHDFS is not enabled we need this jar to create hadoop folders. + if params.host_sys_prepped: +- 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") + elif params.dfs_type == 'HCFS' or not WebHDFSUtil.is_webhdfs_available(params.is_webhdfs_enabled, params.default_fs): + # 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") + ) + +@@ -86,14 +86,14 @@ + 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=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, + ) +@@ -118,7 +118,7 @@ + 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')): +@@ -147,7 +147,7 @@ + type="directory", + action="create_on_execute", + owner=params.hdfs_user, +- mode=0777 ++ mode=0o777 + ) + params.HdfsResource(params.smoke_hdfs_user_dir, + type="directory", +diff -Naur ambari-release-2.7.6-origin/contrib/management-packs/hdf-ambari-mpack/src/main/resources/stacks/HDF/2.0/services/stack_advisor.py apache-ambari-2.7.6-change/contrib/management-packs/hdf-ambari-mpack/src/main/resources/stacks/HDF/2.0/services/stack_advisor.py +--- ambari-release-2.7.6-origin/contrib/management-packs/hdf-ambari-mpack/src/main/resources/stacks/HDF/2.0/services/stack_advisor.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/hdf-ambari-mpack/src/main/resources/stacks/HDF/2.0/services/stack_advisor.py 2022-07-11 00:52:29.000000000 +0800 +@@ -30,10 +30,10 @@ + + def getComponentLayoutValidations(self, services, hosts): + """Returns array of Validation objects about issues with hostnames components assigned to""" +- items = super(HDF20StackAdvisor, self).getComponentLayoutValidations(services, hosts) ++ items = super().getComponentLayoutValidations(services, hosts) + + # Use a set for fast lookup +- hostsSet = set(super(HDF20StackAdvisor, self).getActiveHosts([host["Hosts"] for host in hosts["items"]])) #[host["Hosts"]["host_name"] for host in hosts["items"]] ++ hostsSet = set(super().getActiveHosts([host["Hosts"] for host in hosts["items"]])) #[host["Hosts"]["host_name"] for host in hosts["items"]] + hostsCount = len(hostsSet) + + componentsListList = [service["components"] for service in services["services"]] +@@ -54,19 +54,19 @@ + if "+" in cardinality: + hostsMin = int(cardinality[:-1]) + if componentHostsCount < hostsMin: +- message = "At least {0} {1} components should be installed in cluster.".format(hostsMin, componentDisplayName) ++ message = "At least {} {} components should be installed in cluster.".format(hostsMin, componentDisplayName) + elif "-" in cardinality: + nums = cardinality.split("-") + hostsMin = int(nums[0]) + hostsMax = int(nums[1]) + if componentHostsCount > hostsMax or componentHostsCount < hostsMin: +- message = "Between {0} and {1} {2} components should be installed in cluster.".format(hostsMin, hostsMax, componentDisplayName) ++ message = "Between {} and {} {} components should be installed in cluster.".format(hostsMin, hostsMax, componentDisplayName) + elif "ALL" == cardinality: + if componentHostsCount != hostsCount: +- message = "{0} component should be installed on all hosts in cluster.".format(componentDisplayName) ++ message = "{} component should be installed on all hosts in cluster.".format(componentDisplayName) + else: + if componentHostsCount != int(cardinality): +- message = "Exactly {0} {1} components should be installed in cluster.".format(int(cardinality), componentDisplayName) ++ message = "Exactly {} {} components should be installed in cluster.".format(int(cardinality), componentDisplayName) + + if message is not None: + items.append({"type": 'host-component', "level": 'ERROR', "message": message, "component-name": componentName}) +@@ -95,9 +95,9 @@ + changedConfigs = [] + # if services parameter, prefer values, set by user + if services: +- if 'configurations' in services.keys(): ++ if 'configurations' in list(services.keys()): + userConfigs = services['configurations'] +- if 'changed-configurations' in services.keys(): ++ if 'changed-configurations' in list(services.keys()): + changedConfigs = services["changed-configurations"] + + if configType not in config: +@@ -225,7 +225,7 @@ + else: + colon_count = db_host.count(':') + if colon_count == 0: +- if DB_TYPE_DEFAULT_PORT_MAP.has_key(db_type): ++ if db_type in DB_TYPE_DEFAULT_PORT_MAP: + connection_string = db_host + ":" + DB_TYPE_DEFAULT_PORT_MAP[db_type] + else: + connection_string = db_host +@@ -295,7 +295,7 @@ + policymgr_external_url = services['configurations']['admin-properties']['properties']['policymgr_external_url'] + else: + ranger_admin_host = ranger_admin_hosts[0] +- policymgr_external_url = "{0}://{1}:{2}".format(protocol, ranger_admin_host, port) ++ policymgr_external_url = "{}://{}:{}".format(protocol, ranger_admin_host, port) + + putRangerAdminProperty('policymgr_external_url', policymgr_external_url) + +@@ -403,10 +403,10 @@ + if 'infra-solr-env' in services['configurations'] and \ + ('infra_solr_znode' in services['configurations']['infra-solr-env']['properties']): + infra_solr_znode = services['configurations']['infra-solr-env']['properties']['infra_solr_znode'] +- ranger_audit_zk_port = '{0}{1}'.format(zookeeper_host_port, infra_solr_znode) ++ ranger_audit_zk_port = '{}{}'.format(zookeeper_host_port, infra_solr_znode) + putRangerAdminSiteProperty('ranger.audit.solr.zookeepers', ranger_audit_zk_port) + elif zookeeper_host_port and is_solr_cloud_enabled and is_external_solr_cloud_enabled: +- ranger_audit_zk_port = '{0}/{1}'.format(zookeeper_host_port, 'ranger_audits') ++ ranger_audit_zk_port = '{}/{}'.format(zookeeper_host_port, 'ranger_audits') + putRangerAdminSiteProperty('ranger.audit.solr.zookeepers', ranger_audit_zk_port) + else: + putRangerAdminSiteProperty('ranger.audit.solr.zookeepers', 'NONE') +@@ -497,8 +497,8 @@ + total_sinks_count = 0 + # minimum heap size + hbase_heapsize = 500 +- for serviceName, componentsDict in schMemoryMap.items(): +- for componentName, multiplier in componentsDict.items(): ++ for serviceName, componentsDict in list(schMemoryMap.items()): ++ for componentName, multiplier in list(componentsDict.items()): + schCount = len( + self.getHostsWithComponent(serviceName, componentName, services, + hosts)) +@@ -1002,13 +1002,13 @@ + userValue = convertToNumber(configurations[configName]["properties"][propertyName]) + maxValue = convertToNumber(recommendedDefaults[configName]["property_attributes"][propertyName]["maximum"]) + if userValue > maxValue: +- validationItems.extend([{"config-name": propertyName, "item": self.getWarnItem("Value is greater than the recommended maximum of {0} ".format(maxValue))}]) ++ validationItems.extend([{"config-name": propertyName, "item": self.getWarnItem("Value is greater than the recommended maximum of {} ".format(maxValue))}]) + if "minimum" in recommendedDefaults[configName]["property_attributes"][propertyName] and \ + propertyName in recommendedDefaults[configName]["properties"]: + userValue = convertToNumber(configurations[configName]["properties"][propertyName]) + minValue = convertToNumber(recommendedDefaults[configName]["property_attributes"][propertyName]["minimum"]) + if userValue < minValue: +- validationItems.extend([{"config-name": propertyName, "item": self.getWarnItem("Value is less than the recommended minimum of {0} ".format(minValue))}]) ++ validationItems.extend([{"config-name": propertyName, "item": self.getWarnItem("Value is less than the recommended minimum of {} ".format(minValue))}]) + items.extend(self.toConfigurationValidationProblems(validationItems, configName)) + pass + +@@ -1074,7 +1074,7 @@ + if distributed.lower() == "true" and op_mode == "distributed" and \ + hbase_zk_client_port != zkPort and hbase_zk_client_port != "{{zookeeper_clientPort}}": + hbase_zk_client_port_item = self.getErrorItem("In AMS distributed mode, hbase.zookeeper.property.clientPort " +- "should be the cluster zookeeper server port : {0}".format(zkPort)) ++ "should be the cluster zookeeper server port : {}".format(zkPort)) + + if distributed.lower() == "false" and op_mode == "embedded" and \ + hbase_zk_client_port == zkPort and hbase_zk_client_port != "{{zookeeper_clientPort}}": +@@ -1126,7 +1126,7 @@ + break + # If no local DN in distributed mode + elif collectorHostName not in dn_hosts and distributed.lower() == "true": +- item = self.getWarnItem("It's recommended to install Datanode component on {0} " ++ item = self.getWarnItem("It's recommended to install Datanode component on {} " + "to speed up IO operations between HDFS and Metrics " + "Collector in distributed mode ".format(collectorHostName)) + validationItems.extend([{"config-name": "hbase.cluster.distributed", "item": item}]) +@@ -1271,34 +1271,34 @@ + minMasterXmn = 0.12 * hbase_master_heapsize + maxMasterXmn = 0.2 * hbase_master_heapsize + if hbase_master_xmn_size < minMasterXmn: +- masterXmnItem = self.getWarnItem("Value is lesser than the recommended minimum Xmn size of {0} " ++ masterXmnItem = self.getWarnItem("Value is lesser than the recommended minimum Xmn size of {} " + "(12% of hbase_master_heapsize)".format(int(ceil(minMasterXmn)))) + + if hbase_master_xmn_size > maxMasterXmn: +- masterXmnItem = self.getWarnItem("Value is greater than the recommended maximum Xmn size of {0} " ++ masterXmnItem = self.getWarnItem("Value is greater than the recommended maximum Xmn size of {} " + "(20% of hbase_master_heapsize)".format(int(floor(maxMasterXmn)))) + + minRegionServerXmn = 0.12 * hbase_regionserver_heapsize + maxRegionServerXmn = 0.2 * hbase_regionserver_heapsize + if hbase_regionserver_xmn_size < minRegionServerXmn: +- regionServerXmnItem = self.getWarnItem("Value is lesser than the recommended minimum Xmn size of {0} " ++ regionServerXmnItem = self.getWarnItem("Value is lesser than the recommended minimum Xmn size of {} " + "(12% of hbase_regionserver_heapsize)" + .format(int(ceil(minRegionServerXmn)))) + + if hbase_regionserver_xmn_size > maxRegionServerXmn: +- regionServerXmnItem = self.getWarnItem("Value is greater than the recommended maximum Xmn size of {0} " ++ regionServerXmnItem = self.getWarnItem("Value is greater than the recommended maximum Xmn size of {} " + "(20% of hbase_regionserver_heapsize)" + .format(int(floor(maxRegionServerXmn)))) + else: + minMasterXmn = 0.12 * (hbase_master_heapsize + hbase_regionserver_heapsize) + maxMasterXmn = 0.2 * (hbase_master_heapsize + hbase_regionserver_heapsize) + if hbase_master_xmn_size < minMasterXmn: +- masterXmnItem = self.getWarnItem("Value is lesser than the recommended minimum Xmn size of {0} " ++ masterXmnItem = self.getWarnItem("Value is lesser than the recommended minimum Xmn size of {} " + "(12% of hbase_master_heapsize + hbase_regionserver_heapsize)" + .format(int(ceil(minMasterXmn)))) + + if hbase_master_xmn_size > maxMasterXmn: +- masterXmnItem = self.getWarnItem("Value is greater than the recommended maximum Xmn size of {0} " ++ masterXmnItem = self.getWarnItem("Value is greater than the recommended maximum Xmn size of {} " + "(20% of hbase_master_heapsize + hbase_regionserver_heapsize)" + .format(int(floor(maxMasterXmn)))) + if masterXmnItem: +@@ -1315,7 +1315,7 @@ + if component["StackServiceComponents"]["hostnames"] is not None: + for hostName in component["StackServiceComponents"]["hostnames"]: + if self.isMasterComponent(component): +- if hostName not in hostMasterComponents.keys(): ++ if hostName not in list(hostMasterComponents.keys()): + hostMasterComponents[hostName] = [] + hostMasterComponents[hostName].append(component["StackServiceComponents"]["component_name"]) + +@@ -1357,10 +1357,10 @@ + + if collector_heapsize < recommended_collector_heapsize or \ + to_number(properties[heapPropertyToIncrease]) < recommended_hbase_heapsize: +- collectorHeapsizeItem = self.getWarnItem("{0} MB RAM is unused on the host {1} based on components " \ +- "assigned. Consider allocating {2} MB to " \ ++ collectorHeapsizeItem = self.getWarnItem("{} MB RAM is unused on the host {} based on components " \ ++ "assigned. Consider allocating {} MB to " \ + "metrics_collector_heapsize in ams-env, " \ +- "{3} MB to {4} in ams-hbase-env" ++ "{} MB to {} in ams-hbase-env" + .format(unusedMemory/mb, collectorHostName, + recommended_collector_heapsize/mb, + recommended_hbase_heapsize/mb, +@@ -1368,7 +1368,7 @@ + validationItems.extend([{"config-name": heapPropertyToIncrease, "item": collectorHeapsizeItem}]) + + if to_number(properties[xmnPropertyToIncrease]) < recommended_hbase_heapsize: +- xmnPropertyToIncreaseItem = self.getWarnItem("Consider allocating {0} MB to use up some unused memory " ++ xmnPropertyToIncreaseItem = self.getWarnItem("Consider allocating {} MB to use up some unused memory " + "on host".format(recommended_xmn_size)) + validationItems.extend([{"config-name": xmnPropertyToIncrease, "item": xmnPropertyToIncreaseItem}]) + pass +@@ -1390,7 +1390,7 @@ + validationItems.append({"config-name": prop_name, + "item": self.getWarnItem( + "If Ranger Kafka Plugin is enabled." \ +- "{0} needs to be set to {1}".format(prop_name,prop_val))}) ++ "{} needs to be set to {}".format(prop_name,prop_val))}) + + return self.toConfigurationValidationProblems(validationItems, "kafka-broker") + +@@ -1491,7 +1491,7 @@ + mountPoint = getMountPointForDir(dir, mountPoints) + + if "/" == mountPoint and self.getPreferredMountPoints(hostInfo)[0] != mountPoint: +- return self.getWarnItem("It is not recommended to use root partition for {0}".format(propertyName)) ++ return self.getWarnItem("It is not recommended to use root partition for {}".format(propertyName)) + + return None + +@@ -1506,13 +1506,13 @@ + mountPoints = {} + for mountPoint in hostInfo["disk_info"]: + mountPoints[mountPoint["mountpoint"]] = to_number(mountPoint["available"]) +- mountPoint = getMountPointForDir(dir, mountPoints.keys()) ++ mountPoint = 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 {}. Mount points: {}".format(dir, ', '.join(list(mountPoints.keys())))) + + if mountPoints[mountPoint] < reqiuredDiskSpace: + msg = "Ambari Metrics disk space requirements not met. \n" \ +@@ -1535,7 +1535,7 @@ + if defaultValue is None: + return None + if value < defaultValue: +- return self.getWarnItem("Value is less than the recommended default of {0}".format(defaultValue)) ++ return self.getWarnItem("Value is less than the recommended default of {}".format(defaultValue)) + return None + + def validatorEqualsPropertyItem(self, properties1, propertyName1, +@@ -1553,7 +1553,7 @@ + return self.getErrorItem("Empty value for %s" % propertyName2) + if value1 != value2: + return self.getWarnItem("It is recommended to set equal values " +- "for properties {0} and {1}".format(propertyName1, propertyName2)) ++ "for properties {} and {}".format(propertyName1, propertyName2)) + + return None + +@@ -1566,8 +1566,8 @@ + return self.getErrorItem("Value should be recommended for %s" % propertyName) + recommendedValue = recommendedDefaults.get(propertyName) + if value != recommendedValue: +- return self.getWarnItem("It is recommended to set value {0} " +- "for property {1}".format(recommendedValue, propertyName)) ++ return self.getWarnItem("It is recommended to set value {} " ++ "for property {}".format(recommendedValue, propertyName)) + return None + + def validateMinMemorySetting(self, properties, defaultValue, propertyName): +@@ -1638,12 +1638,12 @@ + uid = None + + if os.path.exists(login_defs): +- with open(login_defs, 'r') as f: ++ with open(login_defs) 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] +@@ -1665,7 +1665,7 @@ + return uid_min + + def mergeValidators(self, parentValidators, childValidators): +- for service, configsDict in childValidators.iteritems(): ++ for service, configsDict in childValidators.items(): + if service not in parentValidators: + parentValidators[service] = {} + parentValidators[service].update(configsDict) +@@ -1686,7 +1686,7 @@ + + def getOldValue(self, services, configType, propertyName): + if services: +- if 'changed-configurations' in services.keys(): ++ if 'changed-configurations' in list(services.keys()): + changedConfigs = services["changed-configurations"] + for changedConfig in changedConfigs: + if changedConfig["type"] == configType and changedConfig["name"]== propertyName and "old_value" in changedConfig: +@@ -1711,17 +1711,17 @@ + + def to_number(s): + try: +- return int(re.sub("\D", "", s)) ++ return int(re.sub(r"\D", "", s)) + except ValueError: + return None + + def checkXmxValueFormat(value): +- p = re.compile('-Xmx(\d+)(b|k|m|g|p|t|B|K|M|G|P|T)?') ++ p = re.compile(r'-Xmx(\d+)(b|k|m|g|p|t|B|K|M|G|P|T)?') + matches = p.findall(value) + return len(matches) == 1 + + def getXmxSize(value): +- p = re.compile("-Xmx(\d+)(.?)") ++ p = re.compile(r"-Xmx(\d+)(.?)") + result = p.findall(value)[0] + if len(result) > 1: + # result[1] - is a space or size formatter (b|k|m|g etc) +@@ -1810,7 +1810,7 @@ + def getMemorySizeRequired(components, configurations): + totalMemoryRequired = 512*1024*1024 # 512Mb for OS needs + for component in components: +- if component in getHeapsizeProperties().keys(): ++ if component in list(getHeapsizeProperties().keys()): + heapSizeProperties = getHeapsizeProperties()[component] + for heapSizeProperty in heapSizeProperties: + try: +diff -Naur ambari-release-2.7.6-origin/contrib/management-packs/isilon-onefs-mpack/.gitignore apache-ambari-2.7.6-change/contrib/management-packs/isilon-onefs-mpack/.gitignore +--- ambari-release-2.7.6-origin/contrib/management-packs/isilon-onefs-mpack/.gitignore 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/isilon-onefs-mpack/.gitignore 1970-01-01 08:00:00.000000000 +0800 +@@ -1 +0,0 @@ +-*.swp +diff -Naur ambari-release-2.7.6-origin/contrib/management-packs/isilon-onefs-mpack/src/main/resources/addon-services/ONEFS/1.0.0/package/scripts/onefs_client.py apache-ambari-2.7.6-change/contrib/management-packs/isilon-onefs-mpack/src/main/resources/addon-services/ONEFS/1.0.0/package/scripts/onefs_client.py +--- ambari-release-2.7.6-origin/contrib/management-packs/isilon-onefs-mpack/src/main/resources/addon-services/ONEFS/1.0.0/package/scripts/onefs_client.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/isilon-onefs-mpack/src/main/resources/addon-services/ONEFS/1.0.0/package/scripts/onefs_client.py 2022-07-11 00:52:29.000000000 +0800 +@@ -35,7 +35,7 @@ + raise ClientComponentHasNoStatus() + + def setup_config(self, env): +- import params ++ from . import params + env.set_params(params) + XmlConfig("hdfs-site.xml", + conf_dir=params.hadoop_conf_dir, +@@ -50,11 +50,11 @@ + configuration_attributes=params.config['configuration_attributes']['core-site'], + owner=params.hdfs_user, + group=params.user_group, +- mode=0644 ++ mode=0o644 + ) + + File(format("{params.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") + ) + +diff -Naur ambari-release-2.7.6-origin/contrib/management-packs/isilon-onefs-mpack/src/main/resources/addon-services/ONEFS/1.0.0/package/scripts/params.py apache-ambari-2.7.6-change/contrib/management-packs/isilon-onefs-mpack/src/main/resources/addon-services/ONEFS/1.0.0/package/scripts/params.py +--- ambari-release-2.7.6-origin/contrib/management-packs/isilon-onefs-mpack/src/main/resources/addon-services/ONEFS/1.0.0/package/scripts/params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/isilon-onefs-mpack/src/main/resources/addon-services/ONEFS/1.0.0/package/scripts/params.py 2022-07-11 00:52:29.000000000 +0800 +@@ -20,9 +20,9 @@ + from resource_management.libraries.functions.default import default + + if OSCheck.is_windows_family(): +- from params_windows import * ++ from .params_windows import * + else: +- from params_linux import * ++ from .params_linux import * + + nfsgateway_heapsize = config['configurations']['hadoop-env']['nfsgateway_heapsize'] + retryAble = default("/commandParams/command_retry_enabled", False) +diff -Naur ambari-release-2.7.6-origin/contrib/management-packs/isilon-onefs-mpack/src/main/resources/addon-services/ONEFS/1.0.0/package/scripts/params_windows.py apache-ambari-2.7.6-change/contrib/management-packs/isilon-onefs-mpack/src/main/resources/addon-services/ONEFS/1.0.0/package/scripts/params_windows.py +--- ambari-release-2.7.6-origin/contrib/management-packs/isilon-onefs-mpack/src/main/resources/addon-services/ONEFS/1.0.0/package/scripts/params_windows.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/isilon-onefs-mpack/src/main/resources/addon-services/ONEFS/1.0.0/package/scripts/params_windows.py 2022-07-11 00:52:29.000000000 +0800 +@@ -21,7 +21,7 @@ + + #Used in subsequent imports from params + from install_params import exclude_packages +-from status_params import * ++from .status_params import * + + config = Script.get_config() + hadoop_conf_dir = None +diff -Naur ambari-release-2.7.6-origin/contrib/management-packs/isilon-onefs-mpack/src/main/resources/addon-services/ONEFS/1.0.0/package/scripts/service_check.py apache-ambari-2.7.6-change/contrib/management-packs/isilon-onefs-mpack/src/main/resources/addon-services/ONEFS/1.0.0/package/scripts/service_check.py +--- ambari-release-2.7.6-origin/contrib/management-packs/isilon-onefs-mpack/src/main/resources/addon-services/ONEFS/1.0.0/package/scripts/service_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/isilon-onefs-mpack/src/main/resources/addon-services/ONEFS/1.0.0/package/scripts/service_check.py 2022-07-11 00:52:29.000000000 +0800 +@@ -26,7 +26,7 @@ + @OsFamilyImpl(os_family=OsFamilyImpl.DEFAULT) + class HdfsServiceCheckDefault(HdfsServiceCheck): + def service_check(self, env): +- import params ++ from . import params + + env.set_params(params) + unique = functions.get_unique_id_and_date() +@@ -40,7 +40,7 @@ + params.HdfsResource(dir, + type="directory", + action="create_on_execute", +- mode=0777 ++ mode=0o777 + ) + params.HdfsResource(tmp_file, + type="file", +diff -Naur ambari-release-2.7.6-origin/contrib/management-packs/isilon-onefs-mpack/src/main/resources/addon-services/ONEFS/1.0.0/service_advisor.py apache-ambari-2.7.6-change/contrib/management-packs/isilon-onefs-mpack/src/main/resources/addon-services/ONEFS/1.0.0/service_advisor.py +--- ambari-release-2.7.6-origin/contrib/management-packs/isilon-onefs-mpack/src/main/resources/addon-services/ONEFS/1.0.0/service_advisor.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/isilon-onefs-mpack/src/main/resources/addon-services/ONEFS/1.0.0/service_advisor.py 2022-07-11 00:52:29.000000000 +0800 +@@ -71,7 +71,7 @@ + if not Uri.default_fs(self.configs).has_host(onefs_host): + invalid_configs.append({ + 'config-name': 'fs.defaultFS', +- 'item': error('Hostname should match OneFS host: {0}'.format(onefs_host)) ++ 'item': error('Hostname should match OneFS host: {}'.format(onefs_host)) + }) + return invalid_configs + +@@ -85,12 +85,12 @@ + if not Uri.http_namenode(self.configs).has_host(onefs_host): + invalid_configs.append({ + 'config-name': 'dfs.namenode.http-address', +- 'item': error('Hostname should match OneFS host: {0}'.format(onefs_host)) ++ 'item': error('Hostname should match OneFS host: {}'.format(onefs_host)) + }) + if not Uri.https_namenode(self.configs).has_host(onefs_host): + invalid_configs.append({ + 'config-name': 'dfs.namenode.https-address', +- 'item': error('Hostname should match OneFS host: {0}'.format(onefs_host)) ++ 'item': error('Hostname should match OneFS host: {}'.format(onefs_host)) + }) + return invalid_configs + +@@ -103,7 +103,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") + else: + class ONEFSServiceAdvisor(service_advisor.ServiceAdvisor): + def getServiceConfigurationRecommendations(self, configs, clusterData, services, hosts): +@@ -137,7 +137,7 @@ + putCapSchedProperty('yarn.scheduler.capacity.node-locality-delay', '0') + + def concatenated(self, capacity_scheduler_dict): +- return ''.join('%s=%s\n' % (k,v) for k,v in capacity_scheduler_dict.items()) ++ return ''.join('%s=%s\n' % (k,v) for k,v in list(capacity_scheduler_dict.items())) + + def installedServices(self, services): + return [service['StackServices']['service_name'] for service in services['services']] +diff -Naur ambari-release-2.7.6-origin/contrib/management-packs/isilon-onefs-mpack/src/main/tools/hdfs_to_onefs_convert.py apache-ambari-2.7.6-change/contrib/management-packs/isilon-onefs-mpack/src/main/tools/hdfs_to_onefs_convert.py +--- ambari-release-2.7.6-origin/contrib/management-packs/isilon-onefs-mpack/src/main/tools/hdfs_to_onefs_convert.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/isilon-onefs-mpack/src/main/tools/hdfs_to_onefs_convert.py 2022-07-11 00:52:29.000000000 +0800 +@@ -15,7 +15,7 @@ + See the License for the specific language governing permissions and + limitations under the License. + """ +-import urllib2, base64, json, ssl, time, random, sys ++import urllib.request, urllib.error, urllib.parse, base64, json, ssl, time, random, sys + from optparse import OptionParser + from contextlib import closing + +@@ -58,7 +58,7 @@ + return suffix_str.startswith(self.base) + + def query_params(self, a_dict): +- return Url(self.base + '?' + '&'.join('%s=%s' % (name, value) for name, value in a_dict.items())) ++ return Url(self.base + '?' + '&'.join('%s=%s' % (name, value) for name, value in list(a_dict.items()))) + + def __str__(self): + return self.base +@@ -131,14 +131,14 @@ + + def _request(self, suffix_str, http_method, data=""): + url = str(self.base_url / suffix_str) +- request = urllib2.Request(url, data=self.request_transformer(data)) ++ request = urllib.request.Request(url, data=self.request_transformer(data)) + request.get_method = lambda: http_method + self.authenticator.authenticate(request) +- map(lambda each: each.add_to(request), self.headers) ++ list(map(lambda each: each.add_to(request), self.headers)) + return request, self.ssl_context.build(url) + + def _response(self, request, ssl_context): +- with closing(urllib2.urlopen(request, context=ssl_context)) as response: ++ with closing(urllib.request.urlopen(request, context=ssl_context)) as response: + return self.response_transformer(request.get_full_url(), response.getcode(), response.read()) + + def rebased(self, new_base_url): +@@ -172,7 +172,7 @@ + def delete(self): + try: + self.client.delete(self.href) +- except urllib2.HTTPError as e: ++ except urllib.error.HTTPError as e: + if e.code != 404: + raise e + +@@ -346,7 +346,7 @@ + try: + _, data = self.client.get(Url(self.name) / 'versions' / self.version / 'services' / service_name) + return True +- except urllib2.HTTPError as e: ++ except urllib.error.HTTPError as e: + if e.code == 404: + return False + else: +@@ -372,17 +372,17 @@ + self.storage = storage + + def check_prerequisites(self): +- print 'Checking %s' % self.cluster ++ print('Checking %s' % self.cluster) + ver = self.cluster.version() +- print 'Found stack %s' % ver ++ print('Found stack %s' % ver) + if not ver.startswith('HDP-3.'): +- print 'Only HDP-3.x stacks are supported.' ++ print('Only HDP-3.x stacks are supported.') + return False + if not self.cluster.installed_stack().has_service('ONEFS'): +- print 'ONEFS management pack is not installed.' ++ print('ONEFS management pack is not installed.') + return False + sys.stdout.write('Please, confirm you have made backup of the Ambari db [y/n] (n)? ') +- if raw_input() != 'y': ++ if input() != 'y': + return False + return True + +@@ -398,63 +398,63 @@ + + def find_hdfs_client_hosts(self): + if self.cluster.has_service('HDFS'): +- print 'Collecting hosts with HDFS_CLIENT' ++ print('Collecting hosts with HDFS_CLIENT') + hdfs_client_hosts = self.cluster.service('HDFS').component('HDFS_CLIENT').host_names() + self.storage.save('hdfs_client_hosts', hdfs_client_hosts) + else: +- print 'Using previously saved HDFS client hosts' ++ print('Using previously saved HDFS client hosts') + hdfs_client_hosts = self.storage.load('hdfs_client_hosts') +- print 'Found hosts %s' % hdfs_client_hosts ++ print('Found hosts %s' % hdfs_client_hosts) + return hdfs_client_hosts + + def stop_all_services(self): +- print 'Stopping all services..' ++ print('Stopping all services..') + self.cluster.stop_all().await() + + def read_configs(self): + if self.cluster.has_service('HDFS'): +- print 'Downloading core-site..' ++ print('Downloading core-site..') + self.core_site = self.cluster.config('core-site').latest().properties() +- print 'Downloading hdfs-site..' ++ print('Downloading hdfs-site..') + self.hdfs_site = self.cluster.config('hdfs-site').latest().properties() +- print 'Downloading hadoop-env..' ++ print('Downloading hadoop-env..') + self.hadoop_env = self.cluster.config('hadoop-env').latest().properties() + self.storage.save('core-site', self.core_site) + self.storage.save('hdfs-site', self.hdfs_site) + self.storage.save('hadoop-env', self.hadoop_env) + else: +- print 'Using previously saved HDFS configs' ++ print('Using previously saved HDFS configs') + self.core_site = self.storage.load('core-site') + self.hdfs_site = self.storage.load('hdfs-site') + self.hadoop_env = self.storage.load('hadoop-env') + + def delete_hdfs(self): +- print 'Deleting HDFS..' ++ print('Deleting HDFS..') + if self.cluster.has_service('HDFS'): + self.cluster.service('HDFS').delete() + else: +- print 'Already deleted.' ++ print('Already deleted.') + + def add_onefs(self): +- print 'Adding ONEFS..' ++ print('Adding ONEFS..') + if self.cluster.has_service('ONEFS'): +- print 'Already added.' ++ print('Already added.') + else: + self.cluster.add_service('ONEFS') + try: + self.cluster.add_service_component('ONEFS', 'ONEFS_CLIENT') +- except urllib2.HTTPError as e: ++ except urllib.error.HTTPError as e: + if e.code != 409: + raise e + + def configure_onefs(self): +- print 'Adding ONEFS config..' ++ print('Adding ONEFS config..') + self.cluster.add_config('onefs', random_tag('onefs'), { "onefs_host" : self.smart_connect_zone(self.core_site) }) +- print 'Adding core-site' ++ print('Adding core-site') + self.cluster.add_config('core-site', random_tag('new-core-site'), self.core_site) +- print 'Adding hdfs-site' ++ print('Adding hdfs-site') + self.cluster.add_config('hdfs-site', random_tag('new-hdfs-site'), self.hdfs_site) +- print 'Adding hadoop-env-site' ++ print('Adding hadoop-env-site') + self.cluster.add_config('hadoop-env', random_tag('new-hadoop-env'), self.hadoop_env) + + def smart_connect_zone(self, core_site): +@@ -466,7 +466,7 @@ + return def_fs + + def install_onefs_clients(self, hdfs_client_hosts): +- print 'Adding ONEFS_CLIENT to hosts: %s' % (hdfs_client_hosts) ++ print('Adding ONEFS_CLIENT to hosts: %s' % (hdfs_client_hosts)) + results = [self.add_onefs_client(each) for each in hdfs_client_hosts] + for each in results: + each.await() +@@ -474,16 +474,16 @@ + def add_onefs_client(self, hostname): + try: + return self.cluster.add_host_component('ONEFS', 'ONEFS_CLIENT', hostname) +- except urllib2.HTTPError as e: ++ except urllib.error.HTTPError as e: + if e.code == 409: +- print 'Already added to host %s' % hostname ++ print('Already added to host %s' % hostname) + return NoResult() + else: + raise e + + + def start_all_services(self): +- print 'Starting all services..' ++ print('Starting all services..') + self.cluster.start_all().await() + + def random_tag(tag_name): return "%s-%s" % (tag_name, time.time()) +@@ -517,12 +517,12 @@ + protocol=options.protocol.lower(), + user=options.admin_user, + password=options.admin_pass) +- print 'This script will replace the HDFS service to ONEFS' +- print 'The following prerequisites are required:' +- print ' * ONEFS management package must be installed' +- print ' * Ambari must be upgraded to >=v2.7.1' +- print ' * Stack must be upgraded to HDP-3.0' +- print ' * Is highly recommended to backup ambari database before you proceed.' ++ print('This script will replace the HDFS service to ONEFS') ++ print('The following prerequisites are required:') ++ print(' * ONEFS management package must be installed') ++ print(' * Ambari must be upgraded to >=v2.7.1') ++ print(' * Stack must be upgraded to HDP-3.0') ++ print(' * Is highly recommended to backup ambari database before you proceed.') + conversion = Conversion(cluster, FsStorage()) + if not conversion.check_prerequisites(): + sys.exit() +diff -Naur ambari-release-2.7.6-origin/contrib/management-packs/isilon-onefs-mpack/src/test/python/TestServiceAdvisor.py apache-ambari-2.7.6-change/contrib/management-packs/isilon-onefs-mpack/src/test/python/TestServiceAdvisor.py +--- ambari-release-2.7.6-origin/contrib/management-packs/isilon-onefs-mpack/src/test/python/TestServiceAdvisor.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/isilon-onefs-mpack/src/test/python/TestServiceAdvisor.py 2022-07-11 00:52:29.000000000 +0800 +@@ -45,23 +45,23 @@ + onefs_host = Uri.onefs(configs) + default_fs = Uri.default_fs(configs) + fixed = default_fs.fix_host(onefs_host) +- self.assertEquals('hdfs://scisilon.fqdn:8020', fixed) ++ self.assertEqual('hdfs://scisilon.fqdn:8020', fixed) + + def test_skip_replacing_to_empty_host(self): + default_fs = Uri.default_fs(configs) +- self.assertEquals('hdfs://localhost:8020', default_fs.fix_host(Uri(""))) ++ self.assertEqual('hdfs://localhost:8020', default_fs.fix_host(Uri(""))) + + def test_skip_fixing_invalid_host(self): + default_fs = Uri("hdfs://:8080") +- self.assertEquals('hdfs://:8080', default_fs.fix_host(Uri("host"))) ++ self.assertEqual('hdfs://:8080', default_fs.fix_host(Uri("host"))) + + def test_core_site_validation_error_on_host_mismatch(self): + core_site = CoreSite(configs) + erros = core_site.validate() +- self.assertEquals(len(erros), 1) +- self.assertEquals(erros[0]['config-name'], 'fs.defaultFS') ++ self.assertEqual(len(erros), 1) ++ self.assertEqual(erros[0]['config-name'], 'fs.defaultFS') + + def test_hdfs_site_no_validation_error(self): + hdfs_site = HdfsSite(configs) + erros = hdfs_site.validate() +- self.assertEquals(len(erros), 0) +\ 文件尾没有换行符 ++ self.assertEqual(len(erros), 0) +\ 文件尾没有换行符 +diff -Naur ambari-release-2.7.6-origin/contrib/management-packs/isilon-onefs-mpack/src/test/python/unitTests.py apache-ambari-2.7.6-change/contrib/management-packs/isilon-onefs-mpack/src/test/python/unitTests.py +--- ambari-release-2.7.6-origin/contrib/management-packs/isilon-onefs-mpack/src/test/python/unitTests.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/isilon-onefs-mpack/src/test/python/unitTests.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +@@ -110,13 +110,13 @@ + sys.stderr.write("Failed tests:\n") + for failed_tests in [test_errors,test_failures]: + for err in failed_tests: +- sys.stderr.write("{0}: {1}\n".format(err[2],err[0])) ++ sys.stderr.write("{}: {}\n".format(err[2],err[0])) + sys.stderr.write("----------------------------------------------------------------------\n") +- sys.stderr.write("{0}\n".format(err[1])) ++ sys.stderr.write("{}\n".format(err[1])) + sys.stderr.write("----------------------------------------------------------------------\n") +- sys.stderr.write("Total run:{0}\n".format(test_runs)) +- sys.stderr.write("Total errors:{0}\n".format(len(test_errors))) +- sys.stderr.write("Total failures:{0}\n".format(len(test_failures))) ++ sys.stderr.write("Total run:{}\n".format(test_runs)) ++ sys.stderr.write("Total errors:{}\n".format(len(test_errors))) ++ sys.stderr.write("Total failures:{}\n".format(len(test_failures))) + + if tests_status: + sys.stderr.write("OK\n") +diff -Naur ambari-release-2.7.6-origin/contrib/management-packs/microsoft-r_mpack/src/main/resources/common-services/MICROSOFT_R_SERVER/8.0.5/package/scripts/microsoft_r_server.py apache-ambari-2.7.6-change/contrib/management-packs/microsoft-r_mpack/src/main/resources/common-services/MICROSOFT_R_SERVER/8.0.5/package/scripts/microsoft_r_server.py +--- ambari-release-2.7.6-origin/contrib/management-packs/microsoft-r_mpack/src/main/resources/common-services/MICROSOFT_R_SERVER/8.0.5/package/scripts/microsoft_r_server.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/microsoft-r_mpack/src/main/resources/common-services/MICROSOFT_R_SERVER/8.0.5/package/scripts/microsoft_r_server.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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,7 +27,7 @@ + def install(self, env): + Logger.info('Installing R Node Client...') + tmp_dir = Script.tmp_dir +- Logger.debug('Using temp dir: {0}'.format(tmp_dir)) ++ Logger.debug('Using temp dir: {}'.format(tmp_dir)) + self.install_packages(env) + Logger.info('Installed R Node Client') + +diff -Naur ambari-release-2.7.6-origin/contrib/management-packs/microsoft-r_mpack/src/main/resources/common-services/MICROSOFT_R_SERVER/8.0.5/package/scripts/params_linux.py apache-ambari-2.7.6-change/contrib/management-packs/microsoft-r_mpack/src/main/resources/common-services/MICROSOFT_R_SERVER/8.0.5/package/scripts/params_linux.py +--- ambari-release-2.7.6-origin/contrib/management-packs/microsoft-r_mpack/src/main/resources/common-services/MICROSOFT_R_SERVER/8.0.5/package/scripts/params_linux.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/microsoft-r_mpack/src/main/resources/common-services/MICROSOFT_R_SERVER/8.0.5/package/scripts/params_linux.py 2022-07-11 00:52:29.000000000 +0800 +@@ -40,7 +40,7 @@ + + 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 + user_group = config['configurations']['cluster-env']['user_group'] + security_enabled = config['configurations']['cluster-env']['security_enabled'] + smoke_user_keytab = config['configurations']['cluster-env']['smokeuser_keytab'] +diff -Naur ambari-release-2.7.6-origin/contrib/management-packs/microsoft-r_mpack/src/main/resources/common-services/MICROSOFT_R_SERVER/8.0.5/package/scripts/service_check.py apache-ambari-2.7.6-change/contrib/management-packs/microsoft-r_mpack/src/main/resources/common-services/MICROSOFT_R_SERVER/8.0.5/package/scripts/service_check.py +--- ambari-release-2.7.6-origin/contrib/management-packs/microsoft-r_mpack/src/main/resources/common-services/MICROSOFT_R_SERVER/8.0.5/package/scripts/service_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/microsoft-r_mpack/src/main/resources/common-services/MICROSOFT_R_SERVER/8.0.5/package/scripts/service_check.py 2022-07-11 00:52:29.000000000 +0800 +@@ -44,10 +44,10 @@ + 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 /user/RevoShare on HDFS, exception: {0}".format(str(exception))) ++ Logger.warning("Could not check the existence of /user/RevoShare on HDFS, exception: {}".format(str(exception))) + + if params.security_enabled: + kinit_cmd = format("{kinit_path_local} -kt {smoke_user_keytab} {smokeuser_principal};") +@@ -59,7 +59,7 @@ + + File( format("{tmp_dir}/microsoft_r_server_serviceCheck.r"), + content = StaticFile("microsoft_r_server_serviceCheck.r"), +- mode = 0755 ++ mode = 0o755 + ) + + Execute( format("Revo64 --no-save < {tmp_dir}/microsoft_r_server_serviceCheck.r | tee {output_file}"), +@@ -81,8 +81,8 @@ + dayCountDictionary = {'Monday': '97975', 'Tuesday': '77725', 'Wednesday': '78875', 'Thursday': '81304', 'Friday': '82987', 'Saturday': '86159', 'Sunday': '94975'} + for (day, count) in values_list: + if count != dayCountDictionary[day]: +- Logger.info("Service check produced incorrect output for {0}. Was expecting {1} but encountered {2}".format(day, dayCountDictionary[day], count)) +- raise Fail("Service check produced incorrect output for {0}. Was expecting {1} but encountered {2}".format(day, dayCountDictionary[day], count)) ++ Logger.info("Service check produced incorrect output for {}. Was expecting {} but encountered {}".format(day, dayCountDictionary[day], count)) ++ raise Fail("Service check produced incorrect output for {}. Was expecting {} but encountered {}".format(day, dayCountDictionary[day], count)) + + + if __name__ == "__main__": +diff -Naur ambari-release-2.7.6-origin/contrib/management-packs/microsoft-r_mpack/src/main/resources/common-services/MICROSOFT_R_SERVER/8.0.5/service_advisor.py apache-ambari-2.7.6-change/contrib/management-packs/microsoft-r_mpack/src/main/resources/common-services/MICROSOFT_R_SERVER/8.0.5/service_advisor.py +--- ambari-release-2.7.6-origin/contrib/management-packs/microsoft-r_mpack/src/main/resources/common-services/MICROSOFT_R_SERVER/8.0.5/service_advisor.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/microsoft-r_mpack/src/main/resources/common-services/MICROSOFT_R_SERVER/8.0.5/service_advisor.py 2022-07-11 00:52:29.000000000 +0800 +@@ -34,7 +34,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 MICROSOFT_R_SERVER805ServiceAdvisor(service_advisor.ServiceAdvisor): + +@@ -44,7 +44,7 @@ + traceback.print_tb(None) + rClientComponent = rClientComponent[0] + if not self.isComponentHostsPopulated(rClientComponent): +- for hostName in hostsComponentsMap.keys(): ++ for hostName in list(hostsComponentsMap.keys()): + hostComponents = hostsComponentsMap[hostName] + if ({"name": "NODEMANAGER"} in hostComponents or {"name": "YARN_CLIENT"} in hostComponents) \ + and {"name": "MICROSOFT_R_NODE_CLIENT"} not in hostComponents: +@@ -69,7 +69,7 @@ + if len(mismatchHosts) > 0: + hostsString = ', '.join(mismatchHosts) + message = "Microsoft R Node Client must be installed on NodeManagers and YARN Clients. " \ +- "The following {0} host(s) do not satisfy the colocation recommendation: {1}".format(len(mismatchHosts), hostsString) ++ "The following {} host(s) do not satisfy the colocation recommendation: {}".format(len(mismatchHosts), hostsString) + items.append( { "type": 'host-component', "level": 'WARN', "message": message, "component-name": 'MICROSOFT_R_NODE_CLIENT' } ) + + return items +diff -Naur ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/hooks/after-INSTALL/scripts/shared_initialization.py apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/hooks/after-INSTALL/scripts/shared_initialization.py +--- ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/hooks/after-INSTALL/scripts/shared_initialization.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/hooks/after-INSTALL/scripts/shared_initialization.py 2022-07-11 00:52:29.000000000 +0800 +@@ -50,7 +50,7 @@ + json_version = load_version(struct_out_file) + + if not json_version: +- Logger.info("There is no advertised version for this component stored in {0}".format(struct_out_file)) ++ Logger.info("There is no advertised version for this component stored in {}".format(struct_out_file)) + return + + # On parallel command execution this should be executed by a single process at a time. +@@ -62,7 +62,7 @@ + def setup_config(): + import params + stackversion = params.stack_version_unformatted +- Logger.info("FS Type: {0}".format(params.dfs_type)) ++ Logger.info("FS Type: {}".format(params.dfs_type)) + + is_hadoop_conf_dir_present = False + if hasattr(params, "hadoop_conf_dir") and params.hadoop_conf_dir is not None and os.path.exists(params.hadoop_conf_dir): +@@ -88,7 +88,7 @@ + json_version = None + try: + if os.path.exists(struct_out_file): +- with open(struct_out_file, 'r') as fp: ++ with open(struct_out_file) as fp: + json_info = json.load(fp) + json_version = json_info['version'] + except: +@@ -110,10 +110,10 @@ + json_version = load_version(struct_out_file) + + if not json_version: +- Logger.info("Could not load 'version' from {0}".format(struct_out_file)) ++ Logger.info("Could not load 'version' from {}".format(struct_out_file)) + return + + # 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 k, v in conf_select.get_package_dirs().iteritems(): ++ for k, v in conf_select.get_package_dirs().items(): + conf_select.convert_conf_directories_to_symlinks(k, json_version, v) +\ 文件尾没有换行符 +diff -Naur ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/hooks/before-ANY/scripts/shared_initialization.py apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/hooks/before-ANY/scripts/shared_initialization.py +--- ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/hooks/before-ANY/scripts/shared_initialization.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/hooks/before-ANY/scripts/shared_initialization.py 2022-07-11 00:52:29.000000000 +0800 +@@ -56,7 +56,7 @@ + if params.has_hbase_masters: + Directory (params.hbase_tmp_dir, + owner = params.hbase_user, +- mode=0775, ++ mode=0o775, + create_parents = True, + cd_access="a", + ) +@@ -103,7 +103,7 @@ + + import params + +- parts = re.split('\s', user_and_groups) ++ parts = re.split(r'\s', user_and_groups) + if len(parts) == 1: + parts.append("") + +@@ -128,7 +128,7 @@ + + File(format("{tmp_dir}/changeUid.sh"), + content=StaticFile("changeToSecureUid.sh"), +- mode=0555) ++ mode=0o555) + ignore_groupsusers_create_str = str(params.ignore_groupsusers_create).lower() + Execute(format("{tmp_dir}/changeUid.sh {user} {user_dirs}"), + not_if = format("(test $(id -u {user}) -gt 1000) || ({ignore_groupsusers_create_str})")) +@@ -136,7 +136,7 @@ + def setup_hadoop_env(): + import params + stackversion = params.stack_version_unformatted +- Logger.info("FS Type: {0}".format(params.dfs_type)) ++ Logger.info("FS Type: {}".format(params.dfs_type)) + if params.has_namenode or stackversion.find('Gluster') >= 0 or params.dfs_type == 'HCFS': + if params.security_enabled: + tc_owner = "root" +@@ -144,7 +144,7 @@ + tc_owner = params.hdfs_user + + # create /etc/hadoop +- Directory(params.hadoop_dir, mode=0755) ++ Directory(params.hadoop_dir, mode=0o755) + + # HDP < 2.2 used a conf -> conf.empty symlink for /etc/hadoop/ + if Script.is_stack_less_than("2.2"): +@@ -165,7 +165,7 @@ + Directory(params.hadoop_java_io_tmpdir, + owner=params.hdfs_user, + group=params.user_group, +- mode=01777 ++ mode=0o1777 + ) + + def setup_java(): +@@ -216,7 +216,7 @@ + Directory(tmp_java_dir, action="delete") + + File(format("{java_home}/bin/java"), +- mode=0755, ++ mode=0o755, + cd_access="a", + ) + Execute(('chmod', '-R', '755', params.java_home), +diff -Naur ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/hooks/before-INSTALL/scripts/repo_initialization.py apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/hooks/before-INSTALL/scripts/repo_initialization.py +--- ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/hooks/before-INSTALL/scripts/repo_initialization.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/hooks/before-INSTALL/scripts/repo_initialization.py 2022-07-11 00:52:29.000000000 +0800 +@@ -38,7 +38,7 @@ + if 0 == len(repo_dicts): + Logger.info("Repository list is empty. Ambari may not be managing the repositories.") + else: +- Logger.info("Initializing {0} repositories".format(str(len(repo_dicts)))) ++ Logger.info("Initializing {} repositories".format(str(len(repo_dicts)))) + + for repo in repo_dicts: + if not 'baseUrl' in repo: +diff -Naur ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/hooks/before-START/files/topology_script.py apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/hooks/before-START/files/topology_script.py +--- ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/hooks/before-START/files/topology_script.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/hooks/before-START/files/topology_script.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 sys, os + from string import join +-import ConfigParser ++import configparser + + + DEFAULT_RACK = "/default-rack" +@@ -31,10 +31,10 @@ + 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): +@@ -60,7 +60,7 @@ + def execute(self, args): + rack_map = self.load_rack_map() + rack = self.get_racks(rack_map, args) +- print rack ++ print(rack) + + if __name__ == "__main__": + TopologyScript().execute(sys.argv) +diff -Naur ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/hooks/before-START/scripts/params.py apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/hooks/before-START/scripts/params.py +--- ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/hooks/before-START/scripts/params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/hooks/before-START/scripts/params.py 2022-07-11 00:52:29.000000000 +0800 +@@ -258,7 +258,7 @@ + default_fs = config['configurations']['core-site']['fs.defaultFS'] + 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 -Naur ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/hooks/before-START/scripts/rack_awareness.py apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/hooks/before-START/scripts/rack_awareness.py +--- ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/hooks/before-START/scripts/rack_awareness.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/hooks/before-START/scripts/rack_awareness.py 2022-07-11 00:52:29.000000000 +0800 +@@ -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 @@ + + 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 -Naur ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/hooks/before-START/scripts/shared_initialization.py apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/hooks/before-START/scripts/shared_initialization.py +--- ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/hooks/before-START/scripts/shared_initialization.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/hooks/before-START/scripts/shared_initialization.py 2022-07-11 00:52:29.000000000 +0800 +@@ -40,7 +40,7 @@ + create_parents = True, + owner='root', + group=params.user_group, +- mode=0775, ++ mode=0o775, + cd_access='a', + ) + if params.has_namenode: +@@ -63,11 +63,11 @@ + + # if WebHDFS is not enabled we need this jar to create hadoop folders. + if params.host_sys_prepped: +- 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") + elif params.dfs_type == 'HCFS' or not WebHDFSUtil.is_webhdfs_available(params.is_webhdfs_enabled, params.default_fs): + # 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") + ) + +@@ -86,14 +86,14 @@ + 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=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, + ) +@@ -118,7 +118,7 @@ + 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')): +@@ -147,7 +147,7 @@ + type="directory", + action="create_on_execute", + owner=params.hdfs_user, +- mode=0777 ++ mode=0o777 + ) + params.HdfsResource(params.smoke_hdfs_user_dir, + type="directory", +diff -Naur ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/alerts/alert_hive_interactive_thrift_port.py apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/alerts/alert_hive_interactive_thrift_port.py +--- ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/alerts/alert_hive_interactive_thrift_port.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/alerts/alert_hive_interactive_thrift_port.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + """ + Licensed to the Apache Software Foundation (ASF) under one +diff -Naur ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/alerts/alert_hive_metastore.py apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/alerts/alert_hive_metastore.py +--- ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/alerts/alert_hive_metastore.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/alerts/alert_hive_metastore.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + """ + Licensed to the Apache Software Foundation (ASF) under one +diff -Naur ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/alerts/alert_hive_thrift_port.py apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/alerts/alert_hive_thrift_port.py +--- ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/alerts/alert_hive_thrift_port.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/alerts/alert_hive_thrift_port.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + """ + Licensed to the Apache Software Foundation (ASF) under one +diff -Naur ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/alerts/alert_llap_app_status.py apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/alerts/alert_llap_app_status.py +--- ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/alerts/alert_llap_app_status.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/alerts/alert_llap_app_status.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + """ + Licensed to the Apache Software Foundation (ASF) under one +diff -Naur ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/alerts/alert_webhcat_server.py apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/alerts/alert_webhcat_server.py +--- ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/alerts/alert_webhcat_server.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/alerts/alert_webhcat_server.py 2022-07-11 00:52:29.000000000 +0800 +@@ -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 ambari_simplejson as json # simplejson is much faster comparing to Python 2.6 json module and has the same functions set. + import socket + import time +-import urllib2 ++import urllib.request, urllib.error, urllib.parse + import traceback + import logging + +@@ -122,7 +122,7 @@ + smokeuser = configurations[SMOKEUSER_KEY] + + # webhcat always uses http, never SSL +- query_url = "http://{0}:{1}/templeton/v1/status?user.name={2}".format(host_name, webhcat_port, smokeuser) ++ query_url = "http://{}:{}/templeton/v1/status?user.name={}".format(host_name, webhcat_port, smokeuser) + + # initialize + total_time = 0 +@@ -187,11 +187,11 @@ + try: + # execute the query for the JSON that includes WebHCat status + start_time = time.time() +- url_response = urllib2.urlopen(query_url, timeout=connection_timeout) ++ url_response = urllib.request.urlopen(query_url, timeout=connection_timeout) + total_time = time.time() - start_time + + json_response = json.loads(url_response.read()) +- except urllib2.HTTPError as httpError: ++ except urllib.error.HTTPError as httpError: + label = CRITICAL_HTTP_MESSAGE.format(httpError.code, query_url, traceback.format_exc()) + return (RESULT_CODE_CRITICAL, [label]) + except: +diff -Naur ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/hcat_client.py apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/hcat_client.py +--- ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/hcat_client.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/hcat_client.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + + """ + +-from hcat import hcat ++from .hcat import hcat + from ambari_commons import OSConst + from ambari_commons.os_family_impl import OsFamilyImpl + from resource_management.core.logger import Logger +@@ -31,12 +31,12 @@ + + class HCatClient(Script): + def install(self, env): +- import params ++ from . import params + self.install_packages(env) + self.configure(env) + + def configure(self, env): +- import params ++ from . import params + env.set_params(params) + hcat() + +@@ -68,7 +68,7 @@ + """ + Logger.info("Executing Hive HCat Client Stack Upgrade pre-restart") + +- import params ++ from . import params + env.set_params(params) + + # this function should not execute if the stack version does not support rolling upgrade +diff -Naur ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/hcat.py apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/hcat.py +--- ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/hcat.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/hcat.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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,7 +29,7 @@ + + @OsFamilyFuncImpl(os_family=OSConst.WINSRV_FAMILY) + def hcat(): +- import params ++ from . import params + + XmlConfig("hive-site.xml", + conf_dir = params.hive_conf_dir, +@@ -41,7 +41,7 @@ + + @OsFamilyFuncImpl(os_family=OsFamilyImpl.DEFAULT) + def hcat(): +- import params ++ from . import params + + Directory(params.hive_conf_dir, + create_parents = True, +@@ -67,7 +67,7 @@ + configuration_attributes=params.config['configuration_attributes']['hive-site'], + owner=params.hive_user, + group=params.user_group, +- mode=0644) ++ mode=0o644) + + File(format("{hcat_conf_dir}/hcat-env.sh"), + owner=params.hcat_user, +diff -Naur ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/hcat_service_check.py apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/hcat_service_check.py +--- ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/hcat_service_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/hcat_service_check.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + + @OsFamilyFuncImpl(os_family=OSConst.WINSRV_FAMILY) + def hcat_service_check(): +- import params ++ from . import params + smoke_cmd = os.path.join(params.stack_root, "Run-SmokeTests.cmd") + service = "HCatalog" + Execute(format("cmd /C {smoke_cmd} {service}"), user=params.hcat_user, logoutput=True) +@@ -34,7 +34,7 @@ + + @OsFamilyFuncImpl(os_family=OsFamilyImpl.DEFAULT) + def hcat_service_check(): +- import params ++ from . import params + unique = get_unique_id_and_date() + output_file = format("{hive_apps_whs_dir}/hcatsmoke{unique}") + test_cmd = format("fs -test -e {output_file}") +@@ -47,7 +47,7 @@ + + 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 -Naur ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/hive_client.py apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/hive_client.py +--- ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/hive_client.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/hive_client.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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,14 +23,14 @@ + from resource_management.libraries.functions import stack_select + from resource_management.libraries.functions import StackFeature + from resource_management.libraries.functions.stack_features import check_stack_feature +-from hive import hive ++from .hive import hive + from ambari_commons.os_family_impl import OsFamilyImpl + from ambari_commons import OSConst + from resource_management.core.exceptions import ClientComponentHasNoStatus + + class HiveClient(Script): + def install(self, env): +- import params ++ from . import params + self.install_packages(env) + self.configure(env) + +@@ -38,7 +38,7 @@ + raise ClientComponentHasNoStatus() + + def configure(self, env): +- import params ++ from . import params + env.set_params(params) + hive(name='client') + +@@ -56,7 +56,7 @@ + def pre_upgrade_restart(self, env, upgrade_type=None): + Logger.info("Executing Hive client Stack Upgrade pre-restart") + +- import params ++ from . import params + env.set_params(params) + if params.version and check_stack_feature(StackFeature.ROLLING_UPGRADE, params.version): + stack_select.select("hadoop-client", params.version) +diff -Naur ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/hive_interactive.py apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/hive_interactive.py +--- ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/hive_interactive.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/hive_interactive.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + # Python Imports + import os + import glob +-from urlparse import urlparse ++from urllib.parse import urlparse + + # Resource Management and Common Imports + from resource_management.libraries.script.script import Script +@@ -45,7 +45,7 @@ + + from ambari_commons.os_family_impl import OsFamilyFuncImpl, OsFamilyImpl + from ambari_commons import OSConst +-from hive import fill_conf_dir, jdbc_connector ++from .hive import fill_conf_dir, jdbc_connector + + + @OsFamilyFuncImpl(os_family=OSConst.WINSRV_FAMILY) +@@ -57,7 +57,7 @@ + """ + @OsFamilyFuncImpl(os_family=OsFamilyImpl.DEFAULT) + def hive_interactive(name=None): +- import params ++ from . import params + + # list of properties that should be excluded from the config + # this approach is a compromise against adding a dedicated config +@@ -81,7 +81,7 @@ + params.HdfsResource(None, action="execute") + + Directory(params.hive_interactive_etc_dir_prefix, +- mode=0755 ++ mode=0o755 + ) + + Logger.info("Directories to fill with configs: %s" % str(params.hive_conf_dirs_list)) +@@ -96,7 +96,7 @@ + merged_hive_interactive_site.update(params.config['configurations']['hive-site']) + merged_hive_interactive_site.update(params.config['configurations']['hive-interactive-site']) + for item in exclude_list: +- if item in merged_hive_interactive_site.keys(): ++ if item in list(merged_hive_interactive_site.keys()): + del merged_hive_interactive_site[item] + + ''' +@@ -123,7 +123,7 @@ + configuration_attributes=params.config['configuration_attributes']['tez-interactive-site'], + owner = params.tez_interactive_user, + group = params.user_group, +- mode = 0664) ++ mode = 0o664) + + ''' + Merge properties from hiveserver2-interactive-site into hiveserver2-site +@@ -153,7 +153,7 @@ + # config from there, as Hive2 client shouldn't have that config. + merged_hive_interactive_site_copy = merged_hive_interactive_site.copy() + for item in exclude_list_for_hive2_client: +- if item in merged_hive_interactive_site.keys(): ++ if item in list(merged_hive_interactive_site.keys()): + del merged_hive_interactive_site_copy[item] + + for conf_dir in hive2_conf_dirs_list: +@@ -164,7 +164,7 @@ + configuration_attributes=params.config['configuration_attributes']['hive-interactive-site'], + owner=params.hive_user, + group=params.user_group, +- mode=0644) ++ mode=0o644) + else: + XmlConfig("hive-site.xml", + conf_dir=conf_dir, +@@ -172,7 +172,7 @@ + configuration_attributes=params.config['configuration_attributes']['hive-interactive-site'], + owner=params.hive_user, + group=params.user_group, +- mode=0644) ++ mode=0o644) + + XmlConfig("hiveserver2-site.xml", + conf_dir=conf_dir, +@@ -180,7 +180,7 @@ + configuration_attributes=params.config['configuration_attributes']['hiveserver2-interactive-site'], + owner=params.hive_user, + group=params.user_group, +- mode=0644) ++ mode=0o644) + + hive_server_interactive_conf_dir = conf_dir + +@@ -191,35 +191,35 @@ + + llap_daemon_log4j_filename = 'llap-daemon-log4j2.properties' + File(format("{hive_server_interactive_conf_dir}/{llap_daemon_log4j_filename}"), +- mode=0644, ++ mode=0o644, + group=params.user_group, + owner=params.hive_user, + content=params.llap_daemon_log4j) + + llap_cli_log4j2_filename = 'llap-cli-log4j2.properties' + File(format("{hive_server_interactive_conf_dir}/{llap_cli_log4j2_filename}"), +- mode=0644, ++ mode=0o644, + group=params.user_group, + owner=params.hive_user, + content=params.llap_cli_log4j2) + + hive_log4j2_filename = 'hive-log4j2.properties' + File(format("{hive_server_interactive_conf_dir}/{hive_log4j2_filename}"), +- mode=0644, ++ mode=0o644, + group=params.user_group, + owner=params.hive_user, + content=params.hive_log4j2) + + hive_exec_log4j2_filename = 'hive-exec-log4j2.properties' + File(format("{hive_server_interactive_conf_dir}/{hive_exec_log4j2_filename}"), +- mode=0644, ++ mode=0o644, + group=params.user_group, + owner=params.hive_user, + content=params.hive_exec_log4j2) + + beeline_log4j2_filename = 'beeline-log4j2.properties' + File(format("{hive_server_interactive_conf_dir}/{beeline_log4j2_filename}"), +- mode=0644, ++ mode=0o644, + group=params.user_group, + owner=params.hive_user, + content=params.beeline_log4j2) +@@ -250,7 +250,7 @@ + File(os.path.join(params.limits_conf_dir, 'hive.conf'), + owner='root', + group='root', +- mode=0644, ++ mode=0o644, + content=Template("hive.conf.j2")) + + if not os.path.exists(params.target_hive_interactive): +@@ -258,9 +258,9 @@ + + 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) + File(params.start_hiveserver2_interactive_path, +- mode=0755, ++ mode=0o755, + content=Template(format('{start_hiveserver2_interactive_script}'))) + + Directory(params.hive_pid_dir, +@@ -268,25 +268,25 @@ + 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_interactive_var_lib, + create_parents=True, + cd_access='a', + owner=params.hive_user, + group=params.user_group, +- mode=0755) ++ mode=0o755) + + """ + Remove 'org.apache.atlas.hive.hook.HiveHook' value from Hive2/hive-site.xml config 'hive.exec.post.hooks', if exists. + """ + def remove_atlas_hook_if_exists(merged_hive_interactive_site): +- if 'hive.exec.post.hooks' in merged_hive_interactive_site.keys(): ++ if 'hive.exec.post.hooks' in list(merged_hive_interactive_site.keys()): + existing_hive_exec_post_hooks = merged_hive_interactive_site.get('hive.exec.post.hooks') + if existing_hive_exec_post_hooks: + hook_splits = existing_hive_exec_post_hooks.split(",") +@@ -294,7 +294,7 @@ + updated_hooks_str = ",".join((str(hook)).strip() for hook in updated_hook_splits) + if updated_hooks_str != existing_hive_exec_post_hooks: + merged_hive_interactive_site['hive.exec.post.hooks'] = updated_hooks_str +- Logger.info("Updated Hive2/hive-site.xml 'hive.exec.post.hooks' value from : '{0}' to : '{1}'" ++ Logger.info("Updated Hive2/hive-site.xml 'hive.exec.post.hooks' value from : '{}' to : '{}'" + .format(existing_hive_exec_post_hooks, updated_hooks_str)) + else: + Logger.info("No change done to Hive2/hive-site.xml 'hive.exec.post.hooks' value.") +diff -Naur ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/hive_metastore.py apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/hive_metastore.py +--- ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/hive_metastore.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/hive_metastore.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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,9 +35,9 @@ + from resource_management.libraries.functions.security_commons import FILE_TYPE_XML + from resource_management.core.resources.system import File + +-from hive import hive +-from hive import jdbc_connector +-from hive_service import hive_service ++from .hive import hive ++from .hive import jdbc_connector ++from .hive_service import hive_service + from ambari_commons.os_family_impl import OsFamilyImpl + from ambari_commons import OSConst + +@@ -46,12 +46,12 @@ + + class HiveMetastore(Script): + def install(self, env): +- import params ++ from . import params + self.install_packages(env) + + + def start(self, env, upgrade_type=None): +- import params ++ from . import params + env.set_params(params) + + # writing configurations on start required for securtity +@@ -61,13 +61,13 @@ + + + def stop(self, env, upgrade_type=None): +- import params ++ from . import params + env.set_params(params) + hive_service('metastore', action='stop', upgrade_type=upgrade_type) + + + def configure(self, env): +- import params ++ from . import params + env.set_params(params) + hive(name = 'metastore') + +@@ -75,7 +75,7 @@ + @OsFamilyImpl(os_family=OSConst.WINSRV_FAMILY) + class HiveMetastoreWindows(HiveMetastore): + def status(self, env): +- import status_params ++ from . import status_params + from resource_management.libraries.functions import check_windows_service_status + check_windows_service_status(status_params.hive_metastore_win_service_name) + +@@ -87,7 +87,7 @@ + + + def status(self, env): +- import status_params ++ from . import status_params + from resource_management.libraries.functions import check_process_status + + env.set_params(status_params) +@@ -98,7 +98,7 @@ + + def pre_upgrade_restart(self, env, upgrade_type=None): + Logger.info("Executing Metastore Stack Upgrade pre-restart") +- import params ++ from . import params + + env.set_params(params) + +@@ -113,7 +113,7 @@ + + + def security_status(self, env): +- import status_params ++ from . import status_params + env.set_params(status_params) + if status_params.security_enabled: + props_value_check = {"hive.server2.authentication": "KERBEROS", +@@ -156,7 +156,7 @@ + else: + issues = [] + for cf in result_issues: +- issues.append("Configuration file %s did not pass the validation. Reason: %s" % (cf, result_issues[cf])) ++ issues.append("Configuration file {} did not pass the validation. Reason: {}".format(cf, result_issues[cf])) + self.put_structured_out({"securityIssuesFound": ". ".join(issues)}) + self.put_structured_out({"securityState": "UNSECURED"}) + else: +@@ -179,8 +179,8 @@ + Should not be invoked for a DOWNGRADE; Metastore only supports schema upgrades. + """ + Logger.info("Upgrading Hive Metastore Schema") +- import status_params +- import params ++ from . import status_params ++ from . import params + env.set_params(params) + + # ensure that configurations are written out before trying to upgrade the schema +@@ -223,7 +223,7 @@ + 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_schematool_ver_bin}/schematool") +@@ -243,11 +243,11 @@ + Execute(command, user=params.hive_user, tries=1, environment=env_dict, logoutput=True) + + def get_log_folder(self): +- import params ++ from . import params + return params.hive_log_dir + + def get_user(self): +- import params ++ from . import params + return params.hive_user + + +diff -Naur ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/hive.py apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/hive.py +--- ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/hive.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/hive.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 os + import glob +-from urlparse import urlparse ++from urllib.parse import urlparse + + from resource_management.libraries.script.script import Script + from resource_management.libraries.resources.hdfs_resource import HdfsResource +@@ -49,7 +49,7 @@ + + @OsFamilyFuncImpl(os_family=OSConst.WINSRV_FAMILY) + def hive(name=None): +- import params ++ from . import params + + XmlConfig("hive-site.xml", + conf_dir = params.hive_conf_dir, +@@ -105,7 +105,7 @@ + + @OsFamilyFuncImpl(os_family=OsFamilyImpl.DEFAULT) + def hive(name=None): +- import params ++ from . import params + + if name == 'hiveserver2': + # copy tarball to HDFS feature not supported +@@ -114,7 +114,7 @@ + type="directory", + action="create_on_execute", + owner=params.webhcat_user, +- mode=0755 ++ mode=0o755 + ) + + # Create webhcat dirs. +@@ -184,7 +184,7 @@ + type="directory", + action="create_on_execute", + owner=params.hive_user, +- mode=0777 ++ mode=0o777 + ) + else: + Logger.info(format("Not creating warehouse directory '{hive_apps_whs_dir}', as the location is not in DFS.")) +@@ -203,12 +203,12 @@ + 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 + + params.HdfsResource(None, action="execute") + + Directory(params.hive_etc_dir_prefix, +- mode=0755 ++ mode=0o755 + ) + + # We should change configurations for client as well as for server. +@@ -223,7 +223,7 @@ + configuration_attributes=params.config['configuration_attributes']['hive-site'], + owner=params.hive_user, + group=params.user_group, +- mode=0644) ++ mode=0o644) + + # Generate atlas-application.properties.xml file + if has_atlas_in_cluster(): +@@ -237,7 +237,7 @@ + configuration_attributes=params.config['configuration_attributes']['hiveserver2-site'], + owner=params.hive_user, + group=params.user_group, +- mode=0644) ++ mode=0o644) + + if params.hive_metastore_site_supported and name == 'metastore': + XmlConfig("hivemetastore-site.xml", +@@ -246,7 +246,7 @@ + configuration_attributes=params.config['configuration_attributes']['hivemetastore-site'], + owner=params.hive_user, + group=params.user_group, +- mode=0644) ++ mode=0o644) + + File(format("{hive_config_dir}/hive-env.sh"), + owner=params.hive_user, +@@ -264,7 +264,7 @@ + File(os.path.join(params.limits_conf_dir, 'hive.conf'), + owner='root', + group='root', +- mode=0644, ++ mode=0o644, + content=Template("hive.conf.j2") + ) + +@@ -276,7 +276,7 @@ + + 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 name == 'metastore': +@@ -287,7 +287,7 @@ + ) + + File(params.start_metastore_path, +- mode=0755, ++ mode=0o755, + content=StaticFile('startMetastore.sh') + ) + if params.init_metastore_schema: +@@ -318,7 +318,7 @@ + ) + elif name == 'hiveserver2': + File(params.start_hiveserver2_path, +- mode=0755, ++ mode=0o755, + content=Template(format('{start_hiveserver2_script}')) + ) + +@@ -334,25 +334,25 @@ + 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) + + """ + Writes configuration files required by Hive. + """ + def fill_conf_dir(component_conf_dir): +- import params ++ from . import params + + Directory(component_conf_dir, + owner=params.hive_user, +@@ -366,7 +366,7 @@ + configuration_attributes=params.config['configuration_attributes']['mapred-site'], + owner=params.hive_user, + group=params.user_group, +- mode=0644) ++ mode=0o644) + + + File(format("{component_conf_dir}/hive-default.xml.template"), +@@ -385,14 +385,14 @@ + log4j_exec_filename = 'hive-exec-log4j.properties' + if (params.log4j_exec_props != None): + File(format("{component_conf_dir}/{log4j_exec_filename}"), +- mode=0644, ++ mode=0o644, + group=params.user_group, + owner=params.hive_user, + content=params.log4j_exec_props + ) + elif (os.path.exists("{component_conf_dir}/{log4j_exec_filename}.template")): + File(format("{component_conf_dir}/{log4j_exec_filename}"), +- mode=0644, ++ mode=0o644, + group=params.user_group, + owner=params.hive_user, + content=StaticFile(format("{component_conf_dir}/{log4j_exec_filename}.template")) +@@ -401,14 +401,14 @@ + log4j_filename = 'hive-log4j.properties' + if (params.log4j_props != None): + File(format("{component_conf_dir}/{log4j_filename}"), +- mode=0644, ++ mode=0o644, + group=params.user_group, + owner=params.hive_user, + content=params.log4j_props + ) + elif (os.path.exists("{component_conf_dir}/{log4j_filename}.template")): + File(format("{component_conf_dir}/{log4j_filename}"), +- mode=0644, ++ mode=0o644, + group=params.user_group, + owner=params.hive_user, + content=StaticFile(format("{component_conf_dir}/{log4j_filename}.template")) +@@ -421,7 +421,7 @@ + Shared by Hive Batch, Hive Metastore, and Hive Interactive + :param target: Target of jdbc jar name, which could be for any of the components above. + """ +- import params ++ from . import params + + if not params.jdbc_jar_name: + return +@@ -474,5 +474,5 @@ + pass + + File(target, +- mode = 0644, ++ mode = 0o644, + ) +diff -Naur ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/hive_server_interactive.py apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/hive_server_interactive.py +--- ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/hive_server_interactive.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/hive_server_interactive.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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,11 +53,11 @@ + FILE_TYPE_XML + + # Local Imports +-from setup_ranger_hive import setup_ranger_hive +-from hive_service_interactive import hive_service_interactive +-from hive_interactive import hive_interactive +-from hive_server import HiveServerDefault +-from setup_ranger_hive_interactive import setup_ranger_hive_interactive ++from .setup_ranger_hive import setup_ranger_hive ++from .hive_service_interactive import hive_service_interactive ++from .hive_interactive import hive_interactive ++from .hive_server import HiveServerDefault ++from .setup_ranger_hive_interactive import setup_ranger_hive_interactive + + import traceback + +@@ -72,17 +72,17 @@ + return "hive-server2-hive2" + + def install(self, env): +- import params ++ from . import params + self.install_packages(env) + + def configure(self, env): +- import params ++ from . import params + env.set_params(params) + hive_interactive(name='hiveserver2') + + def pre_upgrade_restart(self, env, upgrade_type=None): + Logger.info("Executing Hive Server Interactive Stack Upgrade pre-restart") +- import params ++ from . import params + env.set_params(params) + + if params.version and check_stack_feature(StackFeature.ROLLING_UPGRADE, params.version): +@@ -105,7 +105,7 @@ + params.HdfsResource(None, action="execute") + + def start(self, env, upgrade_type=None): +- import params ++ from . import params + env.set_params(params) + self.configure(env) + +@@ -127,7 +127,7 @@ + + + def stop(self, env, upgrade_type=None): +- import params ++ from . import params + env.set_params(params) + + if params.security_enabled: +@@ -139,7 +139,7 @@ + self._llap_stop(env) + + def status(self, env): +- import status_params ++ from . import status_params + env.set_params(status_params) + + # We are not doing 'llap' status check done here as part of status check for 'HSI', as 'llap' status +@@ -150,7 +150,7 @@ + check_process_status(pid_file) + + def security_status(self, env): +- import status_params ++ from . import status_params + env.set_params(status_params) + + if status_params.security_enabled: +@@ -204,7 +204,7 @@ + else: + issues = [] + for cf in result_issues: +- issues.append("Configuration file %s did not pass the validation. Reason: %s" % (cf, result_issues[cf])) ++ issues.append("Configuration file {} did not pass the validation. Reason: {}".format(cf, result_issues[cf])) + self.put_structured_out({"securityIssuesFound": ". ".join(issues)}) + self.put_structured_out({"securityState": "UNSECURED"}) + else: +@@ -215,7 +215,7 @@ + Custom command to Restart LLAP + """ + Logger.info("Custom Command to retart LLAP") +- import params ++ from . import params + env.set_params(params) + + if params.security_enabled: +@@ -225,7 +225,7 @@ + self._llap_start(env) + + def _llap_stop(self, env): +- import params ++ from . import params + Logger.info("Stopping LLAP") + SLIDER_APP_NAME = "llap0" + +@@ -250,7 +250,7 @@ + Controls the start of LLAP. + """ + def _llap_start(self, env, cleanup=False): +- import params ++ from . import params + env.set_params(params) + Logger.info("Starting LLAP") + LLAP_PACKAGE_CREATION_PATH = Script.get_tmp_dir() +@@ -264,7 +264,7 @@ + " --output {LLAP_PACKAGE_CREATION_PATH}/{unique_name}") + if params.security_enabled: + llap_keytab_splits = params.hive_llap_keytab_file.split("/") +- Logger.debug("llap_keytab_splits : {0}".format(llap_keytab_splits)) ++ Logger.debug("llap_keytab_splits : {}".format(llap_keytab_splits)) + cmd += format(" --slider-keytab-dir .slider/keytabs/{params.hive_user}/ --slider-keytab " + "{llap_keytab_splits[4]} --slider-principal {params.hive_llap_principal}") + +@@ -297,16 +297,16 @@ + + Logger.info(format("Run file path: {run_file_path}")) + Execute(run_file_path, user=params.hive_user) +- Logger.info("Submitted LLAP app name : {0}".format(LLAP_APP_NAME)) ++ Logger.info("Submitted LLAP app name : {}".format(LLAP_APP_NAME)) + + # We need to check the status of LLAP app to figure out it got + # launched properly and is in running state. Then go ahead with Hive Interactive Server start. + status = self.check_llap_app_status(LLAP_APP_NAME, params.num_retries_for_checking_llap_status) + if status: +- Logger.info("LLAP app '{0}' deployed successfully.".format(LLAP_APP_NAME)) ++ Logger.info("LLAP app '{}' deployed successfully.".format(LLAP_APP_NAME)) + return True + else: +- Logger.error("LLAP app '{0}' deployment unsuccessful.".format(LLAP_APP_NAME)) ++ Logger.error("LLAP app '{}' deployment unsuccessful.".format(LLAP_APP_NAME)) + return False + except: + # Attempt to clean up the packaged application, or potentially rename it with a .bak +@@ -315,7 +315,7 @@ + parent_dir = os.path.dirname(run_file_path) + if os.path.isdir(parent_dir): + shutil.rmtree(parent_dir) +- except Exception, e: ++ except Exception as e: + Logger.error("Could not cleanup LLAP app package. Error: " + str(e)) + + # throw the original exception +@@ -325,7 +325,7 @@ + Does kinit and copies keytab for Hive/LLAP to HDFS. + """ + def setup_security(self): +- import params ++ from . import params + + self.do_kinit() + +@@ -334,7 +334,7 @@ + Execute(slider_keytab_install_cmd, user=params.hive_user) + + def do_kinit(self): +- import params ++ from . import params + + hive_interactive_kinit_cmd = format("{kinit_path_local} -kt {params.hive_server2_keytab} {params.hive_principal}; ") + Execute(hive_interactive_kinit_cmd, user=params.hive_user) +@@ -346,13 +346,13 @@ + Get llap app status data. + """ + def _get_llap_app_status_info(self, app_name): +- import status_params ++ from . import status_params + LLAP_APP_STATUS_CMD_TIMEOUT = 0 + + llap_status_cmd = format("{stack_root}/current/hive-server2-hive2/bin/hive --service llapstatus --name {app_name} --findAppTimeout {LLAP_APP_STATUS_CMD_TIMEOUT}") + code, output, error = shell.checked_call(llap_status_cmd, user=status_params.hive_user, stderr=subprocess.PIPE, + logoutput=False) +- Logger.info("Received 'llapstatus' command 'output' : {0}".format(output)) ++ Logger.info("Received 'llapstatus' command 'output' : {}".format(output)) + return self._make_valid_json(output) + + +@@ -415,7 +415,7 @@ + marker_idx = idx + break; + +- Logger.info("Marker index for start of JSON data for 'llapsrtatus' comamnd : {0}".format(marker_idx)) ++ Logger.info("Marker index for start of JSON data for 'llapsrtatus' comamnd : {}".format(marker_idx)) + + # Remove extra logging from possible JSON output + if marker_idx is None: +@@ -423,7 +423,7 @@ + else: + if marker_idx != 0: + del splits[0:marker_idx] +- Logger.info("Removed lines: '1-{0}' from the received 'llapstatus' output to make it valid for JSON parsing.".format(marker_idx)) ++ Logger.info("Removed lines: '1-{}' from the received 'llapstatus' output to make it valid for JSON parsing.".format(marker_idx)) + + scanned_output = '\n'.join(splits) + llap_app_info = json.loads(scanned_output) +@@ -463,7 +463,7 @@ + + if llap_app_info['state'].upper() == 'RUNNING_ALL': + Logger.info( +- "LLAP app '{0}' in '{1}' state.".format(llap_app_name, llap_app_info['state'])) ++ "LLAP app '{}' in '{}' state.".format(llap_app_name, llap_app_info['state'])) + return True + elif llap_app_info['state'].upper() == 'RUNNING_PARTIAL': + # Check how many instances were up. +@@ -472,56 +472,56 @@ + desired_instances = llap_app_info['desiredInstances'] + else: + Logger.info( +- "LLAP app '{0}' is in '{1}' state, but 'instances' information not available in JSON received. " \ ++ "LLAP app '{}' is in '{}' state, but 'instances' information not available in JSON received. " \ + "Exiting ....".format(llap_app_name, llap_app_info['state'])) + Logger.info(llap_app_info) + return False + if desired_instances == 0: +- Logger.info("LLAP app '{0}' desired instance are set to 0. Exiting ....".format(llap_app_name)) ++ Logger.info("LLAP app '{}' desired instance are set to 0. Exiting ....".format(llap_app_name)) + return False + + percentInstancesUp = 0 + if live_instances > 0: + percentInstancesUp = float(live_instances) / desired_instances * 100 + if percentInstancesUp >= percent_desired_instances_to_be_up: +- Logger.info("LLAP app '{0}' in '{1}' state. Live Instances : '{2}' >= {3}% of Desired Instances : " \ +- "'{4}'.".format(llap_app_name, llap_app_info['state'], ++ Logger.info("LLAP app '{}' in '{}' state. Live Instances : '{}' >= {}% of Desired Instances : " \ ++ "'{}'.".format(llap_app_name, llap_app_info['state'], + llap_app_info['liveInstances'], + percent_desired_instances_to_be_up, + llap_app_info['desiredInstances'])) + return True + else: +- Logger.info("LLAP app '{0}' in '{1}' state. Live Instances : '{2}'. Desired Instances : " \ +- "'{3}' after {4} secs.".format(llap_app_name, llap_app_info['state'], ++ Logger.info("LLAP app '{}' in '{}' state. Live Instances : '{}'. Desired Instances : " \ ++ "'{}' after {} secs.".format(llap_app_name, llap_app_info['state'], + llap_app_info['liveInstances'], + llap_app_info['desiredInstances'], + time.time() - curr_time)) +- raise Fail("App state is RUNNING_PARTIAL. Live Instances : '{0}', Desired Instance : '{1}'".format(llap_app_info['liveInstances'], ++ raise Fail("App state is RUNNING_PARTIAL. Live Instances : '{}', Desired Instance : '{}'".format(llap_app_info['liveInstances'], + llap_app_info['desiredInstances'])) + elif llap_app_info['state'].upper() in ['APP_NOT_FOUND', 'LAUNCHING', 'COMPLETE']: +- status_str = format("LLAP app '{0}' current state is {1}.".format(llap_app_name, llap_app_info['state'])) ++ status_str = format("LLAP app '{}' current state is {}.".format(llap_app_name, llap_app_info['state'])) + Logger.info(status_str) + raise Fail(status_str) + else: # Covers any unknown that we get. + Logger.info( +- "LLAP app '{0}' current state is '{1}'. Expected : 'RUNNING'.".format(llap_app_name, llap_app_info['state'])) ++ "LLAP app '{}' current state is '{}'. Expected : 'RUNNING'.".format(llap_app_name, llap_app_info['state'])) + return False + + try: + status = do_retries() + return status +- except Exception, e: +- Logger.info("LLAP app '{0}' did not come up after a wait of {1} seconds.".format(llap_app_name, ++ except Exception as e: ++ Logger.info("LLAP app '{}' did not come up after a wait of {} seconds.".format(llap_app_name, + time.time() - curr_time)) + traceback.print_exc() + return False + + def get_log_folder(self): +- import params ++ from . import params + return params.hive_log_dir + + def get_user(self): +- import params ++ from . import params + return params.hive_user + + @OsFamilyImpl(os_family=OSConst.WINSRV_FAMILY) +diff -Naur ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/hive_server.py apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/hive_server.py +--- ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/hive_server.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/hive_server.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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,23 +35,23 @@ + from ambari_commons import OSCheck, OSConst + if OSCheck.is_windows_family(): + from resource_management.libraries.functions.windows_service_utils import check_windows_service_status +-from setup_ranger_hive import setup_ranger_hive ++from .setup_ranger_hive import setup_ranger_hive + from ambari_commons.os_family_impl import OsFamilyImpl + from ambari_commons.constants import UPGRADE_TYPE_ROLLING + from resource_management.core.logger import Logger + +-import hive_server_upgrade +-from hive import hive +-from hive_service import hive_service ++from . import hive_server_upgrade ++from .hive import hive ++from .hive_service import hive_service + + + class HiveServer(Script): + def install(self, env): +- import params ++ from . import params + self.install_packages(env) + + def configure(self, env): +- import params ++ from . import params + env.set_params(params) + hive(name='hiveserver2') + +@@ -59,18 +59,18 @@ + @OsFamilyImpl(os_family=OSConst.WINSRV_FAMILY) + class HiveServerWindows(HiveServer): + def start(self, env): +- import params ++ from . import params + env.set_params(params) + self.configure(env) # FOR SECURITY + hive_service('hiveserver2', action='start') + + def stop(self, env): +- import params ++ from . import params + env.set_params(params) + hive_service('hiveserver2', action='stop') + + def status(self, env): +- import status_params ++ from . import status_params + check_windows_service_status(status_params.hive_server_win_service_name) + + +@@ -80,7 +80,7 @@ + return "hive-server2" + + def start(self, env, upgrade_type=None): +- import params ++ from . import params + env.set_params(params) + self.configure(env) # FOR SECURITY + +@@ -94,7 +94,7 @@ + + + def stop(self, env, upgrade_type=None): +- import params ++ from . import params + env.set_params(params) + + # During rolling upgrade, HiveServer2 should not be stopped before new server is available. +@@ -105,7 +105,7 @@ + + + def status(self, env): +- import status_params ++ from . import status_params + env.set_params(status_params) + pid_file = format("{hive_pid_dir}/{hive_pid}") + +@@ -115,7 +115,7 @@ + + def pre_upgrade_restart(self, env, upgrade_type=None): + Logger.info("Executing Hive Server Stack Upgrade pre-restart") +- import params ++ from . import params + env.set_params(params) + + if params.version and check_stack_feature(StackFeature.ROLLING_UPGRADE, params.version): +@@ -140,7 +140,7 @@ + + + def security_status(self, env): +- import status_params ++ from . import status_params + env.set_params(status_params) + if status_params.security_enabled: + props_value_check = {"hive.server2.authentication": "KERBEROS", +@@ -193,18 +193,18 @@ + else: + issues = [] + for cf in result_issues: +- issues.append("Configuration file %s did not pass the validation. Reason: %s" % (cf, result_issues[cf])) ++ issues.append("Configuration file {} did not pass the validation. Reason: {}".format(cf, result_issues[cf])) + self.put_structured_out({"securityIssuesFound": ". ".join(issues)}) + self.put_structured_out({"securityState": "UNSECURED"}) + else: + self.put_structured_out({"securityState": "UNSECURED"}) + + def get_log_folder(self): +- import params ++ from . import params + return params.hive_log_dir + + def get_user(self): +- import params ++ from . import params + return params.hive_user + + if __name__ == "__main__": +diff -Naur ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/hive_server_upgrade.py apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/hive_server_upgrade.py +--- ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/hive_server_upgrade.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/hive_server_upgrade.py 2022-07-11 00:52:29.000000000 +0800 +@@ -41,7 +41,7 @@ + This function will obtain the Kerberos ticket if security is enabled. + :return: + """ +- import params ++ from . import params + + Logger.info('HiveServer2 executing "deregister" command to complete upgrade...') + +@@ -73,7 +73,7 @@ + :param stack_version_formatted: Exact stack-version to use in the new path + :return: Hive execute path for the exact stack-version + """ +- import params ++ from . import params + + hive_execute_path = params.execute_path + formatted_stack_version = format_stack_version(stack_version_formatted) +@@ -97,7 +97,7 @@ + + :return: the hiveserver2 version, returned by "hive --version" + """ +- import params ++ from . import params + + try: + source_version = params.version_for_stack_feature_checks +@@ -108,19 +108,19 @@ + version_hive_bin = format('{stack_root}/{source_version}/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.') + + if return_code != 0: +- raise Fail('Unable to determine the current HiveServer2 version because of a non-zero return code of {0}'.format(str(return_code))) ++ raise Fail('Unable to determine the current HiveServer2 version because of a non-zero return code of {}'.format(str(return_code))) + +- match = re.search('^(Hive) ([0-9]+.[0-9]+.\S+)', output, re.MULTILINE) ++ match = re.search(r'^(Hive) ([0-9]+.[0-9]+.\S+)', output, re.MULTILINE) + + if match: + current_hive_server_version = match.group(2) + return current_hive_server_version + else: +- raise Fail('The extracted hiveserver2 version "{0}" does not matching any known pattern'.format(output)) ++ raise Fail('The extracted hiveserver2 version "{}" does not matching any known pattern'.format(output)) + + +diff -Naur ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/hive_service_interactive.py apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/hive_service_interactive.py +--- ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/hive_service_interactive.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/hive_service_interactive.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + from ambari_commons import OSConst + + # Local Imports +-from hive_service import check_fs_root ++from .hive_service import check_fs_root + + + @OsFamilyFuncImpl(os_family=OSConst.WINSRV_FAMILY) +@@ -40,7 +40,7 @@ + + @OsFamilyFuncImpl(os_family=OsFamilyImpl.DEFAULT) + def hive_service_interactive(name, action='start', upgrade_type=None): +- import params ++ from . import params + + pid_file = format("{hive_pid_dir}/{hive_interactive_pid}") + cmd = format("{start_hiveserver2_interactive_path} {hive_pid_dir}/hive-server2-interactive.out {hive_log_dir}/hive-server2-interactive.err {pid_file} {hive_server_interactive_conf_dir} {hive_log_dir}") +diff -Naur ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/hive_service.py apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/hive_service.py +--- ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/hive_service.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/hive_service.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + + @OsFamilyFuncImpl(os_family=OSConst.WINSRV_FAMILY) + def hive_service(name, action='start', upgrade_type=None): +- import params ++ from . import params + if name == 'metastore': + if action == 'start' or action == 'stop': + Service(params.hive_metastore_win_service_name, action=action) +@@ -54,7 +54,7 @@ + @OsFamilyFuncImpl(os_family=OsFamilyImpl.DEFAULT) + def hive_service(name, action='start', upgrade_type=None): + +- import params ++ from . import params + + if name == 'metastore': + pid_file = format("{hive_pid_dir}/{hive_metastore_pid}") +@@ -142,7 +142,7 @@ + ) + + def validate_connection(target_path_to_jdbc, hive_lib_path): +- import params ++ from . import params + + path_to_jdbc = target_path_to_jdbc + if not params.jdbc_jar_name: +@@ -166,7 +166,7 @@ + + + def check_fs_root(conf_dir, execution_path): +- import params ++ from . import params + + if not params.fs_root.startswith("hdfs://"): + Logger.info("Skipping fs root check as fs_root does not start with hdfs://") +diff -Naur ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/__init__.py apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/__init__.py +--- ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/__init__.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/__init__.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/mysql_server.py apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/mysql_server.py +--- ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/mysql_server.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/mysql_server.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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,41 +20,41 @@ + + import sys + import os +-import mysql_users ++from . import mysql_users + from resource_management import * + +-from mysql_service import mysql_service +-from mysql_utils import mysql_configure ++from .mysql_service import mysql_service ++from .mysql_utils import mysql_configure + + + class MysqlServer(Script): + def install(self, env): +- import params ++ from . import params + self.install_packages(env) + self.configure(env) + + def clean(self, env): +- import params ++ from . import params + env.set_params(params) + mysql_users.mysql_deluser() + + def configure(self, env): +- import params ++ from . import params + env.set_params(params) + mysql_configure() + + def start(self, env, rolling_restart=False): +- import params ++ from . import params + env.set_params(params) + mysql_service(daemon_name=params.daemon_name, action='start') + + def stop(self, env, rolling_restart=False): +- import params ++ from . import params + env.set_params(params) + mysql_service(daemon_name=params.daemon_name, action='stop') + + def status(self, env): +- import status_params ++ from . import status_params + env.set_params(status_params) + + mysql_service(daemon_name=status_params.daemon_name, action='status') +diff -Naur ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/mysql_service.py apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/mysql_service.py +--- ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/mysql_service.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/mysql_service.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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,14 +31,14 @@ + except Fail: + raise ComponentIsNotRunning() + elif action == 'stop': +- import params ++ from . import params + Execute(cmd, + logoutput = True, + only_if = status_cmd, + sudo = True, + ) + elif action == 'start': +- import params ++ from . import params + Execute(cmd, + logoutput = True, + not_if = status_cmd, +diff -Naur ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/mysql_users.py apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/mysql_users.py +--- ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/mysql_users.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/mysql_users.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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,10 +22,10 @@ + + # Used to add hive access to the needed components + def mysql_adduser(): +- import params ++ from . import params + + File(params.mysql_adduser_path, +- mode=0755, ++ mode=0o755, + content=StaticFile('addMysqlUser.sh') + ) + hive_server_host = format("{hive_server_host}") +@@ -46,10 +46,10 @@ + + # Removes hive access from components + def mysql_deluser(): +- import params ++ from . import params + + File(params.mysql_deluser_path, +- mode=0755, ++ mode=0o755, + content=StaticFile('removeMysqlUser.sh') + ) + hive_server_host = format("{hive_server_host}") +diff -Naur ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/mysql_utils.py apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/mysql_utils.py +--- ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/mysql_utils.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/mysql_utils.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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,10 +19,10 @@ + """ + + from resource_management import * +-import mysql_users ++from . import mysql_users + + def mysql_configure(): +- import params ++ from . import params + + # required for running hive + replace_bind_address = ('sed','-i','s|^bind-address[ \t]*=.*|bind-address = 0.0.0.0|',params.mysql_configname) +@@ -32,4 +32,3 @@ + + # this also will start mysql-server + mysql_users.mysql_adduser() +- +\ 文件尾没有换行符 +diff -Naur ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/params_linux.py apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/params_linux.py +--- ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/params_linux.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/params_linux.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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,11 +18,11 @@ + + """ + +-import status_params ++from . import status_params + import ambari_simplejson as json # simplejson is much faster comparing to Python 2.6 json module and has the same functions set. + import os + +-from urlparse import urlparse ++from urllib.parse import urlparse + + from ambari_commons.constants import AMBARI_SUDO_BINARY + from ambari_commons.os_check import OSCheck +@@ -171,17 +171,17 @@ + # DON'T CHANGE THESE VARIABLE NAMES + # Values don't change from those in copy_tarball.py + webhcat_apps_dir = "/apps/webhcat" +-hive_tar_source = "{0}/{1}/hive/hive.tar.gz".format(STACK_ROOT_PATTERN, STACK_VERSION_PATTERN) +-pig_tar_source = "{0}/{1}/pig/pig.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) +-pig_tar_dest_file = "/{0}/apps/{1}/pig/pig.tar.gz".format(STACK_NAME_PATTERN, STACK_VERSION_PATTERN) +- +-hadoop_streaming_tar_source = "{0}/{1}/hadoop-mapreduce/hadoop-streaming.jar".format(STACK_ROOT_PATTERN, STACK_VERSION_PATTERN) +-sqoop_tar_source = "{0}/{1}/sqoop/sqoop.tar.gz".format(STACK_ROOT_PATTERN, STACK_VERSION_PATTERN) +-hadoop_streaming_tar_dest_dir = "/{0}/apps/{1}/mapreduce/".format(STACK_NAME_PATTERN,STACK_VERSION_PATTERN) +-sqoop_tar_dest_dir = "/{0}/apps/{1}/sqoop/".format(STACK_NAME_PATTERN, STACK_VERSION_PATTERN) ++hive_tar_source = "{}/{}/hive/hive.tar.gz".format(STACK_ROOT_PATTERN, STACK_VERSION_PATTERN) ++pig_tar_source = "{}/{}/pig/pig.tar.gz".format(STACK_ROOT_PATTERN, STACK_VERSION_PATTERN) ++hive_tar_dest_file = "/{}/apps/{}/hive/hive.tar.gz".format(STACK_NAME_PATTERN,STACK_VERSION_PATTERN) ++pig_tar_dest_file = "/{}/apps/{}/pig/pig.tar.gz".format(STACK_NAME_PATTERN, STACK_VERSION_PATTERN) ++ ++hadoop_streaming_tar_source = "{}/{}/hadoop-mapreduce/hadoop-streaming.jar".format(STACK_ROOT_PATTERN, STACK_VERSION_PATTERN) ++sqoop_tar_source = "{}/{}/sqoop/sqoop.tar.gz".format(STACK_ROOT_PATTERN, STACK_VERSION_PATTERN) ++hadoop_streaming_tar_dest_dir = "/{}/apps/{}/mapreduce/".format(STACK_NAME_PATTERN,STACK_VERSION_PATTERN) ++sqoop_tar_dest_dir = "/{}/apps/{}/sqoop/".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 +@@ -203,7 +203,7 @@ + hive_jdbc_connection_url = config['configurations']['hive-site']['javax.jdo.option.ConnectionURL'] + + 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'] + + #HACK Temporarily use dbType=azuredb while invoking schematool +@@ -446,7 +446,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_apps_whs_dir = config['configurations']['hive-site']["hive.metastore.warehouse.dir"] + whs_dir_protocol = urlparse(hive_apps_whs_dir).scheme + hive_exec_scratchdir = config['configurations']['hive-site']["hive.exec.scratchdir"] +@@ -547,9 +547,9 @@ + webhcat_server_host = config['clusterHostInfo']['webhcat_server_host'] + + hcat_hdfs_user_dir = format("/user/{hcat_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 + #for create_hdfs_directory + security_param = "true" if security_enabled else "false" + +@@ -649,7 +649,7 @@ + #For curl command in ranger plugin to get db connector + if has_ranger_admin: + enable_ranger_hive = (config['configurations']['hive-env']['hive_security_authorization'].lower() == 'ranger') +- repo_config_password = unicode(config['configurations']['ranger-hive-plugin-properties']['REPOSITORY_CONFIG_PASSWORD']) ++ repo_config_password = str(config['configurations']['ranger-hive-plugin-properties']['REPOSITORY_CONFIG_PASSWORD']) + xa_audit_db_flavor = (config['configurations']['admin-properties']['DB_FLAVOR']).lower() + ranger_previous_jdbc_jar_name = None + +@@ -727,13 +727,13 @@ + xa_audit_db_is_enabled = False + xa_audit_db_password = '' + if not is_empty(config['configurations']['admin-properties']['audit_db_password']) and stack_supports_ranger_audit_db: +- xa_audit_db_password = unicode(config['configurations']['admin-properties']['audit_db_password']) ++ xa_audit_db_password = str(config['configurations']['admin-properties']['audit_db_password']) + ranger_audit_solr_urls = config['configurations']['ranger-admin-site']['ranger.audit.solr.urls'] + if xml_configurations_supported and stack_supports_ranger_audit_db: + xa_audit_db_is_enabled = config['configurations']['ranger-hive-audit']['xasecure.audit.destination.db'] + xa_audit_hdfs_is_enabled = config['configurations']['ranger-hive-audit']['xasecure.audit.destination.hdfs'] if xml_configurations_supported else None +- ssl_keystore_password = unicode(config['configurations']['ranger-hive-policymgr-ssl']['xasecure.policymgr.clientssl.keystore.password']) if xml_configurations_supported else None +- ssl_truststore_password = unicode(config['configurations']['ranger-hive-policymgr-ssl']['xasecure.policymgr.clientssl.truststore.password']) if xml_configurations_supported else None ++ ssl_keystore_password = str(config['configurations']['ranger-hive-policymgr-ssl']['xasecure.policymgr.clientssl.keystore.password']) if xml_configurations_supported else None ++ ssl_truststore_password = str(config['configurations']['ranger-hive-policymgr-ssl']['xasecure.policymgr.clientssl.truststore.password']) if xml_configurations_supported else None + credential_file = format('/etc/ranger/{repo_name}/cred.jceks') if xml_configurations_supported else None + + #For SQLA explicitly disable audit to DB for Ranger +diff -Naur ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/params.py apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/params.py +--- ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/params.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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,9 +21,9 @@ + from resource_management.libraries.functions.default import default + + if OSCheck.is_windows_family(): +- from params_windows import * ++ from .params_windows import * + else: +- from params_linux import * ++ from .params_linux import * + + host_sys_prepped = default("/hostLevelParams/host_sys_prepped", False) + retryAble = default("/commandParams/command_retry_enabled", False) +diff -Naur ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/params_windows.py apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/params_windows.py +--- ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/params_windows.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/params_windows.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 * +-from status_params import * ++from .status_params import * + + # server configurations + config = Script.get_config() +diff -Naur ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/service_check.py apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/service_check.py +--- ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/service_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/service_check.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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,8 +24,8 @@ + import time + import subprocess + +-from hcat_service_check import hcat_service_check +-from webhcat_service_check import webhcat_service_check ++from .hcat_service_check import hcat_service_check ++from .webhcat_service_check import webhcat_service_check + from ambari_commons import OSConst + from ambari_commons.os_family_impl import OsFamilyImpl + from resource_management.core import shell +@@ -39,7 +39,7 @@ + @OsFamilyImpl(os_family=OSConst.WINSRV_FAMILY) + class HiveServiceCheckWindows(HiveServiceCheck): + def service_check(self, env): +- import params ++ from . import params + env.set_params(params) + smoke_cmd = os.path.join(params.stack_root,"Run-SmokeTests.cmd") + service = "HIVE" +@@ -53,11 +53,11 @@ + class HiveServiceCheckDefault(HiveServiceCheck): + + def __init__(self): +- super(HiveServiceCheckDefault, self).__init__() ++ super().__init__() + Logger.initialize_logger() + + def service_check(self, env): +- import params ++ from . import params + env.set_params(params) + + if params.security_enabled: +@@ -96,9 +96,9 @@ + webhcat_service_check() + + def check_hive_server(self, env, server_component_name, kinit_cmd, address_list, server_port): +- import params ++ from . import params + env.set_params(params) +- Logger.info("Server Address List : {0}, Port : {1}".format(address_list, server_port)) ++ Logger.info("Server Address List : {}, Port : {}".format(address_list, server_port)) + + if not address_list: + raise Fail("Can not find any "+server_component_name+" ,host. Please check configuration.") +@@ -108,7 +108,7 @@ + start_time = time.time() + end_time = start_time + SOCKET_WAIT_SECONDS + +- Logger.info("Waiting for the {0} to start...".format(server_component_name)) ++ Logger.info("Waiting for the {} to start...".format(server_component_name)) + + workable_server_available = False + i = 0 +@@ -120,10 +120,10 @@ + transport_mode=params.hive_transport_mode, http_endpoint=params.hive_http_endpoint, + ssl=params.hive_ssl, ssl_keystore=params.hive_ssl_keystore_path, + ssl_password=params.hive_ssl_keystore_password) +- Logger.info("Successfully connected to {0} on port {1}".format(address, server_port)) ++ Logger.info("Successfully connected to {} on port {}".format(address, server_port)) + workable_server_available = True + except: +- Logger.info("Connection to {0} on port {1} failed".format(address, server_port)) ++ Logger.info("Connection to {} on port {} failed".format(address, server_port)) + time.sleep(5) + + i += 1 +@@ -133,17 +133,17 @@ + elapsed_time = time.time() - start_time + + if not workable_server_available: +- raise Fail("Connection to '{0}' on host: {1} and port {2} failed after {3} seconds" ++ raise Fail("Connection to '{}' on host: {} and port {} failed after {} seconds" + .format(server_component_name, params.hostname, server_port, elapsed_time)) + +- Logger.info("Successfully stayed connected to '{0}' on host: {1} and port {2} after {3} seconds" ++ Logger.info("Successfully stayed connected to '{}' on host: {} and port {} after {} seconds" + .format(server_component_name, params.hostname, server_port, elapsed_time)) + + """ + Performs Service check for LLAP app + """ + def check_llap(self, env, kinit_cmd, address, port, key, hive_auth="NOSASL", transport_mode="binary", http_endpoint="cliservice"): +- import params ++ from . import params + env.set_params(params) + + unique_id = get_unique_id_and_date() +@@ -176,7 +176,7 @@ + # Append LLAP SQL script path + llap_cmd += format(" --hiveconf \"hiveLlapServiceCheck={unique_id}\" -f {stack_root}/current/hive-server2-hive2/scripts/llap/sql/serviceCheckScript.sql") + # Append grep patterns for detecting failure +- llap_cmd += " -e '' 2>&1| awk '{print}'|grep -i -e 'Invalid status\|Invalid URL\|command not found\|Connection refused'" ++ llap_cmd += r" -e '' 2>&1| awk '{print}'|grep -i -e 'Invalid status\|Invalid URL\|command not found\|Connection refused'" + + Execute(llap_cmd, + user=params.hive_user, +diff -Naur ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/setup_ranger_hive_interactive.py apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/setup_ranger_hive_interactive.py +--- ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/setup_ranger_hive_interactive.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/setup_ranger_hive_interactive.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 resource_management.core.logger import Logger + + def setup_ranger_hive_interactive(upgrade_type = None): +- import params ++ from . import params + + if params.has_ranger_admin: + +@@ -40,7 +40,7 @@ + action="create_on_execute", + owner=params.hdfs_user, + group=params.hdfs_user, +- mode=0755, ++ mode=0o755, + recursive_chmod=True + ) + params.HdfsResource("/ranger/audit/hive2", +@@ -48,7 +48,7 @@ + action="create_on_execute", + owner=params.hive_user, + group=params.hive_user, +- mode=0700, ++ mode=0o700, + recursive_chmod=True + ) + params.HdfsResource(None, action="execute") +diff -Naur ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/setup_ranger_hive.py apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/setup_ranger_hive.py +--- ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/setup_ranger_hive.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/setup_ranger_hive.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 resource_management.core.logger import Logger + + def setup_ranger_hive(upgrade_type = None): +- import params ++ from . import params + + if params.has_ranger_admin: + +@@ -40,7 +40,7 @@ + action="create_on_execute", + owner=params.hdfs_user, + group=params.hdfs_user, +- mode=0755, ++ mode=0o755, + recursive_chmod=True + ) + params.HdfsResource("/ranger/audit/hiveServer2", +@@ -48,7 +48,7 @@ + action="create_on_execute", + owner=params.hive_user, + group=params.hive_user, +- mode=0700, ++ mode=0o700, + recursive_chmod=True + ) + params.HdfsResource(None, action="execute") +diff -Naur ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/status_params.py apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/status_params.py +--- ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/status_params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/status_params.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/webhcat.py apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/webhcat.py +--- ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/webhcat.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/webhcat.py 2022-07-11 00:52:29.000000000 +0800 +@@ -32,7 +32,7 @@ + + @OsFamilyFuncImpl(os_family=OSConst.WINSRV_FAMILY) + def webhcat(): +- import params ++ from . import params + XmlConfig("webhcat-site.xml", + conf_dir=params.hcat_config_dir, + configurations=params.config['configurations']['webhcat-site'] +@@ -46,17 +46,17 @@ + + @OsFamilyFuncImpl(os_family=OsFamilyImpl.DEFAULT) + def webhcat(): +- import params ++ from . import params + + 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) + +@@ -125,14 +125,14 @@ + log4j_webhcat_filename = 'webhcat-log4j.properties' + if (params.log4j_webhcat_props != None): + File(format("{config_dir}/{log4j_webhcat_filename}"), +- mode=0644, ++ mode=0o644, + group=params.user_group, + owner=params.webhcat_user, + content=params.log4j_webhcat_props + ) + elif (os.path.exists("{config_dir}/{log4j_webhcat_filename}.template")): + File(format("{config_dir}/{log4j_webhcat_filename}"), +- mode=0644, ++ mode=0o644, + group=params.user_group, + owner=params.webhcat_user, + content=StaticFile(format("{config_dir}/{log4j_webhcat_filename}.template")) +diff -Naur ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/webhcat_server.py apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/webhcat_server.py +--- ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/webhcat_server.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/webhcat_server.py 2022-07-11 00:52:29.000000000 +0800 +@@ -26,30 +26,30 @@ + from resource_management.libraries.functions.security_commons import build_expectations, \ + cached_kinit_executor, get_params_from_filesystem, validate_security_config_properties, \ + FILE_TYPE_XML +-from webhcat import webhcat +-from webhcat_service import webhcat_service ++from .webhcat import webhcat ++from .webhcat_service import webhcat_service + from ambari_commons import OSConst + from ambari_commons.os_family_impl import OsFamilyImpl + + + class WebHCatServer(Script): + def install(self, env): +- import params ++ from . import params + self.install_packages(env) + + def start(self, env, upgrade_type=None): +- import params ++ from . import params + env.set_params(params) + self.configure(env) # FOR SECURITY + webhcat_service(action='start', upgrade_type=upgrade_type) + + def stop(self, env, upgrade_type=None): +- import params ++ from . import params + env.set_params(params) + webhcat_service(action='stop') + + def configure(self, env): +- import params ++ from . import params + env.set_params(params) + webhcat() + +@@ -57,7 +57,7 @@ + @OsFamilyImpl(os_family=OSConst.WINSRV_FAMILY) + class WebHCatServerWindows(WebHCatServer): + def status(self, env): +- import status_params ++ from . import status_params + env.set_params(status_params) + check_windows_service_status(status_params.webhcat_server_win_service_name) + +@@ -68,13 +68,13 @@ + return "hive-webhcat" + + def status(self, env): +- import status_params ++ from . import status_params + env.set_params(status_params) + check_process_status(status_params.webhcat_pid_file) + + def pre_upgrade_restart(self, env, upgrade_type=None): + Logger.info("Executing WebHCat Stack Upgrade pre-restart") +- import params ++ from . import params + env.set_params(params) + + if params.version and check_stack_feature(StackFeature.ROLLING_UPGRADE, params.version): +@@ -82,7 +82,7 @@ + stack_select.select("hive-webhcat", params.version) + + def security_status(self, env): +- import status_params ++ from . import status_params + env.set_params(status_params) + + if status_params.security_enabled: +@@ -144,18 +144,18 @@ + else: + issues = [] + for cf in result_issues: +- issues.append("Configuration file %s did not pass the validation. Reason: %s" % (cf, result_issues[cf])) ++ issues.append("Configuration file {} did not pass the validation. Reason: {}".format(cf, result_issues[cf])) + self.put_structured_out({"securityIssuesFound": ". ".join(issues)}) + self.put_structured_out({"securityState": "UNSECURED"}) + else: + self.put_structured_out({"securityState": "UNSECURED"}) + + def get_log_folder(self): +- import params ++ from . import params + return params.hcat_log_dir + + def get_user(self): +- import params ++ from . import params + return params.webhcat_user + + if __name__ == "__main__": +diff -Naur ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/webhcat_service_check.py apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/webhcat_service_check.py +--- ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/webhcat_service_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/webhcat_service_check.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 import * + from ambari_commons.os_family_impl import OsFamilyFuncImpl, OsFamilyImpl +@@ -28,7 +28,7 @@ + def webhcat_service_check(): + Logger.info("Webhcat smoke test - service status") + +- import params ++ from . import params + # AMBARI-11633 [WinTP2] Webhcat service check fails + # Hive doesn't pass the environment variables correctly to child processes, which fails the smoke test. + # Reducing the amount of URLs checked to the minimum required. +@@ -50,21 +50,21 @@ + url_port = params.config["configurations"]["webhcat-site"]["templeton.port"] + + for url_test in url_tests: +- url_request = "http://{0}:{1}/templeton/v1/{2}".format(url_host, url_port, url_test) ++ url_request = "http://{}:{}/templeton/v1/{}".format(url_host, url_port, url_test) + url_response = None + + try: + # execute the query for the JSON that includes WebHCat status +- url_response = urllib2.urlopen(url_request, timeout=30) ++ url_response = urllib.request.urlopen(url_request, timeout=30) + + status = url_response.getcode() + response = url_response.read() + + if status != 200: +- Logger.warning("Webhcat service check status: {0}".format(status)) +- Logger.info("Webhcat service check response: {0}".format(response)) +- except urllib2.HTTPError as he: +- raise Fail("Webhcat check {0} failed: {1}".format(url_request, he.msg)) ++ Logger.warning("Webhcat service check status: {}".format(status)) ++ Logger.info("Webhcat service check response: {}".format(response)) ++ except urllib.error.HTTPError as he: ++ raise Fail("Webhcat check {} failed: {}".format(url_request, he.msg)) + finally: + if url_response is not None: + try: +@@ -75,10 +75,10 @@ + + @OsFamilyFuncImpl(os_family=OsFamilyImpl.DEFAULT) + def webhcat_service_check(): +- import params ++ from . import params + File(format("{tmp_dir}/templetonSmoke.sh"), + content= StaticFile('templetonSmoke.sh'), +- mode=0755 ++ mode=0o755 + ) + + if params.security_enabled: +diff -Naur ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/webhcat_service.py apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/webhcat_service.py +--- ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/webhcat_service.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/package/scripts/webhcat_service.py 2022-07-11 00:52:29.000000000 +0800 +@@ -28,14 +28,14 @@ + + @OsFamilyFuncImpl(os_family=OSConst.WINSRV_FAMILY) + def webhcat_service(action='start', rolling_restart=False): +- import params ++ from . import params + if action == 'start' or action == 'stop': + Service(params.webhcat_server_win_service_name, action=action) + + + @OsFamilyFuncImpl(os_family=OsFamilyImpl.DEFAULT) + def webhcat_service(action='start', upgrade_type=None): +- import params ++ from . import params + + environ = { + 'HADOOP_HOME': params.hadoop_home +@@ -88,7 +88,7 @@ + ) + + def graceful_stop(cmd, environ): +- import params ++ from . import params + daemon_cmd = format('{cmd} stop') + + Execute(daemon_cmd, +diff -Naur ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/stack_advisor.py apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/stack_advisor.py +--- ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/stack_advisor.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/stack_advisor.py 2022-07-11 00:52:29.000000000 +0800 +@@ -32,16 +32,16 @@ + class ODPi20StackAdvisor(DefaultStackAdvisor): + + def __init__(self): +- super(ODPi20StackAdvisor, self).__init__() ++ super().__init__() + self.initialize_logger("ODPi20StackAdvisor") + + def getComponentLayoutValidations(self, services, hosts): + """Returns array of Validation objects about issues with hostnames components assigned to""" +- items = super(ODPi20StackAdvisor, self).getComponentLayoutValidations(services, hosts) ++ items = super().getComponentLayoutValidations(services, hosts) + + # Validating NAMENODE and SECONDARY_NAMENODE are on different hosts if possible + # Use a set for fast lookup +- hostsSet = set(super(ODPi20StackAdvisor, self).getActiveHosts([host["Hosts"] for host in hosts["items"]])) #[host["Hosts"]["host_name"] for host in hosts["items"]] ++ hostsSet = set(super().getActiveHosts([host["Hosts"] for host in hosts["items"]])) #[host["Hosts"]["host_name"] for host in hosts["items"]] + hostsCount = len(hostsSet) + + componentsListList = [service["components"] for service in services["services"]] +@@ -64,19 +64,19 @@ + if "+" in cardinality: + hostsMin = int(cardinality[:-1]) + if componentHostsCount < hostsMin: +- message = "At least {0} {1} components should be installed in cluster.".format(hostsMin, componentDisplayName) ++ message = "At least {} {} components should be installed in cluster.".format(hostsMin, componentDisplayName) + elif "-" in cardinality: + nums = cardinality.split("-") + hostsMin = int(nums[0]) + hostsMax = int(nums[1]) + if componentHostsCount > hostsMax or componentHostsCount < hostsMin: +- message = "Between {0} and {1} {2} components should be installed in cluster.".format(hostsMin, hostsMax, componentDisplayName) ++ message = "Between {} and {} {} components should be installed in cluster.".format(hostsMin, hostsMax, componentDisplayName) + elif "ALL" == cardinality: + if componentHostsCount != hostsCount: +- message = "{0} component should be installed on all hosts in cluster.".format(componentDisplayName) ++ message = "{} component should be installed on all hosts in cluster.".format(componentDisplayName) + else: + if componentHostsCount != int(cardinality): +- message = "Exactly {0} {1} components should be installed in cluster.".format(int(cardinality), componentDisplayName) ++ message = "Exactly {} {} components should be installed in cluster.".format(int(cardinality), componentDisplayName) + + if message is not None: + items.append({"type": 'host-component', "level": 'ERROR', "message": message, "component-name": componentName}) +@@ -126,12 +126,12 @@ + if "TEZ" in servicesList: + ambari_user = self.getAmbariUser(services) + ambariHostName = socket.getfqdn() +- putYarnProperty("yarn.timeline-service.http-authentication.proxyuser.{0}.hosts".format(ambari_user), ambariHostName) +- putYarnProperty("yarn.timeline-service.http-authentication.proxyuser.{0}.groups".format(ambari_user), "*") ++ putYarnProperty("yarn.timeline-service.http-authentication.proxyuser.{}.hosts".format(ambari_user), ambariHostName) ++ putYarnProperty("yarn.timeline-service.http-authentication.proxyuser.{}.groups".format(ambari_user), "*") + old_ambari_user = self.getOldAmbariUser(services) + if old_ambari_user is not None: +- putYarnPropertyAttribute("yarn.timeline-service.http-authentication.proxyuser.{0}.hosts".format(old_ambari_user), 'delete', 'true') +- putYarnPropertyAttribute("yarn.timeline-service.http-authentication.proxyuser.{0}.groups".format(old_ambari_user), 'delete', 'true') ++ putYarnPropertyAttribute("yarn.timeline-service.http-authentication.proxyuser.{}.hosts".format(old_ambari_user), 'delete', 'true') ++ putYarnPropertyAttribute("yarn.timeline-service.http-authentication.proxyuser.{}.groups".format(old_ambari_user), 'delete', 'true') + + + def recommendMapReduce2Configurations(self, configurations, clusterData, services, hosts): +@@ -172,12 +172,12 @@ + if "HDFS" in servicesList: + ambari_user = self.getAmbariUser(services) + ambariHostName = socket.getfqdn() +- putCoreSiteProperty("hadoop.proxyuser.{0}.hosts".format(ambari_user), ambariHostName) +- putCoreSiteProperty("hadoop.proxyuser.{0}.groups".format(ambari_user), "*") ++ putCoreSiteProperty("hadoop.proxyuser.{}.hosts".format(ambari_user), ambariHostName) ++ putCoreSiteProperty("hadoop.proxyuser.{}.groups".format(ambari_user), "*") + old_ambari_user = self.getOldAmbariUser(services) + if old_ambari_user is not None: +- putCoreSitePropertyAttribute("hadoop.proxyuser.{0}.hosts".format(old_ambari_user), 'delete', 'true') +- putCoreSitePropertyAttribute("hadoop.proxyuser.{0}.groups".format(old_ambari_user), 'delete', 'true') ++ putCoreSitePropertyAttribute("hadoop.proxyuser.{}.hosts".format(old_ambari_user), 'delete', 'true') ++ putCoreSitePropertyAttribute("hadoop.proxyuser.{}.groups".format(old_ambari_user), 'delete', 'true') + + def recommendHadoopProxyUsers (self, configurations, services, hosts): + servicesList = [service["StackServices"]["service_name"] for service in services["services"]] +@@ -227,10 +227,10 @@ + hiveServerInteractiveHostName = hiveServerInteractiveHost["Hosts"]["host_name"] + if hiveServerInteractiveHostName not in hiveServerHostsNameList: + hiveServerHostsNameList.append(hiveServerInteractiveHostName) +- self.logger.info("Appended (if not exiting), Hive Server Interactive Host : '{0}', to Hive Server Host List : '{1}'".format(hiveServerInteractiveHostName, hiveServerHostsNameList)) ++ self.logger.info("Appended (if not exiting), Hive Server Interactive Host : '{}', to Hive Server Host List : '{}'".format(hiveServerInteractiveHostName, hiveServerHostsNameList)) + + hiveServerHostsNames = ",".join(hiveServerHostsNameList) # includes Hive Server interactive host also. +- self.logger.info("Hive Server and Hive Server Interactive (if enabled) Host List : {0}".format(hiveServerHostsNameList)) ++ self.logger.info("Hive Server and Hive Server Interactive (if enabled) Host List : {}".format(hiveServerHostsNameList)) + if not hive_user in users and hive_user is not None: + users[hive_user] = {"propertyHosts" : hiveServerHostsNames,"propertyGroups" : "*", "config" : "hive-env", "propertyName" : "hive_user"} + +@@ -281,27 +281,27 @@ + putCoreSiteProperty = self.putProperty(configurations, "core-site", services) + putCoreSitePropertyAttribute = self.putPropertyAttribute(configurations, "core-site") + +- for user_name, user_properties in users.iteritems(): ++ for user_name, user_properties in users.items(): + if hive_user and hive_user == user_name: + if "propertyHosts" in user_properties: +- services["forced-configurations"].append({"type" : "core-site", "name" : "hadoop.proxyuser.{0}.hosts".format(hive_user)}) ++ services["forced-configurations"].append({"type" : "core-site", "name" : "hadoop.proxyuser.{}.hosts".format(hive_user)}) + # Add properties "hadoop.proxyuser.*.hosts", "hadoop.proxyuser.*.groups" to core-site for all users +- putCoreSiteProperty("hadoop.proxyuser.{0}.hosts".format(user_name) , user_properties["propertyHosts"]) +- self.logger.info("Updated hadoop.proxyuser.{0}.hosts as : {1}".format(hive_user, user_properties["propertyHosts"])) ++ putCoreSiteProperty("hadoop.proxyuser.{}.hosts".format(user_name) , user_properties["propertyHosts"]) ++ self.logger.info("Updated hadoop.proxyuser.{}.hosts as : {}".format(hive_user, user_properties["propertyHosts"])) + if "propertyGroups" in user_properties: +- putCoreSiteProperty("hadoop.proxyuser.{0}.groups".format(user_name) , user_properties["propertyGroups"]) ++ putCoreSiteProperty("hadoop.proxyuser.{}.groups".format(user_name) , user_properties["propertyGroups"]) + + # Remove old properties if user was renamed + userOldValue = getOldValue(self, services, user_properties["config"], user_properties["propertyName"]) + if userOldValue is not None and userOldValue != user_name: +- putCoreSitePropertyAttribute("hadoop.proxyuser.{0}.hosts".format(userOldValue), 'delete', 'true') +- services["forced-configurations"].append({"type" : "core-site", "name" : "hadoop.proxyuser.{0}.hosts".format(userOldValue)}) +- services["forced-configurations"].append({"type" : "core-site", "name" : "hadoop.proxyuser.{0}.hosts".format(user_name)}) ++ putCoreSitePropertyAttribute("hadoop.proxyuser.{}.hosts".format(userOldValue), 'delete', 'true') ++ services["forced-configurations"].append({"type" : "core-site", "name" : "hadoop.proxyuser.{}.hosts".format(userOldValue)}) ++ services["forced-configurations"].append({"type" : "core-site", "name" : "hadoop.proxyuser.{}.hosts".format(user_name)}) + + if "propertyGroups" in user_properties: +- putCoreSitePropertyAttribute("hadoop.proxyuser.{0}.groups".format(userOldValue), 'delete', 'true') +- services["forced-configurations"].append({"type" : "core-site", "name" : "hadoop.proxyuser.{0}.groups".format(userOldValue)}) +- services["forced-configurations"].append({"type" : "core-site", "name" : "hadoop.proxyuser.{0}.groups".format(user_name)}) ++ putCoreSitePropertyAttribute("hadoop.proxyuser.{}.groups".format(userOldValue), 'delete', 'true') ++ services["forced-configurations"].append({"type" : "core-site", "name" : "hadoop.proxyuser.{}.groups".format(userOldValue)}) ++ services["forced-configurations"].append({"type" : "core-site", "name" : "hadoop.proxyuser.{}.groups".format(user_name)}) + + self.recommendAmbariProxyUsersForHDFS(services, servicesList, putCoreSiteProperty, putCoreSitePropertyAttribute) + +@@ -337,15 +337,15 @@ + # 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 = getMountPointForDir(dataDir, mountPoints) + for i in range(len(mountPoints)): +@@ -443,7 +443,7 @@ + else: + + ranger_admin_host = ranger_admin_hosts[0] +- policymgr_external_url = "%s://%s:%s" % (protocol, ranger_admin_host, port) ++ policymgr_external_url = "{}://{}:{}".format(protocol, ranger_admin_host, port) + + putRangerAdminProperty('policymgr_external_url', policymgr_external_url) + +@@ -558,8 +558,8 @@ + total_sinks_count = 0 + # minimum heap size + hbase_heapsize = 500 +- for serviceName, componentsDict in schMemoryMap.items(): +- for componentName, multiplier in componentsDict.items(): ++ for serviceName, componentsDict in list(schMemoryMap.items()): ++ for componentName, multiplier in list(componentsDict.items()): + schCount = len( + self.getHostsWithComponent(serviceName, componentName, services, + hosts)) +@@ -971,13 +971,13 @@ + userValue = convertToNumber(configurations[configName]["properties"][propertyName]) + maxValue = convertToNumber(recommendedDefaults[configName]["property_attributes"][propertyName]["maximum"]) + if userValue > maxValue: +- validationItems.extend([{"config-name": propertyName, "item": self.getWarnItem("Value is greater than the recommended maximum of {0} ".format(maxValue))}]) ++ validationItems.extend([{"config-name": propertyName, "item": self.getWarnItem("Value is greater than the recommended maximum of {} ".format(maxValue))}]) + if "minimum" in recommendedDefaults[configName]["property_attributes"][propertyName] and \ + propertyName in recommendedDefaults[configName]["properties"]: + userValue = convertToNumber(configurations[configName]["properties"][propertyName]) + minValue = convertToNumber(recommendedDefaults[configName]["property_attributes"][propertyName]["minimum"]) + if userValue < minValue: +- validationItems.extend([{"config-name": propertyName, "item": self.getWarnItem("Value is less than the recommended minimum of {0} ".format(minValue))}]) ++ validationItems.extend([{"config-name": propertyName, "item": self.getWarnItem("Value is less than the recommended minimum of {} ".format(minValue))}]) + items.extend(self.toConfigurationValidationProblems(validationItems, configName)) + pass + +@@ -1043,7 +1043,7 @@ + if distributed.lower() == "true" and op_mode == "distributed" and \ + hbase_zk_client_port != zkPort and hbase_zk_client_port != "{{zookeeper_clientPort}}": + hbase_zk_client_port_item = self.getErrorItem("In AMS distributed mode, hbase.zookeeper.property.clientPort " +- "should be the cluster zookeeper server port : {0}".format(zkPort)) ++ "should be the cluster zookeeper server port : {}".format(zkPort)) + + if distributed.lower() == "false" and op_mode == "embedded" and \ + hbase_zk_client_port == zkPort and hbase_zk_client_port != "{{zookeeper_clientPort}}": +@@ -1095,7 +1095,7 @@ + break + # If no local DN in distributed mode + elif collectorHostName not in dn_hosts and distributed.lower() == "true": +- item = self.getWarnItem("It's recommended to install Datanode component on {0} " ++ item = self.getWarnItem("It's recommended to install Datanode component on {} " + "to speed up IO operations between HDFS and Metrics " + "Collector in distributed mode ".format(collectorHostName)) + validationItems.extend([{"config-name": "hbase.cluster.distributed", "item": item}]) +@@ -1154,34 +1154,34 @@ + minMasterXmn = 0.12 * hbase_master_heapsize + maxMasterXmn = 0.2 * hbase_master_heapsize + if hbase_master_xmn_size < minMasterXmn: +- masterXmnItem = self.getWarnItem("Value is lesser than the recommended minimum Xmn size of {0} " ++ masterXmnItem = self.getWarnItem("Value is lesser than the recommended minimum Xmn size of {} " + "(12% of hbase_master_heapsize)".format(int(ceil(minMasterXmn)))) + + if hbase_master_xmn_size > maxMasterXmn: +- masterXmnItem = self.getWarnItem("Value is greater than the recommended maximum Xmn size of {0} " ++ masterXmnItem = self.getWarnItem("Value is greater than the recommended maximum Xmn size of {} " + "(20% of hbase_master_heapsize)".format(int(floor(maxMasterXmn)))) + + minRegionServerXmn = 0.12 * hbase_regionserver_heapsize + maxRegionServerXmn = 0.2 * hbase_regionserver_heapsize + if hbase_regionserver_xmn_size < minRegionServerXmn: +- regionServerXmnItem = self.getWarnItem("Value is lesser than the recommended minimum Xmn size of {0} " ++ regionServerXmnItem = self.getWarnItem("Value is lesser than the recommended minimum Xmn size of {} " + "(12% of hbase_regionserver_heapsize)" + .format(int(ceil(minRegionServerXmn)))) + + if hbase_regionserver_xmn_size > maxRegionServerXmn: +- regionServerXmnItem = self.getWarnItem("Value is greater than the recommended maximum Xmn size of {0} " ++ regionServerXmnItem = self.getWarnItem("Value is greater than the recommended maximum Xmn size of {} " + "(20% of hbase_regionserver_heapsize)" + .format(int(floor(maxRegionServerXmn)))) + else: + minMasterXmn = 0.12 * (hbase_master_heapsize + hbase_regionserver_heapsize) + maxMasterXmn = 0.2 * (hbase_master_heapsize + hbase_regionserver_heapsize) + if hbase_master_xmn_size < minMasterXmn: +- masterXmnItem = self.getWarnItem("Value is lesser than the recommended minimum Xmn size of {0} " ++ masterXmnItem = self.getWarnItem("Value is lesser than the recommended minimum Xmn size of {} " + "(12% of hbase_master_heapsize + hbase_regionserver_heapsize)" + .format(int(ceil(minMasterXmn)))) + + if hbase_master_xmn_size > maxMasterXmn: +- masterXmnItem = self.getWarnItem("Value is greater than the recommended maximum Xmn size of {0} " ++ masterXmnItem = self.getWarnItem("Value is greater than the recommended maximum Xmn size of {} " + "(20% of hbase_master_heapsize + hbase_regionserver_heapsize)" + .format(int(floor(maxMasterXmn)))) + if masterXmnItem: +@@ -1198,7 +1198,7 @@ + if component["StackServiceComponents"]["hostnames"] is not None: + for hostName in component["StackServiceComponents"]["hostnames"]: + if self.isMasterComponent(component): +- if hostName not in hostMasterComponents.keys(): ++ if hostName not in list(hostMasterComponents.keys()): + hostMasterComponents[hostName] = [] + hostMasterComponents[hostName].append(component["StackServiceComponents"]["component_name"]) + +@@ -1240,10 +1240,10 @@ + + if collector_heapsize < recommended_collector_heapsize or \ + to_number(properties[heapPropertyToIncrease]) < recommended_hbase_heapsize: +- collectorHeapsizeItem = self.getWarnItem("{0} MB RAM is unused on the host {1} based on components " \ +- "assigned. Consider allocating {2} MB to " \ ++ collectorHeapsizeItem = self.getWarnItem("{} MB RAM is unused on the host {} based on components " \ ++ "assigned. Consider allocating {} MB to " \ + "metrics_collector_heapsize in ams-env, " \ +- "{3} MB to {4} in ams-hbase-env" ++ "{} MB to {} in ams-hbase-env" + .format(unusedMemory/mb, collectorHostName, + recommended_collector_heapsize/mb, + recommended_hbase_heapsize/mb, +@@ -1251,7 +1251,7 @@ + validationItems.extend([{"config-name": heapPropertyToIncrease, "item": collectorHeapsizeItem}]) + + if to_number(properties[xmnPropertyToIncrease]) < recommended_hbase_heapsize: +- xmnPropertyToIncreaseItem = self.getWarnItem("Consider allocating {0} MB to use up some unused memory " ++ xmnPropertyToIncreaseItem = self.getWarnItem("Consider allocating {} MB to use up some unused memory " + "on host".format(recommended_xmn_size)) + validationItems.extend([{"config-name": xmnPropertyToIncrease, "item": xmnPropertyToIncreaseItem}]) + pass +@@ -1293,7 +1293,7 @@ + mountPoint = getMountPointForDir(dir, mountPoints) + + if "/" == mountPoint and self.getPreferredMountPoints(hostInfo)[0] != mountPoint: +- return self.getWarnItem("It is not recommended to use root partition for {0}".format(propertyName)) ++ return self.getWarnItem("It is not recommended to use root partition for {}".format(propertyName)) + + return None + +@@ -1308,13 +1308,13 @@ + mountPoints = {} + for mountPoint in hostInfo["disk_info"]: + mountPoints[mountPoint["mountpoint"]] = to_number(mountPoint["available"]) +- mountPoint = getMountPointForDir(dir, mountPoints.keys()) ++ mountPoint = 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 {}. Mount points: {}".format(dir, ', '.join(list(mountPoints.keys())))) + + if mountPoints[mountPoint] < reqiuredDiskSpace: + msg = "Ambari Metrics disk space requirements not met. \n" \ +@@ -1337,7 +1337,7 @@ + if defaultValue is None: + return None + if value < defaultValue: +- return self.getWarnItem("Value is less than the recommended default of {0}".format(defaultValue)) ++ return self.getWarnItem("Value is less than the recommended default of {}".format(defaultValue)) + return None + + def validatorEqualsPropertyItem(self, properties1, propertyName1, +@@ -1355,7 +1355,7 @@ + return self.getErrorItem("Empty value for %s" % propertyName2) + if value1 != value2: + return self.getWarnItem("It is recommended to set equal values " +- "for properties {0} and {1}".format(propertyName1, propertyName2)) ++ "for properties {} and {}".format(propertyName1, propertyName2)) + + return None + +@@ -1368,8 +1368,8 @@ + return self.getErrorItem("Value should be recommended for %s" % propertyName) + recommendedValue = recommendedDefaults.get(propertyName) + if value != recommendedValue: +- return self.getWarnItem("It is recommended to set value {0} " +- "for property {1}".format(recommendedValue, propertyName)) ++ return self.getWarnItem("It is recommended to set value {} " ++ "for property {}".format(recommendedValue, propertyName)) + return None + + def validateMinMemorySetting(self, properties, defaultValue, propertyName): +@@ -1512,7 +1512,7 @@ + break; + + if len(warnings) > 0: +- return self.getWarnItem("cluster-env/one_dir_per_partition is enabled but there are multiple data directories on the same mount. Affected hosts: {0}".format(", ".join(sorted(warnings)))) ++ return self.getWarnItem("cluster-env/one_dir_per_partition is enabled but there are multiple data directories on the same mount. Affected hosts: {}".format(", ".join(sorted(warnings)))) + + return None + +@@ -1566,12 +1566,12 @@ + uid = None + + if os.path.exists(login_defs): +- with open(login_defs, 'r') as f: ++ with open(login_defs) 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] +@@ -1593,7 +1593,7 @@ + return uid_min + + def mergeValidators(self, parentValidators, childValidators): +- for service, configsDict in childValidators.iteritems(): ++ for service, configsDict in childValidators.items(): + if service not in parentValidators: + parentValidators[service] = {} + parentValidators[service].update(configsDict) +@@ -1630,7 +1630,7 @@ + capacity_scheduler_properties[key] = value + self.logger.info("'capacity-scheduler' configs is passed-in as a single '\\n' separated string. " + "count(services['configurations']['capacity-scheduler']['properties']['capacity-scheduler']) = " +- "{0}".format(len(capacity_scheduler_properties))) ++ "{}".format(len(capacity_scheduler_properties))) + received_as_key_value_pair = False + else: + self.logger.info("Passed-in services['configurations']['capacity-scheduler']['properties']['capacity-scheduler'] is 'null'.") +@@ -1641,19 +1641,19 @@ + # Received configs as a dictionary (Generally on 1st invocation). + capacity_scheduler_properties = services['configurations']["capacity-scheduler"]["properties"] + self.logger.info("'capacity-scheduler' configs is passed-in as a dictionary. " +- "count(services['configurations']['capacity-scheduler']['properties']) = {0}".format(len(capacity_scheduler_properties))) ++ "count(services['configurations']['capacity-scheduler']['properties']) = {}".format(len(capacity_scheduler_properties))) + else: + self.logger.error("Couldn't retrieve 'capacity-scheduler' from services.") + +- self.logger.info("Retrieved 'capacity-scheduler' received as dictionary : '{0}'. configs : {1}" \ +- .format(received_as_key_value_pair, capacity_scheduler_properties.items())) ++ self.logger.info("Retrieved 'capacity-scheduler' received as dictionary : '{}'. configs : {}" \ ++ .format(received_as_key_value_pair, list(capacity_scheduler_properties.items()))) + return capacity_scheduler_properties, received_as_key_value_pair + + """ + Gets all YARN leaf queues. + """ + def getAllYarnLeafQueues(self, capacitySchedulerProperties): +- config_list = capacitySchedulerProperties.keys() ++ config_list = list(capacitySchedulerProperties.keys()) + yarn_queues = None + leafQueueNames = set() + if 'yarn.scheduler.capacity.root.queues' in config_list: +@@ -1776,7 +1776,7 @@ + + def getOldValue(self, services, configType, propertyName): + if services: +- if 'changed-configurations' in services.keys(): ++ if 'changed-configurations' in list(services.keys()): + changedConfigs = services["changed-configurations"] + for changedConfig in changedConfigs: + if changedConfig["type"] == configType and changedConfig["name"]== propertyName and "old_value" in changedConfig: +@@ -1801,17 +1801,17 @@ + + def to_number(s): + try: +- return int(re.sub("\D", "", s)) ++ return int(re.sub(r"\D", "", s)) + except ValueError: + return None + + def checkXmxValueFormat(value): +- p = re.compile('-Xmx(\d+)(b|k|m|g|p|t|B|K|M|G|P|T)?') ++ p = re.compile(r'-Xmx(\d+)(b|k|m|g|p|t|B|K|M|G|P|T)?') + matches = p.findall(value) + return len(matches) == 1 + + def getXmxSize(value): +- p = re.compile("-Xmx(\d+)(.?)") ++ p = re.compile(r"-Xmx(\d+)(.?)") + result = p.findall(value)[0] + if len(result) > 1: + # result[1] - is a space or size formatter (b|k|m|g etc) +@@ -1933,7 +1933,7 @@ + def getMemorySizeRequired(components, configurations): + totalMemoryRequired = 512*1024*1024 # 512Mb for OS needs + for component in components: +- if component in getHeapsizeProperties().keys(): ++ if component in list(getHeapsizeProperties().keys()): + heapSizeProperties = getHeapsizeProperties()[component] + for heapSizeProperty in heapSizeProperties: + try: +diff -Naur ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/YARN/package/alerts/alert_nodemanager_health.py apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/YARN/package/alerts/alert_nodemanager_health.py +--- ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/YARN/package/alerts/alert_nodemanager_health.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/YARN/package/alerts/alert_nodemanager_health.py 2022-07-11 00:52:29.000000000 +0800 +@@ -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 +@@ -142,15 +142,15 @@ + if host_port is not None: + if ":" in host_port: + uri_host, uri_port = host_port.split(':') +- host_port = '{0}:{1}'.format(host_name, uri_port) ++ host_port = '{}:{}'.format(host_name, uri_port) + else: + host_port = host_name + + # some yarn-site structures don't have the web ui address + if host_port is None: +- host_port = '{0}:{1}'.format(host_name, NODEMANAGER_DEFAULT_PORT) ++ host_port = '{}:{}'.format(host_name, NODEMANAGER_DEFAULT_PORT) + +- query = "{0}://{1}/ws/v1/node/info".format(scheme, host_port) ++ query = "{}://{}/ws/v1/node/info".format(scheme, host_port) + + try: + if kerberos_principal is not None and kerberos_keytab is not None and security_enabled: +@@ -168,9 +168,9 @@ + 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 -Naur ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/YARN/package/alerts/alert_nodemanagers_summary.py apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/YARN/package/alerts/alert_nodemanagers_summary.py +--- ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/YARN/package/alerts/alert_nodemanagers_summary.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/YARN/package/alerts/alert_nodemanagers_summary.py 2022-07-11 00:52:29.000000000 +0800 +@@ -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 +@@ -122,7 +122,7 @@ + uri = https_uri + + uri = str(host_name) + ":" + uri.split(":")[1] +- live_nodemanagers_qry = "{0}://{1}/jmx?qry={2}".format(scheme, uri, QRY) ++ live_nodemanagers_qry = "{}://{}/jmx?qry={}".format(scheme, uri, QRY) + convert_to_json_failed = False + response_code = None + try: +@@ -140,7 +140,7 @@ + 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))) +@@ -156,9 +156,9 @@ + + if kerberos_principal is not None and kerberos_keytab is not None and security_enabled: + if response_code in [200, 307] and convert_to_json_failed: +- return ('UNKNOWN', ['HTTP {0} response (metrics unavailable)'.format(str(response_code))]) ++ return ('UNKNOWN', ['HTTP {} response (metrics unavailable)'.format(str(response_code))]) + elif convert_to_json_failed and response_code not in [200, 307]: +- raise Exception("[Alert][NodeManager Health Summary] Getting data from {0} failed with http code {1}".format( ++ raise Exception("[Alert][NodeManager Health Summary] Getting data from {} failed with http code {}".format( + str(live_nodemanagers_qry), str(response_code))) + + unhealthy_count = 0 +@@ -191,7 +191,7 @@ + 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() +@@ -213,7 +213,7 @@ + for jmx_prop_list_item in beans: + if "name" in jmx_prop_list_item and jmx_prop_list_item["name"] == QRY: + if jmx_property not in jmx_prop_list_item: +- raise Exception("Unable to find {0} in JSON from {1} ".format(jmx_property, query)) ++ raise Exception("Unable to find {} in JSON from {} ".format(jmx_property, query)) + json_data = jmx_prop_list_item + + return json_data[jmx_property] +\ 文件尾没有换行符 +diff -Naur ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/YARN/package/files/validateYarnComponentStatusWindows.py apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/YARN/package/files/validateYarnComponentStatusWindows.py +--- ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/YARN/package/files/validateYarnComponentStatusWindows.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/YARN/package/files/validateYarnComponentStatusWindows.py 2022-07-11 00:52:29.000000000 +0800 +@@ -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 optparse + 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 @@ + 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 @@ + 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 @@ + 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 @@ + 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 @@ + 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 @@ + 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 -Naur ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/YARN/package/scripts/application_timeline_server.py apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/YARN/package/scripts/application_timeline_server.py +--- ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/YARN/package/scripts/application_timeline_server.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/YARN/package/scripts/application_timeline_server.py 2022-07-11 00:52:29.000000000 +0800 +@@ -28,8 +28,8 @@ + cached_kinit_executor, get_params_from_filesystem, validate_security_config_properties,\ + FILE_TYPE_XML + from resource_management.libraries.functions.format import format +-from yarn import yarn +-from service import service ++from .yarn import yarn ++from .service import service + from ambari_commons import OSConst + from ambari_commons.os_family_impl import OsFamilyImpl + +@@ -39,18 +39,18 @@ + self.install_packages(env) + + def start(self, env, upgrade_type=None): +- import params ++ from . import params + env.set_params(params) + self.configure(env) # FOR SECURITY + service('timelineserver', action='start') + + def stop(self, env, upgrade_type=None): +- import params ++ from . import params + env.set_params(params) + service('timelineserver', action='stop') + + def configure(self, env): +- import params ++ from . import params + env.set_params(params) + yarn(name='apptimelineserver') + +@@ -68,21 +68,21 @@ + + def pre_upgrade_restart(self, env, upgrade_type=None): + Logger.info("Executing Stack Upgrade pre-restart") +- import params ++ from . import params + env.set_params(params) + + if params.version and check_stack_feature(StackFeature.ROLLING_UPGRADE, params.version): + stack_select.select("hadoop-yarn-timelineserver", params.version) + + def status(self, env): +- import status_params ++ from . import status_params + env.set_params(status_params) + Execute(format("mv {yarn_historyserver_pid_file_old} {yarn_historyserver_pid_file}"), + only_if = format("test -e {yarn_historyserver_pid_file_old}", user=status_params.yarn_user)) + functions.check_process_status(status_params.yarn_historyserver_pid_file) + + def security_status(self, env): +- import status_params ++ from . import status_params + env.set_params(status_params) + if status_params.security_enabled: + props_value_check = {"yarn.timeline-service.enabled": "true", +@@ -136,18 +136,18 @@ + else: + issues = [] + for cf in result_issues: +- issues.append("Configuration file %s did not pass the validation. Reason: %s" % (cf, result_issues[cf])) ++ issues.append("Configuration file {} did not pass the validation. Reason: {}".format(cf, result_issues[cf])) + self.put_structured_out({"securityIssuesFound": ". ".join(issues)}) + self.put_structured_out({"securityState": "UNSECURED"}) + else: + self.put_structured_out({"securityState": "UNSECURED"}) + + def get_log_folder(self): +- import params ++ from . import params + return params.yarn_log_dir + + def get_user(self): +- import params ++ from . import params + return params.yarn_user + + if __name__ == "__main__": +diff -Naur ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/YARN/package/scripts/historyserver.py apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/YARN/package/scripts/historyserver.py +--- ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/YARN/package/scripts/historyserver.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/YARN/package/scripts/historyserver.py 2022-07-11 00:52:29.000000000 +0800 +@@ -34,9 +34,9 @@ + from resource_management.core.source import Template + from resource_management.core.logger import Logger + +-from install_jars import install_tez_jars +-from yarn import yarn +-from service import service ++from .install_jars import install_tez_jars ++from .yarn import yarn ++from .service import service + from ambari_commons import OSConst + from ambari_commons.os_family_impl import OsFamilyImpl + +@@ -46,12 +46,12 @@ + self.install_packages(env) + + def stop(self, env, upgrade_type=None): +- import params ++ from . import params + env.set_params(params) + service('historyserver', action='stop', serviceName='mapreduce') + + def configure(self, env): +- import params ++ from . import params + env.set_params(params) + yarn(name="historyserver") + +@@ -59,7 +59,7 @@ + @OsFamilyImpl(os_family=OSConst.WINSRV_FAMILY) + class HistoryserverWindows(HistoryServer): + def start(self, env): +- import params ++ from . import params + env.set_params(params) + self.configure(env) + service('historyserver', action='start', serviceName='mapreduce') +@@ -75,7 +75,7 @@ + + def pre_upgrade_restart(self, env, upgrade_type=None): + Logger.info("Executing Stack Upgrade pre-restart") +- import params ++ from . import params + env.set_params(params) + + if params.version and check_stack_feature(StackFeature.ROLLING_UPGRADE, params.version): +@@ -87,7 +87,7 @@ + params.HdfsResource(None, action="execute") + + def start(self, env, upgrade_type=None): +- import params ++ from . import params + env.set_params(params) + self.configure(env) # FOR SECURITY + +@@ -117,12 +117,12 @@ + service('historyserver', action='start', serviceName='mapreduce') + + def status(self, env): +- import status_params ++ from . import status_params + env.set_params(status_params) + check_process_status(status_params.mapred_historyserver_pid_file) + + def security_status(self, env): +- import status_params ++ from . import status_params + env.set_params(status_params) + if status_params.security_enabled: + expectations = {} +@@ -171,18 +171,18 @@ + else: + issues = [] + for cf in result_issues: +- issues.append("Configuration file %s did not pass the validation. Reason: %s" % (cf, result_issues[cf])) ++ issues.append("Configuration file {} did not pass the validation. Reason: {}".format(cf, result_issues[cf])) + self.put_structured_out({"securityIssuesFound": ". ".join(issues)}) + self.put_structured_out({"securityState": "UNSECURED"}) + else: + self.put_structured_out({"securityState": "UNSECURED"}) + + def get_log_folder(self): +- import params ++ from . import params + return params.mapred_log_dir + + def get_user(self): +- import params ++ from . import params + return params.mapred_user + + if __name__ == "__main__": +diff -Naur ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/YARN/package/scripts/install_jars.py apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/YARN/package/scripts/install_jars.py +--- ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/YARN/package/scripts/install_jars.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/YARN/package/scripts/install_jars.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + import glob + + def install_tez_jars(): +- import params ++ from . import params + + destination_hdfs_dirs = get_tez_hdfs_dir_paths(params.tez_lib_uris) + +@@ -34,7 +34,7 @@ + type="directory", + action="create_on_execute", + owner=params.tez_user, +- mode=0755 ++ mode=0o755 + ) + + app_dir_path = None +@@ -56,25 +56,25 @@ + 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 -Naur ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/YARN/package/scripts/mapred_service_check.py apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/YARN/package/scripts/mapred_service_check.py +--- ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/YARN/package/scripts/mapred_service_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/YARN/package/scripts/mapred_service_check.py 2022-07-11 00:52:29.000000000 +0800 +@@ -34,7 +34,7 @@ + @OsFamilyImpl(os_family=OSConst.WINSRV_FAMILY) + class MapReduce2ServiceCheckWindows(MapReduce2ServiceCheck): + def service_check(self, env): +- import params ++ from . import params + + env.set_params(params) + +@@ -47,11 +47,11 @@ + validateStatusFileName = "validateYarnComponentStatusWindows.py" + validateStatusFilePath = os.path.join(os.path.dirname(params.hadoop_home), "temp", validateStatusFileName) + python_executable = sys.executable +- validateStatusCmd = "{0} {1} {2} -p {3} -s {4}".format( ++ validateStatusCmd = "{} {} {} -p {} -s {}".format( + python_executable, validateStatusFilePath, component_type, component_address, params.hadoop_ssl_enabled) + + if params.security_enabled: +- kinit_cmd = "{0} -kt {1} {2};".format(params.kinit_path_local, params.smoke_user_keytab, params.smokeuser) ++ kinit_cmd = "{} -kt {} {};".format(params.kinit_path_local, params.smoke_user_keytab, params.smokeuser) + smoke_cmd = kinit_cmd + validateStatusCmd + else: + smoke_cmd = validateStatusCmd +@@ -111,7 +111,7 @@ + @OsFamilyImpl(os_family=OsFamilyImpl.DEFAULT) + class MapReduce2ServiceCheckDefault(MapReduce2ServiceCheck): + def service_check(self, env): +- import params ++ from . import params + env.set_params(params) + + jar_path = format("{hadoop_mapred2_jar_location}/{hadoopMapredExamplesJarName}") +diff -Naur ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/YARN/package/scripts/mapreduce2_client.py apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/YARN/package/scripts/mapreduce2_client.py +--- ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/YARN/package/scripts/mapreduce2_client.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/YARN/package/scripts/mapreduce2_client.py 2022-07-11 00:52:29.000000000 +0800 +@@ -28,7 +28,7 @@ + from resource_management.libraries.functions.constants import StackFeature + from resource_management.libraries.functions.stack_features import check_stack_feature + from resource_management.core.exceptions import ClientComponentHasNoStatus +-from yarn import yarn ++from .yarn import yarn + from ambari_commons import OSConst + from ambari_commons.os_family_impl import OsFamilyImpl + from resource_management.core.logger import Logger +@@ -36,7 +36,7 @@ + + class MapReduce2Client(Script): + def install(self, env): +- import params ++ from . import params + self.install_packages(env) + self.configure(env) + +@@ -45,7 +45,7 @@ + :param env: Python environment + :param config_dir: During rolling upgrade, which config directory to save configs to. + """ +- import params ++ from . import params + env.set_params(params) + yarn(config_dir=config_dir) + +@@ -58,7 +58,7 @@ + careful to only call configure() on the directory of the new version. + :param env: + """ +- import params ++ from . import params + env.set_params(params) + + conf_select_name = "hadoop" +@@ -66,7 +66,7 @@ + config_dir = self.get_config_dir_during_stack_upgrade(env, base_dir, conf_select_name) + + if config_dir: +- Logger.info("stack_upgrade_save_new_config(): Calling conf-select on %s using version %s" % (conf_select_name, str(params.version))) ++ Logger.info("stack_upgrade_save_new_config(): Calling conf-select on {} using version {}".format(conf_select_name, str(params.version))) + + # Because this script was called from ru_execute_tasks.py which already enters an Environment with its own basedir, + # must change it now so this function can find the Jinja Templates for the service. +@@ -85,7 +85,7 @@ + return "hadoop-client" + + def pre_upgrade_restart(self, env, upgrade_type=None): +- import params ++ from . import params + env.set_params(params) + + if params.version and check_stack_feature(StackFeature.ROLLING_UPGRADE, params.version): +diff -Naur ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/YARN/package/scripts/nodemanager.py apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/YARN/package/scripts/nodemanager.py +--- ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/YARN/package/scripts/nodemanager.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/YARN/package/scripts/nodemanager.py 2022-07-11 00:52:29.000000000 +0800 +@@ -19,7 +19,7 @@ + + """ + +-import nodemanager_upgrade ++from . import nodemanager_upgrade + + from resource_management import * + from resource_management.libraries.functions import conf_select +@@ -30,8 +30,8 @@ + from resource_management.libraries.functions.security_commons import build_expectations, \ + cached_kinit_executor, get_params_from_filesystem, validate_security_config_properties, \ + FILE_TYPE_XML +-from yarn import yarn +-from service import service ++from .yarn import yarn ++from .service import service + from ambari_commons import OSConst + from ambari_commons.os_family_impl import OsFamilyImpl + +@@ -41,18 +41,18 @@ + self.install_packages(env) + + def stop(self, env, upgrade_type=None): +- import params ++ from . import params + env.set_params(params) + service('nodemanager',action='stop') + + def start(self, env, upgrade_type=None): +- import params ++ from . import params + env.set_params(params) + self.configure(env) # FOR SECURITY + service('nodemanager',action='start') + + def configure(self, env): +- import params ++ from . import params + env.set_params(params) + yarn(name="nodemanager") + +@@ -70,7 +70,7 @@ + + def pre_upgrade_restart(self, env, upgrade_type=None): + Logger.info("Executing NodeManager Stack Upgrade pre-restart") +- import params ++ from . import params + env.set_params(params) + + if params.version and check_stack_feature(StackFeature.ROLLING_UPGRADE, params.version): +@@ -78,18 +78,18 @@ + + def post_upgrade_restart(self, env, upgrade_type=None): + Logger.info("Executing NodeManager Stack Upgrade post-restart") +- import params ++ from . import params + env.set_params(params) + + nodemanager_upgrade.post_upgrade_check() + + def status(self, env): +- import status_params ++ from . import status_params + env.set_params(status_params) + check_process_status(status_params.nodemanager_pid_file) + + def security_status(self, env): +- import status_params ++ from . import status_params + env.set_params(status_params) + if status_params.security_enabled: + props_value_check = {"yarn.timeline-service.http-authentication.type": "kerberos", +@@ -142,18 +142,18 @@ + else: + issues = [] + for cf in result_issues: +- issues.append("Configuration file %s did not pass the validation. Reason: %s" % (cf, result_issues[cf])) ++ issues.append("Configuration file {} did not pass the validation. Reason: {}".format(cf, result_issues[cf])) + self.put_structured_out({"securityIssuesFound": ". ".join(issues)}) + self.put_structured_out({"securityState": "UNSECURED"}) + else: + self.put_structured_out({"securityState": "UNSECURED"}) + + def get_log_folder(self): +- import params ++ from . import params + return params.yarn_log_dir + + def get_user(self): +- import params ++ from . import params + return params.yarn_user + + if __name__ == "__main__": +diff -Naur ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/YARN/package/scripts/nodemanager_upgrade.py apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/YARN/package/scripts/nodemanager_upgrade.py +--- ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/YARN/package/scripts/nodemanager_upgrade.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/YARN/package/scripts/nodemanager_upgrade.py 2022-07-11 00:52:29.000000000 +0800 +@@ -33,7 +33,7 @@ + This function will obtain the Kerberos ticket if security is enabled. + :return: + ''' +- import params ++ from . import params + + Logger.info('NodeManager executing "yarn node -list -states=RUNNING" to verify the node has rejoined the cluster...') + if params.security_enabled and params.nodemanager_kinit_cmd: +@@ -55,7 +55,7 @@ + automatically. + :return: + ''' +- import params ++ from . import params + import socket + + command = 'yarn node -list -states=RUNNING' +@@ -67,7 +67,7 @@ + yarn_output = yarn_output.lower() + + if hostname in yarn_output or nodemanager_address in yarn_output or hostname_ip in yarn_output: +- Logger.info('NodeManager with ID \'{0}\' has rejoined the cluster.'.format(nodemanager_address)) ++ Logger.info('NodeManager with ID \'{}\' has rejoined the cluster.'.format(nodemanager_address)) + return + else: +- raise Fail('NodeManager with ID \'{0}\' was not found in the list of running NodeManagers. \'{1}\' output was:\n{2}'.format(nodemanager_address, command, yarn_output)) ++ raise Fail('NodeManager with ID \'{}\' was not found in the list of running NodeManagers. \'{}\' output was:\n{}'.format(nodemanager_address, command, yarn_output)) +diff -Naur ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/YARN/package/scripts/params_linux.py apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/YARN/package/scripts/params_linux.py +--- ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/YARN/package/scripts/params_linux.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/YARN/package/scripts/params_linux.py 2022-07-11 00:52:29.000000000 +0800 +@@ -35,7 +35,7 @@ + from resource_management.libraries import functions + from resource_management.libraries.functions import is_empty + +-import status_params ++from . import status_params + + # a map of the Ambari role to the component name + # for use with /current/ +@@ -120,9 +120,9 @@ + + # 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") + +@@ -144,7 +144,7 @@ + + 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') +@@ -155,7 +155,7 @@ + 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') +@@ -387,7 +387,7 @@ + xa_audit_db_user = default('/configurations/admin-properties/audit_db_user', 'rangerlogger') + xa_audit_db_password = '' + if not is_empty(config['configurations']['admin-properties']['audit_db_password']) and stack_supports_ranger_audit_db: +- xa_audit_db_password = unicode(config['configurations']['admin-properties']['audit_db_password']) ++ xa_audit_db_password = str(config['configurations']['admin-properties']['audit_db_password']) + xa_db_host = config['configurations']['admin-properties']['db_host'] + repo_name = str(config['clusterName']) + '_yarn' + +@@ -398,7 +398,7 @@ + + 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'] + } +@@ -466,8 +466,8 @@ + if xml_configurations_supported and stack_supports_ranger_audit_db: + xa_audit_db_is_enabled = config['configurations']['ranger-yarn-audit']['xasecure.audit.destination.db'] + xa_audit_hdfs_is_enabled = config['configurations']['ranger-yarn-audit']['xasecure.audit.destination.hdfs'] if xml_configurations_supported else None +- ssl_keystore_password = unicode(config['configurations']['ranger-yarn-policymgr-ssl']['xasecure.policymgr.clientssl.keystore.password']) if xml_configurations_supported else None +- ssl_truststore_password = unicode(config['configurations']['ranger-yarn-policymgr-ssl']['xasecure.policymgr.clientssl.truststore.password']) if xml_configurations_supported else None ++ ssl_keystore_password = str(config['configurations']['ranger-yarn-policymgr-ssl']['xasecure.policymgr.clientssl.keystore.password']) if xml_configurations_supported else None ++ ssl_truststore_password = str(config['configurations']['ranger-yarn-policymgr-ssl']['xasecure.policymgr.clientssl.truststore.password']) if xml_configurations_supported else None + credential_file = format('/etc/ranger/{repo_name}/cred.jceks') if xml_configurations_supported else None + + #For SQLA explicitly disable audit to DB for Ranger +diff -Naur ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/YARN/package/scripts/params.py apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/YARN/package/scripts/params.py +--- ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/YARN/package/scripts/params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/YARN/package/scripts/params.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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,9 +23,9 @@ + from resource_management.libraries.functions.default import default + + if OSCheck.is_windows_family(): +- from params_windows import * ++ from .params_windows import * + else: +- from params_linux import * ++ from .params_linux import * + + host_sys_prepped = default("/hostLevelParams/host_sys_prepped", False) + retryAble = default("/commandParams/command_retry_enabled", False) +diff -Naur ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/YARN/package/scripts/params_windows.py apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/YARN/package/scripts/params_windows.py +--- ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/YARN/package/scripts/params_windows.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/YARN/package/scripts/params_windows.py 2022-07-11 00:52:29.000000000 +0800 +@@ -22,7 +22,7 @@ + from resource_management import * + from resource_management.libraries import functions + import os +-from status_params import * ++from .status_params import * + + # server configurations + config = Script.get_config() +diff -Naur ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/YARN/package/scripts/resourcemanager.py apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/YARN/package/scripts/resourcemanager.py +--- ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/YARN/package/scripts/resourcemanager.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/YARN/package/scripts/resourcemanager.py 2022-07-11 00:52:29.000000000 +0800 +@@ -40,11 +40,11 @@ + from resource_management import shell + + +-from yarn import yarn +-from service import service ++from .yarn import yarn ++from .service import service + from ambari_commons import OSConst + from ambari_commons.os_family_impl import OsFamilyImpl +-from setup_ranger_yarn import setup_ranger_yarn ++from .setup_ranger_yarn import setup_ranger_yarn + + + class Resourcemanager(Script): +@@ -52,12 +52,12 @@ + self.install_packages(env) + + def stop(self, env, upgrade_type=None): +- import params ++ from . import params + env.set_params(params) + service('resourcemanager', action='stop') + + def configure(self, env): +- import params ++ from . import params + env.set_params(params) + yarn(name='resourcemanager') + +@@ -69,7 +69,7 @@ + @OsFamilyImpl(os_family=OSConst.WINSRV_FAMILY) + class ResourcemanagerWindows(Resourcemanager): + def start(self, env): +- import params ++ from . import params + env.set_params(params) + self.configure(env) + service('resourcemanager', action='start') +@@ -78,7 +78,7 @@ + service('resourcemanager', action='status') + + def decommission(self, env): +- import params ++ from . import params + + env.set_params(params) + yarn_user = params.yarn_user +@@ -110,14 +110,14 @@ + + def pre_upgrade_restart(self, env, upgrade_type=None): + Logger.info("Executing Stack Upgrade post-restart") +- import params ++ from . import params + env.set_params(params) + + if params.version and check_stack_feature(StackFeature.ROLLING_UPGRADE, params.version): + stack_select.select("hadoop-yarn-resourcemanager", params.version) + + def start(self, env, upgrade_type=None): +- import params ++ from . import params + + env.set_params(params) + self.configure(env) # FOR SECURITY +@@ -132,14 +132,14 @@ + service('resourcemanager', action='start') + + def status(self, env): +- import status_params ++ from . import status_params + + env.set_params(status_params) + check_process_status(status_params.resourcemanager_pid_file) + pass + + def security_status(self, env): +- import status_params ++ from . import status_params + env.set_params(status_params) + if status_params.security_enabled: + props_value_check = {"yarn.timeline-service.http-authentication.type": "kerberos", +@@ -192,14 +192,14 @@ + else: + issues = [] + for cf in result_issues: +- issues.append("Configuration file %s did not pass the validation. Reason: %s" % (cf, result_issues[cf])) ++ issues.append("Configuration file {} did not pass the validation. Reason: {}".format(cf, result_issues[cf])) + self.put_structured_out({"securityIssuesFound": ". ".join(issues)}) + self.put_structured_out({"securityState": "UNSECURED"}) + else: + self.put_structured_out({"securityState": "UNSECURED"}) + + def refreshqueues(self, env): +- import params ++ from . import params + + self.configure(env) + env.set_params(params) +@@ -209,7 +209,7 @@ + ) + + def decommission(self, env): +- import params ++ from . import params + + env.set_params(params) + rm_kinit_cmd = params.rm_kinit_cmd +@@ -243,7 +243,7 @@ + + + def wait_for_dfs_directories_created(self, *dirs): +- import params ++ from . import params + + ignored_dfs_dirs = HdfsResourceProvider.get_ignored_resources_list(params.hdfs_resource_ignore_file) + +@@ -261,7 +261,7 @@ + + @retry(times=8, sleep_time=20, backoff_factor=1, err_class=Fail) + def wait_for_dfs_directory_created(self, dir_path, ignored_dfs_dirs): +- import params ++ from . import params + + + if not is_empty(dir_path): +@@ -291,11 +291,11 @@ + Logger.info("DFS directory '" + dir_path + "' exists.") + + def get_log_folder(self): +- import params ++ from . import params + return params.yarn_log_dir + + def get_user(self): +- import params ++ from . import params + return params.yarn_user + + if __name__ == "__main__": +diff -Naur ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/YARN/package/scripts/service_check.py apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/YARN/package/scripts/service_check.py +--- ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/YARN/package/scripts/service_check.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/YARN/package/scripts/service_check.py 2022-07-11 00:52:29.000000000 +0800 +@@ -43,7 +43,7 @@ + @OsFamilyImpl(os_family=OSConst.WINSRV_FAMILY) + class ServiceCheckWindows(ServiceCheck): + def service_check(self, env): +- import params ++ from . import params + env.set_params(params) + + yarn_exe = os_utils.quote_path(os.path.join(params.yarn_home, "bin", "yarn.cmd")) +@@ -61,10 +61,10 @@ + validateStatusFileName = "validateYarnComponentStatusWindows.py" + validateStatusFilePath = os.path.join(temp_dir, validateStatusFileName) + python_executable = sys.executable +- validateStatusCmd = "%s %s %s -p %s -s %s" % (python_executable, validateStatusFilePath, component_type, component_address, params.hadoop_ssl_enabled) ++ validateStatusCmd = "{} {} {} -p {} -s {}".format(python_executable, validateStatusFilePath, component_type, component_address, params.hadoop_ssl_enabled) + + if params.security_enabled: +- kinit_cmd = "%s -kt %s %s;" % (params.kinit_path_local, params.smoke_user_keytab, params.smokeuser) ++ kinit_cmd = "{} -kt {} {};".format(params.kinit_path_local, params.smoke_user_keytab, params.smokeuser) + smoke_cmd = kinit_cmd + ' ' + validateStatusCmd + else: + smoke_cmd = validateStatusCmd +@@ -85,7 +85,7 @@ + @OsFamilyImpl(os_family=OsFamilyImpl.DEFAULT) + class ServiceCheckDefault(ServiceCheck): + def service_check(self, env): +- import params ++ from . import params + env.set_params(params) + + params.HdfsResource(format("/user/{smokeuser}"), +@@ -117,7 +117,7 @@ + user=params.smokeuser, + ) + +- m = re.search("appTrackingUrl=(.*),\s", out) ++ m = re.search(r"appTrackingUrl=(.*),\s", out) + app_url = m.group(1) + + splitted_app_url = str(app_url).split('/') +diff -Naur ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/YARN/package/scripts/service.py apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/YARN/package/scripts/service.py +--- ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/YARN/package/scripts/service.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/YARN/package/scripts/service.py 2022-07-11 00:52:29.000000000 +0800 +@@ -27,8 +27,8 @@ + + @OsFamilyFuncImpl(os_family=OSConst.WINSRV_FAMILY) + def service(componentName, action='start', serviceName='yarn'): +- import status_params +- if status_params.service_map.has_key(componentName): ++ from . import status_params ++ 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) +@@ -38,7 +38,7 @@ + + @OsFamilyFuncImpl(os_family=OsFamilyImpl.DEFAULT) + def service(componentName, action='start', serviceName='yarn'): +- import params ++ from . import params + + if serviceName == 'mapreduce' and componentName == 'historyserver': + delete_pid_file = True +diff -Naur ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/YARN/package/scripts/setup_ranger_yarn.py apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/YARN/package/scripts/setup_ranger_yarn.py +--- ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/YARN/package/scripts/setup_ranger_yarn.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/YARN/package/scripts/setup_ranger_yarn.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + from resource_management.core.logger import Logger + + def setup_ranger_yarn(): +- import params ++ from . import params + + if params.has_ranger_admin: + +@@ -34,7 +34,7 @@ + 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 @@ + 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 -Naur ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/YARN/package/scripts/status_params.py apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/YARN/package/scripts/status_params.py +--- ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/YARN/package/scripts/status_params.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/YARN/package/scripts/status_params.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 -Naur ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/YARN/package/scripts/yarn_client.py apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/YARN/package/scripts/yarn_client.py +--- ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/YARN/package/scripts/yarn_client.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/YARN/package/scripts/yarn_client.py 2022-07-11 00:52:29.000000000 +0800 +@@ -25,7 +25,7 @@ + from resource_management.libraries.functions import stack_select + from resource_management.libraries.functions import StackFeature + from resource_management.libraries.functions.stack_features import check_stack_feature +-from yarn import yarn ++from .yarn import yarn + from ambari_commons import OSConst + from ambari_commons.os_family_impl import OsFamilyImpl + +@@ -36,7 +36,7 @@ + self.configure(env) + + def configure(self, env): +- import params ++ from . import params + env.set_params(params) + yarn() + +@@ -55,7 +55,7 @@ + return "hadoop-client" + + def pre_upgrade_restart(self, env, upgrade_type=None): +- import params ++ from . import params + env.set_params(params) + + if params.version and check_stack_feature(StackFeature.ROLLING_UPGRADE, params.version): +diff -Naur ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/YARN/package/scripts/yarn.py apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/YARN/package/scripts/yarn.py +--- ambari-release-2.7.6-origin/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/YARN/package/scripts/yarn.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/YARN/package/scripts/yarn.py 2022-07-11 00:52:29.000000000 +0800 +@@ -43,7 +43,7 @@ + + @OsFamilyFuncImpl(os_family=OSConst.WINSRV_FAMILY) + def yarn(name = None): +- import params ++ from . import params + XmlConfig("mapred-site.xml", + conf_dir=params.config_dir, + configurations=params.config['configurations']['mapred-site'], +@@ -64,7 +64,7 @@ + mode='f' + ) + +- if params.service_map.has_key(name): ++ if name in params.service_map: + service_name = params.service_map[name] + + ServiceConfig(service_name, +@@ -73,22 +73,22 @@ + password = Script.get_password(params.yarn_user)) + + def create_log_dir(dir_name): +- import params ++ from . import params + Directory(dir_name, + create_parents = True, + cd_access="a", +- mode=0775, ++ mode=0o775, + owner=params.yarn_user, + group=params.user_group, + ignore_failures=True, + ) + + def create_local_dir(dir_name): +- import params ++ from . import params + Directory(dir_name, + create_parents = True, + cd_access="a", +- mode=0755, ++ mode=0o755, + owner=params.yarn_user, + group=params.user_group, + ignore_failures=True, +@@ -101,7 +101,7 @@ + :param name: Component name, apptimelineserver, nodemanager, resourcemanager, or None (defaults for client) + :param config_dir: Which config directory to write configs to, which could be different during rolling upgrade. + """ +- import params ++ from . import params + + if config_dir is None: + config_dir = params.hadoop_conf_dir +@@ -113,7 +113,7 @@ + type="directory", + owner=params.yarn_user, + group=params.user_group, +- mode=0777, ++ mode=0o777, + recursive_chmod=True + ) + +@@ -123,7 +123,7 @@ + action="create_on_execute", + type="directory", + owner=params.hdfs_user, +- mode=0777, ++ mode=0o777, + ) + + params.HdfsResource(params.entity_file_history_directory, +@@ -148,7 +148,7 @@ + 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, +@@ -192,14 +192,14 @@ + 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 + ) + # +@@ -209,7 +209,7 @@ + owner=params.yarn_user, + group=params.user_group, + create_parents = True, +- mode=0755, ++ mode=0o755, + cd_access = 'a', + ) + +@@ -240,7 +240,7 @@ + configuration_attributes=params.config['configuration_attributes']['core-site'], + owner=params.hdfs_user, + group=params.user_group, +- mode=0644 ++ mode=0o644 + ) + + # During RU, Core Masters and Slaves need hdfs-site.xml +@@ -253,7 +253,7 @@ + configuration_attributes=params.config['configuration_attributes']['hdfs-site'], + owner=params.hdfs_user, + group=params.user_group, +- mode=0644 ++ mode=0o644 + ) + + XmlConfig("mapred-site.xml", +@@ -262,7 +262,7 @@ + configuration_attributes=params.config['configuration_attributes']['mapred-site'], + owner=params.yarn_user, + group=params.user_group, +- mode=0644 ++ mode=0o644 + ) + + XmlConfig("yarn-site.xml", +@@ -271,7 +271,7 @@ + configuration_attributes=params.config['configuration_attributes']['yarn-site'], + owner=params.yarn_user, + group=params.user_group, +- mode=0644 ++ mode=0o644 + ) + + XmlConfig("capacity-scheduler.xml", +@@ -280,12 +280,12 @@ + configuration_attributes=params.config['configuration_attributes']['capacity-scheduler'], + owner=params.yarn_user, + group=params.user_group, +- mode=0644 ++ mode=0o644 + ) + + if name == 'resourcemanager': + Directory(params.rm_nodes_exclude_dir, +- mode=0755, ++ mode=0o755, + create_parents=True, + cd_access='a', + ) +@@ -296,7 +296,7 @@ + ) + if params.include_hosts: + Directory(params.rm_nodes_include_dir, +- mode=0755, ++ mode=0o755, + create_parents=True, + cd_access='a', + ) +@@ -316,7 +316,7 @@ + change_permissions_for_parents=True, + owner=params.yarn_user, + group=params.user_group, +- mode=0700 ++ mode=0o700 + ) + params.HdfsResource(None, action="execute") + +@@ -346,7 +346,7 @@ + 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", +@@ -363,7 +363,7 @@ + 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", +@@ -375,19 +375,19 @@ + params.HdfsResource(None, action="execute") + + 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) + ) + +@@ -399,18 +399,18 @@ + + File(os.path.join(config_dir, "container-executor.cfg"), + group=params.user_group, +- mode=0644, ++ mode=0o644, + content=Template('container-executor.cfg.j2') + ) + + Directory(params.cgroups_dir, + group=params.user_group, + create_parents = True, +- mode=0755, ++ mode=0o755, + cd_access="a") + + if params.security_enabled: +- tc_mode = 0644 ++ tc_mode = 0o644 + tc_owner = "root" + else: + tc_mode = None +@@ -418,7 +418,7 @@ + + File(os.path.join(config_dir, "mapred-env.sh"), + owner=tc_owner, +- mode=0755, ++ mode=0o755, + content=InlineTemplate(params.mapred_env_sh_template) + ) + +@@ -426,7 +426,7 @@ + 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 = tc_owner, +diff -Naur ambari-release-2.7.6-origin/contrib/nagios-alerts/plugins/ambari_alerts.py apache-ambari-2.7.6-change/contrib/nagios-alerts/plugins/ambari_alerts.py +--- ambari-release-2.7.6-origin/contrib/nagios-alerts/plugins/ambari_alerts.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/nagios-alerts/plugins/ambari_alerts.py 2022-07-11 00:52:29.000000000 +0800 +@@ -18,7 +18,7 @@ + limitations under the License. + ''' + +-import urllib2 ++import urllib.request, urllib.error, urllib.parse + import json + import sys + import base64 +@@ -31,13 +31,13 @@ + login = sys.argv[5] + password = base64.b64decode(sys.argv[6]) + name = sys.argv[7] +- alerts_url = 'api/v1/clusters/{0}/alerts?fields=Alert/label,Alert/service_name,Alert/name,Alert/text,Alert/state&Alert/name={1}'.format(cluster, name) +- url = '{0}://{1}:{2}/{3}'.format(protocol, host, port, alerts_url) ++ alerts_url = 'api/v1/clusters/{}/alerts?fields=Alert/label,Alert/service_name,Alert/name,Alert/text,Alert/state&Alert/name={}'.format(cluster, name) ++ url = '{}://{}:{}/{}'.format(protocol, host, port, alerts_url) + admin_auth = base64.encodestring('%s:%s' % (login, password)).replace('\n', '') +- request = urllib2.Request(url) ++ request = urllib.request.Request(url) + request.add_header('Authorization', 'Basic %s' % admin_auth) + request.add_header('X-Requested-By', 'ambari') +- response = urllib2.urlopen(request) ++ response = urllib.request.urlopen(request) + response_body = response.read() + alert = json.loads(response_body)['items'][0] + state = alert['Alert']['state'] +@@ -46,7 +46,7 @@ + text = 'Unable to retrieve alert info: %s' % exc + state = 'UNKNOWN' + finally: +- print text ++ print(text) + exit_code = { + 'OK': 0, + 'WARNING': 1, +diff -Naur ambari-release-2.7.6-origin/contrib/nagios-alerts/plugins/generate_nagios_objects.py apache-ambari-2.7.6-change/contrib/nagios-alerts/plugins/generate_nagios_objects.py +--- ambari-release-2.7.6-origin/contrib/nagios-alerts/plugins/generate_nagios_objects.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/nagios-alerts/plugins/generate_nagios_objects.py 2022-07-11 00:52:29.000000000 +0800 +@@ -18,7 +18,7 @@ + limitations under the License. + ''' + +-import urllib2 ++import urllib.request, urllib.error, urllib.parse + import json + import sys + import base64 +@@ -64,26 +64,26 @@ + ''' + + try: +- host = raw_input("Enter ambari host: ") +- port = raw_input("Enter ambari port: ") +- cluster = raw_input("Enter ambari cluster: ") +- ssl = raw_input("Use SSL [true/false]: ") +- login = raw_input("Enter ambari login: ") +- password = raw_input("Enter ambari password: ") ++ host = input("Enter ambari host: ") ++ port = input("Enter ambari port: ") ++ cluster = input("Enter ambari cluster: ") ++ ssl = input("Use SSL [true/false]: ") ++ login = input("Enter ambari login: ") ++ password = input("Enter ambari password: ") + alerts_url = 'api/v1/clusters/{0}/alerts?fields=Alert/label,Alert/service_name,Alert/name,Alert/text,Alert/state' + if ssl.lower() == 'true': + protocol = 'https' + else: + protocol = 'http' +- url = '{0}://{1}:{2}/{3}'.format(protocol, host, port, alerts_url.format(cluster)) ++ url = '{}://{}:{}/{}'.format(protocol, host, port, alerts_url.format(cluster)) + admin_auth = base64.encodestring('%s:%s' % (login, password)).replace('\n', '') +- request = urllib2.Request(url) ++ request = urllib.request.Request(url) + request.add_header('Authorization', 'Basic %s' % admin_auth) + request.add_header('X-Requested-By', 'ambari') +- response = urllib2.urlopen(request) ++ response = urllib.request.urlopen(request) + response_body = response.read() + except Exception as ex: +- print "Error during Ambari Alerts data fetch: %s" % ex ++ print("Error during Ambari Alerts data fetch: %s" % ex) + sys.exit(1) + try: + alerts = json.loads(response_body)['items'] +@@ -104,21 +104,21 @@ + service_groups[service_name] = SERVICE_GROUP_DEFINITION % (service_name, service_name + ' services group') + services.append(SERVICE_DEFINITION % (alert_host, service_name, service_name, label, host, port, cluster, protocol, login, base64.b64encode(password), name)) + except Exception as ex: +- print "Error during processing Ambari Alerts data: %s" % ex ++ print("Error during processing Ambari Alerts data: %s" % ex) + sys.exit(1) + try: +- script_path = raw_input("Enter path to Ambari Alerts Plugin 'ambari_alerts.py': ") +- localhost_cfg = raw_input("Enter path to Nagios configuration file 'localhost.cfg' : ") +- commands_cfg = raw_input("Enter path to Nagios configuration file 'commands.cfg': ") ++ script_path = input("Enter path to Ambari Alerts Plugin 'ambari_alerts.py': ") ++ localhost_cfg = input("Enter path to Nagios configuration file 'localhost.cfg' : ") ++ commands_cfg = input("Enter path to Nagios configuration file 'commands.cfg': ") + with open(localhost_cfg, "a") as localhost_file: + localhost_file.write("# Ambari Alerts HostGroups") + for host_group in host_groups: + localhost_file.write(host_group) + localhost_file.write("# Ambari Alerts Hosts") +- for host_def in hosts.values(): ++ for host_def in list(hosts.values()): + localhost_file.write(host_def) + localhost_file.write("# Ambari Alerts ServiceGroups") +- for service_group in service_groups.values(): ++ for service_group in list(service_groups.values()): + localhost_file.write(service_group) + localhost_file.write("# Ambari Alerts Services") + for service in services: +@@ -126,5 +126,5 @@ + with open(commands_cfg, "a") as commands_file: + commands_file.write(ALERT_CHECK_COMMAND % script_path) + except Exception as ex: +- print "Error during creating Nagios objects for Ambari Alerts: %s" % ex ++ print("Error during creating Nagios objects for Ambari Alerts: %s" % ex) + sys.exit(1) +diff -Naur ambari-release-2.7.6-origin/contrib/utils/perf/deploy-gce-perf-cluster.py apache-ambari-2.7.6-change/contrib/utils/perf/deploy-gce-perf-cluster.py +--- ambari-release-2.7.6-origin/contrib/utils/perf/deploy-gce-perf-cluster.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/utils/perf/deploy-gce-perf-cluster.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + """ + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file +@@ -68,8 +68,8 @@ + stderr=subprocess.PIPE) + log = sshstat.communicate() + if sshstat.returncode != 0: +- print "Executing SSH command on {0} failed: {1}".format(self.host, log) +- print "\nRetrying SSH command one more time!" ++ print("Executing SSH command on {} failed: {}".format(self.host, log)) ++ print("\nRetrying SSH command one more time!") + if i >= 3: + break + i += 1 +@@ -77,19 +77,19 @@ + continue + break + except: +- print "Could not SSH to {0}, waiting for it to start".format(self.host) ++ print("Could not SSH to {}, waiting for it to start".format(self.host)) + i += 1 + time.sleep(10) + + if i >= 3: +- print "Could not execute remote ssh command: " + ' '.join(sshcommand) +- raise Exception("Could not connect to {0}. Giving up with erros: {1}".format(self.host, log)) ++ print("Could not execute remote ssh command: " + ' '.join(sshcommand)) ++ raise Exception("Could not connect to {}. Giving up with erros: {}".format(self.host, log)) + + errorMsg = log[1] + if self.errorMessage and sshstat.returncode != 0: + errorMsg = self.errorMessage + "\n" + errorMsg + +- print "SSH command execution finished" ++ print("SSH command execution finished") + + return {"exitstatus": sshstat.returncode, "log": log, "errormsg": errorMsg} + +@@ -123,8 +123,8 @@ + stderr=subprocess.PIPE) + log = scpstat.communicate() + if scpstat.returncode != 0: +- print "Executing SCP command on {0} failed: {1}".format(self.host, log) +- print "\nRetrying SCP command one more time!" ++ print("Executing SCP command on {} failed: {}".format(self.host, log)) ++ print("\nRetrying SCP command one more time!") + if i >= 3: + break + i += 1 +@@ -132,19 +132,19 @@ + continue + break + except: +- print "Could not SCP to {0}, waiting for it to start".format(self.host) ++ print("Could not SCP to {}, waiting for it to start".format(self.host)) + i += 1 + time.sleep(10) + + if i >= 3: +- print "Could not execute remote scp command: " + ' '.join(scpcommand) +- raise Exception("Could not connect to {0}. Giving up with erros: {1}".format(self.host, log)) ++ print("Could not execute remote scp command: " + ' '.join(scpcommand)) ++ raise Exception("Could not connect to {}. Giving up with erros: {}".format(self.host, log)) + + errorMsg = log[1] + if self.errorMessage and scpstat.returncode != 0: + errorMsg = self.errorMessage + "\n" + errorMsg + +- print "SCP command execution finished" ++ print("SCP command execution finished") + + return {"exitstatus": scpstat.returncode, "log": log, "errormsg": errorMsg} + +@@ -215,34 +215,34 @@ + create_vms(args, number_of_nodes) + + # getting list of vms information like hostname and ip address +- print "Getting list of virtual machines from cluster..." ++ print("Getting list of virtual machines from cluster...") + # Dictionary from host name to IP + (server_dict, agents_dict) = get_vms_list(args) + + # check number of nodes in cluster to be the same as user asked +- print "Checking count of created nodes in cluster..." ++ print("Checking count of created nodes in cluster...") + if not agents_dict or len(agents_dict) < number_of_nodes: +- raise Exception("Cannot bring up enough nodes. Requested {0}, but got {1}. Probably not enough resources!".format(number_of_nodes, len(agents_dict))) ++ raise Exception("Cannot bring up enough nodes. Requested {}, but got {}. Probably not enough resources!".format(number_of_nodes, len(agents_dict))) + +- print "GCE cluster was successfully created!\n" ++ print("GCE cluster was successfully created!\n") + + # installing/starting ambari-server and ambari-agents on each host +- server_item = server_dict.items()[0] ++ server_item = list(server_dict.items())[0] + server_host_name = server_item[0] + server_ip = server_item[1] +- print "==========================" +- print "Server Hostname: %s" % server_host_name +- print "Server IP: %s" % server_ip +- print "==========================\n" ++ print("==========================") ++ print("Server Hostname: %s" % server_host_name) ++ print("Server IP: %s" % server_ip) ++ print("==========================\n") + + # Sort the agents by hostname into a list. + sorted_agents = sort_hosts(agents_dict) + pretty_print_vms(sorted_agents) + +- print "Creating server.sh script (which will be executed on server to install/configure/start ambari-server)..." ++ print("Creating server.sh script (which will be executed on server to install/configure/start ambari-server)...") + create_server_script(server_host_name) + +- print "Creating agent.sh script (which will be executed on agent hosts to install/configure/start ambari-agent..." ++ print("Creating agent.sh script (which will be executed on agent hosts to install/configure/start ambari-agent...") + create_agent_script(server_host_name) + + time.sleep(10) +@@ -257,20 +257,20 @@ + for (hostname, ip) in sorted_agents: + num_agents_on_this_host = min(num_agents_left_to_create, NUMBER_OF_AGENTS_ON_HOST) + +- print "==========================" +- print "Working on VM {0} that will contain hosts {1} - {2}".format(hostname, start_num, start_num + num_agents_on_this_host - 1) ++ print("==========================") ++ print("Working on VM {} that will contain hosts {} - {}".format(hostname, start_num, start_num + num_agents_on_this_host - 1)) + + # The agent multiplier config will be different on each VM. + +- cmd_generate_multiplier_conf = "mkdir -p /etc/ambari-agent/conf/ ; printf \"start={0}\\nnum={1}\\nprefix={2}\" > /etc/ambari-agent/conf/agent-multiplier.conf".format(start_num, num_agents_on_this_host, args.agent_prefix) ++ cmd_generate_multiplier_conf = "mkdir -p /etc/ambari-agent/conf/ ; printf \"start={}\\nnum={}\\nprefix={}\" > /etc/ambari-agent/conf/agent-multiplier.conf".format(start_num, num_agents_on_this_host, args.agent_prefix) + start_num += num_agents_on_this_host + num_agents_left_to_create -= num_agents_on_this_host + + prepare_agent(args, hostname, ip, cmd_generate_multiplier_conf) + + pass +- print "All scripts where successfully copied and started on all hosts. " \ +- "\nPay attention that server.sh script need 5 minutes to finish and agent.sh need 3 minutes!" ++ print("All scripts where successfully copied and started on all hosts. " \ ++ "\nPay attention that server.sh script need 5 minutes to finish and agent.sh need 3 minutes!") + + + def create_vms(args, number_of_nodes): +@@ -279,14 +279,14 @@ + :param args: Command line args + :param number_of_nodes: Number of VMs to request. + """ +- print "Creating server VM {0}-server-{1} with xxlarge nodes on centos7...".format(cluster_prefix, args.cluster_suffix) +- execute_command(args, args.controller, "/opt/gce-utils/gce up {0}-server-{1} 1 --centos7 --xxlarge --ex --disk-xxlarge --ssd".format(cluster_prefix, args.cluster_suffix), ++ print("Creating server VM {}-server-{} with xxlarge nodes on centos7...".format(cluster_prefix, args.cluster_suffix)) ++ execute_command(args, args.controller, "/opt/gce-utils/gce up {}-server-{} 1 --centos7 --xxlarge --ex --disk-xxlarge --ssd".format(cluster_prefix, args.cluster_suffix), + "Failed to create server, probably not enough resources!", "-tt") + time.sleep(10) + + # trying to create cluster with needed params +- print "Creating agent VMs {0}-agent-{1} with {2} xlarge nodes on centos7...".format(cluster_prefix, args.cluster_suffix, str(number_of_nodes)) +- execute_command(args, args.controller, "/opt/gce-utils/gce up {0}-agent-{1} {2} --centos7 --xlarge --ex --disk-xlarge".format(cluster_prefix, args.cluster_suffix, str(number_of_nodes)), ++ print("Creating agent VMs {}-agent-{} with {} xlarge nodes on centos7...".format(cluster_prefix, args.cluster_suffix, str(number_of_nodes))) ++ execute_command(args, args.controller, "/opt/gce-utils/gce up {}-agent-{} {} --centos7 --xlarge --ex --disk-xlarge".format(cluster_prefix, args.cluster_suffix, str(number_of_nodes)), + "Failed to create cluster VMs, probably not enough resources!", "-tt") + + # VMs are not accessible immediately +@@ -296,10 +296,10 @@ + def prepare_server(args, hostname, ip): + remote_path = "/server.sh" + local_path = "server.sh" +- print "Copying server.sh to {0}...".format(hostname) ++ print("Copying server.sh to {}...".format(hostname)) + put_file(args, ip, local_path, remote_path, "Failed to copy file!") + +- print "Executing remote ssh command (set correct permissions and start executing server.sh in separate process) on {0}...".format(hostname) ++ print("Executing remote ssh command (set correct permissions and start executing server.sh in separate process) on {}...".format(hostname)) + execute_command(args, ip, "cd /; chmod 777 server.sh; nohup ./server.sh >/server.log 2>&1 &", + "Install/configure/start server script failed!") + +@@ -307,13 +307,13 @@ + def prepare_agent(args, hostname, ip, cmd_generate_multiplier_conf): + remote_path = "/agent.sh" + local_path = "agent.sh" +- print "Copying agent.sh to {0}...".format(hostname) ++ print("Copying agent.sh to {}...".format(hostname)) + put_file(args, ip, local_path, remote_path, "Failed to copy file!") + +- print "Generating agent-multiplier.conf" +- execute_command(args, ip, cmd_generate_multiplier_conf, "Failed to generate agent-multiplier.conf on host {0}".format(hostname)) ++ print("Generating agent-multiplier.conf") ++ execute_command(args, ip, cmd_generate_multiplier_conf, "Failed to generate agent-multiplier.conf on host {}".format(hostname)) + +- print "Executing remote ssh command (set correct permissions and start executing agent.sh in separate process) on {0}...".format(hostname) ++ print("Executing remote ssh command (set correct permissions and start executing agent.sh in separate process) on {}...".format(hostname)) + execute_command(args, ip, "cd /; chmod 777 agent.sh; nohup ./agent.sh >/agent.log 2>&1 &", + "Install/configure start agent script failed!") + +@@ -330,7 +330,7 @@ + + contents = "#!/bin/bash\n" + \ + "yum install wget -y\n" + \ +- "wget -O /etc/yum.repos.d/ambari.repo {0}\n".format(ambari_repo_file_url) + \ ++ "wget -O /etc/yum.repos.d/ambari.repo {}\n".format(ambari_repo_file_url) + \ + "yum clean all; yum install git ambari-server -y\n" + \ + "mkdir /home ; cd /home ; git clone https://github.com/apache/ambari.git ; cd ambari ; git checkout branch-2.5\n" + \ + "cp -r /home/ambari/ambari-server/src/main/resources/stacks/PERF /var/lib/ambari-server/resources/stacks/PERF\n" + \ +@@ -354,8 +354,8 @@ + "mysql -uroot -e \"GRANT ALL PRIVILEGES ON *.* TO 'ambari'@'%%';\"\n" + \ + "mysql -uroot -e \"CREATE USER 'ambari'@'localhost' IDENTIFIED BY 'bigdata';\"\n" + \ + "mysql -uroot -e \"GRANT ALL PRIVILEGES ON *.* TO 'ambari'@'localhost';\"\n" + \ +- "mysql -uroot -e \"CREATE USER 'ambari'@'{0}' IDENTIFIED BY 'bigdata';\"\n".format(server_host_name) + \ +- "mysql -uroot -e \"GRANT ALL PRIVILEGES ON *.* TO 'ambari'@'{0}';\"\n".format(server_host_name) + \ ++ "mysql -uroot -e \"CREATE USER 'ambari'@'{}' IDENTIFIED BY 'bigdata';\"\n".format(server_host_name) + \ ++ "mysql -uroot -e \"GRANT ALL PRIVILEGES ON *.* TO 'ambari'@'{}';\"\n".format(server_host_name) + \ + "mysql -uroot -e \"FLUSH PRIVILEGES;\"\n" + \ + "\n" + \ + "\n" + \ +@@ -372,9 +372,9 @@ + "sed -i -e 's/-Xmx2048m/-Xmx16384m/g' /var/lib/ambari-server/ambari-env.sh\n" + \ + "\n" + \ + "echo 'server.jdbc.driver=com.mysql.jdbc.Driver' >> /etc/ambari-server/conf/ambari.properties\n" + \ +- "echo 'server.jdbc.rca.url=jdbc:mysql://{0}:3306/ambari' >> /etc/ambari-server/conf/ambari.properties\n".format(server_host_name) + \ ++ "echo 'server.jdbc.rca.url=jdbc:mysql://{}:3306/ambari' >> /etc/ambari-server/conf/ambari.properties\n".format(server_host_name) + \ + "echo 'server.jdbc.rca.driver=com.mysql.jdbc.Driver' >> /etc/ambari-server/conf/ambari.properties\n" + \ +- "echo 'server.jdbc.url=jdbc:mysql://{0}:3306/ambari' >> /etc/ambari-server/conf/ambari.properties\n".format(server_host_name) + \ ++ "echo 'server.jdbc.url=jdbc:mysql://{}:3306/ambari' >> /etc/ambari-server/conf/ambari.properties\n".format(server_host_name) + \ + "echo 'server.jdbc.port=3306' >> /etc/ambari-server/conf/ambari.properties\n" + \ + "echo 'server.jdbc.hostname=localhost' >> /etc/ambari-server/conf/ambari.properties\n" + \ + "echo 'server.jdbc.driver.path=/usr/share/java/mysql-connector-java.jar' >> /etc/ambari-server/conf/ambari.properties\n" + \ +@@ -401,14 +401,14 @@ + # TODO, instead of cloning Ambari repo on each VM, do it on the server once and distribute to all of the agents. + contents = "#!/bin/bash\n" + \ + "yum install wget -y\n" + \ +- "wget -O /etc/yum.repos.d/ambari.repo {0}\n".format(ambari_repo_file_url) + \ ++ "wget -O /etc/yum.repos.d/ambari.repo {}\n".format(ambari_repo_file_url) + \ + "yum clean all; yum install krb5-workstation git ambari-agent -y\n" + \ + "mkdir /home ; cd /home; git clone https://github.com/apache/ambari.git ; cd ambari ; git checkout branch-2.5\n" + \ + "cp -r /home/ambari/ambari-server/src/main/resources/stacks/PERF /var/lib/ambari-agent/cache/stacks/PERF\n" + \ + "sed -i -f /var/lib/ambari-agent/cache/stacks/PERF/PythonExecutor.sed /usr/lib/ambari-agent/lib/ambari_agent/PythonExecutor.py\n" + \ + "sed -i -f /var/lib/ambari-agent/cache/stacks/PERF/check_host.sed /var/lib/ambari-agent/cache/custom_actions/scripts/check_host.py\n" + \ +- "sed -i -e 's/hostname=localhost/hostname={0}/g' /etc/ambari-agent/conf/ambari-agent.ini\n".format(server_host_name) + \ +- "sed -i -e 's/agent]/agent]\\nhostname_script={0}\\npublic_hostname_script={1}\\n/1' /etc/ambari-agent/conf/ambari-agent.ini\n".format(hostname_script, public_hostname_script) + \ ++ "sed -i -e 's/hostname=localhost/hostname={}/g' /etc/ambari-agent/conf/ambari-agent.ini\n".format(server_host_name) + \ ++ "sed -i -e 's/agent]/agent]\\nhostname_script={}\\npublic_hostname_script={}\\n/1' /etc/ambari-agent/conf/ambari-agent.ini\n".format(hostname_script, public_hostname_script) + \ + "python /home/ambari/ambari-agent/conf/unix/agent-multiplier.py start\n" + \ + "exit 0" + +@@ -466,10 +466,10 @@ + :return: Tuple of dictionaries of hostnames and ip for server and agents. + """ + # Get the server. +- server = __get_vms_list_from_name(args, "{0}-server-{1}".format(cluster_prefix, args.cluster_suffix)) ++ server = __get_vms_list_from_name(args, "{}-server-{}".format(cluster_prefix, args.cluster_suffix)) + + # Get the agents +- agents = __get_vms_list_from_name(args, "{0}-agent-{1}".format(cluster_prefix, args.cluster_suffix)) ++ agents = __get_vms_list_from_name(args, "{}-agent-{}".format(cluster_prefix, args.cluster_suffix)) + + return (server, agents) + +@@ -479,7 +479,7 @@ + :param args: Command line args + :return: Mapping of VM host name to ip. + """ +- gce_fqdb_cmd = '/opt/gce-utils/gce fqdn {0}'.format(cluster_name) ++ gce_fqdb_cmd = '/opt/gce-utils/gce fqdn {}'.format(cluster_name) + out = execute_command(args, args.controller, gce_fqdb_cmd, "Failed to get VMs list!", "-tt") + lines = out.split('\n') + #print "LINES=" + str(lines) +@@ -492,10 +492,10 @@ + if match: + result[match.group(2)] = match.group(1) + else: +- raise Exception('Cannot parse "{0}"'.format(s)) ++ raise Exception('Cannot parse "{}"'.format(s)) + return result + else: +- raise Exception('Cannot parse "{0}"'.format(lines)) ++ raise Exception('Cannot parse "{}"'.format(lines)) + + + def sort_hosts(hosts): +@@ -504,10 +504,10 @@ + :param hosts: Dictionary from host name (e.g., perf-9-test, perf-62-test), to the IP + :return: Sorted list of tuples + """ +- host_names = hosts.keys() ++ host_names = list(hosts.keys()) + sorted_host_tuples = [(None, None),] * len(hosts) + +- pattern = re.compile(".*?-agent-.*?(\d+)") ++ pattern = re.compile(r".*?-agent-.*?(\d+)") + for host_name in host_names: + m = pattern.match(host_name) + if m and len(m.groups()) == 1: +@@ -523,11 +523,11 @@ + Pretty print the VMs hostnames + :param vms: List of tuples (hostname, ip) + """ +- print "==========================" +- print "Hostnames of nodes in cluster:" ++ print("==========================") ++ print("Hostnames of nodes in cluster:") + for (hostname, ip) in vms: +- print hostname +- print "==========================\n" ++ print(hostname) ++ print("==========================\n") + + + if __name__ == "__main__": +diff -Naur ambari-release-2.7.6-origin/contrib/utils/preinstall-check/src/main/python/preinstall_checker.py apache-ambari-2.7.6-change/contrib/utils/preinstall-check/src/main/python/preinstall_checker.py +--- ambari-release-2.7.6-origin/contrib/utils/preinstall-check/src/main/python/preinstall_checker.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/utils/preinstall-check/src/main/python/preinstall_checker.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + ''' + Licensed to the Apache Software Foundation (ASF) under one +@@ -91,17 +91,17 @@ + def init_parser_options(parser): + parser.add_option('-p', '--port', + dest="port", default=DEFAULT_HTTP_PORT, +- help="Ambari Server port corrsponding to the network protocol. Default port is {0} for an HTTP connection".format(DEFAULT_HTTP_PORT)) ++ help="Ambari Server port corrsponding to the network protocol. Default port is {} for an HTTP connection".format(DEFAULT_HTTP_PORT)) + parser.add_option('-u', '--user', + dest="user", default=DEFAULT_ADMIN_USER, +- help="Ambari admin user. Default user name is {0}".format(DEFAULT_ADMIN_USER)) ++ help="Ambari admin user. Default user name is {}".format(DEFAULT_ADMIN_USER)) + parser.add_option('-a', '--password', + dest="password", + help="Ambari admin user password.") + parser.add_option('-l', '--log', + dest="log", + default=DEFAULT_LOG_DIR, +- help="The log file home location. Default log file home is {0}.".format(DEFAULT_LOG_DIR), ++ help="The log file home location. Default log file home is {}.".format(DEFAULT_LOG_DIR), + metavar="DIR") + parser.add_option('--blueprint', + dest="blueprint", +@@ -110,7 +110,7 @@ + metavar="FILE") + parser.add_option('--operation', + dest='operation', default=OPERATION_HOST_CHECK, +- help='Operation can one of the following {0}'.format(', '.join(OPERATIONS))) ++ help='Operation can one of the following {}'.format(', '.join(OPERATIONS))) + parser.add_option("-v", "--verbose", dest="verbose", action="store_true", default=False, help="Output verbosity.") + + """ +@@ -134,7 +134,7 @@ + if not options.operation: + errors.append('No operation provided') + elif not options.operation in OPERATIONS: +- errors.append('Unknow operation {0}. Specify one of the following operations: {1}'.format(options.operation, ', '.join(OPERATIONS))) ++ errors.append('Unknow operation {}. Specify one of the following operations: {}'.format(options.operation, ', '.join(OPERATIONS))) + elif options.operation == OPERATION_VALIDATE_BLUEPRINT: + if not options.blueprint: + errors.append('No blueprint file provided') +@@ -142,10 +142,10 @@ + if not errors: + return 'Parameters validation finished successfully', CODE_SUCCESS + else: +- return 'Parameters validation finished with error(s). {0}'.format('. '.join(errors)), CODE_ERROR ++ return 'Parameters validation finished with error(s). {}'.format('. '.join(errors)), CODE_ERROR + + def get_log_file(log_home): +- return '{0}/{1}'.format(log_home, DEFAULT_LOG_FILE) ++ return '{}/{}'.format(log_home, DEFAULT_LOG_FILE) + + def init_logger(options): + log_dir = options.log +@@ -175,8 +175,8 @@ + backup_file = filePath + "." + timestamp.strftime(simpleformat) + try: + shutil.move(filePath, backup_file) +- except Exception, err: +- print('Failed to backup "{0}": {1}'.format(str(filePath), str(err))) ++ except Exception as err: ++ print(('Failed to backup "{}": {}'.format(str(filePath), str(err)))) + return '', CODE_WARNING + return backup_file, CODE_SUCCESS + else: +@@ -190,7 +190,7 @@ + def step(msg): + logger.info('') + if len(msg) >= 43: +- logger.info('******** Check: {0} ********'.format(msg)) ++ logger.info('******** Check: {} ********'.format(msg)) + else: + spaces = ' '.ljust((50 - len(msg))/2) + logger.info('{0}{2}Check: {1}{2}{0}'.format('********',msg,spaces)) +@@ -201,18 +201,18 @@ + else: + spaces = ' '.ljust(63 - len(check)) + if code == CODE_SUCCESS: +- logger.info('{0}{1}{2}'.format(check, spaces, LABEL_OK)) ++ logger.info('{}{}{}'.format(check, spaces, LABEL_OK)) + elif code == CODE_WARNING: +- logger.info('{0}{1}{2}'.format(check, spaces, LABEL_WARNING)) ++ logger.info('{}{}{}'.format(check, spaces, LABEL_WARNING)) + if msgs: + for msg in msgs: + if msg.strip(): +- logger.warning('\t{0}'.format(msg.strip())) ++ logger.warning('\t{}'.format(msg.strip())) + else: +- logger.info('{0}{1}{2}'.format(check, spaces, LABEL_ERROR)) ++ logger.info('{}{}{}'.format(check, spaces, LABEL_ERROR)) + if msgs: + for msg in msgs: +- logger.error('\t{0}'.format(msg.strip())) ++ logger.error('\t{}'.format(msg.strip())) + + def print_check_results(results): + global has_warnings +@@ -239,14 +239,14 @@ + logger.info('/******************************************************************************/') + logger.info(' Parameters used for script run ') + logger.info('Cluster parameters') +- logger.info("Server URL: {0}".format(server_url)) +- logger.info("Port: {0}".format(options.port)) +- logger.info("User: {0}".format(options.user)) ++ logger.info("Server URL: {}".format(server_url)) ++ logger.info("Port: {}".format(options.port)) ++ logger.info("User: {}".format(options.user)) + logger.info('') + logger.info('Operation info') +- logger.info("Operation: {0}".format(options.operation)) +- logger.info("Log Home Dir: {0}".format(options.log)) +- logger.info("Log File: {0}".format(get_log_file(options.log))) ++ logger.info("Operation: {}".format(options.operation)) ++ logger.info("Log Home Dir: {}".format(options.log)) ++ logger.info("Log File: {}".format(get_log_file(options.log))) + logger.info('/******************************************************************************/') + + """ +@@ -254,7 +254,7 @@ + """ + def get_ambari_server_property(key): + try: +- with open(DEFAULT_AMBARI_SERVER_PROPERTIES, 'r') as property_file: ++ with open(DEFAULT_AMBARI_SERVER_PROPERTIES) as property_file: + file_content = property_file.read() + lines = file_content.splitlines() + lines.reverse() +@@ -263,7 +263,7 @@ + if len(tokens) == 2: + if tokens[0] == key: + return tokens[1] +- except Exception, err: ++ except Exception as err: + logger.error(str(err)) + return None + return None +@@ -280,7 +280,7 @@ + + def get_server_url(port): + protocol = get_server_protocol() +- url = "{0}://{1}:{2}".format(protocol, get_admin_server_fqdn(), str(port)) ++ url = "{}://{}:{}".format(protocol, get_admin_server_fqdn(), str(port)) + return url + + """ +@@ -295,7 +295,7 @@ + @param user: User for Ambari REST API authentication + @param password: Password for the user used to authenticate the Ambari REST API call + """ +- curl_cmd_array = ["curl", "-v", "-u", "{0}:{1}".format(user,password), "-k", "-H", "X-Requested-By: ambari"] ++ curl_cmd_array = ["curl", "-v", "-u", "{}:{}".format(user,password), "-k", "-H", "X-Requested-By: ambari"] + + for header in headers: + curl_cmd_array.append('-H') +@@ -308,7 +308,7 @@ + curl_cmd_array.append("-d") + curl_cmd_array.append(request_body) + curl_cmd_array.append(url) +- logger.debug('Curl command: {0}'.format(' '.join(curl_cmd_array))) ++ logger.debug('Curl command: {}'.format(' '.join(curl_cmd_array))) + exeProcess = subprocess.Popen(curl_cmd_array, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + out, err = exeProcess.communicate() + exit_code = exeProcess.returncode +@@ -348,7 +348,7 @@ + Determine if Ambari Server has accepted the REST API call + """ + def is_request_accepted(json_str): +- logger.debug("Checking request in {0}".format(json_str)) ++ logger.debug("Checking request in {}".format(json_str)) + if not json_str: + return False + response = json.loads(json_str) +@@ -367,11 +367,11 @@ + if href: + url_str = str(href) + if summary_only: +- return '{0}?fields=Requests'.format(url_str) ++ return '{}?fields=Requests'.format(url_str) + else: + return url_str + else: +- logger.error("Failed to obtain request url. {0} does not contain 'href' section".format(json_str)) ++ logger.error("Failed to obtain request url. {} does not contain 'href' section".format(json_str)) + return None + + """ +@@ -399,7 +399,7 @@ + if request_status: + return request_status + else: +- logger.error("Failed to determin request state. {0} does not contain 'Requests' section".format(json_str)) ++ logger.error("Failed to determin request state. {} does not contain 'Requests' section".format(json_str)) + return None + + """ +@@ -417,8 +417,8 @@ + ec=0 + request_in_progress = True + +- logger.debug("Polling status for {0} every {1} seconds".format(url, timer)) +- logger.debug("Polling started at {0}".format(str(get_current_time()))) ++ logger.debug("Polling status for {} every {} seconds".format(url, timer)) ++ logger.debug("Polling started at {}".format(str(get_current_time()))) + + previous_percentage = 0 + while request_in_progress: +@@ -431,14 +431,14 @@ + if percentage >= 0: + if percentage != previous_percentage: + previous_percentage = percentage +- logger.debug(' {0}%'.format(percentage)) ++ logger.debug(' {}%'.format(percentage)) + else: + logger.debug('.') + if is_finished: + request_in_progress = False + else: + time.sleep(timer) +- logger.debug("Stopped polling {0} at {1}. Request finished.".format(url, str(get_current_time()))) ++ logger.debug("Stopped polling {} at {}. Request finished.".format(url, str(get_current_time()))) + return out, err, ec + + def get_host(json_str): +@@ -513,13 +513,13 @@ + out, ec = server_reachable_by_credentials(server_url, user, password) + if CODE_CONNECTION_REFUSED == ec: + retry_counter = retry_counter + 1 +- logger.debug('Server may have not become fully online yet, try to reconnect in {0} seconds'.format(DEFAULT_TIMER_LONG)) ++ logger.debug('Server may have not become fully online yet, try to reconnect in {} seconds'.format(DEFAULT_TIMER_LONG)) + time.sleep(DEFAULT_TIMER_LONG) + else: + logger.debug('Connected to server.') + break + if CODE_CONNECTION_REFUSED == ec: +- message = 'Server did not become fully online in {0} seconds.'.format(str(DEFAULT_MAX_COUNTER * DEFAULT_TIMER_LONG)) ++ message = 'Server did not become fully online in {} seconds.'.format(str(DEFAULT_MAX_COUNTER * DEFAULT_TIMER_LONG)) + logger.debug(message) + return out, ec + +@@ -532,7 +532,7 @@ + @param user: User for Ambari REST API authentication + @param password: Password for the user used to authenticate the Ambari REST API call + """ +- url = '{0}/api/v1/requests'.format(server_url) ++ url = '{}/api/v1/requests'.format(server_url) + out, err, ec = execute_curl_command(url, user=user, password=password) + if ec != CODE_SUCCESS: + return err, ec +@@ -552,12 +552,12 @@ + @param user: User for Ambari REST API authentication + @param password: Password for the user used to authenticate the Ambari REST API call + """ +- url = "{0}/api/v1/services/AMBARI/components/AMBARI_AGENT".format(server_url) ++ url = "{}/api/v1/services/AMBARI/components/AMBARI_AGENT".format(server_url) + hosts = set() + out, err, ec = execute_curl_command(url, user=user, password=password) + is_erroneous_response, ec, err = is_erroneous_response_by_server(out) + if is_erroneous_response: +- logger.error("HTTP {0}:{1}".format(ec, err)) ++ logger.error("HTTP {}:{}".format(ec, err)) + return hosts + + response = json.loads(out) +@@ -635,9 +635,9 @@ + def run_host_checks(options, agents, server_url): + label_check = 'Host name resolution' + step(label_check) +- url = '{0}/api/v1/requests'.format(server_url) ++ url = '{}/api/v1/requests'.format(server_url) + data = '{{"RequestInfo":{{"action":"check_host","context":"Check host","parameters":{{"check_execute_list":"host_resolution_check","jdk_location":"{0}/resources","threshold":"20","hosts":"{1}"}}}},"Requests/resource_filters":[{{"hosts":"{1}"}}]}}'.format(server_url, ','.join(agents)) +- logger.debug('Host resolution check data {0}'.format(data)) ++ logger.debug('Host resolution check data {}'.format(data)) + task_results_by_hosts, results_to_print = run_check(options, url, label_check, data) + host_check_parser(task_results_by_hosts, results_to_print) + print_check_results(results_to_print) +@@ -662,11 +662,11 @@ + def run_java_home_checks(options, agents, server_url): + label_check = 'Java Home location' + step(label_check) +- url = '{0}/api/v1/requests'.format(server_url) ++ url = '{}/api/v1/requests'.format(server_url) + java_home = get_ambari_server_property('java.home') +- logger.info('Ambari server java home: {0}'.format(java_home)) ++ logger.info('Ambari server java home: {}'.format(java_home)) + data = '{{"RequestInfo":{{"context":"Check hosts","action":"check_host","parameters":{{"threshold":"60","java_home":"{0}","jdk_location":"{1}/resources","check_execute_list":"java_home_check"}}}},"Requests/resource_filters":[{{"hosts":"{2}"}}]}}'.format(java_home, server_url, ','.join(agents)) +- logger.debug('Java home check data {0}'.format(data)) ++ logger.debug('Java home check data {}'.format(data)) + task_results_by_hosts, results_to_print = run_check(options, url, label_check, data) + java_home_check_parser(task_results_by_hosts, results_to_print) + print_check_results(results_to_print) +@@ -746,7 +746,7 @@ + if active_java_processes: + warnings = [] + for process in active_java_processes: +- warnings.append('Process {0} under user {1} should not be running'.format(process['pid'], process['user'])) ++ warnings.append('Process {} under user {} should not be running'.format(process['pid'], process['user'])) + results_to_print.append({'key':key, 'status':STATUS_WARNING, 'warning':warnings}) + else: + results_to_print.append({'key':key, 'status':STATUS_PASSED}) +@@ -758,7 +758,7 @@ + if installed_packages: + warnings = [] + for package in installed_packages: +- warnings.append('{0} (version {1}) is installed from repo {2}. It should be removed before deploying the cluster.'.format(package['name'], package['version'], package['repoName'])) ++ warnings.append('{} (version {}) is installed from repo {}. It should be removed before deploying the cluster.'.format(package['name'], package['version'], package['repoName'])) + results_to_print.append({'key':key, 'status':STATUS_WARNING, 'warning':warnings}) + else: + results_to_print.append({'key':key, 'status':STATUS_PASSED}) +@@ -771,7 +771,7 @@ + if stack_files_and_folders: + warnings = [] + for item in stack_files_and_folders: +- warnings.append('{0} {1} should not exist.'.format(item['type'].title(), item['name'])) ++ warnings.append('{} {} should not exist.'.format(item['type'].title(), item['name'])) + results_to_print.append({'key':key, 'status':STATUS_WARNING, 'warning':warnings}) + else: + results_to_print.append({'key':key, 'status':STATUS_PASSED}) +@@ -786,7 +786,7 @@ + warnings = [] + for service in live_services: + if 'Unhealthy' == service['status']: +- warnings.append('Service {0} shoud be up.'.format(service['name'])) ++ warnings.append('Service {} shoud be up.'.format(service['name'])) + if warnings: + results_to_print.append({'key':key, 'status':STATUS_WARNING, 'warning':warnings}) + else: +@@ -802,7 +802,7 @@ + if existing_users: + messages = [] + for user in existing_users: +- messages.append('User {0} with home directory {1} exists.'.format(user['name'], user['homeDir'])) ++ messages.append('User {} with home directory {} exists.'.format(user['name'], user['homeDir'])) + if messages: + results_to_print.append({'key':key, 'status':STATUS_WARNING, 'warning':messages}) + else: +@@ -815,7 +815,7 @@ + if 'umask' in last_agent_env: + umask = int(last_agent_env['umask']) + if umask > 23: +- results_to_print.append({'key':key, 'status':STATUS_WARNING, 'warning':['Umask is {0}. Consider update it.'.format(umask)]}) ++ results_to_print.append({'key':key, 'status':STATUS_WARNING, 'warning':['Umask is {}. Consider update it.'.format(umask)]}) + else: + results_to_print.append({'key':key, 'status':STATUS_PASSED}) + else: +@@ -829,7 +829,7 @@ + if alternatives: + warnings = [] + for alternative in alternatives: +- warnings.append('Existing /etc/alternativies entry: {0} points to {1}'.format(alternative['name'], alternative['target'])) ++ warnings.append('Existing /etc/alternativies entry: {} points to {}'.format(alternative['name'], alternative['target'])) + results_to_print.append({'key':key, 'status':STATUS_WARNING, 'warning':warnings}) + else: + results_to_print.append({'key':key, 'status':STATUS_PASSED}) +@@ -854,18 +854,18 @@ + logger.info('') + logger.info('Prepare for Ambari Agent host check') + label_check = 'Ambari Agent host check' +- url = '{0}/api/v1/requests'.format(server_url) ++ url = '{}/api/v1/requests'.format(server_url) + data = '{{"RequestInfo":{{"action":"check_host","context":"Check host","parameters":{{"check_execute_list":"last_agent_env_check,installed_packages,existing_repos,transparentHugePage","jdk_location":"{0}/resources","threshold":"20"}}}},"Requests/resource_filters":[{{"hosts":"{1}"}}]}}'.format(server_url, ','.join(agents)) +- logger.debug('Agent enviornment check data to submit {0}'.format(data)) ++ logger.debug('Agent enviornment check data to submit {}'.format(data)) + task_results_by_host, results_to_print = run_check(options, url, label_check, data) + + step('Transparent Huge Pages') + thp_checks_parser(task_results_by_host, results_to_print) + print_check_results(results_to_print) + +- host_info_url = '{0}/api/v1/hosts?fields=Hosts/total_mem,Hosts/cpu_count,Hosts/disk_info,Hosts/last_agent_env,Hosts/host_name,Hosts/os_type,Hosts/os_arch,Hosts/os_family,Hosts/ip'.format(server_url) ++ host_info_url = '{}/api/v1/hosts?fields=Hosts/total_mem,Hosts/cpu_count,Hosts/disk_info,Hosts/last_agent_env,Hosts/host_name,Hosts/os_type,Hosts/os_arch,Hosts/os_family,Hosts/ip'.format(server_url) + out, err, ec = execute_curl_command(host_info_url, user=options.user, password=options.password) +- logger.debug('Agent host information {0}'.format(out)) ++ logger.debug('Agent host information {}'.format(out)) + host_info_by_host = {} + if out: + response = json.loads(out) +@@ -931,7 +931,7 @@ + blueprint_file = options.blueprint + label_check = 'Blueprint validation' + step(label_check) +- logger.debug('Blueprint file to check {0}'.format(blueprint_file)) ++ logger.debug('Blueprint file to check {}'.format(blueprint_file)) + if os.path.isfile(blueprint_file): + """Validate blueprint file is a valid json file""" + valid_json_file = False +@@ -947,17 +947,17 @@ + blueprint_metadata = data.get('Blueprints', {}) + blueprint_name = blueprint_metadata.get('blueprint_name', None) + if not blueprint_name: +- blueprint_name = 'blueprint_validation_{0}'.format(str(uuid.uuid4())) +- logger.debug('Blueprint name used for server side validation: {0}'.format(blueprint_name)) +- url = '{0}/api/v1/blueprints/{1}'.format(server_url, blueprint_name) +- out, err, ec = execute_curl_command(url, request_type=HTTP_REQUEST_POST, request_body="@{0}".format(blueprint_file), user=options.user, password=options.password) ++ blueprint_name = 'blueprint_validation_{}'.format(str(uuid.uuid4())) ++ logger.debug('Blueprint name used for server side validation: {}'.format(blueprint_name)) ++ url = '{}/api/v1/blueprints/{}'.format(server_url, blueprint_name) ++ out, err, ec = execute_curl_command(url, request_type=HTTP_REQUEST_POST, request_body="@{}".format(blueprint_file), user=options.user, password=options.password) + logger.debug(out) + logger.debug(err) + if CODE_ERROR == ec: + results_to_print.append({'key':label_check, 'status':STATUS_FAILED, 'error':[err]}) + else: + http_response_code = get_http_response_code(err) +- logger.debug('HTTP response from the Ambari server: {0}'.format(http_response_code)) ++ logger.debug('HTTP response from the Ambari server: {}'.format(http_response_code)) + if http_response_code == HTTP_CREATED and not out : + results_to_print.append({'key':label_check, 'status':STATUS_PASSED}) + else: +@@ -967,12 +967,12 @@ + else: + results_to_print.append({'key':label_check, 'status':STATUS_FAILED, 'error':[err]}) + else: +- results_to_print.append({'key':label_check, 'status':STATUS_FAILED, 'error':['{0} does not exist'.format(blueprint_file)]}) ++ results_to_print.append({'key':label_check, 'status':STATUS_FAILED, 'error':['{} does not exist'.format(blueprint_file)]}) + print_check_results(results_to_print) + deregister_temporary_blueprint(options, server_url, blueprint_name) + + def deregister_temporary_blueprint(options, server_url, blueprint_name): +- url = '{0}/api/v1/blueprints/{1}'.format(server_url, blueprint_name) ++ url = '{}/api/v1/blueprints/{}'.format(server_url, blueprint_name) + out, err, ec = execute_curl_command(url, request_type=HTTP_REQUEST_DELETE, user=options.user, password=options.password) + if CODE_ERROR == ec: + logger.error(out) +@@ -981,9 +981,9 @@ + logger.debug(out) + logger.debug(err) + http_response_code = get_http_response_code(err) +- logger.debug('HTTP response from the Ambari server: {0}'.format(http_response_code)) ++ logger.debug('HTTP response from the Ambari server: {}'.format(http_response_code)) + if http_response_code == HTTP_OK and not out : +- logger.debug("{0} deregistered".format(blueprint_name)) ++ logger.debug("{} deregistered".format(blueprint_name)) + else: + is_erroneous_response, http_ec, http_err = is_erroneous_response_by_server(out) + if is_erroneous_response: +@@ -1005,15 +1005,15 @@ + step(label_check) + out, ec = server_reachable_by_credentials_with_retry(server_url, options.user, options.password) + if CODE_SUCCESS == ec: +- print_check_result(label_check, ['Ambari server reachable via {0}'.format(server_url)], ec) ++ print_check_result(label_check, ['Ambari server reachable via {}'.format(server_url)], ec) + elif CODE_ERROR == ec: +- print_check_result(label_check, ['Failed to establish connection to {0}.'.format(server_url)], ec) ++ print_check_result(label_check, ['Failed to establish connection to {}.'.format(server_url)], ec) + return ec + elif HTTP_FORBIDDEN == ec: + print_check_result(label_check, ['Wrong credentials provided.'], ec) + return ec + agents = get_ambari_agent_nodes(server_url, options.user, options.password) +- logger.info('Total number of agents {0}'.format(len(agents))) ++ logger.info('Total number of agents {}'.format(len(agents))) + if not agents: + logger.error('No Ambari Agent registered to the Ambari Server. Install Ambari Agent first.') + return CODE_ERROR +@@ -1048,7 +1048,7 @@ + init_logger(options) + + if backup_file: +- logger.info('Previous logs backed up as {0}'.format(backup_file)) ++ logger.info('Previous logs backed up as {}'.format(backup_file)) + + out, ec = validate_options(options) + if CODE_ERROR == ec: +@@ -1059,7 +1059,7 @@ + try: + ec = run(options) + sys.exit(ec) +- except Exception, e: ++ except Exception as e: + logger.exception(e) + sys.exit(CODE_ERROR) + +diff -Naur ambari-release-2.7.6-origin/contrib/version-builder/version_builder.py apache-ambari-2.7.6-change/contrib/version-builder/version_builder.py +--- ambari-release-2.7.6-origin/contrib/version-builder/version_builder.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/version-builder/version_builder.py 2022-07-11 00:52:29.000000000 +0800 +@@ -69,10 +69,10 @@ + raise Exception(stderr) + + if len(stdout) > 0: +- print(stdout.decode("UTF-8")) ++ print((stdout.decode("UTF-8"))) + + if len(stderr) > 0: +- print(stderr.decode("UTF-8")) ++ print((stderr.decode("UTF-8"))) + + def set_release(self, type=None, stack=None, version=None, build=None, notes=None, display=None, + compatible=None): +@@ -156,7 +156,7 @@ + + service_element = self.findByAttributeValue(manifest_element, "./service", "id", manifest_id) + if service_element is None: +- raise Exception("Cannot add an available service for {0}; it's not on the manifest".format(manifest_id)) ++ raise Exception("Cannot add an available service for {}; it's not on the manifest".format(manifest_id)) + + available_element = self.root_element.find("./available-services") + if available_element is None: +@@ -190,7 +190,7 @@ + os_element.set('family', os_family) + + if self.useNewSyntax(): +- repo_element = os_element.find("./repo/[reponame='{0}']".format(repo_name)) ++ repo_element = os_element.find("./repo/[reponame='{}']".format(repo_name)) + else: + repo_element = self.findByValue(os_element, "./repo/reponame", repo_name) + +@@ -235,15 +235,15 @@ + + def findByAttributeValue(self, root, element, attribute, value): + if self.useNewSyntax(): +- return root.find("./{0}[@{1}='{2}']".format(element, attribute, value)) ++ return root.find("./{}[@{}='{}']".format(element, attribute, value)) + else: +- for node in root.findall("{0}".format(element)): ++ for node in root.findall("{}".format(element)): + if node.attrib[attribute] == value: + return node + return None; + + def findByValue(self, root, element, value): +- for node in root.findall("{0}".format(element)): ++ for node in root.findall("{}".format(element)): + if node.text == value: + return node + return None +diff -Naur ambari-release-2.7.6-origin/contrib/views/capacity-scheduler/src/main/resources/ui/.gitignore apache-ambari-2.7.6-change/contrib/views/capacity-scheduler/src/main/resources/ui/.gitignore +--- ambari-release-2.7.6-origin/contrib/views/capacity-scheduler/src/main/resources/ui/.gitignore 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/views/capacity-scheduler/src/main/resources/ui/.gitignore 1970-01-01 08:00:00.000000000 +0800 +@@ -1,34 +0,0 @@ +-# Numerous always-ignore extensions +-*.diff +-*.err +-*.orig +-*.log +-*.rej +-*.swo +-*.swp +-*.vi +-*~ +-*.sass-cache +- +-# OS or Editor folders +-.DS_Store +-.cache +-.project +-.settings +-.tmproj +-nbproject +-Thumbs.db +- +-# NPM packages folder. +-node_modules/ +- +-bower_components/ +- +-node/ +- +-# Brunch folder for temporary files. +-tmp/ +- +-public/ +- +-_generators/ +diff -Naur ambari-release-2.7.6-origin/contrib/views/commons/src/main/resources/ui/hdfs-directory-viewer/.gitignore apache-ambari-2.7.6-change/contrib/views/commons/src/main/resources/ui/hdfs-directory-viewer/.gitignore +--- ambari-release-2.7.6-origin/contrib/views/commons/src/main/resources/ui/hdfs-directory-viewer/.gitignore 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/views/commons/src/main/resources/ui/hdfs-directory-viewer/.gitignore 1970-01-01 08:00:00.000000000 +0800 +@@ -1,17 +0,0 @@ +-# See http://help.github.com/ignore-files/ for more about ignoring files. +- +-# compiled output +-/dist +-/tmp +- +-# dependencies +-/node_modules +-/bower_components +- +-# misc +-/.sass-cache +-/connect.lock +-/coverage/* +-/libpeerconnection.log +-npm-debug.log +-testem.log +diff -Naur ambari-release-2.7.6-origin/contrib/views/files/src/main/resources/ui/.gitignore apache-ambari-2.7.6-change/contrib/views/files/src/main/resources/ui/.gitignore +--- ambari-release-2.7.6-origin/contrib/views/files/src/main/resources/ui/.gitignore 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/views/files/src/main/resources/ui/.gitignore 1970-01-01 08:00:00.000000000 +0800 +@@ -1,43 +0,0 @@ +-# See http://help.github.com/ignore-files/ for more about ignoring files. +- +-# compiled output +-/dist +-/tmp +- +-# dependencies +-/node_modules +-/bower_components +-node/ +- +-# misc +-/.sass-cache +-/connect.lock +-/coverage/* +-/libpeerconnection.log +-npm-debug.log +-testem.log +- +-/.idea +- +-# Numerous always-ignore extensions +-*.diff +-*.err +-*.orig +-*.log +-*.rej +-*.swo +-*.swp +-*.vi +-*~ +-*.sass-cache +- +-# OS or Editor folders +-.DS_Store +-.cache +-.project +-.settings +-.tmproj +-dist +-nbproject +-Thumbs.db +- +diff -Naur ambari-release-2.7.6-origin/contrib/views/pig/src/main/resources/ui/pig-web/.gitignore apache-ambari-2.7.6-change/contrib/views/pig/src/main/resources/ui/pig-web/.gitignore +--- ambari-release-2.7.6-origin/contrib/views/pig/src/main/resources/ui/pig-web/.gitignore 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/views/pig/src/main/resources/ui/pig-web/.gitignore 1970-01-01 08:00:00.000000000 +0800 +@@ -1,34 +0,0 @@ +-# Numerous always-ignore extensions +-*.diff +-*.err +-*.orig +-*.log +-*.rej +-*.swo +-*.swp +-*.vi +-*~ +-*.sass-cache +- +-# OS or Editor folders +-.DS_Store +-.cache +-.project +-.settings +-.tmproj +-nbproject +-Thumbs.db +- +-# NPM packages folder. +-node_modules/ +- +-bower_components/ +- +-node/ +- +-# Brunch folder for temporary files. +-tmp/ +- +-public/ +- +-_generators/ +\ 文件尾没有换行符 +diff -Naur ambari-release-2.7.6-origin/contrib/views/wfmanager/.gitignore apache-ambari-2.7.6-change/contrib/views/wfmanager/.gitignore +--- ambari-release-2.7.6-origin/contrib/views/wfmanager/.gitignore 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/views/wfmanager/.gitignore 1970-01-01 08:00:00.000000000 +0800 +@@ -1,20 +0,0 @@ +-# Numerous always-ignore extensions +-*.swp +-*.bak +-*.log +-*.patch +- +-# OS or Editor folders +-.DS_Store +- +-# Installation and build tools +-src/main/resources/ui/node/ +-src/main/resources/ui/node_modules/ +-src/main/resources/ui/bower_components/ +-_generators/ +- +-# Output directory +-src/main/resources/ui/dist/ +- +-# Brunch folder for temporary files. +-src/main/resources/ui/tmp/ +diff -Naur ambari-release-2.7.6-origin/contrib/views/wfmanager/src/main/resources/ui/externaladdons/hdfs-directory-viewer/.gitignore apache-ambari-2.7.6-change/contrib/views/wfmanager/src/main/resources/ui/externaladdons/hdfs-directory-viewer/.gitignore +--- ambari-release-2.7.6-origin/contrib/views/wfmanager/src/main/resources/ui/externaladdons/hdfs-directory-viewer/.gitignore 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/contrib/views/wfmanager/src/main/resources/ui/externaladdons/hdfs-directory-viewer/.gitignore 1970-01-01 08:00:00.000000000 +0800 +@@ -1,17 +0,0 @@ +-# See http://help.github.com/ignore-files/ for more about ignoring files. +- +-# compiled output +-/dist +-/tmp +- +-# dependencies +-/node_modules +-/bower_components +- +-# misc +-/.sass-cache +-/connect.lock +-/coverage/* +-/libpeerconnection.log +-npm-debug.log +-testem.log +diff -Naur ambari-release-2.7.6-origin/dev-support/config-utils/diff_stack_properties.py apache-ambari-2.7.6-change/dev-support/config-utils/diff_stack_properties.py +--- ambari-release-2.7.6-origin/dev-support/config-utils/diff_stack_properties.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/dev-support/config-utils/diff_stack_properties.py 2022-07-11 00:52:36.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/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 @@ + """ 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 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 @@ + 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 -Naur ambari-release-2.7.6-origin/dev-support/docker/docker/bin/ambaribuild.py apache-ambari-2.7.6-change/dev-support/docker/docker/bin/ambaribuild.py +--- ambari-release-2.7.6-origin/dev-support/docker/docker/bin/ambaribuild.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/dev-support/docker/docker/bin/ambaribuild.py 2022-07-11 00:52:36.000000000 +0800 +@@ -1,5 +1,4 @@ + #!/usr/bin/python +-# coding: utf-8 + # Licensed under the Apache License, Version 2.0 (the "License"); + # you may not use this file except in compliance with the License. + # You may obtain a copy of the License at +@@ -90,7 +89,7 @@ + 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 +132,9 @@ + + # 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 +204,7 @@ + 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 +226,8 @@ + 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 +260,7 @@ + + 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 -Naur ambari-release-2.7.6-origin/dev-support/docker/docker/bin/test/ambaribuild_test.py apache-ambari-2.7.6-change/dev-support/docker/docker/bin/test/ambaribuild_test.py +--- ambari-release-2.7.6-origin/dev-support/docker/docker/bin/test/ambaribuild_test.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/dev-support/docker/docker/bin/test/ambaribuild_test.py 2022-07-11 00:52:36.000000000 +0800 +@@ -1,5 +1,4 @@ + #!/usr/bin/python +-# coding: utf-8 + # Licensed under the Apache License, Version 2.0 (the "License"); + # you may not use this file except in compliance with the License. + # You may obtain a copy of the License at +diff -Naur ambari-release-2.7.6-origin/.gitattributes apache-ambari-2.7.6-change/.gitattributes +--- ambari-release-2.7.6-origin/.gitattributes 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/.gitattributes 1970-01-01 08:00:00.000000000 +0800 +@@ -1 +0,0 @@ +-* text=auto +diff -Naur ambari-release-2.7.6-origin/.github/PULL_REQUEST_TEMPLATE.md apache-ambari-2.7.6-change/.github/PULL_REQUEST_TEMPLATE.md +--- ambari-release-2.7.6-origin/.github/PULL_REQUEST_TEMPLATE.md 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/.github/PULL_REQUEST_TEMPLATE.md 1970-01-01 08:00:00.000000000 +0800 +@@ -1,10 +0,0 @@ +-## What changes were proposed in this pull request? +- +-(Please fill in changes proposed in this fix) +- +-## How was this patch tested? +- +-(Please explain how this patch was tested. Ex: unit tests, manual tests) +-(If this patch involves UI changes, please attach a screen-shot; otherwise, remove this) +- +-Please review [Ambari Contributing Guide](https://cwiki.apache.org/confluence/display/AMBARI/How+to+Contribute) before opening a pull request. +\ 文件尾没有换行符 +diff -Naur ambari-release-2.7.6-origin/.gitignore apache-ambari-2.7.6-change/.gitignore +--- ambari-release-2.7.6-origin/.gitignore 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/.gitignore 1970-01-01 08:00:00.000000000 +0800 +@@ -1,34 +0,0 @@ +-.classpath +-.project +-.settings +-.idea/ +-.iml/ +-.DS_Store +-**/target/ +-/ambari-server/derby.log +-/ambari-server/pass.txt +-/ambari-web/npm-debug.log +-/ambari-web/public/ +-/ambari-web/node_modules/ +-/ambari-web/node/ +-*.pyc +-*.py~ +-**/*.iml +-.hg +-.hgignore +-.hgtags +-derby.log +-pass.txt +-ambari-agent/src/test/python/ambari_agent/dummy_files/current-stack +-velocity.log* +-ambari-metrics/ambari-metrics-host-monitoring/src/main/python/psutil/build/ +-rebel.xml +-rebel-remote.xml +-out +-createDDL.jdbc +-/contrib/views/storm/src/main/resources/ui/node_modules/ +-/contrib/views/storm/src/main/resources/ui/public/ +-/contrib/views/storm/src/main/resources/ui/npm-debug.log +-/dist +-/build +-ambari_python.egg-info +diff -Naur ambari-release-2.7.6-origin/pom.xml apache-ambari-2.7.6-change/pom.xml +--- ambari-release-2.7.6-origin/pom.xml 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/pom.xml 2022-07-09 21:42:35.000000000 +0800 +@@ -445,7 +445,7 @@ + + + ambari-serviceadvisor +- ambari-web ++ ambari-web + ambari-project + ambari-views + ambari-admin +@@ -467,7 +467,7 @@ + + + ambari-serviceadvisor +- ambari-web ++ ambari-web + ambari-project + ambari-views + ambari-admin +@@ -501,7 +501,7 @@ + + + +- ambari-web ++ ambari-web + ambari-project + ambari-views + ambari-admin +@@ -535,7 +535,7 @@ + + + ambari-serviceadvisor +- ambari-web ++ ambari-web + ambari-project + ambari-views + ambari-admin +diff -Naur ambari-release-2.7.6-origin/setup.py apache-ambari-2.7.6-change/setup.py +--- ambari-release-2.7.6-origin/setup.py 2021-11-11 20:07:58.000000000 +0800 ++++ apache-ambari-2.7.6-change/setup.py 2022-07-11 00:52:29.000000000 +0800 +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + ''' + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file +@@ -51,7 +51,7 @@ + __version__ = "3.0.0.dev0" + def get_version(): + ambari_version = os.environ["AMBARI_VERSION"] if "AMBARI_VERSION" in os.environ else __version__ +- print ambari_version ++ print(ambari_version) + return ambari_version + + """ +@@ -87,3 +87,4 @@ + long_description="The Apache Ambari project is aimed at making Hadoop management simpler by developing software for provisioning, managing, and monitoring Apache Hadoop clusters. " + "Ambari provides an intuitive, easy-to-use Hadoop management web UI backed by its RESTful APIs." + ) ++ diff --git a/README.md b/README.md index 8e29f3d8082cae5e1d76e3bc2f174749ae966c69..22856eede4fc7b7e43be683dafce1059e7619a5d 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,8 @@ # ambari #### 介绍 -Apache Ambari is a tool for provisioning, managing, and monitoring Apache Hadoop clusters. +Apache Ambari是一种基于Web的工具,支持Apache Hadoop集群的供应、管理和监控。Ambari已支持大多数Hadoop组件,包括HDFS、MapReduce、Hive、Pig、 Hbase、Zookeeper、Sqoop和Hcatalog等。 +Apache Ambari 支持HDFS、MapReduce、Hive、Pig、Hbase、Zookeepr、Sqoop和Hcatalog等的集中管理。也是5个顶级hadoop管理工具之一。 #### 软件架构 软件架构说明 @@ -9,15 +10,14 @@ Apache Ambari is a tool for provisioning, managing, and monitoring Apache Hadoop #### 安装教程 -1. xxxx -2. xxxx -3. xxxx +1. 使用yum安装rpm包 +2. 在/opt/ambari目录下找到ambari-server和ambari-agent +3. 选择需要的模块进行安装 #### 使用说明 -1. xxxx -2. xxxx -3. xxxx +1. 安装完毕后使用ambari-setver setup进行初始设定 +2. 使用ambari-agent start启动agent端 #### 参与贡献 diff --git a/ambari.spec b/ambari.spec new file mode 100644 index 0000000000000000000000000000000000000000..1d6004ea380e279e0ddd15d0845556b1d5fc9ab2 --- /dev/null +++ b/ambari.spec @@ -0,0 +1,109 @@ +%define __jar_repack %{nil} + +%global debug_package %{nil} + +%global compile_for_local 0 + +%global with_debug 0 + +%global with_tests 0 + +Name: ambari +Version: 2.7.6 +Release: 1 +Summary: Ambari Main +License: Apache 2.0 +Vendor: Apache Software Foundation +URL: https://ambari.apache.org +Source0: https://github.com/apache/ambari/archive/refs/tags/release-2.7.6.tar.gz +Source1: settings.xml +Source2: node-v4.5.0-linux-arm64.tar.gz +Source3: node-v4.5.0-linux-x64.tar.gz +Source4: yarn-v0.23.2.tar.gz +Source5: phantomjs-2.1.1-linux-x86_64.tar.bz2 +Source6: phantomjs-1.9.8-linux-x86_64.tar.bz2 +Source7: https://repo.hortonworks.com/content/repositories/releases/org/apache/storm/storm-core/0.10.0.2.3.0.0-2557/storm-core-0.10.0.2.3.0.0-2557.jar +Source8: storm-core-0.10.0.2.3.0.0-2557.pom +Source9: storm-0.10.0.2.3.0.0-2557.pom +Source10: https://repo.hortonworks.com/content/repositories/releases/org/apache/hadoop/hadoop-auth/2.7.1.2.3.0.0-2557/hadoop-auth-2.7.1.2.3.0.0-2557.jar +Source11: hadoop-auth-2.7.1.2.3.0.0-2557.pom +Source12: hadoop-project-2.7.1.2.3.0.0-2557.pom +Source13: hadoop-main-2.7.1.2.3.0.0-2557.pom +Source14: https://repo.hortonworks.com/repository/released_old/org/apache/zookeeper/zookeeper/3.4.6.2.3.0.0-2557/zookeeper-3.4.6.2.3.0.0-2557.jar +Source15: zookeeper-3.4.6.2.3.0.0-2557.pom +Source16: node-v8.6.0-linux-x64.tar.gz +Source17: yarn-v1.1.0.tar.gz +Source18: node-v8.6.0-linux-arm64.tar.gz +Source19: webresource.tar.gz + +Patch0: 0001-init.patch + +Group: Development +Packager: Apache Software Foundation +BuildRequires: java-1.8.0-openjdk-devel +BuildRequires: maven +BuildRequires: python3-devel +Requires: java-1.8.0-openjdk +Requires: postgresql-server >= 8.1 +Requires: openssl + +autoprov: yes +autoreq: yes + +%description +Apache Ambari is a tool for provisioning, managing, and monitoring Apache Hadoop clusters. Ambari consists of a set of RESTful APIs and a browser-based management interface. + +%prep +%autosetup -p1 -n ambari-release-%{version} +tar -zxvf %{SOURCE19} + +%build +cp %{SOURCE1} ./settings.xml +mkdir -p /home/abuild/.m2/repository/com/github/eirslett/node/4.5.0/ +mkdir -p /home/abuild/.m2/repository/com/github/eirslett/node/8.6.0/ +mkdir -p /tmp/npm_config_tmp/phantomjs/ +mkdir -p /home/abuild/rpmbuild/BUILD/apache-ambari-2.7.6/ambari-infra/ambari-infra-solr-client/target/migrate/ +mkdir -p /home/abuild/.m2/repository/com/github/eirslett/yarn/0.23.2/yarn-0.23.2./ +mkdir -p /home/abuild/.m2/repository/org/apache/storm/storm-core/0.10.0.2.3.0.0-2557/ +mkdir -p /home/abuild/.m2/repository/org/apache/storm/storm/0.10.0.2.3.0.0-2557/ +mkdir -p /home/abuild/.m2/repository/org/apache/hadoop/hadoop-auth/2.7.1.2.3.0.0-2557/ +mkdir -p /home/abuild/.m2/repository/org/apache/hadoop/hadoop-project/2.7.1.2.3.0.0-2557/ +mkdir -p /home/abuild/.m2/repository/org/apache/hadoop/hadoop-main/2.7.1.2.3.0.0-2557/ +mkdir -p /home/abuild/.m2/repository/org/apache/zookeeper/zookeeper/3.4.6.2.3.0.0-2557/ +mkdir -p /home/abuild/.m2/repository/com/github/eirslett/yarn/1.1.0/ +mkdir -p /tmp/logsearch_npm_config_tmp/phantomjs/ +cp %{SOURCE2} /home/abuild/.m2/repository/com/github/eirslett/node/4.5.0/node-4.5.0-linux-arm64.tar.gz +cp %{SOURCE3} /home/abuild/.m2/repository/com/github/eirslett/node/4.5.0/node-4.5.0-linux-x64.tar.gz +cp %{SOURCE4} /home/abuild/.m2/repository/com/github/eirslett/yarn/0.23.2/yarn-0.23.2./yarn-v0.23.2.tar.gz +cp %{SOURCE5} /tmp/npm_config_tmp/phantomjs/phantomjs-2.1.1-linux-x86_64.tar.bz2 +cp %{SOURCE5} /tmp/logsearch_npm_config_tmp/phantomjs/phantomjs-2.1.1-linux-x86_64.tar.bz2 +cp %{SOURCE6} /tmp/npm_config_tmp/phantomjs/phantomjs-1.9.8-linux-x86_64.tar.bz2 +cp %{SOURCE7} /home/abuild/.m2/repository/org/apache/storm/storm-core/0.10.0.2.3.0.0-2557/storm-core-0.10.0.2.3.0.0-2557.jar +cp %{SOURCE8} /home/abuild/.m2/repository/org/apache/storm/storm-core/0.10.0.2.3.0.0-2557/storm-core-0.10.0.2.3.0.0-2557.pom +cp %{SOURCE9} /home/abuild/.m2/repository/org/apache/storm/storm/0.10.0.2.3.0.0-2557/storm-0.10.0.2.3.0.0-2557.pom +cp %{SOURCE10} /home/abuild/.m2/repository/org/apache/hadoop/hadoop-auth/2.7.1.2.3.0.0-2557/hadoop-auth-2.7.1.2.3.0.0-2557.jar +cp %{SOURCE11} /home/abuild/.m2/repository/org/apache/hadoop/hadoop-auth/2.7.1.2.3.0.0-2557/hadoop-auth-2.7.1.2.3.0.0-2557.pom +cp %{SOURCE12} /home/abuild/.m2/repository/org/apache/hadoop/hadoop-project/2.7.1.2.3.0.0-2557/hadoop-project-2.7.1.2.3.0.0-2557.pom +cp %{SOURCE13} /home/abuild/.m2/repository/org/apache/hadoop/hadoop-main/2.7.1.2.3.0.0-2557/hadoop-main-2.7.1.2.3.0.0-2557.pom +cp %{SOURCE14} /home/abuild/.m2/repository/org/apache/zookeeper/zookeeper/3.4.6.2.3.0.0-2557/zookeeper-3.4.6.2.3.0.0-2557.pom +cp %{SOURCE15} /home/abuild/.m2/repository/org/apache/zookeeper/zookeeper/3.4.6.2.3.0.0-2557/zookeeper-3.4.6.2.3.0.0-2557.jar +cp %{SOURCE16} /home/abuild/.m2/repository/com/github/eirslett/node/8.6.0/node-8.6.0-linux-x64.tar.gz +cp %{SOURCE17} /home/abuild/.m2/repository/com/github/eirslett/yarn/1.1.0/yarn-1.1.0.tar.gz + +%install +mkdir -p %{buildroot}/opt/ambari +sysVer="aarch64" +if [ "$(uname -m)" = ${sysVer} ]; +then + cp %{SOURCE18} /home/abuild/.m2/repository/com/github/eirslett/node/8.6.0/node-8.6.0-linux-arm64.tar.gz +fi +mvn -B clean install package rpm:rpm -s settings.xml -DskipTests -Dmaven.test.skip=true -Drat.skip=true +cp -rf ./ambari-server/target/rpm/ambari-server/RPMS/x86_64 %{buildroot}/opt/ambari/ambari-server +cp -rf ./ambari-agent/target/rpm/ambari-agent/RPMS/x86_64 %{buildroot}/opt/ambari/ambari-agent + +%files +/opt + +%changelog +* Wed Jul 13 2022 jhu <2416510131@qq.com> - 2.7.6-1 +- Init package \ No newline at end of file diff --git a/hadoop-auth-2.7.1.2.3.0.0-2557.jar b/hadoop-auth-2.7.1.2.3.0.0-2557.jar new file mode 100644 index 0000000000000000000000000000000000000000..90f736c21836ca5c33660df67b288649ef53c3b2 Binary files /dev/null and b/hadoop-auth-2.7.1.2.3.0.0-2557.jar differ diff --git a/hadoop-auth-2.7.1.2.3.0.0-2557.pom b/hadoop-auth-2.7.1.2.3.0.0-2557.pom new file mode 100644 index 0000000000000000000000000000000000000000..8f07e52e7e881fa9dbda20ebd9f465045f86b3e5 --- /dev/null +++ b/hadoop-auth-2.7.1.2.3.0.0-2557.pom @@ -0,0 +1,251 @@ + + + + 4.0.0 + + org.apache.hadoop + hadoop-project + 2.7.1.2.3.0.0-2557 + ../../hadoop-project + + org.apache.hadoop + hadoop-auth + 2.7.1.2.3.0.0-2557 + jar + + Apache Hadoop Auth + Apache Hadoop Auth - Java HTTP SPNEGO + + + yyyyMMdd + + + + + + org.apache.hadoop + hadoop-annotations + provided + + + junit + junit + test + + + org.mockito + mockito-all + test + + + org.mortbay.jetty + jetty-util + test + + + org.mortbay.jetty + jetty-util + test + + + org.mortbay.jetty + jetty + test + + + org.apache.tomcat.embed + tomcat-embed-core + test + + + org.apache.tomcat.embed + tomcat-embed-logging-juli + test + + + javax.servlet + servlet-api + provided + + + org.slf4j + slf4j-api + compile + + + commons-codec + commons-codec + compile + + + log4j + log4j + runtime + + + org.slf4j + slf4j-log4j12 + runtime + + + org.apache.hadoop + hadoop-minikdc + test + + + org.apache.httpcomponents + httpclient + compile + + + org.apache.directory.server + apacheds-kerberos-codec + compile + + + org.apache.directory.api + api-asn1-ber + + + org.apache.directory.api + api-i18n + + + org.apache.directory.api + api-ldap-model + + + net.sf.ehcache + ehcache-core + + + + + org.apache.zookeeper + zookeeper + + + org.apache.curator + curator-framework + + + org.apache.curator + curator-test + test + + + + + + + org.apache.maven.plugins + maven-source-plugin + + + prepare-package + + jar + + + + + true + + + + org.apache.maven.plugins + maven-jar-plugin + + + prepare-jar + prepare-package + + jar + + + + prepare-test-jar + prepare-package + + test-jar + + + + + + org.codehaus.mojo + findbugs-maven-plugin + + ${basedir}/dev-support/findbugsExcludeFile.xml + + + + + + + + docs + + false + + + + + org.apache.maven.plugins + maven-site-plugin + + + package + + site + + + + + + org.apache.maven.plugins + maven-project-info-reports-plugin + + + + false + + package + + dependencies + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + + + package + + javadoc + + + + + + + + + diff --git a/hadoop-main-2.7.1.2.3.0.0-2557.pom b/hadoop-main-2.7.1.2.3.0.0-2557.pom new file mode 100644 index 0000000000000000000000000000000000000000..39b3410ceb776522b7d60c85a498ece8ff7a9334 --- /dev/null +++ b/hadoop-main-2.7.1.2.3.0.0-2557.pom @@ -0,0 +1,510 @@ + + + + 4.0.0 + org.apache.hadoop + hadoop-main + 2.7.1.2.3.0.0-2557 + Apache Hadoop Main + Apache Hadoop Main + pom + + + + + com.cenqua.clover + clover + + 3.0.2 + + + + + + + ${distMgmtStagingId} + ${distMgmtStagingName} + ${distMgmtStagingUrl} + + + ${distMgmtSnapshotsId} + ${distMgmtSnapshotsName} + ${distMgmtSnapshotsUrl} + + + apache.website + scpexe://people.apache.org/www/hadoop.apache.org/docs/r${project.version} + + + + + + ${distMgmtSnapshotsId} + ${distMgmtSnapshotsName} + ${distMgmtSnapshotsUrl} + + + repository.jboss.org + http://repository.jboss.org/nexus/content/groups/public/ + + false + + + + + + + Apache License, Version 2.0 + http://www.apache.org/licenses/LICENSE-2.0.txt + + + + + Apache Software Foundation + http://www.apache.org + + + + apache.snapshots.https + Apache Development Snapshot Repository + https://repository.apache.org/content/repositories/snapshots + apache.staging.https + Apache Release Distribution Repository + https://repository.apache.org/service/local/staging/deploy/maven2 + + + UTF-8 + UTF-8 + + + 2.8.1 + 3.4 + 1.7 + 2.4 + 2.8 + 1.3.1 + 2.9.1 + 0.10 + 1.0 + 3.3.0 + 2.5.0 + + + + hadoop-project + hadoop-project-dist + hadoop-assemblies + hadoop-maven-plugins + hadoop-common-project + hadoop-hdfs-project + hadoop-yarn-project + hadoop-mapreduce-project + hadoop-tools + hadoop-client + hadoop-minicluster + hadoop-dist + + + + + + + org.apache.maven.plugins + maven-dependency-plugin + ${maven-dependency-plugin.version} + + + org.apache.maven.plugins + maven-enforcer-plugin + ${maven-enforcer-plugin.version} + + + + [3.0.2,) + + + [1.7,) + + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven-assembly-plugin.version} + + + org.apache.maven.plugins + maven-deploy-plugin + ${maven-deploy-plugin.version} + + + org.apache.rat + apache-rat-plugin + ${apache-rat-plugin.version} + + + org.apache.maven.plugins + maven-antrun-plugin + ${maven-antrun-plugin.version} + + + org.apache.maven.plugins + maven-site-plugin + ${maven-site-plugin.version} + + + org.apache.maven.wagon + wagon-ssh + ${wagon-ssh.version} + + + + + com.atlassian.maven.plugins + maven-clover2-plugin + ${maven-clover2-plugin.version} + + + org.apache.felix + maven-bundle-plugin + ${maven-bundle-plugin.version} + + + + + + + org.apache.maven.plugins + maven-enforcer-plugin + false + + + clean + + enforce + + pre-clean + + + default + + enforce + + validate + + + site + + enforce + + pre-site + + + + + org.apache.rat + apache-rat-plugin + + + .gitattributes + .gitignore + .git/** + .idea/** + **/build/** + + + + + maven-site-plugin + + + attach-descriptor + + attach-descriptor + + + true + + + + + + org.apache.felix + maven-bundle-plugin + true + true + + + + + + true + + + org.apache.maven.plugins + maven-javadoc-plugin + ${maven-javadoc-plugin.version} + false + + + aggregate + + 1024m + true + true + false + ${maven.compile.source} + ${maven.compile.encoding} + ${project.build.directory}/site + hadoop-project/api + + org.apache.hadoop.authentication*,org.apache.hadoop.hdfs*,org.apache.hadoop.mapreduce.v2.proto,org.apache.hadoop.yarn.proto,org.apache.hadoop.yarn.server*,org.apache.hadoop.yarn.webapp* + + + Common + org.apache.hadoop* + + + MapReduce + org.apache.hadoop.mapred* + + + YARN + org.apache.hadoop.yarn* + + + org.apache.hadoop.classification.tools.IncludePublicAnnotationsStandardDoclet + + + org.apache.hadoop + hadoop-annotations + ${project.version} + + + true + + + false + + + + org.apache.hadoop:hadoop-annotations + + + + + aggregate + + + + + + + org.apache.maven.plugins + maven-dependency-plugin + ${maven-dependency-plugin.version} + + + + analyze-report + + + + + + + + + + src + + false + + + + + org.apache.maven.plugins + maven-assembly-plugin + false + + + src-dist + package + + single + + + false + false + hadoop-${project.version}-src + hadoop-dist/target + + + + hadoop-assemblies/src/main/resources/assemblies/hadoop-src.xml + + + + + + + org.apache.maven.plugins + maven-antrun-plugin + false + + + src-dist-msg + package + + run + + + + + Hadoop source tar available at: ${basedir}/hadoop-dist/target/hadoop-${project.version}-src.tar.gz + + + + + + + + + + + + dist + + + + + org.apache.maven.plugins + maven-javadoc-plugin + false + + + + default-cli + + aggregate + + + hadoop-common-project/hadoop-common/src/main/java/overview.html + + + + + + + + + sign + + + + org.apache.maven.plugins + maven-gpg-plugin + + + sign-artifacts + verify + + sign + + + + + + + + + clover + + false + + clover + + + + ${user.home}/.clover.license + ${project.build.directory}/clover/hadoop-coverage.db + + true + true + true + false + + + + + com.atlassian.maven.plugins + maven-clover2-plugin + + false + true + ${cloverLicenseLocation} + ${cloverDatabase} + 50% + ${project.build.directory}/clover + ${cloverAlwaysReport} + ${cloverGenHtml} + ${cloverGenXml} + ${cloverGenHistorical} + + **/examples/**/*.java + **/hamlet/*.java + **/ha/proto/*.java + **/protocol/proto/*.java + **/compiler/generated/*.java + **/protobuf/*.java + **/v2/proto/*.java + **/yarn/proto/*.java + **/security/proto/*.java + **/tools/proto/*.java + **/hs/proto/*.java + + + + + clover-setup + process-sources + + setup + + + + clover + test + + clover + + + + + + + + + diff --git a/hadoop-project-2.7.1.2.3.0.0-2557.pom b/hadoop-project-2.7.1.2.3.0.0-2557.pom new file mode 100644 index 0000000000000000000000000000000000000000..81626820cb2542a79fe4e635d72816879f7c2aef --- /dev/null +++ b/hadoop-project-2.7.1.2.3.0.0-2557.pom @@ -0,0 +1,1332 @@ + + + + 4.0.0 + + org.apache.hadoop + hadoop-main + 2.7.1.2.3.0.0-2557 + + org.apache.hadoop + hadoop-project + 2.7.1.2.3.0.0-2557 + Apache Hadoop Project POM + Apache Hadoop Project POM + pom + + + false + true + + _ + _ + + + 4 + + + + 1.0.9 + + 2.11.0 + + ${project.version} + + 1.0.13 + + ${project.build.directory}/test-dir + ${test.build.dir} + + + + ${basedir}/../../hadoop-common-project/hadoop-common/target + file:///dev/urandom + + + 1.7.4 + + + 1.9 + + + 1.9.13 + 2.2.3 + + + + 2.5.0 + ${env.HADOOP_PROTOC_PATH} + + 3.4.6.2.3.0.0-2557 + 2.7.1 + 3.0.0 + + 6.0.44 + + + 1.7 + + + + [${javac.version},) + [3.0.2,) + + + -Xmx4096m -XX:MaxPermSize=768m -XX:+HeapDumpOnOutOfMemoryError + 2.17 + ${maven-surefire-plugin.version} + ${maven-surefire-plugin.version} + + 2.5 + 3.1 + 2.5.1 + 2.6 + 2.5 + 2.4 + 2.3 + 2.12.1 + 2.7 + 1.2 + 1.9 + 1.3.1 + 1.0-beta-1 + 1.0-alpha-8 + + + + + + jdiff + jdiff + ${jdiff.version} + + + org.apache.hadoop + hadoop-assemblies + ${project.version} + + + org.apache.hadoop + hadoop-annotations + ${project.version} + + + org.apache.hadoop + hadoop-common + ${project.version} + + + org.apache.hadoop + hadoop-common + ${project.version} + test-jar + + + org.apache.hadoop + hadoop-auth + ${project.version} + + + org.apache.hadoop + hadoop-auth + ${project.version} + test-jar + + + org.apache.hadoop + hadoop-nfs + ${project.version} + + + org.apache.hadoop + hadoop-hdfs + ${project.version} + + + org.apache.hadoop + hadoop-hdfs + ${project.version} + test-jar + + + org.apache.hadoop + hadoop-mapreduce-client-app + ${project.version} + + + org.apache.hadoop + hadoop-mapreduce-client-app + ${project.version} + test-jar + + + org.apache.hadoop + hadoop-mapreduce-client-common + ${project.version} + + + org.apache.hadoop + hadoop-yarn-api + ${project.version} + + + + org.apache.hadoop + hadoop-yarn-client + ${project.version} + + + + org.apache.hadoop + hadoop-mapreduce-client-core + ${project.version} + + + + org.apache.hadoop + hadoop-mapreduce-client-jobclient + ${project.version} + + + + org.apache.hadoop + hadoop-mapreduce-client-shuffle + ${project.version} + + + + org.apache.hadoop + hadoop-yarn + ${project.version} + pom + + + + org.apache.hadoop + hadoop-yarn-server + ${project.version} + + + + org.apache.hadoop + hadoop-yarn-server-web-proxy + ${project.version} + + + + org.apache.hadoop + hadoop-yarn-server-common + ${project.version} + + + + org.apache.hadoop + hadoop-yarn-server-tests + ${project.version} + test-jar + + + + org.apache.hadoop + hadoop-yarn-common + ${project.version} + + + org.apache.hadoop + hadoop-yarn-common + ${project.version} + test-jar + + + + org.apache.hadoop + hadoop-yarn-registry + ${project.version} + + + org.apache.hadoop + hadoop-yarn-server-nodemanager + ${project.version} + + + org.apache.hadoop + hadoop-yarn-server-resourcemanager + ${project.version} + + + org.apache.hadoop + hadoop-yarn-server-resourcemanager + ${project.version} + test-jar + + + + org.apache.hadoop + hadoop-yarn-applications-distributedshell + ${project.version} + + + + org.apache.hadoop + hadoop-mapreduce-client-jobclient + ${project.version} + test-jar + + + + org.apache.hadoop + hadoop-mapreduce-client-hs + ${project.version} + + + + org.apache.hadoop + hadoop-mapreduce-examples + ${project.version} + + + org.apache.hadoop + hadoop-gridmix + ${project.version} + + + + org.apache.hadoop + hadoop-streaming + ${project.version} + + + org.apache.hadoop + hadoop-archives + ${project.version} + + + org.apache.hadoop + hadoop-distcp + ${project.version} + + + org.apache.hadoop + hadoop-datajoin + ${project.version} + + + org.apache.hadoop + hadoop-rumen + ${project.version} + + + org.apache.hadoop + hadoop-extras + ${project.version} + + + org.apache.hadoop + hadoop-ant + ${project.version} + + + + org.apache.hadoop + hadoop-client + ${project.version} + + + org.apache.hadoop + hadoop-minicluster + ${project.version} + + + + org.apache.hadoop + hadoop-minikdc + ${project.version} + + + + org.apache.hadoop + hadoop-openstack + ${project.version} + + + + org.apache.hadoop + hadoop-azure + ${project.version} + + + + org.apache.hadoop + hadoop-aws + ${project.version} + + + + org.apache.hadoop + hadoop-kms + ${project.version} + classes + jar + + + org.apache.hadoop + hadoop-kms + ${project.version} + test-jar + + + + com.google.guava + guava + 11.0.2 + + + com.google.code.gson + gson + 2.2.4 + + + commons-cli + commons-cli + 1.2 + + + org.apache.commons + commons-math3 + 3.1.1 + + + org.apache.commons + commons-compress + 1.4.1 + + + xmlenc + xmlenc + 0.52 + + + commons-httpclient + commons-httpclient + 3.1 + + + org.apache.httpcomponents + httpclient + 4.2.5 + + + org.apache.httpcomponents + httpcore + 4.2.5 + + + commons-codec + commons-codec + 1.4 + + + commons-net + commons-net + 3.1 + + + javax.servlet + servlet-api + 2.5 + + + org.mortbay.jetty + jetty + 6.1.26.hwx + + + org.mortbay.jetty + servlet-api + + + + + org.mortbay.jetty + jetty-util + 6.1.26.hwx + + + org.apache.tomcat.embed + tomcat-embed-core + 7.0.55 + + + org.apache.tomcat.embed + tomcat-embed-logging-juli + 7.0.55 + + + javax.servlet.jsp + jsp-api + 2.1 + + + + org.glassfish + javax.servlet + 3.1 + + + + org.codehaus.plexus + plexus-utils + 2.0.5 + + + org.codehaus.plexus + plexus-component-annotations + 1.5.5 + + + + asm + asm + 3.2 + + + com.sun.jersey + jersey-core + ${jersey.version} + + + com.sun.jersey + jersey-json + ${jersey.version} + + + stax + stax-api + + + + + com.sun.jersey + jersey-server + ${jersey.version} + + + + com.google.inject + guice + 3.0 + + + + cglib + cglib + 2.2 + + + + com.google.inject.extensions + guice-servlet + 3.0 + + + + com.sun.jersey.contribs + jersey-guice + ${jersey.version} + + + + com.sun.jersey.jersey-test-framework + jersey-test-framework-core + ${jersey.version} + test + + + com.sun.jersey.jersey-test-framework + jersey-test-framework-grizzly2 + ${jersey.version} + + + + io.netty + netty + 3.6.2.Final + + + + io.netty + netty-all + 4.0.23.Final + + + + commons-io + commons-io + 2.4 + + + + org.mortbay.jetty + jetty-servlet-tester + 6.1.26.hwx + + + commons-logging + commons-logging + 1.1.3 + + + avalon-framework + avalon-framework + + + logkit + logkit + + + javax.servlet + servlet-api + + + + + commons-logging + commons-logging-api + 1.1 + + + log4j + log4j + 1.2.17 + + + com.sun.jdmk + jmxtools + + + com.sun.jmx + jmxri + + + javax.mail + mail + + + javax.jms + jmx + + + javax.jms + jms + + + + + net.java.dev.jets3t + jets3t + 0.9.0 + + + com.amazonaws + aws-java-sdk + 1.7.4 + + + org.apache.mina + mina-core + 2.0.0-M5 + + + org.apache.ftpserver + ftplet-api + 1.0.0 + + + org.apache.ftpserver + ftpserver-core + 1.0.0 + + + org.apache.ftpserver + ftpserver-deprecated + 1.0.0-M2 + + + junit + junit + 4.11 + + + commons-lang + commons-lang + 2.6 + + + commons-collections + commons-collections + 3.2.1 + + + commons-configuration + commons-configuration + 1.6 + + + org.slf4j + slf4j-api + 1.7.10 + + + org.slf4j + slf4j-log4j12 + 1.7.10 + + + org.slf4j + jul-to-slf4j + 1.7.10 + + + org.eclipse.jdt + core + 3.1.1 + + + oro + oro + 2.0.8 + + + org.codehaus.jackson + jackson-mapper-asl + ${jackson.version} + + + org.codehaus.jackson + jackson-core-asl + ${jackson.version} + + + org.codehaus.jackson + jackson-jaxrs + ${jackson.version} + + + org.codehaus.jackson + jackson-xc + ${jackson.version} + + + com.fasterxml.jackson.core + jackson-core + ${jackson2.version} + + + com.fasterxml.jackson.core + jackson-databind + ${jackson2.version} + + + com.fasterxml.jackson.core + jackson-annotations + ${jackson2.version} + + + org.mockito + mockito-all + 1.8.5 + + + org.apache.avro + avro + ${avro.version} + + + net.sf.kosmosfs + kfs + 0.3 + + + org.apache.ant + ant + 1.8.1 + + + com.google.protobuf + protobuf-java + ${protobuf.version} + + + commons-daemon + commons-daemon + ${commons-daemon.version} + + + com.jcraft + jsch + 0.1.42 + + + org.apache.htrace + htrace-core + 3.1.0-incubating + + + org.jdom + jdom + 1.1 + + + com.googlecode.json-simple + json-simple + 1.1 + + + + org.apache.zookeeper + zookeeper + ${zookeeper.version} + + + + junit + junit + + + com.sun.jdmk + jmxtools + + + com.sun.jmx + jmxri + + + org.jboss.netty + netty + + + + + org.apache.zookeeper + zookeeper + ${zookeeper.version} + test-jar + + + org.jboss.netty + netty + + + jline + jline + + + + + org.apache.bookkeeper + bookkeeper-server + 4.2.3 + compile + + + org.hsqldb + hsqldb + 2.0.0 + + + com.codahale.metrics + metrics-core + 3.0.1 + + + org.apache.hadoop + hadoop-sls + ${project.version} + + + com.google.code.findbugs + jsr305 + ${findbugs.version} + + + javax.xml.bind + jaxb-api + 2.2.2 + + + org.codehaus.jettison + jettison + 1.1 + + + stax + stax-api + + + + + com.sun.jersey + jersey-client + ${jersey.version} + + + + org.glassfish.grizzly + grizzly-http-servlet + 2.1.2 + + + + org.fusesource.leveldbjni + leveldbjni-all + 1.8 + + + + org.apache.directory.server + apacheds-kerberos-codec + 2.0.0-M15 + + + + xerces + xercesImpl + 2.9.1 + + + + org.apache.curator + curator-framework + 2.6.0 + + + org.apache.curator + curator-test + 2.6.0 + + + + org.apache.curator + curator-recipes + ${curator.version} + + + org.apache.curator + curator-client + ${curator.version} + + + org.apache.curator + curator-framework + ${curator.version} + + + org.apache.curator + curator-test + ${curator.version} + + + org.bouncycastle + bcprov-jdk16 + 1.46 + test + + + com.microsoft.azure + azure-storage + 2.2.0 + + + + + + + + + + maven-clean-plugin + ${maven-clean-plugin.version} + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + ${javac.version} + ${javac.version} + + + + org.apache.maven.plugins + maven-dependency-plugin + 2.2 + + + org.codehaus.mojo + build-helper-maven-plugin + ${build-helper-maven-plugin.version} + + + org.apache.maven.plugins + maven-surefire-plugin + ${maven-surefire-plugin.version} + + + org.apache.maven.plugins + maven-install-plugin + ${maven-install-plugin.version} + + + org.apache.maven.plugins + maven-jar-plugin + ${maven-jar-plugin.version} + + + org.apache.maven.plugins + maven-javadoc-plugin + 2.8.1 + + + org.apache.maven.plugins + maven-war-plugin + ${maven-war-plugin.version} + + + org.codehaus.mojo + findbugs-maven-plugin + ${findbugs.version} + + + org.apache.maven.plugins + maven-checkstyle-plugin + ${maven-checkstyle-plugin.version} + + + org.codehaus.mojo + native-maven-plugin + ${native-maven-plugin.version} + + + org.codehaus.mojo + make-maven-plugin + ${make-maven-plugin.version} + + + org.apache.maven.plugins + maven-source-plugin + ${maven-source-plugin.version} + + + org.apache.avro + avro-maven-plugin + ${avro.version} + + + org.apache.maven.plugins + maven-project-info-reports-plugin + ${maven-project-info-reports-plugin.version} + + + org.apache.maven.plugins + maven-resources-plugin + ${maven-resources-plugin.version} + + + org.codehaus.mojo + exec-maven-plugin + ${exec-maven-plugin.version} + + + org.apache.maven.plugins + maven-pdf-plugin + ${maven-pdf-plugin.version} + + + org.apache.hadoop + hadoop-maven-plugins + ${project.version} + + + + + + + org.codehaus.mojo + findbugs-maven-plugin + + + + org.apache.maven.plugins + maven-antrun-plugin + + + create-testdirs + validate + + run + + + + + + + + + + + + org.apache.maven.plugins + maven-enforcer-plugin + false + + + + [3.0.0,) + + + 1.6 + + + + + + clean + + enforce + + pre-clean + + + default + + enforce + + validate + + + site + + enforce + + pre-site + + + + + org.apache.maven.plugins + maven-surefire-plugin + + false + 1800 + -Xms2048m -Xmx3072m -XX:MaxPermSize=2048m -XX:+HeapDumpOnOutOfMemoryError + + + ${hadoop.common.build.dir} + ${env.LD_LIBRARY_PATH}:${project.build.directory}/native/target/usr/local/lib:${hadoop.common.build.dir}/native/target/usr/local/lib + 4 + + + + + + ${test.build.dir} + ${hadoop.tmp.dir} + ${test.build.data} + ${test.build.webapps} + ${test.cache.data} + ${hadoop.log.dir} + ${test.build.classes} + + true + ${basedir}/src/test/resources/krb5.conf + ${java.security.egd} + ${require.test.libhadoop} + + + **/Test*.java + + + **/${test.exclude}.java + ${test.exclude.pattern} + **/Test*$*.java + + + + + org.apache.maven.plugins + maven-pdf-plugin + + ${project.reporting.outputDirectory} + false + + + + org.apache.maven.plugins + maven-enforcer-plugin + + + depcheck + + + + true + + + + + enforce + + verify + + + + + + + + + os.linux + + + !Mac + + + + ${os.name}-${os.arch}-${sun.arch.data.model} + + + + os.mac + + + Mac + + + + Mac_OS_X-${sun.arch.data.model} + + + + native-win + + + Windows + + + + + + + + file:/dev/urandom + true + true + + + + + org.apache.maven.plugins + maven-surefire-plugin + + + + ${env.PATH};${hadoop.common.build.dir}/bin;${snappy.lib} + ${env.PATH};${hadoop.common.build.dir}/bin;${openssl.lib} + + + + + + + + test-patch + + false + + + + + org.apache.maven.plugins + maven-compiler-plugin + + true + ${javac.version} + ${javac.version} + + + 9999 + + + + + + + + dist + + + + org.apache.maven.plugins + maven-javadoc-plugin + + + + module-javadocs + package + + jar + + + ${project.build.directory} + + + + + + org.apache.maven.plugins + maven-source-plugin + + + + hadoop-java-sources + package + + jar-no-fork + test-jar-no-fork + + + + + + org.apache.maven.plugins + maven-enforcer-plugin + + + dist-enforce + package + + enforce + + + + + + + + + diff --git a/node-v4.5.0-linux-arm64.tar.gz b/node-v4.5.0-linux-arm64.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..583d335f3f8c49f6818a0f56c268ce2015707fbc Binary files /dev/null and b/node-v4.5.0-linux-arm64.tar.gz differ diff --git a/node-v4.5.0-linux-x64.tar.gz b/node-v4.5.0-linux-x64.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..3a621941e9667a4e80ed5901c68ef52556024f51 Binary files /dev/null and b/node-v4.5.0-linux-x64.tar.gz differ diff --git a/node-v8.6.0-linux-arm64.tar.gz b/node-v8.6.0-linux-arm64.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..4124706a1c7a69d271fd546f149ec5387fef151d Binary files /dev/null and b/node-v8.6.0-linux-arm64.tar.gz differ diff --git a/node-v8.6.0-linux-x64.tar.gz b/node-v8.6.0-linux-x64.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..c855996a7642035be360c1ba84d1aa2af6d8fcd9 Binary files /dev/null and b/node-v8.6.0-linux-x64.tar.gz differ diff --git a/phantomjs-1.9.8-linux-x86_64.tar.bz2 b/phantomjs-1.9.8-linux-x86_64.tar.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..2543ea75419057e6b6174e17dd1d48d78ae7aace Binary files /dev/null and b/phantomjs-1.9.8-linux-x86_64.tar.bz2 differ diff --git a/phantomjs-2.1.1-linux-x86_64.tar.bz2 b/phantomjs-2.1.1-linux-x86_64.tar.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..0281fb8534cbeb2e01a2f2c1524b845644667616 Binary files /dev/null and b/phantomjs-2.1.1-linux-x86_64.tar.bz2 differ diff --git a/release-2.7.6.tar.gz b/release-2.7.6.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..54954dd8187589d4b71522942d50e074bc53defb Binary files /dev/null and b/release-2.7.6.tar.gz differ diff --git a/settings.xml b/settings.xml new file mode 100644 index 0000000000000000000000000000000000000000..eff3a80092b6e00959e4da123aacd217444c697e --- /dev/null +++ b/settings.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + big + * + huaweicloud + https://repo.huaweicloud.com/repository/maven/ + + + + + diff --git a/storm-0.10.0.2.3.0.0-2557.pom b/storm-0.10.0.2.3.0.0-2557.pom new file mode 100644 index 0000000000000000000000000000000000000000..5bb63efeb701ba3ea41f8154747ad0f58e9210c5 --- /dev/null +++ b/storm-0.10.0.2.3.0.0-2557.pom @@ -0,0 +1,857 @@ + + + + 4.0.0 + + + org.apache + apache + 10 + + + + org.apache.storm + storm + 0.10.0.2.3.0.0-2557 + pom + Storm + Distributed and fault-tolerant realtime computation + http://storm.apache.org + + + The Apache Software License, Version 2.0 + http://www.apache.org/licenses/LICENSE-2.0.txt + + + + + + Storm user mailing list + user-subscribe@storm.apache.org + user-unsubscribe@storm.apache.org + user@storm.apache.org + http://mail-archives.apache.org/mod_mbox/storm-user/ + + + Storm developer mailing list + dev-subscribe@storm.apache.org + dev-unsubscribe@storm.apache.org + dev@storm.apache.org + http://mail-archives.apache.org/mod_mbox/storm-dev/ + + + + + + nathanmarz + Nathan Marz + nathan@nathanmarz.com + + Committer + + -8 + + + ptgoetz + P. Taylor Goetz + ptgoetz@apache.org + + Committer + + -5 + + + xumingming + James Xu + xumingming@apache.org + + Committer + + + + + afeng + Andy Feng + afeng@apache.org + + Committer + + -8 + + + davidlao + David Lao + davidlao@microsoft.com + + Committer + + -8 + + + mrflip + Flip Kromer + mrflip@apache.org + + Committer + + + + + jjackson + Jason Jackson + jasonjckn@gmail.com + + Committer + + -8 + + + bobby + Robert Evans + evans@yahoo-inc.com + + Committer + + -6 + + + dagit + Derek Dagit + derekd@yahoo-inc.com + + Committer + + -6 + + + miguno + Michael G. Noll + michael@michael-noll.com + + Committer + + +1 + + + + + + 3.0.0 + + + + storm-buildtools/maven-shade-clojure-transformer + storm-buildtools/storm-maven-plugins + storm-core + examples/storm-starter + external/storm-kafka + external/storm-kafka-example + external/storm-hdfs + external/storm-hbase + external/storm-hive + external/storm-jdbc + external/storm-redis + external/storm-eventhubs + external/storm-jms + external/storm-cassandra + external/flux + + + + scm:git:https://git-wip-us.apache.org/repos/asf/storm.git + scm:git:https://git-wip-us.apache.org/repos/asf/storm.git + HEAD + https://git-wip-us.apache.org/repos/asf/storm + + + + jira + https://issues.apache.org/jira/browse/STORM + + + + UTF-8 + -Djava.net.preferIPv4Stack=true + + + 1.6.0 + 1.1.3 + 0.3.6 + 2.4 + 2.5 + 1.1 + 0.8.0 + 2.5.0 + 1.1 + 1.3.0 + 7.6.13.v20130916 + 0.2.3 + 0.0.1 + 1.4.0 + 1.11 + 4.3.3 + 0.2.4 + 2.10.1 + 0.9.0 + 16.0.1 + 1.0.13 + 1.6.6 + 3.9.0.Final + 0.2.3 + 0.2.3 + 1.9.5 + 0.3.0 + 2.1.3 + 3.4.6.2.3.0.0-2557 + 0.1.0 + 1.2.0 + 1.2.1.2.3.0.0-2557 + 2.7.1.2.3.0.0-2557 + 1.1.1.2.3.0.0-2557 + 0.8.2.2.3.0.0-2557 + 2.21 + + + + + windows + + winpkg + + + + + com.google.code.maven-replacer-plugin + replacer + 1.5.2 + + + + replace + + + + + + winpkg/src/scripts/* + + + + @storm.version@ + ${project.version} + + + + + + + + + sign + + + + org.apache.maven.plugins + maven-gpg-plugin + + + sign-artifacts + verify + + sign + + + + + + + + + dist + + storm-dist/binary + storm-dist/source + + + + + org.apache.maven.plugins + maven-source-plugin + + + attach-sources + + jar + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + + ${project.build.directory}/javadoc + ./docs/javadoc + + + + attach-javadocs + + jar + + + + aggregate + + aggregate + + site + + + + + org.apache.maven.plugins + maven-jar-plugin + + + + true + true + + + + + + + + + + + + + storm.maven.website + Storm Website + file:///tmp/site + + + ${repoid} + ${reponame} + ${repourl} + + + + + + + org.clojure + clojure + ${clojure.version} + + + com.esotericsoftware.kryo + kryo + ${kryo.version} + + + commons-io + commons-io + ${commons-io.version} + + + org.apache.commons + commons-exec + ${commons-exec.version} + + + commons-lang + commons-lang + ${commons-lang.version} + + + clj-time + clj-time + ${clj-time.version} + + + org.apache.zookeeper + zookeeper + ${zookeeper.version} + + + com.sun.jmx + jmxri + + + com.sun.jdmk + jmxtools + + + javax.jms + jms + + + org.slf4j + slf4j-api + + + org.slf4j + slf4j-log4j12 + + + log4j + log4j + + + + + org.apache.curator + curator-framework + ${curator.version} + + + log4j + log4j + + + org.jboss.netty + netty + + + + + org.apache.curator + curator-recipes + ${curator.version} + + + log4j + log4j + + + org.slf4j + slf4j-log4j12 + + + + + + com.googlecode.json-simple + json-simple + ${json-simple.version} + + + compojure + compojure + ${compojure.version} + + + hiccup + hiccup + ${hiccup.version} + + + ring + ring-devel + ${ring.version} + + + ring + ring-jetty-adapter + ${ring.version} + + + org.eclipse.jetty + jetty-servlet + ${jetty.version} + + + org.eclipse.jetty + jetty-servlets + ${jetty.version} + + + org.clojure + tools.logging + ${clojure.tools.logging.version} + + + org.clojure + math.numeric-tower + ${clojure.math.numeric-tower.version} + + + com.twitter + carbonite + ${carbonite.version} + + + org.yaml + snakeyaml + ${snakeyaml.version} + + + org.apache.httpcomponents + httpclient + ${httpclient.version} + + + org.clojure + tools.cli + ${clojure.tools.cli.version} + + + com.googlecode.disruptor + disruptor + ${disruptor.version} + + + org.jgrapht + jgrapht-core + ${jgrapht.version} + + + com.google.guava + guava + ${guava.version} + + + ch.qos.logback + logback-classic + ${logback-classic.version} + + + org.slf4j + log4j-over-slf4j + ${log4j-over-slf4j.version} + + + io.netty + netty + ${netty.version} + + + org.clojure + clojure-contrib + ${clojure-contrib.version} + test + + + org.clojure + data.codec + ${clojure-data-codec.version} + + + org.clojure + tools.nrepl + ${clojure.tools.nrepl.version} + test + + + clojure + org.clojure + + + + + clojure-complete + clojure-complete + ${clojure-complete.version} + test + + + clojure + org.clojure + + + + + org.mockito + mockito-all + ${mockito.version} + test + + + org.clojars.runa + conjure + ${conjure.version} + test + + + org.apache.thrift + libthrift + 0.9.2 + compile + + + + junit + junit + 4.11 + test + + + + + + + + + reply + reply + ${reply.version} + provided + + + + + + + true + + + false + + central + http://repo1.maven.org/maven2/ + + + + true + + + true + + clojars + https://clojars.org/repo/ + + + hortonworks.repo + http://repo.hortonworks.com/nexus/content/groups/public/ + Hortonworks Repo + + true + + + false + + + + + + + + + + org.apache.maven.plugins + maven-assembly-plugin + 2.2.2 + + + org.apache.maven.plugins + maven-install-plugin + 2.4 + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + + org.apache.maven.plugins + maven-source-plugin + 2.2.1 + + + org.apache.maven.plugins + maven-javadoc-plugin + 2.9 + + + org.apache.maven.plugins + maven-jar-plugin + 2.4 + + + org.apache.maven.plugins + maven-release-plugin + 2.5 + + + com.theoryinpractise + clojure-maven-plugin + 1.3.18 + true + + + org.apache.maven.plugins + maven-surefire-report-plugin + 2.16 + + + + org.apache.maven.plugins + maven-gpg-plugin + 1.4 + + + org.apache.maven.plugins + maven-shade-plugin + 2.2 + + + org.apache.maven.plugins + maven-project-info-reports-plugin + 2.7 + + + org.apache.maven.plugins + maven-site-plugin + 3.3 + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.7 + 1.7 + + + + org.apache.maven.plugins + maven-release-plugin + + true + v@{project.version} + + + + com.theoryinpractise + clojure-maven-plugin + true + + + + + + + + org.apache.maven.plugins + maven-checkstyle-plugin + 2.11 + + + + checkstyle + + + + + + org.apache.maven.plugins + maven-pmd-plugin + 3.0.1 + + + org.apache.maven.plugins + maven-javadoc-plugin + + + org.apache.maven.plugins + maven-surefire-report-plugin + + + ${project.build.directory}/test-reports + ${project.build.directory}/surefire-reports + + + + + org.codehaus.mojo + taglist-maven-plugin + 2.4 + + + + + Todo Work + + + TODO + exact + + + FIXME + exact + + + + + + + + + org.apache.rat + apache-rat-plugin + 0.11 + + false + + + **/target/** + + **/*.iml + + + **/CHANGELOG.md + **/README.md + **/README.markdown + **/DEVELOPER.md + **/BYLAWS.md + **/STORM-UI-REST-API.md + SECURITY.md + VERSION + TODO + + **/src/py/** + + + **/src/ui/public/js/jquery-1.6.2.min.js + **/src/ui/public/js/jquery.cookies.2.2.0.min.js + **/src/ui/public/js/jquery.tablesorter.min.js + **/src/ui/public/js/moment.min.js + **/src/ui/public/js/jquery.blockUI.min.js + **/src/ui/public/js/url.min.js + **/src/ui/public/js/arbor.js + **/src/ui/public/js/arbor-graphics.js + **/src/ui/public/js/arbor-tween.js + **/src/ui/public/js/jquery.mustache.js + **/src/ui/public/js/purl.js + + + **/dependency-reduced-pom.xml + + + + + + diff --git a/storm-core-0.10.0.2.3.0.0-2557.jar b/storm-core-0.10.0.2.3.0.0-2557.jar new file mode 100644 index 0000000000000000000000000000000000000000..4ba6064a25e8ecc009425a7a72558715a2d56ac7 Binary files /dev/null and b/storm-core-0.10.0.2.3.0.0-2557.jar differ diff --git a/storm-core-0.10.0.2.3.0.0-2557.pom b/storm-core-0.10.0.2.3.0.0-2557.pom new file mode 100644 index 0000000000000000000000000000000000000000..5e16b85bbeca1bb3395f43f520548df43eb52461 --- /dev/null +++ b/storm-core-0.10.0.2.3.0.0-2557.pom @@ -0,0 +1,700 @@ + + + + storm + org.apache.storm + 0.10.0.2.3.0.0-2557 + + 4.0.0 + org.apache.storm + storm-core + Storm Core + Storm Core Java API and Clojure implementation. + + src/jvm + test/jvm + + + ../conf + + + META-INF + ../ + + NOTICE + + + + ${basedir}/src/resources + + storm-core-version-info.properties + + + + true + ${basedir}/src/resources + + storm-core-version-info.properties + + + + + + src/dev + + + test/resources + + + + + com.theoryinpractise + clojure-maven-plugin + true + + + compile-clojure + compile + + compile + + + + test-clojure + test + + test-with-junit + + + ${argLine} ${test.extra.args} + + + + + + src/clj + + + test/clj + + false + true + + none + + + + + maven-surefire-report-plugin + + + ${project.build.directory}/test-reports + + + + + maven-shade-plugin + 2.2 + + + package + + shade + + + + + + org.apache.storm + maven-shade-clojure-transformer + ${project.version} + + + + false + false + true + false + + + org.apache.thrift:* + io.netty:netty + com.google.guava:guava + org.apache.httpcomponents:http* + org.apache.zookeeper:zookeeper + org.apache.curator:* + org.eclipse.jetty:* + + + + + org.apache.thrift + org.apache.thrift7 + + + org.jboss.netty + org.apache.storm.netty + + + com.google.common + org.apache.storm.guava + + + com.google.thirdparty + org.apache.storm.guava.thirdparty + + + org.apache.http + org.apache.storm.http + + + org.apache.zookeeper + org.apache.storm.zookeeper + + + org.apache.curator + org.apache.storm.curator + + + org.eclipse.jetty + org.apache.storm.jetty + + + + + + + + org.apache.thrift:* + + META-INF/LICENSE.txt + META-INF/NOTICE.txt + + + + io.netty:netty + + META-INF/LICENSE.txt + META-INF/NOTICE.txt + + + + commons-httpclient:commons-httpclient + + META-INF/LICENSE.txt + META-INF/NOTICE.txt + META-INF/README.txt + + + + org.apache.zookeeper:zookeeper + + LICENSE.txt + + + + + + + org.apache.storm + storm-maven-plugins + ${project.version} + + + version-info + generate-resources + + version-info + + + + ${basedir}/src/ + + jvm/**/*.java + clj/**/*.clj + + + + + + + + maven-dependency-plugin + 2.8 + + + copy-dependencies + package + + copy-dependencies + + + false + false + true + runtime + + + + + + maven-source-plugin + 2.2.1 + + + attach-sources + + jar-no-fork + + + + + + + + + coverage + + + + org.codehaus.mojo + build-helper-maven-plugin + 1.7 + + + add-source + generate-sources + + add-source + + + + src/clj + + + + + + + maven-antrun-plugin + 1.7 + + + pre-test-jacoco-clean + process-test-classes + + run + + + + + + + + + + + org.jacoco + jacoco-maven-plugin + 0.7.2.201409121644 + + + prepare-agent + + prepare-agent + + + true + + backtype/storm/metric/api/IMetricsConsumer$DataPointFieldAccess + backtype/storm/metric/api/IMetricsConsumer$TaskInfoFieldAccess + backtype/storm/testing/TestSerObjectFieldAccess + + + + + report + prepare-package + + report + + + + backtype/storm/generated/* + + + backtype/*/*/*/* + backtype/*/*/* + backtype/*/* + backtype/* + zilch/* + storm/*/*/*/* + storm/*/*/* + storm/*/* + storm/* + + + + + + + + + + native + + + + org.codehaus.mojo + exec-maven-plugin + 1.2.1 + + + generate-sources + + exec + + + + + sh + + -c + mkdir -p ${project.build.directory}/; cp -rufv ${basedir}/src/native/ ${project.build.directory}/ + + + + + org.codehaus.mojo + make-maven-plugin + + + compile + compile + + autoreconf + configure + make-install + + + + test + test + + test + + + + + ${project.build.directory}/native/worker-launcher + + -i + + + + CFLAGS + -DEXEC_CONF_DIR=${worker-launcher.conf.dir} ${worker-launcher.additional_cflags} + + + ${project.build.directory}/native/worker-launcher + /usr/local + ${project.build.directory}/native/target + + + + + + + + + com.esotericsoftware.kryo + kryo + 2.21 + compile + + + org.clojure + clojure + 1.6.0 + compile + + + clj-time + clj-time + 0.8.0 + compile + + + compojure + compojure + 1.1.3 + compile + + + hiccup + hiccup + 0.3.6 + compile + + + ring + ring-devel + 1.3.0 + compile + + + ring + ring-jetty-adapter + 1.3.0 + compile + + + servlet-api + org.mortbay.jetty + + + + + ring + ring-json + 0.3.1 + compile + + + org.clojure + tools.logging + 0.2.3 + compile + + + org.clojure + math.numeric-tower + 0.0.1 + compile + + + org.clojure + tools.cli + 0.2.4 + compile + + + org.clojure + tools.nrepl + 0.2.3 + test + + + clojure + org.clojure + + + + + clojure-complete + clojure-complete + 0.2.3 + test + + + clojure + org.clojure + + + + + org.clojars.runa + conjure + 2.1.3 + test + + + org.clojure + clojure-contrib + 1.2.0 + test + + + org.clojure + data.codec + 0.1.0 + test + + + commons-io + commons-io + 2.4 + compile + + + org.apache.commons + commons-exec + 1.1 + compile + + + commons-lang + commons-lang + 2.5 + compile + + + com.googlecode.json-simple + json-simple + 1.1 + compile + + + com.twitter + carbonite + 1.4.0 + compile + + + org.yaml + snakeyaml + 1.11 + compile + + + com.googlecode.disruptor + disruptor + 2.10.1 + compile + + + org.jgrapht + jgrapht-core + 0.9.0 + compile + + + ch.qos.logback + logback-classic + 1.0.13 + compile + + + org.slf4j + log4j-over-slf4j + 1.6.6 + compile + + + org.mockito + mockito-all + 1.9.5 + test + + + org.apache.hadoop + hadoop-auth + 2.7.1.2.3.0.0-2557 + compile + + + junit + junit + + + mockito-all + org.mockito + + + jetty-util + org.mortbay.jetty + + + jetty + org.mortbay.jetty + + + servlet-api + javax.servlet + + + slf4j-api + org.slf4j + + + commons-codec + commons-codec + + + log4j + log4j + + + slf4j-log4j12 + org.slf4j + + + hadoop-minikdc + org.apache.hadoop + + + apacheds-kerberos-codec + org.apache.directory.server + + + log4j + log4j + + + slf4j-log4j12 + org.slf4j + + + httpclient + org.apache.httpcomponents + + + + + junit + junit + 4.11 + test + + + hamcrest-core + org.hamcrest + + + + + info.ganglia.gmetric4j + gmetric4j + 1.0.7 + compile + + + reply + reply + 0.3.0 + provided + + + cd-client + org.thnetos + + + drawbridge + com.cemerick + + + versioneer + trptcolin + + + sjacket + org.clojars.trptcolin + + + + + + /etc/storm + + + diff --git a/webresource.tar.gz b/webresource.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..82018d18bfc1da0ab07c728d5a754b892fe449f6 Binary files /dev/null and b/webresource.tar.gz differ diff --git a/yarn-v0.23.2.tar.gz b/yarn-v0.23.2.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..b9014ebd7c71adb278e603642de9d945360c5eed Binary files /dev/null and b/yarn-v0.23.2.tar.gz differ diff --git a/yarn-v1.1.0.tar.gz b/yarn-v1.1.0.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..ff107634584cd490fa9edb41b29b97c0d253c771 Binary files /dev/null and b/yarn-v1.1.0.tar.gz differ diff --git a/zookeeper-3.4.6.2.3.0.0-2557.jar b/zookeeper-3.4.6.2.3.0.0-2557.jar new file mode 100644 index 0000000000000000000000000000000000000000..17474a481a1d78c3a857934fc7500df29855ec69 Binary files /dev/null and b/zookeeper-3.4.6.2.3.0.0-2557.jar differ diff --git a/zookeeper-3.4.6.2.3.0.0-2557.pom b/zookeeper-3.4.6.2.3.0.0-2557.pom new file mode 100644 index 0000000000000000000000000000000000000000..339ddd4f1c28ad78f757f8e448c53488528cb496 --- /dev/null +++ b/zookeeper-3.4.6.2.3.0.0-2557.pom @@ -0,0 +1,113 @@ + + + + + 4.0.0 + org.apache.zookeeper + zookeeper + pom + 3.4.6.2.3.0.0-2557 + + + org.slf4j + slf4j-api + 1.6.1 + compile + + + org.slf4j + slf4j-log4j12 + 1.6.1 + compile + + + org.apache.maven.wagon + wagon-http + 2.4 + true + + + org.apache.maven + maven-ant-tasks + 2.1.3 + true + + + log4j + log4j + 1.2.16 + compile + + + jline + jline + 0.9.94 + compile + + + io.netty + netty + 3.7.0.Final + compile + + + org.vafer + jdeb + 0.8 + true + + + junit + junit + 4.8.1 + test + + + org.mockito + mockito-all + 1.8.2 + test + + + checkstyle + checkstyle + 5.0 + test + + + jdiff + jdiff + 1.0.9 + true + + + xerces + xerces + 1.4.4 + true + + + org.apache.rat + apache-rat-tasks + 0.6 + true + + + commons-lang + commons-lang + 2.4 + true + + + commons-collections + commons-collections + 3.1 + true + + +